| | | | | | |
. | Computer Science | | | | | |
. | | 2^n (Уровень 0) | n^2 (Уровень 1) | n (Уровень 2) | log(n) (Уровень 3) | Комментарии |
. | Структуры данных | Не отличает массив от связанного списка | Способен объяснить и использовать массивы, связанные списки, словари и т.д. в практических задачах. | Знает тонкости использования простых структур данных. Способен объяснить как применяются хеш-таблицы, как разрешаются коллизии, очереди с приоритетом и т.д. | Знание сложных структур данных - B-деревьев, биномиальных куч и куч фиббоначчи, красно-черных деревьев, расширяющихся деревьев, списков с пропусками, префиксных деревьев и т.д. | |
. | Алгоритмы | Не способен найти среднее значение элементов массива (трудно поверить, но ко мне на интервью приходили такие кандидаты) | Простая сортировка, поиск, разбор структурированных данных. | Может работать с деревьями, графами, простыми жадными алгоритмами и алгоритмами типа "разделяй и властвуй", способен понять как уровни этой матрицы соотносятся друг с другом. | Способен читать и создавать динамические программные решения, хорошие знания алгоритмов обработки графов, хорошие знания математических вычислительных алгоритмов, способность распознавать NP-проблемы и т.д. | Работа с хорошим топ-кодером была бы невероятной удачей :) |
. | Программирование систем | Не знает что такое компилятор, компоновщик, интерпретатор | Базовое понимание компиляторов, линкеров и интерпретаторов. Понимает что такое ассемблерный код и как что работает на уровне оборудования. Некоторые знания виртуальной памяти и страничной адресации. | Понимает различия между kernel mode и user mode, многопоточность, synchronization primitives и как они применяются, способен читать ассемблерный код. Понимает как работают сети, знает организацию сетевых протоколов и программирование сокетов. | Понимает весь процесс выполнения программ, железо (CPU + память + кэш + прерывания + микрокод), машинный код, статическое и динамическое связывание, компиляцию, интерпретацию, JIT, сборку мусора, кучи, стеки, адресацию памяти… | |
. | Software Engineering | | | | | |
. | | 2^n (Уровень 0) | n^2 (Уровень 1) | n (Уровень 2) | log(n) (Уровень 3) | Комментарии |
. | Контроль версий исходного кода | Бэкап папок по пятницам | VSS и основы CVS/SVN | Опыт использования возможностей CVS и SVN. Знает как делать ветви и мерджить их, использовать патчи, устанавливать параметры репозитория и т.д. | Знание распределённых систем контроля версий. Опыт работы с Bazaar/Mercurial/Darcs/Git | |
. | Автоматизация сборки | Знает как запустить сборку из IDE | Умеет собирать систему из командной строки | Может написать простой скрипт для сборки | Может написать скрипт для автоматической сборки проекта, документации, инсталляторов, генерации release notes и взаимодействующий с системой контроля версий | |
. | Автоматическое тестирование | Считает что всё тестирование - работа тестеров | Пишет автоматические юнит-тесты и может составлять хорошие тест-кейсы | Умеет писать код в стиле TDD | Понимает и умеет применять автоматические функциональные, нагрузочные и UI тесты | |
. | Программирование | | | | | |
. | | 2^n (Уровень 0) | n^2 (Уровень 1) | n (Уровень 2) | log(n) (Уровень 3) | Комментарии |
. | Декомпозиция проблем | Прямой код, copy-paste для повторного использования | Способен разбить проблему на несколько функций | Способен писать функции пригодные для повторного использования | Использует соответствующие ситуации алгоритмы и структуры данных, пишет объектно-ориентированный код, в котором изменяемые части проблемы инкапсулированы в отдельные функции | |
. | Декомпозиция систем | Неспособен думать выше уровня одного файла/класса | Способен разбить пространство проблем и пространство решений, пока проект остается на одной платформе/технологии | Способен разрабатывать архитектуру систем, охватывающих несколько платформ/технологий | Способен понимать и разрабатывать сложные системы с несколькими линейками продуктов и интеграцией со внешними системами. Также способен разрабатывать вспомогательные системы - мониторинга, отчетности, восстановления после ошибок | |
. | Коммуникабельность | Не может объяснить мысли/идеи команде. Неразборчиво говорит и пишет с ошибками. | Команда способна понять его. Хорошая речь - устная и письменная. | Способен эффективно общаться с командой | Способен понимать и объяснять мысли/дизайн/идеи/спецификации в ясной манере и применять навыки общения в зависимости от конкретной ситуации. | Этот пункт часто недооценивают, но это очень важный критерий при оценке программиста. С распространением outsource-разработки эти качества становится ещё ценнее. Я знаю о некоторых проектах сорвавшихся именно потому что команда не могла эффективно взаимодействовать. |
. | Организация кода внутри файла | Её нет | Методы сгруппированы по назначению или доступности | Код сгруппирован по назначению и хорошо документирован с отсылками к другим исходникам. | У файла есть лицензионный заголовок, краткое содержание, хорошие комментарии, наглядное форматирование кода. Файл выглядит красиво. | |
. | | 2^n (Уровень 0) | n^2 (Уровень 1) | n (Уровень 2) | log(n) (Уровень 3) | Комментарии |
. | Организация кода между файлами | Не продумана организация кода между файлами | Родственные файлы собраны в папки | Каждый файл имеет своё уникальное назначение, например один определяет классы, другой реализовывает какой-либо функционал и т.д. | Организация кода на физическом уровне совпадает с дизайном программы, взгляд на имена файлов и папок даёт представление о дизайнерских решениях | |
. | Организация дерева исходников | Всё в одной папке | Простое разделение кода на логические папки. | Отсутствие circular dependencies, бинарные файлы, документация, билды, third-party код разложены в соответствующие папки | Структура дерева папок соответствует логической иерархии и организации. Названия папок и файлов дают представление о дизайне системы. | Различие между этим и предыдущим пунктами - масштаб организации, структура папок и файлов соответствует внутренней организации всей разрабатываемой системы. |
. | Читабельность кода | Однобуквенные имена | Хорошие имена для файлов, переменных, классов, методов и т.д. | Отсутствие длинных функций, комментарии объясняют необычный код, багфиксы, предположения о дальнейшем развитии кода | Предположения в коде проверяются assert'ами, код развивается естественно - нет глубокой вложенности условий или методов | |