This question was recently asked on HN and it generated some really great discussions, so I thought it would be interesting to pose the same question here. Here’s my list:
~20 years ago: Vim
Seven years ago: Haskell
A year and a half ago: Reflex FRP with GHCJS
These three events dwarf everything else in my experience.
If you don’t mind, care to expand a little bit on how they changed your carrier?
Relational DB - I’d not even heard of relational DBs. This is pre-ORM, pre-Database Administrators. My role was to evaluate how we might use relational databases for electronics design and simulation tools. Among other things this shaped the way I evaluate software - as a tool for a purpose with strengths and weaknesses. And I’ve also developed a useful perspective on relational databases vs. other data models, query languages, etc. I’m often surprised at the perspectives and “baggage” other programmers bring to the topic based, from what I’ve seen, on the “culture” that developed around relational databases as well as the intent to use it for what does not provide: a complex object-oriented data model, for one example.
Common Lisp - I’d already used several Lisps, mostly MacLisp on a PDP-10 / TOPS-20. Again my role was evaluating how we might use CL for developing ECAD tools and I learned valuable lessons in making objective technical assessments. Moreover CL caught the attention of several co-workers, some with Lisp experience, some not. This led me to see Lisp as a language for developing real software for production. My previous experience was in school, where I had a fair bit of paid programming experience, but did not have nearly the perspective on these kinds of evaluations and decisions.
My experience with CL reignited my appreciation of Lisp and led directly to joining Boeing to work on electronics manufacturing planning with Lisp Machines. Lisp Machines taught me that $100,000+ per developer for H/W and S/W can pay off big dividends. A good bit of that experience is available today via open source. But that remaining 20-30% or so sure is valuable and missing today. One way that may have affected me is that I’ve had no problem spending many thousands of dollars for development tools over the decades.
Smalltalk and the Tek 4400 taught me Smalltalk and Lisp are two sides of the same coin, and I prefer using either of them to any other… coin? Simple, expressive languages with really good runtime tools continue to be my preferred method of development. I was also part of the team making the decision to use Smalltalk on $20k machines vs. Lisp Machines at 5x the cost for end-user applications. So further experience at technical evaluations and also my first experience with some aspects of budgeting.
KnowledgeCraft solidified my foundation in logic, rules, and semantic networks. This has shaped the core of what I’ve brought to nearly every software system I’ve worked on since. A small but growing segment of the software industry is beginning barely to scratch the surface of this with things like GraphQL. The Semantic Web folks are squarely there for information analysis systems, less but increasingly so for operational systems.
I ended up using GemStone several times over the years and worked there for 5 years in the late 1990s. This shaped my understanding of relational databases and the misnamed “NoSQL” which is really a wide spectrum of capabilities other than RDBMS / SQL. I also learned a lot about what came to be known as “software transactional memory” – both good and bad. Among many other things.
Jini and JavaSpaces are just the best thing about the Java landscape, and one of the best things in the distributed systems world, period. However virtually unknown and drastically under appreciated. However it continues to be at the core of how I think about distributed systems generally. Even the good software I’ve used since pales in comparison.
Hope this helps.
Thanks! Much appreciated
Unix
Before discovering and learning Unix, my computing life was either DOS or terrible GUIs. Unix changed everything I thought about computing.
Perl
The first language I was truly fluent in and able to just reach for in (almost) any situation was Perl. I never code in this anymore, but it will always have prominent place in my version of history.
Version control
Right back to CVS, through SVN, and now ultimately to Git, version control makes programming possible. Maintaining multiple copies of files with filenames structured with dates and typing version numbers by hand into files was always a major obstacle to rapid (or not rapid) iteration.
Virtualization
Included in this is all forms of virtualization; VM, container, even good ol' games emulation, etc. The ability to mimic a second system, alternate architecture, spin up a lab environment, etc, has been essential to being able to experiment freely.
Ethereal (Wireshark) changed the way a lot of us network hardware / protocol / security people worked. It used to be that if your company could afford to buy a packet capture and decode device, it was a shared hardware resource, and it certainly couldn’t decode any new or proprietary protocols that were under development. After Ethereal, anyone with a workstation could capture and decode packet streams.
I wrote the original PPPoE decoders for Ethereal in 1999 when there were less than 20 of us working on the project. I ended up writing several other proprietary protocol decoder modules for various companies over the years.
Working on Ethereal definitely changed my career for the better.
What is OTP and why is it, and Elixir, great? I see lots of posts on here tagged for Elixir and it makes me think I should look into it.
OTP is a bunch of middleware that drives erlang/elixir/lfe/BEAM-langs'. Bundles of libraries for common tasks that are considered integral to [erlang|elixir|et al]. Elixir is a fancy new language built atop the BEAM vm (like erlang) with erlang interop, macros, and other neat things. If Lisp Flavored Erlang didn’t exist, I’d say Elixir is to Erlang what Clojure is to Java. (Not that I have any real experience wth these things. Someone wwho actually makes use of elixir and/or OTP care to correct/clarify/elaborate?)
13 years ago: C++. I was a freshman CS major. “Intro to CS” was in C++. This literally changed my career – I changed majors because I hated it so much. (Although, this was less about C++ itself and more the whole learning environment.) (And I kept programming games and websites for fun.)
3 years ago: Haskell. I’d decided to go back to school (a local community college) for programming just because after 10 years of searching, it turned out I wasn’t good at anything else. I was learning Java, but it was just about trying to get a piece of paper to get a job. Then I found out about Haskell somehow and got into this whole other world.
A few short years ago: Emacs. It introduced me to the love of my life: Lisp.
Also, maybe a bit surprising to some: JavaScript. Getting a job writing JS set me up to get a couple other jobs, and I’ve made a lot of great friends through those experiences. Not to mention that JS also introduced me to FP and subsequently Clojure(Script) and a wider world of programming languages.
Yeah, I can definitely agree with your choice of Emacs. I recently switched from Vim to Spacemacs and it was a significant jump in my productivity. I almost put it in my above list, but decided not to because although it was a big improvement, it wasn’t quite as paradigm-shattering and career-changing as the other three.
When I was little I would play around with batch files and “toy” languages. Eventually I discovered PHP and it sent me spiralling into a love for code. PHP showed me how easy it was to create and the depth of the language, even back in the early 2000s, proved that while I was making basic calculators I could eventually use it to write whole complex websites and applications. I got many jobs as a result, and it was the beginning of where I am today.
C, especially working with sockets, pointers, and low level memory finagling, got me excited again many years later and put “the kernel” and low level operations within reach. I pretty much only used C in college but it was great and I’m still fond of it today for being such a raw language.
Python, and advanced libraries like Django (I know it’s a framework, I’m sorry), changed how I look at problem solving and made no problem too small to deserve a properly implemented solution.
Also vim and tmux totally changed my workflow and made appreciate keyboard interaction. I used tmux and i3 as daily drivers at a previous job and felt most at home.
QBASIC.EXEwhile trying every executable inC:\DOSto see what they did. Started to learn to program, first using QBasic, then Visual Basic.In general it wasn’t the technologies themselves that changed my career so much as the concepts and ideas they opened up to me, beginning with programming itself, and then areas of interest — systems, web, VCS — that culminated in me working in the intersection of all three.
I’d love to hear more about how Reflex changed your career so much.
Before Haskell I wasn’t really interested in web development at all. Haskell single-handedly made web development interesting (and a lot of other things more fun too) because it provided a learning challenge and abstractions that were up to the task.
Before Reflex and GHCJS I wasn’t really interested in front-end development at all. Reflex single-handedly made front-end development interesting because it provided a learning challenge and makes complex interactive and composable GUIs enjoyable to write.
After that, most of my learning has been self-directed; I haven’t met something that completely takes me aback and makes me change direction. I’ve learned the functional paradigm, done a lot of reading in types, learned more about algorithms and distributed systems… but nothing has felt like it cast as long a shadow as the events above.
1) Behavior-driven development. Organizing interactions as tuples of
changed the way I view system testing and design.
2) Remote pair-programming using tmux.
3) Types-as-design-drivers and types-as-documentation (Haskell).
4) Being able to rely on the runtime for debugging, introspection and resilience (Erlang/OTP).
Interesting question and to reflect on major events. I’m substituting ‘career’ with ‘life experience with programming’. These probably aren’t the things people are expecting, but stick out as inflection points:
(Interesting that I haven’t had any major events in the past ~10 years or so, hmm!)
1990s:
2000s
2010s
Sorry, this turned more into a personal journey than a list of tech. But it was fun to create this list, so I’ll leave it :) Also reminded me I’m starting to stagnate. Time to crank up the knowledge vacuum.
1995: Windows 95. Got me into GUI programming.
1996: Borland Delphi 2. Made the former enjoyable.
1997: First home install of Linux. As a Finn, this was cool. Think it was Red Hat 5 or something.
1999: SourceForge. “What’s open source?”
1999: PHP. Hey, web apps!
2000: SVN. CVS with better commits.
2002: .NET Framework. Fun GUI programming.
2005: Ruby on Rails. Web development got really fun.
2005: Git & Mercurial. Distributed SVN!
2005: Vim & Emacs. “Check this cool trick out!” fumbles with keyboard “shit, that wasn’t… wait…” fumbling continues forever
2007: Haskell. What the hell is a monad?
2008: Scala. Java with monads!
2008: Clojure. So many parentheses…
2009: Go. I still don’t know why I liked it, but I ended up coding it professionally for three years.
2009: NodeJS hey guys heard of event loops
2013: Rust I am not good with programming.
Of course, you could consider 1988 a relevant year, when the biggest tool of all eternity, I, was born.
Interesting question! Not all of them are development or even tools related, but they still influenced me heavily.
For me:
I’ve done/learnt a lot of other stuff besides the things listed above, but off the top of my head those are the most influential. At least sitting here today writing this!
My career has largely involved around SAP (and it still pays most of my salary today), but in reality it hasn’t really influenced my approach to things. I think of myself as a Unix/open source person in a world of enterprise proprietary software and reconciling the two can be difficult at times.