On The Need For Understanding
blog.information-superhighway.net
blog.information-superhighway.net
Obviously this depends on the industry; aviation software that runs in regulated environments is probably under even higher correctness constraints than that which Sussman discusses. Accounting software too needs to balance books correctly or risk fines. But most software needs to be mostly correct. New features and better UX is more useful for the users of many systems than fixing tail frequency bugs.
Personally I do hobby code on systems I understand from scratch. Writing for older, well documented retro hardware for example is very fun. Writing things from simple abstractions is also fun. But my speed in doing this is something I know is not commercially viable and that's fine by me.
Many fields have a commercial aspect of them that has a much lower quality bar and a much higher output speed bar than their hobby equivalents. Wedding photography, voice acting, the quotidian demand for these things is far lower than appreciating an Ansel Adams piece in a museum.
If nobody notices a bug, does it matter?
There's whole classes of technically bugs that simply never happen under the real world operating constraints of a software system. The infamous example is that memory leak story from the Microsoft blog[1] – you don't need to fix memory leaks on a rocket that goes boom (or runs out of fuel) after 5 minutes of flight time. Just add the extra memory chip and move on.
Engineering is all about building to real world constraints. Don't build a suspension bridge where a sturdy plank will do.
[1] https://devblogs.microsoft.com/oldnewthing/20180228-00/?p=98...
I've been looking for the optimal game development environment for a while.
That basically boils down to having batteries included. (I have the opposite of Jonathan Blow's situation, I need to be able to get up and running in a few hours for game jams.)
But there seems to be this tension between convenience and control. Either APIs are low level or they are high level.
(A notable exception is the canvas API, which leaves both groups dissatisfied :)
The article basically made me realize, those are basically two separate groups of people. There's people who want total understanding and total control. And there's people who want to Do Thing With Computer.
I am not sure if it's possible to design one system they would both be happy with.
But that made me realize, I had the same idea about GUIs 20 years ago.
On Mac you usually don't get many options. On Windows you usually get too many options.
A rare few applications let you switch between two modes. "Just Do Thing" and "airplane cockpit". There's usually a gear icon or something like that which shows you all the extra options.
I wonder what that might look like for an API.
One thing that gets me in a lot of pieces like this is they kind of assume people have no agency, that now that these tools exist we won't be able to help ourselves but use them despite our better judgement.
The broader topic which I don't see discussed so much are values. If you value deep understanding, well you should continue programming and learning in such a way. In some cases you may just want to use a language model to spin up a quick tool or PoC. And there is an entire grey area in between. It's a value judgement to decide what you use LLMs for, as much as what you don't.
Of course if you're building some crud app it's all already tread ground, and you probably can just throw a prompt at an LLM and get something acceptable out.
This is what I think most people who haven't had boring CRUD jobs just don't get - the impact of having some deep technical knowledge goes to waste if all you're struggling with is dumb stuff like bad database design and basic security vulnerabilities everywhere. This was all done by people who are no longer there and were just in it for the paycheck. But also no one who is good is doing these jobs because the pay is too low compared to what they can get.
I'm sure all of this is true if you are teaching at MIT or are working anywhere near people who have gone there though.
I don’t think that’s the case. I agree with the rest of what you wrote. But it’s not a value out of thin air. You need understanding, unless all you ever do is “spin up a quick tool or PoC”. And even then it depends on what you want to quickly use the tool for, or what concept you want to prove.
Is it also an "emotional trigger point" that causes people to treat their hunches as facts?
Who is we, exactly. Programmers are very rarely the people that are making money in businesses that develop software. In fact they typically represent a massive expense. So in a huge portion of the cases 'we the programmer' will be told what to do in the sense they have to use LLMs to increase their productivity.
When looking at what we tell LLMs to do, you realize there are a lot of cases were humans have less agency than they think.
However, I think the most fascinating thing about Dijkstra is how wrong he turned out to be in his prediction that an empirical approach would not scale.
I suspect that approaching programming like Dijkstra might have paid off long-term, but it was rarely a good deal in the short term, both for bad reasons (the empirical approach is a quicker and cheaper way to create buggy software that we can sell and claim as achievements on our performance reviews) and valid reasons (the unreliability of humans and hardware ultimately forces us to approach real computer systems, which are always a composite of hardware, software, and humans, empirically anyway.)
The docs should have examples for that kind of thing.
Nowadays, they learned from many years and generations of GUI frameworks and... made a new GUI framework, Jetpack Compose UI.
https://journal.stuffwithstuff.com/2010/11/26/the-biology-of...
When I wrote that article, it didn't seem to resonate with anyone at the time. I've been thinking about it more lately in the era of LLMs.
There was one thing that screamed in my head, though, whilst reading it, was, yes we can have a look at the library being used, read the code, and understand what its actually doing (this is one of the reasons I like Go so much, no matter who the upstream author is it's generally clear what they're doing [caveat: there are always going to be authors that obfuscate the f*ck out of code, no matter the language], the one thing, though, is systems like Netflix, hundreds of microservices running together in ways that people have NFI what it's all doing.
It just doesn't fit into one person's head anymore.
So, a single head can manage the data pathways for some subset of the system overall, and they might even get right down to the metal, the sheer size of the system means they only have a partial view, and abstractions (in the form of C4 diagrams) only show how complex the beast has become.
True, but I think it doesn't have to, at least not everything at the same time.
You can still usually understand the ins and outs of a specific component/service/module/etc with some time - e.g. if you have to develop or maintain that component.
Alternatively, you can also try to understand certain data or action paths throughout all components of the system - that's what OP did with the layout bug: They were trying to understand how Android's relayouting logic worked, so they managed to get a mostly complete picture of all the pieces that are involved in that specific functionality. But they probably didn't bother to learn the rest of Android's UI renderer or other unrelated components with the same thoroughness.
I think this kind of "selective understanding" where make conscious decisions which parts you want to understand and which you treat like a semi-predictable black box works well in practice.
i've been using opencode/opus to help with debugging lately, and it (he?) will happily dive into the source code of a dependency, the dependency's dependencies, and the C code that its binding to, all the way down to reading the libusb driver code and explaining what is going on where
whether or not i could have figured that all out on my own is beside the point; i wouldn't have take the time on a tight deadline to dig in deep. i would have done some poking and experiments and shipped a hacky workaround
for me this is similar to the difference of using FOSS vs closed source software. if there is a problem on my linux machine, i can potentially fix it, on windows or mac i just can't.
both closed source software and working with LLMs make me feel helpless. whereas using FOSS or working with humans is empowering.
i get that not everyone feels that way, and that's fine. for my part i'll just stay away from LLM generated code.
#include <stdio.h>
int main() {
printf("Hello World");
return 0;
}
while having no idea what 'stdio.h' is?What a time to be alive. Actively choosing to rebuke knowledge because "what the fuck does it matter anyways"
The process of "going through the motions" of writing and compiling a program without even a small understanding of what it all meant was a later innovation, perhaps done as a classroom exercise in an introductory CS course for impatient freshmen or similar.
By that I mean, it's fabulous for taking the input I give it, processing it, and returning a collection of tokens that it has found in its training data that do what is being asked.
It's regurgitating fragments of prior work - I have zero complaint about that, just as a developer you now need to understand what those fragments combined do, and whether that really fits with your actual desire - or not.
To put it into old people's terms "You got the answer from Stack Overflow? Was that the code from one of the answers.... or the question?"