This article started as a rant (no, me?) about software development being too complicated nowadays and how the kids should get off my lawn. But it turned into more of an exercise in self reflection…
Many, many moons ago when I starting programming, the number of hops between me and the CPU was only two or three. When playing with Z80, 6502 or 68000 assembly language I had a small bunch of commands, a book that described the CPU and other chip features and how to poke them to get results and that was about it.
The skill was in being efficient, in working out how to build complicated things with simple tools. For example, if your chip doesn’t have the ability to multiply how do you do it? By using a combination of looping round a ‘add X to Y’ a number of times or by shifting the binary bits to the left which multiplied the number by the power of two for each shift made.
It was comforting to know that all the information was there in front of you in those couple of books and if you couldn’t work something it out it wasn’t because there was some piece of information missing. It was down to you. With no internet.
Back then it felt like it was possible to truly understand the environment you were developing in. The commands were simple and well documented. And didn’t change. The computer architecture and chips available to command were also well documented and unlikely to change.
Aside – It’s just dawned on me that this is probably why whenever I start learning a new technology I always try to start as far down the stack as possible. Which is hard work given the number of layers everything has nowadays. It’s dependancies all the way down.
Peering over the top of my rose tinted specs for a second I can see that it took an age to write anything and it was hard to debug stuff. But things started simple and worked up, rather than starting complicated and getting ever more complicated as you tried to resolve things down to the metal.
Fast forward to today and I’m currently developing a project using the fairly standard Microsoft .NET web stuff with a SQL database at one end and ASP MVC at the other, and about half a dozen intermediate layers in-between.
The problem as I see it, is that each layer is in itself so complex that it could be a specialism on its own, yet to build anything useful needs a degree of competency in every layer.
Starting with the database I need to come up with a sensible data model that at least raises an eyebrow at the 12 rules of Codd and won’t hamper things later when it comes to saving and retrieving data. Then I need some way of reading and writing the data so I chose Microsoft’s Entity Framework ORM, and a sprinkling of LINQ.
Next my application needs some overall approach to using data objects, so do I use the repository pattern or not? What about dependancy injection to allow for unit tests etc.? There are loads of choices there too; Ninject, Castle Windsor, new built in stuff in ASP Core? Again, there are many books on each individual option.
What about the web stuff? I kept it simple and used the standard MVC Razor HTML templates, based on the Bootstrap library. CSS? Sure, but do you want to use LESS, SASS, or whatever the newest tool is for building it? What about being responsive – you know, so it adapts to smaller mobile devices automagically? Best go read up on that too.
And so on.
Oh, and if that’s not enough, what about hosting in the ‘Cloud’? Solutions like Amazon’s AWS or Microsoft’s Azure could help, but each one is a career in itself with associated books, courses and conferences. If you know it all by now, don’t forget the container options like Docker or the concept of ‘serverless’ code which has already become out dated in the time it took me to type that, being ousted by FAAS. (Functions as a Service).
And that’s skipping a few layers and options along the way, including the language itself, C#. And the IDE Visual Studio.
And then factor in the notion that each option within each layer has it’s own development cycle which can mean monthly releases to keep up with across all of them.
And it’s not limited to web development. I did a bit of iOS coding a while ago, initially drawn to it by the fact that it was a smaller domain with a known, limited set of target hardware. (I think it was around iOS6 that I started). Now that space has exploded in complexity with numerous device capabilities and sizes, operating system functions and library APIs. There’s even a new language, Swift, to learn.
I’ve been pressing buttons for a living for long enough to know I’m never going to master each option within each layer. There’ll always be someone who’s spent more time focusing on a particular option and will make me feel dumb about it.
Instead I spend time keeping up with the bigger picture. In my job as part developer, part sales, part solution architect I can use all my button pressing experience to help de-risk our projects and work on the bigger techie / commercial pictures. Whilst I’m doing that I can take comfort in the knowledge that those developers who have more experience of the details within each layer will do a better job of those aspects than I could.
Thinking about it as I proof read this article, it seems like I’ve got from one end of the software business, namely the machine code, all the way to the opposite end; the business. Software->Business, if you will.
To illustrate the change, here are the books I’m currently reading.