Матрица профессиональных компетенций программиста

Теоретическая подготовка
  2n (Уровень 0) n2 (Уровень 1) n (Уровень 2) log(n) (Уровень 3)

Структуры данных

Не может объяснить разницы между Array (массивом) и LinkedList (связным списком) Способен объяснить принцип работы массивов, списков, словарей и использовать их для решения практических задач Осознаёт, какие компромиссы между объёмом занимаемой памяти и быстродействием имеют место
в базовых структурах данных, какие операции и почему легче выполнять для массивов, а какие — для списков.
Может привести и объяснить способы реализации хеш-таблиц и разрешений коллизий в них.
Приоритетные очереди и способы их реализации.
Знает и понимает продвинутые структуры данных: B-деревья, биномиальные и фибоначчи-кучи, красно-чёрных деревья,
«выворачивающиеся» (Splay) деревья, слоёные списки (skip lists), префиксные и суффиксные деревья и т.п.

Алгоритмы

Не способен найти среднее значение чисел в массиве (сложно поверить, но случаются и такие кандидаты) Знает основные алгоритмы сортировки, поиска, обхода и выборки даннных. Деревья и Графы. Простые «жадные » алгоритмы и алгоритмы вида «разделяй-и-властвуй» (вроде QuickSort).
Способен понять смысл обозначения уровней в этой матрице.
Способен распознать и программно решить задачи динамического программирования, хорошо знает
алгоритмы работы с графами, вычислительные алгоритмы. Способен распознать класс сложности задачи и т.п.

Системное программирование

Не знает, что такое компилятор, сборщик или интерпретатор. Базовое понимание компиляторов, сборщиков и интерпретаторов. Понимает, что такое машинный код,
и как всё работает на аппаратном уровне. Некоторые знания в сфере виртуальной памяти.
Понимает отличия пользовательского режима от режима ядра, многопоточность, примитивы синхронизации и
то, как они реализованы. Способен читать машинный код. Понимает работу сетей, сетевые протоколы и
программирование уровня сокетов.
Понимает весь программный стек, детали аппаратной реализации (ЦПУ + Память + Кэш + Прерывания + Микрокоманды),
сборки, статическое и динамическое связывание, компиляция, интерпретация,
компиляция времени выполнения, сбор мусора, стек, куча, адресация в памяти…
Инфраструктура разработки
  2n (Уровень 0) n2 (Уровень 1) n (Уровень 2) log(n) (Уровень 3)

Системы контроля версий

Архивные папки по датам VSS и начинающий пользователь CVS/SVN Имеет опыт в использовании возможностей CVS или SVN, умеет создавать ветки и сливать, настраивать свойства репозитория и т.п. Знаком с распределёнными системами контроля версий. Пробовал Bzr/Mercurial/Darcs/Git

Автоматизация сборки

Умеет собирать из ИСР (Интегрированная среда разработки — IDE) Умеет собирать из командной строки Может настроить скрипт для сборки системы Может настроить скрипт для сборки системы, а также генерации документации, установочных пакетов, заметок о выпуске и для установки соответствующих меток в системе контроля версий.

Знание средств разработки

Ограничено «родной» ИСР (IDE) (VS.Net, Eclipse и т.п.) Знает о некоторых альтернативных средствах, представляет возможности других ИСР. Хорошее знание редакторов, отладчиков, ИСР, свободных альтернатив и т.п. Приветствуется знание, например, программ из из списка Скотта Хансельмана Сам автор утилит и скриптов, желательно опубликованных.

Работа со средой
разработки (IDE)

Использует ИСР для правки текстов. Детальнее знаком с интерфейсом, способен эффективно пользоваться средой посредством меню. Знаком с горячими клавишами для часто используемых операций. Создаёт собственные макросы и расширения.

Написание
сценариев

Не приходилось писать сценариев Командные скрипты ОС, JS for scripting Perl/Python/Ruby/VBScript/Powershell Создал и опубликовал повторно используемые сценарии.
Программирование
  2n (Уровень 0) n2 (Уровень 1) n (Уровень 2) log(n) (Уровень 3)

Декомпозиция задачи

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

Декомпозиция системы

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

Организация кода
в рамках файла

Никаких признаков организации кода Методы сгруппированы логически или по уровням видимости Код оформлен в регионы и достаточно прокомментирован Файл чётко структурирован, документирован, все пробелы и новые строки расставлены в соответствии со стандартом кодирования. Файл выглядит идеальным.

Организация кода
между файлами

Не принимает во внимание организацию файлов в папки. Связанные файлы сгруппированы в папки. Каждый файл имеет чёткую единственную цель, например, определение одного класса, реализация одной возможности и т.п. Организация кода на физическом уровне соответствует дизайну. Просмотр имён файлов и папок даёт представление об архитектуре данного фрагмента системы.

Организация проектов в решении

Разделение на проекты практически отсутствует (например, и слой UI, и логика, и данные — в одном проекте) Базовое разделение проектов по уровням. Бинарные внешние сборки, документация, внешний код, результаты сборки — всё логично организовано в соответствующие папки. Контролирует зависимости между проектами. Физическое расположение исходников в дереве соответствуюет логической структуре и организации системы. Просмотр имён файлов и папок даёт представление об архитектуре системы.

Читаемость кода

Однобуквенные имена Смысловые имена для файлов, переменных, методов, классов и т.п. Нет длинных функций; необычный код, исправления ошибок, предположения — прокомментированы Допущения верифицируются с помощью Assert или контрактов кода. Поток выполнения выглядит естественно, нет слишком глубокой вложенности условий или вызовов.

Навыки общения

Не может донести мысли/идеи коллегам. Орфографические и грамматические ошибки. Может донести мысли/идеи коллегам. Грамотная речь и письмо. Способен эффективно обсуждать архитектурные и прочие детали с коллегами. Способен понимать и сообщать мысли/архитектурные идеи/спецификации в непротиворечивой форме и в общении ориентируется на контекст (на понимание собеседниками друг друга). Может обучать других.

Автоматизированное
тестирование

Считает, что всё тестирование — работа тестировщика Пишет автоматические тесты, приходит к созданию хороших тестов для уже написанного кода Пишет код в манере РЧТ (разработка через тестирование, TDD) Способен настроить автоматизированные функциональные, нагрузочные и тесты интерфейса.

Защитное
кодирование

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

Обработка ошибок

Кодирует в расчёте на отсутствие ошибок. Базовая обработка кода, который может выбросить исключение/сгенерировать ошибку. Убеждается, что ошибки/исключения оставляют программу в корректном состоянии, освобождаются все ресурсы, требующие освобождения: память, подключения и др. Старается не допустить возникновения исключений путём упреждающих проверок, поддерживает общую стратегию обработки исключений во всех слоях приложения. Предлагает набор общий правил для обработки исключений во всей системе.

Отношение
к требованиям

Берёт требования и реализует их формально Ставит вопросы по упущеным ньюансам в требованиях Понимает общую картину и указывает на целые сферы, которые нужно уточнить/доописать Способен предложить лучшие альтернативы предлагаемым решениям исходя из личного опыта

Базы данных

Считает базой данных Excel Знаком с основными концепциями, нормализаций, ACID, транзакциями, и способен писать простые запросы. Способен проектировать хорошие нормализованные схемы, учитывая при этом типичные запросы, которые будут производится.
Профессионально использует отображения (View), хранимые процедуры, триггеры и типы, определяемые пользователем.
Понимает отличие кластерных индексов от некластерных. Профессионально использует средства объектно-реляционного отображения.
Способен осуществлять базовое администрирование БД, настройку производительности и оптимизацию индексов.
Создавать сложные запросы, заменять использование курсоров на выражения SQL. Представляет, как данные и индексы физически организованы.
Понимает, как база может быть зеркалирована, реплицируема. Понимает, как работает двухфазная фиксация (commit).
Опыт
  2n (Уровень 0) n2 (Уровень 1) n (Уровень 2) log(n) (Уровень 3)

Профессионально используемые языки

Императивные или объектно-ориентированные Императивные, объектно-ориентированные и декларативные (SQL).
Понимает отличия статической и динамической, сильной и слабой типизации. Статический вывод типов.
Функциональные. Ленивые вычисления, каррирование, продолжения (континуации, continuations) Параллельные (Erlang, Oz) и логические (Prolog)
Самообразование
и развитие
  2n (Уровень 0) n2 (Уровень 1) n (Уровень 2) log(n) (Уровень 3)

Изучаемые языки/сфера интересов

Императивные или объектно-ориентированные Императивные, объектно-ориентированные и декларативные (SQL). Понимает отличия статической и динамической, сильной и слабой типизации. Статический вывод типов. Функциональные. Ленивые вычисления, каррирование, продолжения (континуации, continuations) Параллельные (Erlang, Oz) и логические (Prolog)

Знакомство с технологиями
«на гребне волны»

Не следит за новыми выпусками платформ, сред разработки и т.п. Ознакамливается с планами выпусков, представляет, о каких продуктах идёт речь Загружает предварительные версии продуктов, читает статьи, руководства. Экспериментирует с предварительными версиями, создаёт пробные решения. Опубликовывает интересные результаты для сообщетва.
×