# :sunglasses: Middle C++

## :question: Who is it?

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

In general, the middle developer solves technical tasks, and compared to a Junior, this person can complete work without help or with minimal assistance from a Senior/Lead engineer.


## :computer: What coding abilities are expected?

- Does not see a compiler and a programming language as a "magic box" anymore; able to solve any obstacles or surprises by generating hypotheses, validating them, and confirming or rejecting them.
- Has a deep understanding of the foundation concepts of C++ and knowledge of other programming languages, able to compare them.
- Writes readable, extendable, and maintainable code.
- Familiar with design patterns and principles and able to make technical decisions.
- Has a clear understanding of the technical context of C++, including:
    - the code writing process (such as using IDEs, text editors, and following best practices)
    - source code and product storage (such as using version control systems and package managers)
    - compilation (compilers, build systems, and libraries)
    - testing (testing frameworks and strategies)
    - shipment/deployment and execution on a target system.
- Has a strong knowledge of computer science foundations, including data structures, graphs, finite machines, and algorithms.


## :bust_in_silhouette: What general skills are expected?

- Is able to make decisions based on personal technical knowledge and background of a project
- Understands the concept of "good enough" solutions to prevent overengineering
- Has a mindset of being a team player
- Can articulate and share opinions with other team members
- Has experience working with various methodologies such as Kanban, Agile/Scrum, Waterfall, etc.
- Is willing to assist and support other team members.


## :eyes: Tips and recommendations

### :arrow_forward: Studying

- Improving soft skills is crucial if you want to become a senior developer. Technical expertise takes a backseat and the ability to build relationships and find compromises with others becomes more important. A good developer is not someone who writes a lot of code, but rather, someone who knows how to solve a problem efficiently with minimal losses. Ideally, you should be able to solve a problem without writing any new code or even remove tens or hundreds of lines of code.
- The middle role is the most challenging to master. You have to focus on both hard skills and soft skills and business problem-solving. This means you need to concentrate on both aspects at the same time.
- Paying attention to soft skills increases your chances of becoming a highly sought-after professional in the market. You can choose to focus on becoming a highly specialized developer and ignore soft skills, but keep in mind that such specialists are not always in high demand and the competition among them is extremely high. If you're ready to compete with the best specialists in the market, then by all means, go ahead. However, we still recommend considering diversifying your skills.

### :arrow_forward: Experience

- Many middle developers fall into the trap of becoming "fanboys" of technologies, frameworks, design patterns, or methodologies. It's important to be more pragmatic while solving tasks on your project and not just try to adopt the latest ideas for the sake of adding another skill to your resume. The middle role can lead to overengineering or constantly changing frameworks.
- If you believe that a library or framework is necessary for a project, it's best to discuss it with a Senior or Lead engineer first. Propose creating a "proof of concept" where you can test all of your hypotheses before adding a new dependency. Don't try to do this behind your team's back, as it could result in increased maintenance costs and unforeseen consequences.

---

[**Go back**](Overview.md) | [**To main page**](../../README.md)