Exercise Solutions (Restricted)
The programming activity is specfic to a particular programming language and provides the input necessary for making a computer correctly carry out a given task. A very important skill in a programmer is being to create exactly correct syntax. A civil engineering analogy would be a brick-layer or a carpenter. A publishing analogy would be a copy editor who ensures that the house style is being followed and that the punctuation and spelling are correct.
Design is specific only to a family or style of programming languages. The core of the design activity consists of invention and planning. It answers the questions such as "How are we going to build a solution?", "What will be the elements of this solution?" and "How will the elements relate to each other?"
The boundary between design and programming isn't clear-cut. A good programmer has to solve small localized problems, and to design small, localized structures. A designer must know what the programming language is capable of and know what structuring possibilities it offers.
Continuing with the publishing analogy, while a copy editor might be capable of a great novel, and while the copy editor will write suggested, replacement sentences and occasionally write suggested, replacement paragraphs, it is the novellist who plots and structures the novel. And while a novellist might be capable of writing correct English or whatever, they typically will not be overly concerned with "whilst" versus "while" and "towards" versus "toward".
Continuing with the civil engineering analogy, the counterpart of our designer would be the consulting engineer, Ove Arup being one famous example.
The analysis activity is an investigative, factual or definitive activity; in contrast with the more speculative nature of design. Analysis could be independent of the programming language, although it is usually wise to deliver the analysis findings in a form that is reasonably compatible with the intended implementation technology. Analysis chooses, assembles, formalizes, abstracts and presents inputs to the design. It might be the analysis of a current system or it might be the analysis of the subject area or context of the system-to-be. Before designing a new kind of vacuum cleaner, it would be sensible to analyze the nature of carpets, upholstery, dirt and humans.
Finishing the civil engineering analogy (the publishing analogy having been stretched beyond breaking point), the analyst's counterpart would be found within the architect, a Norman Foster if you like. The boundaries are not quite the same, however. A civil engineering architect will carry out some of what we are terming design, especially towards the end of the architecture phase. And in software systems development there is much more analysis that needs to be done. This is because there is a greater range of problems that a computer can solve, compared with the problems that a new building can solve.
Some years ago, one of the most respected researchers into software economics (Barry Boehm) discovered that succesful projects spent 65% of their time in analysis and design, 15% in programming, and 25% of their time in testing. As platforms have become more powerful over the ensuing years, and as computing solutions have become ever more diverse, the percentage for analysis and design has probably increased. I note that your request for definitions didn't mention testing. I assume that you are budgeting for that separately.