Hacker News new | ask | show | jobs
by gorgoiler 1401 days ago
This seems on the right track. On the notion of ”programming is a tool to solve problems that you have in the domain of computers” though:

Writing a computer program serves two separate purposes: to communicate a set of functions to the machine, but also to communicate the purpose of these functions to a human. The former is for execution and the latter is for code review and, later, debugging.

Any old clown can get a computer to do something approximating a solution to the problem at hand. If it has bugs then the author — or more likely some other poor sap down the line — will be on the hook to first understand the intent, and then make the code match the intent.

In a professional shop you will have code review where this “debugging” step happens first. Your reviewer will read your code to infer your intent and upon agreeing with that, check your style and composition for inconsistencies or lack of clarity.

To that extent, a large codebase is akin to a mathematical proof where each new module and function represents a lemma on which the final proof depends. No serious scientist would present their thesis without a progression of isolated and carefully laid out lemmas and corollaries, and no serious programmer throws up a thousand line function with 15 arguments, global state, and — if in a dynamic language like Python — inconsistent return types.

Your code is a proof to your reviewer that you are on the right track. The fact that it happens to execute without bugs and produces the correct output is far less important than the code being readable, comprehensible, and consistent as part of the larger system.

5 comments

> The fact that it happens to execute without bugs and produces the correct output is far less important than the code being readable, comprehensible, and consistent as part of the larger system.

It's more important that a function looks good, than that it actually works?

I'm sorry, but that sounds stupid. A computer is a functioning machine first.

If it worked from the start, it wouldn't need to be fixed later.

You can always study someone's work to figure out how it works. There's no point studying a system that doesn't.

> If it worked from the start, it wouldn't need to be fixed later.

True. But you ignore the fact that NO SOFTWARE IS EVER DONE. Software always has bugs, and even if it didn't, it will bitrot as the business needs change.

In theory, it's better to have 100% working software. In practice, that never happens (or only happens for a few weeks at best). Eventually the software needs to be changed. In that case, software that is "written for humans" will always be easier to change than "software that used to work, but now we need to change it, but nobody understands it".

SOFTWARE CAN AND SHOULD BE DONE. Complicated and bloated systems are never done, but not every system (program/tool/etc) needs to be big, bloated, ugly and complex. It does not matter if the software is 'written for humans', if it's too complicated it won't be changed and/or fixed ever (basically)

On that note, Zawinski's Law:

“Every program attempts to expand until it can read mail. Those programs which cannot so expand are replaced by ones which can.”

This is mostly true, but it does not have to be. :(

  "Software is never rewritten. Projects last longer than expected; programmers get bored or burned out; management moves on the newer challenges. The attitude of ‘good enough’ reflects reality.

  Instead of being rewritten, software has features added. And becomes more complex. So complex that no one dares change it, or improve it, for fear of unintended consequences. But adding to it seems relatively safe. We need dedicated programmers who commit their careers to single applications. Rewriting them over and over until they’re perfect. Such people will never exist. The world is too full of more interesting things to do.

  The only hope is to abandon complex software. Embrace simple. Forget backward compatibility." - Chuck Moore
> We need dedicated programmers who commit their careers to single applications. Rewriting them over and over until they’re perfect.

I love this.

Pseudocode is the easiest to change, but also literally does nothing.

Software in practice needs to run to classify. Without that it's just a .txt file that won't compile.

Otherwise you're talking about a standard, a protocol, a document with no program. Instructions for humans how to program computers.

> True. But you ignore the fact that NO SOFTWARE IS EVER DONE.

that is just false. I've seen plenty of one-use software - made specifically for trade shows, exhibitions, etc. which were never reused again because the entire software was the logic specific to that particuliar exhibition.

there is also a few thousand gigabytes of old game ROMs and abandonware on the internet which are all perfectly done software.

All things being equal in code correctness: the preference is cleaner parseable (by humans) code, as opposed to for example: having a while(true) loop with no exit condition, no way to get out of said loop - and have the code work perfectly exiting the loop due to esoteric features that take weeks to figure out, and are brittle to system changes (no code is static).

So yeah: code readability becomes the deciding factor for both what to accept: and what will be (most importantly) the most efficient use of development hours on fixing…

Or a better way of putting it… We are monkeys that bribed rocks and copper to think for us with electricity: design code and systems that even a monkey could maintain.

> I'm sorry, but that sounds stupid. A computer is a functioning machine first.

It is not stupid - just counter-intuitive, which should give us a pause to think. You say, "A computer is a functioning machine first" - yes - but consider why SICP says, "Programs are meant to be read by humans and only incidentally for computers to execute." (see a discussion on the quote https://news.ycombinator.com/item?id=16431701).

> Programs are meant to be read by humans and only incidentally for computers to execute.

A silly thing to say while sitting at the top of the tower of abstraction, ignoring the fact that programs that actually work provide the foundation for the entire system.

Computer programs were originally intended for humans. Entire office buildings of humans with the job title "computer" would examine paper documents and carry out instructions therewithin.

Your linked quote talks about efficiency and style of code, which is a far cry from "execute without bugs and produce correct output" - an unavoidable necessity for a functioning computer.

Software spends a significant amount of its lifecycle in a state of "not done" and/or "not working". The possibility of getting software to "done" or "working" hinges critically on the ability of a human to read, understand, predict, and change that software.

Once the software is done, sure, throw away the source code entirely (if you dare).

Author of the article here:

I highly recommend reading the previous article to this one posted (Pragmatism in Programming Proverbs) to get a better understanding of what I am expressing, since "The Essence of Programming" is a sequel to that article. I originally wanted to write the previous article in normal prose article, regarding the topic of "Pragmatism in Programming", however I thought I’d experiment in style by writing in a proverbial style.

> The fact that it happens to execute without bugs and produces the correct output is far less important than the code being readable, comprehensible, and consistent as part of the larger system.

I partially disagree with this. If the code executes without bugs (very rare) and produces the correct output, then that code solves the problem. The next task is to make it readable, comprehensible, and easy to maintain whilst not trying to introduce other bugs.

I recommend reading Casey Muratori's article on "Semantic Compression" https://caseymuratori.com/blog_0015

This article is a good overview of the idea I am trying to express in this reply. It's very important to get things working BUT then actually improve it, don't just stop there!

sorry, going to have to go with a joe armstrong truism here -- make it work, then make it beautiful, then if you really must, make it fast. note the order of the first two

a large codebase is akin to a mathematical proof iff you are using something like an lcf/λc environment; the curry-howard isomorphism does not yield meaningful programmer-level insights about the average monad transformer lens abomination implementing a rest api endpoint

mathematicians do not have to worry about dependency hell in their proofs, or whether they should be importing wiles's proof of fermat's last theorem at version 3.8.21-rc2 or -rc3

if i write a window manager, its source does not primarily function as some indication that i am on the right track to competently wrangling the x11 protocol, unless i am trying to impress a headhunter from red hat. it is, in fact, primarily meant to produce a program that competently wrangles the x11 protocol. making the code clean and sensible is akin to the courtesy demonstrated by not rendering the blueprints to an air conditioner in chicken scratch with a crayon, and ensuring that part sheets are easy to follow to the assembly

framing code as in the service of the reviewer or debugger takes what is a self-evident prerequisite for getting anywhere, and promotes it to a counterproductive mind game

“oh i'll break this function out into multiple that are called exactly once, even though all that does is make the reader scroll a bunch to follow the logic, because i know jeff is gonna get this one, and jeff is a cargo cultist who thinks robert martin is the second coming of christ”

> Any old clown can get a computer to do something approximating a solution to the problem at hand.

in my experience, far more clowns are capable foremost of endless bikeshedding -- they adore giving off the impression that they are contributing something to the effort, and in the absence of insight, they substitute a performance. “hah, bet you're glad you had me to tell you to write every item in this array on its own line” (the items in question are numbers averaging two digits)

yes, code is for human beings to read, but experience has made me wary of anyone who shows up to passionately insist to that effect

I prefer Kent Beck's version:

> Make it work, Make it right, Make it fast

Very nice. For the jobbing engineer, no one should ever see your code until after step two.

Make it work, [take a break], Make it right, [push it for code review, gather feedback, make changes, push to master], Make it fast.

I disagree. A program is meant to produce useful output. Yes it should be written well (code clarity is a very strong correlator to the validity of a program), but the primary goal is that it should work.
You're channeling Dijkstra (who famously didn't even have a computer until his colleagues forced him to get a Mac so they could send him email.)
certainly an intriguing case, Dijkstra. I smell pedantry...but I could be wrong. A person so deeply involved in CS and not having a computer??? That's like saying being an expert cook but not wanting to taste food.
> A person so deeply involved in CS and not having a computer???

I looked for a reference just now and couldn't find one. This mentions it:

> Dijkstra was famous for his general rejection of personal computers. Instead of typing papers out using a word processor, he printed everything in longhand.

https://www.mentalfloss.com/article/49520/retrobituaries-eds...

> That's like saying being an expert cook but not wanting to taste food.

Oh ho! Don't let him hear you say that, eh? You'd get a scolding. He's the one who said, "Computer science is no more about computers than astronomy is about telescopes" and "Calling it computer science is like calling surgery knife science."

The analogy would be more like "an expert chef who refused to eat frozen dinners" maybe? :)

The difference as I see it: computer science (sorry, "informatics") is a mathematical discipline, and hence tends to concern itself with, out of a given class, the minimal (and maximal, when existent) object(s). Programming is an engineering discipline, and hence tends to concern itself with, out of a given class, the intervals within that lattice that are optimal by some suitability function.

In principle, the suitability function would be evaluated over the entire lattice; in practice, that function, whether explicitly or implicitly, includes a strong weight for "distance from existing solutions". In either case, this split in focus between the interior and the boundaries of the solution space means that programmers are often highly concerned with specific details that do not even appear (because they have been abstracted away) in the objects with which informaticians work.

As an example: theory people love to use 1-ary trees (induction steps cost nothing in proofs, but cases are expensive) and they will use 2-ary trees (sometimes even without pressure to sympathize with the machine) but systems people and programmers use k-ary trees (where, if it's been determined by measurement and not by compatibility, k depends upon "the" bandwidth-delay product between the storage hierarchy levels for which the tree is optimized ... or at least what the bandwidth-delay product had been at the time of writing).

So well put! I bow.

- - - -

FWIW, when I was poking around last night looking for references for the "forced to get a Mac" story I found this.

Tony Hoare:

> The first time I visited Edsger in Eindhoven was in the early Seventies. My purpose was to find out more about the THE operating system, [Dijkstra, May 1968.] which Edsger had designed. In the computing center at which the system was running I asked whether there was really no possibility of deadlock. "Let's see" was the answer. They then input a program with an infinite recursion. After a while, a request appeared at the operator's console for more storage to be allocated to the program, and this was granted. At the same time they put a circular paper tape loop into one of the tape readers, and this was immediately read into buffer file by the spooling demon. After a while the reader stopped; but the operator typed a message forcing the spooler to continue reading. At the same time even more storage was allocated to the recursive program. After an interval in which the operator repeatedly forced further foolish storage allocations, the system finally ground to a complete halt, and a brief message explained that storage was exhausted and requested the operator to restart operations.

> So the answer was YES; the system did have a possibility of deadlock. But what interested me was that the restart message and the program that printed it were permanently resident in expensive core storage, so that it would be available even when the paging store and input/output utilities were inoperative. And secondly, that this was the very first time it had happened. I concluded that the THE operating system had been designed by a practical engineer of high genius. Having conducted the most fundamental and far-reaching research into deadlock and its avoidance, he nevertheless allocated scarce resources to ensure that if anything went wrong, it would be recognized and rectified. And finally, of course, nothing actually ever did go wrong, except as a demonstration to an inquisitive visitor.

https://history.computer.org/pioneers/dijkstra.html

People don't do computer science for the mere theory of it. In the end, CS should yield utility--solve problems in the real world and those problems are solved through the medium of computers.

There is a reason it is called COMPUTER science while astronomy is not "telescope science". The analogy is faulty as well:

>> "Computer science is no more about computers than astronomy is about telescopes":

You can't compare astronomy to CS--astronomy needs both computers and telescopes and spaceships--but in CS, the computer is the central figure. If not, can you think of ANY other tool that represents CS?

>> "Calling it computer science is like calling surgery knife science." is another faulty analogy. The knife does not have the same amount of critical importance both as a mean and an end in surgery, as does the computer for CS; in other words, a knife is merely a means to an end in surgery, but in CS, the computer is both the mean and the end: in the latter case, the computer is a sort of representative of all the knowledge and practice in CS, in a given time. The sophistication of the computer and what it can do, represent, to a large extent, what we have achieved in CS--but you can't say the same about a knife vs. surgery. Capisch?

First of all, you're a brave man going after Dijkstra. Even two decades in the ground he's still going to win this argument.

The domain of astronomy is the starry sky and the Universe it reveals. The domain of surgery is anatomy, physiology, metabolism. In Informatics (not everyone calls it "Computer science", eh?) the domain is formal systems.

In each case the instruments (telescope, scalpel, digital computer) are not the main focus of investigation, they are tools, not the domain of study.

> the computer is the central figure

This is precisely the misunderstanding that Dijkstra tilted against.

> can you think of ANY other tool that represents CS?

Yes. The human brain.

I'll leave you with another joke, one of my favorite, although I don't know who said it, "Computer science could be called the post-Turing decline in the study of formal systems."

Considering how it were the Greeks that prevented Calculus from being discovered for 2000+ years, I would rather err on the side of Descartes and Leibnitz and still ask questions like these.

I think you mistake my using the term "computer" for the machine that everybody is using nowadays--but that is just an instance of the Class of computers. The ultimate goal of formal systems is making better Class of computers that should solve real-world problems more efficiently (any other formal systems digression into logic and linguistics always boomerangs back to machines).

Consider how Bayesian probability was looked down upon for decades before computers became powerful enough to reveal how the academic world was wrong about dismissing it--big names from the Frequentist school, just like EDK is in CS....

Even if you still disagree--which you will--there is no denying the fact that not using technology when you ARE an expert in the said technologies is rather odd, and perhaps a bit silly. Have you seen astronomers shunning mathematics? Math is a tool that simplifies a great deal of issues not ordinarily possible with a "naked" mind. So does the computer (as an instance of the computer Class); that someone did not even want to use a typewriter let alone a computer is bewildering to me.

> People don't do computer science for the mere theory of it.

Are you sure? If I were to pick any arbitrary computer scientist (even stipulating it won't be EWD himself, this would still be "demonic choice", from your point of view), are you prepared to argue that whomever I pick does/did not do cs for the "mere" theory?

Exercise N: Was Euclid's GCD doing computer science?

Exercise S: Is watching TikTok doing computer science?

Hint: Gurfr dhrfgvbaf ner zrnag gb vyyhfgengr gur fhssvpvrapl naq/be arprffvgl bs pbzchgref gb qbvat pbzchgre fpvrapr.

Yes, very very sure, but let me clarify.

When I say "don't, I mean "should not", but if they do, hey, that is what pedantry is for isn't it?

Exercise Q: Is doing theory for the sake of theory not ultimately about better theories that, in the end, should always yield utility in the real, applied world of computers solving hard problems?

Answer N & S: Yes, in a way, but it still, ultimately has sth to do with computers. Re TikTok I am not sure how you classify "watching". It can have something to do with CS and therefore computers in the sense that the original Tiktok source-code is written ON A COMPUTER--and when users watch Tiktok, the real data is analyzed ON A COMPUTER.

I don't think you can do astronomy without telescopes: they are the basic ingredient. :)
I don't mean to be lame, I see your smiley, but c'mon, it's like you're not even trying... People were doing astronomy before the invention of the telescope.

And historically most of what we call computer science was developed before the advent of the computer. Turing, Church, Boole, Quine, Haskell Curry, etc. Wittgenstein, Russell & Whitehead (Principia Mathematica), etc. I could list names all day, none of whom used a mechanical computer.