Syllabus

Goals: The aim of this course is to help students write programs of higher quality and increased complexity. This requires creating software that is (1) correct, (2) easy to change, (3) easy to understand, and (4) easy to scale. We will study principled approaches to achieving each of these.

After completing this course successfully students should be able to:

  • Successfully build medium-scale software projects in principled ways
  • Understand the role of specifications and abstractions and how to verify that an implementation is correct, including effective testing and verification strategies and the use of formal reasoning
  • Analyze a software development problem and be able to design effective program structures to solve it, including appropriate modularity, separation of abstraction and implementation concerns, use of standard design patterns to solve recurring design problems, and use of standard libraries
  • Use modern programming languages effectively, including understanding type systems, objects and classes, modularity, notions of identity and equality, and proper use of exceptions and assertions
  • Use and learn new contemporary software tools, including integrated development environments, test frameworks, debuggers, version control, and documentation processing tools

In this class, we will use Java and associated tools like Eclipse, JUnit, JavaDoc, and git, but the goal is to understand the underlying ideas and concepts that are generally applicable to software construction.

Approximate Topics: We expect to cover the following, with an emphasis on specification and design:

  • Reasoning about statements, loops, functions, and data types: pre- and post-conditions, invariants, and specifications
  • Testing: coverage, black- and white-box testing, test-first development, regression testing, JUnit
  • Debugging and assertions
  • More advanced Java language issues: generics, exceptions, equality, hashing, subclasses, overloading, and overloading.
  • More advanced tools: IDE and version control
  • Code clarity: comments and JavaDoc
  • Program design: modularity, coupling, cohesion, and design patterns
  • User interfaces and event-driven programming

Prerequisites: The only formal prerequisite is CSE 143. We will very much rely on a thorough understanding of the concepts from CSE 143 as well as Java programming skills. We will go much further and you will be challenged to approach software development much differently than you have in CSE 143 or other courses.

Grading: Your overall grade will be determined as follows (subject to change as necessary, though substantial changes are unlikely):

55%Homework assignments
15%Midterm exam
25%Final exam

There is approximately one assignment per week, but not on an exact schedule (i.e., assignments may be due on different days). The assignments are not weighted equally because they are of different length and sophistication. Later assignments are likely to be weighted more heavily because they are more involved. (The exact weighting will be determined as we go.)

Late Policy: This policy may not be the same as in your other classes. You are responsible for understanding it if you choose to submit late work.

Deadlines will be given with each assignment. These deadlines are strict. For the entire quarter, you may have 3 free late days. You are strongly advised to save them for emergencies. Each late day gives you an additional 24-hours in which to complete the assignment. You may not use more than 2 free late days for the same assignment, and in the case that you use two (rather than zero or one), you will need to notify the staff to make sure that they find the final version of your assignment, as they will typically retrieve and begin grading completed assignments 24 hours after the due date.

If you use more than three late days total during the quarter or more than two late days on one assignment, we will accept the assignment, but there will be a penalty applied: 10% for one extra late day and 20% for two or more extra late days on that assignment. (The maximum penalty on any assignment is 20%.)

For coding assignments, we will also allow you to re-submit your work. However, we will only change the correctness portion of your score, not style, design, etc. Furthermore, the maximum you can receive on a resubmit is 80% (since it will be 2+ days late at that point). The purpose of this policy is to allow students who make minor mistakes that end up causing a large number of our correctness tests to fail to fix those mistakes and limit the point deduction to just 20% of correctness points. (Note that we may put a cap on how many re-submissions we allow for one assignment. Hopefully, no student will need more than one or two.)

Academic Integrity: Any attempt to misrepresent the work you submit will be dealt with via the appropriate University mechanisms, and your instructor will make every attempt to ensure the harshest allowable penalty. The guidelines for this course and more information about academic integrity are in a separate document. You are responsible for knowing the information in that document.

Texts: The required books for the course are the following:

  • Effective Java by Joshua Bloch, 2nd ed., Addison-Wesley, 2008.

  • The Pragmatic Programmer by Andrew Hunt and David Thomas, Addison-Wesley, 2000.

These books, especially Effective Java, contains a great deal of useful information about software design and implementation. Effective Java is especially strong in its discussion of best practices for using the Java programming language, though much of the advice applies more generally.

Besides the required textbook, the following books may also be helpful to you:

  • Program Development in Java by Barbara Liskov and John Guttag, 1st ed, Addison Wesley, 2000.

    The content of this well-written book closely mirrors much of the content of the course. The only downside is that it was written 17 years ago, so it is out-of-date with regard to some of key parts of the Java language and libraries. Nonetheless, it is a good place to look for another presentation of the material covered in class, if you can ignore those parts.

  • Core Java Vol. I - Fundamentals by Cay Horstmann, 10th ed, Prentice-Hall, 2016.

    This is a good general reference for the Java language and basic libraries. While technical documentation for these things is available on the web, the discussions in a book like this one are usually easier to follow and typically include advice not found in the formal documentation.

Readings: There will be assigned readings during the quarter. The material covered in these readings will be covered in the midterm and final exam. These readings will mainly come from Effective Java, though there may also be some from The Pragmatic Programmer.

Advice:

  • Do not skip class or section to work on homework, not even late in the quarter when you are more tired and busy. This will cost you time (not to mention learning) in the long run. Class will start promptly, and you will find the entire course easier and more educational if you arrive punctually, well-rested, and ready to pay attention for 60 minutes.

  • Start homeworks early. They are more difficult than assignments in earlier courses and you need time to make mistakes.

  • Consider buying a Java programming book (like Core Java). Past experience indicates that students tend to over-estimate the quality of the information to be found on the web and under-estimate the quality of the information found in such a book. You can ultimately save time by reading a book that is known to be high-quality and up-to-date instead of reading web pages that are either inaccurate or out-of-date only to find that their advice does not work for you.

  • Think about which lecture material applies to the homework you are working on. Each assignment is carefully designed to apply ideas from lecture, so if it does not seem that any lectures apply to what you are working on, there is a good chance that you are missing something. Knowing which ideas the homework is designed to apply should make it easier to complete. (The same point applies to exams.)

  • Learn a lot and have fun. Everything taught in this course is something that you will need to know to be successful in your career. Mastering these ideas now will make later courses and projects easier. But also be sure to have fun.

    The ability of create things, solely with the power of your imagination, that express yourself and positively affect the lives of (potentially) millions other people is a rare joy that, while available to anyone, most will never experience. For programmers, like yourself, it can be an everday occurrence. As you dig into the tools and techniques of programming, it is important not to lose sight of the big picture: programming should bring joy, not only to those that use the software you create but also to yourself. You can start by having fun in this class.