Goals and Subjects

While previous classes such as CS152 and CS251 have introduced you to the basic syntax and semantics of the Java programming language, as well as elements of program design, the purpose of this class is to attain mastery of not just the Java language, but design and engineering of large programs in general from an object oriented perspective. Although we will develop programs exclusively in the Java language, we will discuss and examine deeper design issues that span all programming languages. Mastery is a difficult thing, and comes only with time and real, hands-on experience. This class will give you some of that experience by giving you the opportunity to design and build a few programs of nontrivial scope. This class really represents a beginning on a lifelong road to the kind of true mastery that comes only by grappling with many real-world design issues, solving them yourself, and seeing how other (more experienced) programmers have solved them.

The title of the class, ``Design of Large Programs'' refers to the type of design issues that begin to emerge when you start to deal with code bases too large for one person to keep in their head in entirety. What constitutes ``large'' is a bit up in the air -- it depends on the programming team, the complexity of the specification, the age of the code, and even the tools that the development team has available. Nonetheless, a commonly cited figure is about 10,000 lines of code. This is the size at which, more or less, one person can't conceptualize the entire code base simultaneously and significant modularity issues begin to arise. In ``The Real World'', large code bases range from hundreds of thousands to tens of millions of lines of code. Needless to say, we won't deal with millions of lines of code in this class. In practice, we will barely even achieve 10,000 lines, but I hope to convey some feel of the design issues that you'll have to consider when you're part of a team designing UberSoftware 2006 (TM).

Along the way, we'll examine issues like robustness, security, identifying goals and requirements, project scope, testing methodology, proper use of object orientation, and support tools. And, just in case you think that this is a class purely about ``hacking'', let me assure you that your theory classes should not be forgotten when you enter this class -- a significant part of good design is understanding your tools, including your algorithms. We'll spend some effort analyzing the algorithms at the heart of the code you'll be building here.

Terran Lane 2004-01-21