Skip navigation.

Software Development

Correcting The Future

Construction vs. Programming

I've started up my construction project and I learn something new every day being a programmer and all. I've actually learned a lot about programming by doing manual labour. This surprised me at first. And not only do I get in better shape, but it's good for the brain too!

On any job, you have to coordinate who does what. Being in groups of two works best. Something that becomes clear very early on is that if you have more than two people and no one who is officially in charge, you get into problems. Not that this happened. It's when analysing who does what and if we need more people (because some people offered to help), we couldn't figure out where we'd put them and because we're on a tight budget, we have to make sure everything goes well. So coordination is a must.

The point is this. Small jobs coordinate themselves. Large jobs do not. But look at the word I'm using: JOB! What is a job? It's a list of tasks or operations. So doing a construction job is basically real life imperative programming. Small jobs are simple and you can do with very little coordination. Larger jobs need someone to take control of what happens.

It goes beyond this. Even large jobs have limits. The really large jobs that succeed are the ones where much of the work has been standardized or the methods are well known. There is simply no way that you could succeed if you had to check up on every single person all the time. But this is exactly what we're expected to do in programming. Check exceptions. Check error codes. Check input values. Check return values. Trust no one.

There are some uber real life imperative programmers out there. One thing that is very clear is that this is definitely NOT the norm. And note how the thing they are building is "worked on", not a series of continuous operations that is the purpose in of itself. Once something is built, you can add onto it. Road networks, houses, land, etc... they just are.

People come and go, but buildings, roads and land are forever. This sounds exactly like an old quote from someone (can't rememeber the name) that works for Oracle who said software come and goes, but data is forever. And it's true. If we are to break the barrier to larger scale software, we need to build it in a way that's known to work in the real world. We need to have the actual "thing" just be. We need to be able to connect and piece these things together in a certain manner that makes sense without software attached to it. At least, not all the time.

The reason being that anyone at any time can come and do some work on this "thing". Software today is rather monolithic in nature. There can only be one controller, and for all the reasons I gave above. But for massive scales, you just cannot do this. Nothing in the real world works this way. Yet we believe that software is different. There's a real reason why software size has a limit. Also, I truly believe that the only significant expansion of software size has been due to certain tasks being so common that it's been standardized. However, I think we must be careful to attribute this progression to language design or any language feature. It is but a side-effect of a growing industry.

To go beyond, I really believe that data must be at the core of what we are building. That there must exist a way to connect this data together in a more meaningful way that goes beyond languages. In this manner, any language and any tool can come in and do the task required. When you're dealing with physical objects, real life smacks you in the face as to what is feasible. Software isn't so obvious, but I see no reason why the rules would be any different. The primary worker is still human.

DeferenceRandom Thoughts On How We Code

Comments

Anonymous 30. May 2007, 02:47

Zenja writes:

Vorlath, you often have a knack of getting very close to the solution which haunts you, and time and time again you come up with the wrong conclusion and end up chasing another dead end. In the end, as long as you're having fun exploring the world, thats all that really matters. I actually enjoy reading about your journey / adventure, i brings back fond memories.

Ignore data for a moment, and reflect on how large groups of people get things done, and associate social structures with programming structures. A CEO doesn't personally know each factory worker or what their job is. Delegation is the key to making big social strucutures work. When you use a library function to open a file, you dont care about electromagnetic hysteresis of bipolar atomic particles living on a magnetised platter, or how the bits are organised logically on the disk, or how the OS manages file system cache, etc. You delegate the job to a library function, which delegates the job to the OS, which delegates the job to file system module, and so on, until the bytes are return for your consumption.

But for delegation to work, both parties need to understand what is requested, and actually speak the same language. A CEO of a large automobile manufacturer is usually an accountant, not a mechanical engineer. A CEO will have great difficulties understanding an engineeres problems with fluid viscosity in the brake line valve. An engineer likewise doesn't understand the politics behind share price manipulation. However, through several layers of mediation, both parties can successfully communicate, and work on a common goal.

Software must work like this. Only then will you have plug-n-play modules. Forget object oriented programming, functioal programming and data flow programming. How can you plug widget A into socket B, that is the path you should follow.

Vorlath 30. May 2007, 04:25

No, that's what I used to think too. The point of this article is that there's only so much you can do with active workers. There's only so much you can delegate. After a while, it just becomes to big. Take a road system. You can't possibly preplan everything. You just add to it or make modifications without telling the original workers. You get a new crew and do the changes. In software, the old workers (functions, objects) are always there and must always keep adding on top. The old complexity is always there and can only grow MORE complicated. I say this must change. Data has to be the permanent "thing" that is worked on. Software must only be used whene that "thing" needs upkeeping or changes.

Anonymous 1. June 2007, 21:34

WickedSmoke writes:

Delegation is an important concept in software design, but it's just one of
many, and it can be taken too far.
Who hasn't seen metastasized class hierarchies,
endless library and language dependencies, or layers upon layers of glue code?
When the point is reached where the delegation must be delegated,
perhaps another model might be considered.

Software is not physical - so it can not 'just remain'. But maybe something
is gained if we build software *as if* it were physical.
This can work on multiple levels.
We can be describing something as if it were physical (e.g. a dataflow model)
and the description itself can act as if were physical (e.g. a homoiconic lanauge).

Anonymous 6. June 2007, 16:23

Paul writes:

I find the construction comparison interesting.
Especially because it shows how many of the "problems" in software are not unique to software.

For example, if you are building a doghouse, you create a rough sketch of the back of an envelope, visit the hardware store for supplies, and knock it up in the rest of the day. There is little planning and the schedule is right on track. Much like small, one off programs.

If you are building a bridge (we've been doing it for a few thousand years), you get a team of engineers and architects to create a design. You still wind up taking twice as long and use double the planned budget. Sound like a big software project yet?
Take a look at any major construction project and you will see much in common with any major software project. You can only get so far in managing complexity.

Adding a room to a house is a pretty simple thing in construction, akin to writing a plugin to a program with a well documented and established API. Replacing a floor might be compared with replacing my Hibernate DAO classes with JCR DAO classes. Simple and straight forward.

Anonymous 11. September 2008, 01:21

Anjum writes:

People have been trying to make Software Engineering Processess as mature as other Engineering diciplines are. So they have often compared Software Engineering with Hardware Engineering (Electrical/Electronics and others) and also Software Engineering with Civil Engineering. The later one is being done here in above discussion. No doubt one term is common in all these diciplines, i.e. 'Engineering', that refers to the well defined, formulated, calculate/estimated set of procedures, principles or rules.

First off, we should not forget the age of Software Engineering, this is ultimately the youngest one among other two (Hardware and Civil Engineering). The two elders have age of hundreds and thousands years and that's why we have them in a well defined, formulated and calculated/estimated set of procedures, principles and rules (i.e. Engineering). To become such an Engineering dicipline, Software Engineering will definitely take time and we should give it that time open heartedly, instead of trying to have it half-baked.

I don't say that we should not strive to improve our Software Engineering processes, but i want to say that we should neither forget the AGE of this Engineering Dicipline nor the soft NATURE of the Build Product. These are two realities due to which so far we can neigher say that we will soon have Plug-n-Play software components (like Hardware/Electronics Engineering), nor we can say that deligating jobs to software modules will simply work as smart as delegation to humans (like Civil Engineering).

Being a Software Engineer, I think, this topic of comparative study of Engineering Diciplines should be one of the must studied topics in Software Engineering research and academics instead of keeping on developing new software development processes over failed/un-sound processes. This will really bring some day when we will be able to see people comapring some newer Engineering dicipline with well defined, formulated and calculated/estimated set of procedures, principles and rules of Software Engineering.

How to use Quote function:

  1. Select some text
  2. Click on the Quote link

Write a comment

Comment
(BBcode and HTML is turned off for anonymous user comments.)

If you can't read the words, press the small reload icon.


Smilies

December 2009
S M T W T F S
November 2009January 2010
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31