MDAY@XX.LCS.MIT.EDU (Moderator, Mark S. Day) (01/21/88)
Soft-Eng Digest Thu, 21 Jan 88 Volume 4 : Issue 4 Today's Topics: Coordinating Software Development (2 msgs) ---------------------------------------------------------------------- Date: 11 Jan 88 17:06:59 GMT From: mcvax!ukc!stl!stc!datlog!dlhpedg!cl@uunet.uu.net (Charles Lambert) Subject: Coordinating Software Development [ This is a reposting of an article I first posted two months ago. Two correspondents finally got through to me to say my reply path was garbage. ] We have been developing tools and procedures (for use within our organisation) to control those periods of intense development when many people are working on a product at once, several of them perhaps altering the same source file concurrently for different reasons. Now I have to produce documents and I need good terms to make the concepts clear and easy to discuss. The vocabulary that has grown up around the prototype is rather inconsistent and misleading. In my experience, well chosen terms improve people's comprehension of a system dramatically, while fuzzy ones litter the mind with misconceptions. So I hope that some of the technically literate out there will help me. Let me outline what we have and ask anyone with constructive suggestions to mail them to me. ORGANISATION ------------ Partition --------- The development community is divided into teams, each working on some functional aspect of the same product. There's the first slippery term: "product". It can mean either the final absolute object, or that object and all the components (e.g. source files) from which it is built. There is a hierarchy (tree, structure) of directories that will contain this product (i.e. all the components and the final object). There is one public copy of the above hierarchy that is fully populated; it contains a copy of every component, each one being the correct version to build the latest stable version of the product. Each development team has a private instance of the directory hierarchy in which they keep copies of the components they have altered. They do not keep copies of components they have not altered; the building tool is capable of finding those in the public copy. The private instance is said to be sparsely populated. Here we need a term for an instance of the directory hierarchy, so that we can talk about "our ***," "your ****," or "the public ***". At the moment, we call it a "build", after the mechanical engineering term referring to a schedule of components. This is a bad term because i) it is a verb doing service for a noun, ii) we need the verb anyway ("which build did you build?"), iii) it is not evocative - it doesn't portray what it means. Association ----------- Now an extra degree of complexity. Besides the public "build" and the "builds" assigned to each functional task, a group of teams may share an intermediate "build" where they deposit finished work that they all want to incorporate, but is not for general release yet. So, when one of the teams builds the product, the building tool must search a vector of "builds" starting with the team's private one, then the shared one and finally the public one. We have called this vector a "view" (with acknowledgements to Erickson and Pellegrin of Bell Labs [1]). Some of our developers have taken to referring to a "build" as a "view" because: i) the view is an invariant attribute of the "build" - in our system, once you have declared the antecedence of the version you're working on you stay with it; ii) it rather neatly describes what a "build" is for - it is a place from which you get an alternative view of the product. However, we need separate terms to differentiate between an individual "build" and the ordered summation of several "builds"; I think "view" serves the latter purpose best. [By the way: we rejected the term "node", as an alternative to "build", because of its strong association with network topology and hence with communications] You will see that "views" converge from team "builds" through shared "builds" to the public "build". We might use the term "branch" instead of "build", but we would risk confusion with the terminology of the Source Code Control System that maintains a history of changes for each source file. OPERATIONS ---------- Distribution ------------ When a development team needs to alter a component, they take a copy from the first "build" in the view that contains a version of that component; it may be copied from a shared "build" if a cooperating team has already altered it, or it may be copied from the public build. After they have started work on their copy, someone may alter the version from which they started - their "antecedent" version. Eventually, the team must combine that alteration with their own so that a unified version of the file can be deposited in the shared or public "build". We have called this operation "reconciliation"; clumsy - any offers? Integration ----------- When a team completes a functional development, it deposits the completed work further down the view, where cooperating teams will see it. This may involve combining their new version of a component with another version that is already there. This is called "integration". It may appear to be the same as reconciliation but there is an important distinction: "reconciliation" takes place in the reconciler's "build" - several "builds" may be "reconciled" with changes that have gone into a shared one but the reconciled versions remain private and different from one another; "integration" takes place further down the integrator's view where it come within other views (and may cause other "builds" to need reconciliation). REFERENCES ---------- [1] "Build - A Software Construction Tool" V. B. Erickson and J. F. Pellegrin; AT&T Bell Laboratories Technical Journal, Vol. 63 No. 6 (July-August 1984) pp. 1049-1059 ----------------------------------------------------------------------------- I will be glad to receive any pertinent criticism of the style, terminology or clarity of the above. Charles Lambert; cl@datlog.co.uk ------------------------------ Date: 18 Jan 88 05:18:15 GMT From: tektronix!orca!stank@ucbvax.Berkeley.EDU (Stan Kalinowski) Subject: Coordinating Software Development Let me start off by making an observation. One can tell that the science of software engineering is still in its infancy. It seems that as much time is spent defining new software engineering terms for existing concepts as is spent on solving the engineering problems. Why not use the existing software engineering terms? Perhaps I'm overly critical, but it seems that every new researcher sees the field of software engineering as an opportunity and tries to glean a bit of immortality by being the first to coin the term (substitute your favorite buzzword here). I find it difficult to believe that so many people are simply unaware that terms already exist to describe most software activities. By the way Mr. Lambert, I'm not necessarily picking on you personally, but hoo-boy, you scored a direct hit on one of my hot buttons! Now that I have dispensed with the knee-jerk reaction, perhaps it was just a jerk reaction :-), let me describe the jargon my working group would use for what you describe, perhaps it will help. In article <368@dlhpedg.co.uk> cl@datlog.co.uk (Charles Lambert) writes: . . (text was trimmed and refilled for brevity but it's still long.) . >We have been developing tools and procedures (for use within our >organisation) to control those periods of intense development when >many people are working on a product at once, several of them >perhaps altering the same source file concurrently for different >reasons. Now I have to produce documents and I need good terms to >make the concepts clear and easy to discuss. The vocabulary that >has grown up around the prototype is rather inconsistent and >misleading. In my experience, well chosen terms improve people's >comprehension of a system dramatically, while fuzzy ones litter the >mind with misconceptions. So I hope that some of the technically >literate out there will help me. It sounds like you are attempting to describe your "development control" scheme to people that are not familiar with software jargon. I think that inventing new terms would probably compound your problem. I think it would be better to explain the existing terminology rather than create an additional learning barrier. Even if your audience is familiar with the commonly used software nomenclature, it probably wouldn't hurt to define your terms in an appendix. (I think new terms are invented by people too lazy to learn how to use the existing ones, probably a fallout of the "software cannot be re-used mentality", but that's just my opinion.) >The development community is divided into teams, each working on >some functional aspect of the same product. There's the first >slippery term: "product". It can mean either the final absolute >object, or that object and all the components (e.g. source files) >from which it is built. Around here, we call the thing we sell to customers a "product" and the stuff that engineers produce is called software. If we want to distinguish software that is used in our "product" as opposed to software tools, we use the phrase "product software". >There is a hierarchy (tree, structure) of directories that will >contain this product (i.e. all the components and the final object). We call that a "build tree" or, more specifically, a "build directory-tree". (I don't know if Merriam Webster would approve of using dual attributive nouns like "build directory", but what-the-heck, it works.) >There is one public copy of the above hierarchy that is fully >populated; it contains a copy of every component, each one being the >correct version to build the latest stable version of the product. We would call that the "release" source directory. >Each development team has a private instance of the directory >hierarchy in which they keep copies of the components they have >altered. They do not keep copies of components they have not >altered; the building tool is capable of finding those in the public >copy. The private instance is said to be sparsely populated. We call the private instances "private build-trees" or "experimental build-trees". >Here we need a term for an instance of the directory hierarchy, so >that we can talk about "our ***," "your ****," or "the public ***". >At the moment, we call it a "build", after the mechanical >engineering term referring to a schedule of components. This is a >bad term because > >i) it is a verb doing service for a noun, >ii) we need the verb anyway ("which build did you build?"), >iii) it is not evocative - it doesn't portray what it means. I can see where the confusion could arise. We also use the term "build" to refer to the compiled/assembled/linked system, but we call the "schedule of materials" a "bill of materials" or, more briefly, "BOM". This expression comes from manufacturing terminology. To me, it evokes the image of software modules specified in the BOM being pulled together on an assembly line, to create a given "build" of the product. We do not think of the directory tree itself as being the bill of materials, we maintain a separate file that lists what's in the build. The term "build" is used often around here and people seem to have no trouble gathering the meaning from the context in which its used. I avoid cases like number ii) above, I would probably be more specific and say "Which configuration did you make?" When I what to know what sources or compilation switches were used in the build, people usually respond with a product codename as an answer. >Now an extra degree of complexity. Besides the public "build" and >the "builds" assigned to each functional task, a group of teams may >share an intermediate "build" where they deposit finished work that >they all want to incorporate, but is not for general release yet. We use the word "release" to indicate a build that must be coordinated with other groups. If we need to be more descriptive we can tack on something like "evaluation" or "beta test" to help describe the intended use of the build. We also assign a single revision/version identifier to identify the build as a whole, this makes tracking the builds simple. >So, when one of the teams builds the product, the building tool must >search a vector of "builds" starting with the team's private one, >then the shared one and finally the public one. We have called this >vector a "view" (with acknowledgements to Erickson and Pellegrin of >Bell Labs [1]). It seems to me that the term "view" is just as bad (if not worse) than the term "build". The word "view" also has several meanings. It can be what one sees from the top of a mountain, it can be the transformed image found on a graphics display, or it can be a projection of an object on an engineering drawing. At least with the term "build" you have the manufacturing analogy, which I think *IS* evocative. >Some of our developers have taken to referring to a "build" as a "view" >because: >i) the view is an invariant attribute of the "build" - in our > system, once you have declared the antecedence of the version > you're working on you stay with it; >ii) it rather neatly describes what a "build" is for - it is a place > from which you get an alternative view of the product. I don't see the analogy supporting i) at all, and the support for ii) is weak at best. By the way, we avoid maintaining multiple, actively used, versions of a given module's codee whenever possible. We have found that it is very difficult to propagate bug fixes common to several product lines to each product without having to "un-fix" some bugs that are unique to a product. Also, maintaining functional compatibility is made more difficult by parallel versions of source code. We choose, instead, to maintain one code base for the products (where possible) and do product version control via conditional compilation. (If you have a better answer to this problem, I'd like to hear it.) >When a development team needs to alter a component, they take a copy >from the first "build" in the view that contains a version of that >component; it may be copied from a shared "build" if a cooperating >team has already altered it, or it may be copied from the public >build. After they have started work on their copy, someone may >alter the version from which they started - their "antecedent" >version. Eventually, the team must combine that alteration with >their own so that a unified version of the file can be deposited in >the shared or public "build". > >We have called this operation "reconciliation"; clumsy - any offers? Yeah, call it "programmer's hell". In my experience, communication generally breaks down between between parallel code developers. This is usually due to schedule demands placed on the engineer. Even when communication is mandated by management through the use of inter-project design reviews, the reviewer often does not realize the impact the proposed changes will have. This frequently results in expensive redesign and rework when the "reconciliation" happens. Until I find a better answer, I think a single designer should maintain a given module for all products. This also forces the designer to consider inter-product functional compatibility/consistancy, which is VERY important these days. Well, I've probably insulted just about everybody on the net by now, but I feel better. :-) I hope what I had to say helps someone out there avoid what I learned the hard way. (It probably won't though, most people would have hit "N" as soon as they saw "long" in the subject line. They probably said something like "Oh God, not another one of those software engineering nut's ranting again.". -- US Mail: Stan Kalinowski, Tektronix, Inc. Information Display Group, Graphics Workstations Division PO Box 1000, MS 61-028, Wilsonville OR 97070 Phone:(503)-685-2458 uucp: {ucbvax,decvax,ihnp4,allegra,uw-beaver}!tektronix!orca!stank ------------------------------ End of Soft-Eng Digest ****************************** -------