Technical genesis

My dad brought home a ZEOS 486 computer with Windows 3.1 in 1993. I remember being enamored by Microsoft Paintbrush and reading the complete MS-DOS user manual for some reason. Later I sunk many hours into designing levels for Duke Nukem 3D with Build.

An early experience that hinted at an engineering career was a middle school summer technology camp at the Richland County Vo-Tech center. One of the activities involved drawing a design on graph paper, then translating that into CNC instructions to mill the design into a 2x2 inch acrylic block. I won some popularity through "debugging" the other students' designs, in which a forgotten coordinate or "Z-up" instruction would generate an incomprehensible scribble.

I spent some years between middle school and high school tinkering with websites, complete with terrible MIDI music and proudly displayed browser compatibility badges. Fortunately, most of the drivel was wiped along with Geocities.

Programming languages

Early on there was a "Learn Java in 30 Days" book on the shelf in our house, but I was too intimidated by the setup process to make any headway.

I started programming with Javascript in ~2002 as the next phase of my web design hobby. This was my first exposure to a for-loop. I appreciated the fast iteration cycle of [edit in notepad] + [refresh browser]. It was a great head start to introductory programming classes at university (a couple of Java lab courses from the Comp Sci department, and C/Labview from the School of Engineering).

In around 2004 I wrote a small side project in Java (a trip planner) while oblivious to the existence of IDEs. This put me off from Java for a while.

My favorite course at UND may have been Microprocessor Hardware in my junior year where we coded in assembly language.

I dabbled with Perl in my junior year at UND. Having both the option of if and unless (TIMTOWTDI) was fun, but the pervasive $_ and other context-sensitive behaviors quickly deflated my enthusiasm.

For my capstone engineering project I implemented a computer vision algorithm (image segmentation) on a dual-core DSP microprocessor (Analog Devices' "Blackfin") for the purpose of counting passersby. This project ran C on "bare metal" and exercised several low-level features of that processor (DMA, Multiply-accumulate instructions, unshared L1/L2 vs. shared L3 cache).

In around 2007 Python became my language of choice. I asserted to my Purdue co-workers at that "GUI's should be written Python (as opposed to C/C++), because one shouldn't have to care about memory management." Despite the convience of garbage collection, it was demoralizing when a few of my Python projects became too large to wrap my head around. In 2009-2010 I invested serious time into Android development and picked up more Java proficiency, finally realizing what I was missing in Python without static types.

Eventually I had to see for myself what all of the Haskell hype on Reddit was about, and after working through LYAH it became my go-to language for application programming. It approaches the concision of Perl (and even offers a choice of when and unless!) but with the protection offered by static types and quarantining side effects.

Rust is next in my study queue.