samoelka (samoelka) wrote,
samoelka
samoelka

Category:

Что должен знать и уметь программист

Sijin Joseph в 2008 году опубликовал в своем блоге Programmer Competency Matrix. С помощью этой матрицы ИТ-специалист может определить уровень своей компетентности в различных областях знаний.

Примечание: Навыки каждого уровня являются кумулятивными, т.е. предполагают наличие навыков предыдущих уровней.


Информатика

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

   Уровень 0: Не знает различия между массивом и связным списком.
   Уровень 1: Способен объяснить и использовать массивы, связные списки, словари и т.д. для решения практических
                      задач программирования.
   Уровень 2: Знаком с выбором оптимального соотношения "время-память" (space-time tradeoff) основных структур данных,
                      с различиями между массивами и связными списками; способен объяснить, как можно реализовать
                      хэш-таблицы и обработать конфликты; знает способы реализации очередей с приоритетом и т.д.
  Уровень 3: Знаком со сложными структурами данных, такими как В-деревья, биномиальная и фибоначчиева кучи,
                      красно-черные и АВЛ-деревья, расширяющиеся деревья, списки с пропусками, префиксные деревья и т.д.

* Алгоритмы

Уровень 0: Не способен найти среднюю величину в массиве.
Уровень 1: Знает основные алгоритмы сортировки, поиска, прохождения структур данных и выборки.
Уровень 2: Знает алгоритмы на деревьях, графах, жадный и разделяй-и-властвуй алгоритмы. В состоянии понять
                      соотношение уровней этой матрицы.
Уровень 3: Способен распознать и реализовать решения динамического программирования. Хорошо знает алгоритмы
                      на графах, алгоритмы вычислительной математики. Способен распознать NP проблемы и т.д.

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

Уровень 0: Не знает, что такое компилятор, компоновщик или интерпретатор.
Уровень 1: Владеет базовым пониманием компиляторов, компоновщиков и интерпретаторов. Понимает, что такое
                      ассемблерный код, и как работают элементы на аппаратном уровне. Имеет некоторые знания виртуальной
                      памяти и подкачки страниц.
Уровень 2: Понимает разницу между режимом ядра и режимом пользователя, многопоточность, синхронизацию
                      базовых компонентов и их реализацию. В состоянии читать ассемблерный код. Разбирается в работе сетей,
                      сетевых протоколах и программировании на уровне сокетов.
Уровень 3: Понимает полный стек программирования, средства технического обеспечения (процессор, память, кэш,
                      прерывания, микрокод), двоичный код, ассемблирование, статическую и динамическую обработку,
                      компиляцию, интерпретацию, JIT-компиляцию, сборку мусора, кучу, стек, адресацию памяти...


Разработка программного обеспечения

* Управление версиями исходного кода

Уровень 0: Резервирование папок по дате.
   Уровень 1: VSS и основы CVS/SVN.
   Уровень 2: Опыт в использовании функций CVS и SVN. Знает, как произвести ветвление и слияние, используя
                      свойства установки патчей репозитария и т.д.
   Уровень 3: Знает распределенные системы контроля версий. Опробовал Bzr/Mercurial/Darcs/Git.

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

   Уровень 0: Знает только, как создать в интегрированной среде разработки.
   Уровень 1: Знает, как собрать систему из командной строки.
   Уровень 2: Может установить скрипт для создания базовой системы.
   Уровень 3: Может установить скрипт, чтобы создать систему, а также документацию, установщики, генерировать
                      информацию о версии, тегировать код в системе контроля за исходным кодом.

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

Уровень 0: Думает, что все тестирование является обязанностью тестера.
Уровень 1: Писал автоматизированные юнит-тесты и выбирает хорошие юнит-тесты для создаваемого кода.
Уровень 2: Писал код способом разработки через тестирование.
Уровень 3: Понимает и может установить автоматизированный функциональный, нагрузочный тесты и тесты
                     производительности и юзабилити.


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

* Декомпозиция проблемы

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

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

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

* Коммуникация

Уровень 0: Не может излагать мысли/идеи коллегам. Плохая орфография и грамматика.
Уровень 1: Коллеги могут понять сказанное. Хорошая орфография и грамматика.
Уровень 2: Способен эффективно общаться с коллегами.
Уровень 3: Способный понять и четко изложить мысли/проекты/идеи/спецификации и коммуницирует в соответствии
                      к контексту.

* Структура кода в файле

Уровень 0: Никаких признаков структуры в файле.
Уровень 1: Методы сгруппированы логически или с учетом удобства.
Уровень 2: Код сгруппирован по областям и хорошо прокомментирован со ссылками на другие файлы исходного кода.
Уровень 3: Файл имеет лицензионный заголовок, краткое описание, хорошо прокомментирован, последовательное
                      использование пробела. Файл должен выглядеть красиво.

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

Уровень 0: Не уделяет внимания организации кода между файлами.
Уровень 1: Взаимосвязанные файлы сгруппированы в папки.
Уровень 2: Каждый физический файл служит уникальной цели, например определению одного класса, реализации
                      одной функции и т.д.
Уровень 3: Организация кода на физическом уровне точно соответствует дизайну, и просмотр имен файлов и
                      распределения по папкам дает представление о дизайне.

* Организация дерева исходного кода

Уровень 0: Весь код находится в одной папке.
Уровень 1: Простейшее разпределение кода по логическим папкам.
Уровень 2: Нет циклических зависимостей, двоичные файлы, библиотеки, документация, файлы сборки, сторонний код
                       организованы в соответствующие папки.
Уровень 3: Физическое расположение дерева исходного кода повторяет логическую иерархию и организацию. Имена
                       каталогов и организация обеспечивают понимание дизайна системы.

* Читабельность кода

Уровень 0: Односложные имена.
Уровень 1: Хорошие имена для файлов, классовых переменных, методы и т.д.
Уровень 2: Нет длинных функции, комментарии объясняют необычный код, устраненные ошибки, допущения.
Уровень 3: Допущения кода проверены с помощью утверждений, поток кода естественный - нет глубокой вложенности
                      условий и методов.

* Безопасное программирование

Уровень 0: Не понимает его концепт.
Уровень 1: Проверяет все параметры и контролирует критические допущения в коде.
Уровень 2: Обязательно проверяет возвращаемые значения и обрабатывает исключения в местах возможного сбоя.
Уровень 3: Имеет собственную библиотеку для безопасного программирования, пишет юнит-тесты, симулирующие
                      сбои.

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

Уровень 0: Программирует, надеясь на отсутствие ошибок.
Уровень 1: Простейшая обработка ошибок в частях кода, где могут быть вызваны исключения и появиться ошибки.
Уровень 2: Удостоверяется, что после ошибок и исключений программа остается в хорошем состоянии; ресурсы,
                      соединения и память должным образом освобождаются.
Уровень 3: Программирует так, чтобы обнаружить ошибки заблаговременно, поддерживает единую стратегию
                      обработки исключений на всех уровнях кода, разрабатывает принципы обработки исключений для всей
                      системы.

* Интегрированная среда разработки (ИСР)

Уровень 0: Использует ИСР главным образом для редактирования текста.
Уровень 1: Знает возможности интерфейса, в состоянии эффективно использовать меню ИСР.
Уровень 2: Знает горячие клавиши для наиболее часто используемых операций.
Уровень 3: Писал пользовательские макросы.

* Интерфейс программирования приложений (API)

Уровень 0: Вынужден часто обращаться к документации.
Уровень 1: Помнит наиболее часто используемые API.
Уровень 2: Обширное и глубокое знание API.
Уровень 3: Писал библиотеки-надстройки над API для упрощения часто используемых задач и восполнения пробелов
                      в API.

* Фреймворки

Уровень 0: Не использовал никаких фреймворков вне базовой платформы.
Уровень 1: Слышал о популярных доступных для платформы фреймворках, но не использовал их.
Уровень 2: Имеет опыт работы с более чем одним фреймворком и хорошо разбирается в идиомах фреймворков.
Уровень 3: Является автором фреймворка.

* Требования

Уровень 0: Понимает изложенные требования и программирует с учетом спецификации.
Уровень 1: Задает вопросы относительно недостающих случаев в спецификации.
Уровень 2: Понимает всю картину и находит области, которые должны быть включены в спецификацию.
Уровень 3: Способный предложить лучшие альтернативы и следовать данным требованиям на основе опыта.

* Создание скриптов

Уровень 0: Отсутствует знание скриптовых инструментов.
Уровень 1: Пакетные файлы / скрипты оболочки.
Уровень 2: Perl / Python / Ruby / VBScript / Powershell
Уровень 3: Писал и публиковал повторно используемый код.

* Базы данных

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


Опыт

* Языки с опытом использования

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

* Платформы с опытом использования

Уровень 0: 1
Уровень 1: 2-3
Уровень 2: 4-5
Уровень 3: 6+

* Годы профессионального опыта

Уровень 0: 1
Уровень 1: 2-5
Уровень 2: 6-9
Уровень 3: 10+

* Знания сферы деятельности

Уровень 0: Не имеет знаний в данной сфере деятельности.
Уровень 1: Работал над по крайней мере одним продуктом в сфере деятельности.
Уровень 2: Работал над множеством продуктов в данной сфере деятельности.
Уровень 3: Эксперт в данной области. Разработал и реализовал несколько продуктов/решений в домене. Хорошо
                      знаком со стандартными условиями и протоколами, используемыми в домене.


Знание

* Знание инструментария

Уровень 0: Знания ограничены основной средой разработки (VS.Net, Eclipse и т.д.)
Уровень 1: Знает о некоторых альтернативах популярным и стандартным инструментариям.
Уровень 2: Хорошее знание редакторов, отладчиков, интегрированных сред разработки, альтернатив с открытым
                      исходным кодом и т.д. Например, знает большинство инструментов из списка Скотта Хансельмана.
                      Использовал инструменты ORM.
Уровень 3: Сам писал инструменты и скрипты. Дополнительный бонус, если они были опубликованы.

* Языки 

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

* Знание кодовой базы

Уровень 0: Никогда не смотрел в кодовую базу.
Уровень 1: Элементарные знания  о расположении кода и сборке системы.
Уровень 2: Хорошее практическое знание кодовой базы, реализовал несколько исправлений ошибок и возможно
                      некоторые маленькие функции.
Уровень 3: Реализовал множество больших опций в кодовой базе и может легко представить изменения, требуемые
                      для большинства функций или исправления ошибок.

* Знание развивающихся технологий

Уровень 0: Не слышал о новых технологиях.
Уровень 1: Слышал о новейших технологиях в своей сфере.
Уровень 2: Скачивал alpha/preview/CTP/beta-версии и читал некоторые статьи и руководства.
Уровень 3: Запускал предварительные версии и сам создал что-то на их основе и как бонус предоставил
                      в пользование остальным.

* Внутреннее устройство платформы

Уровень 0: Отсутствует знание внутреннего устройства платформы.
Уровень 1: Элементарное знание внутреннего устройства платформы.
Уровень 2: Глубокое знание внутреннего устройства платформы и способность представить, как платформа принимает
                      программу и преобразует ее в исполняемый код.
Уровень 3: Писал инструменты для улучшения или получения информацию о внутренней работе платформы.
                      Например, дизассемблеры, декомпиляторы, отладчики и т.д.

* Книги

Уровень 0: Изданные серии, серии для изучения за 21 день или за 24 часа, серии для чайников...
Уровень 1: - Стив Макконнелл. Совершенный код.
                      - Стив Круг. Не заставляйте меня думать!
                      - Дж. Фридл. Регулярные выражения.
Уровень 2: - Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес. Приемы объектно-ориентированного проектирования.
                        Паттерны проектирования
.
                      - Т. Демарко, Т.Листер. Человеческий фактор: успешные проекты и команды.
                      - Дж. Бентли. Жемчужины программирования.
                      - Ст. Скиена. Разработка алгоритмов.
                      - Э.Хант, Д. Томас. Программист-прагматик.
                      - Ф. Брукс. Мифический человекомесяц.
Уровень 3: - Х. Абельсон, Дж. Дж. Сассман. Структура и интерпретация компьютерных программ.
                      - Peter van Roy, Seif Haridi. Concepts, Techniques, and Models of Computer Programming.
                      - Д. Кнут. Искусство программирования.
                 - К. Дж. Дейт. Введение в системы баз данных
                      - Лео Броуди. Способ мышления - форт.
                 - Daniel P. Friedman, Matthias Felleisen. The Little Schemer.

* Блоги

Уровень 0: Слышал о них, но никогда не тратил на них время.
Уровень 1: Читает блоги о технологиях/программировании/разработке программного обеспечения  и регулярно слушает
                      подкасты.
Уровень 2: Ведет блог с набором ссылок на полезные статьи и инструментарии.
Уровень 3: Ведет блог, в котором публикует собственные взгляды и мысли о программировании.
Tags: информатика, образование
Subscribe

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 1 comment