Collaborative Software Development
Donald E. Knuth, one of the world’s most distinguished computer scientists, has said both that “computer programs are fun to write” and “software is hard.” The goal of this course is to give students a taste of what it is like to design and develop real software. The quotes by Knuth illustrate two themes of this course that are not necessarily at odds: The challenge of writing good software should not offset the pleasure derived from writing it. Some of the main topics that we will cover include: the power of abstraction, the separation of design from implementation, version control, the selection of development environments, the creative use of existing software libraries and tools, the benefits of a flexible approach, the role of maintaining good documentation, and, most importantly, how to write software in teams. No place is the adage “there is no substitute for experience” more relevant than in software engineering. With that in mind, this course is intended to be hands-on. Design and development techniques will be taught primarily by designing and developing a semester-long, collaborative software project. Examples of project categories include (but are not limited to) digital games and mobile applications. Specific topics include: design patterns, including Model-View-Controller; separating user-interface particulars from core algorithms; wireframe techniques; alpha vs. beta testing; using distributed, collaborative software versioning tools such as github; the role of abstract data types and precise API specification; code reviews; workshopping; the less heralded but crucially important roles of documentation writers, software testers, and project managers. Permission of the instructor is required. Students should have studied at least one semester of computer programming. Preference will be given to seniors who apply as a team, in advance, with a concrete proposal.