.

2^n (Уровень 0)n^2 (Уровень 1)n (Уровень 2)log(n) (Уровень 3)Комментарии

.

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'ами, код развивается естественно - нет глубокой вложенности условий или методов

.

Защитное программированиеНе понимает концепцииПроверяет все аргументы, ставит оповещения о критических случаях в кодеОбязательно проверяет возвращаемые значения и ставит исключения в местах где код может сработать неправильноИмееет собственную библиотеку для безопасного кодинга, пишет юнит-тесты, симулирующие критические ситуации

.

2^n (Уровень 0)n^2 (Уровень 1)n (Уровень 2)log(n) (Уровень 3)Комментарии

.

Обработка ошибокПрограммирует только удачное развитие событийПростая обработка ошибок, использующая exception/errorУдостоверяется что ошибки/исключения оставляют программу в нормальном состоянии, ресурсы, соединения и память очищаются.Код заранее определяет возможные исключения, стиль обработки исключений остается постоянным на всех уровнях кода, разрабатываются основы обработки исключений для всей системы

.

IDEВ основном использует IDE для редактирования текстаЗнаком с интерфейсом, способен эффективно использовать IDE с помощью меню.Знает горячие клавиши для наиболее часто используемых функций.Умеет писать собственные макросы

.

APIВынужден часто заглядывать в документациюПомнит часто используемые APIОбширные и глубокие знания разных APIНаписал библиотеки над API, упрощающие решение часто встречающихся задач, и заполняющие пробелы в APIAPI может быть Java библиотекой, .net фреймворком или API какого-нибудь приложения или сервиса

.

ФреймворкиНе использовал ничего кроме самой платформыСлышал о них, но не использовал ничего из существующего для своей платформыИспользовал более одного фреймворка в профессиональном масштабе и хорошо знаком с организацией фреймворковАвтор фреймворка

.

2^n (Уровень 0)n^2 (Уровень 1)n (Уровень 2)log(n) (Уровень 3)Комментарии

.

ТребованияПолучает требования и программирует в соответствии со спецификациейПроясняет пропущенные места в спецификацииПонимает общую картину и указывает на не покрытые спецификацией областиСпособен аргументированно предложить лучшие альтернативы к данным спецификациям, основываясь на своём опыте

.

СкриптыНе умеетКомандные файлы/шелл-скриптыPerl/Python/Ruby/VBScript/PowershellПишет и публикует код, пригодный для повторного использования

.

Базы данныхСчитает Excel базой данныхИмеет представление о базах данных, нормализации, ACID, транзакциях и может писать простые выборкиСпособен разработать хорошие нормализованные схемы баз данных с учетом природы выполняемых запросов, искусно использует представления, хранимые процедуры, триггеры и пользовательские типы данных. Знает разницу между clustered и non-clustered индексами. Имеет опыт использования ORM.Может администрировать базу данных, оптимизировать производительность, индексы, писать сложные запросы, заменять использование курсоров relational sql, понимает как данные хранятся внутри базы, понимает как работают ихранятся индексы, знает как делается репликация, mirroring и т.д. Понимает как работает двухэтапный commit.

.

Опыт

.

2^n (Уровень 0)n^2 (Уровень 1)n (Уровень 2)log(n) (Уровень 3)Комментарии

.

Языки в которых есть профессиональный опытПроцедурные или объектно-ориентированныеПроцедурные, объектно-ориентированные и декларативные (SQL), дополнительный бонус за понимание статической vs динамической типизации, сильной vs слабой типизации и static inferred typesФункциональные, дополнительный бонус за понимание lazy evaluation, карринга, continuationsКонкурентные (Erlang, Oz) и логические (Prolog)

.

Профессиональный опыт в платформах12 - 34 - 56+

.

Стаж профессионального опыта (в годах)12 - 56 - 910+

.

Знания в областиНет знаний в конкретной областиРаботал хотя бы над одним продуктом в области.Работал над несколькими продуктами в области.Эксперт в своей области. Разработал и внедрил несколько продуктов/решений. Знаком с терминологией и протоколами, используемыми в области.

.

Знания

.

2^n (Уровень 0)n^2 (Уровень 1)n (Уровень 2)log(n) (Уровень 3)Комментарии

.

Знание инструментовОграничено основным IDE (VS.Net, Eclipse и т.д.)Знает несколько альтернатив популярным и стандартным инструментам.Хорошее знание редакторов, дебаггеров, IDE, open-source инструментов и т.д. и т.п. Например, тот кто знает большинство инструментов из списка Скотта Хансельмана (http://www.hanselman.com/tools). Использовал ORM.Сам пишет инструменты и скрипты, дополнительный бонус за их публикацию

.

Повседневно используемые языкиПроцедурные или объектно-ориентированныеПроцедурные, объектно-ориентированные и декларативные (SQL), дополнительный бонус за понимание статической vs динамической типизации, сильной vs слабой типизации и static inferred typesФункциональные, дополнительный бонус за понимание lazy evaluation, карринга, continuationsКонкурентные (Erlang, Oz) и логические (Prolog)

.

Знание существующей базы кодаНикогда не заглядывалБазовые знания структуры кода и как строится системаХорошие знания существующего кода, пофиксил несколько багов и добавил небольшие возможности.Добавил несколько больших доработок в код, может легко представить какие изменения необходимы для добавления того или иного функционала или исправления.

.

Знание новых технологийНе интересуется новыми технологиямиСлышал о появляющихся технологиях в своей областиСкачивал альфа-версии/CTP/беты и читал статьи/мануалыПробовал preview-версии и действительно применял их в своей работе, бонус за публикацию результатов

.

2n (Уровень 0)n2 (Уровень 1)n (Уровень 2)log(n) (Уровень 3)Комментарии

.

Внутреннее устройство платформыНулевой уровень знаний об устройстве платформыБазовые знания о внутреннем устройстве и работе платформыГлубокое знание механизмов работы платформы, способность объяснить этапы компиляции и выполнения программы.Писал инструменты для расширения или исследования внутренних функций платформы. Например - дизассемблеры, декомпилеры, дебаггеры и т.д.

.

КнигиСерии "... для чайников" и "... за 10 дней""Совершенный код", "Don’t Make me Think", "Регулярные выражения" Фридла и т.д.Design Patterns, "Peopleware", "Programming Pearls", "Algorithm Design Manual", "Pragmatic Programmer", "Мифический человеко-месяц""Структура и интерпретация компьютерных программ", "Concepts, Techniques and Models of Computer Programming", "Искусство программирования ЭВМ" Кнута, "Database systems" Дейта, "Thinking Forth" Лео Броуди, "Little Schemer"

.

БлогиСлышал о них, но времени взглянуть не было.Читает блоги о программировании, разработке ПО, регулярно слушает подкасты.Ведёт блог ссылок, где хранит коллекцию полезных статей и инструментовВедёт блог, в котором делится своими мыслями по поводу программирования