ECE
417/617 Elements of
Software Engineering
|
|
Spring 2010
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.
Syllabus
Week
| Topic
| Assignment
|
1
| introduction / overview |
hw01 and ms1 (see below) due 1/15 |
2
| C++ and Visual Studio IDE |
hw02 and ms2 (see below) due 1/22 |
3
| More C++, object-oriented programming, and CVS |
hw03 due 2/5 |
4
| Software life cycles |
hw04 due 2/12 |
5
| Software process and modeling (UML) |
hw05 due 2/19 |
6
| Project management |
hw06 due 2/26 |
7
| Agile methods |
hw07 due 3/5 |
8
| Requirements |
hw08 due 3/12 |
9
| System design |
|
10
| [Spring break] |
|
11
| Testing |
hw09 due 4/2 |
12
| Risk analysis |
hw10 due 4/9 |
13
| User interfaces |
hw11 due 4/16 |
14
| Formal methods |
|
15 | Ergonomics |
|
Other dates:
Required text:
Recommended
books:
Suggested readings:
- Gary Pollice,
Teaching Software Development vs. Software Engineering,
2005
-
Software's Chronic Crisis, Sept. 1994
- Bugs in the news: Rover, MS Server, Mars Climate Orbiter, Mars
Spirit, Toyota
- Walter Royce,
Successful Software Management Style: Steering and
Balance, IEEE Software, 20(5):40-47, 2005
- Michael Cusumano and Richard Selby,
How Microsoft Builds Software
(another
copy accessible from off campus),
Communications of the ACM, 40(6), June 1997
- Robert Guth, Battling Google,
Microsoft Changes How it Builds Software,
Wall Street Journal, Sept. 23, 2005
- Fred Brooks, The Mythical Man-Month After 20 Years, IEEE Software,
12(5):57-60, Sept. 1995 (review of
the book)
- Eric Raymond,
The Cathedral and the Bazaar, 1999
- Cliff Jones et al.,
Verified Software: A Grand Challenge,
IEEE
Computer, 39(4), April 2006
- Barry Boehm,
Making a Difference in the Software Century, IEEE Computer,
41(3), March 2008
- Articles in
Additional software engineering resources
- Introduction
- Condensed Crash Course on C++
- Concurrent Versions System (CVS)
- The Software Process
- Modeling
- Design
- User Interface Design
- Testing
- Project Management
- Software Practice
- Formal Methods
- 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 our client is
Dr.
Christina Wells and her lab in Horticulture Department. Our goal is to
to document, verify, test, and extend our open-source
Rootfly application
which is being used by horticulture researchers. The
code is released under the GNU General Public License.Project organization
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.
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.
- Spelling and syntax:
- class, struct, namespace, function, method: InterCaps style
(first letter of each word capitalized), also known as CamelCaps
- typedef: same as class
- local variables, function parameters:
all_lowercase_with_underscore_between_words
- member variables of a class: same as local variables, but with
'm_' prefix
- macros, enums:
ALL_UPPERCASE_WITH_UNDERSCORES_BETWEEN_WORDS
- global variables (avoid these of course): same as local
variables, but with 'g_' prefix
- private methods: iInterCaps (intercaps but with a leading
underscore i)
- filename (if one file per class): ClassName.[h,cpp]
- braces { }: in the same column (C++-style), not opening brace at
end of line (Kernigan & Ritchie C-style)
- number of spaces in a tab: 2 (but insert spaces, not tabs!)
- Comments and parameter passing:
- Functions that do not modify the member variables of a class are
declared const
- Function parameters that are not modified (except native types) are
declared with const&
- Function parameters that are modified are declared with a pointer (*)
and come after all the inputs
- Functions local to a file are enclosed in an unnamed namespace to keep
its linkage internal to the file. Like private methods, these follow
the iInterCaps style.
- Just before each class declaration, a comment briefly describes the
purpose and functionality of the class, any non-obvious peculiarities, and
the author's name in
JavaDoc /
Doxygen format (starts with two asterisks, keywords start with @)
- Each header file starts with #ifndef #define, and ends with #endif;
double-underlines lead and trail name of file in ALL CAPS WITH UNDERSCORES;
Example:
#ifndef __BLEPO_IMAGE_H__
#define __BLEPO_IMAGE_H__
...
#endif __BLEPO_IMAGE_H__
- Licensing:
- At the top of each file that you write or modify (do not worry about
automatically generated files that you do not touch), include the GNU GPL
license:
/*
* Copyright (c) 2010 Clemson University.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
Example:
/**
This class keeps track of time.
@author Ima Coder
*/
class TimeManager
{
public:
typedef int SecondType;
TimeManager();
double GetTime(int day, const TimeStamp& another_time);
private:
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:
- Download and install WinCvs/MacCvs/gCvs
on your development machine
- Run WinCvs (wincvs.exe) -- assuming version 2.0
- Click Admin.Login
- Under Login settings tab,
- Set CVSROOT to :pserver:yourid@cvs.ces.clemson.edu:/pub/cvsprojects/ece417
(Replace yourid with your student id)
- Click Admin.Preferences
- Under CVS tab,
- Set Home folder to somewhere on your machine
- Under WinCvs tab,
- 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)
- 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.
- 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).
- Click Remote.Checkout module
- Enter module name: name, where name is
defined below
- Enter local folder where you would like to store the checked out
files
- Whenever a command succeeds, you will see *****CVS exited
normally with code 0*****
- Ignore the warning that you don't have TCL or Python.
- Now CVS is ready for you to add your own files, modify them, etc.!
- To add a file (this means to put an existing file under CVS control),
- Create a file on your local machine in a directory under CVS control (or
move an existing file there)
- In WinCVS, navigate to the directory and click on the file.
- 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.
- Right-Click on the file or folder and select 'Commit...', then type in a
brief log message and say 'OK'
- 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)
- To remove a file (this will remove the file from CVS control, *and* delete
it from your local machine),
- In WinCVS, navigate to the directory and click on the file.
- Click 'Remove selected' (the little button up top with the black 'X' on
it)
- Right-Click on the file or folder and select 'Commit...', then type in a
brief log message and say 'OK'
- 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.
- To commit your changes to a file (once you are ready to share your edits
with other users of the repository)
- In WinCVS, navigate to the directory and click on the file.
- Right-Click on the file or folder and select 'Commit...', then type in a
brief log message and say 'OK'
- To update (this will merge any changes that others have committed with
your own local copy),
- 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'
- 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 "<<<<<<<".
- 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),
- Download and install the cvs client
on your development machine
- Use a text editor to create a ~/.cvsrc file that contains a single line
that looks like this:
cvs -d :pserver:yourid@cvs.ces.clemson.edu:/pub/cvsprojects/ece417
(Replace yourid with your student id)
- type cvs login at the command prompt, along with your password
(this will store your password locally in your ~/.cvspass file)
- cd to the directory in which you want to copy files from the repository
- type cvs checkout name, where name is defined below
- Now CVS is ready! For reference, see one of the manuals above
Replace name with
class/rootfly (Spring 2005, 2007, 2008, 2009, or 2010),
or class/seebreeze (Spring 2006).
For the grader:
- To encrypt a password, use
/usr/local/bin/perl -e 'print crypt("MyPassword","St") . "\n";'
replacing MyPassword with the password you would like to encrypt. (You
may need to use /usr/bin/perl if the above does not work.)
- To print a history of all checkouts and updates, cvs history -x UO -a
VC++ 6.0
When
checking in code, be sure to check in all .cpp, .h, .dsp, .dsw, and .rc files,
along with 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,
or .opt. When in doubt, check out your code to a new temporary directory
and verify that it compiles and runs.
Individual Milestones:
- Milestone 1 (individual assignment), due 1/15 (11:59pm)
- Write a C++ class called File with the following public methods:
- empty constructor --- does nothing but initialize private members
appropriately
- constructor taking a const char* --- opens a file for reading using
the provided filename
- void Open(const char*) --- same as previous, but first closes the current
file if there is already one open
- void Close() --- closes the file if there is one open, otherwise does
nothing
- destructor --- same as previous
- bool ReadInteger(int*) --- reads the next integer in the file separated by whitespace;
returns a bool to indicate whether it was successful (0 indicates EOF, 1 indicates success)
- Privately, the class should own a FILE* and access the file using C routines.
Alternatively, you can use ifstream and C++ routines, if you prefer..
- Write a public function int Add(const std::vector<int>& a) that
returns the sum of all the numbers in a
vector.
- Write a Visual C++ console-based application that takes a single command-line argument, namely,
the name of the file to open. When executed the program should open the file, read all the numbers
in the file until the end of the file is reached. The program should print all the integers one after
the other on stdout, after which it should print the total of all the
numbers, the total being computed by the Add function.
- To create a console app, follow these instructions: File -> New ->
Project -> Win32 Console Application. Give it a name (Name the workspace
userid_hw1, where userid is your Clemson user id) and keep the
checkbox on "Create new workspace". Choose "An application that supports MFC."
Now compile and run (Build -> Build ..., and Build -> Execute, or F7 and
Ctrl-F5). Under FileView -> Source Files you will find the main cpp file.
- Create a directory in 'rootfly/spring2010/hw' with your userid.
- Within this directory, create a subdirectory named 'hw1'
- Into this new subdirectory that you created, check in all the files and
directories needed to compile your program, but no more (see above).
The grader should be able to do a CVS update, compile your code, and run it.
- Also, add your userid and name to 'student_list.txt' in the 'rootfly/spring2010'
directory of the CVS repository.
- Milestone 2 (individual assignment), due 1/22 (11:59pm)
- Create a dialog-based MFC windows application (MFC AppWizard)
- Add a button to the dialog; rightclick on the button and change the
displayed text to "&Add Polyline"
- Ctrl+W to bring up ClassWizard, add a callback to the BN_CLICKED
message, then choose 'Edit Code'
- In the ClassWizard, click on the dialog under 'Object IDs' and add a
callback to the WM_LBUTTONDOWN message
- Add to the dialog class:
- Two member variables:
- bool m_adding = false; // indicates whether in 'adding mode'
- std::vector<CPoint> m_points; // stores the points that have been
clicked
- A method called 'Redraw' that draws the polyline
- Hint: Use CClientDC(this) to create a device context. Then
use dc.MoveTo and dc.LineTo to draw.
- The behavior should be as follows:
- When the program starts up, mouse clicks in the window (outside the
buttons) do nothing
- After clicking "Add Polyline", mouse clicks add points to the polyline,
which is drawn immediately
- Clicking 'OK' or 'Cancel' exits the program
- Create another subdirectory named 'hw2'. Into this subdirectory, check in all the files and
directories needed to compile your program, but no more (see above).
The grader should be able to do a CVS update, compile your code, and run it.
Class Project:
The semester-long project will be divided into three
phases:
- Phase I: Ramp-up. (1/18 - 1/22). Define the
problem, organize the members of the team, scope out the work, document the
existing system, develop a plan.
- Phase II: Coding and Testing. (1/25 - 4/16). Test
the system, find and fix bugs, implement desired functionality.
- Phase II: Wrap-up. (4/19 - 4/23). Update all
documentation, complete all activities.
For the project, students should:
- submit weekly logs of their work (in CVS)
- keep their group's task list up to date, submitting weekly
- modify 'change_log.txt' (in CVS) whenever a change is made to the code
that user may care about
- follow coding conventions (especially indentation)
Rootfly bugs and features can be found at
sourceforge
List of desired Rootfly features/bug fixes (somewhat out of date):
- Features:
- allow user to set default color, live/dead state for tracing new root.
- optimize sluggish performance: sluggish with 40+ sessions, 33 windows, and 36 tubes. click thumbnail, there is a delay in redrawing. cache for thumbnails to improve redraw speed.
ImageManager is incomplete. Need to implement real cache so that we
don't have to keep loading images from disk every time we change the
tube/window/session. Also, the current implementation of the class
copies the actual image data several times unnecessarily whenever
GetImageByOffset is called.
- slow 3x3 drawing on some machines.
- File.SaveAs does not display a default filename
- remember last TWS after exiting program; store in registry or file on disk
so that automatically navigates there
- 'move root' is missing from the menu / context menu; same for Add / Delete
Point
- context menu: is it possible to replace status.{live,dead} with a
single check box?
- more keyboard shortcuts
- incorporate SessionCollapser to skip empty sessions (in which no image exists)
- replace click, move, click with click-n-drag
- display zoom factor
- remove Debug item from main menu
- store experiment info (e.g., name of experiment) in resulting .csv file
- all images should be the same size (provide
warning if loading an image with different size);
See ApplicationData::ReloadImageBuffers -- question for user: What
should happen if images not all same size?
- quickjump button jumps to the next window, first session with no data
(like typewriter carriage return)
- button on each side of thumbnails allows user to quickly jump to first
session or last session
- autosave
- wraparound/panoramic camera
- slider for setting autodetect sensitivity
- Use dashed line to indicate the part of a root that is not in the primary
window
- Give user ability to cancel drawing of a new root.
- Pane display does not work properly
- Click on diameter to resize; should resize immediately rather than wait
for the 'mouse move' event
- Help file needs to indicate to user that 'copy single root' is an option
- Help file should tell user not to put too many tubes in one experiment, to
reduce sluggishness
- Copy session should check whether session is empty
- File.export may want to show the number of days that a root was a
particular color
- Display variable number of thumbnails along left / bottom as window is
resized
- Resize progress window
- for new roots, default color and condition code should be customizable
- Allow a way to delete all old session information, retaining only latest
session. This would help if the .rfy file grew too large. I.e.,
allow user to delete everything except for a particular session.
- Bugs:
- Open .rfy, image dir not right, user has to select new image dir, * should
display in title bar to indicate file change (used to work)
- Displays root data not only on image, but also to the right of image.
See C:\stb\cvs-local\class\rootfly\spring2010\developer\double-draw-bug (email
from Mary on 8/24/10)
- If .rfy file has tube "5", the program will convert it to "005" and get
confused. See
C:\stb\cvs-local\class\rootfly\spring2010\developer\mary-newbug-Sep01_2010
(email from Mary on 9/1/10)
- Progress window: scroll far to the right, then back to the left =>
the axis labels become incorrect
- Progress window: refreshing of axis labels is weird
- Progress window: gray out prev / next buttons
- When calibrating, user should not be able to draw outside image when
zoomed out
- Sometimes drawn roots show up in gray area at top or bottom of image (if
image sizes are not all the same)
-
If a root is moved so that it is
partially outside its session, the root ID and diameter may be cut off. They
should be moved so that they are always visible.
-
In 3x3 display, right-click does not display menu in correct location
-
In 3x3 display, right-click context menu; need to check whether
functionality works correctly
-
Somehow selected root can become deselected while still showing edit
boxes. (I have made this happen in 1.8.35k? by repeatedly pressing the
diameter spin control until an assert showed up because no root was selected.)
-
CopySession does not skip empty sessions
-
If you Copy... to a particular session, it should automatically set the
annotate flag for that session (or not). Tricky, b/c the right way to do
this is probably to set the flag as soon as any change has been made to any
root.
-
.sln file is out of date (.dsw is more recent)
-
CString::Format("%ws") causes three asserts to fire. Only occurs
when passing a command line parameter (e.g., testing the code or opening an
existing file)
-
Controller::C_SetFilename has these lines of code; doesn't seem like the
right solution:
// Fixes an error in which the save status of a file whose name has been
changed
// will not update save status until changed
C_SetModify(true);
- Internal refactoring:
- optimize redraw function
- ProgressData has a duplicate copy of whether image has been annotated;
really should only be in Tube; see OnCHECKDoneAnnotating
- remove old zoom in/out check buttons (but be careful b/c they may be still
being used in the code)
- develop documentation with Doxygen
- ImageScanned = ImageAnnotated
Instructor: Stan Birchfield, 207-A Riggs Hall, 656-5912, email: stb at clemson
Office hours: MWF afternoons, or by appointment
Grader: Vidya Murali, vmurali at clemson
Lectures: 2:30 - 3:20 MWF, 226 Riggs Hall