March 26, 2020

The Top 5 Software Developer Skills

What skills, regardless of what type of programmer you are, are important and will give you a ton of leverage in your career, multiplying your productivity, results, and the quality of everything that you do?

Here we're going to cover the top five skills for programmers that many people overlook when they're focused on the latest trendy languages or frameworks. The truth is, you're really gonna have a bad time if you overlook any one of these. I'll give you some specific examples from my four-year career as a developer.

Why Listen to Me? I'm a Self Taught Developer

If you're new here, I'm Aaron Jack. I went from broke English teacher to San Francisco software developer. I left that 200k job at Uber behind for the freedom of being a freelance developer. I'm also the founder of Freemote the freelance developer Bootcamp, which takes you from zero to profitable freelance developer.

1. Keyboard Mastery

The first skill is keyboard mastery. What does keyboard mastery mean? Well it means three different things:

Touch Typing

The most important part of keyboard mastery is getting comfortable with touch typing, that is, typing on your keyboard without needing to look at it.

For a long time, I actually thought everyone could do this, but then I realized I just played a lot of World of Warcraft when I was a kid. This might seem like a small thing but it's really not. All those milliseconds where you're looking down and then looking back up and looking back down again is costing you a fortune of time in the long term.

These little delays are limiting the bandwidth between your brain and what you put on the screen, so you're creating a limitation, a bottleneck for yourself by not transferring these ideas faster.

If you're not comfortable with touch typing, it's definitely worth mastering.

Learning Shortcuts

The next important part of the keyboard is learning shortcuts, both in your code editor and on your operating system.

It's actually true that how fast you can type doesn't matter as much as how fast you can navigate. Knowing just one small shortcut like ''command+tab" to switch programs on Mac, or ''alt+tab" on Windows, can save you hundreds and hundreds of hours over your career.

Within a code editor, like VS code, this can be "command+p" to open a different file rather than looking in the file browser. "Command+arrow" to go to the end of the line. "Command+backspace" to delete the whole line.

And here's a little bonus trick. To navigate around your editor faster, you can decrease the key repeat delay and increase the key repeat speed to the maximum.

keyboard setting on Mac

Typing Speed

Once you have the touch typing and the shortcuts down, you can then focus on your raw typing speed, which you can always make faster. It's pretty obvious this is also going to speed things up, whether you're writing code, comments, or entire documents.

2. Debugging

Debugging sounds boring. It sounds like it's not as important as sexy topics like system design and code syntax. But to me that's kind of crazy because it's actually incredibly important. As someone who talks with relatively new programmers every single day, you would be shocked how many people say "It doesn't work!" and "I don't know why?"  To all these questions I just say "Did you try printing out the value?" And the response is then "Oh, I'll try."

If you are in doubt, print it out. Print the values inside of a loop, a value before and after a function, just print everything! This is a simple and effective form of debugging. Adding some additional tweaks to your debugging workflow on top of this can have major implications for your productivity, too.

I'll use myself as an example. Here are things I should have been doing for months and years before I actually started doing them. Let's say I was having issues with CSS on the Front-End. Now for the longest time I was just randomly changing things until something magically worked. In other words, taking the brute force approach. But what I really should have been doing from the beginning was looking in the Chrome console and going to both the style and the computed tabs. You can see not only which styles are being applied, but also what specific file and what place in that file they're coming from.

It was the same with network requests and javascript. I'd write a bunch of error handling code just to print out my error response in body, but that information is right in the network tab if you click on the request for back-end debugging. It was absolutely terrible, I would just put print statements everywhere, recompile, rerun them over and over and over again. What I should have been doing was using built-in debuggers to step through each line one at a time. That way you can see the values of all the variables.

Python, for example, has PDB, The Python Debugger, you just import it and you can step through. There are also IDE's with built-in debugger interfaces that are really nice, like GoLand and Pycharm.

When I started using these to write production code, my life changed forever.

3. Skimming Through Text

Skill number three is skimming through text. It sounds cliche but the Internet really is your second brain. You need to learn the new syntax constantly, parse through articles for the most important info, read docs and forums to solve issues, and get specific code snippets.

99% of what's out there is just noise and you have to be able to filter through it, fast.

I would even say that you don't have to remember anything when you get good at skimming. You can operate like a hash table: you can just have the key, or the search term, in your head and you can retrieve the value from Google.

For example, I'm not ashamed to admit that I've been writing HTML for over four years and I still google "input element" every time I create one. Even though I'm 99.9% sure how to do it, I just like to be 100%.

So it's applicable for you, here are some specific examples, or "skimming tricks." In W3 Schools, Mozilla, or any other type of docs, if you more or less know what the code does, but forget how to write it, you can skip the description, or top section, and just skip down to the exact example you need.

The way I search through stack overflow is by always skipping the answer, going straight down to the questions, and not being afraid to click a few different questions to find my answer.

Another that might be obvious is using "command + f" to search for a specific term instead of scrolling down. You can try a few in rapid succession if you're not exactly sure what you're looking for. Or what like to call a "close proximity term." For example, in the jQuery docs, you might forget what the "toggle method" is called. It adds and then removes a class depending on the state of that element. You know "add a class" is a similar method, so you can just search for ''add class'' and then you know that'll bring you at least near "toggle".

4. Time Optimization

Skill number four is time optimization. What is it that separates a 1x developer from a 10x developer from a 1000x developer like John Carmack, Notch, or Satoshi Nakamoto?

In other words, what drives developer productivity to be intensely different orders of magnitude? Maximizing productivity comes about by focusing your limited time in a day in places that have the most leverage through micro and macro time optimizations.

You have to ask yourself continuously, at short intervals, "Is what I'm doing right now the highest leverage activity?"

New developers get tripped up so much on small details, creating unnecessary functions, classes, and abstractions, and going down the rabbit hole on things that don't even make a difference. They say with creative writing to write drunk and edit sober, I say code drunk. Or rather, code like you're drunk, get it working and then clean it up later!

Here are some specific time optimization tricks:

  • Timeboxing. Set a fixed amount of time to work on something. For example, 30 minutes. This does a couple of things: you won't get stuck trying to center a div all day, and it motivates you to find a good enough solution that you can optimize if you have extra time.
  • Tune out all distractions. If I'm with someone and I hear their phone vibrating on the table, with notifications popping up, I just know they don't get much done. All my notifications on my phone are off. I check them when I choose to check them.
  • Re-use code. This could be a library, a snippet from codepen, and so on. Just don't reinvent the wheel.
  • Get help when necessary. A minute of your mentor's time could actually save you hours of being stuck. This can be a double edged sword because asking for help too often will stop you from learning, so it's a judgement call.

5. Foresight

You have to be able to predict the best and the worst-case scenarios when building an app. There's something called the "happy path" in the development world. This is the way your app would work if your users were perfect angels. They use the same browser screen size and operating system as you, clicking only on the exact things you want, in the right order, with the right inputs.

Now, this is, of course, not how things are in reality. You have to be able to predict all the paths, not just the happy path. Users doing the most terrible things imaginable to your app. Having this foresight allows you to write what we call robust apps, that can handle any error and even the most hideous browser.

This foresight can also mean creating an admin dashboard, or ongoing support for your users. You also have to be able to predict how long your own deadlines will take because your team members, clients, and manager will all be counting on you. Of course, you want to be realistic, but you also want to be optimistic while factoring in those unknown things that will pop up that you can't yet imagine.

And lastly for foresight, you need it for your own career as a developer. You have to base your learning and career path on not only what's popular now, but what's probably going to be popular in the next five to ten years.

I don't want to brag, but back when everyone was arguing over whether React, Angular, or View was better,  I was saying "React. Just go React, 100%!" And I was actually right.

Now my prediction is, since the economy is getting more globalized things are shifting towards decentralized labor, the best-equipped developers are going to have freelancing capabilities, and my recommendation for freelance is to learn e-commerce development.