Techniques for designing, building, and maintaining large, scalable, and reusable systems. Specific emphasis is placed on software testing, relational databases, concurrency, and industry-standard software engineering tools such as Git, profilers, and debuggers.
cs0320 is taught by Tim Nelson. Lectures are held every Tuesday and Thursday from 1:00 to 2:20 PM at Metcalf Research Building AUD, and are also recorded on Panopto and will be uploaded after each lecture.
Official prerequisites for cs0320 include one of {cs0160, cs0180, cs0190}. Familiarity with Java serves as a soft prerequisite; if you don't feel comfortable with Java or object-oriented programming yet, you may find it helpful to take cs0200 before taking cs0320.
"Software engineering is about more than just programming. Good engineers often spend more time reading and reviewing code than writing it. If you're skeptical, read this short statement by Linus Torvalds, one of the world's most famous programmers.
Linus isn’t on vacation. He's not taking it easy. And yet he spends most of his engineering time on reviewing other peoples' code. Let's stop pretending that "writing a lot of code" is the only metric that matters, and instead ask about what else should be important. Things like:
- How do you know that a program works? What if it's a program you didn't write?
- How do you know that you're writing the right program in the first place?
- How can you design to maximize the possibility of re-use?
- How can you make your code safe from bugs (yours and others')?
- How can you write code that's easy to understand?
- How do people write software collaboratively in a distributed way?
- Which unusual algorithmic ideas, new technologies, and linguistic tools should you know about as an engineer today?
This course is about all of that. You’ll still write a lot of code, but we’ll follow a more realistic standard: you’re not trying to pass a test suite, you’re trying to build software for real."
"Techniques for designing, building, and maintaining large, scalable, and reusable systems. We will cover advanced programming techniques using Java, TypeScript, and React. Course assignments will familiarize students with software testing, relational databases, concurrency, and industry-standard software engineering tools such as Git, profilers, and debuggers. A major component of the course will be a group software project of your own design."
Check out the following useful documents for questions you have about course organization, code style, or tools we use.
If you're looking for hours for projects or labs, please see hours →
All projects are released 2:20 PM ET on the specified out day (except for Project 0) and due at 7:30 PM ET on the specified due date. For your handin to be graded, you must have completed the beginning of semester reading quiz. To check if you have turned one in, please check this form →
Project | Sprint | Out | Due |
---|---|---|---|
Onboarding | 0 | 1/27 | 2/7 |
1: Data | 1 | 2/8 | 2/23 |
1: Data | 2 | 2/22 | 3/10 |
2: Frontend | 3 | 3/10 | 3/21 |
Term Project Interlude | - | 3/22 | 4/4 |
2: Frontend | 4 | 4/5 | 4/18 |
Term Project | - | 4/19 | 5/13 |
Looking for guidance as you start your project? Want a refresher on what material has been covered and an outline of what you will be developing? Come to our Project Gear-Up sessions!
Soon after each project sprint begins (with the exception of Onboarding), we will be holding gear-up sessions for each of the components involved in that sprint. Gear-up sessions will be held in person and streamed via Zoom; Come prepared with questions!
Date | Topic | Slides | Recording |
---|---|---|---|
2/9 | Sprint 1: KD Tree | Slides | Recording |
2/11 | Sprint 1: Bloom Filter | Slides | Recording |
2/11 | Sprint 1: Generic REPL | Slides | Recording |
2/25 | Sprint 2: DB Proxy | Slides | Recording |
2/25 | Sprint 2: API Aggregator | Slides | Recording |
2/25 | Sprint 2: Rec System | Slides | Recording |
3/14 | Sprint 3: Table Loader/Viz + DB Integration | Slides | Recording |
3/14 | Sprint 3: Screen Reader | Slides | Recording |
Labs are released on Thursdays at 2:20 PM ET. These labs have been designed to be completed in groups of 2 students. During lab hours, you will be able to partner with others and work with TAs if you need help. Labs are to be completed and checked off within your assigned lab section. If you are unable to get your lab checked off during your assigned section, you may get it checked off at the beginning of your next lab section. Lab checkoffs will not be accepted beyond then.
Name | Out | Due |
---|---|---|
Lab 0: Setup | 1/27 | 1/30 |
Lab 1: Project Management | 1/27 | 2/7 |
Lab 2: APIs | 2/10 | 2/17 |
Lab 3: Relational Databases | 2/17 | 2/24 |
Lab 4: Front-end Development | 2/24 | 3/3 |
Lab 5: Asynchronous TypeScript | 3/3 | 3/10 |
Lab 6: React | 3/10 | 3/24 |
Lab 7: Prototyping | 3/24 | (Optional) |
Lab 7 is the last mandatory lab for the semester. In the weeks following Lab 7, we will be offering optional labs and workshops depending on the interests and needs of term project groups. In previous semesters, we have offered labs on topics such as WebSockets, Docker, and cloud deployment, and we have held workshops on topics such as authentication and advanced front-end techniques; we are open to developing new labs and hosting new workshops based on the interests and needs of term project groups.
Lectures are held every Tuesday and Thursday from 1:00 PM to 2:20 PM ET at Metcalf Research Building AUD, and are also recorded on Panopto and will be uploaded after each lecture.
Any readings from Effective Java and Design Patterns can be accessed through Safari Books Online. To do so, follow the steps below:
Topic | Resources | Code | Reading for the Week | Date |
---|---|---|---|---|
Effective 0320 | Notes, Recording | N/A | Syllabus, Missive, Setting Expectations | 1/27 |
The Software Lifecycle | Slides, Recording | N/A | N/A | 2/1 |
Leveling Up Testing | Notes, Recording | N/A | Clever Manka | 2/3 |
Data Structures & Strategies I | Notes, Recording | N/A | N/A | 2/8 |
Data Structures & Strategies II | Notes, Recording | N/A | N/A | 2/10 |
Defensive Programming | Notes, Recording | N/A | N/A | 2/15 |
Proxies | Notes, Recording | N/A | N/A | 2/17 |
Building Web Apps | Notes, Recording | N/A | N/A | 2/24 |
Concurrency | Notes, Recording | N/A | N/A | 3/1 |
JavaScript | Notes, Recording | N/A | N/A | 3/3 |
End of Project 1 Review | Notes, Recording | N/A | N/A | 3/8 |
Guest Lecture: Emmanuel Schanzer | Recording | N/A | N/A | 3/10 |
Reacting to React | Notes, Recording | N/A | N/A | 3/15 |
Leveling Up Testing (2) | Notes, Recording | Code | N/A | 3/17 |
Communal Debugging | Recording | N/A | 3/22 | |
Term Project Q&A | Recording | N/A | 3/24 | |
Automating UI Tests | Notes, Recording | N/A | 4/5 | |
Security, Privacy, & Threat Modeling | Notes, Slides, Recording | N/A | 4/7 | |
Critique Exercise | Recording | N/A | 4/14 | |
Guest Lecture: Alberta Devor | Recording | N/A | 4/19 | |
Guest Lecture: Anjali Pal | Recording | N/A | 4/21 |
Tim's conceptual office hours are held each week via Zoom on Tuesday from 3–4 PM EST.
During TA hours, you'll be able to get help from TAs with course concepts as well as project and lab-specific questions. Note that you may not ask questions about labs in project hours (and vice versa) or have a lab checked off during project hours. During conceptual hours, you may not bring up code-specific questions.