Область | Уровень | Комментарии | |||
2^n (Уровень 0) | n^2 (Уровень 1) | n (Уровень 2) | log(n) (Уровень 3) | ||
Теория | |||||
Структуры данных | Не осознаёт отличия между связным списком и массивом. | Может растолковать и применять на практике массивы, связные перечни, словари и т.д. | Осознаёт минусы и плюсы применения тех либо иных базисных структур данных (размер памяти, время исполнения операций с данными, в чем отличие между связными списками и массивами в этом замысле). Может растолковать как реализовать хэш-таблицы и как обработать коллизии. способы и Приоритетные очереди их реализации, и т.д. | Знание сложных структур данных, таких как B-дерево, Биномиальная куча и Фибоначчиевская куча, АВЛ-дерево, Красно-тёмное дерево, Косое дерево, Перечень с пропусками, TRIE-структуры и т.д. | |
Методы | Не имеет возможности отыскать среднее значение массива чисел. (Не легко поверить, но видятся и такие кандидаты на собеседовании.) | Базисные способы поиска и сортировки. поиск и Обход в структурах данных. | Деревья, Графы, несложный путь и разделяй и властвуй-методы. Осознаёт ассоциацию уровней данной матрицы. | Может выявить и написать ответ динамическим программированием, прекрасно знает методы на графах, прекрасно знает численные способы, может идентифицировать неприятности класса NP. | Трудиться с теми, кто имеет хороший рейтинг в TopCoder — это немыслимая успех! |
Системное программирование | Не знает что такое компилятор, компоновщик либо интерпретатор. | Базисное познание компиляторов, интерпретаторов и компоновщиков. Осознаёт, что такое ассемблерный код и как трудятся программы на уровне железа. Маленькое познание виртуальной памяти и пэйджинга. | Осознаёт чем отличается 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 обязан удовлетворять параметрам двух прошлых уровней.
Версия документа от 17.05.2013.
Вторая, еще более содержательная часть таблицы — Матрица компетентности программиста ч.II.
Британская версия: Programmer Competency Matrix
Презентация Клуба программистов