programming metaphor
in this post i will be describing a programming metaphor. i use it to explain to people outside it what does it mean to work as a software engineer. it proved itself useful and i do not recall seeing it anywhere else. here it is:
first, being a software engineer is a mix between being an architect and being a writer. most people can imagine what both architects' and writers' do. so the comparison like that is a good start.
architect part:
-
considering business requirements
a building has a purpose: it's a mall, bridge, apartement house, hotel, etc. architects convert buisiness requirements into something that could solve a buisiness problem. that's what programmers do too. maybe we are building a social network, text editor, or photo editing tool - it's all about solving a problem.
-
applying technical expertise
building something is always constrained by a real world. and those constraint affect a lot how you build a solution for a proble. for architects it's a physical limitations that constraint a building shape or materials they can use. programmers are limited by internet connectivity, processor power, memory size, etc.
-
a style
the artifact inevitably captures personality. same way you can sometimes tell when a building was created, or who is the author, you could tell similar things by reading programmer's code.
-
organization structure
large projects involve a lot of people. high level architects who prepare blueprints. low level workers who put briks together. managers all around. specialists who take care of electricity, painting or putting the right amount of trees around.
software organizations are built in the same way. different people own different part of a software system. some have different specializations, some do not write actuall code at all anymore.
writer part:
-
self-fulfilling prophecy
here is the most interesting part for me.
since software exists somewhere between real world and your computer, you can not build it by putting physical things together. what you do instead, you write down a very detailed description of what you want to build and how to do that. and then it just happens, becoming some kind of a self-fulfilling prophecy.
imagine if you had a magic book where you could write down a very detailed description of your dream house. after you've written it down, you have the house built.
-
using a language
writing means using a language. computers do not understand english yet, but similar aspects matter. is it easy to read? how well is it structured? and so on.
-
many ways to write it
you can communicate a similar idea by writing a poem, or a very strict scientific text. it can be short, or long. you could rephrase the same thought over and over again. you can translate it to a different language, because not all people speak the same language.
all those things are almost literaly the same in the programming world.
this metaphor could also be used to explain version control:
> how to organize multiple people writing the same book at the same time?
or why software is never completed
> like if environment around your building is constantly changing, so you have to reinforce / adjust / extend parts to adjust