Матриця компетентності програміста

Майте на увазі, що знання для кожного рівня є кумулятивними; починаючи з рівня n, вважається, що ви знаєте усе з рівнів, нижчих за n.
Комп'ютерні Науки
  2n (Рівень 0) n2 (Рівень 1) n (Рівень 2) log(n) (Рівень 3) Коментарі
структури даних Не знає різниці між масивом і списком Розуміє, і може використовувати масиви, списки, словники, тощо, на практиці Уміє правильно обирати між масивами та списками, може пояснити, як можна реалізувати хеш-таблицю та управляти колізіями, пріорітетом черг, тощо Розуміє складні типи даних, на кшталт, Б-дерев, біномінальних куп та куп фібоначі, червоно-чорного дерева, розширюючого дерева, переліку з пропусками, префіксного дерева, тощо
алгоритми Не може знайти середнє значення чисел у масиві чисел Просте сортування та пошук, алгоритми роботи з різними типами даних Дерева, Графи, прості алгоритми штибу "розділяй і володарюй", здатний розуміти рівні даної матриці Може обирати правильні підходи та програмувати динамічні рішення, добре знається на алгоритмах роботи з графами, числовими обчисленнями, тощо Працювати з людиною, яка має високий рейтинг на topcoder.om буде великим фартом!
системне програмування Не знає, що таке компілятор, компонувальник та інтерпретатор Базові знання про компілятори, компонувальники та інтерпретатори. Розуміє, що собою являє асемблерний код, і, як він працює на апаратному рівні. Базові знання про віртуальну пам'ять та посторінкову організацію пам'яті Розуміє різницю між режимом ядра та користувацьким режимом, знає про багатопотоковіть, примітиви синхронізації, може читати код на асемблері. Знає, як працюють комп'ютерні мережі, розуміється на програмуванні мережних протоколів та сокетів Розуміє увесь стек програмування, апаратного забезпечення (Процесор + Пам'ять + Кеш + Переривання + мікрокод), бінарний код, асемблювання, статичне і динамічне компонування, компіляцію, інтерпретацію, компіляцію JIT, збірку сміття, купи, стек, адресування пам'яті...
Програмна Інженерія
  2n (Рівень 0) n2 (Рівень 1) n (Рівень 2) log(n) (Рівень 3) Коментраі
контроль за версіями джерельних текстів Резервування тек за датою VSS та початковий користувач CVS/SVN Досвідчений користувач CVS та SVN. Знає, як створювати і об'єднувати гілки, заливати латки, налаштовувати репозиторій, тощо Вміє користуватись розподіленими VCS. Має досвід роботи з Bzr/Mercurial/Darcs/Git
автоматизація збірок Знає лише, як зібрати програму в IDE Знає, як збирати програмне забезпечення з командного рядка Може написати скрипт для збирання невеликої програмної системи Може написати скрипт для збирання системи, а також документації, встановлювача, генерації нотаток до випуску, теґування коду на VCS
автоматичне тестуваннія Вважає, що усе тестування є роботою для тестерів Спершу пише юніт-тести, а вже тоді код Пише код у стилі TDD (Test-driven development — розробка через тестування) Розуміє і може створювати автоматичні юніт-тести функцій, продуктивності та ГКІ
Програмування
  2n (Рівень 0) n2 (Рівень 1) n (Рівень 2) log(n) (Рівень 3) Коментарі
декомпозиція проблем Пише виключно простий код, який для повторного використання потрібно копіювати Може вирішувати проблеми у багатьох функціях Може писати функції/об'єкти для багаторазового використання, які вирішують загальну проблему Використовує відповідні структури даних та алгоритми, які поставляє із загальним/ОО кодом, котрий включає аспекти проблеми, які можуть бути змінені
декомпозиція систем Не здатний мислити за межами рівня одного файлу/класу Може розв'язати проблеми лише якщо вони належать до однієї платформи /технології Здатний розробляти системи, які охоплюють декілька технологій / платформ Здатний візуалізувати і проектувати складні комплексні системи з декількома лініями продукції та інтегрувати їх з іншими системами. Також повинен бути здатним розробляти системи підтримки операцій, на кшталт, моніторингу, репортування, тощо
комунікабельність Важко пояснити свої ідеї іншим. Має проблеми з правописом та граматикою Вміє чітко висловлювати свої думки. Немає проблем з правописом та граматикою Може дуже ефективно контактувати з іншими членами команди та клієнтами Здатний розуміти та писати зрозумілі думки / дизайн / ідеї / специфікації у недвозначній формі, і налагоджувати зв'язок з іншими через їхній контекст Вона рідко оцінюється, однак, є дуже важливим критерієм при оцінюванні програміста. Особливо в аутсорсингу, де для більшості програмістів англійська не є рідною мовою. Я знаю кілька випадків, коли проекти провалились через те, що програмісти не усвідомили важливість комунікації.
організація коду в середині файлу Жодних ознак організації у середині файлу Методи зруповані логічно або за їхньою доступністю Код зруповано по частинах, і є гарно прокоментованим з посиланнями на інші файли з джерельним кодом У загаловку файлу вказана ліцензія, код відмінно прокоментований, з дотриманням стилю. Словом, має гарний вигляд.
  2n (Рівень 0) n2 (Рівень 1) n (Рівень 2) log(n) (Рівень 3) Коментарі
організація коду між файлами Навіть не думає про організацію коду між файлами Пов'язані файли згруповані по теках Кожен фізичний файл створено з унікальною метою, наприклад, для визначення класу, реалізації певного функціоналу, тощо Організація коду на фізичному рівні відповідає дизайну
організація дерева джерельних текстів Усе в одній теці Базове розділення коду на логічні піддеки Не створює колових зележностей; двійкові файли, бібліотеки, документація, збірки та сторонній код організовані по відповідних теках Фізична організація файлів відповідає логічній ієрархії та організації програми. Імета тек і їх організація сприяють інтуїтивному розумінню проекту Відмінність між цим та попереднім пунктами у масштабі організації, організація дерева джерельних текстів відноситься до набору усіх файлів, визначають систему.
читабельність коду Імена моно-реченнями Підбирає гарні імена для файлів, змінних, класів, методів, тощо. Не пише довгих функцій, коментарі гарно пояснюють код, виділяє виправлення помилок, обробляє вийняткові ситуації Усі припущення в коді перевіряються за допомогою asserts(), код виглядає природьо — без глибоких вкладень умовних виразів або методів
захищений код Не розуміє навіть концепії Перевіряє усі аргументи та критичні припущення у коді Обово'язково перевіряє значення, що повертається, і обробляє вийняткові ситуації у коді, який може виконатись невдало Має власну бібліотеку для написання безпечного коду, пише юніт-тести, які симулюють помилки
  2n (Рівень 0) n2 (Рівень 1) n (Рівень 2) log(n) (Рівень 3) Коментарі
обробка вийнятків Обходиться без обробки вийняткових ситуацій Базова обробка вийняткових ситуацій Завжди переконується у тому, що помилки/вийняткові ситуації не виведуть програму з ладу, і у випадку чого, ресурси, пам'ять, з'єднання будуть коректно звільнені та очищені Завжди передбачає вийняткові ситуації, дотримується загальної стратегії, розробляє вказівки по обробці виняткових ситуацій у всій системі
IDE Переважно використовує IDE для редагування коду Досвідчений користувач IDE Знає клавіатурні скорочення для більшості частовикористовуваних операцій Пише власні макроси
API Вимагаються постійні звернення до документації Найчастіше використовувані функції з API знає на пам'ять Великі та поглиблеблені знання API Пише бібліотеки, які використовують API, для спрощення часто здійснюваних операцій та виправлення недоліків API Наприклад, API може бути бібліотекою Java, каркасом .net, або ж специфічно бібліотекою програми
каркаси (фреймворки) Не використовує жодного каркасу Знає про їхнє існування, але не використовує Використовує у своїй професійній діяльності кілька каркасів і чудово розуміється на тому, чим є каркаси, і, як вони працюють Автор каркасу
  2n (Рівень 0) n2 (Рівень 1) n (Рівень 2) log(n) (Рівень 3) Коментарі
вимоги Виконує роботу згідно вимог, і пише код згідно специфікацій Звертає увагу, і обговорює питання, які були пропущені у специфікації Розуміє повну картину, і шляхи досягнення мети описаної у специфікації Здатний запропонувати кращі альтернативи, і слідує специфікації покладаючись на досвід
скриптинг Не знає про існування інтерпретованих мов Файли batch / скрипти shell Perl/Python/Ruby/VBScript/Powershell Пише і публікує у вільному доступі корисні скрипти
бази даних Вважає Excel базою даних Знайомий з основними концепціями баз даних, нормалізацією, ACID, транзакціями, може писати прості вибірки (select) Може спроектувати хорошу та нормалізовану схему бази даних, тримаючи у пам'яті запити, які будуть використовуватись, може писати збережені процедури, тріґери та власні типи даних. Розуміє різницю між кластерними і не кластерними індексами. Професійний користувач інструментів ORM. Може здійснити базову оптимізацію бази даних, її продуктивності, індексів, писати складні запити, здатний замінити використання курсору з раляційним sql, розуміє, яким чином дані зберігаються всередині, як індекси зберігаються всередині, як створити дзеркало бази даних, її реплакацію, тощо. Розуміє, як СУБД одночасно обробляє кілька операцій запису
Досвід
  2n (Рівень 0) n2 (Рівень 1) n (Рівень 2) log(n) (Рівень 3) Коментарі
досвід використання мов програмування Імпративні або ОО Імперативні, об'єкнто-орієнтовані та декларативні (SQL), додатковий бонус, якщо розуміє різницю між динамічною і статичною, слабкою і сильною типізацією Функціональні, додатковий бонус, якщо знає історію мов програмування Конкурентні (Erlang, Oz) та логічні (Prolog)
досвід використання пратформи 1 2-3 4-5 6+
кількість років професійного досвіду 1 2-5 6-9 10+
вільне програмне забезпечення Не знає, що таке вільне програмне забезпечення Працює над одним, вільним проектам Працює над кількома вільними проектами ВПЗ ґуру. Зпроектував і реалізував кілька рішень/продуктів, які розповсюджує під вільними ліцензіями. Чудово орієнтується у світі ВПЗ
Знання
  2n (Рівень 0) n2 (Рівень 1) n (Рівень 2) log(n) (Рівень 3) Коментарі
знання інструментарію Обмежений базовими IDE (VS.Net, Eclipse тощо.) Знає про деякі альтернативи популярним і стандартним інструментам Добре знається на редакторах, відлагоджувачах, IDE, їх відкритих альтернативах Пише різні інструменти і сценарії, вдосконалює існуючі
поділ мов Імпративні або ОО Імперативні, об'єкнто-орієнтовані та декларативні (SQL), додатковий бонус, якщо розуміє різницю між динамічною і статичною, слабкою і сильною типізацією Функціональні, додатковий бонус, якщо знає історію мов програмування Конкурентні (Erlang, Oz) та логічні (Prolog)
знання основи коду Ніколи не заглядає в основу коду Базове знання ієрархії коду і того, як збирається система Часто працює з базовим кодом проекту, виправляє у ньому помилки, і можливо, реалізовує деякий функціонал. Реалізовує у базовому коді серйозну нову функціональність і може легко візуалізувати зміни, необхідні для виправлення певної помилки чи додання нового функціоналу
знання майбутніх технологій Не цікавиться майбутніми технологіями Чув про майбутні технології у своїй галузі Звантажує і читає попередні огляди, альфи, бети, тощо Працює з попередніми версіями продуктів, вивчає їх, ділиться своїми враженнями і думками щодо них
  2n (Рівень 0) n2 (Рівень 1) n (Рівень 2) log(n) (Рівень 3) Коментарі
нутрощі платформи Нульові знання нутрнощів платформи Має базові знання про те, як платформа працює на низькому рівні Обширні знання нутрощів платформи, може візуалізувати процес отримання апаратним забезпеченням програми і перетворення її у виконуваний код Пише інструменти для розширення можливостей платформи, або ж отримання інформації про неї. Наприклад, дизасемблери, декомпілятори, відлагоджувачі, тощо
книги Читає книжки з серій, на кшталт "за 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
блоґи Знає про них, але немає часу і/або бажання Регулярно читає технічні блоґи про  програмування, інженерію програмного забезпечення; слухає відповідні подкасти Має власний блоґ з колекцією посилань на корисні статті та утиліти Веде блоґ, в якому ділиться власним професійним досвідом
Переклад здійснив: Олександр Кравчук. Оригінал тут.