Software Development

What are the high-level concepts that people think about when they are developing software?

Software Engineering

Software Engineering is concerned with constructing software systems that are:

Exercise: Think up a couple more criteria.

Software engineering is fundamentally different from other engineering disciplines, argues Jack Reeves in these three excellent essays.

Exercise: Write a review of these essays, arguing whether you agree or disagree with his thesis "the code is the design".

Why Study Software Engineering?

According to Booch, "industrial-strength" software is inherently complex. Steve McConnell calls it a wicked problem. No single person can understand all the subtleties of the design of a large software system. Why?

To construct complex software we should try to understand the nature of complex systems in general, and see how we deal with them.

Complex Systems

An empirical study of various complex systems (e.g., matter, personal computers, plants and animals, social institutions) reveals:

How Humans Deal With Complexity

We manage complexity using abstraction, classification, and hierarchy.

Abstraction

Abstraction is probably the single most important principle in Computer Science. It is the primary way humans deal with complexity, and software systems are humankind's most complex creations. You have to be able to view software components in an abstract way, that is, you have to be able to describe what they do, without relying on describing how they do it.

Examples

Exercise: Give a few more examples.

Primary types of abstraction in programming

Examples of Data Abstraction

Classification

Classification is identifying that a number of objects have similar structure and behavior and giving a name to that class of objects. For example "Dog" is a class and your particular dog is an object of that class.

Hierarchy

Hierarchy is how levels of abstraction are organized.

Is-a (Kind-of) Hierarchy

Shows classes and subclasses. Moving up is called generalization (recognizing that different classes share some similarities), moving down is called specialization (factoring a class into subclasses which are different from each other in some ways).

isa.png

Exercise: Give some more examples.

Has-a (Part-of) Hierarchy

Shows classes in a containment hierarchy. Moving up is called composition (combining parts to form larger objects), moving down is called decomposition (breaking a larger structure down into components). In a composition relationship, contained objects are completely owned by the container: if the containing object goes away, so does the containee.

hasa.png

Member-of (Aggregation) Hierarchy

Shows classes related by groups and subgroups. This is very similar to composition except that the members of a group continue to exist even if the group goes away.

memberof.png

Software Development Methodologies

Many software development methodologies, or processes, have been created. Usually they fall into a spectrum from adaptive to plan-driven. Many of the more adaptive are known as agile methods. The most plan-driven method is probably the waterfall model. This is pretty much despised as a way to build software, because it doesn't work. It does work in heavy manufacturing and similar industries, though.

Some methodologies:

Boehm and Turner give a great characterization of "home grounds" for adaptive and plan-driven methods (loosely summarized here):

AdaptivePlan-driven
Goal is to respond quickly to changeGoals include predictability and stability
Smaller teams, more senior developersLarger teams, more juniors
Tacit interpersonal knowledgeExplicit documentation
User storiesExplicit, formal, detailed, requirements
Simple designsDetailed and extensive designs
Culture "thriving on chaos"Culture "thriving on order"
Exercise: Write a three to five page paper on Agile software development.

Phases, Iterations, and Workflows

Software Development is an incremental and iterative process (waterfall doesn't work for software). You iterate because coding might show part of the design was infeasible, maintenance requires recoding, the customer will change requirements just when the product is about to be shipped, etc.

The major elements of a development cycle are phases, iterations and workflows. This diagram shows the four major phases (inception, elaboration, construction and transition). Within each phase you do a number of iterations. An iteration results in the development of a complete, executable subset of the system. The diagram (from the RUP) shows how much effort within a given workflow you put into an iteration.

rup.gif

Current Research

Technologies that Help

Producing Efficient Software

An efficient algorithm minimizes cost which is one or more of:

Caskey's Law of Software Development

"A good system must first and foremost be easy to modify and extend." —Caskey Dickson