[comp.software-eng] Maintenance

travis@delta.eecs.nwu.edu (Travis Marlatte) (10/13/89)

I don't see the reasoning that novice programmers should be given the
task of maintaining existing systems. I also don't see the reasoning that
thou who creates it will maintain it even unto ball and chain.

Simple analogy: A team of crack engineers build a beautiful and structurally
sound bridge that serves its purpose well. Five years after construction,
it is learned that the foundation at one end is giving way due to water
damage. The company assigns its newest employee to the task of designing
the correction to the problem.

Sounds absurd to me! I would hope it sounds absurd to the rest of you too.
Isn't the analogy correct. Why would I want to assign inexperienced staff
to the task of shoring up existing systems? Especially, since we know that
mainenance is often a task of stretching the intent of the original design
to meet current expectations. Further, why would I want my newest employee
dedicated to mastering 5 year old technology?

Why does the idea of an apprentice not spring to mind quickly? Would it not
be better to have a junior programmer (or junior software engineer or
junior whatever) position? This position may very well get stuck with a
load of grunt work tasks. But, the work would ultimately be the
responsibility of a senior person who guides the work of the junior.

The work would then include a mix of maintencance and latest and greatest
design - whatever the senior staff was working on. By blending the work
of the past with the work of the new, the junior member gets an introductory
view of the whole picture. Technology transfer through sharing rather than
dumping - dumping unwanted, undesirable tasks on a new hire.

This type of idea can be taylored to each situation. A company developing
coin machines may have a six month apprentice program. A company developing
chemical process control might have a 5 year program.

I have a friend working as a actuary. For advancement, they have to take
a series of tests that may take up to ten years to complete. Their status
as an actuary depends on the level they have achieved in taking the tests.

While I don't think the software business is as structured as the insurance
business, my point is that a training program for newcomers should not be
shuned. It should not be embarassing to be considered a junior staff member.
Of course, there is cause to celebrate when that day comes that you are
no longer considered a junior.

By the way, my first job out of school was as a maintenance programmer
for control systems. I didn't mind doing it but it certainly was a waste
of time. Only by becoming involved in curent design effort does one come
to understand the task of doing current design.

Travis

phil@attctc.Dallas.TX.US (Phil Meyer) (10/14/89)

In article <1271@accuvax.nwu.edu> travis@delta.eecs.nwu.edu (Travis Marlatte) writes:
>
>Why does the idea of an apprentice not spring to mind quickly?

Travis has a good point here.  The analogy to a wizard's apprentice is even
better.  How do you become a wizard?  By studying with/for a wizard.
(or rather, what is the BEST way)

We must also cultivate a love of the craft.  This is the real difference
between being bored (in any position) and being happy with the workload.

Many really good programmers do it because they couldn't think of doing
anything else.  "Give me a workstation and a place to sit, and I'm happy." is
a common attitude among the wizards I have known.  The specific task, whether
it be maintainance or design, is seldom mentioned.  But rather, the usuall
conversations amongst these people lean towards new constructs, difficult
passages, tools, the latest and greatest hardware, etc. etc.

+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=+
| Honesty is in the eye of      |  Phil Meyer                               |
|   the creditor.               |  Usenet: <backbone>!attctc!lodestar!phil  |
|                               |  VoiceNet: (214) 991-0897                 |
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=+

itkin@mrspoc.Transact.COM (Steven M. List) (10/19/89)

travis@delta.eecs.nwu.edu (Travis Marlatte) writes:

>I don't see the reasoning that novice programmers should be given the
>task of maintaining existing systems. I also don't see the reasoning that
>thou who creates it will maintain it even unto ball and chain.

This seems awfully absolute.  I didn't hear anyone make either of these
statements as absolutes.  In fact, as regards the second statement, it
was specifically mentioned as an option.  There are MANY people who find
the option to have responsibility for and commitment to a project from
"womb to tomb" VERY attractive.  There are others (myself included) who
like to do a certain amount of work on a project and then move on to some-
thing else.  The threshhold varies, but the desire tends to be one for
change and variety.

>Simple analogy: A team of crack engineers build a beautiful and structurally
>sound bridge that serves its purpose well. Five years after construction,
>it is learned that the foundation at one end is giving way due to water
>damage. The company assigns its newest employee to the task of designing
>the correction to the problem.

I notice that Travis said "newest employee", not "novice engineer" or
"recent graduate."

>Sounds absurd to me! I would hope it sounds absurd to the rest of you too.
>Isn't the analogy correct. Why would I want to assign inexperienced staff
>to the task of shoring up existing systems? Especially, since we know that
>mainenance is often a task of stretching the intent of the original design
>to meet current expectations. Further, why would I want my newest employee
>dedicated to mastering 5 year old technology?

Sounds absurd to me too.  No one said that was the idea.  The idea is that
through working on fixing bugs (maybe major, maybe not), a new employee
(not necessarily junior, however!!!!) can learn the systems, the techniques,
and the standards and approach used by his/her new employer.  While we
tend to think of YOUNGER employees when we think of NEWER employees, this
is CLEARLY not the case.  When you change jobs, do you expect to walk into
your new job and immediately start designing their hottest project?  While
it does happen, it is the exception rather than the rule.  New employees
have to learn their way around; socially, organizationally, and
professionally.  In our profession, this is frequently accomplished by
putting the employee to work on low- to medium-priority maintenance
tasks.

> [ lots of interesting stuff about apprenticeship approaches ]

I agree that apprenticeship is a terrific way to progress.  Once again,
I must point out that NEW employee does not translate to RECENT GRADUATE
or YOUNG.  Put the issue in perspective.

>By the way, my first job out of school was as a maintenance programmer
>for control systems. I didn't mind doing it but it certainly was a waste
>of time. Only by becoming involved in curent design effort does one come
>to understand the task of doing current design.

"A waste of time."  Does this let everyone know what Travis thinks of
maintenance and programmers who DO maintenance?  Obviously what is
important and interesting to Travis is design and being in on the
ground floor of a project.  While that's true of many of us, we also
learn to appreciate the time we get to work on maintenance.  It can
be a wonderful break from the pressure and pace of being at the front
end.  Like doing gardening or cooking or folding laundry.  Like doing
manual labor after programming all day.  Change.

Nurture versatility and an appreciation for ALL aspects of your
profession, and you will BE a professional.
-- 
 +----------------------------------------------------------------------------+
 :                Steven List @ Transact Software, Inc. :^>~                  :
 :           Chairman, Unify User Group of Northern California                :
 :     {apple,coherent,limbo,mips,pyramid,ubvax}!itkin@guinan.Transact.COM    :

travis@delta.eecs.nwu.edu (Travis Marlatte) (10/19/89)

The discussion was kind of heading in the direction of using maintenance
as a training vehicle for new engineers. I think most of us agree that
this is wrong. Exposure only to maintenance is probably not the
way to bring a new programmer up to speed for design.

Whoops. There I said it again. The goal is create good designers. Somehow,
to be a good programmer, I believe one has to become a good designer. Even
in maintenance, and we all know I think that job is scum, good design
techniques are paramount to making sound revisions - whether defect fixes
or enhancements.

Contrary to my sarchastic comment above, I love maintenance. I have always
been one to enjoy tearing something apart, figuring out how it works, and
how to make it work better. I would think that most engineers have this
same attitude.

I do think that maintenance as a training vehicle is a waste of time. The
trainee learns nothing except how stupid past developers were. The company
may benefit from freeing up its more highly prized programmers but there
certainly is a cost of poorly done maintenance.

Actually, maintenance is an important part of new design as well. I can't
count how much time I've saved by striping a piece of code from a past
product and using it in a new design. Gosh - reusable software.

To reiterate my position - apprenticeships or something similar seem
like a pretty clean way of approaching training. Note that this does
address the new employee whether novice or experienced. Some formal program
to help the experienced programmer fit in with the company is just as
appropriate as a formal program to bring the novice up to speed.

A few comments on licensing: (are you out there Ms. Richards?) Licensing
does not prove competence or ability. It merely transfers liability. And
that usually doesn't work either. Licensing should mean nothing to a fellow
programmer (or engineer). It is only a stamp of approval from a publicly
recognized body and it is for the benefit of the public.

Licensing can only be used as a first defense against blithering idiots
passing themselves off as professional programmers. I am quite confident
that the programmers responsible for recent widely publicized software
failures were nothing but professionals and would have gained a license
if such were required.

Travis

rcd@ico.isc.com (Dick Dunn) (10/19/89)

Noted in passing in an article from itkin@mrspoc.Transact.COM (Steven M.
List):
> ...When you change jobs, do you expect to walk into
> your new job and immediately start designing their hottest project?  While
> it does happen, it is the exception rather than the rule...

Even more than the needs which List outlined (listed?:-) to get the new
employee oriented and familiar with what's going on, establish continuity,
etc., there's an important reason not to hire new employees and start them 
right off on a new project (or, especially, to staff up a new project with
all new people):  New projects are usually perceived as being more fun,
more rewarding, more relevant, etc.  What sort of a message does it send to
the employees who have been around for a while?!  "Oh...I see...I'd get a
new project if I were a new employee.  I know how to solve that!"  It's the
best way to start a process of flushing people through the company.
-- 
Dick Dunn     rcd@ico.isc.com    uucp: {ncar,nbires}!ico!rcd     (303)449-2870
   ...No DOS.  UNIX.

robert@isgtec.UUCP (Robert Osborne) (10/20/89)

In article <1337@accuvax.nwu.edu> travis@delta.eecs.nwu.edu (Travis Marlatte) writes:
>The discussion was kind of heading in the direction of using maintenance
>as a training vehicle for new engineers. I think most of us agree that
>this is wrong. Exposure only to maintenance is probably not the
>way to bring a new programmer up to speed for design.
I think a small bug or new piece of functionality is the best way to bring
somebody up to speed.  The new engineer MUST be guided by a
experienced engineer throughout this experience.  However, leaving somebody
in maintenence for a long time is probably a good way to kill morale and
enthusiasm.

>I do think that maintenance as a training vehicle is a waste of time. The
>trainee learns nothing except how stupid past developers were.
The key is to make the trainee *SEE* what bad design, habits, styles,
whatever do to a maintenance effort, and just what bad design etc. *IS*.
Of course if the trainee is modifying my stuff they get to see a great
implementation of a good design :-).

>Actually, maintenance is an important part of new design as well. I can't
>count how much time I've saved by striping a piece of code from a past
>product and using it in a new design. Gosh - reusable software.
Exactly, get them to explore the system and see what there is out
there for them to steel.

>A few comments on licensing: 
>[...] It merely transfers liability. [...]
>[...] It is only a stamp of approval from a publicly
>recognized body and it is for the benefit of the public.
It also gives you somebody to pin the blame on and to sue :-(.
Like an civil engineer (at least in Ontario) must stamp building plans,
and if it falls down they catch it (bad pun intended :-).
>
>Travis

Rob.
-- 
Robert A. Osborne                  ...uunet!mnetor!lsuc!isgtec!robert
(Nice sig Bruce mind if I steal it :-)    ...utzoo!lsuc!isgtec!robert
ISG Technologies Inc. 3030 Orlando Dr. Mississauga. Ont. Can. L4V 1S8

UH2@PSUVM.BITNET (Lee Sailer) (10/20/89)

One hears the phrase, "Maintenance through redesign."  The idea is that to
modify a program, one goes back to the analysis and design documents, e.g.,
Data Flow Diagrams, Logical Data Models, Structure Charts, or whatever and
makes the modifications there, moving step by step through the entire process
til the coding stage is reached.

On the other hand, to many practitioners, maintenance means jumping in and
hacking the code.

It seems to me that the first type of M-- would be very educational, and a good
way to bring a new hire up to speed on local customs, the nature of the
system, and so forth.

                     lee

runyan@hpirs.HP.COM (Mark Runyan) (10/25/89)

>/ travis@delta.eecs.nwu.edu (Travis Marlatte) /  6:32 pm  Oct 18, 1989 /
>The discussion was kind of heading in the direction of using maintenance
>as a training vehicle for new engineers. I think most of us agree that
>this is wrong. 

It is always embarrassing to find myself in the minority.  Still, I don't
agree that "this is wrong".

>Whoops. There I said it again. The goal is create good designers. Somehow,
>to be a good programmer, I believe one has to become a good designer. 

I agree with this.

>I do think that maintenance as a training vehicle is a waste of time. The
>trainee learns nothing except how stupid past developers were. The company
>may benefit from freeing up its more highly prized programmers but there
>certainly is a cost of poorly done maintenance.

The trainee learns by seeing "how stupid past developers were"!  The
trainee sees what was done, what is available, and why certain techiniques
applied in certain ways within the company either did or didn't work.
Sounds like great training to me!  As for "poorly done maintenance", the
supervisor *must* be aware that the trainee is learning and actually
supervise the trainee, otherwise the exercise *is* a waste of resources.

>Actually, maintenance is an important part of new design as well. I can't
>count how much time I've saved by striping a piece of code from a past
>product and using it in a new design. Gosh - reusable software.

Again, this gives the trainee the chance to see what is available for
stripping with the new company.

>To reiterate my position - apprenticeships or something similar seem
>like a pretty clean way of approaching training. Note that this does
>address the new employee whether novice or experienced. Some formal program
>to help the experienced programmer fit in with the company is just as
>appropriate as a formal program to bring the novice up to speed.

I agree with this position completely.  My take is that the maintenance
organization is probably a good place to start this apprenticeship.  Some
experienced programmers may already be informed and professional enough
to join initial design teams, but to lower the learning curve on what is
available in the company and what has or hasn't worked in the past, I
believe even experienced programmers should be started in maintenance.
Of course, this opinion is purely my own and I am *not* a manager or
supervisor.

Mark Runyan

dalamb@qucis.queensu.CA (David Lamb) (11/09/89)

Requiring students to do some form of maintenance as assignments has some
very good educational benefits.
	- It motivates a lot of the "readability" guidlines we give them
	  in a way that makes a lot more sense to students than just because
	  readability is part of the grading scheme
	- It motivates the need for design documentation to help students
	  understand large systems.
	- In anything in which it is possible to be literate, there exists
	  a "literature" with which one ought to be familiar.  Literacy in
	  programming should require students to be familiar with well-known
	  concepts; reading real (well-chosen) programs is a good way to do so.
Unfortunately it's difficult for faculty members to get credit for developing
such examples, or for spending the effort to find or tailor "real" ones that
match well with the desired educational objectives.

David Alex Lamb
Department of Computing and Information Science
Queen's University
Kingston, Ontario, Canada K7L 3N6
(613) 545-6067

ARPA Internet:	David.Lamb@cs.cmu.edu
		dalamb@qucis.queensu.ca
uucp:   	...!utzoo!utcsri!qucis!dalamb

richard@pantor.UUCP (Richard Sargent) (11/09/89)

Received: by pantor.UUCP (UUL1.3#5109)
	from becker with UUCP; Wed, 8 Nov 89 23:04:32 est
Path: becker!censor!utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!cs.utexas.edu!usc!snorkelwacker!spdcc!merk!alliant!linus!community-chest!mitchell
From: mitchell@community-chest.uucp (George Mitchell)
Newsgroups: comp.sw.components,comp.software-eng
Subject: Re: Maintenance
Message-ID: <78584@linus.UUCP>
Date: 7 Nov 89 20:02:20 GMT
References: <1337@accuvax.nwu.edu> <11064@cbnews.ATT.COM>
Sender: news@linus.UUCP
Reply-To: mitchell@community-chest.UUCP (George Mitchell)
Organization: MITRE-McLean Software Engineering Laboratory
Lines: 12

In article <11064@cbnews.ATT.COM> kww@cbnews.ATT.COM
(Kevin W. Wall,55212,cb,1B329,6148604775) writes:       `Just once I'd
`like to see a homework assignment in some CS course be something like
`
`	"add features X and Y to this 60,000 software system (which the
`	students have never seen before) and turn it in next week".

Would someone (or more) please address why this is not done.
--
/s/ George   vmail: 703/883-6029
email:  mitchell@community-chest.mitre.org    [alt: gmitchel@mitre.arpa]
snail:  GB Mitchell, MITRE, MS Z676, 7525 Colshire Dr, McLean, VA  22102

About a year ago, I read a paper in a periodical about a university
prof who did a teaching experiment on this. Unfortunately, I can't
find, nor recall, the periodical!

The work involved modifying a mail system. The gist of the article
was that the technique worked, but it is very difficult to
establish a suitable problem environment which fits the structure
and timing available in a university semester.

As for when this kind of teaching will be widespread, please
remember that *any* organization larger than, oh say, 10 people
is incapable of reacting very quickly to changes. The larger
the organization, the slower the reaction. A single university
is pretty large. The entire education system is very large.

It will come. In the meantime, there are education programs like
the one pioneered by the University of Waterloo, called co-operative
education. The premise is that students attend one semester of
classes, then work for one semester for a company whose business
is related to the student's field of study, and repeat for a total
span of 5 years instead of 4 to cover a 4 year degree program.

The result? Graduates who don't suffer from "ivory-tower-itis",
who have almost 2 years relevant work experience in their chosen
profession, and who are not in debt to their eyeballs, and whose
parents can afford to send their second born to university, too.

These co-op programs are becoming very widespread. Waterloo was
founded as an engineering school in 1957 and started co-op
studies immediately upon founding. Now it is regarded as one of
the foremost schools for computer science in North America.

I guess it is also fair to say that detractors claim the co-op
program breeds yuppies, that the students have no sense of fun,
and on and on. Needless to say, I disagree completely.


Richard Sargent                   Internet: richard@pantor.UUCP
Systems Analyst                   UUCP:     uunet!pantor!richard

murphyn@cell.mot.COM (Neal P. Murphy) (11/09/89)

In article <78584@linus.UUCP> mitchell@community-chest.UUCP (George Mitchell) writes:
>In article <11064@cbnews.ATT.COM> kww@cbnews.ATT.COM
>(Kevin W. Wall,55212,cb,1B329,6148604775) writes:       `Just once I'd
>`like to see a homework assignment in some CS course be something like
>`	"add features X and Y to this 60,000 software system (which the
>`	students have never seen before) and turn it in next week".
>
>Would someone (or more) please address why this is not done.


There is a very good reason this is not done.  Could you add a manual choke
cable to your car's engine?  (Assuming it has a carb, not fuel injection.)
Could you install, to code requirements, a 20A electrical circuit to your house?
Could you ski Tuckerman Ravine from above the Lip to the bottom of the Headwall?
(Tuckerman is on Mt.  Washington, NH) If you can, great!  But think of the
millions of people who break into a sweat if they have to open the hood of their
car, replace a fuse in their fusebox, or walk to the corner store after a 4 inch
snowfall.  It wouldn't be fair to expect any of these people to perform the
specialized tasks I mentioned above, because they have barely mastered the
basics.

Students are in a similar position.  While they have may have solidly mastered
the basics, they have yet to learn how to make a good, fine, large software
system.  They couldn't possibly learn enough about the system to be modified to
properly make the changes.  I've been in this field for 10 years, and *I've*
just spent a month and a half reading 500 pages of source code and 500 pages of
documentation just to add features X and Y to a product here at Motorola.  I am
now at the point where I can make those changes. Students must learn how to make
a good product first. Once they have mastered that, then they can learn how to
enhance existing products. But by the time they get to that point, they have
already graduated and are in industry.

BTW, I've added manual chokes to several cars, I've wired in several circuits
(to code), and I fell off the lip at Tuckerman while hiking last April.  I'll
ski it the next time.  And, due to the good grace of cabinet maker, back in
Massachusetts, who gave me a chance and was willing to teach me, I am also a
cabinet maker. (No boast, just fact.) All that and a BSCS to boot.

NPN

amull@Morgan.COM (Andrew P. Mullhaupt) (11/09/89)

In article <78584@linus.UUCP>, mitchell@community-chest.uucp (George Mitchell) writes:
> In article <11064@cbnews.ATT.COM> kww@cbnews.ATT.COM
> (Kevin W. Wall,55212,cb,1B329,6148604775) writes:       `Just once I'd
> `like to see a homework assignment in some CS course be something like
> `
> `	"add features X and Y to this 60,000 software system (which the
> `	students have never seen before) and turn it in next week".
> 
> Would someone (or more) please address why this is not done.
> --

There are a few important reasons why this is not done often in CS courses.

1. The proper subject material for routine courses must be in some sense
widely received and well-understood material. It is not a good idea to 
give an assignment like this unless you can really treat the issues that may
come up.

The methods that are being developed for dealing with this problem seem to
me controversial. From an academic point of view, one may very well argue
that the 60,000 line system can either be treated in a localized, (i.e.
weakly interacting pieces much less than 60,000 lines long) manner. If this
is not the case, then one can argue that the system is much more seriously
flawed than lacking features 'X and Y'.

One might also encounter the belief that if features 'X' and 'Y' are not
easily implemented and it's hard to figure out what the 60,000 lines of
code really do (in detail) then it may not be safe or acceptable to add 
'X' and 'Y'. 

It will not satisfy the students to tell them that the real world is like
this, and they will have to do sub-sensible compromises as professionals.
You will have to (if you are an intellectually honest professor) arrive
at a good example of a 60,000 line piece of code, not fatally flawed from
the start, and desirable missing features 'X' and 'Y'. Whitewashing the
unretouched output of some code generator generator is not likely to teach
your students very much other than this type of work should be avoided.


2. The project may not fall within the grasp of even good undergraduate
students. Their curriculum needs to treat other important issues first,
such as basic programming, fundamental algorithms, data structures, 
formal languages, operating systems, computer architecture, compilers and
interpreters, and principles of software design (including ideas of 
correctness, performance, and specification). It is not clear to me that 
you can expect two full semesters in each of these, and I don't think
there is room for the large-scale maintenance problem in the first semester
of any of them. So perhaps this is for graduate students.

3. As for graduate school, you might give such an assignment, but in the
universities where I have been a professor (University of New Mexico,
State University of New York at Buffalo), students were acquiring enough
experience not to need this assignment or they were hopeless enough not to
profit by it. The people in my experience who had the greatest difficulty
dealing with large scale assignments were the people who worked full time
as systems programmers at the computer center: their problem was often that
they knew how much sleaze was out there 'in the real world' and they were
trying to get away with a widespread but unacceptable practice where a well
founded solution was equally near at hand. 90% of the code in the world is
written by people not fit to teach the language they code in, especially at
the graduate level, which means that often the only lesson reliably drawn
from real world code is how much computer science has advanced since the 
authors of the real world code were educated.

4. The 60,000 line program is likely to seem to graduate students like a
program they are developing/maintaining for the benefit of the professor
if the program is real. There have often been cases where a graduate
computer science department has arrived at a large scale piece of software
as the result of countless hours of graduate labor. In order for this to
be a fair arrangement, the software work should be paid for, perhaps in 
terms of a research assistantship or stipend, which is not generally
available to all students. Then the students who have not been awarded
support should not be required to contribute work to such projects, and
yet they should not be excluded from any courses simply because they are
not supported. Thus the large scale program maintenance should not be in a
course. It is likely that those students interested in software maintenance
will seek to work for a professor who will provide them with this kind of
experience, so although this kind of work belongs outside a course, it
is often found in a serious computer science department.


Later,
Andrew Mullhaupt

P. S. I was a professor of applied mathematics, with a large amount of my
work in computation, but I still count my code in the 90% written by 
non-experts in the language because I am required (by the circumstances of
my present employment) to write code in APL, a language I am philosophically
opposed to. I don't think my code is bad, but you would learn a somewhat
idiosyncratic style of APL if you read mine.

peterd@cs.washington.edu (Peter C. Damron) (11/10/89)

In article <78584@linus.UUCP> mitchell@community-chest.UUCP (George Mitchell) writes:
>In article <11064@cbnews.ATT.COM> kww@cbnews.ATT.COM
>(Kevin W. Wall,55212,cb,1B329,6148604775) writes:       `Just once I'd
>`like to see a homework assignment in some CS course be something like
>`
>`	"add features X and Y to this 60,000 software system (which the
>`	students have never seen before) and turn it in next week".
>
>Would someone (or more) please address why this is not done.

It is done here at Univ. of Washington.  The students in the undergraduate
compiler class are given a working compiler and add features to it.
Of course, the compiler they are given is only about 50-70 pages of code
and is well modularized, so it is a managable size to learn in a couple weeks.

Just thought you'd like to know,
Peter.

---------------
Peter C. Damron
Dept. of Computer Science, FR-35
University of Washington
Seattle, WA  98195

peterd@cs.washington.edu
{ucbvax,decvax,etc.}!uw-beaver!uw-june!peterd

jrj1047@ultb.UUCP (J.R. Jarrett) (11/10/89)

In article <295@qusuntrc.queensu.CA> dalamb@qucis.queensu.CA (David Lamb) writes:
>Unfortunately it's difficult for faculty members to get credit for developing
>such examples, or for spending the effort to find or tailor "real" ones that
>match well with the desired educational objectives.

Plus, industry is VERY touchy about allowing their code (even their bad
code) out for fear that they will be giving up some "proprietary
secret".  There's only so many ways you can calculate pay......
-- 
+-------------------------------------------------------+
| Jim Jarrett, Rochester Institute of Technology        |
|  (716) 271-7019  jrj1047@ultb.isc.rit.edu             |
+----------------  rutgers!rochester!ritcv!ultb!jrj1047 +

mherman@alias.UUCP (Michael Herman) (11/12/89)

> now at the point where I can make those changes. Students must learn how to make
> a good product first. Once they have mastered that, then they can learn how to
> enhance existing products. But by the time they get to that point, they have
> already graduated and are in industry.

I would wager that most car machanics have never seen an assembly line
yet they still are very effective in what they do.  I would also wager
that software maintainers don't have to be great developers.

p.s. Let's avoid the discussion that mechanics would be better if they
     had worked on an assembly line.  Its true.  In the same light,
     a software maintainer would be better if they had development
     experience.  My contention is that neither are strictly necessary.

mitchell@community-chest.uucp (George Mitchell) (11/13/89)

In article <376@cherry5.UUCP> murphyn@cell.mot.COM (Neal P. Murphy) wrote:
`
`Students are in a similar position.  While they have may have solidly mastered
`the basics, they have yet to learn how to make a good, fine, large software
`system.  They couldn't possibly learn enough about the system to be modified
`to properly make the changes.  I've been in this field for 10 years, and
`*I've* just spent a month and a half reading 500 pages of source code and 500
`pages of documentation just to add features X and Y to a product here at
`Motorola.  I am now at the point where I can make those changes. Students
`must learn how to make a good product first. Once they have mastered that,
`then they can learn how to enhance existing products. But by the time they
`get to that point, they have already graduated and are in industry.
`
This appears to address the quantitative rather than the qualitative
issue.  Certainly the size and difficulty of an assignment must be
appropriate for the level and scope of the course.  However, it is not
apparent (to me) why writing code "from scratch" is superior to
modifying code (good and bad) as a method for learning "how to make a
good product".  Indeed, it has been easier for me to learn both methods
and languages when significant portions of code were available as
examples.
--
/s/ George   vmail: 703/883-6029
email:  mitchell@community-chest.mitre.org    [alt: gmitchel@mitre.arpa]
snail:  GB Mitchell, MITRE, MS Z676, 7525 Colshire Dr, McLean, VA  22102

mcilree@mrsvr.UUCP (Robert McIlree) (11/14/89)

From article <614@alias.UUCP>, by mherman@alias.UUCP (Michael Herman):
>> now at the point where I can make those changes. Students must learn how to make
>> a good product first. Once they have mastered that, then they can learn how to
>> enhance existing products. But by the time they get to that point, they have
>> already graduated and are in industry.
> 
> I would wager that most car machanics have never seen an assembly line
> yet they still are very effective in what they do.  I would also wager
> that software maintainers don't have to be great developers.
> 
> p.s. Let's avoid the discussion that mechanics would be better if they
>      had worked on an assembly line.  Its true.  In the same light,
>      a software maintainer would be better if they had development
>      experience.  My contention is that neither are strictly necessary.

Considering that a great deal of the entry-level people (including me
when I started out 7 years ago) begin their careers performing
maintenance and/or contributing to new versions of existing systems,
I concur that one doesn't need development experience to perform
enhancements. In fact, stints as a maintainer/integrator have
some benefits when it comes time to do a brand-new project. For
example, the software being maintained might be: a) horribly designed
or patched so many times that it isn't obvious what the design intent
was, poor documentation, etc. This imparts to the entry-level maintiner
some lessons in how *not* to design software; b) wonderfully thought-out
and designed, coded to-spec, easy to understand. This case, which is
preferable, teaches the greenhorn how good systems are developed and,
by its very example, imparts good design habits.
Case b) is a great exercise prior to starting a new project, and I
recommend it to anyone starting out in this business as the first
assignment. I've seen plenty of people fresh out of school thrown into
critical paths of a new design and fail to deliver either quality
work or work by deadline. And it was not really 100% their fault, given
their lack of experience. What might have worked instead would be a
role on an on-going project, where examples (good and bad) can be
assimilated and learned from, and contributions to the project come
a little faster than on brand-new projects.

Finally, how many of you out there in the commercial world always
work on new, start-completely-from-scratch, projects? I, in 7
years, have worked on 2 of this type (out of over 15 total). The
rest were either extensions to existing systems, integration work,
or derivatives of existing systems converted to different applications
(reuse). Thus, the ability to read and comprehend anothers code is
critical, and should really come first before trying a start-from-
scratch project.

Bob McIlree

jharkins@sagpd1.UUCP (Jim Harkins) (11/14/89)

In article <78584@linus.UUCP> mitchell@community-chest.UUCP (George Mitchell) writes:
>In article <11064@cbnews.ATT.COM> kww@cbnews.ATT.COM
>(Kevin W. Wall,55212,cb,1B329,6148604775) writes:       `Just once I'd
>`like to see a homework assignment in some CS course be something like
>`
>`	"add features X and Y to this 60,000 software system (which the
>`	students have never seen before) and turn it in next week".
>
>Would someone (or more) please address why this is not done.

Because the first thing the students would do is print out the entire source
and the university doesn't want to spend $30 for paper and $15 for a printer
ribbon.  I'm not kidding, I try to always have up-to-date source listings
in notebooks for whatever I'm working on, it makes life much easier. 
Not to mention the disk space required to hold x copies of the source
(you expect students to use links?), and CPU time required to compile all
those changes.

Not that it isn't a good idea, I think it's a great idea.  But not practical
for universities as they are currently set up.  Hell, the UNIX system I have
to use at school now doesn't even have a debugger (the vender never got around
to porting it before going toes up) so how would you debug it?

jim
"Wolverine -- sex and violence without the sex"

rsd@sei.cmu.edu (Richard S D'Ippolito) (11/14/89)

In article <614@alias.UUCP> mherman@alias.UUCP (Michael Herman) writes:

>I would wager that most car machanics have never seen an assembly line
>yet they still are very effective in what they do.  I would also wager
>that software maintainers don't have to be great developers.
>
>p.s. Let's avoid the discussion that mechanics would be better if they
>     had worked on an assembly line.  Its true.  In the same light,
>     a software maintainer would be better if they had development
>     experience.  My contention is that neither are strictly necessary.

Even under your restrictions, what you have stated is quite untrue for a
very large class of systems.  In these MCCR systems, most of the
'maintenance' effort is devoted to enhancing these long-lived systems, not
in removing design or production errors or in restoring the product to its
original performance.


Rich
-- 
We use kill ratios to measure how the war is going.
We use SLOC ratios to measure how our software is coming.
(Idea from Gary Seath)                                        rsd@sei.cmu.edu
-----------------------------------------------------------------------------

perry@apollo.HP.COM (Jim Perry) (11/14/89)

In article <376@cherry5.UUCP> murphyn@cell.mot.COM (Neal P. Murphy) writes:
Various real-world analogies such as:
> Could you add a manual choke cable to your car's engine?

I don't follow the basic analogy -- are you postulating a class of people
who are sufficiently trained in automotive engineering to design an engine,
but not sufficiently trained to install a choke cable in one?

>Students are in a similar position.  While they have may have solidly mastered
>the basics, they have yet to learn how to make a good, fine, large software
>system.  They couldn't possibly learn enough about the system to be modified to
>properly make the changes.  I've been in this field for 10 years, and *I've*
>just spent a month and a half reading 500 pages of source code and 500 pages of
>documentation just to add features X and Y to a product here at Motorola.  I am
>now at the point where I can make those changes. Students must learn how to make
>a good product first. Once they have mastered that, then they can learn how to
>enhance existing products. But by the time they get to that point, they have
>already graduated and are in industry.

I must disagree with some of the assumptions here.  I believe that if the 
software in question is correctly engineered, then a competent student with
a solid mastery of the basics should be able to perform simple maintenance
on that system.  This assumes, by the way, that "the basics" includes some
knowledge of what constitutes "correct engineering".  Unfortunately, this is
not the case, and I've seen very few real-world systems that are in fact
engineered to such a standard.  Within that constraint, I'll agree that
making significant changes to a system that is inadequately documented,
not clearly structured, etc. can stretch the abilities of the most capable 
programmer.  Without any knowledge of the system you are dealing with or
the complexity of "X and Y", I'll venture to state that there are things
the previous writers/maintainers of the system could have done that would
have made it easier, probably significantly easier, for you to make your 
changes.

Students can't learn to make a good product if they don't know what one is.
A major component of what makes a product good is its maintainability.  To
be able to write a program that does what it is intended to do, and do it
well (by whatever metric) is important, but it is also important that others
be able to easily alter it later.  There is generally some perception that
this is desirable, but without hands-on experience maintaining other people's
code, things like commenting, roadmaps, design documentation, and the like
are just rules to be followed (and, like as not, dropped as soon as they're
not being graded on).

This doesn't address the problem of coming up with example systems to make
these maintenance assignments on, I admit that's tough.  Of course ideally
there would be two versions of the assignment: the first time, making a minor 
change on a typical (i.e. not bad or buggy, just not engineered for continuing
maintenance) system, the next assignment to make a change of a similar 
magnitude to a fully-engineered, well-documented system.  [In my day, before
the goto wars had been fought and won, there was typically an assignment 
early on to make some change to (or just decipher) a "spaghetti-code" program,
contrasted with the "structured" version; this is a similar exercise at the
software engineering level].

One possibility that seems somewhat promising: in a class which has a longterm
ongoing project (a compiler, perhaps), have students swap off source code at
each iteration, so each increment of change is to someone else's code.  It
would be best if the project were such that considerable variation in design
and structure were possible, so that your predecessor's code might not be 
structured just like yours.  Needs some development, and I should get back to
work...
-
Jim Perry   perry@apollo.com    HP/Apollo, Chelmsford MA
This particularly rapid unintelligible patter 
isn't generally heard and if it is it doesn't matter.

paulb@minster.york.ac.uk (11/15/89)

In article <78584@linus.UUCP> you write:
>In article <11064@cbnews.ATT.COM> kww@cbnews.ATT.COM
>(Kevin W. Wall,55212,cb,1B329,6148604775) writes:       `Just once I'd
>`like to see a homework assignment in some CS course be something like
>`
>`	"add features X and Y to this 60,000 software system (which the
>`	students have never seen before) and turn it in next week".
>
>Would someone (or more) please address why this is not done.

I can't speak for American universities (or even British universities in
general), but at Durham, we are given problems of the type above.  In my
year there was a software maintenance workshop in which students had to
both debug and add functionality to a full size compiler.  If it's not
done elsewhere, it should be.

Paul Butcher
JANET:paulb@uk.ac.york.minster

mjl@cs.rit.edu (11/15/89)

perry@apollo.HP.COM (Jim Perry) writes:
>
>Students can't learn to make a good product if they don't know what one is.

Excellent point!  And, of course, most introductory textbooks do not
give particularly good examples.  Not because the authors are necessarily
bad designers, but because the constraints of teaching a 1st year student
Pascal/Modula/whatever mean that the programs emphasize micro-concepts
(this is an IF, this is a WHILE, etc.).  The commenting strategies also
reflect these realities -- anyone who really wrote comments the way
textbooks show them should be shot.  for an excellent discussion of
these issues, see Henry Ledgards "Professional Software" books (Vol. I
on Software Engineering and Vol. 2 on Programming Practice.  Vol. 2
has a chapter titled "Comments: The Reader's Bridge," and while I disagree
with some of Ledgard's specific examples, I do like his overall philosophy
of appropriate internal documentation.

So perhaps in 2nd level courses the professors should make available
programs they consider well-written.  In fact, I'm teaching a sophomore
course on design and implementation, and students have asked to see *my*
solution to some of the assignments I've given (and yes, I *do* solve
most of the problems, something that I find all too rare).  The problem
for me is that it is difficult to come up with assignments
at this level, and I know that my solution would immediately find its
way into every fraternity's archives (1/2 :-)), rendering it useless
in the future.

>One possibility that seems somewhat promising: in a class which has a longterm
>ongoing project (a compiler, perhaps), have students swap off source code at
>each iteration, so each increment of change is to someone else's code.

I've tried this one, and I've been disappointed.  Roughly speaking there
are two types of students: those who have good designs (class G) and
those who have bad designs (class B).  Let's look at the possibilities
at iteration 2:

For students in class G, no further motivation to do a good job is necessary.
No matter what they get, their predisposition to doing a good job will
be reinforced.  However, if given a bad product from stage one, they
feel they are penalized (and given the short time spans for projects in
a quarter or semester, they are right).  The general reaction is "I did
a good job, why do I have to work with this crap!"  Those who can recover
often end up doing two iterations: a rewrite of iteration 1 and whatever
is required for iteration 2.

Now consider students in class B.  If given a good design from iteration
one, they have a better shot at completing iteration 2, but the question
remains whether they learned anything about their own substandard performance.
In effect, this subidizes their poor work (we call it "hiding in the high
grass" around here).  On the other hand, if they are given a poor design,
their demonstrably modest skills means they have a small chance of completing
interation 2 on time.

If I truly believed that all students in class B were inherently incapable
of becoming productive, competent professionals, then the scenario above
wouldn't bother me -- the good would pass, and the poor would fail.  And
no doubt many of those in class B shouldn't enter our profession, either
because they lack the discipline or particular talents needed to succeed.
But in my experience, there is a substantial subset of class B who just
haven't caught on yet, and I don't want to flush them out.

One approach I haven't tried is a "bidding" approach, where everyone's
product from stage one is made available to the class. A small portion
of the grade for iteration 2 would be tied to the number of people
in the class who chose *your* solution as the basis for the next step.
In this way, everyone sees a variety of designs, they get to choose
the one they'll use next time, and the "recoverable" B students would
choose someone else's G work simply to save their own necks.

Has anyone tried something like this?

Mike Lutz
Mike Lutz	Rochester Institute of Technology, Rochester NY
UUCP:		{rutgers,cornell}!rochester!rit!mjl
INTERNET:	mjlics@ultb.isc.rit.edu