ECE 417/617 Elements of
Software Engineering
Spring 2005

In this course students will learn to build high-quality, reliable, and extensible software systems that are too large for a single programmer.  Emphasis is placed upon good programming practices (object-oriented design and clean, well-documented code), teamwork skills (planning, communicating, and interacting), and bringing the project to completion (testing and verification).  A semester-long project complements the theory with practice.




Week Topic Assignment
1 introduction / overview hw#1 (1/21)
2 C++ and object-oriented programming quiz #1 (1/26); hw#2 (1/28)
3 More C++ milestone #1 (2/8)
4 Visual Studio IDE quiz #2 (2/11)
5 CVS and version control milestone #2 (2/18)
6 Agile methods and extreme programming quiz #3 (2/25)
7 Testing milestone #3 (3/4)
8 Requirements elicitation quiz #4 (3/11)
9 System design milestone #4 (3/16)
10 [Spring break]  
11 UML milestone #5 (3/30)
12 User interfaces quiz #5 (4/8)
13 Life cycles milestone #6 (4/13)
14 Project management quiz #6 (4/22)
15Ergonomics final system (4/27)


Textbook and Resources

Other recommended reading: Additional software engineering resources
  1. Condensed Crash Course on C++
  2. An Intro to Concurrent Versions System (CVS)
  3. GUI-Based Programming
  4. System Design
  5. Brief Overview of UML Diagrams with a Simple Example
  6. Design Patterns
  7. User Interface Design
  8. Software Life Cycles
  9. The Cathedral and the Bazaar:  A Look at Open-Source
  10. Repetitive Strain Injury (RSI)

A main part of the class is a semester-long project in which the entire class participates. The project is written in C++ using Microsoft's Visual C++ 6.0 integrated development environment (IDE).  The code is checked into a central repository using the concurrent versions system (CVS).  This semester the project is to develop an end-user GUI-based application for detecting and tracking roots in minirhizotron image sequences.  Our client is Dr. Christina Wells and her lab in Horticulture.  See the following documents for further info:  client's initial project description and sample spreadsheet output.  Our goal is to develop an open-source application that can be used by horticulture researchers beyond the end of the semester, the code being released to the world under the GNU General Public License.

Project organization

Students are divided into groups, and the groups work in parallel to develop rival applications that meet the desired specifications.  Including the final demo, there are seven biweekly milestones throughout the semester.  For each milestone, the job of each group is to write clean, maintainable code that meets the specifications in a robust manner.  The students are initially divided randomly into groups of four people each, then they are randomly reshuffled after Milestone#2 into new groups of four people each, then after Milestone#5 they are randomly reshuffled again into groups of five people each.  Each milestone is treated like a public release, so that (because this is an open-source project) each group is allowed to incorporate whatever code it desires from any other group.  For example, for Milestone#3, a group may use code that other groups checked in for Milestone#2; in fact, a group may scrap their entire code base completely and start with another group's code, if they so desire.  No code sharing, however, is allowed within a single Milestone.  

Each group is responsible for dividing up the work among its members, scoping the work to be done, and keeping track of the accomplishments of each member as well as the accuracy of the time estimates.  For each milestone the group should submit the source code itself (via CVS); a compiled executable (via email); a system design document (hardcopy); and a summary of the work done including a detailed task list with the responsible individuals, estimation times, and completion dates (hardcopy).

Coding conventions

Writing code that compiles and runs is not enough.  An important part of software engineering is writing code that is also easy to read by other programmers, not only those in your team but also those whom you've never met.  Since we will be reading each other's code,  it is important for us to have an agreed-upon set of conventions.  Since the conventions themselves are somewhat arbitrary, the following list has been compiled using some of the more common approaches adopted in the industry.


    This class keeps track of time.
    @author Ima Coder
   class TimeManager
       typedef int SecondType;
       double GetTime(int day, const TimeStamp& another_time);
    double m_day_of_the_week;


Among the many standards on the web, Todd's very extensive and helpful C++ coding standard is similar to that above and also contains some insightful points about software engineering in general.  Wallach has a shorter coding convention list.  Lott maintains an extensive list of conventions, some of which are quite extensive :).   Linus Torvald's conventions for the Linux kernel makes a fun read, though it's geared toward C rather than C++.  And, for something completely different, don't forget to check out Microsoft's Hungarian notation.

CVS (concurrent versions system) instructions

To start using CVS through WinCvs, either follow Saurabh's "Intro to WinCvs" or do the following:

First email your password to the grader so we can put it into the CVS passwd file.  (We will encrypt your password using
    /usr/local/bin/perl -e 'print crypt("MyPassword","St") . "\n"; or using /usr/bin/perl  if that does not work.  Feel free to encrypt the password yourself if you'd prefer -- just be sure to let the grader know that it has already been encrypted.)  Note:  CVS has poor security, so do not use an important password for this project.  Instead, send something that you don't mind having compromised.  Once you have done these steps, then

  1. Download and install WinCvs/MacCvs/gCvs on your development machine
    (Or, if you're working on a Clemson DCIT Windows machine and do not have permission to install software, then copy the file (the resulting install directory) to your U: drive and unzip it)
  2. If you're not using Microsoft's Windiff, then download and install an external diff program (e.g., WinMerge for Win32 or xxdiff for Unix)
  3. Start WinCvs (wincvs.exe)
  4. Click Admin.Preferences
    1. Under General tab,
      1. Set CVSROOT to
        (Replace yourid with your student id)
      2. Set Authentication to "passwd" file on the cvs server
    2. Under WinCvs tab,
      1. Enter path of external diff program, and click checkbox (For Windiff, go to C:\Program Files\Microsoft Visual Studio\Common\Tools\windiff.exe)
      2. Set Home folder
  5. Click Admin.Login and type your password (this will store your password locally in your Home folder/.cvspass)
  6. Click Create.Checkout module
    1. Enter module name {class/rootfly}
    2. Enter local folder to checkout to
  7. Now CVS is ready for you to add your own files, modify them, etc.!  For reference, see the on-line CVS Cederqvist manual or Redbean manual

Alternatively, if you would prefer to just use the command-line version,

  1. Download and install the cvs client on your development machine
  2. Create ~/.cvsrc file with a single line: 
    cvs -d
    (Replace yourid with your student id)
  3. type cvs login at the command prompt, along with your password (this will store your password locally in your ~/.cvspass file)
  4. cd to the directory in which you want to copy files from the repository
  5. type cvs checkout name, where name is class/rootfly
  6. Now CVS is ready!  For reference, see one of the manuals above

For the grader:  To print a history of all checkouts and updates,  cvs history -x UO -a


Individual assignments:

Group assignments:


Instructor: Stan Birchfield, 207-A Riggs Hall, 656-5912, email: stb at clemson
Grader: Nikhil Rane, nrane at clemson
Lectures: 2:30 - 3:20 MWF, 227 Riggs Hall