How to increase your company’s attrition rate

You did read that right! and it wasn’t a writing mistake. The title of this post is, in fact, how to increase a company’s attrition rate. Earlier today, I saw a post on Twitter that caught my attention. It was a tweet about people leaving a company for another due to a 30%+ increase in compensation.

It caught my eye because this is happening more and more these days. It’s nothing new, but the attrition rate at many tech companies has recently increased at a faster pace. Many people think it is part of the great resignation.

People leaving jobs to get better compensation is nothing new. Switching jobs is a common way to get a higher position and higher compensation. But why? It doesn’t make sense. But in general, companies focus and invest more in hiring new talent than retaining employees. As a result, companies spend a lot of money attracting new employees, recruiting, signing bonuses, etc. While increasing salaries by a few percentage points and fewer stock options for existing employees, why? Yes, I agree. It makes zero sense. And I feel like no one wins here, nor the employees or the companies.

I am familiar with the amount of time and money invested in recruiting new employees, specifically tech talent. It’s not easy. It takes time and money and is a big distraction for any company since their most senior engineers often direct interviews for new candidates. However, these very senior engineers will then go to another job because their compensation (base salary + stock + bonuses) is either stagnant or increases a few percentage points every year.

In the tech industry, when you switch jobs, often your compensation will increase by at least 20%, that has been my own experience, but I am sure it varies a lot. The point is, a compensation increase of 10% or more is not something most people experience. Therefore they end up moving to other companies. Sometimes companies who will not increase employee’s compensation significantly, are the same companies who will offer much higher compensation to convince someone new to join them…

When you hire a new employee, it takes time to get them for them to get familiar with the company, the team, and the work before they are efficient. And again, after a few years, if these employees don’t feel fairly compensated, they will leave for another job. Employees switching jobs is normal, but what’s not normal is allowing good employees who like their careers to seek other employment to achieve a higher compensation. At the same time, the company invests a lot of money and time hiring to replace leaving employees and fill new positions.

I understand that many people leave their jobs looking for a better culture, challenging new opportunities, and a better work-life balance. Still, in this case, it’s really about more compensation, something that more and more employees have in mind now, especially with the higher inflation rates.

A simple explanation of the four basic concepts of Object-Oriented Programming (OOP)

As a software engineer, the concept of object-oriented programming is something you need to learn, understand, and be able to explain simply to anyone who asks. Therefore, most interviews for programming jobs will include questions about object-oriented programming.

In this post, I’d like to share a list and a simple description of the four concepts of object-oriented programming.

The four principles of object-oriented programming are encapsulation, abstraction, inheritance, and polymorphism.

Encapsulation

It means that a group of related properties, methods, and other members are part of a single unit or object. In other words, it’s like a package of goods where all of the items are used and needed for one purpose. It’s like going to an all-inclusive resort in Mexico that includes everything with one payment and in one place. A single package includes your hotel room, entertainment, food, gym, the beach, etc.

Abstraction

It is the principle used to describe how a program handles complexity by hiding the implementation details and displaying only essential features to a user. So, for example, you can flip a switch on your wall and see that the lights come up without knowing how electricity works. Likewise, you order things online, pay by entering a number, and these things show up at your door, all without you knowing how these things operate behind the scenes – all of these are real-life examples of abstractions.

Inheritance

It enables you to create a new class that reuses, extends, and modifies the behavior defined in another class.

The class whose members are inherited is called the base class, and the class that inherits those members is called the derived class.

In C#, all classes implicitly inherit from the Object class.

A real-life example of inheritance could be vehicles as the base class, and then we can have things like motorized and non-motorized vehicles as derived classes. The idea is that the base class can have generic properties (for example, all vehicles in this example have wheels) that can be applied and used by all derived classes, and then each derived class can have its own properties and behavior depending on its need.

  • Vehicles
    • Motorized
      • Car
      • Bus
    • Non-motorized
      • Bicycle
      • Cart
      • Rickshaw

Polymorphism

It means that you can have multiple classes and use them interchangeably, even though each class implements the same properties or methods in different ways. This gives you the ability to create more modular and extensible applications. With polymorphism, the program will call a specific method determined at runtime based on the type of the object.

A real-life example of this is blood groups. Humans all share many of the same characteristics, but we also have unique characteristics within a population, such as blood type. Human blood groups are examples of genetic polymorphism.

If you are interested in learning more about object-oriented programming, I recommend the books below:

A simple explanation about Software Architecture and Software Design

I have been working as a software developer for many years now. In my experience, many people (including myself) confuse these two processes and talk about them interchangeably as if they are the same thing, but they are not. I hope this post helps clarify the distinction between these two important processes. For years I didn’t understand the importance of good software architecture, but with experience comes the realization of how vital solid architecture and software design is. It can save a lot of money and time and increase a software system’s performance, usability, security, and scalability.

Software Architecture

Software architecture focuses on the high-level infrastructure of a software system to allow for flexibility, security, and scalability of a system. The goal of software architecture is to make fundamental structural choices to meet the business and technical requirements. Therefore, the choices made in software architecture are important and need to be carefully analyzed as these will be too costly to change once a system is implemented.

There are many architectural styles or patterns in existence to accomplish these tasks. These architectural patterns help establish reusable groups of design decisions and constraints that are applied to a system to generate the desired output and quality.

Some of these architectural patterns include the following:

  • Client-server (n-tier architecture for example)
  • Event-driven
  • Layered
  • Microservices
  • Pipes and filters
  • Service-oriented

Once the architecture of a software system is complete, a software development team can use it as a guide or blueprint to make educated software design decisions before starting to write any code.

Software Design

Software design is where the implementation details of all parts that will make up a system are conceptualized. Software design is what happens after software architecture and before the programming starts. The result of software design is often a plan to implement tasks such as coding, testing, integration, and deployment.

Experienced software developers will review design considerations during this phase. These considerations should reflect the goals and expectations of all stakeholders. Some of these considerations include:

  • Extensibility
  • Modularity
  • Reliability
  • Reusability
  • Security
  • Performance
  • Scalability

Also, software design includes design patterns, which are reusable solutions to common problems within the context of software design. These design patterns are essentially best practices that software developers can use to solve common issues when designing a software application.

The following are some design patterns to speed up the development process with these proven development paradigms.

Some of the software design patterns can include the following:

  • Dependency Injection
  • Singleton
  • Factory Method
  • Facade
  • Decorator
  • Composite
  • Chain of responsibility
  • State
  • Event-based Asynchronous

If you want to learn more about the items listed above under architecture and design, I suggest looking online; there is plenty of information about each of these architectural and design patterns out there, and those details are outside of the scope of this post.

This post only overs software architect and software design at a high level, and if you are interested, I suggest you look into these two processes in detail. Below are some of the books I recommend on the subject:

Work-Life Balance

My 14-year-old son asked me today about work-life balance. He wanted to know how to achieve it and get better at it. I think he believes I got this figured out, but the truth is that for me, this is an ongoing process. If you don’t balance your job or school priorities and your personal priorities, one of them will be negatively affected, resulting in frustration and possibly burnout.

I told my son that the goal is to learn to prioritize his personal and school tasks. Prioritization and focus are key. Here are a couple of things that have worked for me:

  • Focus on doing the challenging tasks first, even if you don’t want to or enjoy them. Completing the challenging tasks first will give you a sense of accomplishment and will reduce stress.
  • Split larger tasks into smaller, digestible tasks.
  • Focus on one task as much as possible. Avoid multitasking.
  • Allocate a fixed amount of time to an activity (Timeboxing), and don’t cheat. You can use the Pomodoro technique or similar to help you accomplish this.
  • Separate your work and personal environment. You can do this by working in a different place in your home, going to a coffee shop for work, etc.
  • Assess how you spent your day, week, month. This will help you determine how much time you spent doing tasks unrelated to work, school, or personal life. For example, most people spend a lot of time streaming tv shows, movies, social media, etc. And then question why they don’t have enough time to accomplish their goals, large and small.

Work-life balance is not easy. This is why there are so many books and techniques to help you accomplish this. It’s all about time management and self-awareness. It’s easy to spend time on things that are not our priorities, but we do it because it’s easy or entertaining.

Make sure to always leave enough time in your day to talk to friends, family, practice music, read, exercise, or whatever else fulfills you and helps you grow – no matter how busy you think you are.

Remember this: work and school are important, but we do both of those things to have a better life. Prioritize your personal life, always.

Your North Star

It’s a metaphor. Your North Star is your personal mission statement.

In my last post, I mention having a North Star a couple of times, and for me, it’s an excellent way to describe my single long-term goal. There are many goals on my list, but most of them align to the one single long-term goal, my North Star. It gives me something to look forward to and be motivated about; I might feel lost without it.

Having lists and agendas, it’s not something I do, not consistently. I collect notes and a logbook, but having an open schedule and plan is essential. It allows me to adapt and tweak my days, weeks, and months to ensure that the things I do help me progress towards my North Star. My North Star is described in a single sentence, and then I write things down that I might need to do to get closer to that long-term goal. That’s how I keep track of my North Star goal.

Divide and Conquer

Have you heard of the term divide and conquer? in computer science, divide and conquer is an algorithm design paradigm. The idea is to break down a problem into two or smaller problems until these are simple enough to be easily solved.

This is how I think of my personal goals. They aren’t problems, but I like having a significant, long-term goal or plan, my North Star, and then break that into smaller goals, maybe even daily goals that can help me achieve my North Star.

Why do this? It helps by making it easier to accomplish smaller goals, and doing so gives you the motivation to continue doing it. In the past, I had long-term goals that I didn’t achieve because they were too ambitious, and I just never knew where to start. The divide and conquer method, applied to objectives, is an excellent way to get things done.

Why a North Star Goal?

Because it motivates me. Without it, it doesn’t take long before I feel bored or unmotivated. My North Star goal is split into smaller goals, I do this so it’s not overwhelming either. So that’s how I keep things balanced. It works for me.

As time goes by, seeing the progress towards your North Star can give you a reason to keep trying, keep learning, and keep doing. This is very important, at least for me. Otherwise, it’s too easy to become complacent.

You can have more than one North Star, but for me, I can only handle one at a time. Otherwise, I end up distracted and making plodding progress to any of my goals. Therefore, I believe in avoiding multitasking, and instead, I shot to focus on one thing at a time.

One of my North Star goals in the past was to learn English, I tried different methods, and while it wasn’t easy, I made it a reality by focusing on that one big goal first. Another North Star of mine was to find a job as a web developer. Again, I started small, working on small projects on my own, reading books, then learning how computers and the internet works. And finally, getting my first job as a LAN engineer. This job was mostly about computer networking, but it allowed me to work with computers and software, from which I then transitioned into a web developer.

The tried and true suggestions such as keeping it simple, avoiding multitasking, focusing on smaller tasks and goals will continue to be solid advice, in my opinion. But having a North Star goal will give you purpose and direction.

What is your North Star?