|
Теоретическая подготовка
|
|
Структуры данных
|
Не может объяснить разницы между Array (массивом) и LinkedList (связным списком)
|
Способен объяснить принцип работы массивов, списков, словарей и использовать их для решения практических задач
|
Осознаёт, какие компромиссы между объёмом занимаемой памяти и быстродействием имеют место
в базовых структурах данных, какие операции и почему легче выполнять для массивов, а какие — для списков.
Может привести и объяснить способы реализации хеш-таблиц и разрешений коллизий в них.
Приоритетные очереди и способы их реализации.
|
Знает и понимает продвинутые структуры данных: B-деревья, биномиальные и фибоначчи-кучи, красно-чёрных деревья,
«выворачивающиеся» (Splay) деревья, слоёные списки (skip lists), префиксные и суффиксные деревья и т.п.
|
|
|
Алгоритмы
|
Не способен найти среднее значение чисел в массиве (сложно поверить, но случаются и такие кандидаты)
|
Знает основные алгоритмы сортировки, поиска, обхода и выборки даннных.
|
Деревья и Графы. Простые «жадные » алгоритмы и алгоритмы вида «разделяй-и-властвуй» (вроде QuickSort).
Способен понять смысл обозначения уровней в этой матрице.
|
Способен распознать и программно решить задачи динамического программирования, хорошо знает
алгоритмы работы с графами, вычислительные алгоритмы. Способен распознать класс сложности задачи и т.п.
|
Работать с кем-то, у кого высшие оценки в данной категории было бы невероятной удачей.
|
|
Системное программирование
|
Не знает, что такое компилятор, сборщик или интерпретатор.
|
Базовое понимание компиляторов, сборщиков и интерпретаторов. Понимает, что такое машинный код,
и как всё работает на аппаратном уровне. Некоторые знания в сфере виртуальной памяти.
|
Понимает отличия пользовательского режима от режима ядра, многопоточность, примитивы синхронизации и
то, как они реализованы. Способен читать машинный код. Понимает работу сетей, сетевые протоколы и
программирование уровня сокетов.
|
Понимает весь программный стек, детали аппаратной реализации (ЦПУ + Память + Кэш + Прерывания + Микрокоманды),
сборки, статическое и динамическое связывание, компиляция, интерпретация,
компиляция времени выполнения, сбор мусора, стек, куча, адресация в памяти...
|
|
|
Инфраструктура разработки
|
|
Системы контроля версий
|
Архивные папки по датам
|
VSS и начинающий пользователь CVS/SVN
|
Имеет опыт в использовании возможностей CVS или SVN, умеет создавать ветки и сливать, настраивать свойства репозитория и т.п.
|
Знаком с распределёнными системами контроля версий. Пробовал Bzr/Mercurial/Darcs/Git
|
|
|
Автоматизация сборки
|
Умеет собирать из ИСР (Интегрированная среда разработки - IDE)
|
Умеет собирать из командной строки
|
Может настроить скрипт для сборки системы
|
Может настроить скрипт для сборки системы, а также генерации документации, установочных пакетов, заметок о выпуске и для установки соответствующих меток в системе контроля версий.
|
|
|
Знание средств разработки
|
Ограничено «родной» ИСР (IDE) (VS.Net, Eclipse и т.п.)
|
Знает о некоторых альтернативных средствах, представляет возможности других ИСР.
|
Хорошее знание редакторов, отладчиков, ИСР, свободных альтернатив и т.п. Приветствуется знание, например, программ из из списка Скотта Хансельмана
|
Сам автор утилит и скриптов, желательно опубликованных.
|
|
|
Работа со средой разработки (IDE)
|
Использует ИСР для правки текстов.
|
Детальнее знаком с интерфейсом, способен эффективно пользоваться средой посредством меню.
|
Знаком с горячими клавишами для часто используемых операций.
|
Создаёт собственные макросы и расширения.
|
|
|
Написание сценариев
|
Не приходилось писать сценариев
|
Командные скрипты ОС, JS for scripting
|
Perl/Python/Ruby/VBScript/Powershell
|
Создал и опубликовал повторно используемые сценарии.
|
|
|
Программирование
|
|
Декомпозиция задачи
|
«Линейное» кодирование; повторное использование путём копирования-вставки.
|
Способен разбить задачу на несколько функций
|
Способен создать повторно используемые функции/объекты, которые решают общую задачу
|
Используя соответствующие структуры данных и алгоритмы получает обобщённый/объектно-ориентированный код, в котором инкапсулированы и нужным образом выделены те аспекты задачи, которые могут измениться.
|
|
|
Декомпозиция системы
|
Не мыслит шире уровня отдельного класса/файла
|
Способен декомпозировать задачу и спроектировать решение, но оставаясь в рамках той же технологии/платформы.
|
Способен проектировать системы, простирающиеся на несколько технологий/платформ.
|
Способен представлять и проектировать сложные системы из множества продуктов с интеграцией с внешними системами.
|
|
|
Организация кода в рамках файла
|
Никаких признаков организации кода
|
Методы сгруппированы логически или по уровням видимости
|
Код оформлен в регионы и достаточно прокомментирован
|
Файл чётко структурирован, документирован, все пробелы и новые строки расставлены в соответствии со стандартом кодирования. Файл выглядит идеальным.
|
|
|
Организация кода между файлами
|
Не принимает во внимание организацию файлов в папки.
|
Связанные файлы сгруппированы в папки.
|
Каждый файл имеет чёткую единственную цель, например, определение одного класса, реализация одной возможности и т.п.
|
Организация кода на физическом уровне соответствует дизайну. Просмотр имён файлов и папок даёт представление об архитектуре данного фрагмента системы.
|
|
|
Организация проектов в решении
|
Разделение на проекты практически отсутствует (например, и слой UI, и логика, и данные - в одном проекте)
|
Базовое разделение проектов по уровням.
|
Бинарные внешние сборки, документация, внешний код, результаты сборки — всё логично организовано в соответствующие папки. Контролирует зависимости между проектами.
|
Физическое расположение исходников в дереве соответствуюет логической структуре и организации системы. Просмотр имён файлов и папок даёт представление об архитектуре системы.
|
|
|
Читаемость кода
|
Однобуквенные имена
|
Смысловые имена для файлов, переменных, методов, классов и т.п.
|
Нет длинных функций; необычный код, исправления ошибок, предположения — прокомментированы
|
Допущения верифицируются с помощью Assert или контрактов кода. Поток выполнения выглядит естественно, нет слишком глубокой вложенности условий или вызовов.
|
|
|
Навыки общения
|
Не может донести мысли/идеи коллегам. Орфографические и грамматические ошибки.
|
Может донести мысли/идеи коллегам. Грамотная речь и письмо.
|
Способен эффективно обсуждать архитектурные и прочие детали с коллегами.
|
Способен понимать и сообщать мысли/архитектурные идеи/спецификации в непротиворечивой форме и в общении ориентируется на контекст (на понимание собеседниками друг друга). Может обучать других.
|
|
|
Автоматизированное тестирование
|
Считает, что всё тестирование — работа тестировщика
|
Пишет автоматические тесты, приходит к созданию хороших тестов для уже написанного кода
|
Пишет код в манере РЧТ (разработка через тестирование, TDD)
|
Способен настроить автоматизированные функциональные, нагрузочные и тесты интерфейса.
|
|
|
Защитное кодирование
|
Не понимает, что это такое
|
Проверяет все переданные параметры, декларативно проверяет допущения в коде.
|
Проверяет возвращаемые значения и проверяет на исключения код, который может их выбросить.
|
Имеет собственную библиотеку для защитного кодирования; пишет модульные тесты для проверки работы в случае некорректных условий.
|
|
|
Обработка ошибок
|
Кодирует в расчёте на отсутствие ошибок.
|
Базовая обработка кода, который может выбросить исключение/сгенерировать ошибку.
|
Убеждается, что ошибки/исключения оставляют программу в корректном состоянии, освобождаются все ресурсы, требующие освобождения: память, подключения и др.
|
Старается не допустить возникновения исключений путём упреждающих проверок, поддерживает общую стратегию обработки исключений во всех слоях приложения. Предлагает набор общий правил для обработки исключений во всей системе.
|
|
|
Отношение к требованиям
|
Берёт требования и реализует их формально
|
Ставит вопросы по упущеным ньюансам в требованиях
|
Понимает общую картину и указывает на целые сферы, которые нужно уточнить/доописать
|
Способен предложить лучшие альтернативы предлагаемым решениям исходя из личного опыта
|
|
|
Базы данных
|
Считает базой данных Excel
|
Знаком с основными концепциями, нормализаций, ACID, транзакциями, и способен писать простые запросы.
|
Способен проектировать хорошие нормализованные схемы, учитывая при этом типичные запросы, которые будут производится.
Профессионально использует отображения (View), хранимые процедуры, триггеры и типы, определяемые пользователем.
Понимает отличие кластерных индексов от некластерных. Профессионально использует средства объектно-реляционного отображения.
|
Способен осуществлять базовое администрирование БД, настройку производительности и оптимизацию индексов.
Создавать сложные запросы, заменять использование курсоров на выражения SQL. Представляет, как данные и индексы физически организованы.
Понимает, как база может быть зеркалирована, реплицируема. Понимает, как работает двухфазная фиксация (commit).
|
|
|
Опыт
|
|
Профессионально используемые языки
|
Императивные или объектно-ориентированные
|
Императивные, объектно-ориентированные и декларативные (SQL).
Понимает отличия статической и динамической, сильной и слабой типизации. Статический вывод типов.
|
Функциональные. Ленивые вычисления, каррирование, продолжения (континуации, continuations)
|
Параллельные (Erlang, Oz) и логические (Prolog)
|
|
|
Профессионально используемые платформы
|
Одна
|
2-3
|
4-5
|
6+
|
|
|
Опыт работы, лет
|
1-2
|
3-5
|
6-9
|
10+
|
|
|
Самообразование и развитие
|
|
Изучаемые языки/сфера интересов
|
Императивные или объектно-ориентированные
|
Императивные, объектно-ориентированные и декларативные (SQL). Понимает отличия статической и динамической, сильной и слабой типизации. Статический вывод типов.
|
Функциональные. Ленивые вычисления, каррирование, продолжения (континуации, continuations)
|
Параллельные (Erlang, Oz) и логические (Prolog)
|
|
|
Знакомство с технологиями «на гребне волны»
|
Не следит за новыми выпусками платформ, сред разработки и т.п.
|
Ознакамливается с планами выпусков, представляет, о каких продуктах идёт речь
|
Загружает предварительные версии продуктов, читает статьи, руководства.
|
Экспериментирует с предварительными версиями, создаёт пробные решения. Опубликовывает интересные результаты для сообщетва.
|
|
|
Блоги
|
Слышал об этом, но всегда недоставало времени
|
Читает профессиональные блоги и слушает подкасты регулярно.
|
Имеет собственный блог с коллекцией ссылок на полезные статьи и утилиты.
|
Ведет блог с собственными статьями и размышлениями на профессиональные темы.
|
|
|
Платформы и технологии
|
|
Перечислите 5 самых часто используемых вами платформ и технологий.
|
|
Это — как набор тегов. Здесь может быть что угодно — PHP, ASP.NET MVC, Hibernate,
J2EE, WPF, Web client dev и т.п. Разделителем является запятая.
|