Software to Business

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.

Javascript, a language in it’s own right is unavoidable. But if that’s too concrete for you, how about coffeeScript or TypeScript that are their own languages but ‘compile’ into javascript? Again, there are many books and online tutorials in each and every option within each layer.

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.

 

Under(steer) Control

After playing Gran Turismo Sport with six-axis tilt steering on the PS4 controller I was impressed at how well it compared to using my Logitech G29 steering wheel. Great I thought, I can play Project Cars 2 downstairs on the sofa and not have to re-arrange my office to set the wheel up all the time.

Then I tried to actually play PCars2 like that.

Jeez, how can it feel so bad compared to GT Sport?

And so began the long and tedious process of changing the settings, trying it out, swearing, going back to the options, tweaking again, saving, trying… repeat until rage quit. Wait a few days then start again.

I spent ages doing this. So long in fact that a game update was published in the meantime (1.4.0.0) that added a new option – Opposite Lock Assist.

After much reading and experimenting I found out two things…

  • The opposite lock assist is related to the Speed Sensitivity setting. (Ok, this wasn’t hard to find out – it’s right there on the settings screen)
  • The Speed Sensitivity settings don’t feel the same for all cars.

The second point was the key. I’ve had to change the speed sensitivity setting depending on the performance of the car I’m using. Between road cars and GT4 class, it feels great with the settings specified, but anything faster than that and even at slow speeds the steering doesn’t respond quickly enough or far enough to allow the car to make tight turns.

For now I’ve settled on these settings as a decent compromise, presented here for others to try and so I have a record of them for when I inevitably make things worse by tinkering again later.

Steering Deadzone    5
Steering Sensitivity    37
Throttle Deadzone    0
Throttle Sensitivity    15
Brake Deadzone    0
Brake Sensitivity    30
Clutch Deadzone    10
Clutch Sensitivity    25
Speed Sensitivity    75
Controller Damping    60
Controller Vibration    100
Minimum Shift Time    0