This guide summarizes the knowledge and skills that you will need to develop along your career as a software engineer.
⚠️ Note that no one is an expert at everything, this is not a checklist but rather a survey of practical knowledge and relevant skills you will develop as your career progresses. Remember that it’s okay that you don’t know everything!
The knowledge and skills you need as a software engineer break down into several major categories:
Team Collaboration and Cooperation - How to work well with a team, be a good team member, coordinate your work with other engineers and resolve conflicts.
Data Structures and Algorithms - How to store and organize data in different ways and then solve many different types of problems using code.
Technical Interviewing - How communicate clearly as you think through solving problems, asking the right questions, analyzing efficiency, and verifying solutions.
Software Design Patterns - How to structure and design code in order to make sure the code is high quality, well-organized, easy to understand and easy to change over time.
System Architectures - How different software systems all fit together and how to design them in order to be reliable, maintainable and efficient.
Development Workflows - How to do specific processes common to writing software such as debugging when things go wrong, searching for possible solutions online, working with Git or other version control and more.
Team collaboration and cooperation involves developing the skills to work well with as part of a team, be a good team member to others, coordinate your work with other engineers and resolve conflicts as they come up. This includes:
How to write simple technical documentation about projects you build (READMEs)
How to comment your code so others can read and understand
How to give constructive criticism when reviewing a peer’s code
Communicating your progress clearly to your team or manager
Drawing and whiteboarding when designing to communicate your ideas
Reporting issues and bugs clearly in a way other engineers appreciate
Github Flow - Branches, pull requests and understanding the process to get your code reviewed and merged.
In some ways, this area of effective communication, collaboration and cooperation with others is the most important part to success as a software engineer. Learn more by checking out this blog post about the crucial role of empathy in being a software engineer.
Data structures are just different ways or organizing and storing data within software. Examples are: Array, Linked Lists, Stack, Queues, Trees, Graphs, Sets, Hash Tables.
Algorithms are simply a particular approach to solving a particular problem. Algorithms involve writing code which often accesses data structures and then performs operations and calculations on the data.
Used together, you can select one or more data structures to store your data, and then use particular algorithms to achieve a particular goal or solution within your software programs.
ℹ️ To learn more about data structures and algorithms, check out this guide on studying them.
In addition to understanding how to solve problems using data structures and algorithms, you will also often apply these skills specifically in coding interviews when applying for internships or full-time software positions.
Technical interviewing is a skill of its own which builds on top of your knowledge of data structures and algorithms. There are several aspects to technical interviewing including the steps of a coding interview, what questions to ask your interviewer, and how to test that your solution is correct.
ℹ️ To learn more about technical interviewing skills and strategies, check out our technical interviewing guide.
Software design patterns and principles are ways of organizing and designing code in order to make sure the code is high quality, well-organized, easy to understand and easy to change over time.
These patterns are not specific libraries that you can plug into your application. These are, rather, guidelines on how to tackle certain problems in certain situations.
ℹ️ To learn more about software design patterns, check out our software design patterns and principles guide.
System architecture is centered around how specific software systems and protocols work, the components they contain and how that all fits together. Of course, there are many systems and elements with different architectures. For example:
How computer networking and the web works
How to design the APIs that allow data to go between applications
How to design relational databases that store your app’s data
How to “cache” data to make your app faster
How to build parallel or concurrent systems
ℹ️ To learn more about how to architect and design different types of software systems, check out our software architecture guide.
Development workflows involve specific processes common to writing software such as debugging when things go wrong, searching for possible solutions online, working with Git or other version control and more.
Version Control - Collaborating on software with version control such as Git and Github
Debugging and Investigation - How to systematically debug and investigate issues when software isn’t working correctly
Google-Fu - How to search Google, Github and Stack Overflow to find possible solutions when something isn’t working as expected.
Library Evaluation - How to find and evaluate third-party libraries that can be used to save you time and energy within your software system.
Building iOS or Android Apps
Building Web Apps with Ruby on Rails
Designing Java Interfaces - How to design interfaces and abstract classes in Java
System administration (DevOps) - Critical skills associated with setting up servers to properly run software.
UNIX and Command-line - Using the UNIX command line comfortably and related tools (
ℹ️ To review the common tech stacks and career tracks in software engineering, check out our software roles guide.