I can still recall my university years: my brain was full of technical topics ranging from algorithms, data structures, SQL, Java, and C++, to broader topics like quality management, knowledge management, and project management. The only thing I didn’t have was confidence that I could get anything done at any company.
It took me years until I understood that I only needed two things: the right resources and massive action. This article will highlight what resources I would give my younger self to achieve drastic acceleration in my skills and experience. If you are a junior developer about to start your first job, this guide will help ensure that you’re developing both soft and technical skills needed to succeed.
Software development careers are based on a combination of technical skills and soft skills. Both are equally important to get ahead in your career. This article will address the following areas:
- How to market yourself
- Professionalism: skills overlooked by universities and some coding bootcamps
- Keeping up with the developer community
- Coding skills and tech interview preparation
- System design skills
- Continual Learning
Let’s explore each area one by one.
1. Marketing Yourself
It is never too early to start marketing your skills and expertise. The more expertise you obtain, the more achievements you can refer to when marketing yourself. If you are a beginner, you have to focus on earning your stripes and highlighting those achievements.
If you are a beginner, writing a commit every day can help build momentum. Your most important ally is your portfolio. If you build a track record of getting things done, your potential employers will believe that you are a developer capable of solving problems. Make sure you create a GitHub profile and create a portfolio website that is worth checking out. You can host your own Wordpress site, or you can choose a free github.io site.
When building your portfolio, make sure your commits are clean and your code is well commented. Otherwise, you get a chance to destroy your reputation before the first interview gets started. Above all, avoid stealing the intellectual property of other people. If you used a source, fork from their repository, or mention them in your readme.md file properly giving the original authors credit, according to the licence they provided with their own repository.
Create an all-star LinkedIn profile. All-star is a term used by LinkedIn indicating that you completely filled out your profile. This includes your career mission. The more information you provide, the more visitors your profile will attract. I get multiple contacts a week on LinkedIn, both by headhunters, CEOs, and CTOs. I cannot promise the same results for you as a fresh graduate or self-taught programmer, but it is never too early to start building your online presence.
If you want to go the extra mile, create a blog. Self-hosting your blog makes the most sense in the long run, because you do not depend on the platform where your articles are published. There are some stable communities such as Medium.com, and your risk of Medium discontinuing its service is very low. Therefore, if you are seeking the path of lower resistance, you can also create an ad-free service on Medium. A blog positions yourself in a better position than most software developers, as long as your articles provide value, and your content does not conflict with the role you apply for.
One example from my career was a software developer who applied for a BackboneJs role. He had a blog, but this blog was full of major grammar mistakes. He highlighted an article detailing his opinion on BackboneJs. He wrote that BackboneJs is a flawed, horrible library, and he went on a rant in his article without providing any justification. Avoid being too opinionated, unless you can back up your statements with facts.
Your social media presence adds a tiny plus to your online presence. Your downside can be major though. If you apply for a startup position, the party photos are absolutely fine. However, if you apply for a corporate position where people work in suits, even if your hiring manager gets drunk once a week, your party photos will put you at a major disadvantage. Everything that’s public on the Internet may be used for or against you.
A well written résumé is just as important as a well written LinkedIn profile. Make sure you avoid these 7 common mistakes when writing a résumé.
When marketing yourself, I suggest that you don’t call yourself a programmer or a junior developer. If you refer to yourself as a programmer, you tend to talk about yourself as a commodity. Business people tend to respect developers more than programmers. A programmer is someone who is capable of writing code. A developer is someone who can develop and maintain a software solution. An engineer is someone who provides scientific solutions in a professional manner. An engineer can not only develop a system, but they can also design it, and communicate with stakeholders while managing the development project. If you don’t have an engineering degree, calling yourself a software developer is fine. Calling yourself a programmer runs the risk of receiving less respect in the industry, which leads to some problems in your personal brand.
Most software developers focus on learning technical skills. Getting better at React, learning more about Machine Learning algorithms, or becoming a technically competent architect are examples of common aspirations of software developers.
Especially when you are young and ambitious, you may feel overwhelmed by the avalanche of knowledge out there. It is easy to focus on just increasing your technical skills and pushing other aspects of your development to the side.
This is a mistake.
Because technical skills are not enough when a business person says he has already committed to the board that you, the developer, will deliver an affiliation platform in three months. Tech skills won’t get you promoted to a lead role. Tech skills won’t help you when some of your colleagues are toxic and they poison most people with their attitude.
I define professionalism in this article along the line of actions that are in alignment with what developers and non-developers expect from a software developer. This includes:
- Defining your standards and sticking to them
- Never pretending that you know something you don’t
- Giving accurate and up-to-date time estimations
- Being clear with your boundaries
- Negotiating win-win situations.
Let’s examine these actions one by one.
First, you have to have standards as a professional, and you have to stick to your standards even if your boss threatens to get you fired. Your work ethics and standards should be clearly defined. When someone tries to violate these standards, a professional sticks to them.
Professionals are easy to work with, because they are open to admitting that they don’t know something. Amateurs pretend that they know what others are talking about, and may sit in a meeting for an hour without ever speaking up that they do not understand a word.
For instance, once my team coached a software developer who was really struggling with his performance. He was regarded as a software developer with below average skills, who mainly caused trouble.
He kept on getting cutting edge resources, yet, he never made it to the next level. He did the absolute minimum not to get fired. When he was closely monitored, he pretended that he was learning hard, he pretended that he understood what was going on, and he seemed dedicated to improve.
However, right after he got a contract extension or he was removed from a performance improvement plan, he fell back to his old tendencies.
One day, thanks to a colleague of mine, we found out why this problem was happening. Our underperforming developer had good enough skills and attitude. He was just afraid of admitting that he does not understand what we told him. He couldn’t get better, because he was afraid of appearing bad. He thought that we didn’t see through all this.
Think of yourself as if you were an ant. You don’t think people see you, because in your reality, you just walk and gather food. People still see you. They just don’t tell you that they do.
My colleague learned this lesson, and today, he is an above average developer, and he is the first to admit if he does not understand something.
Third, in a professional environment, time estimations come from the development team. When management asks you to be faster, but you know the request is impossible or highly unlikely to be achieved on time, you speak up even at an expense of losing your job.
One of my clients requested me to deliver an estimation on some milestones.
The only problem was that in order to deliver the estimation, I had to rely on a third party to deliver a prerequisite to me. I had neither knowledge, nor influence on the delivery date of this prerequisite.
Furthermore, the specification of half of my tasks had not been written.
My client really wanted me to commit to a deadline, and said that he had to deliver the estimation by tomorrow.
However, I stood my ground and replied that as an engineer, without the expected date on the prerequisite, and without the complete specification of the request, I was not in a position to commit to any deadlines. Any attempt on my end to assemble a target date would be just as effective, as dancing in front of your house to cause raindrops to start falling from the sky.
Of course, I got a bit more heat, including the famous sentence Robert C. Martin also highlighted in his book, The Clean Coder. "Can you at least try?"
My response was, “My performance is always at its maximum, and it is non-negotiable. I work at 100%. Less than that would be wasteful, and more than 100% is impossible by definition.”
We eventually agreed to define the exact scope of the project before agreeing to a target date. I assured my contact that he would get the target date once all information are available.
Ask yourself, are you in a position to answer according to common sense, even if you risk losing a client or getting fired?
If your answer is yes, you are not only on a good track towards professionalism, but your input will be valuable and respected.
There will always be others who promise impossible things. Some greedy clients and employers may choose them over you in the short run. However, these people will eventually fail. This is when you come back into the picture.
I know, for junior developers, losing your job may sound scary. In reality though, exactly because you stick to your word even at an expense of losing your job, you will be the last one to lose your job. In the very unlikely case you do, the company was not a professional environment anyway.
Establishing clear boundaries
Fourth, being dependable and reliable both in time estimations and in your work ethic, you have boundaries that you stick to. Healthy psychological boundaries mean that you take full responsibility for your actions and emotions, and you take no responsibility for the actions and emotions of other people. When other people promise deadlines in your name, they violate your boundaries. A professional should be open to negotiate the scope and delivery time of a project, but a professional should not accept a business-driven set of deadlines or committing to a deadline based on a vague, blurry specification.
Back in the days, we hired a software developer. As I was his lead, he started opening up after a while, and told me a few stories about his previous workplace. He was especially verbose about his ex-manager, let’s call him Clueless Carl.
When Carl arrived, he usually asked a few questions that soon revealed that he has no clue about how software is developed. In Carl’s mind, software was like printing newspapers. If you work for twice as much time as before, you get twice as much done. Therefore, he continuously demanded putting people on overtime.
One day, he inquired about the feasibility of an affiliation platform. My colleague said, it would take them at least 9 months to build that platform, assuming just basic functionality.
Then the manager got upset. Really upset.
“That’s impossible! I have already promised to the board that we would be done in three months!”, the manager said.
My colleague asked him, “Why do you promise things if you don’t know how much time things take?”
The manager replied, “I have a talent to be very accurate most of the time”.
The whole office started laughing out loud.
If you don’t want to be a victim of a tech team abused by the business, you may consider improving your defense against people who violate your boundaries. I suggest two books: The Clean Coder by Robert C. Martin, and When I Say No, I Feel Guilty by Manuel J. Smith. The former gives you examples on how to stick to your professional code of conduct, even if unprofessional people violate your boundaries. The latter book or audiobook is essentially an effective assertiveness therapy in a book format.
Fifth, professionals have every reason to be solid negotiators. For this reason, professionals make more money than the average, and negotiate better working conditions for themselves than the average developer. In exchange, they are a lot more useful for the business than the average developer.
Living, acting, and working as a professional - not just a developer - can be the most important investment you make in yourself.
Strong soft skills will get you ahead
Considering the financial situation of software developers, Karl Hughes argues in his article that software developers whose skills range beyond tech skills will be more in demand than the average developer.
Think about the old story of three workers. You see three workers build a building. You ask the first one what he is doing. He says, he is laying bricks on top of each other. You are puzzled, because you may think, he does not even bother to know why he is laying bricks on top of each other, so how will he know when to stop?
Then you ask the second worker. He says, he is building a wall. Good to know, you think. At least he will get his job done. But what happens once he finishes building that wall?
You ask the third worker what he is doing. His eyes start shining, and you see admiration in the face of this worker. I’m building a cathedral!
Different perspective, different quality of life. Above all, a different career trajectory.
Think about it, which of the workers would you interact with as the project manager of the cathedral? Which of the workers would you promote? Which of the workers would you never promote even if he was the fastest person laying bricks on top of each other?
A professional knows what he is doing and why he is doing it. A professional sets boundaries. A professional rarely over-promises, but often over-delivers. A professional also knows what problem he is solving.
While amateurs go for the quick bucks and jump on the next shiny marble out there, professionals design their career and become so good they can’t be ignored. When choosing between money and building your career capital, choose the latter. You may not know right now what is awaiting you a few years down the line, but once you become proficient in a field, new opportunities will arise on the horizon.
3. Developer Networks
The number one factor determining your success and opportunities as a software developer is your peer group. Your connections are included in your career capital, because you are always better off cooperating with other people than being alone.
The peer group effect is a well-researched phenomenon. Studies show that people we regularly interact with influence our everyday lives.
Our first group is our family. Hundreds of books have been written on the subject that both positive and negative character traits influence you from multiple generations. You may not even know your great grandfather, yet his character traits and actions may make you feel anxious, or make you feel rebellious in other situations without knowing the cause. While you cannot choose your family, you can choose your peer group as a software developer.
If you are in a company surrounded by unprofessional, lazy developers, then it’s high time to upgrade your peer group.
If you work in a big city, chances are, you can simply go to meetup.com, and interact with some like-minded people in a software developer meet up. You can form connections, and you can help each other out.
You might belong to an underrepresented group in software development. Consider joining a constructive group, where you can find successful role models for yourself. Make sure the group you choose helps you reach your goals with action-oriented steps and positive intent.
As a junior developer, local meet ups are more cost-effective for you than conferences. If your company finances your conference trip, go for it. However, don’t expect to benefit a lot from conferences as a junior developer.
Attending some live workshops are beneficial if you intend to improve your skills taught there. Proximity is power. Live coaches help you get better faster than books or online courses.
There are some community groups associated with some popular repositories. One of my colleagues for instance volunteered to be one of the maintainers of a popular functional programming library. He interacts with a lot of people on a regular basis, and he is the authority people go to on that topic. You will find many github.com repositories worth contributing to throughout your career.
Some free or paid developer networks also level you up in terms of tech skills and soft skills. One widely known example is software developer bootcamps, where you can learn by working closely with experts. Although you can learn on your own, people pay for bootcamps because of the peer group effect. You can level up faster and easier, because proximity is power.
Although reddit.com is often a source of great curated resources, in some channels, some trolls create a less attractive environment for learning. If you see someone who takes pride in debating for no reason, stop reading that piece, and jump onto the next one. Don’t feed the trolls, and don’t be a troll yourself. Stick to your boundaries, and stick to professional and constructive debates.
You may get stuck on the job or while learning. Fortunately, the answers to most of your questions are on the Internet, regardless of the technology, programming language, or nature of the problem. You may even find answers to your soft-skill questions online. Some examples for these developer networks are:
- askubuntu.com on linux questions
- quora.com on any types of questions including soft-skills
Use these resources wisely, you can save a lot of time and headaches when you look for answers instead of reinventing the wheel.
4. Coding skills and Tech Interview Preparation
Many people dislike tech interviews, because they claim that the riddles they get and the whiteboard interviews do not correlate with skills needed on the job. Reality is that recruitment is a multi billion dollar industry, and best practices spread from top to down.
Companies at the top set the standards for what a technical interview should look like. Whether you agree with their methods or not, you have to learn them, because smaller companies often copy the recruitment methods of the top companies in the industry. Smaller companies copy these trends, simply because they don’t know better. There might be some companies who think they know better, and they come up with an awkward process, but the more famous company you target, the more likely you will need some interviewing skills.
Generally, you need the following skill-set:
- Problem solving
- Algorithms and data structures, algorithm complexity analysis
- Strong command of a programming language
- System design
In this section, we will focus on points 1 and 2: problem solving, algorithms, data structures, and complexity analysis.
The ultimate bestseller on this topic is the book Cracking the Coding Interview by Gayle Laakmann McDowell. However, there are many other free, freemium, and commercial resources that help you train these skills.
When it comes to improving your problem solving skills, or your knowledge on algorithms and data structures, https://brilliant.org/ gives you a great overview.
If you are into coding practice, possibly even competitive coding, there are a wide variety of platforms available to you:
- Daily Programmer Reddit channel
You can train the first four skill-sets in most competitive coding and code interview preparation platforms. If you are a starter, Codility’s lessons give you an easy walkthrough of the topics you can expect. If you have time for just one site, go for HackerRank, because HackerRank is currently the most widespread platform used by companies.
If these resources are not enough for you, check out the Coding Practice for Beginners, Competitive Coding, and the Interview Preparation sections of the GitHub page Best Websites a Programmer should Visit.
5. System design skills
This topic deserves its own section, because many software developers take pride in just coding, without taking care of investigating the tools, architectural decisions, and components solving the problem.
In my book, The Developer’s Edge, I investigated the career path of generalists and specialists, and concluded that the most lucrative position you can be in as a software developer is a T-shaped professional (more on what this means below).
Although in a large company, you can often get away with being a specialist not knowing some obvious things about software development, the smaller the company, the more likely it is that an employer cannot afford to hire you if you cannot take care of basic tasks expected out of an IT engineer. Once I worked with a mobile developer specializing in one platform, and he asked me how to write basic HTML. Needless to say, when the fundamentals are missing, the value you add to a company goes down.
Employers tend to like generalists, because they always need people to get things done. Employers also like generalists, because they don’t have to pay generalists as much as a specialist would earn. If you want extra security, and the center of your life is not software development, the path of a generalist may be just fine for you. There is nothing wrong with this, I appreciate and respect developers who are authentic in what they want from life. They will never land at a great job at Google, but in exchange, they may have an extraordinary quality of life.
If you have more ambition as a software developer, I suggest mixing the two worlds. This is where the T-shaped profile comes in. The horizontal segment in the T symbolizes generalist knowledge. The vertical segment symbolizes your specialization, where you dig deep. You get the best of two worlds, potentially higher salary, and maximized utility.
System design skills are a must in your generalist profile. Even big companies will likely turn you down if you don’t have system design skills.
If you are looking for an introductory resource, I recommend you the article Top 10 System Design Interview Questions so that you know what you can expect.
If you are looking for a resource to learn system design skills, I can recommend you the following:
- Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems by Martin Kleppmann
- Software Architecture for Developers books I and II by Simon Brown
- Some Pluralsight courses on specialized topics like SOLID principles or Object Oriented Programming in your language
- Software Design and Architecture specialization on Coursera
- Software Architecture and Design on Udacity
For web developers, Web Architecture 101 is a great read.
Learning is the least intuitive topic out of the six we have covered in this section. This is because if you learn in the same way how the average person does, your reward will also be average.
Do you remember when you last bought a book or a course you really wanted to learn? It felt exciting, didn't it?
Most people make a purchase to buy the dream of becoming a better professional, a better paid developer, a better communicator. The purchase decision feels good, because at that moment, a monetary commitment happens. You tell yourself, you are a person whose values are in alignment with the topic of your interest.
As long as you make reasonable decisions and don't fall for scams, you are doing everything correctly so far.
The real problem comes afterwards. Many people start reading their new material from cover to cover or watching it from the first video to the last. Once they finish the material, they quickly jump onto the next one.
This is a waste of resources, because most of us forget 95% of what we don't put into practice.
I remember, back during the university years, I forced myself to read books from cover to cover so that I don’t miss a well hidden fact for the exam. I was stressed out, because my operating systems book was 400 pages long. My computer networks book was more than 800 pages long. You know, these are books with small letters, full of definitions, facts, and not much creativity.
Around second or third year, my mindset shifted. My primary objective became to pass the exam with the best possible grade. My secondary objective was to learn as much useful stuff as possible.
The practice exams covered my first objective. The first thing I looked at was the collection of exams from the last five years. Then I started learning for the primary purpose of being able to solve these types of questions.
Once I was done, I had an overall understanding of the whole subject, and I could start digging deeper. I prepared for my exams in record time, and I managed to retain a lot of knowledge from the experience.
Knowing how to learn is important. One resource is an article on Medium titled Effective Learning for Software Developers, that helps you improve your learning mindset and techniques.
This article emphasizes the importance of creating a learning plan. It is always important to know what you are heading towards. Do you want to become a frontend developer? The article Modern Frontend Developer in 2018 covers what you need to know, and what topics are alternatives. Do you want to become a data scientist? Read an article like the one titled What Are the Skills Needed to Become a Data Scientist in 2018. This pattern holds for any domain.
Obviously, if you read this article in 2019, you will most likely find a relevant article with 2019 in its title.
Once you know what topics you need to practice, you can search for free and paid information. Some free channels are Youtube, Medium, Free Code Camp, and some other tutorials.
Some reliable paid channels are Packt Publishing, Sitepoint, Pluralsight, and Udemy for video courses, and Packt Publishing, O’Reilly, Manning, Apress, Leanpub for books.
Raw information is free in the 21st Century. When you buy a book or a course, make sure the presentation and organization of the information matches what you are looking for. A good learning resource challenges you and gives you exercises to help you put theory into practice.
Taking Massive Action
When it comes to achieving anything in life, there is one thing that separates people who dream about becoming successful and people who reach their goals: massive action towards their goals.
Some people will tell you other opinions. For instance, you might have heard of the power of writing down goals. Many motivational speakers include the famous story of a study done at Yale University, where students were classified into two groups. According to this famous study, the 3% that had written down goals made more money than the other 97% combined.
This is a great story. The problem is, according to Yale University, this study never happened. You can’t achieve something if you don’t put in the hours.
According to the books Peak: Secrets from the New Science of Expertise by Anders Ericsson, and So Good They Can't Ignore You by Cal Newport, deliberate practice makes experts. Both authors, as well as Malcolm Gladwell, talk about the ten thousand hours rule of deliberate practice as the price of expertise. Although this number may differ from use case to use case, you get the idea: expertise does not come overnight.
Years ago, as a frontend developer and team lead, I exercised discipline to maintain a stable tech stack. While many developers jumped ship and wanted to learn the newest shiny marble, I found value in continuity. I heard that in some companies, the development team kept rewriting their code over and over again, because they wanted to keep up with the latest trends. You can only become an expert if you define your field of expertise and stick to it.
Obviously, if you commit to achieving a goal, the neurons in your brain will align more easily with it. However, nothing will substitute the meaningful hours you put in to achieve your goals.
If you just half-heartedly read a few articles here and there, you only create the illusion of progress. Real progress comes from continuous effort. Deliberate practice occurs in a state of mind when you are deeply immersed in an activity to the extent that you stop perceiving the passing of time.
The good news is that according to Mihály Csíkszentmihályi, author of the book Flow: The Psychology of Optimal Experience, when you are deeply immersed in an activity, you experience flow. Flow is a state that ranks among the highest level activities that cause happiness and emotional well-being.
Flow is a true life-hack. I discovered this state without knowing what it is, and I admit, most of my successes at the university came because of my ability to put myself in flow. I can recall a boring subject that most people disliked. The average developer took around 2 exams to pass the subject. This means that most people failed at least once. I managed to learn the whole subject inside-out within four days, even though I never attended the lecture. Believe me, I am not a super-learner genius. I just spent the first few hours of my focused study time developing genuine interest in the subject. Learning this subject was a great experience for me, and even the professor saw my genuine excitement. Just imagine what it would be like to spend the rest of your career loving what you do, and learning with ease.
If you make your tech career your mission, action will follow, and you will be happy while pursuing your goals.
If you are a junior developer, you can easily reduce your learning curve by years by using the right mindset, tools, and techniques.
Marketing yourself properly will make sure that you will be contacted with great employment, freelance, and business opportunities. Your negotiation power and your potential promotions are also influenced by your personal brand.
By developing a professional attitude, your colleagues will relate to you better, and you will also get more out of your learning experience as a developer.
While growing, leverage the peer group effect. Join communities, where you can grow and mature together with other software developers who keep you accountable.
Regardless of how good your personal brand is, how well you develop your professional attitude, and what kinds of connections you make, you will have to go to tech interviews. Therefore, it is inevitable for you to learn some tech interview techniques.
System design skills help you both in your professional practice and in your coding interviews.
All these areas sound like a lot of effort. They have one thing in common: you have to learn to accomplish anything. If you know how to learn, you can advance in your career quickly. Therefore, investing in learning how to learn effectively saves you a lot of time and could potentially earn you a lot of money in the long run.