views:

439

answers:

10

In my career I've come across two broad types of theory: physical theories and educational/management theories:

Physical theories are either correct (under appropriate conditions) or incorrect, as judged by the physical world.

Educational/management theories have the appearance of being like physical theories, but they lack rigorous testing. At best they give new ways of thinking about problems. Multiple theories are useful because one of them may speak to you in the right way.

As an hobbyist student of software engineering there appear to be a lot of theories of software engineering (such agile programming, test driven design, patterns, extreme programming). Should I consider these theories to be physical-like or educational/management-like?

Or have I mis-understood software engineering and find myself being in the position of "not even wrong"?

+5  A: 

Software engineering is ultimately about psychology, how humans manage complexity. So software engineering principles are far more like education and management theories than physical principles.

Some software engineering has solid math behind it: O(n log n) sorts are faster than O(n^2) sorts, etc. But mostly software engineering is about how humans think about software. How to organize things so that maintainers don't go crazy, anticipating what is likely to change and what is not, preventing and detecting human errors, etc. It's a branch of psychology or sociology.

John D. Cook
Excellent post! I couldn't agree more.
Syntax
Good description, except that software engineering is not part of psychology or sociology, although successful software engineer would use both of those to benefit his projects.
Dima Malenko
+1  A: 

They're like recipes: they're guidelines, whose success depends:

  • Partly, on the quality of the recipe
  • Partly, on the quality of the ingredients
  • Partly, on the skill of (and time available to) the practitioners
ChrisW
+3  A: 

Not even wrong.

All the software engineering "theories" seem to be nothing but advice on particular things to try to see if they make you and your team more productive. Even if one could set them up to be falsifiable like scientific theories, there would be very little point to it. That is not to say that it is not worthwhile to learn about them -- au contraire, you should become familiar with as many of them as possible and try to figure out in what kinds of teams and environment they may work better. But be careful: avoid dogma and thinking there are silver bullets.

rz
right. the question arises from a bad use of terms
Javier
yeah, some terms are misused, but the question is still valid.
rz
Figuring out when they help can be done scientifically, and could be a useful thing to do.
David Thornley
still, they're not theories
Javier
+3  A: 

i wouldn't call agile programming, test driven design, patterns, extreme programming, etc 'theories', they're methodologies, or work styles. they don't make any assertions.

Javier
they make an implicit assertion. "following this paradigm will improve <something>"
rz
They make a very explicit assertion, this method produces code with fewer bugs in less time. In theory this is testable in practice is seldom is.
Jim C
+4  A: 

I think the appropriate theoretical split is those "harder" sciences (where there can be proofs) and the softer topics with qualitative answers and few proofs if any.

Software to me is mostly about language and communication, a topic that is qualitative and subjective mostly. Every now and then we touch into algorithms and other "hard" areas, where proofs and rigorous formalisms exist. So, yes, both please.

krosenvold
I agree with your split (+1), just not your definition of an absolute science. I think as long as it's based on the Scientific Method (Where "truth" changes with the evidence) it's an absolute science.Proofs in the mathematical sense don't exist in an absolute science.
Allain Lalonde
Point taken, edited slightly
krosenvold
+1  A: 

Besides theories, there are also frameworks, models and rules of thumb. Ideas, sure, but based on a less rigorous foundation, which loosely belong to your eduction/management category.

Computer Science has some strong foundational theories (physical ones by your definition), but these mostly consist of tying together the smaller elements.

Software Engineering on the other hand, is a relatively new discipline that involves utilizing computers and occasionally Computer Science to build software systems. Most of the practice in that arena is entirely based on non-rigorous experimental and anecdotal evidence. Since the jury is still out on even the simplest of issues, most of what passes for practices could be best described as pure guess-work and irrational preference. It's one of those disciplines where you really do have to know a lot to realize how much is built on a house of very unstable cards.

Paul.

Paul W Homer
+1  A: 

Being intangible, programming is a very difficult activity to relate to another human being, even other programmers. Software engineering tries to add structure where there is none, but such structure is not rooted in the inevitability of reality. So all these approaches become like religions in how groups of people behave when trying to appease their technical gods (or demons).

tkotitan
+1  A: 

All these theories and best practices still haven't brought us to the point where we can produce software systems reliably and predictably. The newest of these surveys is dated 2001; Jeff's column from 2006 still laments high failure rates.

It'd be interesting to see if anybody's working on an updated survey.

Avionics and the software running my car don't seem to fail at anything close to the rates quoted for enterprise software. Why don't enterprise developers follow their practices more closely? Maybe we should all be writing Ada....[just kidding]

duffymo
+1  A: 

For me, it's my own theory with many of the others used as a base. I don't know any one that uses a single specific theory. And that's not a cop out answer.

Just as there are different languages, theories/practices/methodologies are to be used in distinct situations. The structure, rules, and definitions are all the ways in which people understand how things are to be accomplished, but what is to be accomplished is subjective.

Adapt, knowing the agile, extreme, or other methods at the discretion of the client, project, programmer, time, and especially what makes you successful/happy. Be a team and adjust/adapt to what your team is doing for the greater good; just keep in mind to have something that you have defined in your own mind, or it's not just chaos.

[SOAPBOX] I started programming on the Atari 400 with a converted flat keyboard and 64K upgrade. When I started college, it was VB 1.0 which I saw my Economics Teacher use to build a teaching tool to help people learn more about economics using graphs and visual inputs. That was cool! And I knew I could do that.

This same Economics Teacher, who later become an IT teacher too (he was good), asked if I would teach a class on debugging. He said, "I haven't met someone that understands the concepts and has a natural ability to debug as fast as you do, would you teach us what you know and how you do it." This was a boost in my ego, of course, but to teach, mentor, and help others.

Every one of those instances has fuled my desire to help other people. For me, I want a computer to do exactly what I want, to help other people in the business and home life to increase their qualify of living, learn more, and get more done.

Someone said to me one time, "You're only as good as your tools". Learn, practice, and grow.

If you've defined something, it's working, has order, and it stretches you and the boundaries, you're not wrong.

SnapJag
A: 

Generally the field of Informatics is divided into 4 areas (need to find a link to the source, SWEBOK?), which are distinct although related and interconnected:

  • Computer Science
  • Software Engineering
  • Computer Engineering
  • Information Systems

There is a good analysis of engineering vs. science in Steve McConnel's "Professional Software Development". Check out his Software Engineering, Not Computer Science.

Software development is more about engineering - finding practical solutions to practical problems - than anything else. That is correct that software engineering relies on computer science, mathematics, complexity theory, systematics, psychology, and other disciplines, but it can not be equated to any of them, nor is it a batch of any of them.

Dima Malenko