this post was submitted on 26 Aug 2025
28 points (91.2% liked)
NotAwfulTech
492 readers
8 users here now
a community for posting cool tech news you don’t want to sneer at
non-awfulness of tech is not required or else we wouldn’t have any posts
founded 2 years ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
view the rest of the comments
I completely agree with this. Good, lucid, concise commentary on CS/SE education and how to improve it. If I had written this article I’d just be telling people to ban python in coding education.
I'd be happy to hear your reasons why.
Not who you asked, but both python and javascript have code smell as a core language feature and we are stuck with them by accident of history, not because anyone in particular thought it would be such a great idea for them to overshoot their original purpose to such a comical degree.
Also there's a long history of languages meant to be used as an introduction to coding being spun off into ridiculously verbose enterprise equivalents that then everyone had to deal with (see delphi and visual basic) so there's certainly a case for refusing to cede any more ground to dollar store editions of useful stuff under the guise of education.
Short version is that 10-15 years ago, when I was a student, it had the same “vibe” as vibe coding has today, i.e. the promise of easy implementation, but with the final product being sloppy, unreadable and buggy.
Python code really requires 100% branch coverage tests as an absolute minimim… with statically typed languages the compiler will catch some types of bugs in branches you don’t test, with python chances are it won’t.
edit: basically think of non covered lines the way you think about files you didn't compile.
What do you suggest to learn instead? I'm teaching myself python because I wanted to understand coding more. Also because a lot of the tinkering with micro controllers can be done with micro python. So I have things I want to do with it too, future projects I want to create.
Funnily enough like the article mentions I taught myself HTML first in the early 00s. I did enjoy it but never used it much outside of the odd geocities website. This article does make me think maybe I need to revisit that too.
I also considered other languages to start on like maybe some kind of C or Basic but ultimately python felt like it was the most popular suggestion for newbs. I can always learn other things later.
best advice I'd have for you is continuing with python is fine but
on the good, you could read code by people like glyph, hynek, projects like twisted. they have years of experience, high mark of quality, care for their work, and also do a lot of teaching
on the bad, you could read something like the code to home assistant (and/or esphome), or bits of calibre code (and calibre plugin code). I will say that these are not bad intentionally, but bad out of "someone inexperienced trying their best". it ends up creating a very particular kind of other thing.
you can, and should, learn from both
µPython is a bit of a special beast in that it's juuuust close enough (and handy enough) that it can trip you up, because there's some notable significant differences that if you spend all your effort in it first you might pick up bad habits that don't apply elsewhere (off the top of my head, some of the applicable: scoping, some arg-handling semantics, stack stuff)
other bit of advice: remember, it's all just code. especially when you deal with libraries, if some error is coming out of a thing your first instinct may be to try ask the internet but you could also dive into the library - follow the callpath, figure out what's what, see if you can figure the problem out yourself. it's often not too hard, and it gives you some good practice of code reading and reasoning
There is nothing wrong with learning python in general or as a first language. My gripe is more that if you self teach it with no software engineering thought, you end up with some real bad habits that lead to bad code, like:
So as long as you avoid that you might be good.
Also specifically with micropython: it’s good to get something working, just don’t expect it to be fast. And if you want it to be fast, you’re going to have to learn C.
Those are some valid points and definitely things I'm trying to be mindful of. Especially since I'm just teaching myself and at this point everything I'm doing is in a vacuum by myself, but if I want to get to the point where I can share my code and work with other people on projects I need to be doing it in a way that it's understandable to anyone else (and myself).
I think the next thing i'll lear will be C it seems a lot of what I want to do needs that too, so that will be fun. Thanks!
I don't think you'll be broken by learning Python, but in my opinion to be a good programmer you need to understand at least one layer of abstraction lower than what you're implementing. So, as an example, once you learn how to code in Python using idk
numpy
, you absolutely must learn hownumpy
works under the hood. And that means C, because you cannot escape C.I teach people Rust and I always say that you kind need to know the nightmare that is C/C++ to be able to fully appreciate what Rust does for you and how it builds a much more sensible programming model on top of the same set of basic concepts we use and have always used to talk to silicone. And then you can write web apps with Rust and never even touch a raw pointer in your life, but it will make you an infinitely better Rust developer if you understand what's going on below you.
This works surprisingly well across the entire SE stack IMO, e.g. if you're using React you should be fully aware of the layer below you - raw JS and HTML. If you're coding in C you should be aware of assembly and memory models. If you're using SQL to query a database you should be aware of logical plans. If you're a project manager you should be aware of what software engineering entails and what people in your team actually do day-to-day.
What language would you suggest?
Great question that I don’t have a good answer to. My bit about python was more just a throwaway joke that was also supposed to indicate that my own opinions aren’t sufficient to write the linked article.
Here are some wrong answers, but with reasons for and none against:
By coincidence, these are the first three languages that I encountered as a CS student with no preexisting knowledge of programming (not in this order).
Anyway, for something approaching a real suggestion: Dart/Flutter could be an interesting choice, for some of the reasons given in the article for HTML. I haven’t given this much thought so this might still be a bad answer. Also this is the language I’m using at work right now.
This is only tangential to your point, but I did remember (now-defunct) game studio Zachtronics put out a few games heavily featuring assembly: TIS-100, which directly revolves around programming the titular computer in its own version of assembly, and SHENZHEN I/O, which centers around building embedded systems and programming the microcontrollers contained within.
The company's catalogue is completely free for schools under the Zachademics program, so you could use them to show how assembly programming's like if you were running a school.
frankly, it's really not a good idea to early-years kids assembly (double especially not fantasy assembly), if your goal is to encourage learning the field. this is why all the strong/popular pi-based educational distros and options focus on stuff like scratch, some light python (often paired with light pygame and turtle), and other low-entry-effort exploratory things like sonic-pi
many do come to explore programming topics in depth later (asm via zach games, other structural/dependency things via satisfactory/factorio, etc), and that's fine too
there is of course a longer-term balance to be struck with (and structural problems coming from) people not understanding the layers below them (cf. current nightmare of tottering piles of javascript and continually worsening app performance everywhere despite having literal supercomputers in our pockets), but "learn asm" is bad starter advice for the same reason that "you should know how to write in c" has been part of why we're in this fucking mess in the first place
I got my start with line-number BASIC, MS-DOS batch files and x86 assembly.
Oh, and once in college, I got really high and made a Visual Basic program that had no graphical user interface.
I approve of this sort of thing.
Gotcha. It's still a fun question to think about though.
My uni switched from teaching their intro classes in Java to python the year before I started, and in defense of python, I have to say: it's so simple for small things, that it gets out of the way in the classroom. Sure, it's not great for big projects, but it is very easy to demonstrate concepts in a readable manner.
(That was the second program I enrolled in, btw. The first one, at another uni, they started with Haskell. No joke. And while I do appreciate Haskell and functional languages in general now, maybe in part due to this, it just got in the way of the concepts they were actually trying to teach.)
But in any case: uni isn't really there to teach you to code. That's something you are supposed to pick up on along the way, or on the job.