Course: COS333
Instructor: Kernighan
S 2015

Description of Course Goals and Curriculum

The purpose of the course is to teach you how to do practical software engineering in the real world. The fact that this is listed as a “Systems” departmental in the COS departmental is misleading - this is by far the most applied course in the CS department. Throughout it, you will learn all the steps required to design, develop, and test a software application. The course materials will provide you a basic overview of a broad range of topics including scripting languages, web development, cloud infrastructure, and databases. However, there is little emphasis on a thorough theoretical treatment of any topic, nor do the topics necessarily build on each other in a sequential fashion. Rather, the main focus of the course revolves around the design project in the second half of the semester, in which you form teams and are expected to complete a software project.

A huge portion of your learning in this course is self-driven, making this one of the most open-ended and creative courses in the COS department. While the lectures and course materials will help provide inspiration and a jumping-off point, you and your team are expected to teach yourselves all the material necessary to get your design application up and running. The professor and TA’s will be there to provide pointers and check up on your progress, but because the scope of possible projects is so wide, they will not hold your hand on implementing your project step-by-step. In this sense the course will teach you the fundamental CS skill of “learning by doing” which is an important skill for anyone looking to go into software engineering.

Learning From Classroom Instruction

The instruction portion of the course is organized around lectures. Each lecture (or small subset of lectures) is designed to give a self-contained, brief introduction to a general topic. They don’t build on each other, though they are loosely organized around category. For instance, in the very beginning of the semester the first few lectures are on various forms of scripting languages. Afterwards, the lectures cover the very basics of iPhone and web programming. Towards the middle and end of the semester, the emphasis starts shifting more towards cloud infrastructure and networking. The content of the lectures relies heavily on present-day technological trends (the actual technologies used, not the theoretical basis for them, unlike most other COS courses). Therefore the material is subject to change year-by-year since it is structured around the current technological environment.

The lectures are by no means comprehensive, and you are also not expected to understand all of them. The main goal is to jog your curiosity so you can do your own self-exploration in the design project that you pursue. For instance, if your team decides to build an iPhone app as your design project, you will most likely not have to use lectures on Awk, C++, or Go. That said, since your design project must involve some form of managing data, it will likely involve networking as well. Therefore quite a few of the lectures are probably at least tangentially related, so they will be useful starting points of understanding.

Since the lectures serve mostly as overviews, they will by no means contain enough material for you to complete an entire project. As mentioned, you are supposed to gain a general idea from lecture, and the rest of the learning comes from actually working on your design project. Given the huge variance in background level among COS majors, for some the lectures will provide fresh and new material, and for others the lectures will be a repetition of what they already know from their own personal projects.

Learning For and From Assignments

Programming Assignments

During the first half of the semester, there will be five programming assignments. They are intended as basic exercises in various aspects of software development - for instance, how to write a regex parser for grep - and require a mix of Java, C, and potentially a few other scripting languages (awk and Python in my year). The bulk of them are not difficult and are on par with COS126/COS217/COS226 assignments. They are also most likely not going to be relevant to your design project in the second half of the semester, but if nothing else they’re good for sharpening your programming chops (they are also worth 30-35% of your grade so do them well).

Design Project

The second half of the semester involves a lengthy design project, which is the main highlight of the course and the reason people choose to take this class. You will do this in groups of 3-5 people. Choose your team wisely. Your team will make or break your performance in the class. I was in a team of 3, and we had matching personalities and complementary skills. I was fairly proficient in backend programming, another teammate was proficient in design, and the last teammate drove the vision for the project and was proficient in the frontend aspects. Moreover, we were all relatively diligent, which allowed us to set and hit milestones every single week. If you have team members who like to procrastinate, you need to be very careful of making sure they’re contributing their share to the project. Empirically having a bad team not only affects your performance, but also affects what you get out of the course as a whole.

The design project is very open-ended. The opportunities are endless, as long as you follow a few, but important constraints. The core constraint is that you must build a three-tier system consisting of a 1) user interface, 2) business logic, and 3) data management. So your application must have a UI for people to use and some method of storing data. The data can either live on your local machine or on a remote server. In my experience the bulk of students build networked applications, and these types of applications are more related to the types of software you encounter in your everyday life nowadays.

Besides this constraint though, you can do whatever you want. Many people build websites with Django, Flask, node.js, etc. as well as iPhone apps / Android apps. With the advent of virtual reality / augmented reality / loads of other cool developments, you could really think outside the box and work on something innovative. There is a difference between good and bad projects however, and there’s so many types of options that impressing your instructor is akin to impressing a VC with your seed-stage startup. So here are some tips as to how to succeed - you can choose to combine them as you wish:

  • Build something technologically sophisticated : the truth is a majority of CS students will eventually learn how to build a website or mobile app, since it’s not terribly hard to learn. You could go above and beyond by solving a big technical problem, whether with your product or with your infrastructure, that is nontrivial.
  •  Build something that has a unique value proposition: you could build another calendar/todo app, but there are millions of them. Think carefully about how you offer unique value. You’re free to build something that others have worked on before, but even then there are ways to stand out.
  • Build something that is useful for the school: CodePost is a classic example of a project that came out of 333 and is now used by graders in 126/226. (which I’m sure you’ve all used) is another example that is now used by all undergraduates for course selection. There are many services within Princeton that might need improvement, and working on these projects would be a great way to contribute value.

The design project is self-driven. The instructor and TA’s have little to no influence over the final vision of your project, though you will have periodic check-ins with the TA’s who can provide some guidance and suggestions as to how to proceed. This is at once both a very cool and useful thing, but can also be enormously scary if you’re inexperienced with doing personal projects. See the external resources section below for advice on how to best get up to speed.

External Resources

The course is more about building up your skills as a software developer, which can be practiced both within and outside of the course. Therefore, the external resources that I found the most helpful are general resources that will help you with general software development:

  • Hackathons (go to HackPrinceton! In the Fall or Spring)
  • git
    • Please learn how to use git before you start your design project with your team. It will make collaboration so much easier. Create a repository on Github/Bitbucket and practice using the tool to work on independent pieces of a project. Learning how to use version control tools effectively is vital for any developer.
  • Other helpful websites: Stack Overflow (for any programming bugs), Bootstrap/Foundation (for general website CSS styling)

What Students Should Know About This Course For Purposes Of Course Selection

In my experience, some students seem to have an unfair advantage because they’ve done personal projects such as websites or apps, or worked in various internships. But you can catch up! Learning how to do your design project having had no practical experience might seem daunting, but it really isn’t that hard to learn, and with a little dedication and passion you can get up to speed.

If you feel like you’re behind though, you should really try thinking about and implementing possible design project ideas in the beginning of the semester. Since the duration of the design project is about 6 weeks, that might not be enough time for you to complete a fully satisfactory product with your team, so it doesn’t hurt to start early.

In fact, you can pick up a lot of these skills before you even take the course. For many students, the reason they chose to major in CS is because they liked using code as a toolkit to build what they loved, and this course helps students explore that aspect. But this course is by no means the only means to do so, and you can develop these skills by simply working on personal projects or going to hackathons before you take the course.

Advanced Programming Techniques

Add a Strategy or Tip