Матрица компетенций программиста


За годы работы программистом я работал с разработчиками самого разного уровня — от стажёров, которые путали массив со связным списком, до настоящих гуру, писавших собственные компиляторы. В какой-то момент я понял, что все эти знания и навыки можно разложить по полочкам, и составил для себя эту матрицу компетенций.

Это сугубо личное видение, основанное на моём опыте, наблюдениях и шишках, которые я сам набивал. Здесь нет истины в последней инстанции — скорее попытка причесать хаос IT-компетенций и понять, куда расти дальше. Я разбил всё на категории (от структур данных до блогов, которые читаешь) и выделил четыре уровня владения: 2n, n², n и log(n) — от полного нуля до глубокого понимания предмета.

Матрица получилась большой, поэтому я сделал её в виде аккордеона — кликайте по категориям и смотрите, где вы сейчас и куда можно двигаться. Буду рад, если кому-то это поможет в развитии.
Уровень 0 2n
Не знает разницы между массивом и связным списком.
Уровень 1
Способен объяснить и использовать массивы, связные списки, словари и т.д. в практических программных задачах.
Уровень 2 n
Знает компромиссы между временем и пространством для основных структур данных, массивы vs связные списки, способен объяснить, как можно реализовать хэш-таблицы и обработать коллизии, приоритетные очереди и способы их реализации и т.д.
Уровень 3 log(n)
Знание продвинутых структур данных, таких как B-деревья, биномиальные и фибоначчиевы кучи, AVL/красно-черные деревья, сплей-деревья, списки с пропусками, префиксные деревья и т.д.
Уровень 0 2n
Не может найти среднее значение чисел в массиве (трудно поверить, но я таких кандидатов интервьюировал).
Уровень 1
Базовые алгоритмы сортировки, поиска и обхода/извлечения данных из структур данных.
Уровень 2 n
Деревья, графы, простые жадные и "разделяй и властвуй" алгоритмы, способен понять значимость уровней этой матрицы.
Уровень 3 log(n)
Способен распознать и закодировать решения с использованием динамического программирования, хорошее знание алгоритмов для работы с графами, хорошее знание численных алгоритмов, способен идентифицировать NP-проблемы и т.д.
Уровень 0 2n
Не знает, что такое компилятор, линкер или интерпретатор.
Уровень 1
Базовое понимание компиляторов, линкеров и интерпретаторов. Понимает, что такое ассемблерный код и как все работает на уровне железа. Некоторое знание виртуальной памяти и страничной организации.
Уровень 2 n
Понимает разницу между режимом ядра и пользовательским режимом, многопоточность, примитивы синхронизации и как они реализованы, способен читать ассемблерный код. Понимает, как работают сети, знание сетевых протоколов и программирования на уровне сокетов.
Уровень 3 log(n)
Понимает весь стек программирования, аппаратное обеспечение (CPU + память + кэш + прерывания + микрокод), двоичный код, ассемблер, статическая и динамическая линковка, компиляция, интерпретация, JIT-компиляция, сборка мусора, куча, стек, адресация памяти и т.д.
Уровень 0 2n
Резервное копирование папок по дате.
Уровень 1
Пользователь VSS и начинающий пользователь CVS/SVN.
Уровень 2 n
Умеет пользоваться функциями CVS и SVN. Знает, как создавать ветки и слияния, использовать патчи, настраивать свойства репозитория и т.д.
Уровень 3 log(n)
Знание распределенных систем управления версиями. Попробовал Bzr/Mercurial/Darcs/Git.
Уровень 0 2n
Знает, как собирать проект из IDE.
Уровень 1
Знает, как собрать систему из командной строки.
Уровень 2 n
Может настроить скрипт для сборки базовой системы.
Уровень 3 log(n)
Может настроить скрипт для сборки системы, документации, установщиков, генерации заметок о выпуске и тегирования кода в системе управления версиями.
Уровень 0 2n
Считает, что все тестирование — работа тестировщика.
Уровень 1
Написал автоматизированные модульные тесты и придумывает хорошие тестовые случаи для написанного кода.
Уровень 2 n
Пишет код в стиле TDD (Test-Driven Development).
Уровень 3 log(n)
Понимает и может настроить автоматизированное функциональное, нагрузочное/производительность и UI-тестирование.
Уровень 0 2n
Только линейный код с копированием и вставкой для повторного использования.
Уровень 1
Способен разбить задачу на несколько функций.
Уровень 2 n
Способен создать повторно используемые функции/объекты, которые решают общую задачу.
Уровень 3 log(n)
Использует подходящие структуры данных и алгоритмы, а также создает универсальный/объектно-ориентированный код, который инкапсулирует аспекты задачи, подверженные изменениям.
Уровень 0 2n
Не может думать выше уровня одного файла/класса.
Уровень 1
Способен разбить пространство задачи и разработать решение, если оно находится в рамках одной платформы/технологии.
Уровень 2 n
Способен спроектировать системы, охватывающие несколько технологий/платформ.
Уровень 3 log(n)
Способен визуализировать и спроектировать сложные системы с несколькими продуктовыми линиями и интеграцией с внешними системами. Также должен уметь проектировать системы поддержки операций, такие как мониторинг, отчеты, отказоустойчивость и т.д.
Уровень 0 2n
Не может выразить мысли/идеи перед коллегами. Плохие знания орфографии и грамматики.
Уровень 1
Коллеги понимают, о чем идет речь. Хорошие знания орфографии и грамматики.
Уровень 2 n
Способен эффективно общаться с коллегами.
Уровень 3 log(n)
Способен понять и передать мысли/дизайн/идеи/спецификации однозначным образом и адаптировать коммуникацию в зависимости от контекста.
Важный комментарий:
Это часто недооцениваемый, но очень важный критерий для оценки программиста. С увеличением аутсорсинга программных задач в страны, где английский не является родным языком, эта проблема стала более актуальной. Я знаю несколько проектов, которые провалились из-за того, что программисты не могли понять, что именно имелось в виду в коммуникации.
Уровень 0 2n
Отсутствие признаков организации в файле.
Уровень 1
Методы логически сгруппированы или сгруппированы по доступности.
Уровень 2 n
Код сгруппирован в регионы, хорошо прокомментирован с указанием ссылок на другие исходные файлы.
Уровень 3 log(n)
Файл содержит заголовок лицензии, сводку, хорошо прокомментирован, используется последовательное использование пробелов. Файл должен выглядеть красиво.
Уровень 0 2n
Нет размышлений о организации кода между файлами.
Уровень 1
Связанные файлы сгруппированы в папку.
Уровень 2 n
Каждый физический файл имеет уникальную цель, например, одно определение класса, одна реализация функции и т.д.
Уровень 3 log(n)
Организация кода на физическом уровне точно соответствует дизайну, а просмотр имен файлов и распределения папок дает представление о дизайне.
Уровень 0 2n
Все в одной папке.
Уровень 1
Основное разделение кода на логические папки.
Уровень 2 n
Отсутствие циклических зависимостей, бинарные файлы, библиотеки, документация, сборки, сторонний код организованы в соответствующие папки.
Уровень 3 log(n)
Физическое расположение дерева исходного кода соответствует логической иерархии и организации. Имена директорий и организация предоставляют представление о дизайне системы.
Примечание:
Разница между этим и предыдущим пунктом заключается в масштабе организации. Организация дерева исходного кода относится ко всему набору артефактов, определяющих систему.
Уровень 0 2n
Имена из одного слога.
Уровень 1
Хорошие имена для файлов, переменных, классов, методов и т.д.
Уровень 2 n
Нет длинных функций, комментарии объясняют необычный код, исправления ошибок, предположения кода.
Уровень 3 log(n)
Предположения кода проверяются с помощью assert, код естественно течёт – нет глубокой вложенности условий или методов.
Уровень 0 2n
Не понимает концепцию.
Уровень 1
Проверяет все аргументы и утверждает критические предположения в коде.
Уровень 2 n
Убеждается, что проверяются возвращаемые значения и обрабатываются исключения вокруг кода, который может завершиться ошибкой.
Уровень 3 log(n)
Имеет собственную библиотеку для оборонительного программирования, пишет модульные тесты, имитирующие сбои.
Уровень 0 2n
Только код для "счастливого случая".
Уровень 1
Основная обработка ошибок вокруг кода, который может выбрасывать исключения/генерировать ошибки.
Уровень 2 n
Обеспечивает, что ошибки/исключения оставляют программу в хорошем состоянии, ресурсы, соединения и память корректно очищены.
Уровень 3 log(n)
Кодирует для обнаружения возможных исключений заранее, поддерживает последовательную стратегию обработки исключений на всех уровнях кода, разрабатывает рекомендации по обработке исключений для всей системы.
Уровень 0 2n
В основном использует IDE только для редактирования текста.
Уровень 1
Знает интерфейс, может эффективно использовать IDE через меню.
Уровень 2 n
Знает сочетания клавиш для наиболее часто используемых операций.
Уровень 3 log(n)
Написал пользовательские макросы.
Уровень 0 2n
Часто обращается к документации.
Уровень 1
Запомнил наиболее часто используемые API.
Уровень 2 n
Широкие и глубокие знания API.
Уровень 3 log(n)
Написал библиотеки, которые упрощают часто выполняемые задачи и заполняют пробелы в API.
Примечание:
Примером API может быть библиотека Java, .NET Framework или пользовательский API приложения.
Уровень 0 2n
Не использовал фреймворки за пределами основного платформенного набора.
Уровень 1
Знает о популярных фреймворках, но не использовал их.
Уровень 2 n
Использовал более одного фреймворка в профессиональной среде и хорошо знаком с их идиомами.
Уровень 3 log(n)
Автор фреймворка.
Уровень 0 2n
Берет заданные требования и пишет код в соответствии с ними.
Уровень 1
Задает вопросы о пропущенных случаях в спецификации.
Уровень 2 n
Понимает общую картину и выявляет области, которые необходимо рассмотреть.
Уровень 3 log(n)
Способен предложить лучшие альтернативы и потоки для заданных требований на основе опыта.
Уровень 0 2n
Нет знаний о скриптовых инструментах.
Уровень 1
Использует пакетные файлы/скрипты командной строки.
Уровень 2 n
Использует Perl/Python/Ruby/VBScript/Powershell.
Уровень 3 log(n)
Написал и опубликовал повторно используемый код.
Уровень 0 2n
Считает, что Excel — это база данных.
Уровень 1
Знает основные концепции баз данных, нормализацию, ACID, транзакции и может писать простые запросы.
Уровень 2 n
Способен проектировать хорошо нормализованные схемы баз данных с учетом запросов, которые нужно будет выполнять, опытен в использовании представлений, хранимых процедур, триггеров и пользовательских типов. Знает разницу между кластеризованными и некластеризованными индексами. Опытен в использовании ORM-инструментов.
Уровень 3 log(n)
Может выполнять базовое администрирование баз данных, оптимизацию производительности, оптимизацию индексов, писать сложные запросы, заменять использование курсоров на реляционные SQL-запросы, понимает, как данные хранятся внутри, как хранятся индексы, как базы данных могут быть зеркалированы, реплицированы и т.д. Понимает, как работает двухфазная фиксация.
Уровень 0 2n
Императивный или объектно-ориентированный.
Уровень 1
Императивный, объектно-ориентированный и декларативный (SQL). Дополнительный бонус, если понимает статическую и динамическую типизацию, слабую и сильную типизацию, а также статически выводимые типы.
Уровень 2 n
Функциональный. Дополнительный бонус, если понимает отложенные вычисления, каррирование, продолжения.
Уровень 3 log(n)
Параллельный (Erlang, Oz) и логический (Prolog).
Уровень 0 (2n) Уровень 1 (n²) Уровень 2 (n) Уровень 3 (log(n))
1 2-3 4-5 6+
Уровень 0 (2n) Уровень 1 (n²) Уровень 2 (n) Уровень 3 (log(n))
1 2-5 6-9 10+
Уровень 0 2n
Нет знаний о предметной области.
Уровень 1
Работал над как минимум одним продуктом в этой области.
Уровень 2 n
Работал над несколькими продуктами в одной и той же области.
Уровень 3 log(n)
Эксперт в области. Разрабатывал и внедрял несколько продуктов/решений в этой области. Хорошо знаком с общепринятыми терминами и протоколами, используемыми в этой области.
Уровень 0 2n
Ограничено основным IDE (VS.Net, Eclipse и т.д.).
Уровень 1
Знает о некоторых альтернативах популярным и стандартным инструментам.
Уровень 2 n
Хорошее знание редакторов, отладчиков, IDE, альтернатив с открытым исходным кодом и т.д. Например, кто-то, кто знает большинство инструментов из списка мощных инструментов Скотта Хансельмана. Использовал ORM-инструменты.
Уровень 3 log(n)
Написал собственные инструменты и скрипты, дополнительный бонус, если они были опубликованы.
Уровень 0 2n
Императивный или объектно-ориентированный.
Уровень 1
Императивный, объектно-ориентированный и декларативный (SQL). Дополнительный бонус, если понимает статическую и динамическую типизацию, слабую и сильную типизацию, а также статически выводимые типы.
Уровень 2 n
Функциональный. Дополнительный бонус, если понимает отложенные вычисления, каррирование, продолжения.
Уровень 3 log(n)
Параллельный (Erlang, Oz) и логический (Prolog).
Уровень 0 2n
Никогда не смотрел на базу кода.
Уровень 1
Базовое знание структуры кода и того, как собирать систему.
Уровень 2 n
Хорошее практическое знание базы кода, реализовал несколько исправлений ошибок и, возможно, некоторые небольшие функции.
Уровень 3 log(n)
Реализовал несколько крупных функций в базе кода и может легко визуализировать изменения, необходимые для большинства функций или исправлений ошибок.
Уровень 0 2n
Не слышал о предстоящих технологиях.
Уровень 1
Слышал о предстоящих технологиях в своей области.
Уровень 2 n
Скачал альфа-версию/CTP/бета-версию и прочитал несколько статей/руководств.
Уровень 3 log(n)
Поиграл с предварительными версиями и на самом деле создал что-то с их помощью, и дополнительный бонус, если поделился этим с другими.
Уровень 0 2n
Нулевое знание о внутреннем устройстве платформы.
Уровень 1
Имеет базовое представление о том, как работает платформа изнутри.
Уровень 2 n
Глубокое знание внутреннего устройства платформы и способность визуализировать, как платформа преобразует программу в исполняемый код.
Уровень 3 log(n)
Написал инструменты для улучшения или предоставления информации о внутреннем устройстве платформы. Например, дизассемблеры, декомпиляторы, отладчики и т.д.
Уровень 0 2n
Серия "Unleashed", "21 дней", "24 часа", "для чайников"...
Уровень 1
"Code Complete", "Don't Make me Think", "Mastering Regular Expressions"
Уровень 2 n
"Design Patterns", "Peopleware", "Programming Pearls", "Algorithm Design Manual", "Pragmatic Programmer", "Mythical Man month"
Уровень 3 log(n)
"Structure and Interpretation of Computer Programs", "Concepts Techniques, Models of Computer Programming", "Art of Computer Programming", "Database systems" by C. J. Date, "Thinking Forth", "Little Schemer"
Уровень 0 2n
Слышал о них, но никогда не находил времени.
Уровень 1
Регулярно читает технические/программистские/инженерные блоги и слушает подкасты.
Уровень 2 n
Ведет блог со ссылками на полезные статьи и инструменты, которые он/она собрал.
Уровень 3 log(n)
Ведет блог, в котором делится личными мыслями и идеями о программировании.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, программирование



Программа 'Постоянно онлайн вконтакте'
Внешний вид radiobutton
Роботы, "заменяющие" людей, кто следующий?