

Discover more from The Polymathic Engineer
Virtualization
Virtual machines and containers explained in simple terms. Plus the most important soft skills to master as a software engineer.
Hi Friends,
First of all, I want to give a special welcome to all the new subscribers. We crossed 5000 last week and we are already very close to 6K. This week we celebrate the 40th edition of the Polymathic Engineer newsletter and we will mainly discuss about virtualization.
The outline will be as follows:
What is virtualization
Virtual Machines
Containers
Virtual Machines vs Containers
Relevant soft skills for software engineers
Virtualization
Virtualization in computing is the equivalent of giving computer hardware a mask. It divides one computer into several "virtual" computers to separate and simplify things.
Before virtualization, businesses used to employ one server for each application frequently. This method left a lot of unused computer power, which was a waste, especially for large workloads.
Virtual machines were introduced precisely to use computer hardware more efficiently. They transform the actual hardware into a form that can be shared, helping to use all the available computer power.
Virtual Machines
A virtual machine is like a computer inside your computer that is made and run by software. VMs are made up of two parts:
- a Hypervisor that handles the resources of virtual machines that are running on real hardware
- a guest OS that is a full operating system that is completely different from the host OS
Actually, there are two types of hypervisors. The bare metal hypervisors, that run directly on the computer and the host hypervisors that run on top of another OS, so they might be a little slower because there's an extra layer between them.
Usually, bare metal hypervisors work faster and better since there is nothing between them and the computer. In contrast, host hypervisors might be a little slower because there's an extra layer between them and the computer. A popular example of host hypervisor is VirtualBox.
Containers
Although containers have been around for a long time, they started to be popular only in 2013 with Docker.
Containerization is the process of putting all the things an application needs to work into a single unit. Unlike creating a whole virtual computer for an application, containerization just packages the application and what it needs to run.
This allows developers to easily move the application package and run it anywhere.
From a more technical point of view, containers can be seen as groups of processes that are separated from the host machine by some low-level kernel features. There are 3 main features that allows containers to work:
namespaces, which make it possible to separate kernel resources like process IDs, network, and file systems, from each other.
cgroups, that help keep track of the tasks and resources that are assigned to each group
capabilities, which let change the level of rights for a certain process.
Virtual Machines vs Containers
The difference between virtual machines and containers is very similar to that between a house and an apartment in a building.
A virtual machine (VM) is like a house where an application can live without sharing resources. A container is like an apartment in a building: each apartment has its own resources, but they all share the core resources of the house.
Virtual machines have a whole stand-alone operating system, while containers have a very small OS and use the host OS when more resources are necessary.
The main benefit of virtual machines is the superior isolation level. Processes on the hostOS and the guestOS are clearly separated.
Containers offer less isolation but use less memory and CPU, start up faster, and are more portable.
Soft Skills
Technical skills are the ground for a software engineer, but without soft skills you can’t advance much in your career. Here are the soft skills that matter the most to me:
Communication: Keep a positive tone while speaking; Don't interrupt other people's speech; Take care also of your body language
Empathy: Show genuine interest in others; Put yourself in their shoes; Understand and respect their emotions; Be encouraging without judging
Teamwork: Never take all of the credit; Celebrate the accomplishments of your teammates; Compliment with them publicly and generously
Emotional intelligence: Don't be impulsive and take a step aside when you're upset; Reflect on the consequences of your actions; Learn to understand how you're feeling
Build relationship: Always be willing to help others; Find shared interests with them; Add value before requesting something in exchange
Be able to persuade: Understand what other people are interested in; Tell stories that touch the strings more personal; Communicate succinctly but with emotion
Be able to negotiate: Pay attention while listening; Determine what the opposing party desires; Present options that benefit both parties.
Conflict resolution: Prioritize solutions to issues; Apologize when it's your fault; Don't argue and make accusations
Interesting Tweets
Dynamic programming looks like magic until it doesn't click in your mind. Thinking about it as an efficient form of recursion is easier at the very beginning.
As you know, I lost my father 40 days ago and I can only say to fully enjoy and appreciate these moments until it is possible. Time spent with your parents and loved ones in general is all precious. Unfortunately it won't be last forever.
I find it extremely valuable to write about something just after having learned it. At that moment, you clearly remember the points where you struggled, and you can make them easier for other developers.
Virtualization
I came here from Substack weekly reads. And I love your content. You explain things in simple words.
If I recall correctly, https://wiki.archlinux.org/title/AppArmor is also used by Docker engine.
Fernando, congratulations on your 5k milestone! More to come.