I have two main goals for you in this class. I want to help you improve your independence as a programmer and your ability to write high quality code. Pursuing these goals involves the usual academic emphasis on concepts and vocabulary that you need to learn through study and experimentation. But it also involves lots of practice with the tools of the trade, and lots of effort to develop good habits and discard bad ones. Therefore, we'll spend a lot of class time on practice.
Most days, we'll do some combination of:
We will take readings from a variety of sources. Enough of the readings will come from two books that I have asked you to purchase them: The Pragmatic Programmer, by Andrew Hunt and David Thomas, and Don't Make Me Think, Revisited, 3e, by Steve Krug. Both of these books are short, fun to read, and reasonably cheap. They're also both packed with ideas that programmers should think about. You'll get lots of good advice here, plus some advice you disagree with. The disagreement is natural, and the discussion matters.
At various times during the course, we will use Python, Java, and Javascript. We'll also use some special-purpose languages like HTML, CSS, and SQL.
For some programming assignments during this term, we will have code reviews. For our purposes, a code review will be a meeting of the students at one of the tables in Weitz 235, with drop-in interruptions by me. The goal of each code review will be to will discuss the strengths, weaknesses, and other interesting features of each student's solution of a particular programming problem. Code reviews are one of the most efficient and powerful tools I know of for improving your software, but of course most people feel a fair amount of apprehension at the idea of discussing their code in detail in front of other people. Thus, it's essential that each participant in a code review prepare thoroughly by studying everybody else's code, and by preparing positive comments, constructive criticism, and plenty of questions. We'll discuss the details of our code review process before the first code review.
Your grade will be based on your performance on a variety of assignments, and and on your participation in the code reviews. The assignments will include a little bit of writing, several programming assignments, and at least one revision of a programming assignment. There will be no exams in this class.
Though the precise weighting of the assignments in your grade will depend on the exact nature of each assignment (which I won't determine until the assignment is written and posted online), a good estimate will be the number of days I give you between the last assignment and the current assignment. So if there's a two-week gap, that assignment will be worth approximately 20% of your grade in a ten-week term (with the caveat that I don't count midterm Saturday through Monday as days--I intend for you to have time to rest and catch up on midterm weekend).
Late homework will receive 25% reduction of score during the first 24 hours after the homework was due, and will receive a score of 0 after that. Consult me at least 24 hours before an assignment is due if you have extraordinary circumstances preventing you from handing in your work on time. In real emergencies, contact me as soon as you are able.
I may reorder some things along the way, but the schedule will look more or less like this:
Weeks 1-2: How to get started making a high-quality program.
To exercise the first ideas we talk about, you'll write a Java utility and start working with a version control system (git in the context of Bitbucket) and an Integrated Development Environment (IDE) (IntelliJ).
Weeks 3-5: Developing the "high-quality software" theme. We'll have lots of discussions of tools, habits, and techniques you'll need to make good software.
In the context of those discussions, you'll be developing a database-driven web application using Python, HTML, CSS, and Javascript. Most likely, there will also be one or two other short programming exercises during this time to get you familiar with some tricky ideas that every programmer crashes into at one time or another.
Readings during this period will include a variety of snippets from various books and web essays by some great writers about software.
We will also start having code reviews during this period. See below for more information.
Weeks 6-7: An introduction to the principles of user interface design. We'll revisit your earlier work in the context of the ideas in Steve Krug's Don't Make Me Think, and we'll start looking at GUI programming in Java..
Week 8: Prep for final projects, plus miscellaneous topics (design patterns, profilers, team development methodologies,...).
Weeks 9-10: Catch-up. There's way too much cool stuff to talk about, so we'll fit in what we can.