/programmer-competency-matrix

ENG -> RU: Матрица компетентности программиста, мой перевод

                                                                    Матрица компетентности программиста ч.I.

Область Уровень
2^n (Уровень 0) n^2 (Уровень 1) n (Уровень 2) log(n) (Уровень 3)
Теория
Структуры данных Не понимает разницы между массивом и связным списком. Может объяснить и использовать на практике массивы, связные списки, словари и т.д. Понимает плюсы и минусы использования тех или иных базовых структур данных (размер памяти, время выполнения операций с данными, в чем разница между массивами и связными списками в этом плане).

Может объяснить как реализовать хэш-таблицы и как обработать коллизии. Приоритетные очереди и способы их реализации, и т.д.

Знание сложных структур данных, таких как B-дерево, Биномиальная куча и Фибоначчиевская куча, АВЛ-дерево, Красно-чёрное дерево, Косое дерево, Список с пропусками, TRIE-структуры и т.д.
Алгоритмы Не может найти среднее значение массива чисел. (Тяжело поверить, но встречаются и такие кандидаты на собеседовании.) Базовые методы сортировки и поиска. Обход и поиск в структурах данных. Деревья, Графы, "простой путь" и  "разделяй и властвуй"-алгоритмы. Понимает ассоциацию уровней этой матрицы. Может распознать и написать решение динамическим программированием, хорошо знает алгоритмы на графах, хорошо знает численные методы, может идентифицировать проблемы класса NP.
Системное программи-

рование

Не знает что такое компилятор, компоновщик или интерпретатор. Базовое понимание компиляторов, компоновщиков и интерпретаторов.

Понимает, что такое ассемблерный код и как работают программы на уровне железа. Небольшое понимание виртуальной памяти и пэйджинга.

Понимает чем отличается kernel mode от user mode, что такое мульти-трединг. Знает способы синхронизации и как реализованы примитивы синхронизации. Может читать ассемблерный код.

Понимает, как работают сети, сетевые протоколы и может реализовать передачу данных через сокеты.

Понимает как работает весь "программный стэк": железо (CPU + Память + Кэш + Прерывания + микрокоды), двоичный код, ассемблер, статическая и динамическая линковка, компиляция, интерпретация, JIT-компиляция, сборка мусора, куча, стэк, адресация памяти.
Навыки
Контроль версий исходников Бэкап исходников в папку с датой бэкапа. VSS и основы CVS/SVN в качестве пользователя. Специалист по возможностям CVS и SVN. Знает как создать, разветвить, слить репозитарий и т.д. Знает распределенные системы VCS. Работает с Mercurial/Darcs/Git
Автоматиза-

ция build'ов

Знает как запустить Build из среды программирования. Умеет билдить из командной строки. Может настроить скрипт для сборки основной системы. Может настроить скрипт для сборки системы и документации, для сборки инсталляторов.Сделает и добавит код скрипта в систему контроля версий исходников.
Автоматизация тестирования Считает, что тестирование - это работа тестеров. Может создавать свои хорошие юнит-тесты для кода, который пишет в настоящее время. Пишет код в стиле Test-driven Development (TDD). Может создавать автоматические тесты на функционал, пользовательский интерфейс и загрузку/производительность.
Програм-

мирование

Декомпози-

ция задачи

Просто последовательные строчки.

Copy/Paste - для повторного использования кода.

Может разбивать решение задачи на несколько функций. Способен создавать многократно используемые функции/объекты, которые решают общие задачи. Использует соответствующие структуры данных и алгоритмы. Создает общий/объектно-ориентированный код, который инкапсулирует те условия задачи, которые могут быть изменены.
Декомпози-

ция системы

Не способен думать о системе более сложной, чем один класс или файл. Может произвести декомпозицию задачи и спроектировать систему в пределах одной платформы или технологии. Может спроектировать систему, которая охватывает несколько технологий/платформ. Может визуализировать и проектировать сложные системы с несколькими линейками продуктов, учитывать интеграциею с внешними системами. Также должен уметь проектировать системы поддержки работы: мониторинг, генерация отчетов, аварийные переходы на использование запасных ресурсов.
Общение Не может выразить свои мысли/идеи. Плохо с правописанием и грамматикой. Его понимают. Хорошие правописание и грамматика. Может эффективно общаться. Может понимать и объяснять мысли/дизайн/ 

идеи/специфику в точно выраженной  форме. В общении соответствует ситуации.

Организация кода в файле Нет четкой организации кода в файле. Методы сгруппированны логически и по вызовам. Код разделен на регионы,  имеет хорошие комментарии, в т.ч. со ссылками на другие файлы исходников. Файл имеет разделы "license header", "summary", хорошие комментарии, непротиворечивую расстановку пробелов и табуляции. Файл должен выглядеть красиво.
Организация кода между файлами Не приходит в голову мысль четко организовать код с помощью разделения на файлы. Похожие файлы группируются в папку. Каждый физический файл предназначен для чего-то одного, например, служит для объявления одного класса или для реализации одного функционала и т.д. Организация кода на физическом уровне точно соответствует проекту. Глядя на имена файлов и структуру папок, можно понять как спроектирована данная реализация.
Организация дерева исходников Все в одной папке. Простое разделение кода в логические подкаталоги. Нет "круговых" зависимостей. Бинарники, либы, документация, билды, сторонний код - все разложено в соответствующие папки. Структура дерева исходного кода соответствует логической иерархии и организации кода в проекте.

Глядя на имена файлов и структуру папок, можно понять как спроектирована данная система.

Читабель-

ность кода

Односложные имена. Хорошие имена файлов, переменных, классов, методов и т.д. Нет длинных функций, а нестандартный код, багфиксы и допущения в коде поясняются комментариями. Допущения в коде сопровождаются assert'ами. Поток операций в коде естественный - нет глубокой вложенности условий или методов.
Безопасное программи-

рование (defensive coding)

Не понимает данной концепции. Проверяет все аргументы и ставит assert'ы на критические допущения в коде. Убеждается, что проверил возвращаемое значение и что обрабатывает исключения в потенциально бажном коде. Имеет свою собственную библиотеку помогающую в безопасном программировании, пишет юнит-тесты которые эмулируют сбои.
Обработка ошибок Пишет код для "идеального" случая, когда все работает и нет сбоев. Обработка ошибок в коде, который либо кидает исключение, либо генерирует ошибку. Убеждается, что после того, как произошла ошибка/исключение, программа продолжает работать, а ненужные более ресурсы, коннекшоны и память были корректно освобождены обработчиком ошибки.  Пишет код так, чтобы определять возможные ошибки на раннем этапе,  придерживается последовательной стратегии обработки исключений во всех слоях кода, разрабатывает общие принципы обработки исключений во всей системе.

 

Замечание 1:

Каждый следующий уровень включает в себя предыдущий , т.е. разработчик находящийся на уровне 3 должен удовлетворять критериям двух предыдущих уровней.

Замечание 2:

Версия документа от 17.05.2013. О дополнениях, ошибках сообщайте в issues. Спасибо всем, кто помог сделать этот документ лучше!

Замечание 3:

Эта перевод английской версии: Programmer Competency Matrix

Вторая, еще более содержательная часть таблицы - Матрица компетентности программиста ч.II.>>