Abstraction, Or, the Gift of Our Weak Brains
engineering.pivotal.io
engineering.pivotal.io
As a long-time Lisp user it's quite comfortable to think of the world in abstractions and having a programmable programming language allows me to bring the domain to my code in a way that no other language can.
However one always hits the non-theoretical limits of the target platform. At that point it becomes a challenge to remove all of the abstractions to gain performance back or find difficult bugs in generated code.
It always comes back to data.
The challenge for engineers trying to decipher the intent behind code is that the intent went undocumented. It's too challenging and costly to encode those things in the source of a program. For a system like Voyager one must make conscious concessions about the data and use every trick they have to perform the transformations they need with the chips they have on that device. I don't think a sufficiently high-level language is going to help much -- even one that can synthesize a program capable of running on Voyager's hardware.
It is crucial, I think, to be able to describe and document your data. You can re-create the program from the data.
Synthesis might be one avenue if machine learning is capable of producing models that can generate their own ideas and theorems. Until then the problem space is still too large, I think, to move it out of NP. Maybe if we get the graph isomorphism into P.
But if we get that far I don't think we'll need programmers anymore.
> it’s time to turn back to old documents to figure out the logic behind some of the engineering decisions. Dodd says it’s easy to find the engineering decisions, but harder to find the reasoning.
It's not that they don't understand what the code is doing. It's that they don't understand why the code is doing what it's doing. Abstractions do not help with why. Documentation does. This is why I try to include as much of the why in the form of comments and long commit messages. Including alternatives considered and why I chose not to use them.
A great way to be motivated to write abstract code is to first understand how cool it is!
Its as Rich Hickey pointed out in his now-famous Simple Made Easy talk, "A juggler can juggle 3 balls. A really good juggler can juggle 9. No juggler can juggle 90 or 900." I know the "smart" developers the OP describes very well and they aren't just doing a disservice to his fellow programmer but to their own creative possibilities with their code.
1) technological limitations, namely in processing and memory probably play a large role in some of the decisions made.
2) software engineering best practices such as DRY, KISS as they relate to abstraction have evolved considerably in the 30+ years (perhaps to some extent because the limitations of observation 1 have been lifted).
Obviously the Voyager code base still has the same technological constraints today since hardware can't be updated on a probe currently traveling on the fringes of our galaxy.
It would have been nice to have a more modern example to elucidate the point regarding empathy for peers.
In fact, the same could apply to the thought process in creating a new programming language. Take for example PHP, it was originally intended as a "Personal Home Page," taking PERL and CGI as its model. Method signatures are inconsistent, and not a lot of thought was made early on to certain points that might have been made, had the creator of this language not intended it for his own personal use. In my own experience, PHP offers less empathy for peers because many of the decisions made are from a single-minded use-case. Contrast that with other higher level programming languages where the introduction or removal of new operators is a subject that is heavily deliberated upon from the perspective of or empathy for peers.
citation: http://threevirtues.com/
Take money for instance. When you see a great amount of cash you're immediately amazed, or when you see someone purposely burning money you get confused.
In physical reality it's all just paper. You see such paper as value (and not as valuable) without even thinking about it (we don't "process" the abstraction).
How am I to answer that if the assumption there are individual electrons is wrong?