Goals and assessment

This course introduces basic concepts of computer systems, information networks and programming. The primary goal is for the student to develop the skills required for developing software using imperative and object-oriented languages. Another major goal is for the student to become familiar with basic ideas in object-oriented design and programming, including UML class diagrams. Another major goal is for the student to become fluent with the core features of the Java programming language and its standard libraries, including inheritance, exceptions, and recursion. This course helps you meet these goals by designing, implementing, and testing a number of small programs. Another major goal is for the student to be familiar with ethical problems that face computer scientists and software engineers and the codes of professional conduct that specify how to deal with these problems. This goal will be met primarily through discussion.

Several skills are needed to successfully write programs, including analytical thinking, systematic experimentation, persistence and patience, organization and time management, effective use of reference material (reading technical documentation, searching the web). As befits a university course, we focus on algorithmic thinking and problem-solving: Analyzing requirements, algorithm design, functions and procedural abstraction, pre- and post-conditions, loops and invariants. Top-down design, libraries and simple data structures (arrays and lists), inheritance and subclass polymorphism. Tools and techniques for designing, debugging and testing.

Along the way, we will touch upon topics that can be studied in depth in other courses, in particular these. Computer architecture: CPU, ALU, memory, cache, primary and secondary storage, data representation, fetch-decode-execute cycle, boolean logic, combinatorial circuits. Software architecture: encapsulation, parameterized classes, object-oriented design patterns. Networked systems: Computer networks, protocol layers, TCP/IP, applets and mobile code, security, confidentiality, and authentication.

To assess student progress we focus on key skills that can be demonstrated. By the end of the semester the student should be able to:

  1. Do simple calculations in binary arithmetic and explain encodings of characters and images.
  2. Demonstrate the operational behavior of Java programs involving method invocations, including recursive ones, by showing the stack at successive states.
  3. Determine which method implementation is invoked in a program involving interfaces, abstract classes, subclasses and inheritance.
  4. Demonstrate the operational behavior of programs involving loops, by showing successive states in specific computations.
  5. Explain the behavior of loops by defining informal invariants.
  6. Use the DrJava environment to evaluate expressions, explore state, and debug.
  7. Develop a design by stepwise refinement, given a requirements description.
  8. Implement a design given using psuedo-code and a UML class diagram.
  9. Test and debug an implementation.
  10. Design small Java programs to meet given specifications, using both loops and recursion, static and non-static methods, classes, inheritance, interfaces and abstract classes, arrays.
  11. Design and implement simple user interfaces using graphical components and event handlers.
  12. Implement and predict behavior of exception handling code for common Java classes.
  13. Simplify a program's logical structure by algebraic manipulation of boolean expressions.
  14. Explain designs informally, using standard terminology and notations.
  15. Read technical documentation effectively, in particular, to find details about the Java APIs.
  16. Discuss how the professional standards address common ethical issues.
  17. Work cooperatively on small group projects.



David Naumann 2008-08-27