# Middle C++

## Who is it?

It's a developer that understands the technical context of development and has abilities to create a design and a solution for functionality that is a part of an application or component. The design also can be created even in case of an insufficient amount of requirements. This person also has a commercial experience background and is familiar with common business processes of development.

In general, the middle developer solves technical tasks. In comparison with a Junior, this person can do work without any help or minor assistance from a Senior/Lead engineer.


## What coding abilities are expected?

- A compiler and a programming language is not a "magic box" anymore. Any obstacles or surprises can be solved by generating hypothesis, validation, and confirmation/rejection.
- Understands foundation concepts of C++, knows about other languages, and can compare them with each other
- Writes readable, extendable, and maintainable code 
- Knows design patterns and principles, can make technical decisions
- Understands the technical context of the language: e.g. how the code is compiled, knows the tools that help to maintain a code lifecycle:
    - Code writing (IDE, text editors, code quality, best practices, etc.)
    - Source code and product storage (version system control, package managers, servers, etc.)
    - Compilation (compilers, build systems, libraries)
    - Testing (frameworks, testing strategies)
    - Shipment/Deployment
    - Execution on a target system,
- Has more knowledge on Computer Science foundations (data structures, graphs, finite machines, algorithms)


## What general skills are expected?

- Can personally make decisions based on technical knowledge/background of a project
- Understands when a solution is "good enough" to prevent overengineering
- Has a team player mindset
- Can formulate and share an opinion with other teammates
- Has experience of work with different methodologies: Kanban, Agile/Scrum, Waterfall, etc.
- Helps other teammates


## Tips and recommendations

### Studying

- It's time to improve soft skills if you want to become a Senior developer. Technical expertise goes a bit behind and an ability to build dialogs and find compromises with others go first. A good developer is not the one who writes a lot of code but the one who understands how to solve a problem efficiently with minimal loses. It is better if you can solve a problem without any new code. It is ideal if you can even remove tens/hundreds lines of code.
- The middle role is most difficult for studying. You need to think not only about hard skills but also about soft skills and business-problem solving. It means you're asked to concentrate on both aspects simultaneously either about hard skills or soft skills.
- Good attention to soft-skills increases the probability to become a high-demand professional on the marker. You can try to grow as a highly specialized developer and ignore soft skills, but first - this kind of specialists are not often needed in business problems, second - competition among such kinds of developers is extremely high. If you're ready to compete with the best specialists on the market then don't listen to us and bravely go forward, but we still recommend thinking about skills diversity.

### Experience

- The main trap of many middle developers: they're "fanboys" of technologies, frameworks, design patterns, or methodologies. Try to be more pragmatic while solving tasks on your project. Don't try to intake all the newest ideas only to play with them or get "yet another skill" to your CV. The Middle role is a "pandora box" of overengineering or "diving" around frameworks.
- If you really think a library/framework is needed for a project - discuss it with a Senior or Lead engineer first. Propose them to create a "proof of concept" where you will be able to check all hypotheses in action before intake a new dependency. Please, don't try to do it in secret from your team! It's fun for you, but it's a "disaster" for your team in the future. It increases maintenance costs and might bring unforeseen consequences.