June 26, 2018

Best Level of Abstraction

I've worked mostly for the federal government as a subcontractor for the past 15 years. When government organizations need help with something, managing documents, building their intranet, managing their accounting, managing office supplies, etc, they usually look for "enterprise" software built by large popular companies.

Most of the time, enterprise software is written completely as graphical user interfaces. You have to use the mouse and click thru screens to install, configure and get things done.

But, on ever single project I've ever been on, the government runs into problems that can't quite be solved by the software's graphical user interface.

For example, maybe the government wants to store their users in a repository that is slightly different than what the enterprise software supports. Or maybe the government needs to produce files in a specific format, or maybe they need to encrypt some of the data, or maybe they need to retain records longer than the software supports.

It never fails. 100% of the time, there is something that the government needs or wants that the gui enterprise software just can't do.

So, today, I'd like to share "Dave's Software Building Principal #2".

Guiding Principal #2: Work in Code.

As I mentioned in a post a few days ago about working with plain text, I think that there's a spectrum of levels of abstractions to choose from when writing software. At one extreme, software is representated as electricity. At the other end, software is representated something much more familiar to humans. Perhaps graphical user interfaces, or virtual realigy goggles.

I think 1's and 0's are too difficult to understand. And I think graphical user interfaces are too far to the other extreme.

I believe there is a happy middle ground. And in my experience that happy middle is Turing Complete Programming Language Source Code.

It's not a question of "if" you'll need to get down to this level. It's only a matter of "when".

Source code of a full featured programming language can be used to represent anything and everything. It can take years to master, but it's essential to learn if you truly want to use the full power of a computer.

I think software, in general, would be much, much more valuable if we developed so that all the functionality is always available via command line first (like a repl), and gui's second.

Imagine how useful it would be to have a programmatic interface to Excel or Microsoft Word? Imagine how much more productive entire organizations would be if employees could start working in an easy-to-use graphical user interface, but eventually become comfortable use the same functionalities from the command line?

I know for sure that this would be a difficult (and maybe impossible) sell to the government organizations I've worked with. But I'm absolutely convinced that the best level of abstraction to work in is at the level of a Turing Complete Programing Language Source Code.

Tags: software development principles