ECE 417/617 Elements of
Software Engineering
Spring 2012

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 hw01 due 1/23
2 C++ and Visual Studio IDE hw02 due 1/30
3 More C++, object-oriented programming, and CVS Individual project, attempt #1 due 2/6
4 Software life cycles hw03 due 2/13
5 Software process and modeling (UML) hw04 due 2/20 (and string class)
6 Project management hw05 due 2/27
7 Agile methods Individual project, attempt #2 due 3/5
8 Requirements hw06 due 3/12 (and string class, attempt #2)
9 System design  
10 [Spring break] hw07 due 3/26
11 Testing hw08 due 4/2
12 Risk analysis hw09 due 4/9
13 User interfaces hw10 due 4/16
14 Formal methods hw11 due 4/23

The final exam is scheduled for Thursday 5/03, 3:30 - 5:00.


Textbook and Resources

Required text:

Recommended books:

Suggested readings:

Additional software engineering resources

  1. Introduction
  2. Condensed Crash Course on C++
  3. Practice with C++: Writing a Concrete Class
  4. Concurrent Versions System (CVS)
  5. The Software Process
  6. Modeling
  7. Design
  8. User Interface Design
  9. Testing
  10. Project Management
  11. Software Practice
  12. Formal Methods
  13. 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 Studio integrated development environment (IDE).  The code is checked into a central repository using the concurrent versions system (CVS).  There is also an individual project designed to ensure that each participant is capable of contributing to the group project.

Individual project

The individual project for this semester is explained hereIndividual projects will be checked into CVS in the directory class/imageguide/spring2012/individual_projects.  Correction:  To make life easier for you all, use the assign server instead of CVS for the individual projects.  To turn in your assignment, send an email to (and cc the instructor and grader) with the subject line "ECE417-1,#n" (without quotes but with the # sign), where 'n' is the assignment number.  Note:

You must send this email from your Clemson account, because the assign server is not smart enough to know who you are if you use another account.  E.g., do not use  If you are using Gmail, it is not sufficient to change the 'send mail as:' to  Instead, from 'Mail Settings' you need to go to 'Accounts and Import', 'Send mail as:', 'Send mail from another address', type in your, select 'Send through SMTP servers', type '' along with your userid and password, select 'Secured connection using SSL', then 'Add account'.

Some helpful hints:


Class project

This semester our client is Dr. David Kwartowitz and his lab in Bioengineering.  Our goal is to to design, plan, document, and implement an open-source application to provide an infrastructure for image guidance, to be used by medical and bioengineering researchers.  The code is released under the GNU General Public License.  Students are divided into groups to develop different components of the application.  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 summary of the work done including a detailed task list with the responsible individuals, estimation times, and completion dates (hardcopy brought to class); and a list of tasks/goals for the next milestone.  If an individual is not pulling his or her weight, the group has the right to fire that individual from the group; such decisions should be communicated to the instructor as soon as they are made.

Group project grading


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.  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

CVS is a command-line tool for managing source code revisions using a single repository.  WinCvs is a popular GUI for CVS that makes it much easier to use.  (Other interfaces exist, such as tortoisecvs).  To start using CVS through WinCvs, do the following:

  1. Download and install WinCvs/MacCvs/gCvs on your development machine
  2. Run WinCvs (wincvs.exe) -- assuming version 2.0
    1. Click Admin.Login
      1. Under Login settings tab,
        1. Set CVSROOT to
          (Replace yourid with your student id)
    2. Click Admin.Preferences
      1. Under CVS tab,
        1. Set Home folder to somewhere on your machine
      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; other diff programs are WinMerge for Win32 or xxdiff for Unix)
    3. Your password will be given to you in class or emailed to you.  If you wish to change it, please email a different password to the grader so we can put it into the CVS passwd file.  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. 
    4. Click Admin.Login, select the CVSROOT (if it is not already chosen), and type your password (this will store your password locally in your Home folder/.cvspass).  You only need to login this one time (unless of course you ever explicitly log out).
    5. Click Remote.Checkout module
      1. Enter module name:  name, where name is defined below
      2. Enter local folder where you would like to store the checked out files
    6. Whenever a command succeeds, you will see  *****CVS exited normally with code 0*****
    7. Ignore the warning that you don't have TCL or Python.
  3. Now CVS is ready for you to add your own files, modify them, etc.! 
    1. To add a file (this means to put an existing file under CVS control),
      1. Create a file on your local machine in a directory under CVS control (or move an existing file there)
      2. In WinCVS, navigate to the directory and click on the file.
      3. Click 'Add selected' (the little button up top with the red plus on it)
        Note:  If the file is binary, then click 'Add selected binary', but you should only rarely do this, since CVS is not really designed for binary files.
      4. Right-Click on the file or folder and select 'Commit...', then type in a brief log message and say 'OK'
    2. To add a folder, do the same thing.  However, note that if you add a folder with no files in it, then most people will never see it.  This is because the default for 'Update...' is to "Prune empty directories" (see the Globals tab of the Update popup dialog)
    3. To remove a file (this will remove the file from CVS control, *and* delete it from your local machine),
      1. In WinCVS, navigate to the directory and click on the file.
      2. Click 'Remove selected' (the little button up top with the black 'X' on it)
      3. Right-Click on the file or folder and select 'Commit...', then type in a brief log message and say 'OK'
      4. Note that CVS never actually deletes anything from the server; it just flags it as deleted.  This is so you can retrieve an earlier version later if you accidentally deleted a file.  So if you accidentally added a humongous file, notify the administrator so the file can be actually deleted rather than hogging up disk space needlessly.
    4. To commit your changes to a file (once you are ready to share your edits with other users of the repository)
      1. In WinCVS, navigate to the directory and click on the file.
      2. Right-Click on the file or folder and select 'Commit...', then type in a brief log message and say 'OK'
    5. To update (this will merge any changes that others have committed with your own local copy),
      1. Right-Click on the file or folder and select 'Update...', Click the middle check box that says, "Create missing directories that exist in the repository", then say 'OK'
      2. If CVS indicates a conflict (via a red 'C' next to the filename in the output window), then you will need to resolve the conflict by hand.  Search in the file for "<<<<<<<".
  4. For reference, see the on-line CVS Cederqvist manual or Redbean manual

Alternatively, if you would prefer to just use the command-line version (not recommended),

  1. Download and install the cvs client on your development machine
  2. Use a text editor to create a ~/.cvsrc file that contains a single line that looks like this:
    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 defined below
  6. Now CVS is ready!  For reference, see one of the manuals above

Replace name with class/imageguide (Spring 2011 or 2012), class/rootfly (Spring 2005, 2007, 2008, 2009, or 2010), or class/seebreeze (Spring 2006).

For the grader: 

VC++ 6.0 coding resources

When checking in code, be sure to check in all the files needed to compile your project (such as .h, .c, .cpp, .rc, .vcproj, .vcxproj, .sln, .dsp, .dsw).  Also check in the res directory that contains .ico and .rc2 files.  The .ico file is binary, while all others are text-based.  Do NOT check in all the other files that Visual Studio creates automatically, such as .aps, .clw, .ncb, .opt, .plg, .suo, or the Debug or Release or ipch directories.  When in doubt, check out your code to a new temporary directory and verify that it compiles and runs.


Instructor: Stan Birchfield, 209 Riggs Hall, 656-5912, email: stb at clemson
Office hours:  Wednesdays 4-5 or by appointment
Satish Ravindran, email:  satishr
2:30 - 3:45 MW, 226 Riggs Hall