You are what you know
Tags: pragmatic, programmer, learning, career
Published: 2019-10-29 08:37:55

---
title: You are what you know
published: true
description: A continuation of the discussion on The Pragmatic Programmer, 20th Anniversary Edition
tags: pragmatic,programmer,learning,career
cover_image: https://thepracticaldev.s3.amazonaws.com/i/3u9mevpp4ruusoxfek53.jpg
series: pragmatic-programmer
---

I can't help but steal the opening quote from this section of the book:

> _An investment in knowledge always pays the best interest
>  -- Benjamin Franklin_

Your knowledge and experience are your most important assets. Just go ask any employer if they'd prefer a programmer fresh out of college, or one who has spent 10 years across multiple domains, languages and frameworks. And just guess who will get paid more?

The point is: this is _your career_. If you want to stay relevant and progress to higher responsibilities / more pay / more interesting work, you need to be _constantly learning_.

Your knowledge and experience doesn't just encompass your programming chops -- though that's an obviously important part of it. It also encompasses domain knowledge (my first programming job, for instance, was at a company who thought I'd be a better fit because of the Chemical Engineering degree I'd failed to get -- they assumed I'd know more about their business domain) and what we ironically call "soft skills", even though they're often harder to obtain:

- working in a team
   - our profession is not a solo sport! It may _seem_ like you don't need anyone, but trust me, you do!
- resolving conflicts with others
   - because we're going to disagree -- it's _how_ we move forward from there that matters
- ability to express yourself verbally and in the written word
   - because people are going to judge your competency based on how you articulate yourself and your ideas are more likely to flourish if they can be communicated effectively
- and even your ability to learn
   - in most of my positions, I've been known as the guy who can get up to speed with something new in a short amount of time. This means that I've been a bit of a "pinch hitter" on teams that needed immediate help, I've had the fun of trying out new languages and frameworks, and I've had the opportunity to learn even more, both technical and domain-wise

## Great! What's the game-plan?

### _Invest regularly_
You need to set aside time to learn new things. I also highly recommend talking to your company to organise a time when the whole company is involved in learning new things. At [Codeo](https://www.codeo.co.za/), we have "10% time" on a Friday afternoon, during which it's highly discouraged to do production work (though sometimes there's an emergency). We break out to spend time learning something new, all the better if it aligns with a company goal, but not restricted to that. [Chillisoft](https://www.chillisoft.co.za) has a similar concept, although run a little differently.
Your learning path needs to be continual though. It can't just be once a year or "whenever you get to it". Technologies around us are evolving so quickly that it's not impossible for the skills you have today to become obsolete in a year or two.

### _Diversfy your knowledge base_
Learn a new language. Learn progamming in a new paradigm / domain (if you write business apps for work, try work on a game, or some other useful utility, and vice-versa).
The more _different_ things you know, the more _valuable_ you are to a potential employer. Also, the better you get at the things you already knew. Learning F# by having to program in the language for a work project changed how I programmed in C# and JavaScript -- I had a new outlook towards the code I wrote, trying to take the good things from the functional paradigm (immutibility, composition) and bringing them into my other "daily driver" languages.
I only got the opportunity to work on a customer system in F# because I was known as the "guy who picks up new things quickly".

_Fun fact: we wouldn't have LINQ today if it wasn't for the preparation which was being made to the internals of .NET to support F#._

You should be learning new things in risky, fast-moving areas, and also learning new things in your stable bread-and-butter role. If you're a C# developer and a new language version arrives, go find out _what's_ new and _how_ you can start using it to write better code. The same goes for any language -- many popular languages are still in active development, getting new features on a regular basis. TypeScript and JavaScript are good examples.

### _Review_
Periodically, you need to review the knowledge in your bank:
- where is your knowledge outdated on technologies in active use?
   - I've spoken with C# devs who are still living in the version 5 spec! They're missing out on some really cool features!
- what technologies have you been watching that are starting to make it big? which ones are falling by the wayside?

I often see people looking to change their jobs because they've been doing the same thing for the last five years. The problem I often see with these applicants is that _they've been doing the same thing for the last five years_. I don't mean in their daily work -- there are some companies who have tried-and-tested technologies that they stick to. You could [be a catalyst for change](https://dev.to/fluffynuts/be-a-catalyst-for-change-3ag1) and start trying to bring in new tech, but when that doesn't work, you have to make the time _yourself_ to upskill if you want to move on. 

I remember pouring myself into C# and ASP.NET MVC (2!) when I was looking to move out of a toxic company. I'd been working in C++ for about 5 years, and saw that the .NET ecosystem was just getting bigger and more in demand. Also, the work was fun! Since I'd had experience in asp classic, php and webforms, MVC was a new and exciting way to get web stuff done.


## Goals
- Learn a new language every year
   - every language I've learned (over 20 with reasonable proficiency) has helped to shape how I program. I take learnings of things I like from languages and apply them to my "daily driver" languages. I've also learned that there's no perfect language, framework, operating system, compiler, IDE... anything (:
   - it doesn't matter if you never actually _use_ this language for major work: the experience is worth it
- Try new tooling / environments
   - Try out a Linux distro
   - Try a different IDE / shell
- Read!
   - technical books, if you can afford them
   - blog posts, articles on your tools and tools that seem interesting
   - non-technical content, like books about human behavior and psychology
   - go get an Audible subscription
      - first month is free
      - you can keep all books you got during your subscription, even if you stop
      - I can recommend some non-technical ones:
         - [Barking up the Wrong Tree](https://www.audible.com/pd/Barking-up-the-Wrong-Tree-Audiobook/B06XY7T9JT?qid=1572337069&sr=1-1&pf_rd_p=e81b7c27-6880-467a-b5a7-13cef5d729fe&pf_rd_r=K36XJM4615GQ57MR9R3S&ref=a_search_c3_lProduct_1_1)
         - [The Righteous Mind](https://www.audible.com/pd/The-Righteous-Mind-Audiobook/B008O8964Q?qid=1572337077&sr=1-1&pf_rd_p=e81b7c27-6880-467a-b5a7-13cef5d729fe&pf_rd_r=JJT5VJV06V17RHQ8NK8F&ref=a_search_c3_lProduct_1_1)
- Online courses
   - [Coursera](https://www.coursera.org/)
      - there are paid courses, but also _a lot_ of good, free content
   - [Udemy](https://www.udemy.com/)
      - Udemy practically _always_ has a sale going on where you can pick up a course to keep for lifetime, for a low cost. Also, I've found that a lot of courses are kept up to date by their authors, so they stay relevant
   - [Khan Academy](https://www.khanacademy.org/)
      - I don't have a lot of experience here, but I've heard a lot of good things!
- Learn things which are _non-technical_, stuff which is just plain interesting!
   - I've done online courses in paleontology, game theory, data science. Pick something and do it (:
- Other people!
   - join a local user-group
   - take time to talk with your colleagues about stuff you've learned & learn from them
   - if you're in a job where you're the solo developer, I highly suggest looking around for a job where you work on a small / medium team. You'll learn a lot from other people -- and perhaps you'll find (or become) a mentor!
- Stay current
   - follow interesting people on Twitter or [right here](https://dev.to)!
   - sign up for newsletters & podcasts from different sources. I can recommend a few:
      - [dev.to](https://dev.to)
      - [The Code Project](https://www.codeproject.com/)
      - [The Fast Company](https://www.codeproject.com/)
      - [The Changelog](https://changelog.com/)
      - [Scott Hanselman](https://www.hanselman.com)
- Always be prepared to learn
   - have some ebooks or audio books on your phone, for those times when you're stuck waiting on some other process (like being in a queue, or broken-down car)