> For the complete documentation index, see [llms.txt](https://guide.ivanzakutnii.com/the-hard-way-to-swe-excellence/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://guide.ivanzakutnii.com/the-hard-way-to-swe-excellence/basic-understanding/what-exactly-is-a-programmers-job.md).

# What exactly is a programmer's job?

Writing code is only one part of software engineering. A professional engineer gradually learns to do all of these things:

1. **Use one programming language fluently.** Learn its type and data model, control flow, functions, modules, error handling, tooling, and standard library. Do not change languages every week. Your first goal is to learn programming through one language, not to collect syntax.
2. **Read and write maintainable code.** Working code is the starting point. Other people, including your future self, must be able to understand, test, and change it safely.
3. **Understand several programming paradigms.** Learn imperative, object-oriented, and functional ideas. Practise composition and learn why a design fits one problem better than another. No single paradigm is mandatory everywhere.
4. **Understand algorithms, data structures, and complexity.** You will not hand-write every structure at work, but you must recognize the cost and behaviour of the structures underneath your program.
5. **Develop a specialization without becoming blind outside it.** You may focus on web, mobile, data, systems, games, or another field, while keeping enough breadth to understand the systems around your part.
6. **Learn one application stack deeply.** Eventually, choose a framework and the surrounding tools needed to build, test, package, and run a complete application.
7. **Understand data and databases.** Start with relational modelling, SQL, constraints, indexes, and transactions. Learn other storage models when a real requirement makes their trade-offs relevant.
8. **Know operating-system, networking, and cloud basics.** Processes, files, permissions, HTTP, DNS, containers, and hosted services all affect how software behaves outside your editor.
9. **Use version control.** Learn Git well enough to inspect history, work on a branch, review a diff, resolve a conflict, and recover from a mistake.
10. **Build, deploy, and operate software.** Understand dependencies, configuration, secrets, CI/CD, logs, metrics, and the basic path from a local program to a running service.
11. **Test behaviour at several levels.** Unit, integration, API, and end-to-end tests answer different questions. Learn what each test demonstrates and what it leaves unproven.
12. **Debug systematically.** Reproduce the problem, gather evidence, narrow the possible causes, test a hypothesis, and verify the repair.
13. **Collaborate around changing software.** Learn to clarify requirements, make small changes, review code, explain decisions, and work with an issue tracker and an iterative delivery process.
14. **Use AI without surrendering understanding.** Frame the task, inspect generated code and tests, verify the behaviour, and be able to explain what changed and why.

This list is large because the profession is large. It is a map, not a checklist you must complete before writing your first useful program.

> This guide does not cover every item in depth. It concentrates on the foundation that makes the rest easier to learn.

The key point is to start with the basics. That is exactly what this path does: it helps you build the core of a software engineer before you specialize in applied tools.
