In this course, we will learn about software engineering by creating a significant piece of softwarea large, multi-faceted software system. This will be a team project in which the class will be formed into sub-teams that tackle specific parts of the design, and integrate their pieces into a whole.
We will learn how to design software by reading case studies of large software design projects, considering theory of well-designed software, and reflecting on the design process as our own projects are underway.
From a technical perspective, we will:
A Bit More...
To generalize, there are two types of software engineering classes: one in which everyone builds the same thing, and one in which everyone builds something different. The former is good because it lets instructors focus in on specific and particular theoretical material. Instructors know exactly what problems you will be encountering as you write code, because they have created the design challenges expressly to expose certain ideas! A great example of this type of class is MIT's course 6.170, Laboratory in Software Engineering.
On the other hand you have courses that are more representative of life in the unstructured real-world, where every project is indeed different. As described by Diane Pozefsky in her Software Engineering Laboratory at UNC, this course is a faculty-coached team project. Student teams in this type of class might each have a different client and be working with wholly different software technologies.
Here, we will take a middle ground. Primarily, we will have project implementation as the heart of the class. But we will all be working a joint project, and will share code and technologies.
We will use two required books. They are ordered and available now at the UML North Bookstore. Please buy them there to make sure you have them right away:
There will be other readings, including essays published on the web and material photocopied from out-of-print books. The latter will be handed out in class. The current reading assignment is always here.
This is a project-driven course with a reading component. Discussion, writings, and other reflections on the readings will illuminate your design process as you are engaged in your own software development.
Therefore the projects themselves and the readings/reflections are both important.
The specific deliverables you will be responsible for are:
You are free to use your choice of development tools. I will probably demonstrate most stuff typing at the Unix console. Most people seem to like Eclipse.
There will be a CVS or SVN server set up for course use. Instruction on using this will be made available. By the 3rd week all code should live on the server.
Some work will be done individually and other work will be done in pairs.
For project work, teams will be responsible for conceiving work in such a fashion that each person is responsible for a separable portion of the project. A clear division of work, with an API between each person's portion, will be spec'ed out before substantial implementation is undertaken. Students will be responsible for implementing their portion of work as originally agreed. If the design changes dramatically, so that the original definition is no longer applicable, this should be documented and reported as soon as it become apparent.
We will use a course Wiki for each team to post its game releases.
Discussion Group / E-Mail List
We will use Google Groups for class conversation and announcements. Please join this group. I'd advise setting it to send email to you directly.
The group address is email@example.com. You have to be a member to send to the list.
This course does not have an objective external standard (i.e., curriculum) with respect to which student performance will be measured. Instead, I expect that students will enter the course with different backgrounds and abilities, and I am interested in seeing how you challenge yourself and grow rather than where you end up.
The following schedule will be used in determining course grades: