I learned programming in the late 1980s by writing programs by pen on paper and imagining how they would run on a machine. You see, my parents did not think it a good idea to have a home computer until sometime in the early 1990s.
I dabbled with programming in my teens, using an old hand-me-down ZX Spectrum 48K), then later with QBasic) and Quick Pascal on a low-end PC running MS-DOS 4 and later Windows 3.1. My first complete program was written over one week in around 1995, in QBASIC, as a double-entry business accounting program for my father; sadly, it did not see production use.
During high school, I somehow managed to get online, and I got myself a Unix shell account at a local Internet service provider ( sci.fi, if you must know). A local nonprofit needed an email discussion list, and so I threw one together by writing shell scripts driving procmail.
My high school ended, in typical Finnish fashion of the time, in mid-March 1997, and I had the luxury of spending the rest of the spring and summer immersed in computers until starting university studies in September of the same year. I built my own computer from end-of-life components I bought online; the only thing I could get to run on it was Debian GNU/Linux 1.2 Rex. The hard drive was so small, I think 10 megabytes, that I had to uninstall my Emacs text editor so that I could install the C compiler, and after getting compiler errors, I uninstalled the compiler and installed Emacs. Talk about long cycle times... I fairly quickly obtained a hand-me-down 40 megabyte hard drive that allowed a bit more room.
As an Undergrad and Debian Developer
At the university I tried to stay away from computing studies, focusing totally on my mathematics major in my freshman year. However, all my free time I spent either at home with my Debian machine or at the university in the Unix lab (appropriately enough called Camelot) with its Sun workstations and Red Hat Linux PCs. I had no home network apart from the sneakernet, carrying less than two megabytes in each floppy disk, or occasionally burning a CD-R carrying around 600 megabytes in each.
During this time, I became active in the Debian development community and (after having installed a landline to receive the all-important sanity check phone call) a Debian developer with full voting and uploading rights. I wrote from scratch two utilities that are still in Debian: chase and grep-dctrl. I wrote a spec for build-time dependencies and successfully championed it through the Debian policy process (see #41232). I server on the ftpmaster team for a while.
All this activity was supported by the relatively generous student support from the Finnish state of that time (it is much less generous today). Once I ran out and had to find work, my time for Debian grew smaller and smaller. I stayed on with much reduced activity level until resigning in 2014.
I several times figured that I would like to start my own business around that time, but having no savings or other stable income, the risk was just too great for me to stomach. Had there been a guaranteed basic income system, I probably would have become an entrepeneur instead of an academic.
I did some wage work for the university as a teaching assistant in the Programming 2 course during my undergraduate days. However, I became a proper employee when I was recruited to be a part-time research assistant in a project trying to build Ted Nelson's ZigZag in Java. I have told the story of that project elsewhere, so I will not say any more of it here. However, my work during this time taught me Java and the nuts and bolts of HTTP, both of which have been useful to me several times later.
In 2002, near the end of my Master's degree, I was recruited as an assistant to a professor. This meant a regular, full-time salary, the introduction to teaching courses, and an expectation of PhD studies. I had no idea how to do a PhD, and the university gave very little guidance, so my PhD student status was mostly theoretical. However, I found I have an aptitude to teach. During this period, I designed and taught courses on automated reasoning, functional programming, the principles of programming languages, and compiler technology. I also taught courses on software testing, formal methods in software engineering, and formal language theory.
During this period, I wrote many many things as examples for my students: several compilers in different languages, an implementation of grep, a tool to compare regular expressions, an Earley parser, several lambda calculus interpreters, and I must be forgetting many others. Very few of these had any production use, but they nevertheless had value to my students.
Research and Disillusionment
In 2011, nearly a decade after starting my PhD study, I finally had an epiphany. I decided to seriously tackle the question of how to evaluate programming languages. Since academic study requires a narrow purpose, I naturally set out to survey the full extent of the scientific literature on what we empirically know about programming language features. It took me years; I published my findings in 2014 and again in my 2015 PhD dissertation. My result? There was, up to 2012, basically nothing useful.
After my PhD, I tried to establish a research program that would allow me to advance in the academic pyramid scheme. I did some work on research methodology and computer science education, but the more I dug in, the harder it became for me to take academia seriously. There were also, at the same time, serious issues in the workplace. To avoid a burnout depression, I quit at the end of August 2019.
In September 2019, I joined as a software developer a growing company selling professional services to banks. At ALM Partners, my work is mostly under client confidentiality and trade secret rules, so I will not discussing it in any detail. However, I get to use my technical skills to solve real-world problems, and I get to participate in continuous improvement of our product development processes.