I graduated from college a little bit over ten years ago, and I’ve been messing with computers since I was 14. This doesn’t make me wise, but it certainly gives me a fair amount of experience to write one or two useful tips for newcomers in the industry.

The world certainly moves fast, and faster goes technology. This we all know and are used to it, but certain things in Computer Science haven’t changed and probably won’t for a long time: the foundation of this career is not only well defined but critical for anyone who ambitions to become good at it. Choose to ignore it, and you’ll be walking an unremarkable path forever.

I should have started here

Let me start from the beginning what’s already looking like a rant: back in the day when I was at school, all we had were hours and hours of Computer Science theory covering everything from wicked math classes, to data and file structures, to algorithms and everything in between. That was day and night, and it gave me the foundation I needed to understand how the hell I was supposed to program a computer.

That was the time when 1,024KB of RAM was a luxury reserved for a few. That was the time when everything had to be extremely optimized because “fast” wasn’t a quality of the equipment. That was certainly another time, but today is different.

Or is it?

Fast forward a few years

Today nobody starts anymore from the same place I had to start back in the nineties; there’s probably a library for that anyway. Programming languages have come a long way providing better tools, higher abstractions, and making our life easier.

And that’s good.

Software developers spend every day less time concerning about tools and platform issues to focus on what matters: innovation. From day one you get half the way walked for you (and maybe even more), so it’s easier than ever to finish what you started, to create something remarkable.

And that’s also good.

But somehow (and here is where my paranoia starts clouding my judge), we have forgotten what’s behind all of this. We have forgotten that computers still don’t understand anything past zeros and ones. We have forgotten that layer of complexity that makes the entire machinery work.

Do you really need all that?

Yes, you need all that.

Or maybe you’d like to be like Uncle Steve, who comes readily every time your car breaks just to tell you he can’t do squat about it. Or like Aunty Mary, who knows every cold remedy but can’t give you anything for after three straight fever days. In both cases you need to call the cavalry; you need the real solution to the problem.

So if you are fine settling with a band-aid role, be my guest. If you want to move past that and start wearing a real badge, you need all that.

Just like car mechanics start learning about bolts and nuts, and doctors go over every single bone and muscle in our body, software developers should start learning the very basics of computer programming. You can’t just jump straight to the finals and expect people to like you; you need every single bit of fundamentals if you want to be in the long run.

Still on the fence?

I honestly don’t blame you. Today we’ve got Stack Overflow, and Google, and GitHub, and ten thousand developers creating new JavaScript libraries every single day. Why in hell would you like to start with comparing stacks with queues and linked lists?

The reason is that you need to understand how things work to create other things. Software development is about creating software (duh!), and despite so many attempts to fast-track this process, professional knowledge can’t be challenged with templates and pre-defined blocks.

Like you can’t expect to be accurate with a gun without understanding the basic physics governing a projectile in the air, you can’t expect to Google your way out of every technical challenge you’ll face in your career. A brand-new shiny library is not useful if it doesn’t work out of the box and you can’t figure out the reason, and contrary to popular belief, every single problem does not have a solution in Stack Overflow, so you need to be prepared for that.

I’ve seen; therefore I believe

For years I’ve been honing my skills in this “underworld” of Computer Science knowledge. Thanks to this I’ve gotten myself out of situations that would’ve taken others a ridiculous amount of time.

I’ve seen friends stuck with problems easily solved by a basic understanding of memory management. Or two people fighting over the way to go when one option was clearly a bad choice. Or the guy pulling his hair out because a couple of hundred requests obliterated his entire system.

Every one of these cases became a problem because the fundamentals were ignored (or unknown). You can keep yourself afloat on high abstractions for a long time, but when the time comes, your only ticket out of drowning will be your ability to connect the dots and think through the problem.

Closing the full circle

Like great singers learn to play piano early on, software developers must learn their world from the inside. Here are just a few topics that will keep you on your toes and create a solid foundation to support your entire career:

Algorithm analysis

Data structures

File structures

Sorting and searching

Graph traversal

Dynamic programming

And that’s just scratching the surface of what we all need. The content will never stop showing up at our door, begging to be learned. It’s up to us to open ourselves to an experience that will shape our future like nothing else.

Choose carefully

If you are just starting out on this path, and siren songs asking you to keep your feet dry are resonating with you, think again: you may be barking up the wrong tree.

If you choose to be a professional software developer; if you want to be the person on everyone’s speed dial; if you want to say “I’ve got this” and have everyone believe in you; don’t go the easy way.

Choose to learn above anything else. Choose the pain, the tears, the nights and nights with your head stuck in a book. Choose to be somebody with a real and profound understanding of your field.

And there’s only one way to do that.