# :sunglasses: Middle C++

## :question: Кто это?

Это разработчик, который понимает технический контекст разработки и способен создать дизайн/решение для функционала в рамках компонента/приложения, даже в случае неполноты требований. Также имеет практический опыт работы на проектах, в рамках принятых бизнес-процессов.

В основном решает технические задачи, но в отличие от джуниора, способен сделать это самостоятельно или под менторством синьора/тимлида.

## :computer: Что ожидается по умению написания кода?

- Компилятор и язык его больше не пугают и практически не приносят сюрпризов. А если и приносят, то способен самостоятельно генерировать гипотезы, проверять их и копать вглубь
- Ориентируется в базовых концепциях языка, а также понимает, какие ещё языки программирования существуют, и чем они отличаются
- Пишет понятный и поддерживаемый код
- Знает базовые принципы дизайна, на их основе способен принять техническое решение
- Владеет языком программирования, а также контекстом его использования: весь технический цикл, через который проходит код 
- Также ориентируется в инструментах, которые помогают поддерживать цикл разработки кода в проекте:
    - Написание кода (IDE, текстовые редакторы, практики программирования, качество кода)
    - Хранение исходного кода и продуктов (системы контроля версий, пакетные менеджеры, серверы)
    - Компиляция (компиляторы, системы сборки, библиотеки)
    - Тестирование (фреймворки, стратегии тестирования)
    - Доставка
    - Выполнение на целевой системе
- Глубже знает и понимает базовую информатику (структуры данных, конечные автоматы, алгоритмы)

## :bust_in_silhouette: Что ожидается по общим навыкам?

- Способен самостоятельно ориентироваться в технической части проекта и принимать решения, которые вписываются в него
- Понимает, когда нужно остановиться, чтобы не переусложнить решение
- Имеет практический опыт работы в команде
- Способен формулировать и доносить идеи и мысли до других членов команды
- Имеет практический опыт работы по различным методологиям: Kanban, Agile/Scrum, Waterfall и т.д.
- Помогает другим членам команды

## :eyes: Рекомендации и советы

### :arrow_forward: Про обучение
- Начинайте прокачивать софт-скиллы, если хотите вырасти до синьора. На синьорском уровне техническая экспертиза часто отходит на второй план, а на первый план выходит умение вести диалог и договариваться. Хороший разработчик, не тот кто пишет много кода, а тот кто понимает, как решить проблему максимально просто и эффективно. В идеале - без написания нового кода, а ещё лучше - если будут удалены пара десятков/сотен строк.
- Стадия миддла самая энергозатратная с точки зрения обучения. От вас требуется не только прокачивать технические скиллы, но также навыки коммуникации и погружение в проблемы бизнеса. Это значит, что вам требуется одновременно развиваться в нескольких направлениях. Уделяйте внимание в равной степени как "хард", так и "софт" скиллам.
- Должное внимание "софт" скиллам повышает вероятность того, что вы быстрее станете более востребованным профессионалом на рынке. Вы можете попытаться стать узконаправленным техническим специалистом и игнорировать коммуникативные навыки, но, во-первых, компаниям нечасто нужны узкопрофильные эксперты в больших количествах, а во-вторых, вам придется конкурировать с лучшими из лучших. Если вы действительно готовы состязаться с лучшими специалистами на рынке, то смело идите вперед, но все же рекомендуем подумать о диверсификации своих навыков.


### :arrow_forward: Про опыт
- Основная ловушка многих мидлов: фанбойство по технологиям, фреймворкам, внедрением паттернов или подходам к разработке. Постарайтесь прагматично подходить к выполнению задач на проекте. Не нужно пытаться затянуть все последние новинки, только чтобы поиграться с ними или ради строчки в резюме. На этом этапе очень велик соблазн проявить свое мастерство через обилие используемых технологий или оверинжиниринг.
- Если вы действительно считаете, что проекту нужна новая библиотека или фреймворк - обсудите это с синьором/тимлидом. Предложите им попробовать создать прототип, где сможете проверить их в действии прежде чем втягивать в проект. Пожалуйста, никогда не добавляйте их за спиной всей команды! Это станет головной болью в будущем, т.к. это повысит стоимость поддержки проекта, и принесёт неожиданные проблемы.

---

[**На предыдущую страницу**](Overview.md) | [**На главную страницу**](../README.md)
