Майте на увазі, що знання для кожного рівня є кумулятивними; починаючи з рівня 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 | |
| блоґи | Знає про них, але немає часу і/або бажання | Регулярно читає технічні блоґи про програмування, інженерію програмного забезпечення; слухає відповідні подкасти | Має власний блоґ з колекцією посилань на корисні статті та утиліти | Веде блоґ, в якому ділиться власним професійним досвідом | |
Переклад здійснив: Олександр Кравчук. Оригінал тут.