Sunday, June 17, 2018

Different Languages For Different Phases

Use the best technique for each phase. (Posted by Jerry Yoakum)

"The industry's eternal thirst for simple solutions to complex problems (Every Complex Problem Has a Solution) drives many to declare that the best software development method would use the same notations for software representation throughout the entire development life cycle. Since this is not the case in any other engineering discipline, why should it be in software engineering?"

"Notations provide us with models that can be manipulated in our minds. The more notations and the richer and more diverse the representations used, the better we can visualize the product under construction."

For requirements engineering, select a set of optimal techniques and languages:
For design, select a set of optimal techniques and languages:
For coding, select an optimal language:
"Transitions between phases are difficult. Using the same language doesn't help. On the other hand, if a language is optimal for certain aspects of two phases, by all means use it."


Reference:
Matsubara, T., "Bringing up Software Designers," American Programmer, July-August 1990.

Thursday, June 14, 2018

Record Your Assumptions

Track Assumptions (Posted by Jerry Yoakum)

"We make approximately one assumption every 10 lines of code, or even if I'm off by a factor of 2 or 3, one assumption every 20 to 30 lines of code." - Manny Lehman
These assumptions about very complex software systems and environments result in unexpected behavior.

Keep track of all your assumptions throughout requirements planning, design, coding, and testing. Also, record the implications of each assumption - where in the product does the assumption manifest itself? Isolate such implications by encapsulating each assumption.


Reference:
Lehman, M., "Software Engineering, the Software Process and Their Support," Software Engineering Journal, September 1991.

Wednesday, June 13, 2018

Every Complex Problem Has a Solution

Solve the real problem. (Posted by Jerry Yoakum)
"To every complex problem, there is a simple solution... and it is wrong!" - Wlad Turski

Be highly suspicious of anyone who offers you something like, "Just follow these 10 simple steps and your software quality problems will disappear." Or, "Subscribe to our software services and all your monitoring, logging, debugging, etc problems will be solved."

For your interest, Turski's quote is a simplification of the following quote by H. L. Mencken.

Explanations exist; they have existed for all time; there is always a well-known solution to every human problem — neat, plausible, and wrong.
  • "The Divine Afflatus" in New York Evening Mail (16 November 1917)

Monday, June 11, 2018

Build Software So That It Needs a Short Users' Manual

The shorter the manual, the better the software. (Posted by Jerry Yoakum)


One way to measure the quality of a software system is to look at the size of its users' manual. The shorter the manual, the better the software. The use of well-designed software should be mostly self-evident. Unfortunately, too many software designers fashion themselves as experts in human interface design as well. The voluminous manuals that result are sufficient evidence that most interface designers are not as great as they proclaim.

Use standard interfaces. Use industry experts to design self-evident icons, commands, protocols, and user scenarios. And remember: Just because software developers "like" an interface, it doesn't mean that your customers will have any idea of how to use it. Many software developers like interfaces with built-in short-cuts. Usually, customers want simple, clean, clear interfaces - they don't want to learn tricks to enable short-cuts.


Reference:
Hoare, C.A.R., "Programming: Sorcery or Science?", IEEE Software, April 1984.

Wednesday, May 30, 2018

If Possible, Buy Instead of Build

Buying is a type of reuse. (Posted by Jerry Yoakum)
Off-the-shelf software may address only some of your feature needs. But consider that building your own software may result in going over budget, being late, and still only addressing only some of your feature needs.

"As a developer, you should reuse as much software as possible. Reuse is 'buying instead of building' on a less grand scale."


Reference:
Brooks, F., "No Silver Bullet: Essence and Accidents of Software Engineering," IEEE Computer, April 1987.

Friday, May 25, 2018

Change During Development Is Inevitable

Change will happen so prepare for it. (Posted by Jerry Yoakum)

Software will change during development! The changes might be refactoring code, adding new tests, changing requirements, or adding new requirements. The changes could be as simple as fixing bugs, or general improvements.

Prepare yourself for changes by making sure:
  • that all software development is appropriately cross-referenced,
  • that change management procedures are in place, and
    • Establish SCM Procedures Early*
    • Give Every Intermediate Product a Name and Version*
    • Rank and Schedule Change Requests*
  • that budgets and schedules have enough leeway so that you are not tempted to ignore necessary changes just to meet budgets and schedules.
    • Don't Set Unrealistic Deadlines*
    • Avoid the Impossible*
    • Avoid Standing Waves*

Reference:
Bersoff, E., V. Henderson, and S. Siegel, Software Configuration Management, Englewood Cliffs, N.J.: Prentice Hall, 1980, Section 2.2.

Thursday, May 24, 2018

The More Seen, the More Needed

Give 'em an inch and they'll take a yard. (Posted by Jerry Yoakum)

"The more functionality (or performance) that is provided to a user, the more functionality (or performance) that the user will want."
Which supports:
More importantly, you must be prepared for the inevitable requests for more.
  • Documentation should be organized in such a way that it is easy to update and add to.
  • Establish SCM (Software Configuration Management) Procedures Early.
  • Systems and processes in place to handle the users' requests.
  • Design so that configuration is quick and easy.


Reference:
Curtis, B., H. Krasner, and N. Iscoe, "A Field Study of the Software Design Process for Large Systems," Communications of the ACM, 31, 11 (November 1988), pp. 1268--1287.

Monday, May 14, 2018

Grow Systems Incrementally

Add functionality a bit at a time. (Posted by Jerry Yoakum)

Reduce risk when building a software application by growing it incrementally. Start with a small working system with only a few features. Then incrementally add new features working toward the final functionality. This helps lower risk with each build and provide the customer information about the product over time. The downside is that if an inappropriate architecture is used early on, it might be incompatible with later features and require a redesign. This risk can be reduced by building throwaway prototypes of all the major features early on.
To everyone familiar with the Agile Methodology you'll no doubt see the similarities.


Reference:
Ruskin, R., Debugging Techniques in Large Systems. Prentice Hall. Englewood Cliffs, NJ, USA, 1971.

Sunday, May 13, 2018

Plan to Throw One Away

You'll end up throwing away the first system so just go ahead and plan for it. (Posted by Jerry Yoakum)

A highly critical factor in the success of a project is whether the project is entirely new. New software treads in new territory and rarely works on the first try.

In 1970, Winston Royce said one should plan for the first fully deployed system to be the second one created. The first is a prototype that flushes out the critical design issues and proves the concept. You should expect to spend 25% of your time and effort in making the prototype. Fred Brooks reiterates Royce's advice in the Mythical Man Month saying, "Plan to throw one away; you will anyway."

When developing a new software application:
  • Plan to build a series of throwaway prototypes before starting the final product.
  • Expect a software application to be modifiable for a certain period of years, after which it will need to be fully replaced.
    • Software Will Continue to Change*
    • Software's Entropy Increases*
    • Fix Problems, Not Symptoms*
    • The System's Existence Promotes Evolution*
  • You can only fiddle with an application just so much before it becomes unstable and must be replaced.
    • Software's Entropy Increases*
    • The Older a Program, the More Difficult It Is to Maintain*
    • Maintenance Causes More Errors Than Development*
    • Belief That a Change Is Easy Makes It Likely It Will Be Made Incorrectly*

Friday, May 11, 2018

Align Incentives for Developer and Customer

Align developer and customer goals for project success. To align everyone's goals:
  1. Prioritize requirements.
  2. Reward the developer based on the relative priorities.
  3. Define reasonable penalties for late delivery.