## DEV Community

Sharafat Ahmed Sabir

Posted on • Updated on • Originally published at blog.iamsabir.com

# Technical skills software engineers must have

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.

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 Hackerrank, Leetcode, Geeks for Geeks, 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
• Trees
• Trie
• Stack
• Queue
• Map
• Graph
• Hash Tables

## 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
• Dijkstra's Algorithm
• Searching
• Sorting
• Divide and Conquer
• String Matching
• Pattern
• Greedy

You can learn algorithms in Khan Academy, Geeks for Geeks 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
• 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

There are so many things in this article you don't need. Let's stop doing this "you must do this if you're a software engineer" gatekeeping.

Sharafat Ahmed Sabir

Well, I wanted to cover all types of software engineers. Front end, back end, and DevOps.

Do you think a tag beside every section which will suggest which type of engineers need it, would be more appropriate?

Sharafat Ahmed Sabir

I have edited the article based on your comment. Please have a look and tell me what do you think.

Wouter • Edited

This post reads like plain keyword-stuffing. You're just throwing a bunch of names and concepts out there without qualifying (a) what they are, (b) why everyone must learn them, (c) and what level of knowledge you deem they must have in order to qualify.

An example of what I mean: for devops engineers, you've listed "protocols". Do I need to know the practical application of the protocols used in the stack(s) I'm working with? Or do I need to be able to recite the RFCs, specs & standards of every protocol I've ever come in contact with? I'm exaggerating of course, but this sort of nuance is extremely important in order to prevent gatekeeping.

Your post is not doing new developers any favours. Yes, if you're a senior software engineer, you've probably come across all of these things and you've learned at least a little about most of them. But there is simply no way a junior developer in their first job must have intricate knowledge of everything you listed. And as it is right now, your post doesn't reflect that nuance at all.

Sharafat Ahmed Sabir • Edited