<bijan.parsia, christos.kotselidis@manchester.ac.uk>
(bug reports welcome!)
(We may adjust the topics as needed or desired)
They are very good, but...
...software engineering is not a settled field.
Read critically and look for the most recent evidence.
(The early chapters of Making Software are helpful for this!)
Feel free to consult a course instructor about any of these! We're happy to advise.
Again, when in doubt, ask us.
Late work is handled by the MitCircs committee, not us.
Software engineering is increasingly seen as a branch of systems engineering
Systems engineering is a methodical, disciplined approach for the design, realization, technical management, operations, and retirement of a system. A “system” is a construct or collection of different elements that together produce results not obtainable by the elements alone. The elements, or parts, can include people, hardware, software, facilities, policies, and documents; that is, all things required to produce system-level results.
— NASA System Engineering Handbook
A “system” is a construct or collection of different elements
that together produce results
not obtainable by the elements alone.
System results are emergent and (metaphorically) nonlinear
Tendentious but common view: They are differnet
The complexity of software is in essential property, not an accidental one. Hence descriptions of a software entity that abstract away its complexity often abstract away its essence.
Many of the classical problems of developing software products derived from this essential complexity and its [super]linear increase[] with size.
Much of the complexity [the software engineer] must master is arbitrary complexity, forced without rhyme or reason by the many human institutions and systems to which his interfaces must confirm. These differ from interface to interface, and from time to time, not because of necessity but only because they were designed by different people
Software takes over!
The avionics system in the F-22 Raptor, the current U.S. Air Force frontline jet fighter, consists of about 1.7 million lines of software code. The F-35 Joint Strike Fighter, scheduled to become operational in 2010, will require about 5.7 million lines of code to operate its onboard systems. And Boeing’s new 787 Dreamliner, scheduled to be delivered to customers in 2010, requires about 6.5 million lines of software code to operate its avionics and onboard support systems.
Software takes over!
These are impressive amounts of software, yet if you bought a premium-class automobile recently, ”it probably contains close to 100 million lines of software code,” says Manfred Broy, a professor of informatics at Technical University, Munich, and a leading expert on software in cars. All that software executes on 70 to 100 microprocessor-based electronic control units (ECUs) networked throughout the body of your car.
Software takes over!
Late last year, the business research firm Frost & Sullivan estimated that cars will require 200 million to 300 million lines of software code in the near future.
Broy estimates that more than 80 percent of car innovations come from computer systems and that software has become the major contributor of value (as well as sticker price) in cars.
(Can we believe these estimates?)
(How do we interpret them?)
(Was Brooks wrong?)
(Were these slides wrong?)
A suggestion why software takes over!
This linear growth of mechanics, coupled with the exponential growth of processing power [Moore's law], has led to the inevitable—the ability to overcome poor mechanical performance with complex but cheap (!) processing. Instead of spending significantly more money for better control, you invest in a better processor and more complex processing [i.e., software].
James Hendler, Robots for the Rest of Us
Less complex doesn't mean easy
Averaging problem: Write a program that will read in integers and output their average. Stop reading when the value 99999 is input.
— Soloway
Most good programmers should be able to write out on paper a program which does this in a under a couple of minutes.
Want to know something scary ? – the majority of comp sci graduates can’t. I’ve also seen self-proclaimed senior programmers take more than 10-15 minutes to write a solution.
But I am disturbed and appalled that any so-called programmer would apply for a job without being able to write the simplest of programs. That's a slap in the face to anyone who writes software for a living.
Is this a good attitude?
Here's a clue for you: I don't do well in programming tasks during interviews, and I've love someone to come into my comments and tell me I can't program based on this event. No, I've only faked it while working for Nike, Intel, Boeing, John Hancock, Lawrence Livermore, and through 14 or so books–not to mention 6 years of online tech weblogging.
In fact, you'll find a lot of people who don't necessarily do well when it comes to programming tasks or other complex testing during job interviews. Why? Because the part of your brain that manages complex problem solving tasks is the first that's more or less scrambled in high stress situations. The more stress, the more scrambled. The more stressed we are, the more our natural defensive mechanisms take over, and the less energy focused into higher cognitive processes.
def average_rainfall(input_list):
# Here is where your code should go
total = 0
count = 0
for m in input_list:
if m == -999:
break
if m >= 0:
total += m
count += 1
# ignore other negatives
avg = 0 if count == 0 else total / count
return avg
Much of the complexity [the software engineer] must master is arbitrary complexity, forced without rhyme or reason by the many human institutions and systems to which his interfaces must confirm. These differ from interface to interface, and from time to time, not because of necessity but only because they were designed by different people
Keep an eye out for the Wats!
Implementation and design could be perfect, but if there was a spec misunderstanding, ambiguity, or change, the software will not be correct!
All these contribute to the user experience (UX)!
We're going to focus on efficiency this week!
One formulation by Peter H. Salus:
This is the Unix philosophy: Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.
Write programs that do one thing and do it well.
Write programs to work together. Write programs to handle text streams, because that is a universal interface.
stdin
: STandarD INputstdout
: STandarD Outputstderr
: STandarD ERRorwc
)wc
is a ubiquitous small toolBeware of bugs in the above code; I have only proved it correct, not tried it.
— Don Knuth, Figure 6: page 5 of classroom note
—Grace Hopper's Bug Report
Testing is inescapable; good testing takes work
A test case is a repeatable execution situation of a software system that produces recordable outcomes. A test is a particular attempt of a test case
1+1
to a calculator to return 2
1+1
A test case is a repeatable execution situation of a software system that produces recordable outcomes. A test is a particular attempt of a test case
The fundamental challenge of testing is generalisability
Testing shows the presence, not the absence of bugs.
—Edsger W. Dijkstra, Nato Software Engineering Conference, pg 16 1969
"We used the following test suite to stress test our application".
X and Y
sum
X=1
and Y=1
2
The next most significant subset of [Modification Requests (MRs)] were those that concern testing (the testing environment and testing categories)—24.8% of the MRs. ...it is not surprising that a significant number of problems are encountered in testing a large and complex real-time system...First, the testing environment itself is a large and complex system that must be tested. Second, as the real-time system evolves, so must the laboratory test environment evolve.
Making Software, pg. 459.