Compounding Knowledge in Programming February 11, 2019

I read this article Compounding Knowledge from Farnam Street and enjoyed it. The article talks about lifetime learning and figuring out what to learn. There is a ton of information out there and it is not all correct or tested. How do you pick what to read and learn? Tons of smart people have different answers, some only read books published at least 10 years ago, others read no news. Can we apply a similar principle to help us keep up in technology?

In the fast moving programming world Hacker News has new frameworks and technology daily, but can we can find knowledge and patterns with longer half lifes. Technology is infamous for being fast moving and constantly changing but as things change, a lot does not. Skills and technologies you can learn that will be compounding knowledge:

Debugging

Do you write perfect code the first time? Do you only use other code that is perfect? Probably not. For most of us, things will go wrong. How we handle when things do not work is a transferrable skill that will not stop being useful.

Learning to break down what is happening, validating assumptions, and inspecting components that are not how you expected are the basics of debugging. Of course there are multitudes of debugging tools that can help and pieces to learn about but these come with time and experience. To start on the debugging path you just need to print output from your program.

Pages could and have been written on debugging but one other thing to learn is to not be afraid to jump into code you use. Sometimes your code will be correct but a library, language or even operating system will be effecting your code.

These debugging skills can probably even help you outside of computers!

Editing Text

The year is 2019, text is so 1970’s, when you need to program you hop into VR and … open up a text editor.

Yeah, when you need to program you open up a text editor, that same tool that’s been around for decades. Emacs and Vi were both initally released 43 years ago. People still use these tools today! Of course since then we have gotten a lot more editors and IDE’s but in 43 years we have still rely on reading and editing text.

Editor wars have flamed on for decades and the fires will burn for decades more. People love to tie their programming identities and credentials to being able to use a particular editor, it really does not matter which though, pick a text editor and get good at using it. Using a text editor well will not stop being useful anytime soon.

Managing Text

As a programmer we are not just editing text; we need to view, search, track changes, build a mental map of how things work, etc. To help you do this there are a tools that will pay dividends long term, pick some and practice using them.

What was this function doing when it worked? What did it use to do? These are important questions that will help you if you know the answer to. If you use version control for your source code you should be able to find that out. Knowing how to use and track changes like this is useful almost daily.

Once you are working in an established code base or on a team with other members there will be code that you have not seen before or that you have not read in a while. You are going to need to figure out what is going on in the code. If you learn to search and jump around with your editor or the command line you can jump into new projects and languages easier.

If you want to learn how to use the command line for managing text here are useful tools start: moving files (mv), removing files (rm), searching for text (grep), end of a file (tail), and word or line count (wc). There are a bunch more but if you start here you can dig in and learn more.

Testing Code

Once code is written it starts to rot. Not literally but your brain will decide to forget details on exactly why you wrote what you did and the programming library, API or language you use will update and your code will no longer work correctly. Sometimes the code works great but it needs to change because your requirements changed.

How do we know what still works and what changed or broke? If you move a bunch of code around does it still work? Of course you will manually run it and check that it compiles or looks right but how do you know? You don’t. Verifying code is important and comes from having automated testing.

Knowing how, what, when and where to test code is a really important skill that translates well across all programming and I would qualify as compounding knowledge. Writing testing this will also help guide design decisions and help your code last longer so you can solve new problems, not old ones.

Managing, Storing and Accessing Data

Databases and data storage are a huge component of nearly every software project. Understanding what your project needs for data storage and then implementing it correctly is an important task. If you use the wrong tool or the right tool in the wrong way your project can be technically awesome still a failure.

Databases can get complex; understanding the access patterns you need, the tradeoffs between database types, using caches correctly, and more will come with experience. To get started though a good place to start is to pick up a skill that is still being used 45 years after it appeared: SQL.

SQL is a programming language for defining, accessing and processing data from databases. It is used today by almost every technology company in some aspect and the fundamentals generalize well to other databases and technologies.

Learning

Improving your ability to learn is going to continue to help no matter what happens next in your career or in programming. Technology is constantly changing but if you continue to focus on improving your ability to learn while adding some knowledge that sticks for the next round you will have success.

You do not have to learn every new technology or framework, instead focus on the problems you want to solve and try to learn what the tools are doing to solve those problems. Learn the problem’s details and what you need is useful and will save you a lot of time and can enable super powers of getting stuff done.

Identifying what you do not know, understanding how to learn that and then discerning what you need and do not is a valuable learning skill will come back over and over again.