CISC-320/3.0 Fundamentals of Software Development

Original Authors: R. Tennent and N. Graham
Last Revised: June 25, 2008

Calendar Description

Introduction to management of small and medium-scale software projects. Advanced programming methodology using the programming language C++. Includes a significant programming project.
Prerequisites: CISC 220/3.0 and CISC 235/3.0.


This course is now required in the Biomedical Computing program and is recommended as an option or elective for any student who might become involved in the development of real-world software applications, including memory and performance-intensive applications, and those running on multi-core or distributed architectures. Its intention is to provide an introduction to such features for students who will not be taking more advanced courses in these areas, while providing the opportunity for a significant programming project for students who will be taking more advanced courses.

The course covers programming-language features and programming methodology that have not been covered in earlier courses and are not easy to learn on one's own. C++ is one of the most widely-used programming languages. It is particularly important when performance considerations are primary. Many employers insist on C++ expertise when they hire software developers. The course also provides a brief survey of software-engineering considerations for students not in Software Design, but does not have substantial overlap with any single course and so can be taken by students in Software Design. Similarly, the course provides an elementary introduction to techniques in concurrent and distributed programming.

Students are expected to have previously written programs in C and Java but no prior C++ experience is expected.

  • Introduction to C++ and its relation to C and Java.
  • Effective use of advanced features of C++: default arguments, explicit object-oriented storage management, namespaces, templates, operator overloading, multiple inheritance, function pointers.
  • Programming methodology and project management: design patterns, unit testing and debugging, issue tracking and version control, performance profiling and memory leak detection, defensive programming with assertions and exception handling, documentation.
  • Dealing with numerical issues: handling very small and large numbers, overflow, underflow, scaling, etc.
  • Elementary concurrent programming: threads, deadlock, starvation.
  • Elementary distributed-systems programming: sockets, client-server architecture.

Successful completion of a significant programming project will be required.

Possible Texts and References
  • Timothy A. Budd: C++ for Java Programmers, Pearson (1999).

  • Mark Allen Weiss: C++ for Java Programmers, Pearson (2003).

  • Avinash C. Kak: Programming with Objects: A Comparative Presentation of Object-Oriented Programming With C++ and Java, Wiley (2003).

  • Andrew Koenig and Barbara E. Moo: Accelerated C++, Practical Programming by Example, Pearson (2000).

  • Walter Savitch: Absolute C++, Pearson (2006).

  • Harvey M. Deitel and Paul J. Deitel: C++ How to Program, Pearson (2008).

  • Bruce Eckel: Thinking in C++, 2nd edition.

  • Scott Meyers: Effective C++: 55 Specific Ways to Improve Your Programs and Designs, Pearson (2005).

  • Francis Glassborow: You Can Program in C++: A Programmer's Introduction, Wiley (2006).

  • Cay Horstmann and Timothy Budd: Big C++, Wiley (2005).

  • Herb Sutter: Exceptional C++, Addison-Wesley (1999).

  • Steve Oualline: How Not to Program in C++, No Starch Press (2003).

  • James O. Coplien: Advanced C++: Programming Styles and Idioms, Addison-Wesley (1994).

  • Andrei Alexandrescu: Modern C++ Design: Generic Programming and Design Patterns Applied, Addison-Wesley (2001).

  • A. Dingle and T, Hildebrandt: C++: Memory First, Franklin, Beedle (2008).

  • Bjarne Stroustrup: The C++ Programming Language, 3rd edition, Addison-Wesley (1997).

  • Bjarne Stroustrup: Programming: Principles and Practice using C++, Addison-Wesley (2008).

  • Matthew B. Doar: Practical Development Environments, O'Reilly (2005).

  • Diomidis Spinellis: Code Quality, Addison-Wesley (2006).

  • Andrew Hunt and David Thomas: The Pragmatic Programmer: From Journeyman to Master, Addison-Wesley (1999).

  • Andreas Zeller: Why Programs Fail: A Guide to Systematic Debugging, Morgan Kaufmann (2006).