Epistemic Status: evergreen tree Evergreen — I’m pretty clear on how I got where I ambeaming face with smiling eyes, but I’ll be updating this page as I run into new things, both to keep the story up to date, and so future me knows what I’ve looked at.

Any updates will mostly be at the end, when I start learning new things.


This is a catalogue of my path to learning to program and some of the interesting places it has led me. There are some languages on this list that I’ve only glanced at, but haven’t built anything large in. This is somewhat of a timeline even though I probably don’t remember the specifics.

Lack of links

There are currently no links to the languages here, but I’m slowly making links either to each language’s home page, or to a page here about them and what I think about it that will provide links out to relevant websites.

Late 1980s

Languages: BASIC

Somewhere around ‘87 or ‘88, I was introduced to BASIC. This occurred in at least two places. My cousins had an early computer (not sure the type, maybe a Tandy TSR-80?) that had a BASIC interpreter.

Around the same time my aunt owned an early IBM clone PC, the type that ran off of 5¼ inch floppy disks. One of those disks was a BASIC interpreter. My brothers and I were more interested in playing this game she had that we knew as CASTLE, but is actually called Castle Adventure, which apparently you can play online at the Internet Archive (use Ctrl-F11 to slow the game down and make it playable).

At this point I didn’t really learn BASIC. I may have had someone fire it up and show me how it worked, but I didn’t have anything or anyone to teach me and so it didn’t make an impact.

1994-1995

I believe this was the year that I met an early mentor in the 7th grade, my Computers teacher. When she taught us BASIC and I took to it immediately, she took an interest in me and helped my parents get me a computer (a 486 as I recall) among other things1.

I remember writing out BASIC programs by hand on paper in study hall to later take to the computer lab to enter into the computer and run, and while most had bugs, they weren’t too far from runnable. These weren’t complicated things, early attempts at writing games, not very good ones though.

I also got some old books on it but never got really good at it. One of the books I still own, 55 Advanced Computer Programs in Basic, a book that mentions using cassette tapes for storage, which was a little before my time. I also remember a series of kids books that had BASIC programs in them that were tied into the story somehow. I found one or two at a second-hand store and gave them a try. I can’t remember the title though.

1996

Languages: C and C++

Around the time I dropped out of High School, my mentor sent me a copy of Visual C++ (version 6, I think)2. I remember being disappointed that it didn’t have a manual to teach me C or C++, but as we had gotten dial-up Internet by then, through a combination of looking things up online and Teach Yourself books my parents got me from Half Price Books, I slowly taught myself C and C++.

I remember being very confused by pointers until it clicked one day.

1997-2000

Languages: Java, JavaScript, Python, Smalltalk (briefly), and Lisp (briefly)

I spent most of this time learning anything I could get my hands on. During this period, I learned Java, some early JavaScript (but not much, it was still just for simple stuff at this point in time), and some Python3. I think somewhere around here I first bumped into Smalltalk but didn’t really try it much then.

Somewhere in here I read Eric Raymond’s famous How To Become a Hacker (this isn’t the same version I read) and after reading his bit about Lisp I tried it but I bounced off. I’d come back later but at this point it was “too different”.

LISP is worth learning for a different reason — the profound enlightenment experience you will have when you finally get it. That experience will make you a better programmer for the rest of your days, even if you never actually use LISP itself a lot.
~ From How To Become a Hacker

I also tried Linux for the first time. Up until that point, I had used MS-DOS and later Windows 95. I think I was using UMSDOS to do it without having to repartiton. It was the family computer, so I couldn’t repartition and lose everyone else’s data. At this point we had a Pentium II 266Mhz computer with a 6GB HDD and I think we started with 8 MB (yeah, megabytes) of RAM4.

2000-2004

Languages: Visual Basic, and Ada

2000 is when I would have graduated had I not dropped out, and I got my GED with help from my mentor at about the same time. At this point, I wanted to go to college and get into game programming (I’m a child of the Nintendo Entertainment System generation, so like most I got into computers because of video games) but my family was moving around a lot, and I didn’t have good guidance on what I should do or where I should go.

I had a bit of a costly false start going to ITT Tech5, before one of the instructors there one day asked me why I wasn’t at The University of Texas at San Antonio. I did pick up Visual Basic while I was there. I can see the appeal, it gives you some of what Apple’s HyperCard could give the non-programmer.

Somewhere in here, I remember bumping into and giving Ada a serious try. This was probably the first language I used that had a decently strong type system (at least compared to things like C and Java) or that was aiming for soundness and correctness. As I was interested in game development, and had been learning DirectX using C/C++ from books by André LaMothe6, I ended up trying to figure out how I could access those libraries from Ada, which involves using COM. I think some people on an Ada forum tried to help me, and I got something simple working, but I didn’t stick with it because the community seemed so small.

It was another one of André’s books that had a basic primer on trigonometry (since that’s used a lot in 3D programming) that lead me to go find an old book that my Dad had on trigonometry from like the ’50s and teach myself that. I don’t think I ever came back and finished the original book though (I’m pretty sure I still have it).

2004-2008

Languages: Scheme, Common Lisp, Clojure, Perl, Standard ML, PHP, and Ruby

In 2004, I started going for a Bachelor’s degree in Computer Science at the University of Texas at San Antonio (UTSA). With all of my self-study, the main CS courses were a breeze. Somewhere in here, I gave Lisp a second look through Scheme, Common Lisp7, and later Clojure (this must have been right at the outset, since it came out in 2007). About the same time I was introduced to The Little Schemer Series of books but I didn’t appreciate the writing style at the time8.

I learned a little bit of Perl for a Computer and Network Security class I took, but not enough to be proficient at it. I was introduced to Standard ML in one of my classes, but didn’t get it beyond what was needed for the assignments.

I also learned PHP during a work-study position at the UTSA library, where I wrote the worst spaghetti code. I sincerely hope they aren’t using that system anymore. It was a ticketing / help-desk type of system that the library IT team used. It was actually originally written by another student in a language called Icon and only ran on a Windows box they kept in a closet. They wanted to retire the system and only use the Solaris machines they had in a server room and since they were running Apache, PHP was the most obvious choice9. I basically ended up making a direct translation as best I could, and not really knowing how to apply code organization to rendering a web page, ended up writing pages that were huge ifif/elseelse statements.

This was around the time that AJAX was first making waves, and I learned an early version of Ruby on Rails to try to learn some of this while building a second system for the library (I forget what this one was for), which at some point became a PHP program (for ease of deployment) and this time I used a web framework.

2009-Present

Languages: Rust, Go, TypeScript, Factor, Forth, J (briefly), Haskell, D, Smalltalk (more in depth), Elixir, and Unison, among many others.

From here on, it’s hard to remember when I first encountered something. Professionally, I’ve used Java, Python, and now Ruby, as my main development languages. I have, of course, used things like JavaScript at work, as well as more recently TypeScript.

I’ve also explored things in the web language space like Rescript , PureScript. Some more esoteric ones like Amber Smalltalk. I’ve been intrigued by HTMX and Hyperscript but haven’t had a chance to put them to the test. I picked up Hypermedia Systems and flipping through it, I think it has some promise.10

Ever since it first appeared I tried to learn Rust but kept bouncing off. I think the earlier syntax was more complicated and just different enough to make learning difficult. Post-2018, I learned Rust for real this time using The Rust Programming Language and writing a few command line tools, some of which I still use today. I’ve also messed around with compiling Rust to WebAssembly.

I’ve played around with Go, even working on some micro-services at one of my jobs that were written in Go. It’s okay as a language. There are some design choices I don’t like, but I understand why they made them. I should probably give it another look now that it’s been a while.

Somewhere in here I encountered Factor11 and its relatives like Forth. I also tried out J (an APL-family language) but not for anything big.

Haskell has been a language that I’ve tried to give a go several times. I really like the underlying ideas behind it but I’ve yet to sit down and write a full program to really give it a go. The books Real World Haskell and Haskell Programming From First Principles have been invaluable, especially the latter. The former is also a good choice, but did a terrible job of not introducing the $$ function application operator and just started using it at some point without any explanation. Maybe it’s been fixed in a recent edition?

I ran into D but didn’t stick around because at the time the community was split between two standard libraries. I think that problem has been solved and so I think I’ll give it a second look.

I’ve given a second look at Smalltalk, looking at Pharo, Squeak, as well as other implementations. I think there are some great ideas here that need to be brought back into the mainstream, especially around live coding, being able to introspect a running program, and the ways in which we store code (more on this later).

I’ve been doing a similar thing with Elixir. I looked at it, thought it was interesting but didn’t really dig in, and now I’m back giving it a closer look. I feel like it and Erlang that it’s built on have a better concurrency story than almost anything else around. This is one of those features that I look for first in a language to see how they’ve solved it, and Rust’s recent approach has left me wanting. They’re also working on adding a set-theoretic type system, to allow gradual sound typing of Elixir code. I’m very excited to see where this goes. beaming face with smiling eyes

A language I’ve recently encountered and am very excited about is Unison. Syntactically, it’s very much in the Haskell family, but that’s not the important parts. It’s somewhat hard to explain, and has features reminiscent of Smalltalk. Its own self declared “big idea” is this:

Each Unison definition is identified by a hash of its syntax tree.

Put another way, Unison code is content-addressed.
~ Unison’s Big Idea

It’s got some ideas similar to ones I’ve had around moving beyond text source files and how we represent programs. It would be interesting to see some of the ideas here combined with ideas like Elixir/Erlang’s distributed code execution ideas, and I think they might be moving that way.

I probably should mention Nix as well. I’ve spoken elsewhere about how much I appreciate the whole ecosystem that’s built up around it, and it is a language, even if it isn’t Turing-complete.12

And Beyond

I’m always interested in learning new things, so if you know of something I haven’t mentioned, let me know and I’ll take a look. beaming face with smiling eyes

Footnotes

  1. I also learned MS-DOS batch language around this time and managed to lock up a 286 she loaned me one summer from school (I don’t think she got permission for that), trying to implement login functionality by accidentally having AUTOEXEC.BATAUTOEXEC.BAT get stuck in a loop. I know now that fixing it would have involved booting off a system floppy disk and removing the bad file. Thankfully it was near the end of the summer, so I didn’t lose too much time with the machine as a result of my foolishness.

  2. I have no idea how I learned to program on Windows. It seems to make everything harder every time I try to do it these days. My hats off to those who do. I remember having trouble getting the compiler to find libraries and header files and lots of frustration.

  3. My first brush with Python was from the Quake Army Knife, a map editor for Quake written in Python. I looked it up, messed around with IDLE a bit, but didn’t really use it for much at the time.

  4. I remember trying to run KDE and running into problems and somehow I found Patrick Volkerding’s email somewhere in the documentation (I was running Slackware) and emailing him to ask what was wrong. He was very nice and told me I needed more RAM for KDE to run well. I didn’t know who he was at the time, or that I might be bothering a busy person.

  5. A terrible company (they closed in 2016, good riddance) owned by another terrible company that had a hand in the Chilean coup d’état of 1973, which is just terrible in general, but also hits closer to home for me now because my father-in-law is Chilean and had to live with the consequences.

  6. Another “emailing some random person” story. I had (and still have) a copy of The Black Art of 3D Game Programming (from 1995). It’s a book about writing an original Battlezone-esque (not the remake) 3D game for MS-DOS. As I had Visual C++ and hadn’t really done any DOS programming, I couldn’t figure out why I couldn’t get anything to compile (not finding the necessary header files). So, finding André’s email at the back of the book (or one of his other books I owned), I emailed him to ask what was up, and he kindly told me it was because I wasn’t using a DOS compiler, and if I used something else (I think he suggested one) it would work. Needless to say, I moved on to using DirectX instead.

  7. Steel Bank Common Lisp (SBCL) is the implementation I’d recommend using. It has a great set of features and is a compiling implementation (even when using the REPL in “interpreted” mode).

  8. Now I own most of the books in the series and appreciate the style and humor they bring to their topics. The Reasoned Schemer is an excellent introduction to logic programming.

  9. It was also my second encounter with a non-Linux Unix system, and all the fun that entailed, as my little 12” PowerBook was running OSX Tiger (which is BSD based). Dealing with slight differences between the behaviour of the cpcp command was “fun”.

  10. I think there is a degree of excess incidental complexity in our systems, and we should take a moment and step back to see if there aren’t simpler solutions around.

  11. Factor has one of the best…IDEs? Environments? REPLs? …that I’ve seen. Everything is all in one application, similar to Smalltalk actually, and the documentation is all there too right on hand to be inspected at any time.

  12. You actually don’t want that in a system configuration language. You want the build to halt rather than run forever. But some people think it’s the only thing that matters in programming languages.