Prerequisites: No programming or computer science experience is required. Students should have sufficient facility with high-school mathematics to solve simple linear equations and to appreciate the use of mathematical notation and formalism.
Syllabus:
Units covered:
| PF1 | Fundamental programming constructs | 7 | core hours (of 9) |
| PF2 | Algorithms and problem-solving | 2 | core hours (of 6) |
| PF3 | Fundamental data structures | 3 | core hours (of 14) |
| PF4 | Recursion | 2 | core hours (of 5) |
| AL3 | Fundamental computing algorithms | 3 | core hours (of 12) |
| AL5 | Basic computability | 1 | core hour (of 6) |
| PL4 | Declarations and types | 2 | core hours (of 3) |
| PL5 | Abstraction mechanisms | 1 | core hour (of 3) |
| PL6 | Object-oriented programming | 8 | core hours (of 10) |
| GV1 | Fundamental techniques in graphics | 2 | core hours |
| SP1 | History of computing | 1 | core hour |
| SP5 | Risks and liabilities of computer-based systems | 1 | core hour (of 2) |
| SE1 | Software design | 2 | core hours (of 8) |
| SE2 | Using APIs | 1 | core hour (of 5) |
| SE3 | Software tools and environments | 2 | core hours (of 3) |
| Elective topics | 2 | hours |
Notes:
This course introduces the fundamental concepts of programming, starting from the very beginning with the object-oriented paradigm. What differentiates this course from the imperative-first implementation in CS111I is the early emphasis on objects. In this course, the discussion of classes, subclasses, and inheritance typically precedes even such basic concepts as conditional and iterative control statements.
To illustrate how this emphasis on objects affects the design of this course, it helps to consider a common sample application -- a simple numeric calculator -- that might reasonably fit into either an imperative-first or objects-first implementation of an introductory course. Under the imperative paradigm, such a program would typically be organized as a loop that repeatedly requested commands from the user and then used a conditional dispatch operation -- typically implemented as a switch statement in C-based languages -- to execute the appropriate code for each operation. An object-oriented approach to the same problem would typically have no explicit loops or conditionals. Instead, the buttons on the calculator would all be part of an object hierarchy. The buttons for the digits, for example, would all be instances of a digit button class whose common action would be to append the appropriate digit to the end of the displayed value; the individual instances of the digit buttons would differ only in the value of the local member variable representing the digit to which that button corresponds. Similarly, the operator buttons would all be part of a separate class hierarchy containing an operate method to perform an arithmetic operation. The plus button would implement one definition for operate; the minus button would implement another. The use of the object-oriented paradigm makes it possible for students to solve this sort of problem far earlier in the course, since the number and complexity of the necessary control structures are significantly reduced.
Most courses that adopt an objects-first approach will do so in an environment that supports a rich collection of application programmer interfaces, or APIs. These APIs can be an enormous help to students, because they enable the creation of much more exciting programs at an early level, thereby heightening student motivation. At the same time, the scale of most API packages can be intimidating to many students, since there are so many classes and methods from which to choose. To mitigate the effects of this conceptual overload, faculty should not hesitate to simplify the problem domain by creating restricted class libraries for introductory use.
|
December 15, 2001 |