1. About this course

Part of CS:2820 Object Oriented Software Development Notes, Spring 2017
by Douglas W. Jones
THE UNIVERSITY OF IOWA Department of Computer Science

 

Prerequisites:

This course assumes two semesters of prior programming coursework in a programming language such as Java, Python, C++ or other languages. If your experience is in older languages such as C, or Pascal, you will have some difficulty, and if your experience is largely in BASIC, COBOL, or FORTRAN, you will really need to work hard.

From the first programming course, you should have learned the basics of programming. How to write programs involving loops, if-then-else constructs, and function calls. You should be comfortable with simple variables, arrays and perhaps the outside view of several container classes.

From the second programming course, you should have learned something about data structures and algorithms. Lists, queues, binary search, lexicographic trees, sorting, and several recursive algorithms. The formal analysis of algorithms is a more advanced topic, but you should have seen enough to develop an intuition for the fact that some algorithms are potentially much faster than others when used to achieve the same goal. Consider for example the difference between binary search and linear search, or the difference between quicksort and bubble sort.

In general, programming assignments in these courses are short, rarely amounting to more than a few hundred lines of code, and frequently under 50 lines of code. (Yes, the "line of code" is a horrible way to measure program size, since any program can be converted, with very little effort, into a program that is twice the size.)

Goals:

Previous offerings of this course have used several different languages, but what matters is, this is not a course about a specific programming language. You know how to program, and learning the syntax of a new language is not all that hard.

It is noteworthy that the programming languages you are likely to have learned in any intro course taught in the last 20 years all support object oriented development, but the small programming assignments you had in your intro courses are unlikely to do more than use built-in classes, and in a second semester course, while you may have implemented a new class, you didn't really need to do so except that it was assigned. This is a natural consequence of small programming assignments.

The need for something like object oriented programming is not apparent until you get into large problems. Try to write a digital logic simulator capable of simulating a complete CPU at the level of and, or and not gates. Try to write a compiler, try to write a spreadsheet package, or any of many other large applications, and you will find that the story is quite different. If object oriented programming had not been developed already, you would be very likely to re-invent it.

This course, therefore asks you to work through a large programming project, large enough that you really need to use objects. Programming in the large will ask for more than objects, it also requires management, documentation and methodology.

When you write small programs, who needs documentation? Here is an example, written in the old C programming language. The fact that you don't know C should not matter to your understanding of this code:

	int add( int a, int b ) {
		return a + b;
	}

Not knowing C, you may need someone to explain that int is a data type and that declarations in C put the type name before the object being declared, but with this, you should be able to guess that the function call add(1,2) will return 3. Adding comments or writing a page of documentation to this code serves little purpose. Is the following code any easier to read?

	int add( int a, int b ) {
                /* function to add two numbers a and b
                 * prerequisites: a and b are integers
                 * side effects:  none
                 * result returned: the integer sum of a and b
                 */

		return a + b;
	}

The story is quite different when your program is 5000 lines long. At that point, you can't grasp the whole thing at a glance, and you are unlikely to be able to remember from one day to the next what each part of the program does. When programs get that big, you need documentation even if there is only one programmer, and when there is a team involved, it is even more important.

In summary, this is a course about programming in the large, where up to this point, you have been programming in the small.

Software Engineering:

The term software engineering has frequently been used for what this course introduces, but this term is simultaneously falling on hard times in some circles while it becomes deeply entrenched in others.

Knowing something of the history of software engineering helps understand the conflict here. As software systems grew in the 1960's and 1970's, people looking at the economics of software noticed something disturbing: While the price of hardware was falling, following Moore's Law, the cost of software was soaring. This came to be known as the "software crisis" and it never ended. There were huge software boondoggles in both government and private industry. F. P. Brooks' classic book The Mythical Man Month (1975, Addison-Wesley, and still in print) documented the problem and proposed some solutions.

Many observers of this situation found the contrast between the productivity of hardware engineering and the crisis with software development asked: "Why can't software development be done as an engineering discipline." This led naturally to the term "software engineering" as a buzzword for how software ought to be developed.

The negative assessment of software engineering rests on two observations: First, many of the early proponents of software engineering seem to have had romantic misunderstandings of the nature of engineering. If you ask the designers of a bridge across a large river what they are doing, they will typically describe the initial stages of the design as being high art. Selecting between a cable-stayed bridge and an arch bridge, for example. And then, a typical civil engineer would say, "and then the real engineering begins, deciding how much rebar to put where, how many bolts go in this joint, how thick is that cable?" The work the civil engineer describes as "real engineering" is comparable to the detail work in computing that people sometimes call "coding".

Meanwhile, the work that proponents of software engineering want to call engineering and want to systematize seems comparable to the high level design work that civil engineers might refer to as being a high art.

Second, the industrial response to the emergence of the term "software engineering" was the immediate promotion of this term to a job title. This allowed parallel pay and promotion structures programmers and conventional engineers without offending personnell managers.

Now, 35 years after the emergence of software engineering, there are skeptics in both the academic and industrial world who consider software engineering to be, at best "computer science lite" (to quote one former department chair).

Meanwhile the study of software engineering has produced insights into the management of large projects. Some things that sound like buzzwords that have come from software engineering are actually valueable. "Extreme programming" is an example. While slavish adherence to the XP methodology may be silly, the underlying ideas of incremental development are very powerful. UML, as a formal graphical language for describing programs may be foolish, but selective informal use of the notation is frequently useful during the early stages of a software project.

A Public Service Announcement:

Most of the best CoOp internships are already filled, but there are still occasional opportunities. If you are looking for summer jobs, get yourself into the pipeline at both the Business and Liberal Arts placement office and the Engineering placement office. CS students are welcome at career fairs sponsored by both. Note, recruiting season for spring graduates peaks in the fall. If you are graduating a year from now, you want to get your résumé in order this spring.