41 Comments
User's avatar
Kuha's avatar

This was simply a satisfying and stress-relieving read after being forced to develop a program in Python knowing that someone thinks the same. It was an absolute nightmare spending time debugging in Python.

Python is an absolutely horrifying language to build a proper program. It's like trying to build a house on top of a base that could collapse at any point. At first, it may seem that it doesn't take much effort to build the base for a program in Python, and it is. But, low-effort work only results in low-effort product. Languages such as Java, C/C++ or Rust definitely take more time for you to build the base, but it is extremely solid and can support your program over a much, much longer period of time.

And those languages definitely takes a lot more time for you to grasp a proper understanding. But once you do, you can see a solid and strong connection between everything. Python takes little to no time for you to understand it, but your understanding is rather lose. And that will only backfire when you build large programs as that lose understanding will only result in you barely being able to draw connections between anything, turning debugging into an absolute hellhole.

As a person who prefers to have a good understanding of whatever I'm doing and not just "it magically happens", I can never see the "improvement in efficiency" when developing in Python. I only see a 10 times decrease in efficiency compared to C++. Hell, even something such as JIT Javascript is more efficient than Python for me.

And then we have how incredibly slow Python is. And then you'll have to install a shit ton of libraries to make it better. And then you realize that's like installing hundreds of fan-made mods into a game and hoping that it won't crash.

Expand full comment
Johnxc's avatar

Very good article. I have been using python for almost 20 years now, and it still strikes me as a very amateurish language. Most of the 'defenders' of the languages are just that, amateur programmers whose expertise are in other areas, usually AI or data science. When it comes down to programming they have very little understanding of the issues in software engineering, particularly the most important part: maintenance.

There are many other issues also in python. In the days of python 2 actual good engineers were making third party frameworks to try to circumvent some of the most egregious limitations of the python vm. Then python 3 came and instead of incorporating those, python devs chose to add terrible features that are very bug prone and have terrible semantics. In the end, the language is not only bad, it is actively becoming worse.

Other problems include the obscure features, 'convenience' features for lazy devs which have very obscure under the hood functionalities. And these functionalities will of course come back to haunt you later when the program fails miserably, and debugging those arcane features become an endless journey through the interpreter source code.

Not to mention the dependency nightmare, a small package containing terabytes of dependencies, most of them written by people who should never be allowed anywhere near actual software development.

Expand full comment
George Howard's avatar

Absolutely true in every sense. I was/am a programmer from the 80's using pseudo code to test the functions. Then we used a suitable language. BBC basic is so superior to python I dont understand this almost star stuck liking for python. Declaration of variable types is a MUST if we are to manage memory. Oh python does that for you...really?

Best programming language for nerds ? APL without doubt 1 line in APL is a thousand in any language😀

Expand full comment
Xiang's avatar

Meta's new thread backend was written by https://github.com/facebookincubator/cinder which is based on python 3.10.

Expand full comment
Oce's avatar

Have you read the README.MD file? Because you are in for a surprise.

It has pearls like:

"Cinder is not polished or documented for anyone else's use. We don't have the desire for it to become an alternative to CPython. Our goal in making this code available is a unified faster CPython. So while we do run Cinder in production, if you choose to do so you are on your own. We can't commit to fixing external bug reports or reviewing pull request"

Expand full comment
Maxpower's avatar

Good article, agree with it all. I have years of experience in programming and started on Python to do some machine learning. I picked it up quickly enough but its such a pain to write in, nothing seems structured and its messy as all hell, it feels really old for some reason. And 99% of the packages that people write for it are just plain rubbish. It wasn't what It was cracked up to be and breeds poor programming practices.

Expand full comment
Brian's avatar

Thanks for that write-up. I couldn't have put it better myself. As a C/C++ developer of 26 years it pains me to see all these developers/companies using languages like Python, Perl, and JavaScript. These languages are great at teaching the basics of programming because of their simplicity, but they were never designed for, and should not be use for, large code bases. A Formula 1 race car driver would never race a Toyota Corolla. A Corolla is a fine car, it will get the average person where they need to go, but it's not deigned for professional use. Similarly, please stop using non-professional languages as if they were designed for professional use.

Expand full comment
George Howard's avatar

People mentioning how great python is... Well actually the "libraries" are great. Basic python does nowt without importing a whole load of external stuff. Cant even find cosine without importing. Oh well Always BBC Basic

Expand full comment
Donovan Baarda's avatar

The syntax/semantics/paradigm/etc of the language you use is almost irrelevant compared to other factors that have a much bigger impact on projects. Team experience and familiarity, development management/processes/practices, support tooling, documentation, language ecosystem, language maturity, management support, etc, all make a much bigger difference to the outcome.

I've worked on a large (aerospace) project using macro-assembler where after more than a year of coding only a single bug was found during integration testing. AFAIK that is the only bug ever found in that software. It went well despite the "crappy" language because everything else was in excellent order, and I personally found the language a joy to use.

I've seen Python projects that grew into terrible messes, and people claiming "Python is unmaintainable compared to C++". However, those terrible Python programs ran (and accumulated cruft hack fixes) for years, while the other C++ programs around them were re-written from scratch multiple times.

I've seen projects using "cool new languages" stumble over all the immature-language sharp edges like compiler bugs, crappy error messages, poor documentation, insufficient debugging tools, missing libraries, steep learning curves, etc. Support for excellent type-checking, contract-programming, memory safety, etc become largely irrelevant when you run into these problems.

Personally, I don't care much about the language, the language ecosystem matters more, and the project procedures/processes/practices matter even more. Given unlimited language choice I will choose a mature language I know well using a paradigm that fits the project, unless I'm intentionally planning to assess/learn a new language (in which case I know the project is going to suffer for that).

Expand full comment
Iustin Pop's avatar

Oh my oh my, finally a post of yours that I can (mostly) disagree with!

I too pushed and argued for rewrites out of Python. Python 2.7, that is. However, Python after 3.10 is a _different_ language. Good static typing (actually good, not fake), pattern matching (!), etc. etc. And now, proposals on removing the GIL.

Also, Python has proper exceptions, compared to Go's "if err != nil" manual handling of errors (unless they finally implemented better error handling - haven't checked in the last 2 years). I consider this the biggest fault of Go, which (probably not for good reasons) has put me off. I refuse to have to manually check for errors, when the compiler can in all sane languages generate code to do it. Yes, even in Python 😅

Expand full comment
Kalin Kochnev's avatar

I wouldn't say it is radically different. Most already existing code does not make use of these features. This may change, but static typing will always be an after thought without strict guarantees.

I agree with the author on a lot of points. I recently had to refactor an application written by a PhD student over the course of 3 years with no docs, no comments, no tests, and basically every convention in the book broken. People might say the fault is most definitely the developer for not following best practices. That's great to hear, but it doesn't change the fact that the code is a piece of spaghetti. Static typing saves time even in the worst case scenario. I don't want to have to mind read the author to know what entpath(A, B, C, D) does and spend hours understanding what the type of a single parameter is.

Expand full comment
Iustin Pop's avatar

Well, of course a three-year old codebase is old. But we were not talking, I thought, about code written by students, but whether Python is a valid language (not the best, but a valid one) for large projects.

My point was, that it seems Joss' point of view is about old-style Python. And my view is that today, a lot of that criticism is _less_ valid than it was 10 years ago - basically, the cost of writing good Python today is much less than in the past, almost to the level of a reasonable language.

I still prefer to write in Haskell in my free time. Neither Python, nor Go, are strong enough in types to make it worth the few hours I can afford to take from family. But I do appreciate the effort that Python community is going through to make it a better language.

Expand full comment
Kalin Kochnev's avatar

That is fair.

Expand full comment
Alistair's avatar

Awful and terrible article, but I'm ok with the part of cooling down the enthusiasm for newcomers to the world of "writing software for a living"…

Expand full comment
Tom Hawkins's avatar

As a non-programmer, I took an intro class to Python because "it's so easy!", but that is not true at all. I have some talent speaking English, but Python (all?) programming seems so embarrassingly primitive and cryptic .... my feeble apologies to those who love programming dearly. Furthermore, the typed characters and symbols are limited to what the QWERTY 110-key keyboard contains, but Unicode defines over 100,000 characters. From my perspective, each programming language should have its own dedicated keyboard including lots of special keys. Today's solution of "One Keyboard To Rule Them All" is akin to having a basic carpenter's toolbox, then trying use that toolbox to fix a diesel train engine, and a computer server rack, and a perforated gall bladder.

Also: Why do we have to translate English into Python/C/Pascal/Fortran/Java, which then has to translate that into machine language? Why can't somebody write a programming language that understands English? Will such software become 'too big' on my 4 TB hard drive? Not likely, but if so, can there be a programming language that lives locally but accesses cloud resources to understand context in English? Could such a plain English programming tool be interactive, making suggestions and asking for clarifications? It may seem like a vary large hurdle, but a plain English programming language should be entirely possible with today's hardware.

Overall, I feel like today's best programmers are farriers of extraordinary abilities, but the world has moved on to F1 and SpaceX, so please pool everyone's resources and genius, to create a robust plain English programming language.

Expand full comment
Ben Hekster's avatar

> But it has one redeeming feature:

En dat is dan ook echt wel het _enige_ voordeel

Expand full comment
Bob's avatar

Thank you!! You might laugh at what I’m about to say next, but I built an ASP.NET Core Web API program, (I think? lol), as a non-programmer, using chat gpt 01-preview with a JS front end and a C# back end.. it invokes openai api to perform a fairly repetitive data evaluation, that operates with four main variables, each containing many properties. I’m being intentionally vague as I’m not supposed to be using AI for this, (and thanks to python i haven’t gotten very far). After developing the core functionality that retrieves all the relevant data, I realized that although I’d figured out how to access and manipulate the data I needed, taking all the necessary variables into account that needed to be considered in evaluating my data, was considerably more complex than I initially realized. As a know-nothing hack, I asked chat gpt how to proceed, and it told me that creating a second backend in python to do the rest of the data processing was a good idea. This began a dark period in my life, through which I came to relate, in the most amateur way possible, to everything you said about having to test every tedious edge case, 10,000 x, generating new errors every time, often related to case errors, a million property name incongruencies between the two back ends, and endless other tedious bs, until I started to feel that python was the most finicky, fragile, and unpredictable language I’ve come across in my short forée into open ai programming, (I did make another program through much trial and error). I’m very glad to learn that my endless frustration with python may not just be 100% me.. I’m going to try and use 01 preview and phind to translate the python into some kind of auxiliary backend C# entity that refines my data the rest of the way. Thank you!!

Expand full comment
Bob's avatar

Thank you!! You might laugh at what I’m about to say next, but I built an ASP.NET Core Web API program, (I think? lol), as a non-programmer, using chat gpt 01-preview with a JS front end and a C# back end.. it invokes openai api to perform a fairly repetitive data evaluation, that operates with four main variables, each containing many properties. I’m being intentionally vague as I’m not supposed to be using AI for this, (and thanks to python i haven’t gotten very far). After developing the core functionality that retrieves all the relevant data, I realized that although I’d figured out how to access and manipulate the data I needed, taking all the necessary variables into account that needed to be considered in evaluating my data, was considerably more complex than I initially realized. As a know-nothing hack, I asked chat gpt how to proceed, and it told me that creating a second backend in python to do the rest of the data processing was a good idea. This began a dark period in my life, through which I came to relate, in the most amateur way possible, to everything you said about having to test every tedious edge case, 10,000 x, generating new errors every time, often related to case errors, a million property name incongruencies between the two back ends, and endless other tedious bs, until I started to feel that python was the most finicky, fragile, and unpredictable language I’ve come across in my short forée into open ai programming, (I did make another program through much trial and error). I’m very glad to learn that my endless frustration with python may not just be 100% me.. I’m going to try and use 01 preview and phind to translate the python into some kind of auxiliary backend C# entity that refines my data the rest of the way. Thank you!!

Expand full comment
Guido's avatar

Stupid rant article with hardly any wisdom, which is ironic considering the title of said substack. I stopped taking you seriously after you repeated the false assertion that QWERTY is bad myth. (It's not, see here: https://www.smithsonianmag.com/arts-culture/fact-of-fiction-the-legend-of-the-qwerty-keyboard-49863249/). I like how you make grand assertions without backing any of it with any substantial proof. Get some proper citations or case studies that have been peer reviewed.

Expand full comment
Jos Visser's avatar

You have understood exactly nothing about the article and the spirit in which it is shared. Maybe you will agree with its companion article: https://josvisser.substack.com/p/why-python-is-amazing.

Expand full comment
Stephen Madden's avatar

I write test automation. Python is a nightmare. I'm sticking to C#

Expand full comment