Over the course of the last couple of years, I've worked with a few interns and entry - level developers. This article lists some of the suggestion I have often found myself repeating while trying to provide them with guidance.
In a way these are the advice I'd give my younger self if I could. Things I wish I had known back when I was fresh out of university and looking for a job as a developer. Lessons that have - or would have - helped me navigate the first year of my career, once I did eventually start my journey into software development.
How do you decide what to learn when you are starting out? There is no shortage of programming languages and frameworks. The industry is afloat with buzzwords like data science, machine learning, micro-services, cloud computing, NoSQL, DevOps, Blockchain, and on and on it goes. Then there are the abbreviations. So. Many. Abbreviations. UI, UX, API, OOP, IoT, CMS, CDN, PaaS, SaaS, what do they even mean?
First off, you can rest easy knowing that none of the popular programming languages have that short a shelf life. They are popular for a reason and there is a certain domain for each of them in which they solve a specific problem. And if they didn't excel in that problem domain by virtue of features or tooling they wouldn't be popular in it. Secondly, under the hood all programming languages do the same thing; they manipulate the computer's memory. So, knowledge of one translates nicely to others.
The only thing you should be focusing on when learning the language of your choice is the fundamentals. Beyond learning how variables, conditionals and loops work in your preferred language, it's important to understand how the type system works. It is also good to have a rough understanding on how a computer's memory works. Combining that with knowledge of what data types are available to you in your language, and knowing how to make use of common data structures and algorithms will help you be an effective problem solver and thereby do well in technical interviews. Additionally, try to get enough practise to be able to code simple problems quickly. If you already have a good grasp of the basics, practise pointers and recursion problems. Sure, some people will tell you that you won't have to use them a whole lot in real life, and for a lot of jobs that may be true; however, solving pointer and recursion problems stimulate the sort of indirect thinking that is extremely useful for writing good code.
I'm not of the camp that think a Computer Science degree is useless. It most definitely is not. Whether a CS degree is worth the money or not is a different question and the answer to that will depend on your situation and the particular school that is offering the degree. That being said do not fret if you don't have one. Just be aware that you will be competing against people who do and therefore there exists a certain gap that you have to work to fill.
We are privileged to work in a field where you can get the equivalent of an undergraduate degree on the internet free of cost. Coursera offers a lot of great courses that you can audit for free. Then there is MIT open courseware, edX, etc. Unlike a lot of the other hard sciences, your learnings in Computer Science will not be hindered by the lack of a laboratory. You laptop is an adequate lab for all the online courses you could possibly take. Make use of that privilege. Don't underestimate the value of a good education.
If you do happen to have a CS degree, you have a head start. But don't let that be an excuse to get arrogant and don't make the mistake of looking down on those who didn't. Chances are those who taught themselves how to code have a lot of passion and that will make them effective developers. Some of the best developers I know didn't come from a CS background.
Use your time now to learn the topics you missed out on in university. Electives that you planned on taking but didn't get around to; the ones that got away.
The following is a list of topics I consider valuable knowledge for any developer. I've listed them as courses or subjects offered in CS degrees and ordered them roughly by their importance. You don't need to be familiar with all of them before you land your job obviously; the goal should be to continue learning these topics on the side once you do start working as these will make you a better programmer in the long run.
- Data structures and algorithms
- Object oriented programming
- Programming languages (a course that covers type systems, functional programming, comparison of functional and - object oriented programming, interpreters, etc)
- Operating Systems
- Hardware or systems programming(C/C++)
- Computer organisation/architecture
If you haven't formally studied computer science at a university, these are the subjects that will help you close the gap the quickest. There are plenty of resources available online that will give you an adequate background for all of these topics. If you have are currently enrolled in a CS degree or plan on attending one in the future, try to make sure you cover these at university. And if you have completed a CS course, you may want to study up on the topics you have missed and revise those you have already studied.
When learning, always focus on depth rather than breadth. You're trying to build a career here, and should therefore aim at mastering your craft. There is no shortcut to mastery.
Some additional subjects for you to look at if you are interested in getting into the coveted Artificial Intelligence or Data Science field are as follows:
- Linear algebra
- Multivariate calculus
- Undergraduate level statistics
- Machine learning
- Computer vision
- Deep learning
- Natural language processing
A big part of the job is to read documentation. There is no point in memorising what features and functions are present a particular library or framework. You'll remember as you gain more experience with a particular framework. Early on, you just need to know what is possible build with each bit of technology you use and ensure that you know where to look it up. I received this advice from my senior developer at my first job and it has helped me throughout.
I've touched on this in above and you might already be wondering what's my beef with frameworks. While there is great value in specialising and building an expertise in your preferred tech stack, I firmly believe that the early stages of your career should be focused on learning the fundamentals.
Understand this, if everyone simply relied on existing frameworks and libraries, no new ones would ever get made. My advice is therefore to learn the basics so that when the time comes, you will be ready to write your own. Those are some of the more rewarding experiences you can have as a programmer.
As you gain more experience, if you are at least somewhat decent at what you do, you will soon have your LinkedIn inbox flooded with recruiters. Some of them will be good too. They will come at you with promises of shiny new jobs, with better pay, seemingly more interesting projects, and a chance to work with newer, more modern tech stacks.
If you are always chasing after the next big thing, you'll never get to enjoy where you're at. Take the time to appreciate your current project, your tech stack, your job, and make the best of the learning opportunities presented to you.