The essential pillar stones to become a software engineer
Tags: career, programming
Published: 2022-02-15 08:05:42

A software engineer is curious to come up with an efficient and scalable solution depending upon the problem. Let's say you're a software engineer who has basic knowledge and hence can come up with a simple solution. That is cool but what about a **scalable solution**! With more clients, you need to scale up. To come up with that, software engineers should familiarize themselves with the **pillar stones** of software engineering.

![meme gif](https://i0.wp.com/blog.securly.com/wp-content/uploads/2017/09/securly-horizontal-scaling-gif-1.gif?fit=2529%2C1875&ssl=1)

Don't get scared by hearing the term essential pillar stones, they just help in simplifying the concepts that would once seem complex. As an additional bonus, these pillars will help you in your interviews for sure. Without any further chit-chat, we will dig into the pillars! 

Let's disclose the name of the pillars now! The pillars are Operating Systems, Network and Web Security, Database Engineering, System Design, and last being data structure and algorithms. I will be only focusing on the first 4 and at the end of the blog, I will provide a small piece of information on how I try to improve my DSA skills. Operation System and Network and Web Security create the basic foundation and understanding the concepts for those two pillars will further help in understanding the concepts of the other 2 pillars. 

## 1. Operation System 
We all have heard of windows, Linux, Apple macOS. They're the existing operating system that manages hardware and software resources. Did you ever wonder how the multiple huge processes fit into the main memory and how the CPU schedules the various tasks? Understanding CPU scheduling tasks, pagination, and segmentation, the concepts of virtual memory will blow your mind!  It will provide you with an idea of how your processes and various applications function so efficiently on your devices.

In my opinion, you can certainly dig real deep as you want but as a software engineer, a few concepts are essential to know and thus I have curated a playlist with all the OS concepts for a software engineer - https://www.youtube.com/playlist?list=PLOU7PAjLVz8omogw4JDw5eeQEVfHOmHTu 

The playlist covers the following topics - 
➡️ Process v/s Threads
➡️ Multi-processing and Multi-threading
➡️ Virtual Memory 
➡️ Paging 
➡️ Translation Lookaside Buffer
➡️ Deadlocks, Semaphores & Mutex
➡️ CPU Scheduling (Preemptive & Non-preemptive) 

## 2. Network and Web Security 
This is one of the most interesting topics for me. I am not a network engineer of course hence as a software engineer I try to understand the concepts at a good surface-level which can further help me with understanding complex system design theory.

Now under this section, I believe it is extremely essential for understanding TCP and UDP protocols, the classic OSI model, TLS, DNS, and endless protocols that help in understanding how the connection of the client to server happens even (I am fangirling but it's all so exciting). Thus, within my playlist there also includes a video on what happens when you enter google.com in the browser (super interesting) - https://youtube.com/playlist?list=PLOU7PAjLVz8qfmiqTYxHED-kCXW7eYtVx

![Fangirling](https://c.tenor.com/2eyipqVX9DQAAAAC/movie-animation.gif)

The playlist covers the following topics - 
➡️ OSI Model (The famous classic)
➡️ TCP, TCP 3-way handshake, TCP slow start, UDP
➡️ Hypertext Transfer Protocol (HTTP) 
➡️ Transfer Layer Security (TLS)
➡️ Server Name Indication (relative to TLS)
➡️ Network Address Translation (NAT)
➡️ Address Resolution Protocol (ARP)
➡️ Virtual Private Network (VPN)

## 3. Database Engineering
This is my favorite pillar (not going to deny it). I have always found backend engineering interesting but at the start, it was all about using a single database (SQL or NoSQL) based on my interest and not taking scaling into account. **SUCH A WRONG APPROACH**

When you want to learn database engineering which is so useful for backend engineering, you need to be able to understand the ACID transactions. There is also a clear difference between SQL and NoSQL and it is very essential to understand it to choose based on a project. Apart from this, scaling a database is advanced and there are so many methods including indexing, partitioning, and sharding (too important concepts). Not scaring you off but with the playlist, I have curated, I am certain the concepts will become easy for you - https://youtube.com/playlist?list=PLOU7PAjLVz8qwdYWCd6qi4IeUTypQKqyZ

The playlist covers the following topics - 
➡️ ACID Properties
➡️ Conflict and view serializability
➡️ Database Indexing
➡️ BTree, B+Tree, Log-Structured Merge (LSM) Tree
➡️ Bloom Filters
➡️ Database Replication
➡️ Storing tables on disk
➡️ Long Polling
➡️ Database Partition
➡️ Column v/s Row Oriented Database
➡️ SQL v/s NoSQL, SQL Joins, SQL Injection Attack
➡️ Concurrency Control, MVCC
➡️ Keys in DBMS, Normalization
➡️ Database Sharding 
➡️ Connection polling 
➡️ Web Sockets
➡️ Redis

## 4. System Design
We've come down to the last pillar! System design comes in plenty of interviews along with OS but the concepts of system design are so extremely important for any job you enter 'cause you need to build a scalable and either a highly consistent or highly available product. 

You might have heard of the term **load balancing** and don't know what exactly it is and so many algorithms attached to it. Within the playlist, it sequentially covers proxy, reverse proxy, load balancing, rate limiting and so many fancy terms you will hear definitely when building a scalable product. Thus, my curated list will help you certainly and it also involves a few system design interview videos which I found very helpful - https://youtube.com/playlist?list=PLOU7PAjLVz8rFA-Atn-mEQ2IGaMWVitu7

The playlist covers the following topics - 
➡️ Proxy v/s Reverse Proxy
➡️ Sidecar Proxy, HTTP Proxy, service mesh proxy
➡️ Load Balancing, Consistent Hashing
➡️ Layer 4 v/s layer 7 load balancing
➡️ Rate Limiting
➡️ Fail-over and high-availability
➡️ Active-active and active-passive cluster
➡️ Pub-Sub, Two generals' problem, Message Queue
➡️ CAP Theorem
➡️ Distributed Caching
➡️ Content Delivery Networks (CDN)
➡️ Cross-Origin Resource Sharing (CORS)
➡️ Distributed locks, distributed consensus, PAXOS algorithm
➡️ Protocol Buffers
➡️ Remote Procedure Call (RPC)

This covers the 4 major pillars of software engineering and the playlist will be helpful as it will reduce your search time and you can focus on broadening your knowledge (a bit easy peasy). Also, this playlist will continue to update as I find more concepts to learn so I will just keep adding and updating (so save the playlist!). If you think I have missed out on a topic, please mention it within the comments as well. 

![easy-peasy](https://technerds.com/wp-content/uploads/2021/05/HollowShockedGerenuk-max-1mb.gif)

Coming to the last pillar i.e Data Structures and algorithms, for this well, I focus on data types such as Linked List, Hash Map, Trie, BST, and sorting algorithms. Every week you could practice easy to medium Leetcode questions and when you feel confident try out a hard one. Also, there is no shame in checking out the solution or the hints after you have given 15-20 minutes of your time on solving the problem. Learn and grow, that's what the motto of any software engineer should be. Adios 👋🏼