How to become a full-stack software engineer?
So, you want to become a full-stack engineer (or a full-stack developer)? It requires a lot of hard work and dedication. This article will present some ideas to help you get this position.
Keep in mind, though, that: "Your path you must decide." – Yoda
On a side note, I address my words primarily to those just starting: if someone is already programming, they probably know what I'm talking about. No single path leads to the goal: everyone must find their own.
Full-stack developer, personal experience
When I started my adventure with programming or, more broadly, with computer science over a quarter of a century ago, the world was different :-) (yes, the only sure thing in life is that it changes). On the one hand, it was more accessible; to write a computer program, you only needed to master one programming language (in those days, Pascal, C, C++, or Assembly for the hardcore). On the other hand, it was more brutal: to write a computer program, you had to know everything in depth, from the computer hardware itself: how the processor works, what's inside it, how to use the memory, how to read/write something to a floppy disk or hard drive, through the operating system and how to control input/output devices through it or use system interrupts, up to the programming language and how to use it effectively (computers were slower :-)).
Today, the number of languages, tools, libraries, frameworks, operating systems, technologies, various programming practices, etc., can be overwhelming for someone just starting their programming journey. On the other hand, programming languages are higher-level—we generally don't care too much about how the processor works or what's inside the operating system. Instead, we focus on what we want, not how to achieve it. It's also much easier to find out how to do something; just enter the appropriate keyword in the search engine, and you'll have the answer.
And this is where full-stack software developer comes into view, a role somewhat mythical to me.
A full-stack software developer has a broad knowledge of various technologies and tools used in the software development process. In their work, such an engineer deals with both the front-end and back-end applications. They are responsible for the software's overall application design, implementation, testing, and maintenance. They are a Renaissance person (a modern-day Leonardo da Vinci with a degree in computer science).
There's a trade-off, of course. To be good in a particular field, you have to dedicate time and energy, and since a full-stack engineer deals with many fields, they can only be an expert in some of them. That's why you need to be good in many areas but not necessarily an expert to be a full-stack developer. A term for this is a general specialist (primarily applicable to the junior level). However, it's worth striving to be more advanced in at least one area and, at the same time, have a good knowledge of the other regions.
The first question arises: is this path really for me? Sure, everybody's talking about the incredibly high average salary, but it's not a guaranteed best solution. Someone may prefer to focus on a specific occupation, such as front-end or back-end developer (for example, despite my knowledge as a front-end developer, I like to work on back-end components) but wants to be an expert in that area.
From my experience, although many job descriptions for a programmer may include the term full-stack developer, in the realities of business, it often turns out that it's just a name. In reality, the person in this position deals with only one very narrow area. This is especially true in larger organizations developing their software for many years; the chance to deal with everything in such an environment is relatively small. It may be different with a smaller start-up, where the software development team is small, and the program is in the development phase: then, the programmer deals with everything. Similarly, if you dream of freelancing, it's worth being good in many areas to complete the entire project independently. As you can see, how we envision our professional future impacts whether it's worth full-stack engineering.
Is it worth having (or at least mastering to some extent) everything that it takes for the full-stack developer?
Yes. Especially when someone is starting, it's good to develop a general understanding of what's happening in the IT world and then decide whether to focus on a specific direction. For many people, this means choosing computer science studies, which, by their nature, provide us with a broad knowledge base. However, there are other paths, and the careers of many programmers have proven that there are better ones. At university, we learn many things that, from my experience (and I was an academic teacher for many years), do not necessarily come in handy later. Sometimes, the required practical experience is also needed during studies. Is there an alternative? We live in times when access to knowledge and materials helping us learn anything is practically unlimited, available at our fingertips, and free of charge. We need a plan and a general vision of our path.
What should you know before you get this role?
To become a full-stack software engineer, it's a good idea to start by acquiring basic knowledge in computer science, programming, and web technologies.
Below is a list of areas you should develop.
Learning the basics of programming: Start by learning the basics of one (yes, one :-)) programming language, such as Java/C#, JavaScript, or Python. Gain skills in algorithms, data structures, and object-oriented programming. Learn to debug your programs! Along the way, master version control systems like Git. When choosing a programming language, you can refer to popularity rankings like the TIOBE Index. However, be aware that any mentioned language can be used to create virtually any application. To begin, choose a relatively simple language and easy to learn. Considering you want to be a full-stack developer, you may choose JavaScript for both front-end and back-end development. It's worth noting that JavaScript has gained popularity recently and is currently one of the most popular programming languages. I would not recommend starting with languages like C/C++ or Rust - they are great, but not for beginners. Of course, computer programs need to be written in something, and the choice of tool depends on the language. There are many good IDEs, and I like Visual Studio Code (which is not an IDE but a text editor, although, with the right extensions, it can do a lot). I recommend against spending too much time choosing a tool instead of selecting a popular one and mastering it well (keyboard shortcuts are a programmer's friend: –)).
Gaining knowledge in web technologies: The next step is to learn the basics of web technologies, such as HTML, CSS, and JavaScript. This will enable you to create simple websites and web applications. It's also essential to understand how the Internet and networks work, what communication protocols are (particularly HTTP), how web browsers operate, and so on. Remember the basics of network security. Knowing how networks function and what TCP/IP is would be helpful, but that's a topic for a separate article. However, remember that you only need the basics and don't have to be a network administrator to start full-stack engineering :-).
Familiarity with front-end frameworks: This is more advanced, so you don't need to master it immediately. However, learning to use popular frameworks like React, Angular, or Vue makes working with user interfaces easier. They allow for faster and more accessible creation of interactive web applications. Which one you choose is not critical, but start with one that is popular, actively developed, has good documentation, and has a large community. For example, choose React over Vue (not because the latter is wrong, just less popular). When selecting a framework, you must master various auxiliary tools, like Redux for React (although it's unnecessary).
Learning back end: After mastering the front end, it's time to learn the back end. Choose one programming language you're comfortable with, and then learn to use back-end frameworks in that language: for example, Spring Boot (for Java), Node.js (for JavaScript), ASP.NET Core (for C#), or Django (for Python). Gain knowledge about relational databases (e.g., PostgreSQL, Microsoft SQL Server, MySQL) and non-relational (e.g., MongoDB). Relational databases are still doing well, despite their age, and you'll need to learn SQL. It's worth doing, as many developers are reluctant to do that, so that it might be to your advantage.
Basics of DevOps: Knowledge of DevOps is increasingly required for full-stack development. Learn basic tools like Docker and Kubernetes, and understand what CI/CD processes are and the tools supporting them, such as GitHub Actions.
Learning testing: Learning to create unit, integration, and functional tests will ensure the high quality of the software you develop. Choose tools that match the programming language and frameworks you use.
Developing soft skills: In addition to technical competencies, soft skills like communication, teamwork, time management, and adaptability to change are essential. Work on them simultaneously with developing your technical skills.
Working on personal projects: Create projects that showcase your abilities at full-stack development. These can be single projects, like websites, mobile applications, or even computer games. Include them in your portfolio (GitHub is your friend here) so potential employers can assess your skills.
Networking: Join developer communities, participate in code reviews, and attend conferences, workshops, and meet-ups. Build your network of contacts (be aware of websites like LinkedIn), which will help you find a job in the future. Be a team player who can prove themselves as essential to a cross-functional team.
Lifelong learning: Technologies and tools in the IT industry change rapidly. To stay current and continuously grow your full-stack engineering, be open to new trends, and never stop learning. Are you ready for this? :-)
Learning the basics of programming
On the previous list of skills to master, learning the basics of programming was highlighted. This may be the first and simultaneously most challenging step for many people.
Of course, there isn't just one path, and each of us is different, but from my experience, the best way is to learn through practice.
So, if we choose a programming language, it's best to start creating simple programs right away rather than learning all the possible constructs of the programming language and then wondering what to do with it.
It's great if the programs we create serve a purpose for us, making it easier to determine what they should do and how to do it.
Don't expect your programs to be perfect the first time you try, make mistakes and learn to eliminate them. The ability to search for and eliminate errors in programs (both your own and others) is one of the most important skills of a programmer. Take this opportunity to practice persistence and patience, as sometimes errors can be challenging to find.
Online courses or books can complement the above, although in many cases, the programming language documentation is sufficient. As for online courses, those that encourage you to practice are especially useful, and I highly recommend Hyperskill.
However, don't let your time be entirely devoted to watching (!) successive tutorials on the Internet, even if they are excellent and you are completing all the tasks or instructions of the person who prepared the tutorial. In this way, of course, you learn, but... it is a reproductive, not a creative activity. Often in this way, you create false beliefs that things are easier than they seem and, at the same time, that you know how to do something when, in practice, you have seen someone else do it, and in the end, you would not be able to repeat it independently. Try to contemplate this idea while watching this video to the end ;-). Don't get me wrong, tutorials are excellent (many people put a lot of effort into preparing - often for free - materials based on which you can learn), and I use them myself. The key is how to use them—if you learned something from a tutorial, can you apply it independently? As a supplement, it's excellent, but it cannot replace your own (deliberate) practice.
Other ways to improve your skills that I recommend include:
- participating in open-source projects;
- building a portfolio (as mentioned above, practice on a wide range of products);
- taking part in hackathons or programming competitions;
- attending training sessions, workshops, and boot camps;
- seeking guidance from a mentor.
Example technology stack for JavaScript
Once you've chosen a programming language and have basic programming knowledge, you can learn the appropriate technologies. Resources prepared by other developers can help you with your choice, such as this list. Generally, you are looking for something with a name like the [name of my programming language] roadmap. At the same time, it's worth checking if such a list is current and how other developers rate it. Technology changes quickly, and everyone can pass as an expert on the Internet, so keep that in mind.
For illustration, here's an example list for JavaScript (current and junior-oriented), which you can use as a starting point:
Front end:
- HTML5 is a markup language used for structuring content on a web page.
- CSS3—style sheets used for formatting the appearance of a web page.
- JavaScript (ES6+). Once you mastered it, you can move on to TypeScript.
- JavaScript frameworks/libraries: React, Angular, Vue.js—choose one. I would select React, but it's not critical.
- CSS preprocessors: Sass, Less. Tools that make writing and organizing CSS code easier. This point seems less relevant now due to the evolution of CSS.
- Build tools: Webpack, Vite for automating tasks such as compilation, minification, or transpilation of code.
- Testing: Jest, Mocha, and Selenium for unit and integration testing of JavaScript code.
Back end:
- Node.js—a platform based on the JavaScript V8 engine that allows the design of servers and network applications in JavaScript.
- Express.js: a popular framework for Node.js, making it easier to create servers and handle HTTP requests.
- Databases: MongoDB, PostgreSQL - database management systems that can be used in Node.js-based software applications.
- ORMs/ODMs: Sequelize, Mongoose, and Prism. Tools that facilitate database interaction through object-relational mapping (ORM) or object-document mapping (ODM).
- RESTful API: Understanding REST architecture and the ability to create and consume RESTful APIs.
- GraphQL: An alternative to RESTful API, a query language for APIs that allows fetching only the required data.
- Authorization and authentication: JWT (JSON Web Token), OAuth/OpenID Connect. Technologies for managing authentication and authorization in web applications.
- Testing: Jest, Mocha, k8s - tools for unit and integration testing of back-end code.
Additionally:
- Version control: Git and GitHub/GitLab.
- Agile/Scrum methodologies: understanding the basic principles and practices used in Agile and Scrum methodologies, which help in effective project management and teamwork.
- Collaboration and project management tools: Jira and Trello. Platforms that facilitate work organization, progress tracking, and team collaboration.
- Continuous Integration/Continuous Deployment (CI/CD): Jenkins, GitHub Actions, and GitLab CI aimed to automate the testing and deploy code to production.
- Application deployment: Railway and Vercel enable deploying, hosting, and scaling web applications.
- Docker: A tool for containerizing applications, making it easier to manage dependencies, configuration, and deployment of applications in different environments.
- Kubernetes: A container orchestrator that simplifies managing, scaling, and updating container-based applications.
A more extended version is brilliantly presented here.
Learning, learning, and learning
As you can see, the amount of knowledge to acquire and skills to master is vast. Suppose there's one thing we can be sure of. In that case, we will never be able to master everything in this field (and it's not practically necessary), while new technologies are constantly emerging that are worth exploring, meaning learning never ends.
However, it's important to remember that this is not a race but a marathon. There's no need to rush; what matters is knowing that we can start at any moment, regardless of our age or educational background. Everything depends on our determination and willingness to learn.
And since learning is vital, here are a few points that can help us.
Growth Mindset
Carol Dweck is an American psychologist and professor at Stanford University. Her work focuses on motivation, personality, and development, particularly the concept of the growth mindset. Learning about this topic is worth it, as it can help us learn and develop.
Here are the basic principles of the growth mindset according to Carol Dweck:
- Intelligence and abilities can be developed: People with a "growth mindset" believe intelligence and abilities are not fixed traits but can be developed through effort, learning, and practice.
- Challenges are growth opportunities: Instead of avoiding strenuous tasks, people with a growth mindset embrace challenges as a chance to develop their skills.
- Struggles are part of the learning process: People with a "growth mindset" understand that encountering difficulties and obstacles is part of the learning process, not a sign of incompetence.
- Effort leads to success: People with a growth mindset believe effort is the key to success and strive for constant self-improvement.
- Openness to criticism: People with a growth mindset are open to constructive criticism and use it for further development.
- Inspiration from the success of others: Instead of being envious or comparing themselves to others, people with a growth mindset draw inspiration from other people's successes and learn from their examples.
- Perseverance: People with a growth mindset persist in pursuing their goals, even when faced with obstacles or setbacks.
Practicing a growth mindset helps build resilience, persistence, and motivation, leading to better achievements in both personal and professional life.
Kaizen
Kaizen is a Japanese philosophy that emphasizes continuous improvement in all aspects of life, including work, personal life, and social interactions. The term kaizen comes from two Japanese words: kai, meaning change, and zen, meaning good. As to learning programming, the Kaizen philosophy can help individuals become better programmers by focusing on minor, gradual improvements over time.
Here are a few fundamental principles of the Kaizen philosophy that can be applied to learning programming:
- Continuous improvement: Kaizen assumes that there is always room for improvement, even if it seems we have reached a high level of knowledge and skills. Learning programming means constantly seeking ways to improve code quality, work efficiency or acquire new skills.
- Small steps: The Kaizen philosophy focuses on achieving progress through small, incremental changes rather than striving for spectacular leaps or achievements. In practice, this means dedicating time to learning programming daily, even if you only have 15 minutes or half an hour to gain new knowledge or refine your skills.
- Reflection: Kaizen encourages regular self-evaluation, analysis of progress, and identification of areas that can be improved. This can include analyzing written code, evaluating work performance, or tracking progress in learning new technologies.
- Learning from mistakes: The Kaizen philosophy emphasizes that errors are inevitable and provide valuable learning opportunities. In programming, this means approaching mistakes as opportunities to gain new knowledge and hone your skills.
- Long-term commitment: Kaizen is a process that requires ongoing commitment and effort. In the context of learning programming, this means consistently learning and practicing, even if initial progress may seem slow or difficult.
- Collaboration: The Kaizen philosophy emphasizes collaboration and sharing knowledge with others. Collaborating with others allows for gaining new knowledge but also utilizing the experiences of others to refine your skills. Learning programming means sharing your experiences with other programmers and participating in discussion groups, online forums, or programming communities.
- Standards and quality: Kaizen promotes maintaining high-quality standards in everything we do. In programming, this means ensuring code readability, applying good practices, and using quality control tools that can help identify and eliminate errors.
- Adaptation to change: Quality programming learning in line with the Kaizen philosophy relies on adapting to the ever-changing world of technology. This means staying up-to-date with new programming languages, tools, and techniques to adjust to the changing demands of the job market quickly.
- Patience: Kaizen assumes continuous improvement requires patience, persistence, and time. In the context of learning programming, this means not expecting immediate results but instead striving to develop your skills and knowledge gradually.
- A balance between work and rest: The Kaizen philosophy also emphasizes the importance of balance between effort and recovery. Learning programming means taking care of your physical and mental health and planning time for relaxation and recreation to avoid overload or burnout.
By applying the Kaizen philosophy to learning programming, you can achieve long-term success, continuously refine your skills, and become a better programmer. The key is focusing on minor, gradual improvements and maintaining a long-term commitment to learning and development.
Project-based learning
In the section on learning programming, I mentioned how important practice is, in my opinion. Therefore, it is worth knowing that a learning method based on practice involves learning by creating projects.
Project-Based Learning (PBL) is a teaching method that involves engaging students in practical projects to acquire skills and knowledge in a specific area. With learning programming, PBL can be particularly effective as it allows for the practical application of theoretical concepts and the development of problem-solving skills, which are crucial for programmers. Here are the main aspects of PBL in the context of learning programming:
- Practical application of knowledge: learning programming by creating specific projects allows for a better understanding and assimilation of theoretical concepts. Practical experience with coding and debugging helps me better understand programming languages and technologies.
- Development of problem-solving skills: working on projects requires analyzing and solving problems encountered while creating software. It teaches decision-making, planning, and adapting to changing conditions.
- Collaboration: teamwork is everywhere in the programming world. PBL encourages collaboration, exchanging ideas, and working towards a common goal, allowing the development of teamwork skills necessary for future careers.
- Autonomy and responsibility: PBL provides more freedom and control over one's learning process. We learn what is needed at a given moment and what can be used, not in a textbook.
- Motivation: working on real projects that matter to their creators can increase their motivation to learn.
- Portfolio: Preparing projects as part of PBL allows for building a portfolio that can be used to showcase one's skills to potential employers or clients. This is an essential element in a programmer's career that can facilitate finding a job or obtaining contracts.
Deliberate practice under the guidance of an expert
In the past, apprentices in a trade learned for years under the supervision of a master in their field. This allowed them to gain the knowledge and skills necessary to become masters. In today's world, we can learn independently when we have access to a vast amount of information. Still, it is worth remembering that practice under the guidance of an expert can be very helpful in learning.
Deliberate practice is a method developed by psychologist Anders Ericsson. It involves the systematic, conscious, and purposeful improvement of skills in a specific area. Here are the basic principles:
- Specific goals: Deliberate practice involves setting clear, concrete, and achievable goals in a given area. These goals should be appropriately tailored to the current skill level and gradually increased as progress is made.
- Focused effort: Practice should be intense and focused, with total commitment. The practicing person should concentrate on the task, not other activities or thoughts.
- Conscious approach: During deliberate practice, it is crucial for the person practicing to be aware of their progress and the effects of their work. This means monitoring progress, analyzing results, and reflecting on what can be improved.
- Expert guidance: Deliberate practice involves working with an expert or coach who can provide valuable tips and feedback on performance improvement. The expert can also help set appropriate goals and monitor progress.
- Frequent and immediate feedback: Quick and reliable feedback is essential for deliberate practice. With it, the person practicing can quickly correct mistakes and make improvements.
The above method can be a great addition to your learning: the only catch is that it assumes finding a person (mentor) who can guide you and provide you with feedback. In the case of programming, this may be difficult, but possible. You can try to find a mentor among friends, online forums, Facebook groups, Discord, or other places where programmers meet. You can also find a mentor among your teachers, but this is not easy, as not every programming teacher is an expert in a particular field.
Summary
The full-stack software engineer profession is desirable, offering excellent career prospects and compensation. To become such an engineer, it is necessary to gain knowledge and skills in various fields, such as front-end development, back end, DevOps, testing, etc. However, remember to develop soft skills, which will be crucial for teamwork and client communication.
Remember that constantly improving your skills, working on personal projects, and networking with other professionals in the industry are just as important as formal education. In today's technological world, lifelong learning is essential to stay competitive in the job market.
Patience, determination, and openness to new challenges will help you succeed as a full-stack software engineer. Start with the basics, and over time, you will see your skills and knowledge deepen, allowing you to become a versatile software engineer.
In a world of rapidly changing technologies, the full-stack software engineering profession offers broad development opportunities and job satisfaction. Take on the challenge and start your programming adventure!
Definition of Full-Stack Engineer A full-stack engineer is a type of software engineer who works on both the front and back end of software. This means they're concerned with both what users see (the front end) and the parts of the software that make that user-side view possible (the back end).
Related Hyperskill topics
like this