Hacker News new | ask | show | jobs
by Gratsby 3791 days ago
Phase 1: There are no bugs because strong typing, no side effects, functional nature.

Phase 2: OK, but those bugs are my own programmer errors.

Phase 3: I admit it, I have no idea what I'm doing.

Phase 4: OK, I can't even figure out what the Haskell I did two years ago was even trying to do. I was smarter then.

1 comments

As Rich Hickey says often, there are two truths that are true about all bugs:

1) They passed unit tests. 2) They passed a type checker.

Well no, a lot of bugs didn't pass a type checker because a lot of languages don't have them. And some projects don't have unit tests.
> And some projects don't have unit tests.

If a bug did not cause a unit test to fail, then it passed the unit test suite. (Less cryptically, an empty set is still a set)

If we're getting that pedantic, the quote was "they passed unit tests". If the bug passed a 0-size set of unit tests, then it didn't actually pass any unit tests.
They didn't pass any, but they passed all.

In any case, Rich Hickey probably had more context for his words.

We should take this discussion and publish it in the world-famous (and extremely popular) "Journal of the empty set." You will find most of my work published there, too. http://pic.blog.plover.com/math/major-screwups-4/emptyset.pn...
Still though, 0% test coverage.
Meh, that's an odd statement since it unifies the classes of bugs which pass varying qualities of (1) and (2). Certainly, "what's true of all bugs (seen in production) is that they passed the unit tests and type checkers levied against them" is nearly tautological, but leaving out those classifiers makes it into a much less meaningful statement.
Which tells us something about the nature of the bugs we will find in our programs.

The type-checker prevents certain classes of bugs, inconsistencies in types, lots of silly typos and mistakes. But it doesn't fix errors in our logic or algorithms. The type-checker doesn't know you should have added instead of multiplied, nor does it fix conversion errors at the borders of our programs where we, say, write a Haskell data structure into a JSON file.

"The type-checker doesn't know you should have added instead of multiplied"

Dimensional analysis is a type system that knows exactly that.

Well yeah, of course, but what conclusion are are you drawing from this?
Good thing type checkers stop many bugs from happening in the first place. I do agree with him that conceptually simple dynamic (Clojure) > complex typed (Java).
He's assuming that the language the code was written in was strongly typed, and that unit tests were actually written. That is not always the case.
He's saying that a strongly typed language with unit tests is not enough to prevent bugs. And he's right.
Strongly typed languages, and unit testing, do prevent or detect many kinds of bugs less expensively than the alternatives. That is why they're worth using.

Similarly, not all diseases are prevented by vaccination, but that's not considered a good argument to stop vaccinating people against those diseases that are prevented by vaccination.

I agree with you, but you're being argumentative. No one here is saying that we should stop unit tests because they can't find all the bugs.

Instead, the focus should be on what else we can do to improve the bug detection rate. This is an area that needs further research (and I would start with the observation that the quality of the unit test varies dramatically depending on who writes them).

The debate on dynamic vs strong is more important than testing vs no testing.
Yes, this was the point of his quote. Strange how this point was missed in the other comments. Of course, Hickey is aware that not all languages are strongly typed.
There might still be far fewer bugs.
There's always at least one type checker, the one running in your head. Some languages provide another type checker to help offload some of this cognitive load.
I see you've never worked in vanilla JS.