Advice to Junior Developers
Tags: codenewbie, softwaredevelopment, juniordev, javascript
Published: 2020-06-14 05:52:01

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.

#1. Learn your fundamentals
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?

If you happen to be interested in the JavaScript ecosystem or the front end (If you haven't come from a CS or IT background, there's a chance you don't really understand the difference between front end and backend developer yet - is there  even a difference? and what's a full - stack developer anyway? I didn't know when starting out)  you are probably overwhelmed by the plethora of JavaScript frameworks all of which seem to do the exact same thing. This is actually true for most of the popular programming languages. Popularity breeds frameworks.

And how do you even decide on a programming language? You've read on a blog somewhere that JavaScript is the future and then found one that claims "webassembly is going to replace JavaScript". Maybe you should learn Java, all the enterprises seem to have it on their job listings but then you hear you friend say that Kotlin will make Java obsolete. Who can you trust? Do you just pick a programming language that makes your resume more impressive? but what happens when that language is replaced by another one? 

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. 

That being said some languages are more beginner friendly than others. For instance, I wouldn't recommend JavaScript and C++ as a first language to anyone. Stick to one of Java, Python, or C, and learn it well. If you do that, you'll be able to pick up new languages in no time when the time comes. Don't waste too much of your time learning frameworks to make your resume heavier. No development team worth joining expects its juniors to be experts in a framework. Frameworks should be picked up on the job. 

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__.

#2. If you don't have a CS degree, Don't worry
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.

#3. If you do have a CS degree, don't let it get to your head
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. 

#4. These are the topics you need to learn/revise
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
* Compilers

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

#5. When learning a new technology, know what's possible and know where to look it up
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.

#6. Don't waste your time mastering frameworks and libraries
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. 

I work as a consultant across the full web stack and am often required to move from project to project. When I'm working on the frontend, I have to switch between frameworks - what feels like - every other day. The only thing that helps me retain my sanity as I juggle the likes of React, React Native, Vue, Angular, jQuery, LWC, Aura, VisualForce, Redux, Redux Sagas, Apollo Client, etc. is the time I spent early on in my career building up a firm grasp of JavaScript. Knowing the language that lies underneath those frameworks and libraries help me learn new ones on the fly. 

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.

#7. Take to time to enjoy where you are at
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.