Whoa! This is a revelation. I already loved Nix and used nix-shell extensively, but this is the missing piece: fully reproducible Python scripts without compromise.
Or install direnv and put your dependencies into a shell.nix, setup the bash hook according the manual, create the .envrc with the content "use nix". Then type "direnv allow".
Then you can do e.g. use other persons python scripts without modifying their shebang.
Although the study by Prat et al. (2020) suggests that linguistic aptitude is a better predictor than numeracy for learning programming in Python, it should be read carefully, as it can easily be oversimplified.
To begin with, the study measures functional numeracy: the ability to solve everyday numerical problems. This is quite different from the kind of advanced mathematics often associated with programming, such as formal logic, symbolic abstraction, or the use of formal languages (as found in denotational semantics or type theory).
These more abstract skills—not basic arithmetic—are essential for understanding recursion, type inference, or algorithm design. That functional numeracy has low predictive power in this study does not imply that deep mathematical reasoning is irrelevant to programming.
Moreover, the language used in the study is Python, which was explicitly designed to be readable and semantically close to natural language. This may give an advantage to individuals with strong verbal skills, but the results don’t necessarily generalize to languages like C, Lisp, or Haskell, where symbolic and logical density is much higher.
Finally, language and mathematics are not opposing domains. They share cognitive underpinnings, such as working memory, executive attention, and hierarchical structure processing. The key is not which one "wins," but how they interact and complement each other in different programming contexts.
> These more abstract skills—not basic arithmetic—are essential for understanding recursion, type inference, or algorithm design.
No they're not. Academia has spent decades trying to formalize many aspects of programming and continues to be confused by the lack of correlation between comp sci grads and innovative programmers. Why is it that the drop-outs are succeeding so wildly?
Recursion, for example, is learned by most of us real world achievers when we hit a brick wall in programming that other methods won't solve, and we have that aha moment of "this is why this exists". Not because we studied advanced math with symbolic abstraction, denotational semantics and type theory.
The uncomfortable truth is that almost all of professional programming and innovative programming (creating useful stuff never before seen) never uses any of the advanced math skills that are prerequisites in every degree program. I think much of the sadism around teaching this is perpetuated by "I did it so you have to" and academic gatekeeping.
When you get really really good at programming and hit the most productive zone in your life, it feels like language. That you have the ability to just say it.
The drop-outs are "succeeding wildly" because people like Turing, Church, and Hilbert invented the sand pit they're playing in.
Knuth created LaTeX. Pandoc is written in Haskell, famous for being a completely useless academic language with no real purpose beyond torturing undergraduates (it says here.) Efficient search and data compression algorithms aren't hacked together in late night hobby coding sessions.
Cryptography, digital signal processing for images, sound, and video, and ML core algorithms are all mathematical inventions. The digital world literally runs on them.
"Real world achievers" might want to try being a little less parochial and a little more educated about the originators of the concepts and environments they take for granted.
Vibe coding "Social AI chatbot network with ads = $$profit$$" or "Cat videos as a service" is only possible because the entire field stands on the shoulders of mathematical giants.
Well said. I guess such ignorance is not that surprising given that most "programming" today is glueing code together with scripting languages. This is really just a form of configuration. It certainly requires domain knowledge and a tolerance for digital bureaucracy, but not always maths. I do wish schools would do a better job of teaching that the entire fabric of western civilization rests upon mathematics.
It sounds like these advanced skills might be needed to build the platforms that the dropouts build on top of. But I agree that, as a professional programmer of 20 years with a 4-year business degree from a state school with a weak math background (and also as someone with a talent for writing and language), I have very little need for advanced math in my day-to-day.
You are making a rather wild assumption that dropouts don't have the abstract math skills that correlate with programming skill.
I'd argue that if they can figure out recursion after hitting a brick wall like you describe, then that's a good indication they did have abstract math aptitude to begin with.
In my personal experience the hardest part of mathematics is it's grammar and language. It's very different from natural language, whereas programming is much closer. You can take nearly any math problem and convert it to pseudo code and it'll be much more understandable for those programmers who never studied (or struggled with) advanced math.
Programming requires a base level of natural language aptitude that nearly all adults have, there's diminishing returns for anything approaching the levels of a poet or novelist for example.
When you get good at math, it also feels like language. Mathematicians see expressions like `|x-y|` and the read it as synonymous with "distance" just as they would "distancia". Physicists pick out fragments of large equations and say "this term acts sort of like an 'effective' mass", etc. There is a sort of vocabulary to mathematical patterns.
Picking up a skill without intentional study is great, but you still learned the skill. Programming languages are formal languages. Most mathematicians don't study foundations either.
Professional programming doesn't often make use of specific advanced mathematical knowledge, but I find it makes everyday use of the skills.
My own definition of mathematics for the sake of this comparison:
- If you can write a formal proof, starting from some assumptions and proving some result, it is mathematics. The assumptions are the axioms. Then you use logic, which is the same programming logic, and then you get to some result.
It can be an invariant in a programming function, it can be a more general result, if you can write a proof, it is mathematics. Most algorithms involve proofs, so they are mathematics.
It has nothing to do with it being "sadism" or academic gatekeeping.
These people are doing mathematics without knowing it is mathematics. That's all.
> Why is it that the drop-outs are succeeding so wildly?
Here is where you can learn about confirmation bias and educate yourself.
Hi Mark. I just bought your book in leanpub.
I own the book about common lisp and haskell, I find your
style very pragmatic succint.
Please follow witting books like those.
I agree with you it's a very opinionated article but despite I program every single day on C and C++, I agree with some points he claims.
For example, I think the implicit conversions in C++ it's very problematic.
Another point is regarding undefined behaviors they still surprise me.
Even I agree with the part in he complains about the size and complexity of the c++ standard.
And the third footnote is simply true.
My complaints are more oriented to C++ than C, often I feel that something went wrong, and we fail to try to reduce the complexity.
When I remember the following quote "A programming language is low level when its programs require attention to the irrelevant." Alan J. Pelis. I always remember modern C++ and I realized how regardless of an apparently simpler syntax, we start to think about l-value, r-value discard, contexpr, we start paying attention to details no related to our original problem.
That's why I feel you are right C++ is a low-level language, but sometimes I feel the modern C++ is not a higher level, but even a lower level.
Sometimes I ask myself if despite the lack of standard library and high-level structures if working with c and Glibc it's higher or lower level, my experience tells me that sometimes I can concentrate better on my problem I try to solve, instead of struggle with the compiler.
There are countless successful open source projects (libraries , frameworks and languages).
Open source have come to stay, besides, nobody forbidden you to put a price if you have a opensource project and you want to give a premium experience, with extra features, maintenance or even a technical support.
Not a joke! There are reasons why this fundamental truth has been obscured for the short amount of time that software has existed on a meaningful scale. One of them is the unique property of software not needing any physical resources to be created or distributed. The other is the cultural circumstances surrounding software historically, where often people were being pioneers with their contributions, contributing to the grand vision of computers and the internet which only very recently has been realized. And the average programmer historically was very intelligent and wealthy. It was a set of circumstances that created the illusion that the shackles of capitalism had been broken. But they haven’t. And as the circumstances change it only becomes more clear that free labor won’t be a successful model for software. And this doesn’t come as a surprise to anyone who has closely scrutinized the whole picture.
And the whole thing is made worse by the politicization of free software. People respect free software because it is “virtuous.” It’s a very short sighted notion that shares its roots with communism. If pure intentions counted then both might be successful but unfortunately it’s not the case.
To say that Linux was the last free software was obviously hyperbole. But the conclusion I have drawn is correct and you will see this whether you reflect on it now or stick around long enough to see the economics play out.