Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help


Separation of Positions

One of the things that creates unnecessary confusion at the beginning of a technical career is the number of different job titles.

You will encounter titles such as:

  • Software Developer
  • Software Engineer
  • Frontend Developer
  • Backend Developer
  • QA Engineer
  • DevOps Engineer
  • SysOps Engineer
  • Cloud Engineer
  • Software Architect

And very quickly, a simple question appears:

What is the actual difference between all of them?

Before we separate these roles, there is something important you need to understand.

Job titles in software engineering are not standardized.

Two companies may use completely different titles for people doing almost exactly the same work.

One company may call someone a Backend Developer, another may call the same position a Software Engineer, while a third may use Platform Engineer.

The opposite also happens.

Two people may both have the title Software Engineer, while the scope, complexity, and responsibility of their work are completely different.

Because of that, do not become obsessed with titles.

Focus on:

  • what the person actually builds;
  • what they are responsible for;
  • what decisions they are allowed to make;
  • what systems they understand;
  • how much responsibility they carry;
  • how independently they can operate;
  • how wide their technical perspective is.

That tells you much more than the title itself.

For the purposes of this Task Library, however, I want to establish a practical separation between several major roles.

This is not an attempt to create an absolute industry standard.

It is a model that will help you understand the different directions in which your technical development can move.


Software Developer

A Software Developer is primarily focused on implementing software functionality.

The central question is usually:

What needs to be built, and how do I implement it correctly?

A developer spends a significant amount of time working directly with:

  • application code;
  • business logic;
  • libraries;
  • frameworks;
  • APIs;
  • databases;
  • tests;
  • debugging;
  • feature implementation;
  • bug fixing;
  • code maintenance.

A strong developer should be able to receive a functional requirement and transform it into working software.

That does not mean blindly translating tickets into code.

A good developer should understand what they are building and why they are building it.

But the primary focus is still implementation.


Frontend Software Developer

A Frontend Developer works primarily on the part of the system that users directly interact with.

This may include:

  • web interfaces;
  • desktop interfaces;
  • mobile interfaces;
  • dashboards;
  • forms;
  • visualization;
  • interaction logic;
  • client-side state;
  • communication with backend APIs.

The work often involves technologies related to:

  • HTML;
  • CSS;
  • JavaScript or TypeScript;
  • frontend frameworks;
  • browser APIs;
  • accessibility;
  • responsive design;
  • client-side performance;
  • UI testing.

A frontend developer should not think only in terms of making something visually attractive.

The frontend is software.

It contains:

  • state;
  • data flows;
  • error handling;
  • validation;
  • concurrency;
  • networking;
  • caching;
  • security considerations;
  • performance constraints.

The visual interface is only the visible part of that system.


Backend Software Developer

A Backend Developer works primarily on the parts of a system that operate behind the user-facing interface.

This may include:

  • APIs;
  • business logic;
  • authentication;
  • authorization;
  • databases;
  • background workers;
  • message processing;
  • distributed communication;
  • data validation;
  • caching;
  • persistence;
  • service integration.

A backend developer may work with:

  • Go;
  • Rust;
  • C++;
  • Crystal;
  • Java;
  • Python;
  • C#;
  • databases;
  • queues;
  • networking protocols;
  • operating-system interfaces;
  • cloud or infrastructure services.

At the beginning, backend development may appear to be primarily about receiving a request, processing some data, and returning a response.

At higher levels, it becomes significantly broader. You begin dealing with:

  • concurrency;
  • consistency;
  • fault tolerance;
  • latency;
  • resource management;
  • distributed systems;
  • observability;
  • scalability;
  • storage design;
  • security;
  • deployment constraints.

The deeper you go, the less the work is about individual endpoints and the more it becomes about systems.


Software Engineer

The terms Software Developer and Software Engineer are frequently used interchangeably.

In many companies, there is no practical distinction at all.

For the purposes of this book, however, I make a useful distinction.

A Software Developer is primarily concerned with:

How do I implement this functionality?

A Software Engineer increasingly becomes concerned with:

How should this functionality exist inside the entire system?

That difference becomes extremely important.

Software engineering includes development, but it extends beyond implementation.

An engineer should increasingly think about:

  • architecture;
  • system boundaries;
  • interfaces;
  • failure modes;
  • performance;
  • scalability;
  • maintainability;
  • observability;
  • deployment;
  • security;
  • resource usage;
  • compatibility;
  • testing strategy;
  • long-term technical consequences.

Writing code is still an important part of the work. But code is no longer the entire problem.


Frontend Software Engineer

A Frontend Software Engineer may write the same frontend code as a Frontend Developer, but the expected perspective becomes broader.

Instead of thinking only about individual screens or components, the engineer may also think about:

  • frontend architecture;
  • application-wide state management;
  • rendering strategies;
  • performance budgets;
  • module boundaries;
  • dependency management;
  • accessibility architecture;
  • frontend observability;
  • security boundaries;
  • deployment models;
  • long-term maintainability.

The distinction is primarily one of scope and responsibility, not necessarily programming language or framework.


Backend Software Engineer

The same principle applies on the backend.

A Backend Software Developer may be asked to implement a service.

A Backend Software Engineer may also need to determine:

  • whether that service should exist at all;
  • what its boundaries should be;
  • how it communicates with other services;
  • how failures propagate;
  • how data consistency is maintained;
  • how the service behaves under load;
  • how it is deployed;
  • how it is monitored;
  • how it is upgraded;
  • how backward compatibility is preserved;
  • what happens when dependencies become unavailable.

Consider a simple requirement:

Store a user record.

A developer may immediately think about:

        POST /users
                ↓
        validate request
                ↓
        insert into database
                ↓
        return response

An engineer may additionally ask:

        Who owns this data?
                ↓
        What is the consistency model?
                ↓
        Can the operation be retried safely?
                ↓
        What happens during partial failure?
                ↓
        Do we need idempotency?
                ↓
        How is the data migrated?
                ↓
        How is it backed up?
                ↓
        Who is authorized to modify it?
                ↓
        How do we observe failures?
                ↓
        What happens at 100x the current load?

The implementation is still necessary.

But the surrounding questions define the engineering problem.


Quality Assurance

Quality Assurance is another area that is frequently misunderstood. QA is not simply:

Find bugs after developers finish working.

That is an extremely limited interpretation.

The purpose of QA is to help determine whether the system behaves according to its expected requirements and quality standards.

Depending on the organization, QA work may include:

  • manual testing;
  • automated testing;
  • integration testing;
  • regression testing;
  • API testing;
  • UI testing;
  • performance testing;
  • compatibility testing;
  • exploratory testing;
  • test planning;
  • release validation;
  • defect analysis.

A strong QA engineer does not only ask:

Does this button work?

They may ask:

  • What happens if the request is repeated?
  • What happens if the network fails halfway through?
  • What happens with malformed input?
  • What happens under concurrent access?
  • What happens after an upgrade?
  • What happens if the dependency is unavailable?
  • What happens on another operating system?
  • What happens when the system receives unexpected data?

Good QA work requires curiosity.

It requires the ability to think about how something can fail rather than only how it is supposed to work.

That ability is extremely valuable.


QA Automation Engineer

As systems become larger, manual testing alone becomes insufficient.

QA Automation Engineers build systems that automatically verify software behavior. Their work may include:

  • test frameworks;
  • automated regression suites;
  • API test systems;
  • browser automation;
  • integration environments;
  • test data generation;
  • load testing;
  • CI integration;
  • failure reporting.

At this point, the separation between development and QA becomes smaller.

A strong automation engineer is also a software engineer.

They write software whose purpose is to test other software.


DevOps

The term DevOps requires some care.

Originally, DevOps describes a set of practices and a culture intended to reduce the separation between software development and software operations.

It is not simply a collection of tools. However, the industry widely uses job titles such as DevOps Engineer.

Therefore, when we discuss the position, we are usually talking about someone working around the boundary between development and operations.

Typical responsibilities may include:

  • CI/CD;
  • build pipelines;
  • deployment automation;
  • infrastructure automation;
  • containers;
  • orchestration;
  • monitoring;
  • logging;
  • secrets management;
  • release processes;
  • environment management.

A DevOps engineer may work with systems such as:

  • Git;
  • CI platforms;
  • Docker;
  • Kubernetes;
  • Terraform;
  • Ansible;
  • monitoring systems;
  • artifact registries;
  • cloud services.

But again, knowing how to write a YAML file does not automatically make someone a DevOps engineer.

The real value comes from understanding the complete path between source code and a running production system.

For example:

        Source Code
            ↓
        Build
            ↓
        Tests
            ↓
        Artifact
            ↓
        Distribution
            ↓
        Deployment
            ↓
        Configuration
            ↓
        Runtime
            ↓
        Monitoring
            ↓
        Failure Detection
            ↓
        Recovery

A good DevOps engineer understands this chain and works to make it reliable, repeatable, observable, and automated.


SysOps

SysOps is more directly focused on operating systems and running infrastructure.

A SysOps engineer may be responsible for:

  • Linux or Windows servers;
  • operating-system configuration;
  • users and permissions;
  • filesystems;
  • networking;
  • services;
  • process management;
  • storage;
  • backups;
  • system monitoring;
  • patching;
  • system security;
  • hardware resources;
  • incident response.

If DevOps is heavily concerned with the path between development and deployment, SysOps is often more concerned with:

What happens after the system is actually running?

A strong SysOps engineer understands what the operating system is doing underneath your application.

That knowledge can become extremely valuable to software engineers as well.

If your application suddenly consumes:

        100% CPU

or:

        64 GB RAM

or starts producing:

        10,000 open sockets

you eventually leave the comfortable world of application code.

You need to understand the machine.


Cloud Engineer

A Cloud Engineer works with infrastructure and services provided through cloud platforms.

Typical areas may include:

  • compute;
  • networking;
  • storage;
  • databases;
  • identity;
  • access management;
  • load balancing;
  • autoscaling;
  • monitoring;
  • infrastructure as code;
  • managed services.

Common cloud platforms include:

  • AWS;
  • Microsoft Azure;
  • Google Cloud Platform;
  • private cloud infrastructure.

Cloud engineering overlaps significantly with:

  • DevOps;
  • SysOps;
  • networking;
  • security;
  • infrastructure engineering.

But there is an important mistake you should avoid.

Cloud engineering is not learning where buttons are located inside a cloud dashboard.

A cloud service is still built on fundamental computing concepts. You should understand:

  • Compute
  • Networking
  • Storage
  • Identity
  • Security
  • Databases
  • Distributed Systems

before thinking that knowing the name of a managed cloud product means understanding the underlying problem.

Products change. Interfaces change. Names change.

Fundamental concepts survive.


Software Architect

Software Architecture is one of the roles that I believe should be approached with particular care.

An Architect is not simply someone who stopped writing code and started drawing boxes.

An architect is expected to understand systems at a much wider level.

That may include:

  • business requirements;
  • technical requirements;
  • system boundaries;
  • communication models;
  • data ownership;
  • scalability;
  • security;
  • reliability;
  • deployment;
  • infrastructure;
  • performance;
  • integration;
  • operational complexity;
  • long-term maintainability.

An architect constantly makes trade-offs. For example:

  • Performance VS Simplicity
  • Consistency VS Availability
  • Development speed VS Long-term maintainability
  • Operational complexity VS System flexibility
  • Cost VS Redundancy

There is rarely a perfect architecture. The architect's job is to strive for the ideal solution.

There are architectures that are appropriate for a particular set of requirements and constraints. That distinction is extremely important.

A system designed for 100 users does not necessarily need the same architecture as a system designed for 100,000,000 users.

And building the second architecture for the first problem can be just as bad as building the first architecture for the second problem.

Architecture requires judgment. Judgment requires experience. And experience requires exposure to both successful and unsuccessful decisions.


An Architect Should Understand Development

Personally, I place very little value on architecture that exists only in diagrams.

If you design systems that other engineers must implement, you should understand what those decisions mean at implementation level.

You should understand the difference between saying:

We will simply introduce a distributed cache here.

and actually dealing with:

  • cache invalidation;
  • consistency;
  • network failures;
  • serialization;
  • memory limits;
  • eviction;
  • monitoring;
  • deployment;
  • failure recovery.

The same applies to databases, queues, microservices, event-driven systems, distributed storage, and almost everything else.

Drawing:

Service A
    ↓
  Queue
    ↓
Service B

takes several seconds.

Making that system reliable in production may take months.

Never confuse the simplicity of a diagram with the complexity of its implementation.


The Roles Overlap

Do not imagine these positions as completely isolated boxes. In reality, they overlap heavily.

A Backend Engineer may understand:

  • Linux;
  • networking;
  • deployment;
  • databases;
  • cloud infrastructure.

A DevOps Engineer may write significant amounts of software.

A SysOps Engineer may automate almost everything with code.

A QA Automation Engineer may build large distributed testing systems.

A Cloud Engineer may need deep networking knowledge.

An Architect may still write production code. The borders are not walls.

A better mental model looks something like this:

                    Software Architecture
                           /     \
                          /       \
                 Software Engineering
                   /             \
                  /               \
          Frontend                Backend
                                    \
                                     \
                                      DevOps
                                     /     \
                                    /       \
                               SysOps       Cloud
                                  \          /
                                   \        /
                                    Platform

                 QA / Automation
                       |
                       |
             interacts with all layers

The exact shape differs between organizations.

The point is that knowledge begins to overlap as your level increases.


Do Not Rush Toward Titles

One of the biggest mistakes you can make early in your career is to chase titles instead of capabilities. Do not think:

How quickly can I become a Senior?

or:

How quickly can I become an Architect?

Ask instead:

  • What can I build independently?
  • What systems do I understand?
  • What kinds of failures have I experienced?
  • What decisions can I make responsibly?
  • How much complexity can I manage?
  • Can other people depend on my technical decisions?
  • Can I explain why a system behaves the way it does?
  • Can I recognize when I do not know enough to make a decision?

A title can be assigned in a day. Capability cannot.

You can put Software Architect into a profile immediately. That does not create ten years of technical depth.


Responsibility Grows With Scope

A useful way to think about technical progression is through the scope of responsibility.

At the beginning, your responsibility may be:

Function

Then:

Module

Then:

Application

Then:

Service

Then:

Multiple Services

Then:

System

And eventually:

Entire Technical Ecosystem

As the scope increases, the nature of the questions changes.

At function level:

Does this code work?

At service level:

Does this service behave correctly?

At system level:

What happens when this service fails?

At architecture level:

Should this service exist in the first place?

That progression is much more meaningful than the title written next to your name.


Choose a Direction, but Do Not Build Walls Around Yourself

At some point, specialization becomes necessary.

You cannot develop every technical field to the same depth.

There simply is not enough time.

You may decide that your primary direction is:

  • backend engineering;
  • frontend engineering;
  • infrastructure;
  • cloud;
  • security;
  • databases;
  • distributed systems;
  • QA automation;
  • architecture.

That is completely normal.

But specialization should not mean ignorance of everything around you.

A strong backend engineer benefits enormously from understanding:

  • operating systems;
  • networking;
  • databases;
  • deployment;
  • infrastructure.

A frontend engineer benefits from understanding:

  • HTTP;
  • APIs;
  • caching;
  • authentication;
  • browser internals;
  • backend constraints.

A DevOps engineer benefits from understanding how software is actually written.

An architect benefits from understanding all of them.

The deeper you progress in one direction, the more useful neighboring knowledge becomes.


Final Perspective

Do not define yourself exclusively by your current job title.

Think about your technical spectrum.

Think about what you understand. Think about what you can build.

Think about what you can diagnose when it breaks. Think about the decisions you are capable of making.

Most importantly, understand the difference between:

  • Knowing that something exists
  • Understanding how it works
  • Being able to design, implement, operate, debug, and improve it yourself
  • Apply it and implement on another place or subject

Those are completely different levels of knowledge.

Your long-term goal should not be to collect as many titles as possible.

Your goal should be to continuously expand the range of problems you are capable of understanding and solving.


Scalionix Docs

Keyboard Shortcuts

Navigate the documentation without leaving the keyboard.
Navigation
Previous subject
←
Next subject
→
Previous subsection
Alt + ↑
Next subsection
Alt + ↓
Interface
Documentation Home
Ctrl + Enter
Search
Alt + Q
Open shortcuts
?
Close dialog
Esc
Scalionix Docs

Search Documentation