This course is developed to teach software engineering techniques that are used to create moderate to large sized programs and introduce students to current research directions in software engineering. Software engineering for large systems includes design methodologies that scale and are geared toward larger, long-lifetime systems with multiple designers as well as tools to assist the programmer and to assist and manage programmer teams.
The design aspects of the course cover software architectures, high-level design, detailed design, API design, and user interface design. In all cases the emphasis is on designing for maintenance, evolution, and distributed software development. The course will cover programming approaches used in modern software systems, e.g., the use of multiple threads and processes, distributed systems, modern languages, and mobile and web interfaces. The tool aspects of the course cover a variety of modern development tools including IDEs, debuggers, version management, configuration management, installation, bug reporting, and maintenance.
The research directions aspects of the course might address test case generation, the applications of LLMs for programming, testing techniques for deep learning, running user studies, performance analysis, automatic program repair, use of formal methods, and other topics chosen from recent conference papers.
The course should provide students with the background needed to undertake an industrial-level software development job, understanding and motivating the various processes, designs, and techniques. It will also enable students to develop their own larger-scale software in an effective manner. It should also offer students directions for future research in software engineering.
The course is open to both graduate and advanced undergraduate students. Undergraduates should have take cs32 and one of cs30, cs33, cs131 or cs133.
A large part of the course will be involved a large-team project. This will provide the students with practical experience using the various tools, familiarity with how large-scale design techniques work and why they are used, practice in group software development, and proficiency in giving software presentations. Students should expect to work in teams of 6-10 to provide an appropriate notion of scale. This project can be something done from scratch or can involve an addition or modification to an existing open-source software system. There will be a list of potential projects before the course begins from which the students can choose. In addition, students can propose their own projects with the approval of the instructor.
In addition to the course project, there will be a recurring programming assignment. This will start with a warm-up programming project to hone the student’s development skills. This project will be further developed as the course progresses to illustrate larger-scale programming and advanced coding techniques.
A rough estimate of the required time would be 120 hours over the semester for the final project, 20 hours total on the programming assignments, 40 hours for class lectures and participation, and 4 hours of readings.
S6 Semantic Search Tool Result Display
DYMEM memory usage/ownership display
This course will be taught in person. The class will meet Tuesday and Thursday 1-2:20 in a room to be determined. Students are expected to attend classes if possible. Classes will be part lecture, part activity, and part group meetings. Classes may be recorded for those who must miss an occasional session, but this is not guaranteed. Students are responsible for all material presented in class.
Most of the grade, 60%, will be based on the group project. This will be based on various interim submissions and presentations, feedback on how the group worked during the semester, and on the final presentation and submission. Note that project grading will be largely on the quality of the code rather than on functionality. Intermediate feedback will be given on the various project submissions and presentations.
The programming assignment will count as 25% of the total grade, split between the various hand-ins. The interim submissions will be graded pass-fail, but the final programming assignment (built on top of the previous hand ins) may be graded.
Participation, through attendance, in-class discussions, in-class activities, and occasional homework, will account for the remaining 15%.
The course is highly collaborative. All programming and design assignments can be done in teams. However, all collaboration must be identified and cited, including all uses of outside sources, libraries, AI, web pages, etc. Missing citations are considered a violation of academic integrity. Typically, all members of a team will receive the same grade. However, we reserve the right to consider situations where some team members do significantly more (or less) than their share.
Dr. Reiss will hold office hours Monday from 1-3 pm and Thursday from 11-12:30. For some of these, he will also be available in person in CIT 403; others will be via Zoom using Zoom Link. Dr. Reiss is generally going to be available weekdays from 9 to 3 excluding when in class, either in person or by Zoom. You should contact him by email if you would like to meet.
Project groups are expected to meet regularly. Such meetings will be arranged by the members of the group. Dr. Reiss can be available occasionally to attend such meetings if they are scheduled on weekdays between 9 and 3. These meetings can be done in person or using Zoom or a similar technology.
Brown University is committed to full inclusion of all students. Please inform Dr. Reiss early in the term if you may require accommodations or modification of any of course procedures. You may speak with Dr. Reiss after class, during office hours, or by appointment. If you need accommodations around online learning or in classroom accommodations, please be sure to reach out to Student Accessibility Services (SAS) for their assistance (sas@brown.edu, 401-863-9588). Undergraduates in need of short-term academic advice or support can contact an academic dean in the College by emailing college@brown.edu. Graduate students may contact one of the deans in the Graduate School by emailing graduate_school@brown.edu.
Software engineering typically includes an ethics component, for example ensuring that software is fair and accessible to all users. Ethical and legal issues will be considered as they are relevant to the various topics in the course.
I am in the process of writing a textbook to accompany this course. The current (incomplete and needing a lot of editing) draft is available here.