Coding
CodingJust starting out (pre-2003)
I have been coding since my early teens, which started when messing around with ActionScript to aid in very basic computer animations; before that, I dabbled with website development using free hosting sites such as GeoCities and Angelfire (using the freely available .tk domain registration, among others) in elementary, but I don't really consider web1.0 HTML and Javascript as coding. Around the same time, I picked up a C++ book and it was way over my head and didn't get far beyond basic primitives.
Linux
What really jumpstarted my journey was when I started using Linux in 2003. I had been into computer gaming which at the time, my favorite game was Wolfenstein: Enemy Territory, which had a Linux client available; I picked up a copy of Linux Journal (and later ... subscription) and became obsessed with researching Linux and why I needed to use it. I had spindles of CD-Rs available and started burning ISOs to them at a rapid pace. I was amazed by how simple and lightweight it was; how I could install things using the package manager directly from the shell was mindblowing. After testing several "Live CDs" and OS installs, Gentoo was the obvious choice, given it's view on performance and customization.
IRC
Some things came easy from reading documentation and those that did not, were answered quickly from the great Linux community that existed in various channels across irc.freenode.net, which I frequented every time I was online; beyond troubleshooting, I learned a great deal about Linux and systems in general, on IRC. There was a channel for everything, it was truly amazing; exploring all the channels opened me up to new operating systems and the plethora of languages that were used in the wild (at the time, my focus was Perl, inspired by discussions and lurking in #perl)
Bash
During my earlier Linux days, I learned to use Bash to automate certain tasks such as batch renaming mp3s / photos, which apps to launch when I logged in, or later on, to use with conky to give me up to date stats on my machine; Bash was the first scripting language that I used heavily and productively
Lua
Another pivot (as was Linux) from computer gaming was the use of Lua to extend plugins or mods for game servers to create in-game menus, music, macros. Also, once I started experimenting with Window Managers in Linux, I came to love AwesomeWM (and Conky), which were configured/extended using Lua. Nginx was also configurable with Lua, which probably thwarted my progress in actually making web apps because this integration was so powerful, which also led me to Varnish / memcached among other tools, which greatly allowed me to deepen my knowledge in Systems and reverse proxy design.
C
I've always enjoyed building hardware and have worked quite extensively with AVR-C and Arduino code. Also, I have a respect for C as a language and even though I've only worked very lightly with production C throughout my career, I find myself referencing K&R often enough :satisified:
College
I went to school for Network Administration and Security at my local community college. I continued studies in C++ which is what my programming courses were based around (aside from Intro to Programming, which was in BASIC). Although my programming courses were focused on C++, I was still heavily fixated on Perl, which is what I used for my projects in my Linux courses (mostly network and security scanning tools, one of which prompted college IT team knocking on our door due to suspicious activity :hehe:)
My first tech job
During my first job working as a Network Admin, I worked closely with our Systems Admin, learning about our Novell / Microsoft environments, which were mostly scripted in BASIC or Virtual Basic; I also got exposure to my first API (GroupWise SOAP / XML :puke:). I learned quite a bit of scripting hacks and tricks of the trade in NetWare / Active Directory from our talented Sysadmin, which mostly consisted of BASIC and Visual Basic (VbScript) to automate the user login experience, app installs, machine cloning, among other things
Perl
While still at my first job, I was able to rely heavily on Perl to automate alot of tasks I had to rollout to a large number of retail branches. We used a tool called RANCID (Really Awesome New Cisco confIg Differ), which relied on Perl and Expect scripts to backup network device configurations. This opened up the gates for me; I was able to use the same model to write configurations to ALL network devices across many networks in seconds, not limited to just backing up configurations. Digging more into available Perl libraries, I also wrote quite a few scripts to pull NetFlow data from devices, poll SNMP, and really opened my eyes in what was possible in network scripting and automation with Perl. I went heavy into Perl and read all the information on the web (and books) where I could find on useful things to do; the O'Reilly "cookbooks" were great for learning more about what was possible.
Ruby
In the early 2010s, Ruby dominated most of the systems and tools I was working heavily with. Similar to Perl, I was able to use Capistrano to execute commands across many servers in a very fast manner, really adopting the early "Infra As Code" mentality, being able to write configs in Ruby dialect and extensions for automation. Ruby was the ultimate language to write scripts, with a lot of support and rich libraries for doing most things but also for use as a DSL for feeding such scripts the infra data to deploy with/to; also it was lazy enough a language to be useful, convenient and intentional. Similar systems / tools such as Puppet, Chef, Vagrant, Rails, Thor and so many more, all configurable in Ruby. Nowadays, you see Dockerfile, which makes me chuckle at how many :hehe:, it used to be all Ruby DSL). This is where my career gained its new favorite shoes; not sure what that means, but it was felt. Ruby remained my favorite language for awhile.
Python
Had (and still has) its place in a world similar to that of Ruby, just as lazy as Ruby to get stuff done without too much boilerplate, and a great ecosystem / libaries. However, it didn't come with the joy I got from my time spent with Ruby, I guess you only get that joy once? (Nope, I continued to get it years later, just not with Python). However, I have used it consistently throughout my career and has been a pleasure to work with even though it hasn't been a "spark joy" language for me. It has sane defaults and this has improved from Python2 -> Python3 (i.e. things like not having to explicitly use xrange for memory efficiency over range, etc.)
Haskell
I have yet to use Haskell productively in my career. However, I've used it as a DSL within my 10+ years usage of XMonad (my Window Manager of choice). I also use it for experimenting with rendering, mathematics and general shader fun. It is my first Functional Programming language that I have used heavily for personal projects and have really enjoyed how you can express your code with it. I also use it as my primary language in solving Project Euler problems. It has heavy roots in Mathematics (set theory, group theory, category theory, etc.) and is really fun to use in many ways. I have been experimenting with game development for years and can't get myself to adopt a framework, because I find my excitement to be in creating the tooling and framework... where I've been investing some time here and there doing so (lately with BearRiver, SDL2)
Golang
I have been very excited about Golang and has primarily been my favorite language for around 10 years now. It is efficiently strict, yet lazy where it matters. It has the best standard library which I have seen and is always improving. It has very useful runtime features and listens to it's community (ex: how GOMEMLIMIT was introduced as the successor to Go's common memory ballast implementations). Go package management is simple and easy to follow; you can see from the imports exactly where it came from and its invocations throughout the code. I am a huge fan of Rob Pike, his design patterns and thoughts on simplicity; see pikestyle. Much of the tooling that I use day-to-day is written in Go, where interfacing with it is dead simple. I'm hard pressed to choose a language other than Go from systems tooling to production applications; crème de la crème :chefkiss:
Some others
When working heavily on observability / telemetry tooling, I was originally using vector.dev for shipping telemetry events, where I relied on Rust a bit to extend features to the platform and became familiar with it; I came to find some pretty spectacular code and worked a bit with Tokio, several Bloom filter and HyperLogLog implementations but came to a conclusion that much of the greatness lay outside of the standard library.. for something like i/o, Tokio was often used over stdlib net i/o and same for common algorithms which in comparison to Go, you need not re-invent many wheels for common tasks which can be solved efficiently in the language; in Go, I look to the stdlib for exemplar idiomatic code. During this trial period, OpenTelemetry was starting to mature and added some critical features that were initially lacking, where I made the switch and was back in comfortable Go land. Before this initial test, I had not written any production Rust code, so I don't think I see as clearly as some might; I still find it a fascinating language, it just wasn't the tool for the job here.
I enjoy experimenting with different languages and this is a trait I've always had; some stick, some don't, some are fun but not practical (however, fun is practical when your just experimenting for your own enjoyment :sunglasses-at-night:)
Where I would like to experiment next: Idris2, OCaml, Verilog, ...
I've also spent a bit of time in supporting dev teams across a variety of languages, working on shared libraries, heavily in observability / telemetry: Java (including Kotlin, Clojure, Scala), backend (Node) and frontend Javascript / Typescript, and of course previous mentioned Go, Ruby, Python, C
Lisp
For some time, I have been using Emacs and can't leave out Lisp (obviously due to Greenspun's tenth rule). Most of my time has been spent I guess using Lisp as a DSL for Emacs or extending bespoke features useful to myself. I have started but haven't really went deep into using sbcl to truly learn Lisp but I enjoy using it. I've used Racket to mess around with 2htdp/image (see racket-sierpinski). I've also used fennel very lightly because it's a Lua-compatible Lisp, so you can use it directly with Pico-8 and Tic-80, which is awesome.
Books
It's really hard in today's age, with so much information available on the web, to justify purchasing physical books but here are some I think deserve the shelf space:
- The C Programming language by Brian Kernighan and Dennis Ritchie (a.k.a K&R)
- Structure and Interpretation of Computer Programs by Harold Abelson and Gerald Jay Sussman with Julie Sussman
- Crafting Interpreters by Robert Nystrom