Sunday, March 1, 2009

Sw is engineering of a higher kind

I´m copying an author I admire for the title of this.

LIE 1 (bad mapping): Writing sw is implementing a paper design
Writing sw is PURE and ONLY design: implementation is what all our tools do, we do not implement anything directly! (this comes from Uncle Bob)
Programmer vs Developer: writing throwaway code is akin to doing pretty pictures of imagined buildings (vs designing and building them)
Sw deals with abstractions using well defined logical constructs. By following the rules of logic we can assure ourselves that a general purpose infrastructure (namely a Universal Turing Machine pseudo implementation or, if you are a "real-world" no-nonsense guy, a computer with an OS) can execute a implementation of that design (the final product of the code we wrote). The implementation is written by compilers, linkers ... and is used with the help of the Hw, OS, and even VM.

LIE 2 (convenient exploitation): Developing sw cannot be engineering
If the previous where true then, by logic engineering is a logical impossibility. If sw dev cannot be engineering THEN nothing can ...
Let's dissolve all the objections usually presented (again and again). Another story (extremely interesting) is if we want/need sw engineering in general ...

- Law, regulation, rights and obligations
We will say this is not an engineered product if you let us say it is not fit for anything ...
We will say this is not engineering so we can do things any way we want (possibly can)
We will call you are junior programmer and give you an H1B visa and some peanuts for your engineering (but I´ll have to manage you as I have an MBA ...). I just hope this crisis teaches us something about the 'virtual' lies we create ...

- Profession, Art, Experimentation or prototyping
Prof: But I like x so it must be either illegal, unhealthy or a hobby
Art: but I just want to do as I please, pretty please ... Ditto
Prot: I have no clue about this but let me try

Sw can be used and applied to as much areas as engineering, but we have lots of engineer types and only a few common ideas about all computable things ...

- Process
Process is a distillation of practice: traditionally sw process has been postulated the other way around. We started to get globally vocal against this in the last decade (extreme, light-weight, adaptive, evolutionary ...).
You cannot use the same process to build a bridge and to build a car: why do you expect the same process to work for a web site and an office suite (other than some very high level vagaries worthy of a con man)?

Historically getting to engineering follows a path: ingenuity, artist, artisan, guild, ...

LIE 3 (libertarian mind-body delusion): But sw is not real, no physical things ...
See point 1: sw development is design, repeat until fully understood.
We can, to a point, liberate ourselves from implementation machinery (compilers, VMs, interpreters, Operating systems, networking sw : infrastructure) that do the dirty implementation job ... And, like all design, we can pile up abstractions, with a cost.

The 1M monkeys typing idea (we are getting close to this ...): A monkey can do a mark on a bar and it will hold the whole wikipedia codified as a very long fraction. So just one monkey (after a few tries) can generate the distilled accumulated knowledge of the whole species ... Like, you know, there is no spoon (we wish).
Copying sw is as inexpensive as copying any other 'paper' plans, the 'theft' is done when you execute it ...
Car builders do not sell to end-users robot factories that allow you to build car designs (too expensive, bad business), but computing sells you the machines and base sw to execute, create and copy sw designs. That´s the computing revolution ...

And engineering of a higher kind is the one you get when you use your engineered tools to engineer betters tools to design and build other 'accepted' engineered products. We seem a bit lost now, but we are doing our job!