It’s bad style, but I must start with an aside: on reddit/scheme, there was a link to a blog series on developing a Scheme interpreter over January 2010. It might not implement any particular Scheme standard or particularly many libraries, but it’s got all the functional elements. Bootstrapping a programming language is fun and easy.
Anyway, he also posted a his personal history of programming language study, and it got me thinking about my own personal programming languages history.
It all started with Logo…
1992: Logo/LogoWriter. After a basic intro class (4th grade) of moving a turtle around, I would occasionally try out various programming exercise cards, where I learned about variables, loops, and functions. Unfortunately, the advanced exercises required a version of the software the school didn’t have.
1995: VB for dummies, and a cloned copy of a Visual Basic 3 floppy diskette. Remember floppy disks? Yeah, me neither. First real introduction to arrays, graphics and UI controls. Wanted to make a clock app, so I learned trig early from my dad with sketches of triangles on a post-it note. Some time later got to enjoy VB 6, GDI, and BitBlt for bitmapped graphics. I remember hating BitBlt, it seemed to have a really annoying set of params; I wished it was written in a real programming language, like VB for instance.
1999: C, Java. I don’t remember the exact order, but I made the jump from VB to C (with thanks to K&R), and mode 13h graphics. That was the simple mode right? First introduction to algorithms, wrote a 2d ‘Doom’-style raytracer after reading about it in one of those so-so game programming in 21 days books. I say ‘so-so’ because to even have a hope of learning anything about a programming topic in only 21-days, it either has to have very narrow focus or, in this case, absolutely no depth. Also spent a little time in C++, but found it very complicated and confusing; I only got as far as I did because the AP test for Computer Science was in C++ the year I was taking it. Finally finished up this period hacking around in Java, made a bunch of browser Applets, as was the style at the time.
2000: VHDL, Perl, Java – Skipped intro CS courses. Learning VHDL for digital logic course, and Java for algorithms courses. Picked up a book on Perl for the fun of it, used it to parse and process Counter-Strike logs and generate webpages of stats.
2001: back to Basics – Spent the summer working at a computer camp for kids, instructing in robotics kits programmed in Parallax Basic. Later that year, switched back to Visual Basic; the .Net version, which now rivaled Java in functionality. This ended up being my language of choice for some time, marrying true OO semantics like Java with the wonderful Basic syntax.
2003: honed my programming and design skills finishing my CS degree. Touched Prolog and Lisp briefly in one of those programming languages survey courses, but didn’t have a particularly good instructor. Senior year I interned at Microsoft where I got to dig back into C for a while.
2004: C# – Started fulltime at Microsoft, where I was to be working in C#, so I learned C#. “Oh, this is basically VB.Net with a Java-like syntax.” Heh, yeah, sounds funny now maybe, but only because (statistically) you don’t know anyone who uses VB.Net. I still say, for CLR 1.0 languages, it had the better syntax. Learned C# 2.0 generics while it was fresh off the line, and learned a bunch of stuff about the difference between the CLR’s programming model and that of C.
2006: C++ – Was told I was to be working in C++, so I learned C++. C++ Pocket Reference for syntax on the go, Stroustrup’s TC++PL 2nd ed for semantics (make sure you get special edition though), Meyers’ Effective C++ 3rd ed for learning a huge selection of gotchas and design issues, and Alexandrescu’s Modern C++ Design for teaching me an exciting selection of generic and generative programming techniques using templates.
2009: Lisp, Scheme, Haskell, ML – Inevitably a pass through Lisp. It seems a lot of programmers go through this phase at one point, and it makes sense; McCarthy created Lisp precisely to describe computing, and that clarity is refreshing. Scheme, and the book SICP, introduced me to different computing models including first class continuations, streams (aka lazy lists), and the amb operator. Haskell led to more exploration of lazy evaluation, better understanding and insights in generics, and its supremely practical typeclasses.
Currently tinkering with Standard ML, as a simplified alternative to Haskell; hacking together small tasks in Python; and whatever my new day job brings in.
Oh, and somewhere in school I briefly tried “eMbedded Visual Basic”. That’s where I first learned it’s possible to start with a good programming language and cut it down to something similar but that *really* sucks. For those who never heard of it, they removed a variety of language features including user defined types, the compiler error messages were inscrutable, and it was slow.
If you were a developer on that project, I’m really sorry, but better languages have been implemented over a weekend. I don’t blame you. Maybe you didn’t have a whole weekend. Or were held hostage. That would explain it I think.