Is this why I find myself awake at night reading papers about The Foundations of Mathematics, Quantised Inertia or Squeezed Light (for some random examples taken from my history). I've been writing C++ for "too long" now and subconsciously my intellect is grooming me to move into something else?
Great article. Sums up a lot about how I feel about programming as I get older (and what I hear older programmers saying). Having to consume and retain so much complex mind garbage every few years just to still be told what to do gets pretty old.
But the one thing I still enjoy about programming, after all these years, is being in the center of a number of concerns and having to negotiate them all, while still delivering something of value on a fixed time frame. There's a certain thrill to seeing the legislative, executive, and judicial branches of a huge process converge on one person, even it's for the tiniest moment about minutest of details, and have that person be you. Simply because no one else thought of some important problem, it fell into your lap and suddenly you were responsible for solving it, and you had to think on your feet. Then you get to explain to everyone else what you did, why you had to do it, and what the plan is going forward, and no one has any option but to nod their head and say, "Hey, thanks! Good job!"
There's a certain type of engineering mindset that sees this as a failure of process, and likes to hand out blame for letting such power fall through the cracks into the hands of a random developer. But to me, it's become the only fun aspect of the whole occupation. If it happens to me once a year, it's the highlight of my job for that whole year.
I'd argue that there are essentially two problems in computer science:
1. Math.
2. Dealing with the hardware.
Virtually all the ugliness is a product of the interface between these two areas. Dealing with the hardware requires a fascination with minutiae and imperfection, while working in Math requires a fascination with generalities and perfection. The people on the math side create systems like Haskell, which let you express very abstract concepts, and reason very generally about your code, but make dealing with hardware issues difficult. The people on the hardware side use things like Forth, which is very powerful for building code that works closely with the hardware, but whose paradigms actively discourage the generality present in many other languages.
And so, what's needed is someone who can develop a system that can fully express high level math concepts in such a way that there is a straightforward mapping to the messy world of hardware capabilities.
However, I think the "killing blow" for pure programmers' motivations comes when they realize that mapping between the pure world of math and the messy world of hardware isn't enough. The focus on "end users" is the tacit admission that even if you do successfully build a beautiful system, most people don't want to work at a high level of mathematical abstraction. If you really want to revolutionize computer science, in order to accomplish the actual revolution, your system needs to be able to let people work in the terms they're already comfortable with:
(messy world of existing programming languages) -> (your pure math) -> (messy world of hardware)
But I don't think these hurdles constitute a "great filter" in the sense of the original article. Its just a quirk of human nature that the people interested in the pure math bit in the middle tend to find the messes on either side tedious and unnecessary for their insights.
What essentially ends up happening is that the people who are only concerned with intellectual satisfaction get such a big dose of satisfaction from the pure math in the middle, that they never bother with the messy bits on either side. So I've found that the people who do the most impressive work have some external-to-computer-science itch they're trying to scratch. People like Christian Schafmeister[1] whose chemistry aspirations led him to create a new Lisp to glue together C++, Mathematica, Maxima, and Fortran in such a way that he can highly efficiently express and compute the math he was trying to solve. These kind of people fight through the messy world of existing languages to express the pure mathematics of their field in such a way that it can run efficiently on the messy world of hardware.
> We all accept, to a greater or lesser degree, that the end user of our work is the one that matters. In theory. In practise most programmers have a mix of dread and revulsion for the user. Even when the user may be a future self. Look at Dahl’s language in this supposed paean to the user.
>> “The users - the one who just want to see a webpage - don’t care.”
> Yeah users. Those passive consumers of stuff. How he loves them.
I don't think you've got this right, here. When Dahl says that users don't care about those things, he's not insulting users. It's true, they don't care about those things. But that's not a criticism; why should they care about them? They've got their own things to worry about, their own concerns and goals and none of them are served by having to care about the morass that we've created. You're reading it as "users don't care because they're too stupid to know that this stuff is important", Dahl meant it as "users don't care because how dare we waste their time with this shit?"
I think a more descriptive, more accurate, less catchy phrase would be "The stakeholders - the ones utilizing the results of your software - don't care how the results are created as long as they're easily accessible, accurate and timely. And don't forget, developers are users too, often the way something is written or the way it behaves at a lower level is actually important to them."
I'm definitely guilty of stretching a point. He probably is not insulting users. Your interpretation is likely the more accurate one.
But the key thing I was reaching (or stretching) for is that my reading of his text is that he really wasn't worrying about users - he was just struggling to figure out why he hated something he'd obviously had a lot of affection for previously.
To me it's a progression that makes a lot of sense, for the reasons I outline in the blog post. But of course it is just a hypothesis.
There are different types of users, and that is why the original user argument is strange.
On a large project, every programmer is a user, every engineer, stakeholder, analyst, tester, service desk guy, hundreds of people, all with different powers on the final system.
That is why we build all those complexities - different aspects for different target groups.
> But hacking on systems that are being used in production? Why would an intelligent person would want to spend time fighting with 30 years of someone else’s errors and accumulating a vast store of arcane and ultimately worthless knowledge?
How about: because that intelligent person is paid at 2 to 3 times as much as an academic working strictly on original ideas, and $Infty$ more than a hobbyist working strictly on original ideas.
That work doesn't preclude them from having intelligent hobbies, and side projects that may well outstrip those of the impoverished academic or hacker.
10 comments
[ 619 ms ] story [ 992 ms ] threadBut the one thing I still enjoy about programming, after all these years, is being in the center of a number of concerns and having to negotiate them all, while still delivering something of value on a fixed time frame. There's a certain thrill to seeing the legislative, executive, and judicial branches of a huge process converge on one person, even it's for the tiniest moment about minutest of details, and have that person be you. Simply because no one else thought of some important problem, it fell into your lap and suddenly you were responsible for solving it, and you had to think on your feet. Then you get to explain to everyone else what you did, why you had to do it, and what the plan is going forward, and no one has any option but to nod their head and say, "Hey, thanks! Good job!"
There's a certain type of engineering mindset that sees this as a failure of process, and likes to hand out blame for letting such power fall through the cracks into the hands of a random developer. But to me, it's become the only fun aspect of the whole occupation. If it happens to me once a year, it's the highlight of my job for that whole year.
1. Math.
2. Dealing with the hardware.
Virtually all the ugliness is a product of the interface between these two areas. Dealing with the hardware requires a fascination with minutiae and imperfection, while working in Math requires a fascination with generalities and perfection. The people on the math side create systems like Haskell, which let you express very abstract concepts, and reason very generally about your code, but make dealing with hardware issues difficult. The people on the hardware side use things like Forth, which is very powerful for building code that works closely with the hardware, but whose paradigms actively discourage the generality present in many other languages.
And so, what's needed is someone who can develop a system that can fully express high level math concepts in such a way that there is a straightforward mapping to the messy world of hardware capabilities.
However, I think the "killing blow" for pure programmers' motivations comes when they realize that mapping between the pure world of math and the messy world of hardware isn't enough. The focus on "end users" is the tacit admission that even if you do successfully build a beautiful system, most people don't want to work at a high level of mathematical abstraction. If you really want to revolutionize computer science, in order to accomplish the actual revolution, your system needs to be able to let people work in the terms they're already comfortable with:
(messy world of existing programming languages) -> (your pure math) -> (messy world of hardware)
But I don't think these hurdles constitute a "great filter" in the sense of the original article. Its just a quirk of human nature that the people interested in the pure math bit in the middle tend to find the messes on either side tedious and unnecessary for their insights.
What essentially ends up happening is that the people who are only concerned with intellectual satisfaction get such a big dose of satisfaction from the pure math in the middle, that they never bother with the messy bits on either side. So I've found that the people who do the most impressive work have some external-to-computer-science itch they're trying to scratch. People like Christian Schafmeister[1] whose chemistry aspirations led him to create a new Lisp to glue together C++, Mathematica, Maxima, and Fortran in such a way that he can highly efficiently express and compute the math he was trying to solve. These kind of people fight through the messy world of existing languages to express the pure mathematics of their field in such a way that it can run efficiently on the messy world of hardware.
[1] https://www.youtube.com/watch?v=8X69_42Mj-g#t=17m25s
>> “The users - the one who just want to see a webpage - don’t care.”
> Yeah users. Those passive consumers of stuff. How he loves them.
I don't think you've got this right, here. When Dahl says that users don't care about those things, he's not insulting users. It's true, they don't care about those things. But that's not a criticism; why should they care about them? They've got their own things to worry about, their own concerns and goals and none of them are served by having to care about the morass that we've created. You're reading it as "users don't care because they're too stupid to know that this stuff is important", Dahl meant it as "users don't care because how dare we waste their time with this shit?"
But the key thing I was reaching (or stretching) for is that my reading of his text is that he really wasn't worrying about users - he was just struggling to figure out why he hated something he'd obviously had a lot of affection for previously.
To me it's a progression that makes a lot of sense, for the reasons I outline in the blog post. But of course it is just a hypothesis.
On a large project, every programmer is a user, every engineer, stakeholder, analyst, tester, service desk guy, hundreds of people, all with different powers on the final system.
That is why we build all those complexities - different aspects for different target groups.
How about: because that intelligent person is paid at 2 to 3 times as much as an academic working strictly on original ideas, and $Infty$ more than a hobbyist working strictly on original ideas.
That work doesn't preclude them from having intelligent hobbies, and side projects that may well outstrip those of the impoverished academic or hacker.