My first contact with programming was in the course of playing a game, which included a simple visual programming system for some of its levels, when I was in elementary school.
My journey as a programmer really started c. 2002, when I took my first steps in Perl using Lara Lemay's Perl in 21 Tagen. Starting in 9th grade, I took an elective course in informatics (I know, the more common term is "computer science", but that is a bit of a misnomer. No one would say "telescope science" to refer to astronomy, so I prefer to use "informatics". In case you are wondering, no, I am not alone in this. See University of Edinburgh School of Informatics). After the pretty boring 9th year, Microsoft Office and a bit of HTML, in 10th grade the course taught the basics of imperative programming using Delphi (Pascal).
I continued to take informatics during upper secondary education ("Oberstufe"), learning to make simple graphical interfaces with Delphi's Visual Component Library, some object oriented programming, and a bit of UML. In addition, I chose to write my "Facharbeit" (a kind of high school paper that replaces one written exam) in informatics, creating a simulation of an Enigma machine with a VCL user interface.
When I had to choose specialization for 12th and 13th grade, I couldn't take physics and informatics, as I would have liked, because no one else in my grade wanted to specialize in informatics. So I took mathematics instead. All with the goal of studying physics after graduation.
Because the content of the informatics course did not challenge me, I started watching recorded computer science lectures from UC Berkeley, being taught using Scheme/Java. I implemented some basic algorithms and data structures in from the Java-based course in C#. Around this time, I started doing various challenges: at first on MiB's Challenges, now defunct, then Happy Security, and Hacker.org, as well as a few others.
While the physics specialization in physics was certainly interesting, I did not like to perform experiments. So, after a bit of thinking and an open day at the local university, I decided to pursue informatics instead. More specifically, I decided to take a specialization in mathematics, because neither electronics nor media informatics, nor economics appealed to me, which left mathematics.
Hence, after receiving my high school diploma ("Abitur"), I spent the weeks before university started to read a book on mathematics for computer scientists and started to learn C.
(It was around this time, the summer of 2007, that I shifted to Linux as my main operating system. I had used it when first programming in Perl, but had still mainly used Windows. Afterwards, I used Windows mostly for video games and did basically all my programming and other activities using Linux.)
When university started, most of the lectures seemed to recap what I had learned in school. Some details of how to design logical circuits that were new to me, but other than that, the informatics courses didn't teach me a lot of new things. I did learn some C++ in the first semester, and much more in-depth OOP in Java in the second.
In contrast, my mathematics courses (Analysis I and II) were really interesting and mostly new stuff, so I decided to enrol as a student of mathematics as well. For a course in numerical analysis, I learned some MATLAB, doing a small project and all the exercises for that course with it.
When it came time to write a Bachelor's thesis in informatics, I wrote a new back end for the OCaml compiler using LLVM (then still an acronym for "Low Level Virtual Machine"). My mathematics Bachelor's thesis included implementing the Jon Grantham's Randomized Quadratic Frobenius Test, a non-deterministic primality test – similar to the well-known Rabin–Miller test, but somewhat more efficient – in C using GMP for big integers arithmetic.
As was mentioned above, I learned some programming languages outside of classes, but there were more than mentioned. When working on programming challenges, or challenges where programming helped, I often used Python, which I had taught myself at some point, not sure when.
In 2011, when I first started on Project
Euler, I solved some of the first
problems using J, an APL-like array programming
language using only ASCII characters. Most Project Euler problems, I solved
using Python, but when that was not fast enough, i.e. if my algorithm was too
slow and PyPy did not do the trick, I used a variety of other programming
languages. In most cases, it was C, but there was also some Standard ML and
OCaml, which can be reasonably fast when using tail recursion and compiled with
an optimizing compiler, like MLton, or
ocamlopt, respectively; some Go, which is usually quite
fast, despite having a really quick compiler and using garbage collection; and
Other challenges I solved using Haskell. While Haskell can also be fast, I found it hard to tell whether or not a programme would perform well or not. In a few cases, I used Julia, which is quite a nice language and usually pretty fast.
In a addition to all of the above, I developed a variety of smallish programmes.
From a tiny assembly-language implementation of
each consisting of a grand total of just 8 lines of assembly, and resulting in
352 Byte x86_64 statically linked executables, to a complete reimplementation
of the classic game of Sokoban in Rust,
clocking in at about 3.5 kLOC, producing a 10MB dynamically linked executable.
Many of my projects can be found on Github, but many
more lie forgotten in some directory, never to see the light of day.
For more about my projects, see the projects page.