├── 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 | 5 | 6 | 8 | 10 | 12 | 14 | 16 | 17 | 18 | 20 | 22 | 24 | 26 | 28 | 29 | 30 | 32 | 34 | 36 | 38 | 40 | 41 | 42 | 44 | 46 | 48 | 52 | 54 | 55 | 56 | 58 | 60 | 62 | 64 | 66 | 67 | 68 | 72 | 74 | 78 | 82 | 84 | 85 | 86 | 88 | 90 | 92 | 94 | 96 | 97 | 98 | 100 | 102 | 104 | 106 | 108 | 109 | 110 | 114 | 116 | 118 | 120 | 122 | 123 | 124 | 126 | 128 | 130 | 132 | 134 | 135 | 136 | 140 | 142 | 144 | 146 | 148 | 149 | 150 | 154 | 158 | 160 | 162 | 164 | 168 | 170 | 172 | 174 | 176 | 177 | 178 | 180 | 182 | 184 | 186 | 190 | 191 | 192 | 194 | 196 | 198 | 200 | 202 | 203 | 204 | 206 | 208 | 210 | 212 | 214 | 215 | 216 | 218 | 220 | 222 | 224 | 228 | 229 | 230 | 234 | 236 | 238 | 240 | 242 | 243 | 244 | 248 | 250 | 252 | 254 | 256 | 257 | 258 | 260 | 262 | 264 | 266 | 268 | 269 |
Область 7 | Уровень 9 | 11 | 13 | 15 |
19 | 2^n (Уровень 0) 21 | n^2 (Уровень 1) 23 | n (Уровень 2) 25 | log(n) (Уровень 3) 27 |
Теория 31 | 33 | 35 | 37 | 39 |
Структуры данных 43 | Не понимает разницы между массивом и связным списком. 45 | Может объяснить и использовать на практике массивы, связные списки, словари и т.д. 47 | Понимает плюсы и минусы использования тех или иных базовых структур данных (размер памяти, время выполнения операций с данными, в чем разница между массивами и связными списками в этом плане). 49 |

50 | Может объяснить как реализовать хэш-таблицы и как обработать коллизии. Приоритетные очереди и способы их реализации, и т.д. 51 |

Знание сложных структур данных, таких как B-дерево, Биномиальная куча и Фибоначчиевская куча, АВЛ-дерево, Красно-чёрное дерево, Косое дерево, Список с пропусками, TRIE-структуры и т.д. 53 |
Алгоритмы 57 | Не может найти среднее значение массива чисел. (Тяжело поверить, но встречаются и такие кандидаты на собеседовании.) 59 | Базовые методы сортировки и поиска. Обход и поиск в структурах данных. 61 | Деревья, Графы, "простой путь" и  "разделяй и властвуй"-алгоритмы. Понимает ассоциацию уровней этой матрицы. 63 | Может распознать и написать решение динамическим программированием, хорошо знает алгоритмы на графах, хорошо знает численные методы, может идентифицировать проблемы класса NP. 65 |
Системное программи- 69 |

70 | рование 71 |

Не знает что такое компилятор, компоновщик или интерпретатор. 73 | Базовое понимание компиляторов, компоновщиков и интерпретаторов. 75 |

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

Понимает чем отличается kernel mode от user mode, что такое мульти-трединг. Знает способы синхронизации и как реализованы примитивы синхронизации. Может читать ассемблерный код. 79 |

80 | Понимает, как работают сети, сетевые протоколы и может реализовать передачу данных через сокеты. 81 |

Понимает как работает весь "программный стэк": железо (CPU + Память + Кэш + Прерывания + микрокоды), двоичный код, ассемблер, статическая и динамическая линковка, компиляция, интерпретация, JIT-компиляция, сборка мусора, куча, стэк, адресация памяти. 83 |
Навыки 87 | 89 | 91 | 93 | 95 |
Контроль версий исходников 99 | Бэкап исходников в папку с датой бэкапа. 101 | VSS и основы CVS/SVN в качестве пользователя. 103 | Специалист по возможностям CVS и SVN. Знает как создать, разветвить, слить репозитарий и т.д. 105 | Знает распределенные системы VCS. Работает с Mercurial/Darcs/Git 107 |
Автоматиза- 111 |

112 | ция build'ов 113 |

Знает как запустить Build из среды программирования. 115 | Умеет билдить из командной строки. 117 | Может настроить скрипт для сборки основной системы. 119 | Может настроить скрипт для сборки системы и документации, для сборки инсталляторов.Сделает и добавит код скрипта в систему контроля версий исходников. 121 |
Автоматизация тестирования 125 | Считает, что тестирование - это работа тестеров. 127 | Может создавать свои хорошие юнит-тесты для кода, который пишет в настоящее время. 129 | Пишет код в стиле Test-driven Development (TDD). 131 | Может создавать автоматические тесты на функционал, пользовательский интерфейс и загрузку/производительность. 133 |
Програм- 137 |

138 | мирование 139 |

141 | 143 | 145 | 147 |
Декомпози- 151 |

152 | ция задачи 153 |

Просто последовательные строчки. 155 |

156 | Copy/Paste - для повторного использования кода. 157 |

Может разбивать решение задачи на несколько функций. 159 | Способен создавать многократно используемые функции/объекты, которые решают общие задачи. 161 | Использует соответствующие структуры данных и алгоритмы. Создает общий/объектно-ориентированный код, который инкапсулирует те условия задачи, которые могут быть изменены. 163 |
Декомпози- 165 |

166 | ция системы 167 |

Не способен думать о системе более сложной, чем один класс или файл. 169 | Может произвести декомпозицию задачи и спроектировать систему в пределах одной платформы или технологии. 171 | Может спроектировать систему, которая охватывает несколько технологий/платформ. 173 | Может визуализировать и проектировать сложные системы с несколькими линейками продуктов, учитывать интеграциею с внешними системами. Также должен уметь проектировать системы поддержки работы: мониторинг, генерация отчетов, аварийные переходы на использование запасных ресурсов. 175 |
Общение 179 | Не может выразить свои мысли/идеи. Плохо с правописанием и грамматикой. 181 | Его понимают. Хорошие правописание и грамматика. 183 | Может эффективно общаться. 185 | Может понимать и объяснять мысли/дизайн/  187 |

188 | идеи/специфику в точно выраженной  форме. В общении соответствует ситуации. 189 |

Организация кода в файле 193 | Нет четкой организации кода в файле. 195 | Методы сгруппированны логически и по вызовам. 197 | Код разделен на регионы,  имеет хорошие комментарии, в т.ч. со ссылками на другие файлы исходников. 199 | Файл имеет разделы "license header", "summary", хорошие комментарии, непротиворечивую расстановку пробелов и табуляции. Файл должен выглядеть красиво. 201 |
Организация кода между файлами 205 | Не приходит в голову мысль четко организовать код с помощью разделения на файлы. 207 | Похожие файлы группируются в папку. 209 | Каждый физический файл предназначен для чего-то одного, например, служит для объявления одного класса или для реализации одного функционала и т.д. 211 | Организация кода на физическом уровне точно соответствует проекту. Глядя на имена файлов и структуру папок, можно понять как спроектирована данная реализация. 213 |
Организация дерева исходников 217 | Все в одной папке. 219 | Простое разделение кода в логические подкаталоги. 221 | Нет "круговых" зависимостей. Бинарники, либы, документация, билды, сторонний код - все разложено в соответствующие папки. 223 | Структура дерева исходного кода соответствует логической иерархии и организации кода в проекте. 225 |

226 | Глядя на имена файлов и структуру папок, можно понять как спроектирована данная система. 227 |

Читабель- 231 |

232 | ность кода 233 |

Односложные имена. 235 | Хорошие имена файлов, переменных, классов, методов и т.д. 237 | Нет длинных функций, а нестандартный код, багфиксы и допущения в коде поясняются комментариями. 239 | Допущения в коде сопровождаются assert'ами. Поток операций в коде естественный - нет глубокой вложенности условий или методов. 241 |
Безопасное программи- 245 |

246 | рование (defensive coding) 247 |

Не понимает данной концепции. 249 | Проверяет все аргументы и ставит assert'ы на критические допущения в коде. 251 | Убеждается, что проверил возвращаемое значение и что обрабатывает исключения в потенциально бажном коде. 253 | Имеет свою собственную библиотеку помогающую в безопасном программировании, пишет юнит-тесты которые эмулируют сбои. 255 |
Обработка ошибок 259 | Пишет код для "идеального" случая, когда все работает и нет сбоев. 261 | Обработка ошибок в коде, который либо кидает исключение, либо генерирует ошибку. 263 | Убеждается, что после того, как произошла ошибка/исключение, программа продолжает работать, а ненужные более ресурсы, коннекшоны и память были корректно освобождены обработчиком ошибки.  265 | Пишет код так, чтобы определять возможные ошибки на раннем этапе,  придерживается последовательной стратегии обработки исключений во всех слоях кода, разрабатывает общие принципы обработки исключений во всей системе. 267 |
270 | 271 | 272 |

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 | 5 | 6 | 8 | 10 | 12 | 14 | 16 | 17 | 18 | 20 | 22 | 24 | 26 | 28 | 29 | 30 | 34 | 36 | 38 | 40 | 42 | 43 | 44 | 48 | 50 | 52 | 54 | 56 | 57 | 58 | 60 | 62 | 64 | 68 | 70 | 71 | 72 | 74 | 76 | 78 | 80 | 82 | 83 | 84 | 86 | 88 | 90 | 92 | 94 | 95 | 96 | 98 | 100 | 102 | 106 | 108 | 109 | 110 | 112 | 114 | 116 | 118 | 122 | 123 | 124 | 126 | 128 | 130 | 132 | 134 | 135 | 136 | 140 | 142 | 148 | 150 | 154 | 155 | 156 | 160 | 162 | 164 | 166 | 168 | 169 | 170 | 174 | 176 | 178 | 180 | 182 | 183 | 184 | 186 | 188 | 190 | 192 | 194 | 195 | 196 | 198 | 200 | 202 | 204 | 206 | 207 | 208 | 210 | 212 | 214 | 218 | 220 | 221 | 222 | 224 | 226 | 228 | 230 | 232 | 233 | 234 | 236 | 238 | 240 | 244 | 246 | 247 | 248 | 250 | 252 | 254 | 256 | 258 | 259 | 260 | 262 | 273 | 282 | 297 | 312 | 313 | 314 | 316 | 318 | 320 | 322 | 324 | 325 |
 Область 7 | Уровень 9 | 11 | 13 | 15 |
  19 | 2^n (Уровень 0) 21 | n^2 (Уровень 1) 23 | n (Уровень 2) 25 | log(n) (Уровень 3) 27 |
Програм- 31 |

32 | мирование 33 |

  35 |   37 |   39 |   41 |
Среда программиро- 45 |

46 | вания (IDE) 47 |

В основном использует IDE для редактирования текста. 49 | Способен эффективно пользоваться меню в IDE. Знает некоторые тонкости среды. 51 | Для самых используемых функций  среды знает горячие клавиши. 53 | Написал свои макросы. 55 |
API 59 | Часто нуждается в обращениях к документации. 61 | Помнит самые часто используемые API. 63 | Обширные и глубокие знания 65 |

66 | API. 67 |

Написал библиотеки, которые оборачивают API, для упрощения задач, которые наиболее часто встречаются. Эти библиотеки также часто восполняют пробелы в API. 69 |
Фреймфорки 73 | Не использует никаких фреймверков за рамками основной платформы. 75 | Знает, но не использует популярные фреймворки, доступные для его платформы. 77 | Профессионально пользовался более чем одним фреймворком и хорошо разбирается в идиомах фреймворков.  79 | Является автором фреймворка. 81 |
Требования 85 | Понимает выставленные требования и пишет код в соответствии со спецификацией. 87 | Задает вопросы касающиеся не рассмотренных в спецификации случаев. 89 | Понимает картину в целом и предлагает дополнительные аспекты, которые должны быть описаны в спецификации. 91 | Может предложить лучшие альтернативы и следовать выставленным требованиям, основываясь на собственном опыте. 93 |
Скрипты 97 | Отсутствует знание скриптовых инструментов. 99 | Batch-файлы/shell. 101 | Perl/Python/Ruby/VBScript/ 103 |

104 | Powershell. 105 |

Писал и публиковал повторно используемые скрипты. 107 |
Базы Данных 111 | Думает, что Excel - это база данных. 113 | Знает основы баз данных, нормализацию, ACID, транзакции и может написать простые select'ы. 115 | Может спроектировать хорошие нормализованные схемы БД, с учетом запросов, которые будут выполняться; умело использует представления, хранимые процедуры, триггеры и собственные типы данных. Понимает разницу между кластеризованными и не-кластеризованными индексами. Специалист в использовании  ORM -тулзов. 117 | Может осуществлять администрирование БД, оптимизацию производительности БД, индексную оптимизацию, писать сложные select'ы, может заменить использование курсора  вызовами функций sql, понимает как данные хранятся внутри, как хранятся индексы, имеет представление о том, как зеркалятся и реплицируются БД и т.д.  Понимает как работает двухфазный commit. 119 |

120 |   121 |

Опыт 125 |   127 |   129 |   131 |   133 |
Языки и профессиона- 137 |

138 | льный опыт 139 |

Императивные или объектно-ориентированные программирования 141 | Императивные, объектно-ориентиро- 143 |

144 | ванные и декларативные (SQL) языки программирования. Дополнительный бонус - если понимает разницу между статической и динамической, слабой и строгой типизацией,  145 |

146 | статически выводимыми типами. 147 |

Функциональные языки программирования. Дополнительный бонус - если знает, что такое "ленивые вычисления", каррирование, продолжения. 149 | Конкурентные  151 |

152 | (Erlang, Oz) и логические (Prolog). 153 |

Годы профессиональ- 157 |

158 | ного опыта 159 |

1 161 | 2-5 163 | 6-9 165 | 10+ 167 |
Годы профессиональ- 171 |

172 | ного опыта конкретной платформы 173 |

1 175 | 2-3 177 | 4-5 179 | 6+ 181 |
Знание предметной области 185 | Не знает о понятии "предметная область". 187 | Работал хотя бы над одним продуктом в своей предметной области. 189 | Работал над несколькими продуктами в одной и той же предметной области. 191 | Эксперт своей предметной области, проектировал и реализовывал несколько продуктов/решений в ней, хорошо разбирается в ее сущностях и протоколах. 193 |
Знания 197 |   199 |   201 |   203 |   205 |
Инструментарии 209 | Ограничены используемой IDE (VS.Net, Eclipse и т.д.) 211 | Знает о некоторых альтернативах популярным стандартным инструментариям. 213 | Хорошие знания редакторов кода, отладчиков, различных IDE, open-source альтернативах и т.д. (Например, это может быть кто-то, кто знает большинство тулзов из списка Скота Ганзельмана.) 215 |

216 | Использует ORM-тулзы. 217 |

Написал свои инструментарии и скрипты, дополнительный плюс - если эти скрипты были опубликованы. 219 |
Code base (кодовая база) 223 | Никогда не смотрел кодовую базу. 225 | Имеет общее представление о расположении кода и о том, как его собрать. 227 | Хорошие рабочие знания кодовой базы, реализовывал несколько багфиксов и, может быть, некоторые маленькие фичи. 229 | Реализовал несколько больших фич в кодовой базе, может легко описать изменения, требуемые для реализации большинства фич или багфисков. 231 |
Знание новейших технологий 235 | Не слышал о новейших технологиях. 237 | Слышал о новейших технологиях в своей области. 239 | Скачивал alpha/preview/CTP 241 |

242 | /beta-версии и читал некоторые статьи и руководства на эти темы. 243 |

Пробовал сделать что-либо сам. Используя preview-версию сбилдил свою программу. Дополнительный плюс - если сделал свое решение доступным для других. 245 |
Знание внутренних аспектов платформы 249 | Нулевые знания внутренних аспектов платформы. 251 | В основном, знает как работает платформа внутри. 253 | Имеет глубокие познания внутренних аспектов платформы и может обрисовать, как платформа исполняет программный код. 255 | Написал свои тулзы для расширения возможностей платформы или для извлечения дополнительной информации о работе платформы. Например расширения дизассемблера, декомпилятора, отладчика и т.д. 257 |
Книги 261 | 263 | 264 |

265 | Серии книг 266 |

267 | "... за 21 день" 268 |

269 | "... за 24 часа" 270 |

271 | "... для чайников". 272 |
274 | 275 |

276 | Совершенный код 277 |

278 | Не заставляйте меня думать! 279 |

280 | Регулярные выражения 281 |
283 | 284 |

285 | Человеческий фактор: успешные проекты и команды 286 |

287 | Приемы объектно-ориентиро-ванного проектирования. Паттерны проектирования 288 |

289 | Жемчужины проектирования 290 |

291 | Руководство по разработке алгоритмов 292 |

293 | Программист-прагматик 294 |

295 | Мифический человеко - месяц 296 |
298 | 299 |

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 |
Блоги 315 | Слышал о блогах, но не уделял им внимания. 317 | Читает технические блоги, блоги о программировании и разработке ПО и регулярно слушает подкасты. 319 | Ведет ссылочный блог, содержащий коллекции  ссылок на полезные статьи и тулзы, которые [ссылки] он собирает. 321 | Ведет блог, в котором содержится его собственные понимание вопросов программирования. 323 |
326 | 327 | 328 | 329 |

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 | --------------------------------------------------------------------------------