I don't really see the point of focusing on software in particular before answering the general question. It's not being used to bring any special insight, and to my eye it's a false narrowing that makes it harder to answer.
> What this means of course is that programs are eternal unchanging things. We don't create programs as much as discover them.
This is a hell of a claim to pull out of nowhere.
I disagree that sentence 1 implies sentence 2.
And calling it a "fact" in the next sentence is bold!
Probably not school algebra, but what mathematicians do.
>Basically nothing here is specific to software. You can talk about a piece of writing exactly the same way. Even the part about patching; lots of books have revisions.
>I don't really see the point of focusing on software in particular before answering the general question. It's not being used to bring any special insight, and to my eye it's a false narrowing that makes it harder to answer.
I agree with the substance of this remark (the OP is indeed a general information-theoretic observation), except for the part where it's framed as a negative value judgement against the initial work.It seems like this feedback could be trivially recopywritten in a way that elevates, rather than denigrates.
--
One thing that would seem to bear mentioning is that software seems to be highly compressible. Indeed, good software seems better represented by the path, rather than the current state. An analogy here would be chess, where a state can be represented by the sequence of moves or the current board state. The analogy isn't perfect, eg since in chess the board state tends to reduce information over time. I would expect, for software, when the (dead-end pruned) sequence representation exceeds the information content of the current 'board' state, that's when you know it's time for a refactor.
If you cut my comment down to "This touches on fundamental philosophy." you could turn it into minor praise but you'd have to throw out the rest.
1. It is possible to define "programs" as an immutable abstraction, much like how "123+456" exists even if I decide not to do the calculation. In this view, we don't mutate our programs so much as we pick a different one to execute instead.
2. We create formal programs in code in response to discovering informal "programs" implemented in people.
Number 2 seems overly dismissive of the work of crafting the informal version.
Software - in the broadest sense - then is a description of how to configure a computer to achieve a certain input output behavior. It exists as a continuum of abstractness, from the idea in ones head, over the specification in a Word document, to the source code on GitHub, and the compilation result for a specific architecture on a flash drive. It is substrate independent, you can have the source code in your mind, store it on disk, or you can print it out. It is quite malleable, you can change it quite a bit without substantially altering it, at least at the more abstract end of the spectrum.
Where you draw the boundary between Windows 7 and not Windows 7 seems pretty arbitrary, that is just a label. Is the concept in your head already Windows 7? Maybe. How many changes are you willing to do before you decide to call it Windows 8? Arbitrary decision. Does an added comment in the source make a new revision? If you want to. There will always be some tension between the abstract description of what Windows 7 is supposed to do and the concrete implementation of that ideas - including details like the formatting of the source code - and I do not see that we have to gain much be trying to precisely define where the borders are. That seems like trying to nail down where blue turns into green.
Speaking of the broadest sense. An obligatory quote from Dijkstra: “Computer science is no more about computers than astronomy is about telescopes.”
While this view is often intuitively persuasive and reasonable, I think we should be careful with it. While you could argue that social constructs are by definition constructed by the beliefs of everyday folk, sometimes our everyday beliefs really do turn out to be fundamentally incoherent. In other words I believe that ontological error theories can be correct and/or persuasive.
In any case, people interested in this might enjoy reading the SEP page on computer science, which includes a section on the software/hardware distinction and the ontology of software more generally: https://plato.stanford.edu/entries/computer-science/
-- Software is 5th form of ~life-invented knowledge-storing/representing-medium - the previous ones being DNA, brain, hardware, books.
Which IMO, is exactly what it is. Whether its gigabytes of code or algorithm/structure written on napkin.. all the same.
[0] https://cacm.acm.org/opinion/the-five-orders-of-ignorance/
[1] http://www.amazon.com/Laws-Software-Process-Production-Manag...
The words "Napoleon Bonaparte" have a referent in the real world, just not in the present - does Napoleon Bonaparte exist? Usually we instead say he "existed".
Incidentally, this is why I agree with the author that criteria 1 and 4 aren't actually necessary for non-existence of a piece of software. Even if lots of people, authors or otherwise, remember a piece of software, the software is gone once it can no longer be said to be used anywhere. In that case we would say that the software "existed".
We can have an SSD with Windows on it, and we could refer to that as software colloquially, but it cannot be properly checked until you run it inside of existing software like a BIOS. So until you execute and run it it's really just information on a storage medium.
All the contexts are nested aggregates: software resides within the OS (itself having/providing many contexts), which is within the hardware's complex set of contexts, which is within the network of networks.
So, I would say there's nothing really abstract about software systems, except for, perhaps, when we are conceptualizing them, but even then we are imagining something very real that does something very concrete to some real things.
One could also look at the software itself, while latent, as potential dataflow; and then, when it runs in its appropriate context, it is an active agent of change, that may or may not be actually accomplishing its goals, depending on its and its contexts' circumstances at the time.
There are many reasons developing software is the among the most difficult tasks in the history of human tool engineering. The evidence for that is that there is no industry that I know of in 2024 that is not wholly dependent upon software.
Seems reasonable to believe the thing happening due to the instructions is on another level of “abstract artifact” corroborating the point despite semantic nuances.
> Seems reasonable to believe the thing happening due to the instructions is on another level of “abstract artifact”
Well, yes. Thing happening due to execution of instructions is typically[1] not those instructions.
> Or as another commenter said, the runtime execution?
Software is a list of instructions. Runtime execution is a process (of executing those instructions). What do you mean by your comment?
Are stories just ordered words?
Software is an Artifact as much as common pressed plastic chair is an Artifact. There are millions of copies of that chair, and there are millions of copies of that software. If you can point to every copy of the chair, then why can't you point to every SSD/HDD/RAM containing a copy of software? This doesn't make sense to me. Abstract Artifact is too broad of a category to define software, as software's primary function — executing tasks or facilitating processes — extends beyond mere physical existence.
Depending on their background and the kind of company, other things could be substituted, like "the long-term contracts with our suppliers", or "our rules for billing and customer retention" or "do a complete re-org of who-reports-to-who."
Basically, find something which that manager would never consider trivial to change because it requires running around somehow changing the expectations, opinions, and habits of lots of people, as well as getting all those intangible soft-things into a new harmony.
Found a bug in your hardware? OK this is trickier...
It’s not called software because it’s easy btw, it’s because it can be changed at all. The comparison is physical circuits (hardware).
It’s taken me a lot of years to get that figured out. Heh.
After decades of loving the craft of crafting ever larger software systems, I've settled down to this description of what we devs actually produce:
Our fundamental spacial unit is "Information Representation". Yeah, that means data with its explicit semantics supplied by a type system. Whether amorphous (Python) or mostly concrete (C/C++) or whatever else, those are the bricks we use to construct our systems, because that is what our microprocessors are actually manipulating, by hook or crook.
What our software does temporally is to "Integrate" that data. Sometimes, it's character values coming in as input, with command-line functionality as output -- e.g. OS command-line commands. Sometimes, it's web-service requests coming in, and db accesses going out, with a lot of semi-permanent state being held in session data somewhere and a mostly-permanent database data somewhere. Regardless, the {input, state, output} is the spacial dimension being integrated in our logic. And note that "in and out" are the same as "call and response" in this description; the real idea is "How does the data flow, and what is the source, and where are the destinations?"
Of course, there are different temporal dimensions to our dev work: design-time, test-time, build-time, deploy-time, run-time. Each project has its own needs, so, just like advanced maths, we combine our integrations hierarchically to build up the entire system.
The coup de grace is the overarching notion, the "Engine".
Before real-world engines are used, they are designed, tested/verified, and planned for being assembled in production.
Once constructed, engines are prepared, tested, delivered, started, run while being manipulated/tweaked, and then they finish either by choice for maintenance or because their task is finished or because they failed. That's the cycle of use.
It doesn't look like our industry is very mature in how it approaches software systems as engines, especially with respect to maintenance. It would help if we understood that the fundamental unit of time is change, which is all that ever matters in the entire universe, but most especially in our software systems.
With AI, the new evolution in software is to skip the "telling what to do" part and directly specifying the goal - "telling what to get done" and let the system figure it out.
Not exactly. Writing software has always been "telling computers what to do". Using AI to do this doesn't change much. In the very early days (after CPUs were invented), you told the computer what you wanted to do with CPU instructions directly, so you had to figure out how to manage memory and all other tedious things needed to get your program to work. Later, higher-level languages were developed to abstract the complexity of the hardware away, so you could tell the computer what you wanted in higher-level terms without so many low-level details. An AI tool just takes this to another level.
The possibility of pure goal-oriented systems are at an inception now. So it's a totally different game, different mechanisms, and so on.
Thinking the user of AI can just spec a goal and then the AI automagically produces perfect results is just the pipe dream of the lazy who won't ever have a clue about how to verify the resulting system, much less the system that produced it. Good luck with that!
Software is about 100% correctness, which is damn-near impossible. And when it fails, it will fail at the worst time and in the worst way possible. It's just a matter of when, not if. We can't even remotely do that (for nontrivial systems), but we're gonna make a machine that can do it?!
Shhheeeeeiiiitttttt.
- For the past 50+ years, really intelligent people, including Turing award winners have believed in this dreams - In fact, getting computer to solve problem on their own is the more intense path IMHO. The lazy path is sitting content with the way things are.