Internship Report: Rio Software, LLC
1.0 About Me, in Brief
![]() |
My name is Andrew C. Vogan. I am currently a computer science senior (fall 2002). But I am only starting my second year at JMU, since I transferred in from Blue Ridge Community College with half my BS degree already completed. That's a slight oversimplification, though: I came in with half the credits for my degree, but zero CS classes so far. So it has been an interesting few semesters getting started here, and finally having freedom to focus on my major coursework, with no troublesome gen.ed. classes getting in the way. |
While I did take my first college CS course last fall, I am not really new to programming. I have been programming seriously for about 10 years, and professionally for the last four years. Working my way through school has been strenuous sometimes, but also enjoyable overall, since I have remained employed in my field of interest. Primarily, I worked for a software company near Harrisonburg, helping with development of their Windows application suite for medical practices (we primarily used Microsoft Visual Basic).
In the CS transfer & freshman orientation class I took
last fall, I can remember Professor Lane repeatedly telling us,
"I would like for all of you to do internships. You will
benefit from it in many ways."
"I don't think so," I thought, "I already have a
job." But when financial difficulties forced my company's
owner suddenly to lay off all programming staff at the beginning
of this year, I remembered Professor Lane's advice, and decided
to seek an internship for the summer.
2.0 Getting the Job
2.1 How I advertised my availability.
My first step was to search the Internet for sites that had
internship listings. I found many good resources; but predictably
no opportunities in my local area. (I preferred working in
Harrisonburg to moving up to Northern Va. or elsewhere, so that I
could take an extra JMU class this summer.)
Next I paid a visit to Mr. Allen Berg, who assists the CS
department by helping to line up student internships. This past
spring, he would accept student resumes and forward them to
"partner sites" - companies that had registered
interest in getting interns from JMU.
But it wasn't quite that simple. When I first met with Mr. Berg,
he changed briefly into Col. Berg; and the first thing he did was
to take my resume and tear it to pieces, figuratively speaking!
In our meeting he assumed the perspective of a potential
employer, and pointed out everything in my resume that he saw as
unconvincing rhetoric, unclearly stated, or simply irrelevant
"fluff." When he was finished, I had in my notes a very
clear idea of what needed to be rewritten to provide my best
showing to employers. Let me emphasize that as long as Mr. Berg
continues to offer his excellent internship help to CS majors, I
recommend taking advantage of it.
Mr. Berg sent my finished resume off along with the others; but
it was simply a bad year for tech internships, and few companies
seemed to be hiring. As it turned out, I heard nothing back from
any JMU partner sites.
2.2 How I found out about job openings.
Mr. Berg's help was certainly invaluable for reworking my resume;
but the best option for pursuing internship opportunities lay in
taking initiative and pursuing possibilities as I came across
them. My primary source was the CSOfficial mailing list, which I
watched for any job listings.
There were a few disappointments. Once I politely declined an
interview, after finding that the company's business model was
based on some kind of pyramid scheme. No, thank you! You run into
all sorts of interesting situations when you're searching around
in the job market.
Finally a possibility came along that seemed better in many ways
that anything I had expected. It was advertised in the CS mailing
list. The job included programming in my favorite language (Borland Delphi); it was
located in the local area (Harrisonburg), and it offered a pay
range that didn't cause me to wince (based on the salary I had
drawn professionally). The position was working with Colin
Sarsfield, a programming consultant and owner of Rio Software, LLC. One
thing that caught my attention was that the job involved pair
programming, something I had read about from the XP (eXtreme
Programming) movement.
2.3 How I Landed the Internship
As soon as I found out about this position, I customized my
resume and cover letter for the job description, and sent them by
e-mail, as requested in the advertisement.
A day or so later, Colin called me up to arrange an interview.
Things were just a little bit crazy at the time, because it was
nearing the end of the spring semester, I was taking 20 credits,
and my time was at a premium. But I made sure to be fastidiously
organized and professional in my preparation, including
familiarizing myself with his web site, and making sure to bring
along any materials to the interview that might be useful to
reference, such as the internship syllabus, FAQ, and relevant
forms.
The interview went very well; I answered everything he asked as
well as I could, which included some questions to test my
technical knowledge. (I will probably do better on a few of them
after I take CS 352.) I think that the reason we
"clicked" in the interview was that I was able to
communicate my general enthusiasm for programming, and my
intention to stay in the field for the forseeable future. Another
thing that definitely helped was my existing familiarity with
Delphi, a benefit he hadn't really expected, since it is a
less-used language.
After a few weeks, he called and offered me the position. Since I
still hadn't seen anything that interested me nearly as much, I
accepted, and we agreed on a starting date.
If I did it all over again, one thing I would probably do
differently would be to give him a call to ask how things were
going, fairly soon after sending in my resume. Many employers
actually like to be bugged like that, because an applicant is
demonstrating that he is truly interested in the job.
3.0 About the Job
3.1 Employer
My employer is the owner of his company, and an independent
programming consultant (member of the ICCA). I work at the same
computer with him throughout the day, as I mentioned before.
Actually, pair programming is a major part of his reason Colin
decided to get an intern -- to help protect against RSI (Repetitive Strain Injury).
Because of Colin's existing problems with RSI, I generally get to
control the console.
We usually worked from nine to five, Monday through Friday;
though he was kind enough to let me adjust my hours and take a
class for part of the internship.
It might seem like working at the same computer as another
programmer would get old quickly; certainly I wondered how it
would turn out. But in my research on XP, supposedly the benefits
include improved task focus and discipline, reduction of the
defect injection rate, and better design. Whether having two
programmers at one machine is overall more efficient than having
them work independently, I still don't know. But I do know that
we have realized all of the benefits I named, to a level that has
been surprising to me. Anyway, I'm sold on it.
Now with that said, it definitely does make a difference who you
do pair programming with; but I will go on record by saying that
Colin is a genuinely nice guy, who has been more than willing to
discuss and debate issues related to development, and has been
quite patient with me as I've slowly built industry, code base,
and general CS knowledge.
Of course, I have had to be willing to adopt his coding and
documentation styles. One thing he noticed was that I am a little
bit, uh... hyphen-happy. I don't know why; I'm just a
hyphen-liker. Colin almost never uses hyphens. So you see that
even little things like that can potentially become an issue, if
two people are programming on the same computer all day. This
just underscores the importance of mutual courtesy and respect,
to create a productive work environment.
The hyphen example is a little trivial; but there are many of
Colin's standards, ranging from areas like identifier naming to
code structure. Becoming comfortable with these has been an
important part of getting up to speed for me. I often find that
as soon as my comprehension of a particular code base increases,
the logic of the associated standards also simultaneously becomes
clear. There is generally a rhyme and reason to Colin's
programming practices. And as I've assisted in extending his code
base, I have also helped in extending and documenting his
standards, which has been both enjoyable and educational.
3.2 Job Description
One of the benefits of pair programming for me has been that I
got on-the-job training, everyday. So I did not need a protracted
orientation period. Because Colin already knew what he was doing,
we were productive from the day we started. Granted, I did more
observing at first, and for a while it was more like taking
dictation than programming! But I started catching on, asking
questions, discussing implementation details, and finally
accepting often his challenge to proceed on my own on a project
with little direction beyond what I had learned already.
Here is a list of some of the main things I do in my job:
- Delphi OOD (object oriented design) and coding, in a pair
programming environment.
- User interface design and coding, typically generating the bulk
of UI elements on-the-fly from very concise and flexible code.
- Optimization, using a code-instrumenting profiler.
- Creation of automated unit tests (which have made our lives a
great deal easier).
- Documentation writing, in several formats and structures
including WinHelp.
- Automation of tasks by use of MAKE, batch files, and sometimes
our own command-line utilities (we both prefer the command line
to visual utilities, for the sake of easier automation).
- Use of the TextPad
programmer's editor to manipulate text in many ways using
hundreds of macros, regular expression search and replace, and
other features you won't find in Notepad.
- Use of WinCVS on a regular
basis to see which files in a particular application's directory
tree were modified, followed by a Diff and WinCVS check-in.
- Application setup packaging and deployment.
Here is a list of some of the major projects we have worked on
during the internship.
- Four different equipment rating/selection programs for HVAC
manufacturers.
- Many XP-style unit tests for key modules in the programs.
- Five different command line tools for process automation.
4.0 Typical Work Day
Because Colin and I currently are Rio Software, we get
to work on a wide variety of interesting tasks; but what follows
is fairly typical of our work.
On this day, I came in at 9:00 AM, my usual starting time. One of
us marked the time sheet with the current time, as well as our
initials to show that both of us were working, and the name of
the client company and specific project we would work on. All
these are important because Rio Software has multiple clients,
which are billed by the hour. Colin also uses this timesheet as
his record of my time.
Currently under construction was our unit ventilator selection
program. Our first order of business was to work through e-mail
correspondence from engineers at the manufacturer, to clear up
some discrepancies in their documentation.
Using the updated spreadsheets we had received, we were able to
update the data tables within the program, and came that much
closer to being able to present all unit ventilator options the
manufacturer offers in our program. In addition, we added new
rules to the selection process to ensure that only valid option
combinations could be chosen. It was a little tricky remembering
to update the new equipment options in every different place that
needed to reference them. At one point I was rapidly getting
confused by the rules logic we were implementing, when it
occurred to me that we had to put some of the same code in up to three
different places. So after some discussion and some thorough
code research, we integrated the two routines, so that pricing,
UI display, and output/report presentation code used the same
logic to determine option visibility. Ha! A victory for concise
coding, and a change to make our lives easier in the future.
We also slowed down at one point, and had a discussion on ways to
modify the user interface to provide friendly and instantaneous
context feedback to the user, and how the existing
object-oriented framework might lend itself to an elegant
implementation of in-program help and status information. The
object oriented design is so tight in this project, that many
things are possible; but you also don't want to go rushing into
changes that violate the "aesthetics".
We took an hour for lunch, after which we worked until around
5:00 (or thereabouts, as soon as we reached a logical
"stopping point".)
5.0 Relevance of CS Studies to Internship
The CS classes I had before the internship were CS 139, 239, 280,
345, and 348. Of these, I would rate 345 (Software Engineering),
the highest in terms of relevance to my job. In my years of
programming professionally, I have often seen the value of
keeping tight control over the development process, by means of
responsible practices such as task prioritizing; and by means of
tools such as version control systems. As an example, we use WinCVS as our source
code/version control system. We check our work in, not just
daily, but after every important change. And every time we check
a file in, we perform a "diff" on it first so that we
can (a) quickly inspect the changes, and (b) add a descriptive
comment about exactly what was changed to version control. Having
revision histories of every file has often been a great benefit
to us.
The other musing/advice I have for future CS interns is: Do not
underestimate the importance of a strong background in
mathematics. Do not underestimate the importance of wide and deep
exposure to algorithms. Do not underestimate the importance of a
working familiarity with logic and obscure Boolean constructions.
If you get a programming job that is any fun, you will end up
needing all of it.
6.0 Relevance of Internship to CS Studies
One thing I enjoy about working with Colin is that he is serious
about expanding his horizons as a computer scientist. As an
example, just the other day Colin and I were performing a test
run of an air conditioner unit selection application. Just
playing around, I repeatedly copied and pasted the contents of a
list display, making the list grow quickly to thousands of items
(each item in turn encapsulating thousands of different
attributes). The program slowed down to a painful crawl.
So we fired up our code profiler, and analyzed where the slowness
lay. As a result of this analysis, we ended up increasing the
efficiency of our sorting code, taking it from a simple quicksort
to a hybrid quicksort/insertion sort, as well as updating the
code behind our XML data conversion units. In all, our changes
provided a speed increase of well over an order of magnitude for
many operations.
This was just one example of how an everyday situation in my
internship was taken advantage of as an opportunity to expand my
knowledge and proficiency in programming. Rather than living with
a minimalist implementation, we researched ways to improve the
quality of our solution. One thing my boss repeatedly urges is,
"Don't program by accident!" Surely this is a major
goal of computer science - to find creative ways to go from
creating haphazard solutions to well-understood and
thoughtfully-designed ones.
Listing 1 -- cleanrtf.sed, a SED script we wrote to perform several "clean up" functions on our RTF WinHelp source. If you can understand this without reaching for a reference, you are more of a UNIX person than I am.
s/\\page$//g
s/[K$#]{[^}]*}//g
/[K$#]{[^}]*/{
$!N
s/[K$#]{\n\|[^}]*}//g
}
Listing 2 -- TC.dpr, the entry point for our Table Compiler command line utility, for flexible code generation from spreadsheets.
{
DESCRIPTION:
Parses the file name(s) of tabular source data for compilation as
described
in Compiler.pas.
COPYRIGHT:
Copyright 2002 Rio Software, LLC. All rights reserved.
HISTORY:
Created on 7/17/2002 by Colin Sarsfield & Andrew Vogan
}
program TC;
{$APPTYPE CONSOLE}
uses
..SysUtils,
..Compiler,
..RSLExcept in '..\RSLExcept.pas';
procedure Main;
var
..WaitForEnter: Boolean;
..i: Integer;
..TableFile: String;
..procedure DoWait;
..begin
....if WaitForEnter then begin
......WriteLn('Press ENTER to continue...');
......ReadLn;
....end;
..end;
begin
..WaitForEnter := False;
..WriteLn('Table Compiler 1.0 Copyright Rio
Software, LLC 2002');
..WriteLn;
..if ParamCount < 1 then begin
....WriteLn('Usage: TC [-w] file1 [file2 ...]');
....WriteLn;
.. .WriteLn('.. -w..
Wait for user to hit ENTER.');
....Halt(1);
..end;
..for i := 1 to ParamCount do
....if ParamStr(i) = '-w' then
......WaitForEnter := True
....else
......try
........TableFile := ParamStr(i);
........CompileTableFile(TableFile);
........WriteLn('Finished compiling: ' + TableFile);
......except
........on E: Exception do begin
..........WriteLn(E.Message);
..........DoWait;
..........Halt(2);
........end;
......end;
..DoWait;
end;
begin
..Main;
end.
Miscellaneous images selected from my daily programming at Rio Software.
A sample of Delphi's code explorer, currently
browsing
one unit within the highly object-oriented PEF Select product.

WinCVS, our source code/version control system.

MEC, the Dunham-Bush Malaysia Electronic Catalog
rating/selection application

PEF Select, the PEF Industries, Inc. rating/selection
application
TC, our Table Compiler command-line utility providing flexible
code generation options from spreadsheet sources.
