CS156—Advanced Applications Programming
A course taught by Phill Conrad in the Dept. of Computer Science at UC Santa Barbara
Older materials can be found at the 56wiki site.
This site is maintained in this github repo: https://github.com/ucsb-cs156/ucsb-cs156.github.io
Textbooks Used This Quarter
- Head First Java, 2nd Edition—Main textbook for learning Java
- Head First Java, 3rd Edition—New Textbook (not yet fully released)
- Java in a Nutshell, 7th Edition—Supplemental text for updates to Java 6 thru Java 11
Other Textbooks
- Head First Design Patterns—Main textbook for learning Object-Oriented Programming
- Student—A class for students, and starting point for learning Java, and the Maven-based Java toolchain
- Student: ex01—private data members, public constructors, integers from command line arguments, main methods, built in toString method, simple compilation/execution with javac/java
- Student: ex02—Overriding the toString method, @Override
- Student: ex03—Converting to Maven
- Student: ex04—Adding JUnit tests
- Student: ex05—Setting up GitHub Actions
- Student: ex06—Setting up jacoco and Codecov.io
- Student: ex07—Introducing packages
- Student: ex08—Setting up pitest mutation testing
- Student: ex09—Covering toString with a test and excluding Main gets us to 100% coverage
- Student: ex10—Exceptions
- Student: ex11—More on Exceptions, static methods, tdd
- Student: ex12—Adding more test coverage
- Student: ex13—Read all lines of a file
- Student: ex14—Sorting with Comparable (natural order), and introduction to interfaces in java
- Student: ex15—Sorting with Comparators, and introduction to Lambda expressions
- Student: ex16—Sorting
- Student: ex17—Sorting
- Agile—A Software Development Methodology
- Agile: Acceptance Criteria—What should be true when a user story is successfully implemented
- Agile: Estimates—Also known as points poker or planning poker
- Agile: Retros—Retrospectives: the heart of Agile
- Agile: Standups—A timeboxed standing meeting to help team make progress
- Agile: Team Norms—Groundrules set by a team that promote effective and harmonious teamwork and productivty
- Agile: User Stories—As a (who?) I can (what?) so that (why?)
- Ant—Apache Ant, a build tool for Java (similar to Make/Makefiles)
- Ant: Comparing files—Doing something like a unix 'diff -q' via Ant
- Ant: Properties—The variable like things in Ant files (but they aren't really variables)
- antipatterns—Things to avoid in your code
- Antipatterns: inheritance—When NOT to use inheritance
- APIs—Application Programming Interfaces
- Applications Programming—A compendium of knowledge and skills applications programmers (software developers) need
- Auth0—A third-party commerical service to help manage authentication
- Bug Reports—The typical format: STR, observed, desired
- CI: —Continuous Integration--automatically testing after every commit
- Code Reviews—An important part of professional software dev practice
- Code Reviews: GitHub—The right (and wrong) way to do a code review in GitHub
- Code Smells—Common problems that arise in code
- Code Style—formatting, indenting, names, and much more
- Code Style: astyle—automatic code indenting tool available on CSIL
- Codecov: —Integrated tools to group, merge, archive, and compare coverage reports (commerical, free for open-source)
- Codecov: GitHub Actions—Using Codecov with GitHub Actions, including adding CODECOV_TOKEN secret
- Codecov: Transfering Repos —Steps to take When transferring repos from one owner/org to another
- Codecov: Troubleshooting—Solutions to problems that commonly arise with Codecov
- Conventions: —The conventions we use in our code
- Conventions: Branch Names—How to name your branches
- Conventions: Commit Messages—How to make a commit message
- Conventions: Tags—Tags (only for course staff)
- Corgis—A collection of real-world datasets for programming exercises
- Course Policies—Explanations of why certain instructors do things they way they do them.
- Course Policies: Answer Keys—Why do you not provide answer keys for all your old exams?
- CSIL—Computer Science Instructional Lab machines
- CSIL: browser from command line—How to open a browser from the command line
- CSIL: disk quota and file quota issues—How to diagnose and fix
- CSIL: git configuration—Configuring your CSIL account to use git
- CSIL: Java 11—How to configure your CSIL account for Java 11
- CSIL: Mount CSIL drive Via MacOS—Remotely Mount your CSIL drive to your MacOS system via cifs/smb using SAMBA
- CSIL: Mount CSIL drive Via Windows—Remotely Mount your CSIL drive to your Windows system via cifs/smb using SAMBA
- CSIL: Remote Host Id Changed—The scary REMOTE HOST ID CHANGED message with mention of SOMETHING NASTY
- CSIL: ssh port forwarding—How to access webapps running on CSIL from your local machine
- CSIL: via ssh from Linux—Connecting via ssh from the command line
- CSIL: Via MacOS—Accessing CSIL from your MacOS system
- CSIL: via ssh from Windows—Connecting via ssh (PuTTY, XMing, Command Line) or remote desktop
- CSV files—Comma Separated Value files, and processing them in Java
- Data—Various sources for datasets to build applications with
- Databases—SQL, Postgres, H2, etc
- Design Patterns—Various sources for datasets to build applications with
- Design Patterns: Strategy—Define multiple algorithms and let client application pass the algorithm to be used as a parameter.
- Docker—Virtualization/Container platform
- Eclipse—One of several choices for a Java IDE
- Enviroment Variables—Reading them from Java code
- eslint—Linting (checking for style and frequent errors) in ECMAScript (i.e. JavaScript)
- Firebase—An interesting development platform
- Game Programming—How to make Java work for Games
- Gauchospace: Clickable URLs—In assignment submissions, urls should be clickable
- —
- git and github—version control, source code configuration and project collaboration tools
- git: basic workflow—The basics: git add..., git commit..., git push ...
- git: clean—throw away untracked files easily
- git: cloning your first repo—A guide for those new to git
- git: commit messages—How to write clear and helpful commit messages
- git: copy branch to new repo—Creating a new repo with a branch from another repo
- git: feature branch workflow—One branch per feature/issue/story
- git: fixup commit—Fixing an error you made in a previous commit
- git: git/github troubleshooting—Various problems and their solution
- git: .gitignore files—What they are for and what to put in them
- git: merge conflicts—Not nearly as scary as you may have been told
- git: overview—An introduction. git vs. github.com vs. github.ucsb.edu, repos, etc.
- git: pair repo—Setting up a repo for pair partners
- git: pull rebase main—How to rebase your branch on main using git pull
- github: actions—CI/CD for GitHub
- github: actions self hosted runners—If you run out of GitHub minutes, you can set up your own servers
- github: adding collaborators—giving individual users access to a private repo
- github: api—Java Api for Github
- github.com: creating private repos under an organization—for closed source class assignments
- github: issues—working with issues in github
- github: keyboard shortcuts—making the github web UI easier to use
- github: markdown—Working with GitHub Markdown
- github: pro tips—A few extras to help you work with GitHub more effectively
- github: pull requests—working with pull requests (PRs) in github
- github: using ssh keys—generating public/private key pair, uploading public key to github
- github.ucsb.edu: creating private repos under an organization—for closed source class assignments
- github: verified badge on commits—adding extra security to your commit messages
- github: wrong starter—help! I pulled from the wrong starter
- Gradescope—System for homework grading, feedback and submission
- Gradescope: Organization Access—How to enable access to organization repos
- Gradescope: Pair/Group Submission—Submitting on Gradescope as a pair or group
- Gradescope: Regrade Requests—What to do if you have questions about the grading of a problem (e.g. you think there was a grading error)
- Gradescope: Student Self-Submission—Scanning your assignment to PDF
- Gradescope: Zip Submission—Submitting a git repo for autograding via zip file
- gradle—A build system (alternative to Ant or Maven) based on the groovy scripting language
- Heroku—A cloud computing platform
- Heroku: Billing and Quotas—You should not need to enter a credit card for your work in this course
- Heroku: CLI—Installing the Heroku CLI
- Heroku: Tips—Quick reference for how to get certain things done
- Heroku: Troubleshooting—Solutions to common problems and errors
- IDEs for Java—Integrated Development Environments for Java (IntelliJ, Eclipse, Netbeans, etc.)
- Java—One of two languages we are studying in CS156
- Java: Annotations—All about those funny @ things that precede methods
- Java: ArrayList to array—e.g. ArrayList<Integer> to int []
- Java: Codacy—A static analysis tool for Java
- Java: Command Line Arguments—how to the access contents of (String [] args)
- Java: == vs. .equals(), and hashCode()—the difference, and how to override .equals and .hashCode()
- Java: Garbage Collection—How and when does memory allocated on heap get reused?
- Java: Garbage Collection: Under the Hood—Can we peek under the hood at how garbage collection is done
- Java: HttpURLConnection—And HttpsURLConnection; a Java object for retrieving content from a URL
- Java: Installing—Installing Java 11
- Java: JAR files—Creating and using .jar files
- Java: JVM—The Java Virtual Machine
- Java: Lambda Expressions—Shorter, cleaner code using anonymous functions
- Java: Overriding vs. Overloading—The difference between these
- Java: Plaform Independent Newlines—\n isn't as portable as you might like
- Java: Sorting—Comparable, Comparators, and sorting ArrayLists and such
- Java: static analysis—Tools that analyze source code without running it
- Java: Streams in Java 8 —A whole new style of programming
- Java: Unchecked Operations—That message that says blah.java uses unchecked or unsafe operations. Recompile with -Xlint:unchecked for details.
- Java: Versions—Long Term Support vs. Non Long-Term Support, and why Java 11
- Java: Web Applications—Overview of various frameworks (Servlets, Spring, Apache Spark-Java)
- Javadoc—Documentation generator for java
- Javadoc: Legacy Code Projects—step-by-step instructions for javadoc for UCSB-CS56-Projects
- javadoc: publishing to github pages from a private repo (the old way)—step-by-step instructions
- javadoc: publishing to github pages from a private repo—step-by-step instructions
- javadoc: publishing to github pages from a public repo—step-by-step instructions
- javafx—replacement for swing, platform for Java GUI development
- javafx: XQuartz on Mac—when JavaFX doesn't work over X11 forwarding on Mac, how to fix it
- JavaScriopt—One of two languages we are studying in CS156
- JavaScript: Destructuring—Assigning multiple variables at once using ECMAScript 6 destructuring
- JDBC—Java Database Connectivity--a way to use SQL-based databases with Java
- Jekyll—Creating web sites (like this one) on github-pages using Markdown
- JSON: —JavaScript Object Notation
- JSON: Jackson—A Java Package for processing JSON
- JUnit—Unit testing framework for Java
- JUnit: Hamcrest Matcher style—A different style of writing assertions for Unit testing
- JUnit: Mocking System.out—How do you write a JUnit test for a method that uses System.out?
- JWT—JWT tokens for authorization
- Kanban: —visualization of work in progress
- Legacy Code—Code that has a life before, during and after your contributions
- Legacy Code: Mapache Search—Project specific documentation
- Legacy Code: Projects—A list of legacy code projects associated with this course
- Legacy Code: Roles—Role management in the legacy code apps for this course
- Legacy Code: Staff Epic Planning—Description of the process course staff uses to plan epics
- Legacy Code: Terminal Windows—Six roles for terminal windows when working with Legacy Code
- Liquibase: —A database migration framework
- Log4J: —A logging framework for java
- Log4J: SparkJava—Using Log4J with SparkJava
- Log4J: Spring Boot—Using Log4J with Spring Boot
- Lombok: —Automatic generation of getters/setters, etc.
- Lombok: Jacoco and pitest—Avoid doing code coverage and mutation testing on generated code
- MacOS—Setting up an environment to do CS156 work on your own Mac (not ssh'ing into CSIL)
- MacOS: Homebrew—Package installer for Mac OS
- Markdown—A simplified syntax to create formatted documents
- Maven—A build tool for Java plus a package manager
- Maven: Adding custom jar dependency—Including a jar file that isn't available as a standard Maven dependency
- Maven: Convert Ant to Maven—replacing ant build.xml with maven pom.xml
- Maven: Plugins—Plugins extend Maven functionality
- Maven: FAQ—Frequently Asked Questions and misc tips/troubleshooting
- Maven: Hello World—A relatively simple Hello World app with Maven
- Maven: Installing—on Windows, Mac, Linux
- Maven: Javadoc—Generating javadoc when using Maven
- Maven: Managing Versions—How do you get the right version for dependencies, plugins, etc.
- Maven: Plugins—Plugins extend Maven functionality
- Maven: Pom.xml Order—In what order should the elements of a pom.xml appear
- Maven: Profiles—Making your pom.xml do different things on localhost vs heroku, for example
- Maven: Skip Tests—how to run commands while skipping tests
- Maven: Testing—Doing JUnit testing and other testing using mvn test, mvn verify, etc.
- Maven: vs Ant—Comparison with Ant
- Maven: Wrapper—The mvnw file that you see in some repos: what is it, and why do you need it
- Maven: Xlint options—For example, what to do when you get `Recompile with -Xlint:unchecked for details`
- MongoDB: —A particular NoSQL database platform
- MongoDB: New Database—Setting up a new database on cloud.mongodb.com
- MongoDB: Spring Boot - Basic Collection—Accessing a MongoDB collection from Spring Boot
- MongoDB: Spring Boot - Nested Document—Creating a document class for nested JSON
- MongoDB: Spring Properties—How to set properties for connecting to MongoDB when using Spring
- MongoDB: SSL certificate—How to handle errors with the SSL certificate when connecting to MongoDB
- MongoDB: Staff Setup—Information for Course Staff on settig up the MongoDB instances for the project repos
- Node—Making web apps using server-side JavaScript using node.js
- Node: Linux—Installing and working with Node, npm, nvm on Linux
- Node: MacOS—Installing and working with Node, npm, nvm on MacOS
- Node: npm—Node Package Manager
- Node: nvm—Node Version Manager
- Node: package-lock.json merge conflicts—Installing and working with Node, npm, nvm on Linux
- Node: Windows—Installing and working with Node, npm, nvm on Windows
- OAuth: —The way we implement the 'login with Google, Facebook, or Github' thing you see on some websites
- OAuth: Authorizing GitHub Third Party Apps—Gradescope, and GitHub OAuth Apps you build yourself
- OAuth: GitHub Setup—Setting up a GitHub OAuth App to obtain client id and client secret
- OAuth: Google Setup—Setting up a Google OAuth App to obtain client id and client secret
- OOP—Object Oriented Programming
- PIT Mutation Testing—Testing your test suite by mutating your solution, pitest.org
- Port Numbers—Those numbers such as 8080, 12345 that show up when doing networking things
- Postgres—An implementation of an SQL relational database, available on Heroku
- Pull Requests—aka PRs; a checklist for doing them properly
- Pulse Secure—Remotely Access the UCSB Campus Network
- React—A front-end framework for webapps and native apps
- React: Create React App—A tool to set up a new React App
- React: Introduction—Helpful tips for working with frontend code in CS156
- React: Page Components—Writing components for a top level page
- React: Patterns—Common patterns in our code base
- React: react-hook-form—A library for creating forms
- React: Router—Using React Router in a spring/react app
- React: Spring Boot—Combining a React Front End with a Spring Boot Backend
- React: Storybook—A tool for previewing and testing React components in isolation
- React: UseSWR—SWR, Stale While Revalidating, is a hooks based protocol for updating state in React apps
- Refactoring—
- REST—RESTful APIs, etc (Representational State Transfer)
- Scrum—A Software Development Methodology
- Selenium—Remote Control of a Browser (e.g. for end-to-end testing of webapps, web scraping)
- Selenium: Driver Setup—Setting up your driver
- Semantic Versioning—A set of rules for assigning meaningful version numbers
- Slack—A chat-based communication tool for teams
- Sockets—An abstraction used in networking
- Spring Boot: —A Java web application framework
- Spring Boot: Actuator—Checking the endpoint mappings, health or other info about your Spring Boot app
- Spring Boot: Application Properties—Defining the application.properties
- Spring Boot: ControllerAdvice—A place to factor out common ExceptionHandler, ModelAttribute and InitBinder code across multiple controllers
- Spring Boot: CSV—Downloading and Uploading CSV files with Spring Boot
- Spring Boot: Database—Setting up a new SQL database table
- Spring Boot: Database Migrations—When you need to make a change to your database schema for an app in progress
- Spring Boot: Heroku—Tips for running with Spring Boot applications on Heroku
- Spring Boot: Logging—How to write information to the log in Spring Boot
- Spring Boot: OAuth—How to implement OAuth for authentication in Spring Boot
- Spring Boot: POST and CSRF—If you get 403 forbidden messages when using POST
- Spring Boot: Postgres—Using Spring Boot with Postgres
- Spring Boot: RestTemplate—When you need to access other APIs from the backend of your Spring Boot Application
- Spring Boot: Secrets—Ways of keepings database credentials and OAuth client secrets out of Github
- Spring Boot: Security—Authentication, Authorization and other Security issues
- Spring Boot: Sessions—How to make the stateless HTTP protocol stateful
- Spring Boot: SQL—Working with SQL and Databases in Spring Boot
- —
- Spring Boot: VS Code—Suggested VS Code extensions for working with Spring Boot
- Spring/React: —The basic framework for CMPSC 156 projects (From F20 forward)
- Spring/React: CRUD for SQL—Create/Read/Update/Destroy for a SQL database table
- Spring/React: Directory Structure—Where to find what
- Spring/React: package-lock.json Merge Conflicts—How to resolve these
- Spring/React: Practices—Practices that we encourage in our code bases
- SQL—SQL-based relational databases (sqlite3, Postgres, MySQL, etc.)
- Stryker: —Mutation testing for JavaScript
- Stryker: Excluding Code—Excluding lines of code where mutation testing doesn't work
- Swagger—Automatic documentation of Spring Boot Restful APIs
- Swing—A GUI Framework
- $T and $B—Using environment variables to make navigating a src tree less painful
- Teamwork—Practices for setting up a harmonious and productive team
- Test Driven Development (TDD)—General information about best practices
- Testing: —Everything having to do with testing: Unit testing, Integration Testing, Test Coverage
- Testing: Articles—A collection of articles on various testing topics
- Testing: Coverage—Line vs. Branch coverage, what does it mean?
- Testing: Integration Testing with Maven—When you want to run the integration tests
- Testing: Jacoco—How to interpret the reports (red, yellow, green)
- Testing: Jacoco via Maven—Setting up Jacoco test coverage, using Maven
- Testing: Jest Testing—Testing and Test Coverage for JavaScript code
- Testing: JUnit—JUnit tests for various purposes, Junit 4 vs. Junit 5
- Testing: Maven Tips—Tips on running tests with Maven for Spring/React projects
- Testing: Mocking—What is mocking?
- Testing: React—How to use Jest and React Testing Library for various scenarios
- Testing: Spring Boot HTMLUnit—Testing Spring Boot Webapps
- Thymeleaf—A Templating Engine for Spring Boot
- Toasts—Notifications that pop up like toast
- Toolchain—The set of tools you need for software dev in CS56
- Travis-CI—A continuous integration system (automated testing)
- UCSB CS Github Linker—A Tool for setting up your Github Account for your course
- UML—Unified Modeling Language: A graphical language for software design
- Unix (and Linux)—A variety of resources related to Unix and Linux, esp. command line tools
- Unix: Customize shell Prompt—Customize your shell prompt with helpful info
- Unix: Misc tools—Various useful command line tools you may not know about
- Unix: Search/Replace across multiple files—from the command line, using grep, sed, etc.
- User Stories: —As a (who?) I can (what?) so that (why?)
- vim—a widely used text editor among Unix users
- vim: basic eight—eight things you need to know how to do for your survival
- vim: customization—customizing vim for your purposes
- vscode—Visual Studio Code, a lightweight free editor from Microsoft with many IDE features
- vscode: CR/LF—CR/LF issues with VS Code, especially on Windows and WSL
- Webapps—Basic concepts of web applications
- Webapps: Webapps vs. Websites (Static Web Sites/Pages)—What's the difference between a web app and a web site/page
- Windows—Setting up an environment to do course work on your own Windows machine (not ssh'ing into CSIL)
- Windows: WSL—Setting up a development environment under Windows Subsystem for Linux
- X11—Dealing with X11 DISPLAY issues
- YAML—An alternative to XML and JSON for representing structured data in a machine and human readable format
- Corgis—A collection of real-world datasets for programming exercises
- Exams—Past Exams
- Java: Tutorials—Online resources for learning Java
- Practicing Coding—Resources for practicing coding
- Spring Boot: Tutorials—Online resources for learning Spring Boot