I also think this is way off base:
> It means that the code base we create is not the true product of our work. The real product is the mental theory of that code base which
This is manifestly not the case. The value of computers is that you can write code once, and the computer can execute it repeatedly ad infinitum. As a programmer, your mental theory of the code base has value to its owners, but it's not the product. The code base is also not the product. The product is whatever output is created and consumed by the relevant stakeholders.
If you lost all of the code today, with the right understanding you could build it again relatively quickly. If you lost all that understanding, say all the developers quit, the program will no longer be adapted to customer needs potentially for years until that understanding is rebuilt.
I agree that "product" is probably not the right word, probably "asset" fits better. Losing that knowledge is like losing a manufacturing plant for your product. The plant isn't the product but it's a key asset for producing the product.
At a micro level, this helps articulate why rewriting/refactoring a feature just after writing the first version of it is so quick, relatively. And why it is often easier to write better code in a second pass. The first time you had to build the theory AND the code at the same time. In subsequent passes, you have the benefit of the theory from the start.
I think this concept is self-evident to most experienced engineers, but I have not heard quite as succinct an articulation of it before.
Yes, but it has nothing to do with the codebase. There are 10,000 ways of building the same product with entirely different codebases.
I don't think it's uncommon for parts of the theory already enshrined in implementation to be forgotten to time as it passes, if it's not regularly revisited and cogitated on.
That reminds me of a comment on HN that I had to bookmark when I read it:
> Some processes try to break conceptual integrity. Micro services are one but Scrum as practiced usually tries to stick people into a blind valley where the horizon is months out rather than years. That leads to bad minmaxing behaviors, and/or covert channels being used to keep the wheels on.
> The value of computers is that you can write code once, and the computer can execute it repeatedly ad infinitum.
Until something changes and you need someone with a sound theory of the system to work out in a timely manner why it stopped working and how to get it working again. Bonus points for figuring out that this will happen again and that "running code" is not the product, the ability to keep the system running and evolving by changing code efficiently is.
have a look at Phillip Armour's "The Laws of Software Process: A New Model for the Production and Management of Software, 2003" it talks about Software as knowledge medium, and effects thereof.. an attempt to put them things with their legs down, not up.
... software is not a product but a medium for storing knowledge, and software development is not a product-producing activity, it is a knowledge-acquiring activity.
... the real job is not writing the code, or even building the system - it is acquiring the necessary knowledge to build the system... Code is simply a by-product of this activity. The problem arises when we think the code, rather than the knowledge in the code, is the product.
... When we use models and mindsets that are rigid and deterministic to manage an activity that is fluid and variable, it is not surprising that people get disappointed.
and a consequence:
"... for the most part, (software) engineers do not _know_ how to build the systems they are trying to build; it's their job to _find_ out how to do it." i.e. programmers must be able to learn (and teach) - should learn that and/or be taught to it. All else are tools supporting that activity.
Absolutely true.
It is also true of all other disciplines of Engineering. The difference with Software Engineering seems to be that there are no Physical/Natural laws/constants to inform the Programmer of explicit boundaries/limitations and hence a stopping point.
until, of course, someone updates a library that your code depends on or the OS changes the way it executes code or some other arbitrary change happens and your code is broken forever.
Ok, let's use that word above since the article uses it as well.
In the text above word "theory" are used instead of "understanding". Not sure why. Anyway, what exactly the hell Im doing in the last 10 years supporting legacy system mostly without documentation...
This is only true of software of a particular level of complexity. For the most part, it simply isn't true. Humans made it (who also would routinely forget details about their own project) and humans can understanding it enough to build a working theory. If you can perform tests for something, you can deduce what it's doing, although the business case of why or specific experience with other approaches resulting in failures is often not recoverable by deduction.
Why, why they used word "theory" in the first place?
This historical documentation, including historical codebase (think Git repo), is highly valuable. True, a new developer without the institutional knowledge is at a disadvantage, but that's the entire point of good code and good docs: so the next devs can pick up as efficiently as possible if/when they're called in.
I’d love to hear from the original author how they think theory compares to a mental model. The biggest different is theories are known to be wrong, which fascinates me as an idea!
I have seen many pieces of code only make sense for a moment in time. The theory was right then, but wrong as the business evolved. Or sometimes visa-versa where the business was wrong, but the code worked beautifully for it.
It feels like the Sprint / Agile practices that a lot of us use lead us to value expediency more than anything. So we'll try and find the quickest way to make a change that gets an existing program to do what we want. If we lack a working theory of the codebase that usually means we're doing something that runs counter to the overall design. And then over time everything gets worse and harder.
I want to say something about the pop-ups, which to have been much more discussed than what I wrote. (UX disaster as engagement bait?)
My desire in showing was to make the site feel more “alive” and to make the reader aware that other people had been there. I was trying to build a vibe of website as public space. Clearly this was not an approach that handles hacker news traffic and attitudes very well.
Secondly, I wanted to make readers aware of how much data is visible about them just from visiting a website.
I wanted it to feel like when you land on a drop shipping site that occasionaly tells you “Alice in Norwich just bought a widget. They're selling fast!”. You slowly realise that the data is real, and that the site actually can see where you live, who provides your internet. Etc. It was meant to be creepy.
Anyway, I've removed the feature now. It was clearly causing usability issues for some people, which was not what I intended. I'll think about other, better ways to get the effect that I had hoped for.
Finally, I'll say that it was at least interesting for me to see things like
“Someone else just connected to Johncom. They're in Kansas City, US, 64121 and are connecting with Spectrum”
“Someone else just connected to Johncom. They're in Cape Town, ZA, 8001 and are connecting with airmobile.co.za”
I got to learn about some new places, postcode formats, and ISPs.
I'm curious to read more of your thoughts on podcasting as a medium. I bet my goals & tastes in creating podcasts differ wildly from your goals & tastes in listening to them. And if I can be so bold: why give our show the time of day, but not something more tightly produced (which, perhaps, stands a better chance of offering high signal-to-noise)?
In any event, Jimmy and I appreciated your post. We're thrilled whenever someone digs in to a paper we've covered and finds it meaningful.
I usually find it very hard to remain deeply engaged with a podcast. I'll be focused for a few minutes, then my focus will shift and only later will I realise that I've been passively listening - absorbing it as a form of ambience but not properly engaging with what's being said. I think this is probably true for most listeners, especially because podcasts are often used as a soundtrack for doing some other task.
When we are not fully engaged with audio I think just go along with whatever's being said. We ignore logical leaps, and then pick up the thread later. But we do, I think, remain aware of the presenter's affect towards whatever topic is being discussed.
So a lot of the time I think when we listen to a podcast all we are really taking away is “what the topic was” and a sense of whether that's a thing we should feel positive or negative about. We don't critically engage with what's being said and whether the conclusions being reached are valid.
That's a lot of waffling, but the point that I'm really trying to get to is that podcasts seem to be more a medium for transmitting vibes than for transmitting complex thought.
This would be fine if podcasts were all entertainment, but when a lot of them are about world affairs, or psychology, or whatever, then I think it leads to people listening to podcasts believing they are educating themselves but actually just absorbing memes (in the mgs2 sense) from the presenters.
So mostly I think that podcasts are just a way for people to start believing things without understanding why they believe them. The more “Produced” a podcast is, the worse this effect probably is. And people listen to them ALL THE TIME. There's probably never been a better medium for spreading disinformation. lol
ANYWAY
I really liked your podcast, and it does some things that I think alleviate the issues I have.
* It's complex enough that if I become disengaged I can't pick up the thread, so I end up just pausing / rewinding. * It's a conversation, and you as hosts don't agree a lot the time. You do some of the work of critical thinking for the listener. * The editing is very funny.
I originally gave your podcast the time of day because I was considering going to a future of coding meetup in London, and wanted to know what the vibe would be. The meetup sold out while I was listening :)
If I ask e.g. ChatGPT to just code something for me then the code it outputs is a black box, and there is no 'theory usage' in the parlance of the article. [Or I guess I'd have to recover the theory from the code it writes].
I've accepted by now that I'm putting myself at a disadvantage by not using A.I. at work however. Maybe another way to think about it would be that A.I. allows us to use our higher level theoretical understanding when we interact with codebase.
This already has a term: "derived meaning". Derived meaning is what's actually created and stored in your head, and represents your particular brain's understanding of... something. It could be a thought, it could be a procedure, it could be a memory, it could be an emotion. But it can't be transferred to other brains; you can only hope that, by communication, you can reach some form of mutual understanding that at least fits the communication.
I have had a Theory of what software is myself, mostly based on "Programming as Theory Building," but it is good to see it put into words.
I struggle to build "theory of mind," which means I can't read code written by other people.
This means I can't get or keep a software job, so it sucks.
At the same time, it is a superpower in personal projects because I can somehow document my own theory of mind. It's counterintuitive, but my inability to build a theory of mind about other people causes me to assume less about what they know, which translates into good Theory docs.
My best example is [1].
[1]: https://git.gavinhoward.com/gavin/bc/src/commit/22253a3a64db...
The thing is imo, you have a theory of mind on which you build. This building is done in a very structured way and works well for you. I believe the gist is, you have premises, eg. values of a code base, and build further on that, layer by layer.
The OP explains a pain point with sofware engineering, which also applies here: a theory cannot be fully expressed. The code and documentation flows out of the theory, they are artefacts, products of it. Still those are not encompassing the theory in itself, which in fact only exists in the originator's mind.
The job of many sw engineers is to get insights into such theories by inspecting the code and documentation, using it and approaching these from different angles. A bit like archeology.
When I launch my business, that will be an essential part of my product.
So can you give me specific feedback on that document?
https://en.wikipedia.org/wiki/Systems_thinking?useskin=vecto...
I see a lot of programmers start with an idea, and then they implement it. I prefer at least a little bit of cargo cult approach.
I don't re I start researching what tools are already out there and what others do in similar cases before I have any more than a vague idea of what I want to do.
https://gist.github.com/onlurking/fc5c81d18cfce9ff81bc968a7f...
(I think I'm the only on-topic comment so far.)
The model of the software might only encompass the specific ways in which the software is written explicitly, in order to understand how it operates in a near vacuum.
Yes, grokking code is hard, especially low level code where the WHAT to do is intertwined with the HOW.
It's an interesting observation on the reason behind something that's understood fairly well in management circles from its impact: Retention of software engineers is really important!!!
I never really had a conceptual model for the period in a project where I can't really effectively write code outside of exploratory exercises. Building a theory of the solution to a problem is absolutely the most difficult part of any project that I've worked on.
In brownfield projects I will usually start out with a manual linting pass. I read code deeply enough to understand it to a point where I feel like I can make delinting changes to it. This helps me build up a theory of the solution space that those who came before me, the act of delinting, commiting, and pushing stands as something of a mental proxy for having written the code myself.
Greenfield projects are much more difficult as you have to synthesize this theory from whole cloth rather than learn it by reading the musings of coders that came before. IMO, this is incredibly valuable as very few devs I've met have the capacity, even if they have the experience.
In many ways I think that past successes in founding companies is used as a proxy signal for this skill by investors when making a bet on a venture by tenured tech founders.
This is the reason why Domain knowledge (or access to a Domain expert) is so very important for Programmers. Without that knowledge you cannot build a "theory" and then map it to a "solution domain model".
But having this on the HN frontpage, there are tons of visitors right now and this is indeed annoying.
I feel the same about a lot of news sites that overlay the content with pop ups and ads and whatever. If the article isn’t even important to you, what am I doing here? I want my money back.
It is that bad. I did not read the page.
After the page has loaded, use “reader mode” in your browser. Most browsers have this. That shows you only the text of the post, and not the notifications on the bottom.
Or, read a copy of it here:
https://web.archive.org/web/20231118211242/https://johnwhile...
Maybe his theory of his software was that only a few people an hour might be likely to visit his site.
You should really just read the article, it’s short and good.
I expect that 99% of the time it's a perfectly fun little pop up, but right now with the post on HN it is amazingly annoying
Let’s not roast the guy too much, we’re all human and like cool stuff. This would be cool with a little more work, I think.
Also, the article is great. It puts together a definition for the theory of what software is in a succinct way. Software is code, but any specific software is an artifact of the theories in the developers brains. Makes a lot of sense to me.
If you doubt yourself so much that you think some gimmicky notifications are more interesting than the article, you’ve lost me as an audience. Why even have the content if you believe someone from Texas being on the page too is more interesting than what you wrote? If you think that, just make that. Don’t invite me to a show then halfway through interrupt your own show with something else. The idea alone gives me adhd. Stop it.
I'm sorry, I just have to laugh at the self-seriousness of this and the other negative takes in this thread.
It's a quirky little "fun" feature that shows the location of other people viewing the site, implemented on a personal blog. If you have a blog that gets a few dozen views a day, it could be neat. If you get the HN hug of death, it's extremely annoying.
The author made a mistake, but it's a minor one, and I think it hardly betrays the self doubt you seem to be reading into it. It's not like it's an auto-playing video ad.
It's a good article. I suggest powering through to use the reading mode of your browser.
Then I went to the page. So distracting. I just closed it and agree with everyone else. I'd recommend the author get rid of that.
[webpage text follows]
Even though I don't respect podcasts as an information delivery system, I recently listened to a podcast that felt like having an epiphany.The podcast in question was episode 61 of Future of Coding. It is essentially a read-through/review of two papers with which I was unfamiliar, but which I believe are actually quite famous and influential.
Why did listening to this feel like an epiphany? Well, I suddenly felt like I understood what the deal is with software. Why is it that when you join a company, the engineer who's been there for years seems like an incredible genius? Why do some teams that I've been on struggle while others manage to get everything right? Why is everyone always so keen to rewrite things?
The two ideas that the podcast expresses are:
The concept of what a “Theory” is, according to Gilbert Ryle.
That being a programmer is doing “Building theories” in the Ryle sense of the word.
Having these two ideas explained together was really helpful. If I had read Ryle by himself, I would have thought, “interesting and useless”. If I had read Programming as Theory Building without knowing the theory concept, I would just not have understood.I recommend listening to the podcast and reading the paper. But if you don't want to do that, I'm going to try and explain the two points.
strange What is a Theory, According to Gilbert Ryle?
When Ryle says theory, he doesn't mean anything like what other people mean when they say theory. Annoying. He should have just come up with a new word. What he means is the thought object that exists in our minds which allows us to do things.
I, for example, know how to cook pasta. When I cook pasta, that's a certain expression of this knowledge. When I try and explain to you how to cook pasta, that's a different expression of it. Neither of those expressions contains everything I know about cooking pasta. And in fact, there are parts of what I know that I can't really express in any way. This knowledge is what Ryle would call a theory. I have a “Theory of how to cook pasta”. This theory is not something that exists in language or action - it’s a something that we can never fully express. The closest we can get to transferring a theory is to demonstrate the expression of the Theory to someone over and over again until they build their own theory. That theory won't be the same as ours. What Does it Mean that Programming is Theory Building?
It means that the code base we create is not the true product of our work. The real product is the mental theory of that code base which:
Allowed us to create it in the first place.
Allows us to diagnose problems with it and fix them.
Allows us to modify it easily.
If I think about times when I've worked on a team that works well and gets stuff done, it's been a team where: Someone has been there for a long time, since the start of whatever code base/feature we work on.
Other team members have joined slowly, and had a chance to work with the people who know more.
The area of focus does not change. We haven't been reassigned to a random existing project, or asked to fix some other team’s work.
The paper also talks about what happens when all the people who have a theory of a given program stop working on it. It dies. Yikes. It’s claimed that we can’t rebuild a theory from code and documentation.This model explains a few curious phenomena:
What “legacy code” actually is - it’s a code base which is no longer maintained by people who have a theory of it.
The solo engineer who can make a better product than a team of equally competent professionals. The solo engineer has spent the time to build a complete theory of their program, the professionals move between projects regularly - and only have theories of what they've worked on.
Why getting up to speed with unfamiliar projects is so much harder than just rebuilding the thing. To truly build a theory, you need to mentally rebuild the existing code base anyway.