├── 1000043489.jpg ├── 1000234826.jpg ├── 1001354127.jpg ├── 1001969331.jpg ├── README.md └── partII.md /1000043489.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omreps/programmer-competency-matrix/2178e92ab74b200f50764484c08aaf482f4fda66/1000043489.jpg -------------------------------------------------------------------------------- /1000234826.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omreps/programmer-competency-matrix/2178e92ab74b200f50764484c08aaf482f4fda66/1000234826.jpg -------------------------------------------------------------------------------- /1001354127.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omreps/programmer-competency-matrix/2178e92ab74b200f50764484c08aaf482f4fda66/1001354127.jpg -------------------------------------------------------------------------------- /1001969331.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omreps/programmer-competency-matrix/2178e92ab74b200f50764484c08aaf482f4fda66/1001969331.jpg -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | **Матрица компетентности программиста ч.I.** 3 | 4 |
Область 7 | | 8 |Уровень 9 | | 10 |11 | | 12 |13 | | 14 |15 | | 16 |
19 | | 20 |2^n (Уровень 0) 21 | | 22 |n^2 (Уровень 1) 23 | | 24 |n (Уровень 2) 25 | | 26 |log(n) (Уровень 3) 27 | | 28 |
Теория 31 | | 32 |33 | | 34 |35 | | 36 |37 | | 38 |39 | | 40 |
Структуры данных 43 | | 44 |Не понимает разницы между массивом и связным списком. 45 | | 46 |Может объяснить и использовать на практике массивы, связные списки, словари и т.д. 47 | | 48 |Понимает плюсы и минусы использования тех или иных базовых структур данных (размер памяти, время выполнения операций с данными, в чем разница между массивами и связными списками в этом плане).
49 | 50 | Может объяснить как реализовать хэш-таблицы и как обработать коллизии. Приоритетные очереди и способы их реализации, и т.д. 51 | |
52 | Знание сложных структур данных, таких как B-дерево, Биномиальная куча и Фибоначчиевская куча, АВЛ-дерево, Красно-чёрное дерево, Косое дерево, Список с пропусками, TRIE-структуры и т.д. 53 | | 54 |
Алгоритмы 57 | | 58 |Не может найти среднее значение массива чисел. (Тяжело поверить, но встречаются и такие кандидаты на собеседовании.) 59 | | 60 |Базовые методы сортировки и поиска. Обход и поиск в структурах данных. 61 | | 62 |Деревья, Графы, "простой путь" и "разделяй и властвуй"-алгоритмы. Понимает ассоциацию уровней этой матрицы. 63 | | 64 |Может распознать и написать решение динамическим программированием, хорошо знает алгоритмы на графах, хорошо знает численные методы, может идентифицировать проблемы класса NP. 65 | | 66 |
Системное программи-
69 | 70 | рование 71 | |
72 | Не знает что такое компилятор, компоновщик или интерпретатор. 73 | | 74 |Базовое понимание компиляторов, компоновщиков и интерпретаторов.
75 | 76 | Понимает, что такое ассемблерный код и как работают программы на уровне железа. Небольшое понимание виртуальной памяти и пэйджинга. 77 | |
78 | Понимает чем отличается kernel mode от user mode, что такое мульти-трединг. Знает способы синхронизации и как реализованы примитивы синхронизации. Может читать ассемблерный код.
79 | 80 | Понимает, как работают сети, сетевые протоколы и может реализовать передачу данных через сокеты. 81 | |
82 | Понимает как работает весь "программный стэк": железо (CPU + Память + Кэш + Прерывания + микрокоды), двоичный код, ассемблер, статическая и динамическая линковка, компиляция, интерпретация, JIT-компиляция, сборка мусора, куча, стэк, адресация памяти. 83 | | 84 |
Навыки 87 | | 88 |89 | | 90 |91 | | 92 |93 | | 94 |95 | | 96 |
Контроль версий исходников 99 | | 100 |Бэкап исходников в папку с датой бэкапа. 101 | | 102 |VSS и основы CVS/SVN в качестве пользователя. 103 | | 104 |Специалист по возможностям CVS и SVN. Знает как создать, разветвить, слить репозитарий и т.д. 105 | | 106 |Знает распределенные системы VCS. Работает с Mercurial/Darcs/Git 107 | | 108 |
Автоматиза-
111 | 112 | ция build'ов 113 | |
114 | Знает как запустить Build из среды программирования. 115 | | 116 |Умеет билдить из командной строки. 117 | | 118 |Может настроить скрипт для сборки основной системы. 119 | | 120 |Может настроить скрипт для сборки системы и документации, для сборки инсталляторов.Сделает и добавит код скрипта в систему контроля версий исходников. 121 | | 122 |
Автоматизация тестирования 125 | | 126 |Считает, что тестирование - это работа тестеров. 127 | | 128 |Может создавать свои хорошие юнит-тесты для кода, который пишет в настоящее время. 129 | | 130 |Пишет код в стиле Test-driven Development (TDD). 131 | | 132 |Может создавать автоматические тесты на функционал, пользовательский интерфейс и загрузку/производительность. 133 | | 134 |
Програм-
137 | 138 | мирование 139 | |
140 | 141 | | 142 |143 | | 144 |145 | | 146 |147 | | 148 |
Декомпози-
151 | 152 | ция задачи 153 | |
154 | Просто последовательные строчки.
155 | 156 | Copy/Paste - для повторного использования кода. 157 | |
158 | Может разбивать решение задачи на несколько функций. 159 | | 160 |Способен создавать многократно используемые функции/объекты, которые решают общие задачи. 161 | | 162 |Использует соответствующие структуры данных и алгоритмы. Создает общий/объектно-ориентированный код, который инкапсулирует те условия задачи, которые могут быть изменены. 163 | |
Декомпози-
165 | 166 | ция системы 167 | |
168 | Не способен думать о системе более сложной, чем один класс или файл. 169 | | 170 |Может произвести декомпозицию задачи и спроектировать систему в пределах одной платформы или технологии. 171 | | 172 |Может спроектировать систему, которая охватывает несколько технологий/платформ. 173 | | 174 |Может визуализировать и проектировать сложные системы с несколькими линейками продуктов, учитывать интеграциею с внешними системами. Также должен уметь проектировать системы поддержки работы: мониторинг, генерация отчетов, аварийные переходы на использование запасных ресурсов. 175 | | 176 |
Общение 179 | | 180 |Не может выразить свои мысли/идеи. Плохо с правописанием и грамматикой. 181 | | 182 |Его понимают. Хорошие правописание и грамматика. 183 | | 184 |Может эффективно общаться. 185 | | 186 |Может понимать и объяснять мысли/дизайн/
187 | 188 | идеи/специфику в точно выраженной форме. В общении соответствует ситуации. 189 | |
190 |
Организация кода в файле 193 | | 194 |Нет четкой организации кода в файле. 195 | | 196 |Методы сгруппированны логически и по вызовам. 197 | | 198 |Код разделен на регионы, имеет хорошие комментарии, в т.ч. со ссылками на другие файлы исходников. 199 | | 200 |Файл имеет разделы "license header", "summary", хорошие комментарии, непротиворечивую расстановку пробелов и табуляции. Файл должен выглядеть красиво. 201 | | 202 |
Организация кода между файлами 205 | | 206 |Не приходит в голову мысль четко организовать код с помощью разделения на файлы. 207 | | 208 |Похожие файлы группируются в папку. 209 | | 210 |Каждый физический файл предназначен для чего-то одного, например, служит для объявления одного класса или для реализации одного функционала и т.д. 211 | | 212 |Организация кода на физическом уровне точно соответствует проекту. Глядя на имена файлов и структуру папок, можно понять как спроектирована данная реализация. 213 | | 214 |
Организация дерева исходников 217 | | 218 |Все в одной папке. 219 | | 220 |Простое разделение кода в логические подкаталоги. 221 | | 222 |Нет "круговых" зависимостей. Бинарники, либы, документация, билды, сторонний код - все разложено в соответствующие папки. 223 | | 224 |Структура дерева исходного кода соответствует логической иерархии и организации кода в проекте.
225 | 226 | Глядя на имена файлов и структуру папок, можно понять как спроектирована данная система. 227 | |
228 |
Читабель-
231 | 232 | ность кода 233 | |
234 | Односложные имена. 235 | | 236 |Хорошие имена файлов, переменных, классов, методов и т.д. 237 | | 238 |Нет длинных функций, а нестандартный код, багфиксы и допущения в коде поясняются комментариями. 239 | | 240 |Допущения в коде сопровождаются assert'ами. Поток операций в коде естественный - нет глубокой вложенности условий или методов. 241 | | 242 |
Безопасное программи-
245 | 246 | рование (defensive coding) 247 | |
248 | Не понимает данной концепции. 249 | | 250 |Проверяет все аргументы и ставит assert'ы на критические допущения в коде. 251 | | 252 |Убеждается, что проверил возвращаемое значение и что обрабатывает исключения в потенциально бажном коде. 253 | | 254 |Имеет свою собственную библиотеку помогающую в безопасном программировании, пишет юнит-тесты которые эмулируют сбои. 255 | | 256 |
Обработка ошибок 259 | | 260 |Пишет код для "идеального" случая, когда все работает и нет сбоев. 261 | | 262 |Обработка ошибок в коде, который либо кидает исключение, либо генерирует ошибку. 263 | | 264 |Убеждается, что после того, как произошла ошибка/исключение, программа продолжает работать, а ненужные более ресурсы, коннекшоны и память были корректно освобождены обработчиком ошибки. 265 | | 266 |Пишет код так, чтобы определять возможные ошибки на раннем этапе, придерживается последовательной стратегии обработки исключений во всех слоях кода, разрабатывает общие принципы обработки исключений во всей системе. 267 | | 268 |
273 |
274 | 275 | _Замечание 1:_ 276 | 277 | Каждый следующий уровень включает в себя предыдущий , т.е. разработчик находящийся на уровне 3 должен удовлетворять критериям двух предыдущих уровней. 278 | 279 | _Замечание 2:_ 280 | 281 | Версия документа от 17.05.2013. О дополнениях, ошибках сообщайте в issues. Спасибо всем, кто помог сделать этот документ лучше! 282 | 283 | _Замечание 3:_ 284 | 285 | Эта перевод английской версии: [Programmer Competency Matrix](http://www.indiangeek.net/wp-content/uploads/Programmer%20competency%20matrix.htm) 286 | 287 | Вторая, еще более содержательная часть таблицы - **[Матрица компетентности программиста ч.II.>>](partII.md)** 288 | 289 | -------------------------------------------------------------------------------- /partII.md: -------------------------------------------------------------------------------- 1 | 2 | **Матрица компетентности программиста ч.II.** 3 | 4 |Область 7 | | 8 |Уровень 9 | | 10 |11 | | 12 |13 | | 14 |15 | | 16 |
19 | | 20 |2^n (Уровень 0) 21 | | 22 |n^2 (Уровень 1) 23 | | 24 |n (Уровень 2) 25 | | 26 |log(n) (Уровень 3) 27 | | 28 |
Програм-
31 | 32 | мирование 33 | |
34 | 35 | | 36 |37 | | 38 |39 | | 40 |41 | | 42 |
Среда программиро-
45 | 46 | вания (IDE) 47 | |
48 | В основном использует IDE для редактирования текста. 49 | | 50 |Способен эффективно пользоваться меню в IDE. Знает некоторые тонкости среды. 51 | | 52 |Для самых используемых функций среды знает горячие клавиши. 53 | | 54 |Написал свои макросы. 55 | | 56 |
API 59 | | 60 |Часто нуждается в обращениях к документации. 61 | | 62 |Помнит самые часто используемые API. 63 | | 64 |Обширные и глубокие знания
65 | 66 | API. 67 | |
68 | Написал библиотеки, которые оборачивают API, для упрощения задач, которые наиболее часто встречаются. Эти библиотеки также часто восполняют пробелы в API. 69 | | 70 |
Фреймфорки 73 | | 74 |Не использует никаких фреймверков за рамками основной платформы. 75 | | 76 |Знает, но не использует популярные фреймворки, доступные для его платформы. 77 | | 78 |Профессионально пользовался более чем одним фреймворком и хорошо разбирается в идиомах фреймворков. 79 | | 80 |Является автором фреймворка. 81 | | 82 |
Требования 85 | | 86 |Понимает выставленные требования и пишет код в соответствии со спецификацией. 87 | | 88 |Задает вопросы касающиеся не рассмотренных в спецификации случаев. 89 | | 90 |Понимает картину в целом и предлагает дополнительные аспекты, которые должны быть описаны в спецификации. 91 | | 92 |Может предложить лучшие альтернативы и следовать выставленным требованиям, основываясь на собственном опыте. 93 | | 94 |
Скрипты 97 | | 98 |Отсутствует знание скриптовых инструментов. 99 | | 100 |Batch-файлы/shell. 101 | | 102 |Perl/Python/Ruby/VBScript/
103 | 104 | Powershell. 105 | |
106 | Писал и публиковал повторно используемые скрипты. 107 | | 108 |
Базы Данных 111 | | 112 |Думает, что Excel - это база данных. 113 | | 114 |Знает основы баз данных, нормализацию, ACID, транзакции и может написать простые select'ы. 115 | | 116 |Может спроектировать хорошие нормализованные схемы БД, с учетом запросов, которые будут выполняться; умело использует представления, хранимые процедуры, триггеры и собственные типы данных. Понимает разницу между кластеризованными и не-кластеризованными индексами. Специалист в использовании ORM -тулзов. 117 | | 118 |Может осуществлять администрирование БД, оптимизацию производительности БД, индексную оптимизацию, писать сложные select'ы, может заменить использование курсора вызовами функций sql, понимает как данные хранятся внутри, как хранятся индексы, имеет представление о том, как зеркалятся и реплицируются БД и т.д. Понимает как работает двухфазный commit.
119 | 120 | 121 | |
122 |
Опыт 125 | | 126 |127 | | 128 |129 | | 130 |131 | | 132 |133 | | 134 |
Языки и профессиона-
137 | 138 | льный опыт 139 | |
140 | Императивные или объектно-ориентированные программирования 141 | | 142 |Императивные, объектно-ориентиро-
143 | 144 | ванные и декларативные (SQL) языки программирования. Дополнительный бонус - если понимает разницу между статической и динамической, слабой и строгой типизацией, 145 | 146 | статически выводимыми типами. 147 | |
148 | Функциональные языки программирования. Дополнительный бонус - если знает, что такое "ленивые вычисления", каррирование, продолжения. 149 | | 150 |Конкурентные
151 | 152 | (Erlang, Oz) и логические (Prolog). 153 | |
154 |
Годы профессиональ-
157 | 158 | ного опыта 159 | |
160 | 1 161 | | 162 |2-5 163 | | 164 |6-9 165 | | 166 |10+ 167 | | 168 |
Годы профессиональ-
171 | 172 | ного опыта конкретной платформы 173 | |
174 | 1 175 | | 176 |2-3 177 | | 178 |4-5 179 | | 180 |6+ 181 | | 182 |
Знание предметной области 185 | | 186 |Не знает о понятии "предметная область". 187 | | 188 |Работал хотя бы над одним продуктом в своей предметной области. 189 | | 190 |Работал над несколькими продуктами в одной и той же предметной области. 191 | | 192 |Эксперт своей предметной области, проектировал и реализовывал несколько продуктов/решений в ней, хорошо разбирается в ее сущностях и протоколах. 193 | | 194 |
Знания 197 | | 198 |199 | | 200 |201 | | 202 |203 | | 204 |205 | | 206 |
Инструментарии 209 | | 210 |Ограничены используемой IDE (VS.Net, Eclipse и т.д.) 211 | | 212 |Знает о некоторых альтернативах популярным стандартным инструментариям. 213 | | 214 |Хорошие знания редакторов кода, отладчиков, различных IDE, open-source альтернативах и т.д. (Например, это может быть кто-то, кто знает большинство тулзов из списка Скота Ганзельмана.)
215 | 216 | Использует ORM-тулзы. 217 | |
218 | Написал свои инструментарии и скрипты, дополнительный плюс - если эти скрипты были опубликованы. 219 | | 220 |
Code base (кодовая база) 223 | | 224 |Никогда не смотрел кодовую базу. 225 | | 226 |Имеет общее представление о расположении кода и о том, как его собрать. 227 | | 228 |Хорошие рабочие знания кодовой базы, реализовывал несколько багфиксов и, может быть, некоторые маленькие фичи. 229 | | 230 |Реализовал несколько больших фич в кодовой базе, может легко описать изменения, требуемые для реализации большинства фич или багфисков. 231 | | 232 |
Знание новейших технологий 235 | | 236 |Не слышал о новейших технологиях. 237 | | 238 |Слышал о новейших технологиях в своей области. 239 | | 240 |Скачивал alpha/preview/CTP
241 | 242 | /beta-версии и читал некоторые статьи и руководства на эти темы. 243 | |
244 | Пробовал сделать что-либо сам. Используя preview-версию сбилдил свою программу. Дополнительный плюс - если сделал свое решение доступным для других. 245 | | 246 |
Знание внутренних аспектов платформы 249 | | 250 |Нулевые знания внутренних аспектов платформы. 251 | | 252 |В основном, знает как работает платформа внутри. 253 | | 254 |Имеет глубокие познания внутренних аспектов платформы и может обрисовать, как платформа исполняет программный код. 255 | | 256 |Написал свои тулзы для расширения возможностей платформы или для извлечения дополнительной информации о работе платформы. Например расширения дизассемблера, декомпилятора, отладчика и т.д. 257 | | 258 |
Книги 261 | | 262 |
263 | ![]() 265 | Серии книг 266 | 267 | "... за 21 день" 268 | 269 | "... за 24 часа" 270 | 271 | "... для чайников". 272 | |
273 |
274 | ![]() 276 | Совершенный код 277 | 278 | Не заставляйте меня думать! 279 | 280 | Регулярные выражения 281 | |
282 |
283 | ![]() 285 | Человеческий фактор: успешные проекты и команды 286 | 287 | Приемы объектно-ориентиро-ванного проектирования. Паттерны проектирования 288 | 289 | Жемчужины проектирования 290 | 291 | Руководство по разработке алгоритмов 292 | 293 | Программист-прагматик 294 | 295 | Мифический человеко - месяц 296 | |
297 |
298 | ![]() 300 | Искусство программирования 301 | 302 | Структура и интерпретация компьютерных программ 303 | 304 | Concepts Techniques and Models of Computer Programming 305 | 306 | Database systems , by C. J Date 307 | 308 | Thinking Forth 309 | 310 | Little Schemer 311 | |
312 |
Блоги 315 | | 316 |Слышал о блогах, но не уделял им внимания. 317 | | 318 |Читает технические блоги, блоги о программировании и разработке ПО и регулярно слушает подкасты. 319 | | 320 |Ведет ссылочный блог, содержащий коллекции ссылок на полезные статьи и тулзы, которые [ссылки] он собирает. 321 | | 322 |Ведет блог, в котором содержится его собственные понимание вопросов программирования. 323 | | 324 |
330 |
331 | 332 | _Замечание 1:_ 333 | 334 | Каждый следующий уровень включает в себя предыдущий , т.е. разработчик находящийся на уровне 3 должен удовлетворять критериям двух предыдущих уровней. 335 | 336 | _Замечание 2:_ 337 | 338 | Версия документа от 17.05.2013. О дополнениях, ошибках сообщайте в issues. Спасибо всем, кто помог сделать этот документ лучше! 339 | 340 | _Замечание 3:_ 341 | 342 | Эта перевод английской версии: [Programmer Competency Matrix](http://www.indiangeek.net/wp-content/uploads/Programmer%20competency%20matrix.htm) 343 | 344 | Первая, более теоретическая часть таблицы - **[Матрица компетентности программиста ч.I.>>](README.md)** 345 | 346 | --------------------------------------------------------------------------------