Skip to content

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

09/04/2009

То же на Google Docs, для удобства чтения.

Computer Science

  2n (Уровень 0) n2 (Уровень 1) n (Уровень 2) log(n) (Уровень 3) Комментарии
Структуры данных Не отличает массив от связанного списка Способен объяснить и использовать массивы, связанные списки, словари и т.д. в практических задачах. Знает тонкости использования простых структур данных. Способен объяснить как применяются хеш-таблицы, как разрешаются коллизии, очереди с приоритетом и т.д. Знание сложных структур данных — B-деревьев, биномиальных куч и куч фиббоначчи, красно-черных деревьев, расширяющихся деревьев, списков с пропусками, префиксных деревьев и т.д.  
Алгоритмы Не способен найти среднее значение элементов массива (трудно поверить, но ко мне на интервью приходили такие кандидаты) Простая сортировка, поиск, разбор структурированных данных. Может работать с деревьями, графами, простыми жадными алгоритмами и алгоритмами типа «разделяй и властвуй», способен понять как уровни этой матрицы соотносятся друг с другом. Способен читать и создавать динамические программные решения, хорошие знания алгоритмов обработки графов, хорошие знания математических вычислительных алгоритмов, способность распознавать NP-проблемы и т.д. Работа с хорошим топ-кодером была бы невероятной удачей🙂
Программирование систем Не знает что такое компилятор, компоновщик, интерпретатор Базовое понимание компиляторов, линкеров и интерпретаторов. Понимает что такое ассемблерный код и как что работает на уровне оборудования. Некоторые знания виртуальной памяти и страничной адресации. Понимает различия между kernel mode и user mode, многопоточность, synchronization primitives и как они применяются, способен читать ассемблерный код. Понимает как работают сети, знает организацию сетевых протоколов и программирование сокетов. Понимает весь процесс выполнения программ, железо (CPU + память + кэш + прерывания + микрокод), машинный код, статическое и динамическое связывание, компиляцию, интерпретацию, JIT, сборку мусора, кучи, стеки, адресацию памяти…  

Software Engineering

  2n (Уровень 0) n2 (Уровень 1) n (Уровень 2) log(n) (Уровень 3) Комментарии
Контроль версий исходного кода Бэкап папок по пятницам VSS и основы CVS/SVN Опыт использования возможностей CVS и SVN. Знает как делать ветви и мерджить их, использовать патчи, устанавливать параметры репозитория и т.д. Знание распределённых систем контроля версий. Опыт работы с Bazaar/Mercurial/Darcs/Git  
Автоматизация сборки Знает как запустить сборку из IDE Умеет собирать систему из командной строки Может написать простой скрипт для сборки Может написать скрипт для автоматической сборки проекта, документации, инсталляторов, генерации release notes и взаимодействующий с системой контроля версий  
Автоматическое тестирование Считает что всё тестирование — работа тестеров Пишет автоматические юнит-тесты и может составлять хорошие тест-кейсы Умеет писать код в стиле TDD Понимает и умеет применять автоматические функциональные, нагрузочные и UI тесты  

Программирование

  2n (Уровень 0) n2 (Уровень 1) n (Уровень 2) log(n) (Уровень 3) Комментарии
Декомпозиция проблем Прямой код, copy-paste для повторного использования Способен разбить проблему на несколько функций Способен писать функции пригодные для повторного использования Использует соответствующие ситуации алгоритмы и структуры данных, пишет объектно-ориентированный код, в котором изменяемые части проблемы инкапсулированы в отдельные функции  
Декомпозиция систем Неспособен думать выше уровня одного файла/класса Способен разбить пространство проблем и пространство решений, пока проект остается на одной платформе/технологии Способен разрабатывать архитектуру систем, охватывающих несколько платформ/технологий Способен понимать и разрабатывать сложные системы с несколькими линейками продуктов и интеграцией со внешними системами.
Также способен разрабатывать вспомогательные системы — мониторинга, отчетности, восстановления после ошибок
 
Коммуникабельность Не может объяснить мысли/идеи команде. Неразборчиво говорит и пишет с ошибками. Команда способна понять его. Хорошая речь — устная и письменная. Способен эффективно общаться с командой Способен понимать и объяснять мысли/дизайн/идеи/спецификации в ясной манере и применять навыки общения в зависимости от конкретной ситуации. Этот пункт часто недооценивают, но это очень важный критерий при оценке программиста. С распространением outsource-разработки эти качества становится ещё ценнее. Я знаю о некоторых проектах сорвавшихся именно потому что команда не могла эффективно взаимодействовать.
Организация кода внутри файла Её нет Методы сгруппированы по назначению или доступности Код сгруппирован по назначению и хорошо документирован с отсылками к другим исходникам. У файла есть лицензионный заголовок, краткое содержание, хорошие комментарии, наглядное форматирование кода. Файл выглядит красиво.  
  2n (Уровень 0) n2 (Уровень 1) n (Уровень 2) log(n) (Уровень 3) Комментарии
Организация кода между файлами Не продумана организация кода между файлами Родственные файлы собраны в папки Каждый файл имеет своё уникальное назначение, например один определяет классы, другой реализовывает какой-либо функционал и т.д. Организация кода на физическом уровне совпадает с дизайном программы, взгляд на имена файлов и папок даёт представление о дизайнерских решениях  
Организация дерева исходников Всё в одной папке Простое разделение кода на логические папки. Отсутствие circular dependencies, бинарные файлы, документация, билды, third-party код разложены в соответствующие папки Структура дерева папок соответствует логической иерархии и организации. Названия папок и файлов дают представление о дизайне системы. Различие между этим и предыдущим пунктами — масштаб организации, структура папок и файлов соответствует внутренней организации всей разрабатываемой системы.
Читабельность кода Однобуквенные имена Хорошие имена для файлов, переменных, классов, методов и т.д. Отсутствие длинных функций, комментарии объясняют необычный код, багфиксы, предположения о дальнейшем развитии кода Предположения в коде проверяются assert’ами, код развивается естественно — нет глубокой вложенности условий или методов  
Защитное программирование Не понимает концепции Проверяет все аргументы, ставит оповещения о критических случаях в коде Обязательно проверяет возвращаемые значения и ставит исключения в местах где код может сработать неправильно Имееет собственную библиотеку для безопасного кодинга, пишет юнит-тесты, симулирующие критические ситуации  
  2n (Уровень 0) n2 (Уровень 1) n (Уровень 2) log(n) (Уровень 3) Комментарии
Обработка ошибок Программирует только удачное развитие событий Простая обработка ошибок, использующая exception/error Удостоверяется что ошибки/исключения оставляют программу в нормальном состоянии, ресурсы, соединения и память очищаются. Код заранее определяет возможные исключения, стиль обработки исключений остается постоянным на всех уровнях кода, разрабатываются основы обработки исключений для всей системы  
IDE В основном использует IDE для редактирования текста Знаком с интерфейсом, способен эффективно использовать IDE с помощью меню. Знает горячие клавиши для наиболее часто используемых функций. Умеет писать собственные макросы  
API Вынужден часто заглядывать в документацию Помнит часто используемые API Обширные и глубокие знания разных API Написал библиотеки над API, упрощающие решение часто встречающихся задач, и заполняющие пробелы в API API может быть Java библиотекой, .net фреймворком или API какого-нибудь приложения или сервиса
Фреймворки Не использовал ничего кроме самой платформы Слышал о них, но не использовал ничего из существующего для своей платформы Использовал более одного фреймворка в профессиональном масштабе и хорошо знаком с организацией фреймворков Автор фреймворка  
  2n (Уровень 0) n2 (Уровень 1) n (Уровень 2) log(n) (Уровень 3) Комментарии
Требования Получает требования и программирует в соответствии со спецификацией Проясняет пропущенные места в спецификации Понимает общую картину и указывает на не покрытые спецификацией области Способен аргументированно предложить лучшие альтернативы к данным спецификациям, основываясь на своём опыте  
Скрипты Не умеет Командные файлы/шелл-скрипты Perl/Python/Ruby/VBScript/Powershell Пишет и публикует код, пригодный для повторного использования  
Базы данных Считает Excel базой данных Имеет представление о базах данных, нормализации, ACID, транзакциях и может писать простые выборки Способен разработать хорошие нормализованные схемы баз данных с учетом природы выполняемых запросов, искусно использует представления, хранимые процедуры, триггеры и пользовательские типы данных. Знает разницу между clustered и non-clustered индексами. Имеет опыт использования ORM. Может администрировать базу данных, оптимизировать производительность, индексы, писать сложные запросы, заменять использование курсоров relational sql, понимает как данные хранятся внутри базы, понимает как работают ихранятся индексы, знает как делается репликация, mirroring и т.д. Понимает как работает двухэтапный commit.  

Опыт

  2n (Уровень 0) n2 (Уровень 1) n (Уровень 2) log(n) (Уровень 3) Комментарии
Языки в которых есть профессиональный опыт Процедурные или объектно-ориентированные Процедурные, объектно-ориентированные и декларативные (SQL), дополнительный бонус за понимание статической vs динамической типизации, сильной vs слабой типизации и static inferred types Функциональные, дополнительный бонус за понимание lazy evaluation, карринга, continuations Конкурентные (Erlang, Oz) и логические (Prolog)  
Профессиональный опыт в платформах 1 2-3 4-5 6+  
Стаж профессионального опыта (в годах) 1 2-5 6-9 10+  
Знания в области Нет знаний в конкретной области Работал хотя бы над одним продуктом в области. Работал над несколькими продуктами в области. Эксперт в своей области. Разработал и внедрил несколько продуктов/решений. Знаком с терминологией и протоколами, используемыми в области.  

Знания

  2n (Уровень 0) n2 (Уровень 1) n (Уровень 2) log(n) (Уровень 3) Комментарии
Знание инструментов Ограничено основным IDE (VS.Net, Eclipse и т.д.) Знает несколько альтернатив популярным и стандартным инструментам. Хорошее знание редакторов, дебаггеров, IDE, open-source инструментов и т.д. и т.п. Например, тот кто знает большинство инструментов из списка Скотта Хансельмана. Использовал ORM. Сам пишет инструменты и скрипты, дополнительный бонус за их публикацию  
Повседневно используемые языки Процедурные или объектно-ориентированные Процедурные, объектно-ориентированные и декларативные (SQL), дополнительный бонус за понимание статической vs динамической типизации, сильной vs слабой типизации и static inferred types Функциональные, дополнительный бонус за понимание lazy evaluation, карринга, continuations Конкурентные (Erlang, Oz) и логические (Prolog)  
Знание существующей базы кода Никогда не заглядывал Базовые знания структуры кода и как строится система Хорошие знания существующего кода, пофиксил несколько багов и добавил небольшие возможности. Добавил несколько больших доработок в код, может легко представить какие изменения необходимы для добавления того или иного функционала или исправления.  
Знание новых технологий Не интересуется новыми технологиями Слышал о появляющихся технологиях в своей области Скачивал альфа-версии/CTP/беты и читал статьи/мануалы Пробовал preview-версии и действительно применял их в своей работе, бонус за публикацию результатов  
  2n (Уровень 0) n2 (Уровень 1) n (Уровень 2) log(n) (Уровень 3) Комментарии
Внутреннее устройство платформы Нулевой уровень знаний об устройстве платформы Базовые знания о внутреннем устройстве и работе платформы Глубокое знание механизмов работы платформы, способность объяснить этапы компиляции и выполнения программы. Писал инструменты для расширения или исследования внутренних функций платформы. Например — дизассемблеры, декомпилеры, дебаггеры и т.д.  
Книги Серии «… для чайников» и «… за 10 дней» «Идеальный код», «Don’t Make me Think», «Регулярные выражения» Фридла и т.д. Design Patterns, «Peopleware», «Programming Pearls», «Algorithm Design Manual», «Pragmatic Programmer», «Мифический человеко-месяц» «Структура и интерпретация компьютерных программ», «Concepts Techniques», «Models of Computer Programming», «Art of Computer Programming», «Database systems» by C. J Date, «Thinking Forth» Лео Броуди, «Little Schemer»  
Блоги Слышал о них, но времени взглянуть не было. Читает блоги о программировании, разработке ПО, регулярно слушает подкасты. Ведёт блог ссылок, где хранит коллекцию полезных статей и инструментов Ведёт блог, в котором делится своими мыслями по поводу программирования  

Примечание переводчика: для меня это не только способ проверить уровень своих знаний, но и карта — в каком направлении следует двигаться дальше. Сейчас у меня почти везде Level 1🙂
Комментарии по поводу перевода приветствуются.

3 комментария
  1. Круто, спасибо!😉

  2. thedoorsalive permalink

    Занятно, возвращает на землю🙂

  3. abc permalink

    такие матрицы делают работодатели, они хотят супер — спеца за копейки и со всеми знаниями

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: