Published on May 17, 2019. 16 minute read.
Training to become a full-stack developer is becoming harder every year. Since the rapid rise in popularity of open source, especially over the past 5 years, the pace of advancement of the industry has accelerated exponentially, and I doubt the rate of advancement will slow any time soon. To become a full-stack developer, continuous on-the-job learning, and self-development in general, is mandatory.
With the disclaimer out of the way, you should know that with the right direction and drive, you certainly can be a full-stack developer. The key is to know your current skill set and level of experience, to know what direction you want your career to take in the medium to long-term, and to learn on the job. The best developers have foundational knowledge of a wide range of tools and technologies, and then apply that knowledge to build new skills quickly. Learn the foundations to a high level and then learn new skills that build on those foundations.
A full-stack developer is a person who neither specialises in front-end or back-end web development, but instead has wide knowledge and experience of both. Full-stack developers tend to have a more generalised skill set, because the nature of being a full-stack developer means that you have to use a wide range of tools and technologies on a daily basis. It is hard to have the time, and, frankly, the motivation, to dive into everything at a deeper level, although not impossible.
As well as having strong coding knowledge, a full-stack developer will often be expected to have DevOps knowledge, meaning an understanding of managing IT infrastructure is essential.
Before getting into the details about what skills are required for both back-end and front-end disciplines, we need to ensure that we have the fundamentals in place.
- Soft skills. Don’t skip this! Get good at communicating with others both verbally and in writing. Attend meetings and make valuable contributions (and do not be afraid to leave a pointless meeting!). Be punctual. Listen when others are talking. Avoid interrupting people. Deliver what you say you will, when you say you will. Enough said.
- Strong data structures and algorithms knowledge is essential for solving complex problems in a performant way. Familiarise yourself with the most common structures, including; queue, stack, linked-lists, trees, bubble sort etc. Having fundamental knowledge of common data structures and algorithms is applicable to any language and any discipline.
- Computer networking. Seems obvious, but often overlooked. You should understand how HTTP works, what HTTP verbs are (
PUTetc), and how REST and GraphQL works (and when to use each/pros and cons). Having this knowledge is important regardless of discipline.
- Having the ability to write comprehensive documentation is not only valuable to you, but to others you work with. It can demonstrate a deep understanding of how things work, and demonstrates a passion for quality and completeness. When working as part of a team, a more senior developer will strive to upskill others around them. This means that, simply, teaching others around you will lead to you upskilling them AND yourself. Writing comprehensive documentation is a powerful educational tool for others.
- Learn how to capture requirements, speak to your clients/the business, interpret their needs/requirements, and make recommendations. They hired you not so they can tell you what to do, but so you can tell them what to do!
- Regardless of discipline, strong source control skills are essential. Git is the most ubiquitous source control system, so learn the most commonly used commands deeply.
- Comprehension and problem solving. You will be required to translate the requirements of the business into a tangible end product, so always be learning from project to project and learn from past mistakes.
Being good at coding is only one aspect of the job, communicating and working directly with others is all the rest. Get good at connecting with others around you and speaking with them face-to-face. I cannot emphasise enough, work on your soft skills!.
Aside from having a strong analytical mind, and attention to detail, a back-end developer will require the following base skill set;
- Performance. Time is money and resources cost money, so a good understanding of how to write code that performs well, and uses minimal memory, CPU cycles etc is essential.
- Testing. Simply put, test all the things. Develop a strong understanding of your testing tools and test practices like TDD.
- Traditional object-orientated(ish) back-end languages like .NET (C#), Ruby, GoLang, PHP, Java.
- Data storage services like SQL, Postgres, and Redis. The database is often the heart of a back-end web application, so knowledge of performing CRUD operations against various database storage services is essential.
A front-end developer will be required to work on the most visual aspect of the website, the front-end user interface. This is what the end user sees and will use to interact with your back-end service. Attention to detail here is vital, especially around layout, colour scheme, use of images, accessibility, and performance.
- HTML/CSS. A comprehensive knowledge of how the DOM works, semantic markup, and good accessibility practices. For CSS, a good understanding of the box model, SVGs, flexbox, CSS Grid, and pre-processors like SASS or LESS.
- Build tools like Webpack and Parcel have become fundamental for maximising cross-browser support and compatibility. A strong understanding of how to configure build tools beyond the surface level is essential.
- Design tools like Sketch, Invision, Photoshop, Figma. You will often be working closely with UX designers, so having the ability to speak their language and use their tools is essential.
- Testing. Writing tests is vital for the long-term success and reliability of your website, so get good at writing unit tests, browser tests, integration tests, and end-to-end tests. Take the time to familiarise yourself with Nightwatch, Jest, and Cypress.
It might come to you as little surprise that being a full-stack developer requires a comprehensive understanding of both front-end and back-end disciplines. It goes deeper than that, however.
- The Cloud is a vital component of most web applications today, so a deeper understanding of how to use various cloud-based services is essential. If working with AWS, consider learning; CloudFormation, EC2, RDS, S3, CloudFront, SES/SNS, and Lambda to start with. If using competing services such as Azure or Google Cloud, learn their comparable services.
- Provisioning and managing containers using Docker Swarm, Kubernetes, or similar.
- Powershell or similar scripting languages for automation of repetitive tasks.
- Security. Never let security be an afterthought. You are likely using some flavour of *nix to host your website. If you are managing the server yourself, security is of paramount concern. Invest time in learning security best practices and ensure that permissions and access are strictly controlled.
Before embarking on your learning journey, you should ask yourself a couple of important questions.
- What aspects of web development do you enjoy the most?
- What skills do you want to develop/refine? And can you get those skills in your current role?
You should honestly assess yourself, your experience, and your skill/level of expertise.
Sit down with a pen and paper and answer the questions as honestly as possible.
We are fortunate to work in an industry where people enjoy doing what they do. For myself, web development is a hobby that I am fortunate enough to get paid for. I love learning about the latest features of a framework, reading programming books, and watching industry personalities on YouTube. When I get home from work I relax by, you guessed it, writing code (and blog posts like this!).
To be a web developer means you enjoy what you do, because continuous learning is critical to surviving the industry long-term. Failure to move with the times can be catastrophic. You will likely have to pivot in your career several times to keep up-to-date with trends. If you are not moving forwards, you are moving backwards!
Write a list of the aspects the web development you enjoy the most.
To give you some inspiration, here is mine.
- Build tools. I love configuring and optimising build tools like Webpack and Parcel.
- Producing web pages and web sites. I love converting designs into tangible websites.
- .NET. I love deep diving into back-end business logic and interacting with SQL and No-SQL databases.
Once you understand what your passions are, you can refine your learning plan, which we will discuss later.
Okay, technically that is two questions in one but they are very closely related. Positioning yourself and knowing the direction you want to take your career is essential for long-term growth.
Always be planning for two jobs ahead
A (shall remain anonymous!) friend once gave me advice that has stuck with me throughout the years. Always be planning for two jobs ahead. What they meant by this was that you should know your path, your direction, where you want to end up, and know how you are going to get there. It is important to understand which areas of your skill set need improvement, and what new skills you need now and for the medium to long-term, and most importantly, start developing those skills now.
Make a list of current skills, what new skills you want to learn or what skills you want to refine.
If your current job does not allow you to get hands on experience in your desired areas, then strongly consider switching jobs. Your job should help you get experience in your fields of interest.
The best time to switch jobs is when you are no longer learning. As long as you are deriving value from your job (learning), you should strongly consider staying in your current role. As soon as you are no longer learning and moving towards your goals or utilising your core skill set, consider a move.
Now you should have compiled your list of skills that you want to really hone in on. We know the direction, so now we need to know the path!
Hands down my favourite resource for learning new skills is watching training videos on Udemy. Udemy has over 100,000 courses produced by over 42,000 instructors.
What I love the most about Udemy is that chances are I can find a very high-quality series of training videos on just about any topic.
Hands down my favourite course watched to date is The Coding Interview Bootcamp: Algorithms + Data Structures by Stephen Grider. The course takes a deep dive into the most commonly asked data structures and algorithms questions posed by the biggest tech companies. Here is a rough outline of what the course entailed.
- String Reversal
- Integer Reversal
- Max Chars
- Fizz Buzz
- Array Chunking
- Sentence Capitalisation
- Printing Steps
- Two Sided Steps - Pyramids
- Find the vowels
- Enter the Matrix spiral
- Runtime Complexity
- Queue Weaving
- Linked Lists
- Binary Search Tree
- Bubble Sort
- Merge Sort
I mean seriously, that is an insane amount of content for little financial outlay. At the time of writing, the course has been watched by over 36,000 people and has a fantastic 4.6 overall rating.
I am affiliated with Udemy so if you use my affiliate link and make a purchase within the next 7 days, I will get a small commission, which will go towards funding the future development of this blog!
As much as I would love to be able to recommend a specific course to everybody, that just is not realistic, so why not check out Udemy’s featured courses! by clicking the link.
Create your own learning path by looking up courses on Udemy (you may need to watch several!). Write a list of courses to watch and then work through that list. The best way to approach this is try to dedicate at least 1 hour per day to learning. Learning, however, is not necessarily just a case of sitting and watching videos, you need to practically implement your learning to make it really sink in! If the course you are watching has a follow-along aspect, then make sure you do follow along!
When you hit milestones (i.e. you finish a particular set of videos), consider creating a side project, and put your new skills to the test. When done, put it out there for others to see, even if that is just publishing the code to a public repository on GitHub!. Ask for feedback from others and make improvements based on their feedback… do not be afraid to ask! In my experience, people are ready, willing and able to provide constructive feedback.
Make sure you review your learning plan from time to time to ensure you remain on track.
Having the ability to learn fast is essential if you plan to keep up-to-date with a wide range of technologies. First learn to learn, then learn to learn fast.
The ultimate self-learning hack is to each somebody else. Contrary to popular belief, you do not need to be an expert to teach another on a particular topic. You simply have to be one step ahead.
I believe that the sooner you teach something you have learnt to somebody else, the better. Why? the material will be fresh in your mind. You will remember clearly the pain points you encountered whilst learning the topic yourself.
From personal experience when I teach others, especially when I teach large groups, I get scared. I worry about imposter syndrome a lot and I fear that somebody will ask me questions that I do not know the answer to. To prevent this from happening, in the run up to the session I will deeply research and experiment with the topic at hand and ensure that I do not make any wrong assumptions or generally get caught off guard. I try to put myself in others shoes and anticipate what questions they might ask, and ensure that I have a quality answer ready (or proactively cover it with them as early as possible).
When I do not know the answer to a question, I graciously tell the person I do not know and that I will come back to them with an answer at a later date.
Teaching others is the ultimate way to learn something fast and deeply yourself.
Learning takes many forms;
- Read blog posts, books and articles.
- Watch information videos on YouTube.
- Watch professional tutorials on Udemy.
- Practice, hands on.
In terms of frequency, the most effective way to learn is little and often. Dedicate 60-90 minutes each day, at least 5 days a week, to reading, watching, and practicing.
A popular time management technique is the Pomodoro Technique. The Pomodoro technique, simply put, is the practice of working in bursts of 25 minutes, when you then take a 5-minute break. Repeat as much as desired, but aim for 2-3 a day where possible (and perhaps several more on the weekends!). If you struggle to fit this in each day, consider getting up earlier, learning at lunch, on your commute or stay up later if you are a night owl. Also, if you watch TV often, consider reducing your viewing time by 1 hour a day to focus on your learning instead. The best time to start was 10 years ago, the next best time is now. Thank me later.
Writing notes by hand using pen and paper has been shown to help with retention and comprehension.
From personal experience, I can say that I type a lot faster than I can write. This means when I am taking notes on a computer, I am much more likely to type unconsciously everything the person is saying. In comparison, when using a pen and paper I have to distil and shorten a lot, forcing me to think more and digest. Also, I usually have to go back and expand the notes later to ensure nothing gets lost.
Writing notes using pen and paper is superior compared to typing on a computer, because it will help comprehension and digestion, speeding up the learning process.
Getting 8 hours sleep each night has been scientifically shown to improve learning and memory. If you struggle to get your daily allocation of sleep, try the following;
- Ensure your room is dark. Get black-out curtains if possible.
- Use your room only for sleeping, avoid lying in bed watching TV or other non-sleep activities.
- Avoid caffeine for at least 8 hours before going to bed.
- Exercise where possible, no less than 4 hours before going to bed.
- Consider biphasic or polyphasic sleep patterns. As somebody with extremely poor sleep patterns, splitting up my sleep made a huge difference.
Sleep helps with consolidation and retention of memories.
Whilst this is by no means a comprehensive blog post, we have covered a lot of ground here. A full-stack developer is person who, rather than specialising in one particular area, will spread themselves thinner over a broader range of technologies. Whilst this can potentially make you more valuable to employers, this also makes keeping up-to-date more challenging. At the base level, developers of all disciplines require strong knowledge of; soft skills (communication in written and verbal form), data structures and algorithms, computer networking, and strong knowledge of source control). For a full-stack developer, performance is key and can make-or-break a website. Testing is vital so good testing knowledge (unit, browser, end-to-end etc) and experience with testing practices like TDD is essential.