concepts, not syntax better living through organization CS as managing complexity i.e. building, maintaining large, complex systems software engineering == problem-solving to build big programs tools editors debuggers profilers (used to analyze performance) design philosophies e.g. modularity (more later) testing methodologies ... module clearly separated piece of a larger, complex system limited, well-defined interdependence w/ other modules modules in the real world parts of a car, e.g. engine, tires, radio, bumper, seats parts of my trip to Brooklyn, e.g. walk to bus stop, bus to airport entrance, entrance to gate, gate to plane, first leg of flight, second leg of flight, etc. parts of your education process, e.g. major prerequisites, major core courses, senior project modules in the software context at different levels a function related function definitions in a single source file a project w/ multiple source files programs grouped as a "suite," e.g. Microsoft Office, ClarisWorks Why modularity? Limited, well-defined interdependence means you can... develop a system's parts simultaneously. make changes to one module with a minimal, predictable impact on the rest of the system. locate bugs more easily. focus analysis (e.g. memory usage, speed) on one module reuse modules in future systems. modularity and real software MSVC editor, toolbars, file browser, debugger, compiler, linker Word editor, toolbars, file browser, spelling checker, printing Netscape toolbars, file browser, image viewer, bookmark manager mail reader editor, toolbars, file browser, address book [Note common modules. Consider advantages above.] testing modules when rest of system is not complete stubs drivers modularity at the file level source files .cpp for a group of related function definitions header files .h for each .cpp function declarations (prototypes), type definitions, constants modularity in the build process preprocessing #include headers, #define compiling each .cpp to one .obj linking multiple .obj and standard libraries to an executable preprocessing: the truth about #include (copy and paste) preprocessor replaces #include line w/ contents of header pointy braces vs. double quotes pointies for standard library headers (which you don't write) e.g. #include quotes for your own headers, located in same dir. as source files e.g. #include "myfunctions.h" misc. notes other common filename extensions C++ source files: .cc, .C (ack!) C++ header files: .hh