CS253 is the final course in the programming sequence that includes CS160, CS161, CS200 and CS270. One goal of CS253 is to teach C++, since the previous courses in the curriculum are in Java (CS160/161/200) or C (CS270). The more significant goal, however, is to complete the process of training a professional programmer. When this course is complete, you should have a better understanding of (1) the strengths, weaknesses and roles of different languages; (2) how C++ and Java programs are mapped onto hardware; (3) different models of object oriented programming; (4) memory management models; (5) how to write efficient code; and (6) how to exploit templates. In addition, you should be better at using software development tools. The recitations (which are a mandatory and important part of the course) give hands-on experience with tools used for software development in Linux, including gdb, subversion, valgrind and google test.