Матрица компетентности программиста / Programmer Competency Matrix


Каждый следующий уровень включает в себя предыдущий , т.е.
разработчик, находящийся на уровне 3,
удовлетворять критериям двух предыдущих уровней.

Русский Английский Удерживайте правую кнопку мыши над полем, чтобы увидеть перевод
Computer Science
Теория
2 n (Level 0)
2 n (Уровень 0)
n 2 (Level 1)
n 2 (Уровень 1)
n (Level 2)
n (Уровень 2)
log(n) (Level 3)
log(n) (Уровень 3)
Comments
Комментарии
data structures
структуры данных
Doesn't know the difference between Array and LinkedList
Не понимает разницы между массивом и связным списком.
Able to explain and use Arrays, LinkedLists, Dictionaries etc in practical programming tasks
Может объяснить и использовать на практике массивы, связные списки, словари и т.д.
Knows space and time tradeoffs of the basic data structures, Arrays vs LinkedLists, Able to explain how hashtables can be implemented and can handle collisions, Priority queues and ways to implement them etc.
Понимает плюсы и минусы использования тех или иных базовых структур данных (размер памяти, время выполнения операций с данными, в чем разница между массивами и связными списками в этом плане).Может объяснить как реализовать хэш-таблицы и как обработать коллизии. Приоритетные очереди и способы их реализации, и т.д.
Knowledge of advanced data structures like B-trees, binomial and fibonacci heaps, AVL/Red Black trees, Splay Trees, Skip Lists, tries etc.
Знание сложных структур данных, таких как B-дерево, Биномиальная куча и Фибоначчиевская куча, АВЛ-дерево, Красно-чёрное дерево, Косое дерево, Список с пропусками, TRIE-структуры и т.д.
algorithms
алгоритмы
Unable to find the average of numbers in an array (It's hard to believe but I've interviewed such candidates)
Не может найти среднее значение массива чисел. (Тяжело поверить, но встречаются и такие кандидаты на собеседовании.)
Basic sorting, searching and data structure traversal and retrieval algorithms
Базовые методы сортировки и поиска. Обход и поиск в структурах данных.
Tree, Graph, simple greedy and divide and conquer algorithms, is able to understand the relevance of the levels of this matrix.
Деревья, Графы, "простой путь" и "разделяй-и-властвуй" алгоритмы, понимает значимость уровней приведенной здесь матрицы.
Able to recognize and code dynamic programming solutions, good knowledge of graph algorithms, good knowledge of numerical computation algorithms, able to identify NP problems etc.
Может распознать и написать решение динамическим программированием, хорошо знает алгоритмы на графах, хорошо знает численные методы, может идентифицировать проблемы класса NP.
Working with someone who has a good topcoder ranking would be an unbelievable piece of luck!
Работать с теми, кто имеет хороший рейтинг в TopCoder - это невероятная удача!
systems programming
системное программирование
Doesn't know what a compiler, linker or interpreter is
Не знает что такое компилятор, линковщик или интерпретатор.
Basic understanding of compilers, linker and interpreters. Understands what assembly code is and how things work at the hardware level. Some knowledge of virtual memory and paging.
Базовое понимание компиляторов, линковщиков и интерпретаторов.Понимает, что такое ассемблерный код и как работают программы на уровне железа. Небольшое понимание виртуальной памяти и пэйджинга.
Understands kernel mode vs. user mode, multi-threading, synchronization primitives and how they're implemented, able to read assembly code. Understands how networks work, understanding of network protocols and socket level programming.
Понимает чем отличается kernel mode от user mode, что такое мульти-трединг, способы синхронизации и как реализованы примитивы синхронизации, может читать ассемблерный код. Понимает, как работают сети, сетевые протоколы и может реализовать передачу данных через сокеты.
Understands the entire programming stack, hardware (CPU + Memory + Cache + Interrupts + microcode), binary code, assembly, static and dynamic linking, compilation, interpretation, JIT compilation, garbage collection, heap, stack, memory addressing...
Понимает как работает весь "программный стэк": железо (CPU + Память + Кэш + Прерывания + микрокоды), двоичный код, ассемблер, статическая и динамическая линковка, копиляция, интерпретация, JIT-компиляция, сборка мусора, куча, стэк, адресация памяти…..
Software Engineering
Навыки:
2 n (Level 0)
2 n (Уровень 0)
n 2 (Level 1)
n 2 (Уровень 1)
n (Level 2)
n (Уровень 2)
log(n) (Level 3)
log(n) (Уровень 3)
Comments
Комментарии
source code version control
контроль версий исходников
Folder backups by date
Бэкап исходников в папку с датой бэкапа.
VSS and beginning CVS/SVN user
VSS и основы CVS/SVN в качестве пользователя
Proficient in using CVS and SVN features. Knows how to branch and merge, use patches setup repository properties etc.
Специалист по возможностям CVS and SVN. Знает как разветвить и слить, настроить репозитарий и т.д.
Knowledge of distributed VCS systems. Has tried out Bzr/Mercurial/Darcs/Git
Знает распределенные системы VCS. Пробовал Bzr/Mercurial/Darcs/Git
build automation
автоматизация build'ов
Only knows how to build from IDE
Знает как запустить Build из среды программирования.
Knows how to build the system from the command line
Умеет билдить из командной строки.
Can setup a script to build the basic system
Может настроить скрипт для сборки основной системы.
Can setup a script to build the system and also documentation, installers, generate release notes and tag the code in source control
Может настроить скрипт для сборки системы и документации, инсталляторов, генераторов "release notes" и добавит скрипт в систему контроля версий исходников.
automated testing
автоматизированное тестирование
Thinks that all testing is the job of the tester
Думает, что тестирование - это работа тестеров.
Has written automated unit tests and comes up with good unit test cases for the code that is being written
Написал автоматизированные юнит-тесты и может создавать свои хорошие юнит-тесты для кода, который пишет в настоящее время.
Has written code in TDD manner
Пишет код в стиле Test-driven Development (TDD).
Understands and is able to setup automated functional, load/performance and UI tests
Понимает и может настроить автоматические тесты на функционал, пользовательский интерфейс и загрузку/производительность.
Programming
Программирование:
2 n (Level 0)
2 n (Уровень 0)
n 2 (Level 1)
n 2 (Уровень 1)
n (Level 2)
n (Уровень 2)
log(n) (Level 3)
log(n) (Уровень 3)
Comments
Комментарии
problem decomposition
декомпозиция задачи
Only straight line code with copy paste for reuse
Просто последовательные строчки кода, а copy/paste -для повторного использования кода.
Able to break up problem into multiple functions
Может разбивать решение задачи на несколько функций.
Able to come up with reusable functions/objects that solve the overall problem
Способен создавать многократно используемые функции/объекты, которые решают общие задачи.
Use of appropriate data structures and algorithms and comes up with generic/object-oriented code that encapsulate aspects of the problem that are subject to change.
Использует соответствующие структуры данных и алгоритмы. Создает общий/объектно-ориентированный код, который инкапсулирует те условия задачи, которые могут быт изменены.
systems decomposition
декомпозиция системы
Not able to think above the level of a single file/class
Не способен думать о системе, сложнее одного класса или файла.
Able to break up problem space and design solution as long as it is within the same platform/technology
Может произвести декомпозицию задачи и спроектировать систему в пределах одной платформы или технологии.
Able to design systems that span multiple technologies/platforms.
Может спроектировать систему, которая охватывает несколько технологий/платформ.
Able to visualize and design complex systems with multiple product lines and integrations with external systems. Also should be able to design operations support systems like monitoring, reporting, fail overs etc.
Может визуализировать и проектировать сложные системы с несколькими линейками продуктов и интеграцией с внешними системами. Также должен уметь проектировать системы поддержки работы: мониторинг, генерация отчетов, аварийные переходы на использование запасных ресурсов.
communication
общение
Cannot express thoughts/ideas to peers. Poor spelling and grammar.
Не может выразить свои мысли/идеи. Плохо с правописанием и грамматикой.
Peers can understand what is being said. Good spelling and grammar.
Его понимают. Хорошие правописание и грамматика.
Is able to effectively communicate with peers
Может эффективно общаться.
Able to understand and communicate thoughts/design/ideas/specs in a unambiguous manner and adjusts communication as per the context
Может понимать и объяснять мысли/дизайн/идеи/специфику в точно выраженной форме, в общении соответствует ситуации.
This is an often under rated but very critical criteria for judging a programmer. With the increase in outsourcing of programming tasks to places where English is not the native tongue this issue has become more prominent. I know of several projects that failed because the programmers could not understand what the intent of the communication was.
Важность этого критерия для программиста часто недооценивают. С увеличением аутсорсинга разработки ПО в те страны, где английский не является родным языком, этот вопрос стал более актуальным. Я знаю несколько проектов, которые провалились потому, что программисты не могли понять смысл обсуждения.
code organization within a file
организация кода в файле
no evidence of organization within a file
Нет четкой организации в файле.
Methods are grouped logically or by accessibility
Методы сгрупированны логически и по вызовам.
Code is grouped into regions and well commented with references to other source files
Код разделен на регионы, имеет хорошие комментарии, в т.ч. со ссылками на другие файлы исходников.
File has license header, summary, well commented, consistent white space usage. The file should look beautiful.
Файл имеет разделы "license header", "summary", хорошие комментарии, непротиворечивую расстановку пробелов и табуляции. Файл должен выглядеть красиво.
2 n (Level 0)
2 n (Уровень 0)
n 2 (Level 1)
n 2 (Уровень 1)
n (Level 2)
n (Уровень 2)
log(n) (Level 3)
log(n) (Уровень 3)
Comments
Комментарии
code organization across files
организация кода между файлами
No thought given to organizing code across files
Не приходит в голову мысль четко организовать код с помощью разделения на файлы.
Related files are grouped into a folder
Похожие файлы группируются в папку.
Each physical file has a unique purpose, for e.g. one class definition, one feature implementation etc.
Каждый физический файл предназначен для чего-то одного, например, служит для объявления одного класса или для реализации одного функционала и т.д.
Code organization at a physical level closely matches design and looking at file names and folder distribution provides insights into design
Организация кода на физическом уровне точно соответствует проекту, и, глядя на имена файлов и структуру папок, можно понять как спроектирована данная реализация.
source tree organization
организация дерева исходников
Everything in one folder
Все в одной папке.
Basic separation of code into logical folders.
Простое разделение кода в логические подкаталоги.
No circular dependencies, binaries, libs, docs, builds, third-party code all organized into appropriate folders
Нет "круговых" зависимостей. Бинарники, либы, документация, билды, сторонний код -- все разложено в соответствующие папки.
Physical layout of source tree matches logical hierarchy and organization. The directory names and organization provide insights into the design of the system.
Структура дерева исходного кода соответствует логической иерархии и организации кода в проекте. Глядя на имена файлов и структуру папок, можно понять как спроектирована данная система.
The difference between this and the previous item is in the scale of organization, source tree organization relates to the entire set of artifacts that define the system.
Разница между этим пунктом и предыдущим состоит в масштабе организации. Организация дерева исходников относится к всему комплексу продуктов, которые определяют систему.
code readability
читабельность кода
Mono-syllable names
Односложные имена.
Good names for files, variables classes, methods etc.
Хорошие имена файлов, переменных, классов, методов и т.д.
No long functions, comments explaining unusual code, bug fixes, code assumptions
Нет длинных функций, а нестандартный код, багфиксы и допущения в коде поясняются комментариями.
Code assumptions are verified using asserts, code flows naturally - no deep nesting of conditionals or methods
Допущения в коде сопровождаются assert'ами, поток операций в коде естественный - нет глубокой вложенности условий или методов.
defensive coding
Безопасное программирование (defensive coding)
Doesn't understand the concept
Не понимает данной концепции.
Checks all arguments and asserts critical assumptions in code
Проверяет все аргументы и ставит assert'ы на критические допущения в коде.
Makes sure to check return values and check for exceptions around code that can fail.
Убеждается, что проверил возвращаемое значение и что обрабатывает исключения в потенциально бажном коде.
Has his own library to help with defensive coding, writes unit tests that simulate faults
Имеет свою собственную библиотеку помогающую в безопасном программировании, пишет юнит-тесты которые эмулируют сбои.
2 n (Level 0)
2 n (Уровень 0)
n 2 (Level 1)
n 2 (Уровень 1)
n (Level 2)
n (Уровень 2)
log(n) (Level 3)
log(n) (Уровень 3)
Comments
Комментарии
error handling
обработка ошибок
Only codes the happy case
Пишет код для "идеального" случая, когда все работает и нет сбоев.
Basic error handling around code that can throw exceptions/generate errors
Обработка ошибок в коде, который либо кидает исключение, либо генерирует ошибку.
Ensures that error/exceptions leave program in good state, resources, connections and memory is all cleaned up properly
Убеждается, что после того, как произошла ошибка/исключение, программа продолжает работать, а ненужные более ресурсы, коннекшоны и память были корректно освобождены обработчиком ошибки.
Codes to detect possible exception before, maintain consistent exception handling strategy in all layers of code, come up with guidelines on exception handling for entire system.
Пишет код так, чтобы определять возможные ошибки на раннем этапе, придерживается последовательной стратегии обработки исключений во всех слоях кода, разрабатывает общие принципы обработки исключений во всей системе.
IDE
среда программирования (IDE)
Mostly uses IDE for text editing
В основном использует IDE для редактирования текста.
Knows their way around the interface, able to effectively use the IDE using menus.
Способен эффективно пользоваться меню в IDE. Знает некоторые тонкости среды.
Knows keyboard shortcuts for most used operations.
Для самых используемых функций среды знает горячие клавиши.
Has written custom macros
Написал свои макросы.
API
API
Needs to look up the documentation frequently
Часто нуждается в обращениях к документации.
Has the most frequently used APIs in memory
Помнит самые часто используемые API.
Vast and In-depth knowledge of the API
Обширные и глубокие знания API.
Has written libraries that sit on top of the API to simplify frequently used tasks and to fill in gaps in the API
Написал библиотеки, которые оборачивают API, для упрощения задач, которые наиболее часто встречаются. Эти библиотеки также часто восполняют пробелы в API.
E.g. of API can be Java library, .net framework or the custom API for the application
Примером API может быть Java-библиотека, .Net фреймворк или API какого-либо приложения.
frameworks
фреймфорки>
Has not used any framework outside of the core platform
Не использует никаких фреймверков за рамками основной платформы.
Has heard about but not used the popular frameworks available for the platform.
Знает, но не использует популярные фреймворки, доступные для его платформы.
Has used more than one framework in a professional capacity and is well-versed with the idioms of the frameworks.
Профессионально пользовался более чем одним фреймворком и хорошо разбирается в идиомах фреймворков.
Author of framework
Является автором фреймворка.
2 n (Level 0)
2 n (Уровень 0)
n 2 (Level 1)
n 2 (Уровень 1)
n (Level 2)
n (Уровень 2)
log(n) (Level 3)
log(n) (Уровень 3)
Comments
Комментарии
requirements
требования
Takes the given requirements and codes to spec
Понимает выставленные требования и пишет код в соответствии со спецификацией.
Come up with questions regarding missed cases in the spec
Задает вопросы касающиеся не рассмотренных в спецификации случаев.
Understand complete picture and come up with entire areas that need to be speced
Понимает картину в целом и предлагает дополнительные аспекты, которые должны быть описаны в спецификации.
Able to suggest better alternatives and flows to given requirements based on experience
Может предложить лучшие альтернативы и следовать выставленным требованиям, основываясь на собственном опыте.
scripting
скрипты
No knowledge of scripting tools
Отсутствует знание скриптовых инструментов.
Batch files/shell scripts
Batch-файлы/shell.
Perl/Python/Ruby/VBScript/Powershell
Perl/Python/Ruby/VBScript/Powershell.
Has written and published reusable code
Писал и публиковал повторно используемые скрипты.
database
базы данных
Thinks that Excel is a database
Думает, что Excel - это база данных.
Knows basic database concepts, normalization, ACID, transactions and can write simple selects
Знает основы баз данных, нормализацию, ACID, транзакции и может написать простые select'ы.
Able to design good and normalized database schemas keeping in mind the queries that'll have to be run, proficient in use of views, stored procedures, triggers and user defined types. Knows difference between clustered and non-clustered indexes. Proficient in use of ORM tools.
Может спроектировать хорошие нормализованные схемы БД, с учетом запросов, которые будут выполняться; умело использует представления, хранимые процедуры, триггеры и собственные типы данных. Понимает разницу между кластеризованными и не-кластеризованными индексами. Специалист в использовании ORM-тулзов.
Can do basic database administration, performance optimization, index optimization, write advanced select queries, able to replace cursor usage with relational sql, understands how data is stored internally, understands how indexes are stored internally, understands how databases can be mirrored, replicated etc. Understands how the two phase commit works.
Может осуществлять администрирование БД, оптимизацию производительности БД, индексную оптимизацию, писать сложные select'ы, может заменить использование курсора вызовами функций sql, понимает как данные хранятся внутри, как хранятся индексы, имеет представление о том, как зеркалятся и реплицируются БД и т.д. Понимает как работает двухфазный commit.
Experience
Опыт:
2 n (Level 0)
2 n (Уровень 0)
n 2 (Level 1)
n 2 (Уровень 1)
n (Level 2)
n (Уровень 2)
log(n) (Level 3)
log(n) (Уровень 3)
Comments
Комментарии
languages with professional experience
языки и профессиональный опыт
Imperative or Object Oriented
Императивные или объектно-ориентированные языки программирования
Imperative, Object-Oriented and declarative (SQL), added bonus if they understand static vs dynamic typing, weak vs strong typing and static inferred types
Императивные, объектно-ориентированные и декларативные (SQL) языки программирования, дополнительный бонус - если понимает разницу между статической и динамической, слабой и строгой типизацией, статически выводимыми типами.
Functional, added bonus if they understand lazy evaluation, currying, continuations
Concurrent (Erlang, Oz) and Logic (Prolog)
platforms with professional experience
годы профессионального опыта использования платформы
1
1
2-3
2-3
4-5
4-5
6+
6+
years of professional experience
годы профессионального опыта
1
1
2-5
2-5
6-9
6-9
10+
10 +
domain knowledge
Знание предметной области
No knowledge of the domain
Не знает о понятии "предметной области".
Has worked on at least one product in the domain.
Работал хотя бы над одним продуктом в предметной области.
Has worked on multiple products in the same domain.
Работал над несколькими продуктами в одной и той же предметной области.
Domain expert. Has designed and implemented several products/solutions in the domain. Well versed with standard terms, protocols used in the domain.
Эксперт своей предметной области, проектировал и реализовывал несколько продуктов/решений в ней, хорошо разбирается в ее сущностях и протоколах.
Knowledge
Знания:
2 n (Level 0)
2 n (Уровень 0)
n 2 (Level 1)
n 2 (Уровень 1)
n (Level 2)
n (Уровень 2)
log(n) (Level 3)
log(n) (Уровень 3)
Comments
Комментарии
tool knowledge
инструментарии
Limited to primary IDE (VS.Net, Eclipse etc.)
Ограничены используемой IDE (VS.Net, Eclipse и т.д.)
Knows about some alternatives to popular and standard tools.
Знает о некоторых альтернативах популярным стандартным инструментариям.
Good knowledge of editors, debuggers, IDEs, open source alternatives etc. etc. For e.g. someone who knows most of the tools from Scott Hanselman's power tools list. Has used ORM tools.
Хорошие знания редакторов код, отладчиков, различных IDE, open-source альтернативах и т.д. (Например, это может быть кто-то, кто знает большинство тулзов из списка Скота Ганзельмана.)Использует ORM-тулзы.
Has actually written tools and scripts, added bonus if they've been published.
Написал свои инструментарии и скрипты, дополнительный плюс - если эти скрипты были опубликованы.
languages exposed to
используемые языки
Imperative or Object Oriented
Процедурные или объектно-ориентированные.
Imperative, Object-Oriented and declarative (SQL), added bonus if they understand static vs dynamic typing, weak vs strong typing and static inferred types
Процедурные, объектно-ориентированные и декларативные (SQL), дополнительный бонус за понимание статической vs динамической типизации, сильной vs слабой типизации и static inferred types.
Functional, added bonus if they understand lazy evaluation, currying, continuations
Функциональные, дополнительный баллы за понимание lazy evaluation, карринга, continuations
Concurrent (Erlang, Oz) and Logic (Prolog)
Конкурентные (Erlang, Oz) и логические (Prolog)
codebase knowledge
знание codebase
Has never looked at the codebase
Никогда не смотрел code base.
Basic knowledge of the code layout and how to build the system
Имеет общее представление о расположении кода и о том, как его собрать.
Good working knowledge of code base, has implemented several bug fixes and maybe some small features.
Хорошие рабочие знания code base, реализовывал несколько багфиксов и, может быть, некоторые маленькие фичи.
Has implemented multiple big features in the codebase and can easily visualize the changes required for most features or bug fixes.
Реализовал несколько больших фич в code base и может легко описать изменения, требуемые для реализации большинства фич или багфисков.
knowledge of upcoming technologies
знание новейших технологий
Has not heard of the upcoming technologies
Не слышал о новейших технологиях.
Has heard of upcoming technologies in the field
Слышал о новейших технологиях в своей области.
Has downloaded the alpha preview/CTP/beta and read some articles/manuals
Слышал о новейших технологиях в своей области. Скачивал alpha/preview/CTP/beta-версии и читал некоторые стати и руководства на эти темы.
Has played with the previews and has actually built something with it and as a bonus shared that with everyone else
Пробовал сделать что-либо сам и используя preview-версию сбилдил свою программу. Дополнительный плюс - если сделал свое решение доступным для других.
2 n (Level 0)
2 n (Уровень 0)
n 2 (Level 1)
n 2 (Уровень 1)
n (Level 2)
n (Уровень 2)
log(n) (Level 3)
log(n) (Уровень 3)
Comments
Комментарии
platform internals
знание внутренних аспектов платформы
Zero knowledge of platform internals
Нулевые знания внутренних аспектов платформы.
Has basic knowledge of how the platform works internally
В основном, знает как работает платформа внутри.
Deep knowledge of platform internals and can visualize how the platform takes the program and converts it into executable code.
Имеет глубокие познания внутренних аспектов платформы и может обрисовать, как платформа превращает программу в исполняемый код.
Has written tools to enhance or provide information on platform internals. For e.g. disassemblers, decompilers, debuggers etc.
Написал свои тулзы для расширения возможностей платформы или для извлечения дополнительной информации о работе платформы. Например, дизассемблер, декомпилятор, отладчик и т.д.
books
книги
Unleashed series, 21 days series, 24 hour series, dummies series...
Серии книг "... за 21 день", "... за 24 часа", "... для чайников".
Code Complete, Don't Make me Think, Mastering Regular Expressions
Design Patterns, Peopleware, Programming Pearls, Algorithm Design Manual, Pragmatic Programmer, Mythical Man month
Structure and Interpretation of Computer Programs, Concepts Techniques, Models of Computer Programming, Art of Computer Programming, Database systems , by C. J Date, Thinking Forth, Little Schemer
blogs
блоги
Has heard of them but never got the time.
Слышал о блогах, но не уделял им внимания.
Reads tech/programming/software engineering blogs and listens to podcasts regularly.
Читает технические блоги, блоги о программировании и разработке ПО и регулярно слушает подкасты.
Maintains a link blog with some collection of useful articles and tools that he/she has collected
Ведет ссылочный блог, содержащий коллекции ссылок на полезные статьи и тулзы, которые [ссылки] он собирает.
Maintains a blog in which personal insights and thoughts on programming are shared
Ведет блог, в котором содержатся его собственные понимание вопросов и соображения на тему программирования.

Оригинал: Programmer Competency Matrix. Оригинал перевода.