1 | Матрица компетенций Fullstack JS разработчика | |
---|---|---|
2 | Авторство: проект https://javascript.ninja | |
3 | Поддержать нас на Patreon | |
4 | Telegram-группа | |
5 | Telegram-канал | |
6 | Youtube-канал | |
7 | ||
8 | О матрице | |
9 | Эта матрица - субъективная точка зрения на развитие JavaScript-разработчика, основанная на 13 годах работы в индустрии, и 5-летнего руководства собственной аутсорсинговой компанией. Как и любая матрица - она субъективна. Некоторые ее аспекты не применимы, если вы специализируетесь только на backend либо frontend разработке, некоторые - если вы работаете в продукте | |
10 | ||
11 | В матрице сознательно не используются ранги "джун - миддл - сеньйор" - реалии современного аутсорса показывают полное вырождение этих тайтлов как уровня компетенции разработчика | |
12 | ||
13 | Также, хочу обратить внимание, что уровень "Гуру" почти везде - это то, что любят называть T-shaped expert - человек, который одновременно владеет несколькими областями: программист + DevOps, программист + педагог и так далее | |
14 | ||
15 | Классически для этих матриц невозможно считать "закрытым" более высокий уровень, если вы не соответствуете предыдущему | |
16 | Если фраза про "Татуировки" вам не понятна - советую ознакомиться с книгой "45 татуировок менеджера" Максима Батырева. Она будет Вам полезна, даже если вы не имеете отношения к менеджменту | |
17 | Сама матрица на следующем листе :) | |
18 | Ссылка на google-docs версию для распечатки и так далее |
1 | Кодер | Программист | Инженер | Гуру | |
---|---|---|---|---|---|
2 | Технологии вокруг JS | ||||
3 | HTML | Владеет современной версткой и наиболее распространенными API | В курсе цикла reflow / repaint. Использует HTML5 теги для максимально семантической верстки. Грамотно использует HTML5 API в том числе для graceful degradation / progressive enhancement. Владеет микроформатами / микроразметкой | Следит за новыми тенденцияи в мире HTML (пример - web-компоненты). Применяет их или не применяет на проекте в зависимости от бизнес-ценности решений | Гуру вёрстки (вы поймете, если вы встречали таких). Знает особенности функционирования HTML5 API в разных браузерах при различных условиях. |
4 | CSS | Стандартный CSS3 | Знает нестандартные (неочевидные) CSS-трюки | Следит за развитием CSS и can-i-use. Дотошно уделяет время поддержке CSS в проектах в поддерживаемом состоянии (да здравствует тавтология!). Имеет свое мнение про CSS-in-JS и почему его (не)стоит использовать в конкретных проектах | Досконально знает нюансы отрисовки сущностей в разных браузерах. Пишет идеальный CSS, который понятен команде и покрывает все потребности проекта |
5 | JavaScript | Владеет основными конструкциями языка, базовыми концепциями (а-ля замыкание и т.п.) | Умеет писать понятный и гибкий код. Избегает использования "хаков" и "особенностей" языка без необходимости. | Понимает особенности выполнения JavaScript на разных движках и на разных устройствах. Следит за ТС39 и развитием языка, имеет своё мнение по поводу будущих улучшений и их целесообразности | Принимает активное участие в разработке одного из основных JavaScript-движков |
6 | Типизация | Не задумывается о типизации кода | Способен писать код с типами (система типизации не важна). Понимает точки кода, где необходима runtime-типизация | Думает о типах как об эффективном инструменте описания доменной области. Ставит типы в основу процесса проектирования, даже если не использует системы статической типизации | Использует все выразительные возможности системы типизации, знает ее слабые места, использует кодогенерацию для обхода слаботипизируемых мест, перепроектирует код так, что максимальное количество кода покрывается минимальными возможностями системы типизации. Типы составляют неотъемлимую часть контракта системы |
7 | Основы системного программирования | Не интересуется системным программированием | Отличает компилятор от линковщика, а интерпретатор от компилятора. Способен выяснить причину ошибки компиляции очередного node_modules и устранить ее | Способен читать ассемблерный код (в том числе и сгенерированный v8) | Способен написать (или писал) собственные модули ядра или низкоуровневые утилиты для решения сложных задач |
8 | Фреймворки | Способен решать типичные задачи в рамках "любимого" фреймворка. Хорошо понимает, что где и как писать | Способен реализовывать сложные решения, выходящие за рамки типичных задач и выбирать составляющие стека в зависимости от поставленной задачи. Максимально использует возможности предоставляемые фреймворками для того, чтобы не изобретать велосипед. Осознает слабые места фреймворка и пишет код, чтобы минимизировать их негативное влияние | Понимает внутреннюю организацию фреймворка. Способен писать код максимально эффективно использующий особенности внутренней реализации. Знает слабо-документированные или неочевидные возможности фреймворка, способен предсказывать ошибки глядя на код до запуска :) | Способен расширять фреймворк на уровне "ядра" под нестандартные задачи (пример - изменение алгоритма reconciler в React для оптимизации вывода "видео-блоков" в "видео-облаке"). |
9 | "Вражеские технологии" | Считает выбранный стек "самым лучшим". Негативно относится к "писакам" на другом языке | Способен объективно изложить сильные стороны "вражеских технологий" | Активно заимствует эффективные решения отовсюду, где только можно | Имеет коммерческий опыт в каждой технологии, которую агрессивно критикует. Регулярно экспериментирует с "вражескими" технологиями, для того, чтобы быть "в теме" и максимально эффективно реализовывать свою работу |
10 | Computer Science и смежные вещи | ||||
11 | Алгоритмы и структуры данных | Знает о существовании рекурсии, пузырьковой сортировке и быстрой сортировке. | Знает о существовании О-большого, знает оценки сложности большинства "классических" алгоритмов для "классических" структур данных (список, массив и т.д. вплоть до AWL-деревьев), способен реализовать эти алгоритмы, имея описание с листа | Способен доказать оценки сложности по времени и по памяти для незнакомых алгоритмов. Способен оптимально подбирать структуру данных для решения поставленной задачи. Умеет оптимизировать алгоритмы в рамках заданных условий (в том числе и поиск приближенных решений) | Понимает взвешенные матроиды и прочие ужасы для строгой математической оценки не только максимальных и средних оценок по времени-памяти, но и для оценки метрик "95% должны укладываться в Х мс" |
12 | Паттерны проектирования | Владеет базовыми паттернами проектирования: Observer, Singleton, Event bus, Factory и т.д. | Осознанно или неосознанно владеет большинством актуальных паттернов проектирования из "Банды четырех" | Способен в рамках ревью существующего кода или код-ревью выделить неявные шаблоны проектирования, сделать их явными и донести свет паттернов проектирования до автора кода | Видит "Матрицу" - практически любую задачу способен эффективно декомпозировать на подзадачи в рамках общеизвестных паттернов проектирования |
13 | ООП | Знает "три кита" ООП и способен их увидеть в коде | Знает принципы SOLID и их практикует | Уважает Domain Driven Design и проектирует системы с учетом реального мира. Знает слабые места ООП и обходит их | Совмещает ООП и функциональный стиль так, что это приводит к максимально понятному и поддерживаемому коду |
14 | Функциональное программирование | Знает что такое "чистые функции". Пользуется map/filter/reduce. Втайне не уважает тех кто обходит массивы for'ом | Понимает Observable's и прочие потоки и эффективно их использует | Знает что такое "монады". Умеет писать в функциональном стиле места, которые эффективно выражаются в функциональном стиле | Совмещает ООП и функциональный стиль так, что это приводит к максимально понятному и поддерживаемому коду |
15 | Архитектура | Мыслит об архитектуре приложения на уровне текушего файла/модуля | Планирует архитектуру приложения на основании best practices, принятых в программировании. Способен заложить грамотную архитектуру проекта | Разрабатывает архитектуру приложения на основании бизнес-потребностей, имеющихся ресурсов, потенциала масштабирования и (про что забывают) технических навыков, возможностей и экспертизы команды, которая будет разрабатывать проект | Имеет практический опыт решения проблем в тех или иных архитектурах. Проектирует максимально просто, но не проще, чем необходимо бизнесу |
16 | IT-навыки | ||||
17 | Continuous Integration | Является "потребителем" средств Continuous Integration. Способен писать код, который не только "у меня всё работает", но и проходит тесты на CI | Понимает принципы CI, способен разобраться в проблемах с билдом на CI | Способен с нуля поднять сложный CI на существующем проекте. Знает слабые места CI-процессов и как их обойти. | Разрабатывает новые инструменты continous integration, направленные на решения конкретных болей компании и проекта |
18 | Deployment | Способен завернуть имеющийся проект в Docker-контейнер и запустить его | Владеет принципами построения 12-факторных приложений. Способен реализовать структуру из нескольких контейнеров (docker-compose) и эффективно поддерживать несколько рабочих окружений | Владеет на минимальном уровне системами управлениями конфигурациями (Chef, Ansible). Понимает и имеет опыт управления с Kubernetes или схожими системами, способен решать задачи zero-time deployment и писать код с учетом подобных потребностей | Способен выполнять все функции DevOps, включая развертывание, поддержку и масштабирование сложных кластеров |
19 | Контроль версий | Знает стандартный git flow | Умеет использовать git для обеспечения максимальной выразительности истории: интерактивный rebase, partial commits, etc. | Владеет продвинутыми возможностями: git rerere, worktree и т.п. Применяет их в повседневной деяельности во благо проекта | Понимает как организовано хранение объектов в git, включая git-lfs. Способен восстановить почти безнадежно поврежденное дерево, иногда - самописными скриптами |
20 | ОС | Знает ОС на уровне уверенного пользователя. Способен переустановить свою рабочую систему и решать типичные задачи в ней | Понимает как устроен процесс загрузки ОС, инициализации сервисов. Понимает принципы загрузки системных библиотек в память, способен вносить изменения в работающую систему и, в случае чего, восстанавливать систему после сбоев без переустановки. | Понимает архитектуру ОС (к примеру для linux: понимает как работает systemd на всех уровнях). Использует возможности ОС для реализации задач, которые выходят за рамки основной функциональности приложения (к примеру изоляци окружения, управление скоростью передачи данных и т.д.) | Владеет пониманием ОС на глубоком уровне. Понимает особенности работы ядра и конкретных системных вызовов на конкретном железе. Способен осуществлять глубокую отладку проблем, вплоть до использования инструментов профилирования системных вызовов в ядре и отладки самого ядра |
21 | Сетевые протоколы | Способен рассказать "Что происходит когда вы в браузере набираете www.google.com". Понимает, как работает TCP/IP, UDP, WebSockets но не более того | Понимает всю модель OSI. Умеет пользоваться инструментами (wireshark), способен (к примеру) осуществить перехват и отладку шифрованного HTTPS-cоединения | Знает слабые места существующих протоколов и сталкивался с ними. Понимает природу задержек при передаче данных на всех уровнях (от загрузки данных в сетевую карту до особенностей задержек маршрутизации пакетов). Способен, к примеру, написать свой парсер протокола для wireshark или использовать другие, более извращенные способы отладки | Понимает специфику обработки пакетов на всех уровнях, включая аппаратный. Способен оптимизировать конфигурации ОС + окружение + продукт для достижения оптимальной производительности сетевого стека на всех трех уровнях |
22 | Базы данных | Отличает MySQL от MongoDB. Способен написать запрос с джойнами или вложенными селектами. Знает что такое 3 нормальная форма БД не только во время собеседования | Владеет профилировщиком запросов. Понимает когда стоит использовать реляционные, когда документо-ориентированные базы данных. Знает, когда необходимо отступать от нормальных форм | Имеет опыт с экзотическими базами данных - экзотическими конфигурациями либо экзотическими движками. Хоть раз утыкался в ограничения движка и героически их разгребал. Способен писать эффективные запросы и быстро выявлять неэффективные. Способен указать наиболее проблемные места при будущем масштабировании | Имеет практический опыт во всех "направлениях" баз данных. Имеет практический опыт горизонтального и вертикального масштабирования, восстановления данных, знает специфику storage engines, особенности работы профилировщиков запросов и т.д. |
23 | Инструменты | Знает и использует наиболее популярные инструменты (webpack, babel, etc.). Способен вносить незначительные изменения в конфигурацию | Способен полноценно конфигурировать сопутствующие инструменты (пример - конфиг webpack для dev+prod+ssr+hmr). Знает об альтернативных инструментах. Способен выбирать инструмент под конкретную задачу | Способен расширять существующие инструменты (собственные webpack и babel-nлагины, к примеру). Разрабатывает инструменты для решения задач в рамках существующего проекта и для бизнес-потребностей | Разрабатывает инструменты, которые используются не только во внутренних процессах команды, но и значительно - за ее пределами. |
24 | Платформа | Занимается разработкой только приложения | Понимает, на какой "платформе" выполняется приложение (начиная от nginx/lighttpd фронтом для node.js приложения и заканчивая использованием Cloudflare для фронта). Знает об особенностях платформы | Способен осуществлять аналитику имеющейся платформы, вносить предложения по ее улучшения и претворять эти улучшения в жизнь | Глубоко погружен в нюансы работы конкретной платформы. Продвигает в нее улучшения (как направленные на конкретный проект, так и в публичном домене) |
25 | "Татуировки" Fullstack-разработчика | ||||
26 | Логирование | Пишет логи с помощью console.log или в файл | Понимает зачем нужны инструменты централизованного логирования. Пишет системы с учетом возможности динамического изменения уровня логов с целью изучения проблемы "на живую" в продакшне. | Относится к логированию как к фундаментальному инструменту ретроспективного анализа. Аккуратно проставляет уровни логирования, четко структурирует логи, маркирует логи так, что возможно проследить историю, допустим, конкретного запроса через череду микросервисов | Пишет инструменты для вычленения паттернов из логов (иногда с помощью машинного обучения и прочих модных слов). Строит поверх "сырых" логов более высокоуровневые системы мониторинга и раннего оповещения |
27 | Кеширование | Не задумывается о кешировании. При необходимости использует наивные кеши в памяти/redis | Понимает что шутка про две проблемы в программировании - совсем не шутка. Задумывается о стратегиях инвалидации кеша, понимает принципы eventual consistency | Способен внедрить стратегию кеширования в проект с нуля. Способен реализовывать кеширование в сложных масштабированных системах (в том числе географически масштабированных, в том числе и отказоустойчивых). Знает особенности функционирования тех технологий кеширования, что применяются в продакшне конкретного проекта | Понимает кеши всех уровней (начиная от L1 и заканчивая внешними кешами в сервисах). Умеет выявлять проблемы, связанные с кешированием и оптимизировать структуру для достижения максимальной производительности |
28 | Отказоустойчивость | Не задумывается об отказоустойчивости приложений | Использует pm2 и/или docker или еще что-либо для реализации "отказоустойчивости". Знает про транзакции и что все операции с деньгами надо выполнять в них. | Понимает отказы в каких элементах системы приводят к максимальным рискам для бизнеса и разрабатывает стратегию отказоустойчивости исходя из этого понимания. | В курсе современных трендов отказоустойчивости. Знает существующие сценарии отказа используемых систем (пример MongoDB) в реальных проектах и владеет стратегиями защиты от подобных отказов. Воспринимает отказоустойчивость как свойство всей системы, а не конкретного программного продукта |
29 | Масштабирование | Не задумывается о масштабировании приложений | Знает что такое горизонтальное масштабирование. Способен писать код, с учетом подобных сценариев | В курсе вертикального и горизонтального масштабирования. Имеет практический опыт в построении сложных масштабируемых систем | Способен внедрить масштабирование в существующий сложный проект (начиная от изменений в коде и заканчивая DevOps-задачами, при этом не обязательно все выполнять самостоятельно). Понимает ограничения масштабирования, риски при этом возникающие и метрики, которые необходимо отслеживать |
30 | Производительность | Точно знает, что быстрее - for или .forEach. Пишет код на основании этого (и подобных) знаний | Понимает первое правило Кнута. Способен отказаться от микрооптимизаций в сторону читабельности кода, однако задумывается о производительности в контексте функций и модулей | Принимает решения об оптимизации производительности только на основании профилирования кода. Способен оценить выгоды оптимизации до ее реализации, и отказаться в случае неоптимального соотношения "выгода - затраты" | Способен выявлять проблемы с производительностью до того, как они попадают в продакшн и становятся действительно проблемами. Владеет продвинутыми инструментами анализа производительности, а в случае сложных сценариев (у кого-то из клиентов тормозит и непонятно почему) - способен выдвигать теории и разрабатывать инструменты для проверки этих теорий |
31 | SSR | Не реализовывал SSR | Способен реализовывать SSR на стандартных платформах, понимает нюансы программирования подобных систем | Способен реализовать SSR с нуля для достижения оптимальной производительности. Понимает слабые места технологии | Способен решать около-SSR задачи нестандартными подходами, специфичными и применимыми только для конкретного проекта |
32 | Аутентификация / авторизация | Способен реализовать стандартную авторизацию логин-пароль-восстановление-регистрация | Понимает как работает OAuth2 и JWT. Способен их безопасно реализовать | Владеет нюансами 2FA и существующими атаками на них. Способен строить сложные системы ролей | Полностью владеет темой ААА (Authorization, Authentication, Accounting). Способен находить потенциальные угрозы безопасности, проблемы с утечкой данных и т.п. |
33 | Информационная безопасность | Не задумывается об информационной безопасности | Знаком с top10 OWASP и представляет как от них защищаться | Знает о экзотических векторах атаки, отслеживает релевантные 0-day уязвимости. Понимает участки системы с повышенным риском (к примеру DDOS) | Пишет инструменты для проведения атак и выявления проблемных мест (к примеру для Metasploit) |
34 | UX / DX | Не интересуется вопросами UX / DX | Интересуется UX, что-то слышал о DX, но никогда этим не занимался | Собирает метрики для улучшения UX. Активно собирает отзывы об использовании модулей-библиотек-компонентов дял улучшения DX | Имеет свое видение в вопросах UX/DX. Способен противопоставлять свое мнение мнению большинства, если это способствует решению поставленных целей |
35 | NEW! Accessibility | Не задумывается о вопросах a11y | Знает типичные проблемы a11y, особенности работы screen reader'ов на разных платформах и т.д. | Проектирует a11y не только как "семантически корректный HTML", но как отдельный UX. Оптимизирует приложение в том числе и для пользователей с ограниченными возможностями | |
36 | Soft skills | ||||
37 | Самостоятельность | Способен предоставлять отчет по задаче, когда спрашивают | Проактивно предупреждает о потенциальных проблемах, запрашивает помощь и так далее | Способен самостоятельно ставить себе задачи на протяжении длительного времени, занимаясь только согласованием видения с "архитекторами" и "владельцами продукта" | Имеет четкое понимание приоритетов задач с точки зрения разработки. Прислушивается к приоритетам с точки зрения бизнеса, способен обеспечить "героические" усилия (деливери в ограниченные сроки) не путем сверхусилий команды, а путем совместного упрощения задач и т.п. |
38 | Работа в команде | Воспринимает команду как "инструмент" для получения консультаций, отзывов, материалов для обучения и так далее | Активно делится с командой знаниями и важными "gotcha" в процессе работы над проектом. Воспринимает команду как источник ресурсов для непрерывного совершенствования | Способен выполнять (временно или на постоянной основе) роль лидера в команде. Владеет понятиями эмоционального интеллекта и учитывает его для сплочения команды | Воспринимает команду как единое целое. Прилагает усилия к достижению синергетического эффекта. Знает сильные и слабые места каждого из участников команды |
39 | Менторинг | Не интересуется вопросами менторинга | Способен отвечать на вопросы по проекту / технологиям. Способен делиться своими знаниями, в формате "здесь надо делать не так" | Способен эффективно обучать небольшую группу сотрудников | Способен доносить знания неопределённо широкому кругу людей. Владеет навыками психологии-педагогики-групповой динамики для максимально эффективного менторинга |
40 | Навык прохождения собеседований | Собеседование воспринимает как "почти экзамен" | Способен на собеседовании обсудить существующие проекты и свою роль в них. Способен критически оценить предыдущий опыт | Воспринимает вопросы на собеседованиях не как задачи, имеющие единственно правильное решение. В решении сложных вопросов проявляет проактивность, не боится признавать "Я не знаю", но при этом рассуждает "Давайте подумаем вместе" | Не проходит собеседования, а если проходят - они проходят в форме разговоров за жизнь или ретроспективы своей деятельности |
41 | Out-of-the-box мышление | Мыслит "интуитивно" на основании собственного опыта и свежепрочитанных материалов | Знаком с типичными подходами и использует их. Способен найти альтернативное решение в случае возникновения серьезных проблем | Способен принимать решения, на первый взгляд противоречащие общепринятым подходам, однако позволяющие эффективно решить поставленную задачу в рамках текущих ограничений | Формализовывает принципы своих решений и излагает их (публично, внутри команды - неважно). Способствует переходу новых "уникальных" решений в разряд общеизвестных и общепринятых |
42 | Английский | Способен читать техническую документацию | Корректный письменный англиский и сносный разговорный | Свободный разговорный английский (технические контексты) | Свободный разговорный английский |
43 | Коммуникации | Редко выступает инициатором коммуникаций. Большинство коммуникаций либо связаны с решением "сиюминутных" проблем, либо в рамках действующих регламентов (стэндапы, ретроспективы и т.д.) | Иницирует коммуникации по мере возникновения проблем в текущих задачах. Способен оппонировать другим разработчикам, в том числе и вышестоящим, если уверен в своих аргументах. Отслеживает результаты коммуникаций в контексте конкретных действий | Применяет инженерный подход в общении - коммуникации используются как эффективный инструмент достижения целей. В рабочих процессах полностью отсутсвуют коммуникации, которые не способствуют достижению конкретных целей | Владеет понятиями эмоционального интеллекта, базовыми принципами НЛП и всем, что способно помочь в выстраивании общения со "сложными" людьми. Строет общение исходя не только из бизнес целей, но и психологических особенностей другой стороны в общении |
44 | Видение (vision) | Интересуется только поставленными задачами. Делает что приказано | Интересуется задачами команды, задает вопросы "зачем это нужно с точки зрения бизнеса", способен предлагать альтернативные решения задачи, если текущая постановка задачи приводит к значительным сложностями или рискам | Интересуется бизнес-спецификой проектов и направлениями их развития. На основании личного опыта способен предугадывать задачи, запросы команды и потребности | Способен формализовывать видение в процессные документы, для того чтобы априорное знание стало формализованным. Понимает проблемы бизнеса и делает все возможное чтобы разработка (как обслуживающий персонал) максимально соответствовала бизнес-потребностям |
45 | Навыки чтения чужого кода | Чтение чужого кода сопряжено с выкриками "Кто так пишет?", "ну почему так?", "что за $#$R@!" | Способен принять "точку зрения" другого программиста и в случае чего задать вопросы по проблемным местам | Оценивает чужой код исключительно сугубо с точки зрения критериев, важных для проекта в текущем контексте (пример - в рамках срочного релиза допустимо замерджить код написанный не изящно с точки зрения архитектуры и имеющий проблемы с производительностью). Не пытается всем навязывать свои подходы | Воспринимает чужой код прежде всего как возможность изучить подходы других людей. Способен критически воспринимать собственный код и "прогибаться" под решения команды (учитывая уровень команды) |
46 | Общие IT-компетенции | ||||
47 | Отладка | Способен отладить код с помощью console.log и debugger | Использует все возможности предоставляемые окружением (conditional breakpoints, xhr breakpoints и так далее) | Способен эффективно и быстро отлаживать сложные взаимодействия (асинхронные операции, взаимодействие между процессами и так далее). Для Node.JS умеет отлаживать нативные модули | Способен эффективно отлаживать ядро системы (движок JavaScript) |
48 | Рефакторинг | Стихийный подход к улучшениям кода на основании личных ощущений | Рефакторинг основывается на "общепринятых" лучших практиках и выполняется по мере необходимости | Оценивает рефакторинг как бизнес-активность, принимает решения о рефакторинге основываясь прежде всего на потенциальной выгоде проекта в контексте текущих бизнес-целей | Практически не выделяет рефакторинг в отдельную активность, однако сам процесс рефакторинга происходит непрерывно - с одной стороны изменений много, с другой стороны они возникают в системе постепенно, так что команда не теряет "нити" происходящего в системе |
49 | Тестирование | Способен написать unit-тесты к своему коду | Умеет (хотя и не обязательно практикует) TDD. Unit-тесты написаны максимально "честными", понимает где и когда необходимы тесты более высокго уровня | Способен не только писать эффективные тесты всех уровней, но и разрабатывать и поддерживать всю необходимую инфраструктуру для тестирования (начиная от загрузки фикстур заканчивая управлением анимациями в браузере) | Способен выявлять неочевидные места проекта не покрытые тестами. Способен оптимизировать инфраструктуру тестирования в рамках бизнес-целей (скорость выполнения и т.п.). Способен быстро оценивать тест-планы в том числе и на ручное тестирование. Владеет проблемами тестирования производительности, безопасности и так далее |
50 | Бизнес-анализ | Требует выверенного ТЗ. Негативно относится к правкам, возникающим в процессе работы. Считает валидной "презумпцию невиновности" - все что не конкретизировано в ТЗ может быть сделано на усмотрение разработчика | Способен обнаружить недостаточно четко формализованные аспекты технического задания до начала разработки. | Способен до начала разработки выявить места, в которых соотношение "усилия - получаемая бизнес-ценность" не в пользу бизнес-ценности и выработать совместно с Product Owner'ом оптимальные решения | Способен выполнить полный цикл бизнес-анализа, включая адекватное управление требованиями |
51 | Обработка ошибок | Не задумывается об обрабокте ошибок, верит в лучшее | Знает потенциально опасные места в коде, использует try / catch и реализовывает обработку ошибок | Понимает разницу между error recovery и failing fast подходами. Понимает, что они не противоречат друг другу и актинво использует обав нужных частях системы. Разделяет error flow / exception flow в работе системы | Следит за границами распространения ошибок и зонами ответственности обработчиков. Способен выявлять места, где ошибки некорректно "съедаются" и где продолжение после ошибки несет риски для работы системы |
52 | Документирование кода | Пишет комментарии в коде | Пишет код, который практически не нуждается в комментариях. Использует jsdoc либо сходные подходы | Любит автогенерируемую документацию (начиная от swagger заканчивая генерацией типов на основании graphql endpoint) | Документирует высокоуровневые архитектурные решения с целью облегчения внедрения новых людей в проект |
53 | Расширяемость кода | Не задумывается о расширяемости кода | Пишет "максимально" расширяемый код, который иногда приводит к переусложениям | Основываясь на личном опыте видит оптимальный баланс между расширяемостью системы, скоростью разработки и читабельностью кода. Предугадывает (на основании владения предметной областью и прошлого опыта) потенциальные направления развития кода в будущем и закладывает их в существующей кодовой базе | Кроме оптимального компромисса по расширяемости-поддерживаемости кода следит за важными метриками (к примеру связностью с чужими библиотеками) |