Logistics and Contact Information
See the main course webpage.
Goals and Prerequisites
The only formal prerequisite
is CSE143.
We will very much rely on a thorough understanding of the concepts
from CSE143 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 CSE143 or other courses.
There is a level of programming maturity beyond introductory
programming that comes from building larger systems and understanding
how to specify them precisely, manage their complexity, and verify
that they work as expected. 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 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
To gain experience we will use Java and associated tools like Eclipse,
JUnit, JavaDoc, and Subversion, but the goal is to understand the
underlying ideas and concepts that are widely applicable to software
construction.
Overall Course Grade
Your overall grade will be determined as follows (subject to change as necessary, but change beyond parameters below is unlikely):
- Homework Assignments: 55.5%, depending on number of reading quizzes
- Reading Quizzes: 4%, depending on number of reading quizzes
- Midterm: 20%
- Final: 20%
- Attending a talk-to-the-professor session: 0.5%
We will have approximately one assignment per week, but not on an
exact schedule (i.e., assignments will not always be due on the same
day). The assignments are not weighted
equally because they are of different length and sophistication. The
exact weighting is to-be-determined and is not likely to be published
in advance (we need to see how the course goes). Later assignments
are likely to be weighted more heavily because they are more involved.
Late Policy
Deadlines will be given with each assignment. These deadlines are
strict. For the entire quarter, you may have four "late
days." You are strongly advised to save them for
emergencies. You may not use more than two for the same
assignment. They must be used in 24-hour (integer) chunks. You must
fill out a form on the course web-page to use late days.
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.
Textbooks
There are two required books for the course:
- The Pragmatic Programmer by Andrew Hunt and David Thomas, Addison-Wesley, 2000.
- Effective Java by Joshua Bloch, 2nd ed., Addison-Wesley, 2008.
These books contain a great deal of distilled wisdom about software
construction in general and Java best practices, technical details,
and style issues. Reading about software development is an important skill.
There will be assigned readings from these books
during the quarter, and you will be required to complete short online
quizzes about the material.
Besides the two required books, a good Java programming book for
reference is invaluable. Feel free to pick one that you like, but a
good one is:
- Core Java Vol. I - Fundamentals by Cay Horstmann, 9th ed, Prentice-Hall, 2013. This is a good general reference for the Java language and basic libraries. (The 8th edition should still be fine for the course even though it does not include the latest Java 7 changes.)
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 50 minutes.
- Do buy a Java programming book. In general, a large,
well-written reference book for any programming language you are using
is a great value, sure to save you time over frustrating web-searching
and time on sites like stackoverflow.com (though those are useful too
— it is not "one or the other"). Web-searching is
cheaper, but you are spending a lot of money on your education and
will likely get a high-paying job when you finish. The cost of a book
that helps you do better in classes, internships, etc. is miniscule compared to the benefits you get from doing better work in less time. And such a book will be valuable long after you complete CSE331.
- A common misconception about this course is that the lectures,
readings, and homeworks are disconnected. They are different
since there is no point repeating something in multiple ways, but
they also are connected. If you are approaching a homework and
not using the concepts in the rest of the course materials, you are
making it harder. When you are sawing something with a dull
blade, it can seem like you do not have time to sharpen the blade
because you need to finish sawing. In fact, you likely do not have
time not to stop and sharpen the blade.
- Start homeworks early. They are more difficult than assignments
in earlier courses and you need time to make mistakes.
- Enjoy this course and learn a lot. It is invaluable for making
you a better software developer. The more you master these ideas now,
the more effective you can be in jobs, other courses, and any other
projects.
Approximate Topic List (Subject to Change)
We expect to cover the following, with an emphasis on specification
and design. The order these are listed is only very rough as we will
revisit some topics iteratively.
- Reasoning about programs: pre- and post-conditions, invariants, and correctness
- Abstract data types, specification, implementation, abstraction functions, representation invariants, notions of equality
- Java language issues: subclasses and subtypes, generics, exceptions, assertions, etc.
- Tools: Eclipse IDE, version control, svn
- Code quality, style, comments, documentation, JavaDoc
- Testing, test coverage, black- and white-box testing, test-first development, regression testing, JUnit
- Debugging strategies and tools
- Design: modular design, coupling, cohesion; design patterns
- User interfaces, callbacks, separation of model from view/control