Главная страница
Навигация по странице:

  • Область Уровень

  • 2^n (Уровень 0) n^2 (Уровень 1) n (Уровень 2)

  • Системное программирование

  • Контроль версий исходников

  • Автоматизация тестирования

  • Организация кода в файле

  • Организация кода между файлами

  • Организация дерева исходников

  • Безопасное программи- рование (defensive coding)

  • Среда программирования (IDE)

  • Языки и профессиональный опыт

  • Годы профессионального опыта

  • Годы профессионального опыта конкретной платформы

  • Знание предметной области

  • Code base (кодовая база)

  • Знание новейших технологий

  • Знание внутренних аспектов платформы

  • Матрица роста программиста. Матрица компетентности программиста


    Скачать 186.86 Kb.
    НазваниеМатрица компетентности программиста
    АнкорМатрица роста программиста
    Дата06.06.2022
    Размер186.86 Kb.
    Формат файлаdocx
    Имя файлаmatritsa_1.docx
    ТипДокументы
    #573430

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

    Область

    Уровень













    2^n (Уровень 0)

    n^2 (Уровень 1)

    n (Уровень 2)

    log(n) (Уровень 3)

    Теория













    Структуры данных

    Не понимает разницы между массивом и связным списком.

    Может объяснить и использовать на практике массивы, связные списки, словари и т.д.

    Понимает плюсы и минусы использования тех или иных базовых структур данных (размер памяти, время выполнения операций с данными, в чем разница между массивами и связными списками в этом плане).

    Может объяснить как реализовать хэш-таблицы и как обработать коллизии. Приоритетные очереди и способы их реализации, и т.д.

    Знание сложных структур данных, таких как B-дерево, Биномиальная куча и Фибоначчиевская куча, АВЛ-дерево, Красно-чёрное дерево, Косое дерево, Список с пропусками, TRIE-структуры и т.д.

    Алгоритмы

    Не может найти среднее значение массива чисел. (Тяжело поверить, но встречаются и такие кандидаты на собеседовании.)

    Базовые методы сортировки и поиска. Обход и поиск в структурах данных.

    Деревья, Графы, "простой путь" и  "разделяй и властвуй"-алгоритмы. Понимает ассоциацию уровней этой матрицы.

    Может распознать и написать решение динамическим программированием, хорошо знает алгоритмы на графах, хорошо знает численные методы, может идентифицировать проблемы класса NP.

    Системное программирование

    Не знает что такое компилятор, компоновщик или интерпретатор.

    Базовое понимание компиляторов, компоновщиков и интерпретаторов.

    Понимает, что такое ассемблерный код и как работают программы на уровне железа. Небольшое понимание виртуальной памяти и пэйджинга.

    Понимает чем отличается kernel mode от user mode, что такое мульти-трединг. Знает способы синхронизации и как реализованы примитивы синхронизации. Может читать ассемблерный код.

    Понимает, как работают сети, сетевые протоколы и может реализовать передачу данных через сокеты.

    Понимает как работает весь "программный стэк": железо (CPU + Память + Кэш + Прерывания + микрокоды), двоичный код, ассемблер, статическая и динамическая линковка, компиляция, интерпретация, JIT-компиляция, сборка мусора, куча, стэк, адресация памяти.

    Навыки













    Контроль версий исходников

    Бэкап исходников в папку с датой бэкапа.

    VSS и основы CVS/SVN в качестве пользователя.

    Специалист по возможностям CVS и SVN. Знает как создать, разветвить, слить репозитарий и т.д.

    Знает распределенные системы VCS. Работает с Mercurial/Darcs/Git

    Автоматизация build'ов

    Знает как запустить Build из среды программирования.

    Умеет билдить из командной строки.

    Может настроить скрипт для сборки основной системы.

    Может настроить скрипт для сборки системы и документации, для сборки инсталляторов.Сделает и добавит код скрипта в систему контроля версий исходников.

    Автоматизация тестирования

    Считает, что тестирование - это работа тестеров.

    Может создавать свои хорошие юнит-тесты для кода, который пишет в настоящее время.

    Пишет код в стиле Test-driven Development (TDD).

    Может создавать автоматические тесты на функционал, пользовательский интерфейс и загрузку/производительность.

    Программирование













    Декомпозиция задачи

    Просто последовательные строчки.

    Copy/Paste - для повторного использования кода.

    Может разбивать решение задачи на несколько функций.

    Способен создавать многократно используемые функции/объекты, которые решают общие задачи.

    Использует соответствующие структуры данных и алгоритмы. Создает общий/объектно-ориентированный код, который инкапсулирует те условия задачи, которые могут быть изменены.

    Декомпозиция системы

    Не способен думать о системе более сложной, чем один класс или файл.

    Может произвести декомпозицию задачи и спроектировать систему в пределах одной платформы или технологии.

    Может спроектировать систему, которая охватывает несколько технологий/платформ.

    Может визуализировать и проектировать сложные системы с несколькими линейками продуктов, учитывать интеграциею с внешними системами. Также должен уметь проектировать системы поддержки работы: мониторинг, генерация отчетов, аварийные переходы на использование запасных ресурсов.

    Общение

    Не может выразить свои мысли/идеи. Плохо с правописанием и грамматикой.

    Его понимают. Хорошие правописание и грамматика.

    Может эффективно общаться.

    Может понимать и объяснять мысли/дизайн/ 

    идеи/специфику в точно выраженной  форме. В общении соответствует ситуации.

    Организация кода в файле

    Нет четкой организации кода в файле.

    Методы сгруппированны логически и по вызовам.

    Код разделен на регионы,  имеет хорошие комментарии, в т.ч. со ссылками на другие файлы исходников.

    Файл имеет разделы "license header", "summary", хорошие комментарии, непротиворечивую расстановку пробелов и табуляции. Файл должен выглядеть красиво.

    Организация кода между файлами

    Не приходит в голову мысль четко организовать код с помощью разделения на файлы.

    Похожие файлы группируются в папку.

    Каждый физический файл предназначен для чего-то одного, например, служит для объявления одного класса или для реализации одного функционала и т.д.

    Организация кода на физическом уровне точно соответствует проекту. Глядя на имена файлов и структуру папок, можно понять как спроектирована данная реализация.

    Организация дерева исходников

    Все в одной папке.

    Простое разделение кода в логические подкаталоги.

    Нет "круговых" зависимостей. Бинарники, либы, документация, билды, сторонний код - все разложено в соответствующие папки.

    Структура дерева исходного кода соответствует логической иерархии и организации кода в проекте.

    Глядя на имена файлов и структуру папок, можно понять как спроектирована данная система.

    Читабельность кода

    Односложные имена.

    Хорошие имена файлов, переменных, классов, методов и т.д.

    Нет длинных функций, а нестандартный код, багфиксы и допущения в коде поясняются комментариями.

    Допущения в коде сопровождаются assert'ами. Поток операций в коде естественный - нет глубокой вложенности условий или методов.

    Безопасное программи-

    рование (defensive coding)

    Не понимает данной концепции.

    Проверяет все аргументы и ставит assert'ы на критические допущения в коде.

    Убеждается, что проверил возвращаемое значение и что обрабатывает исключения в потенциально бажном коде.

    Имеет свою собственную библиотеку помогающую в безопасном программировании, пишет юнит-тесты которые эмулируют сбои.

    Обработка ошибок

    Пишет код для "идеального" случая, когда все работает и нет сбоев.

    Обработка ошибок в коде, который либо кидает исключение, либо генерирует ошибку.

    Убеждается, что после того, как произошла ошибка/исключение, программа продолжает работать, а ненужные более ресурсы, коннекшоны и память были корректно освобождены обработчиком ошибки. 

    Пишет код так, чтобы определять возможные ошибки на раннем этапе,  придерживается последовательной стратегии обработки исключений во всех слоях кода, разрабатывает общие принципы обработки исключений во всей системе.

    Программирование

     

     

     

     

    Среда программирования (IDE)

    В основном использует IDE для редактирования текста.

    Способен эффективно пользоваться меню в IDE. Знает некоторые тонкости среды.

    Для самых используемых функций  среды знает горячие клавиши.

    Написал свои макросы.

    API

    Часто нуждается в обращениях к документации.

    Помнит самые часто используемые API.

    Обширные и глубокие знания

    API.

    Написал библиотеки, которые оборачивают API, для упрощения задач, которые наиболее часто встречаются. Эти библиотеки также часто восполняют пробелы в API.

    Фреймфорки

    Не использует никаких фреймверков за рамками основной платформы.

    Знает, но не использует популярные фреймворки, доступные для его платформы.

    Профессионально пользовался более чем одним фреймворком и хорошо разбирается в идиомах фреймворков. 

    Является автором фреймворка.

    Требования

    Понимает выставленные требования и пишет код в соответствии со спецификацией.

    Задает вопросы касающиеся не рассмотренных в спецификации случаев.

    Понимает картину в целом и предлагает дополнительные аспекты, которые должны быть описаны в спецификации.

    Может предложить лучшие альтернативы и следовать выставленным требованиям, основываясь на собственном опыте.

    Скрипты

    Отсутствует знание скриптовых инструментов.

    Batch-файлы/shell.

    Perl/Python/Ruby/VBScript/

    Powershell.

    Писал и публиковал повторно используемые скрипты.

    Базы Данных

    Думает, что Excel - это база данных.

    Знает основы баз данных, нормализацию, ACID, транзакции и может написать простые select'ы.

    Может спроектировать хорошие нормализованные схемы БД, с учетом запросов, которые будут выполняться; умело использует представления, хранимые процедуры, триггеры и собственные типы данных. Понимает разницу между кластеризованными и не-кластеризованными индексами. Специалист в использовании  ORM-тулзов.

    Может осуществлять администрирование БД, оптимизацию производительности БД, индексную оптимизацию, писать сложные select'ы, может заменить использование курсора  вызовами функций sql, понимает как данные хранятся внутри, как хранятся индексы, имеет представление о том, как зеркалятся и реплицируются БД и т.д.  Понимает как работает двухфазный commit.

     

    Опыт

     

     

     

     

    Языки и профессиональный опыт

    Императивные или объектно-ориентированные программирования

    Императивныеобъектно-ориентиро-

    ванные и декларативные(SQL) языки программирования. Дополнительный бонус - если понимает разницу между статической и динамической, слабой и строгой типизацией, 

    статически выводимыми типами.

    Функциональные языки программирования. Дополнительный бонус - если знает, что такое "ленивые вычисления"каррированиепродолжения.

    Конкурентные 

    (Erlang, Oz) и логические (Prolog).

    Годы профессионального опыта

    1

    2-5

    6-9

    10+

    Годы профессионального опыта конкретной платформы

    1

    2-3

    4-5

    6+

    Знание предметной области

    Не знает о понятии "предметная область".

    Работал хотя бы над одним продуктом в своей предметной области.

    Работал над несколькими продуктами в одной и той же предметной области.

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

    Знания

     

     

     

     

    Инструментарии

    Ограничены используемой IDE (VS.NetEclipse и т.д.)

    Знает о некоторых альтернативах популярным стандартным инструментариям.

    Хорошие знания редакторов кода, отладчиков, различных IDE, open-source альтернативах и т.д. (Например, это может быть кто-то, кто знает большинство тулзов из списка Скота Ганзельмана.)

    Использует ORM-тулзы.

    Написал свои инструментарии и скрипты, дополнительный плюс - если эти скрипты были опубликованы.

    Code base (кодовая база)

    Никогда не смотрел кодовую базу.

    Имеет общее представление о расположении кода и о том, как его собрать.

    Хорошие рабочие знания кодовой базы, реализовывал несколько багфиксов и, может быть, некоторые маленькие фичи.

    Реализовал несколько больших фич в кодовой базе, может легко описать изменения, требуемые для реализации большинства фич или багфисков.

    Знание новейших технологий

    Не слышал о новейших технологиях.

    Слышал о новейших технологиях в своей области.

    Скачивал alpha/preview/CTP

    /beta-версии и читал некоторые статьи и руководства на эти темы.

    Пробовал сделать что-либо сам. Используя preview-версию сбилдил свою программу. Дополнительный плюс - если сделал свое решение доступным для других.

    Знание внутренних аспектов платформы

    Нулевые знания внутренних аспектов платформы.

    В основном, знает как работает платформа внутри.

    Имеет глубокие познания внутренних аспектов платформы и может обрисовать, как платформа исполняет программный код.

    Написал свои тулзы для расширения возможностей платформы или для извлечения дополнительной информации о работе платформы. Например расширения дизассемблера, декомпилятора, отладчика и т.д.

    Книги



    Серии книг 

    "... за 21 день" 

    "... за 24 часа" 

    "... для чайников".

     

    Совершенный код 

    Не заставляйте меня думать! 

    Регулярные выражения

     

    Человеческий фактор: успешные проекты и команды 

    Приемы объектно-ориентиро-ванного проектирования. Паттерны проектирования 

    Жемчужины проектирования 

    Руководство по разработке алгоритмов 

    Программист-прагматик 

    Мифический человеко - месяц

     

    Искусствопрограммирования 

    Структураиинтерпретациякомпьютерныхпрограмм 

    Concepts Techniques and    Models of Computer Programming 

    Database systems , by C. J Date 

    Thinking Forth 

    Little Schemer

    Блоги

    Слышал о блогах, но не уделял им внимания.

    Читает технические блоги, блоги о программировании и разработке ПО и регулярно слушает подкасты.

    Ведет ссылочный блог, содержащий коллекции  ссылок на полезные статьи и тулзы, которые [ссылки] он собирает.

    Ведет блог, в котором содержится его собственные понимание вопросов программирования

    Замечание:

    Каждый следующий уровень включает в себя предыдущий , т.е. разработчик находящийся на уровне 3 должен удовлетворять критериям двух предыдущих уровней.


    написать администратору сайта