Astra Trainer
Future Industries

Fundamentals Are What You Reach For When the Tool Fails

Aleksandr Mikhailov
Founder, Astra Trainer
Updated
9 min read

Every few years the tools change completely, and every few years the same small set of ideas turns out to explain what went wrong.

The half life problem

Technical knowledge does not decay at a uniform rate, and the difference is the most useful thing an organisation can understand about training its engineers.

Framework and library knowledge decays fast. A version-specific technique learned today is frequently obsolete within a few years, sometimes sooner. Platform and vendor knowledge decays almost as fast, and the specific commands and interfaces change constantly.

Underneath that sits a layer that has barely moved. How a computer executes instructions. What a data structure costs. Why some algorithms scale and others do not. What an operating system does with memory and with waiting. How networks actually deliver a message.

Training people only on the fast-decaying layer means retraining them every three years, permanently.

This is not an argument against practical training. It is an argument about proportion. Most corporate technical development spends heavily on the layer with the shortest life and almost nothing on the layer that makes the next tool learnable in a week rather than a quarter.

What the direction covers

The scope: algorithms, data structures, operating systems, networks and computation.

Four areas.

Algorithms and data structures. What operations cost, which structure fits which access pattern, and how to reason about scale.

Systems. Processes, memory, scheduling, files and the abstractions that hide the hardware.

Networks. How data moves, what can go wrong, and why distributed systems are difficult in a specific way.

Theory of computation. What is computable, what is tractable, and where the hard limits are.

Complexity, which is the one idea that pays for itself

If an organisation teaches only one concept from this direction, it should be this one.

Algorithmic complexity describes how the work an algorithm does grows as the input grows. The distinction is not academic. It is the difference between code that works in testing and fails in production.

Three practical consequences.

Test data hides the problem. An algorithm whose work grows with the square of the input looks fine on a thousand records and becomes unusable on a million. The failure is not a bug that appears later. It was present from the first line and was invisible at test scale.

The nested loop over a database is the most common expensive mistake in commercial software. A query inside a loop, where each iteration makes its own round trip, performs acceptably with a few items and collapses under real volume. This pattern appears constantly, in every language, written by people with years of experience, because nobody showed them how to see it.

Choosing the right structure is usually a bigger win than optimising the code. Looking something up in a list means examining every element. Looking it up in a hash table is effectively immediate regardless of size. Changing one line beats rewriting a hundred.

None of this requires mathematical sophistication. It requires the habit of asking what happens when this gets ten times bigger, and that habit can be taught quickly to people who already write software.

What the operating system is actually doing

The layer most working developers treat as invisible, and where a surprising share of production problems originate.

Memory. How allocation works, what garbage collection costs and when it pauses, why memory locality affects speed far more than instruction count, and what actually happens when a process exhausts available memory. Memory issues are among the hardest production faults to diagnose without this picture.

Processes and threads. What isolation means, what a context switch costs, and why adding threads past a certain point makes a system slower rather than faster.

Input and output. The reason most applications are waiting rather than computing. Disk and network operations are orders of magnitude slower than memory access, which is why asynchronous and non-blocking approaches exist. Engineers who have not internalised this optimise computation in programs that spend their lives waiting.

Concurrency. Race conditions, deadlocks and the fact that operations which look atomic in source code are not. This is the category of bug that passes every test and fails in production under load, and it cannot be reasoned about without the model.

Where this sits in the domain

Computer science is the first of eight directions in Astra Trainer's AI, data and computing domain, and it sits underneath the rest of them. Software engineering, data science, cloud and DevOps, cybersecurity and machine learning all rest on the same computational ideas, and people who hold them learn each new layer faster.

It connects most directly to software engineering, which is this material applied under commercial constraint, and to IT systems and computer networks, where the operating system and network layers are the daily work. You can see the eight directions here.

Why this matters more now, not less

The common assumption is that code generation tools make fundamentals obsolete. The opposite argument is stronger, and it rests on what the job becomes.

The work shifts from writing to judging. Reviewing code you did not write, and deciding whether it is correct, requires more understanding than producing it, not less. A plausible-looking function with the wrong complexity characteristics is exactly the kind of thing that passes casual review and fails at scale.

Generated code is confident about performance in a way it cannot justify. It does not know your data volumes, your access patterns or your latency budget. Someone has to.

Debugging remains the hard part. When a system behaves unexpectedly in production, the question is what is actually happening, and that is answered from a model of how the machine works.

Architectural decisions are not autocompleted. Choosing between consistency and availability, deciding what to cache, judging where to put a boundary: these are the decisions that determine whether a system survives, and they are all fundamentals questions.

The honest formulation is that these tools raise the floor on producing code and raise the value of being able to evaluate it. Organisations that read the first half and not the second will find out which they had.

The roles, named

Software engineers at every level, since this is the substrate.

Systems engineers and systems programmers.

Performance engineers, a distinct specialism and persistently scarce.

Distributed systems engineers.

Compiler and runtime engineers.

Database engineers, where data structures and storage meet.

Security researchers, whose work depends on understanding what the machine really does rather than what the source says.

Technical architects, making the decisions this material informs.

Research engineers in machine learning systems, where efficiency at scale is the whole problem.

Who can be trained into it

Self-taught developers and bootcamp graduates. The largest and most rewarding group. They frequently have strong practical skill, good tooling habits and real delivery experience, with a specific gap here. Filling it is a defined piece of work rather than a general upskilling programme, and the effect on their ceiling is large.

Data analysts and scientists. Into performance and scale, where queries and pipelines that work on samples fail on full data for exactly these reasons.

IT and systems administrators. Already holding operating system and network knowledge from the operational side, needing the programming layer.

Engineers from other disciplines. Mathematics, physics and engineering graduates convert well, since the reasoning style transfers.

Quality assurance and test engineers. Into engineering roles, holding a strong sense of how things fail.

Support engineers. Into development, with real knowledge of what breaks in production and why.

On fundamentals and hiring. Algorithmic interviews are widely used and widely criticised as a hiring filter, and performance in them correlates imperfectly with performance on the job. This direction exists to make people better at building and diagnosing systems, not to optimise for an interview format. Organisations using this material should be clear about which of those two things they are doing, because the training that serves one does not necessarily serve the other.

What to take from this

Technical knowledge decays at different rates, and most training budgets are spent on the fastest-decaying layer.

Complexity is the highest-value single concept, because it predicts failure at scale before the code is written.

Most production performance problems are memory, waiting or concurrency problems, and all three live in the operating system layer that most developers treat as invisible.

Code generation raises the value of judgement, and judgement here means fundamentals.

And the people who benefit most are already writing software for you, with a gap that is specific, visible and quick to close.

Frequently asked questions
Why teach fundamentals rather than current frameworks?

Because framework knowledge decays within a few years while the underlying computational ideas have held for decades, and people who hold the fundamentals learn each new framework in a fraction of the time.

What is the most useful single concept?

Algorithmic complexity. It explains why code that passes testing fails at production volume, why a query inside a loop collapses under real data, and why choosing the right data structure usually beats optimising the code.

Why do operating system concepts matter to application developers?

Because most production performance problems are memory, input and output, or concurrency problems. Applications typically spend their time waiting rather than computing, and optimising computation in a program that waits achieves nothing.

Do code generation tools make fundamentals less important?

They make them more important. The work shifts from writing code to judging code you did not write, and generated code cannot know your data volumes, access patterns or latency budget.

Who gains most from this training?

Self-taught developers and bootcamp graduates, who often have strong practical skill and a specific teachable gap here, followed by data analysts hitting scale problems and systems administrators moving into development.

Train the layer that does not expire
Eight directions across AI, data and computing, including computer science alongside software engineering, machine learning, data science and cybersecurity. Scoped with your own teams, in five-minute lessons.
Written by Aleksandr Mikhailov
Founder, Astra Trainer · Published · Updated
Continue reading