Skip Navigation

Going old-school: I'm reading "How to Design Programs" by MIT Press, and using LISP variation

It actually uses a variation of LISP. I know old MIT college courses in Computer Science used to teach it.

The book, "How to Design Programs," is based on a variation of LISP, which I know used to be taught in college computer science courses.

I have zero programming experience, but I want to learn—not for a job, just to truly understand it.

A lot of modern advice says to start with Python because it’s easier or faster, but I’m not looking for shortcuts.

I want to go old-school. This book teaches programming with a 1990s-style approach. It may not use the latest tools, but I’ve heard it actually teaches how to think like a programmer and builds real logic skills.

Once I finish it, I plan to take the University of Helsinki’s Java MOOC. Again, sticking to fundamentals and learning the core ideas, not just trendy frameworks.

For context, I’m not naturally a math person either—I’m teaching myself beginning college algebra right now. That’s less about going old-school and more because I never had a college education, so I’m starting from scratch across the board.

So, does this sound like a solid strategy? My goal isn’t a career—just a deep, strong foundation to see if I can really do this.

What do you all think?

14 comments
  • IMHO, LISP is ok for theoretical fundamentals but it won’t necessarily get you a practical understanding of how computers work. Functional languages are more like how mathematicians wish computers worked. All programming languages are abstractions, but functional languages abstract away how the underlying hardware works in ways that procedural languages don’t.

    And Java is pretty useful if you want to get a job but if you don’t want that, then there are less painful options. The difference to Python is mostly that Java often feels like it was intentionally made annoying to use. But it’s a pretty high level language, I wouldn’t call it more fundamental or basic than Python. Java wins on performance but that has nothing to do with how high level it is.

    For practical fundamentals, if you actually want those, I’d recommend starting with microcontrollers and their assembly. Modern CPUs are so complex that learning fundamentals from scratch with assembly is quite difficult. But with smaller/older microcontrollers (like PIC or something) it’s both more approachable and more useful. It’s almost a shame that hobbyist microcontroller platforms are pretty advanced now too. But you can move on to C first, you can ignore MicroPython for a while if you want.

    If you want a game way to learn absolute basics, there is a game called Turing Complete. It basically teaches you how to build your own CPU architecture from logic gates. You start with the basics about logic circuits and eventually build a simple CPU, and then another more complex one. I think this actually goes a bit too far in terms of fundamentals, it will take you forever to learn how to even make something write Hello World on a screen. But I guess this is the closest to how I started out. Of course for me the logic part was theory only. And the CPU I eventually learned programming first was a 6502 and not something I designed myself.

    • I will always recommend Ben Eater’s breadboard computer 6502 project for anyone who wants to know how it works. The 8-bit breadboard computer project as the next step too, to really dive into all the pieces. But the 6502 project is a nice entry point into hardware itself as well as the basic components of processor and memory. How and what the 1s and 0s are doing and how to make them do what you want them to do. Getting up to a working character display and serial input for a keyboard to type is such a satisfying process that takes only a few hours if you kinda know what you’re doing and a few days if you know nothing.

    • Thanks!

14 comments