What kinds of problems do software engineers solve?
Software engineers solve seven kinds of problems: algorithmic problems, system design problems, defects, performance problems, security problems, user interface problems, and data problems. All seven are forms of one job. A person or a business has a need. The engineer turns that need into a program that works, keeps working under load, and can be changed later without breaking.
That last part is what separates software engineering from writing a script. A script solves today's problem once. An engineered system solves it for millions of users, for years, while a team of people keeps changing it.
The seven kinds of problems
| Kind of problem | The question being answered | Example |
|---|---|---|
| Algorithmic | What steps produce the right answer efficiently? | Find the fastest route between two addresses |
| System design | How do the parts fit together and grow? | Serve a photo feed to 100 million users |
| Defects | Why does the program do the wrong thing? | An app crashes after running for six hours |
| Performance | Why is it slow, and where? | A page takes 4 seconds to load instead of 400 ms |
| Security | How can it be misused, and how do we prevent that? | Stop a stolen password from exposing other accounts |
| User interface | Can people use it without help? | A checkout flow that half of users abandon |
| Data | How is information stored, moved, and kept correct? | A report over 2 billion rows that must finish overnight |
Algorithmic problems
An algorithmic problem asks for a procedure that gives a correct answer within a time and memory budget. Sorting, searching, route finding, and matching are the classic cases. The engineer picks a data structure, such as a hash table or a heap. Then an approach, such as two pointers or dynamic programming, reduces the running time from hours to milliseconds.
Most engineers meet these problems in two places. One is inside real systems. The other is the coding interview, where a candidate has about 45 minutes to solve one.
System design problems
A system design problem asks how to arrange servers, databases, queues, and caches so a product stays fast and available as it grows. The engineer decides where data lives and how requests are spread across machines. The design must also say what happens when one machine fails, and how to add capacity by adding machines rather than by buying a larger one.
A social feed for a few hundred users fits in one database. The same feed for 100 million users needs caches, background workers that build feeds ahead of time, and data split across many machines.
Defects, performance, and security
A defect is a difference between what the program does and what it should do. Debugging is the disciplined search for the cause. Reproduce the failure, narrow it to one module, and read the code and the logs. Then fix the cause rather than the symptom, and add a test so it cannot return. A memory leak that crashes an application after six hours is a typical example.
A performance problem is a defect in speed or cost. The engineer measures first, using a profiler to find the one function or query that consumes most of the time, and fixes that. Guessing is the common mistake; the slow part is rarely where people expect.
A security problem is a way the software can be made to do something its owner did not intend. Engineers prevent it with input validation, authentication, and authorization. Authentication proves who you are; authorization checks what you may do. Encryption in transit and at rest, and regular review of dependencies, complete the list.
User interface and data problems
A user interface problem is a gap between what the software can do and what people manage to do with it. Engineers work with designers, run usability tests, and read analytics such as the share of users who abandon a form. The fix is often removing steps rather than adding features.
A data problem is about storing, moving, and trusting information. It covers designing database tables and writing queries that finish quickly. It also covers keeping copies consistent across machines, and building pipelines that move data from where it is produced to where it is analyzed.
What the role's responsibilities look like day to day
The job title covers all seven kinds, but a normal week is not evenly split. A typical engineer writes new code for part of the week and reviews teammates' code. They fix defects reported by users or by monitoring, and attend planning meetings with product managers. They write tests and documentation. On some teams they also take part in an on-call rotation for production problems. Senior engineers spend more time on design and review and less on writing code themselves.
How software engineers solve a problem
Whatever the kind, the method is the same. First, restate the problem in your own words and confirm it with the person who raised it. Second, collect the constraints: how many users, how much data, how fast, what budget. Third, break the problem into parts that can be solved and tested alone. Fourth, choose the simplest approach that meets the constraints. Fifth, build the smallest version that works, test it, measure it against the constraints, and repeat.
The step people skip is the first one. Engineers who start coding before they can state the problem in one sentence usually solve a different problem than the one they were given.
How to Prepare
- Algorithmic problems are the ones tested in coding interviews. Grokking the Coding Interview teaches the recurring patterns behind them, so you recognize a problem type instead of starting from nothing.
- The data structures those patterns use are covered in Grokking Data Structures for Coding Interviews.
- For the system design kind, start with the building blocks in Grokking System Design Fundamentals.
- Then work through full designs in Grokking the System Design Interview.
- To practice the problem-solving method under time pressure with feedback, book a session at Mock Interviews.

GET YOUR FREE
Coding Questions Catalog

$99

$197

$72