Technical skills software engineers must have
Tags: career, engineering, advice
Published: 2019-12-25 05:29:47

Software engineering is one of the hottest types of jobs in the market right now. One of the beauties of software engineering is, you can be a successful software engineer without a formal degree. Skill is all that matters in software engineering.

![Software Engineering Team](https://thepracticaldev.s3.amazonaws.com/i/db4eykadutr6hd4s93ry.jpg "Software Engineering Team")

A good software engineer needs various types of skills. But, technical skills are by far the most important ones. These are the skills that help you to get your tasks done in the workplace. 

In this blog, I am gonna talk about tech skills which are must-have for software engineers. 


> Disclaimer: If you are fresher who is trying to land a job, this article is not for you. You do not need to learn everything mentioned here to land a job. You need to read the book: 'Cracking the coding interview'. Practice on <a href="https://www.hackerrank.com/" title="Hackerrank" target="_blank" rel="noopener noreferrer">Hackerrank</a>, <a href="https://leetcode.com/" title="Leetcode" target="_blank" rel="noopener noreferrer">Leetcode</a>, <a href="https://www.geeksforgeeks.org/" title="Geeks for Geeks" target="_blank" rel="noopener noreferrer" >Geeks for Geeks</a>, etc.

## Data Structure (For every software engineer)
Data Structure is one of the most important subjects for software engineers. Data structures are some specific formats for storing data. Each data structure is efficient in some cases and inefficient in other cases. So, as a software engineer, you must have the skill to pick the right data structure. 

The following data structures are a must for every software engineer:
- Array
- Linked List
- Trees
- Trie
- Stack 
- Queue
- Map
- Graph
- Hash Tables

If you want to learn more about data structures, you can visit <a href="https://www.geeksforgeeks.org/data-structures/" title="Geeks for geeks" target="_blank" rel="noopener noreferrer" >Geeks for Geeks</a>.

## Algorithm (For every software engineer)
A software engineer's main job is to solve problems. Algorithms are step-to-step instructions to solve a problem. So, algorithm is a must-have skill for every software engineer. Good knowledge of algorithms helps him/her to solve problems.

Here are some important and basic algorithms:
- BigO Notation
- Depth-first Search
- Breadth-first Search
- Dijkstra's Algorithm
- Searching
- Sorting
- Divide and Conquer
- String Matching
- Pattern
- Greedy

You can learn algorithms in <a href="https://www.khanacademy.org/computing/computer-science/algorithms" title="Khan academy algorithms" target="_blank" rel="noopener noreferrer" >Khan Academy</a>, <a href="https://www.geeksforgeeks.org/fundamentals-of-algorithms/" title="Geeks for Geeks Algorithm" target="_blank" rel="noopener noreferrer" >Geeks for Geeks</a> and many other places. 

## OS (For DevOps Engineers)
Every program runs on an operating system (OS). So, knowing the underlying OS will help software engineers to write more efficient and better code.

Here are some fundamental concepts a software engineer should know:
- Process
- Memory Management
- Thread and Concurrency
- Scheduling
- I/O Management
- Inter-Process Communication
- Virtualization

After learning these fundamentals, learn about distributed systems and cloud.

## Networking and Communication (For DevOps Engineers)
Most of the software engineers work on web technologies. And you should have a good understanding of networking and communication to excel at web technologies. Especially if you are interested in DevOps, networking and data communication is very important. 

The followings topics are must for software engineers:
- IP
- Private/Public Network
- Router
- Switches
- LAN/WAN
- OSI Model

- Protocols
- P2P communications
- Mesh, Ring, Star, etc.

If you want to be a DevOps engineer, this can be a starting ground for you. 

## Programming Language (For every software engineer)
As a good software engineer, you need to learn at least one programming language very deeply. Also, I recommend software engineers to try new programming languages frequently. This helps us to learn about good things about that language. This also helps us to learn new technologies and languages quickly. 

Learn at least one of the following languages deeply:
- C
- C++
- Java
- Python
- JavaScript
- C#
- PHP

Also try to learn at least one scripting language like JavaScript, PHP, Python, etc.

## OOP (For every software engineer)
Object-oriented programming is one of the most used paradigms in the software industry. a software engineer should know the following concepts:

- Encapsulation
- Polymorphism
- Inheritance
- Abstraction
- Association
- Aggregation
- Composition

## Database (For back-end engineers)
Software engineers have to deal with data every day. Structured data are stored in Databases. So, you should have a good understanding of databases.

You should learn at least basic CRUD operations, joining, grouping, etc. 

Learn at least one of the following databases:
- PostgreSQL
- MySQL
- Maria DB
- Oracle DB
- MS SQL Server
- MongoDB
- Cassandra
- Neo4j

## Git (For every software engineer)
Version controlling is very important in software engineering. This helps us to collaborate with others. It also enables us to roll back to any previous version easily.

Git is the most popular version controlling system now. You should learn at least the basics of git. 

Learn how git works. Also, learn basic commands like add, commit, push, pull, fetch, merge, etc.

## IDEs and Editors (For every software engineer)
IDE stands for Integrated Developer Environment. IDEs give suggestions while coding, check for errors before even compiling code and do a lot of other things. IDEs like Intellij Idea, Eclipse, Visual Studio, PyCharm, etc. are capable of doing a lot and saves a lot of time and energy of developers. Editors are simpler. But, editors like VS Code, Sublime Text, Atom have changed the game. They are capable of doing much more than editing nowadays. You have to know your IDEs and editors to unlock these potentials which can help you to be more productive.

## Mentality (For every software engineer)
This part is not purely technical. But, I want to add it anyway. To acquire these technical skills, you have to be prepared. If you find things complex, do not lose hope and keep on trying. You do not have to be a genius to acquire these skills. You just need to work hard. I have seen several students who thought they could not be good at programming contests. But, after going through a rigorous training program at university, those who did not drop out of the training program, excelled at competitive programming. Some of my colleagues thought they would not be able to keep up with all these new technologies. But, those who worked hard, excelled in this industry where a new technology is being introduced every fortnight.

## Conclusion
In this article, I have talked about the basic skills that software engineers must-have. These are starting ground. For your specific task, you will need to learn topics beyond this article. 

N.B: If you think I missed something or if you have any opinion about this article, leave a comment below.

This article was originally written in <a href="https://www.wget.blog/must-have-tech-skills-for-software-engineer/">Wget Blog</a>