Содержание
Каждый год мы обучаем под свои проекты и набираем в команду студентов. Хантим, конечно, не всех. «Мы на работу ходим, а нам деньги плотют» — это точно не к нам. За «звездами», тоже не охотимся. Ищем в первую очередь тех, кто хочет расти, развиваться, становиться «звездой», а мы можем им в этом помочь.
Одна из проблем нашего высшего образования в том, что в вузах учат много чему, и алгоритмам, и языкам программирования, и ООП, и даже паттернам проектирования. Но я еще ни разу не встречал, чтобы в вузах учили работать работу. Лабораторки не в счет. Спихнул – и забыл! Возможно, просто не везло.
В свое время, я сформулировал набор навыков, которыми, по моему мнению, должен владеть каждый профессиональный программист. Не только Мастер с большой буквы, но и студент, который претендует на то, чтобы за его работу ему платили деньги. И, если мы не смогли научить студента этим навыкам за три месяца его испытательного срока, то или мы взяли не того, или назначили никудышного наставника.
Итак, про семь навыков…
1. Проводит декомпозицию задачи и проектирует ее решение
Получив, задачу программист не должен сразу бежать писать код. Правильный программист 80% времени работает головой, и только 20% времени — руками. Даже создание не очень сложной программы требует анализа и проектирования: декомпозиции задачи на боле простые подзадачи и последующего синтеза общего решения из частных. Например, выбор длины переменной целого типа есть элемент проектирования.
2. Адекватно оценивает затраты на выполнение
Ответ «Для решения этой задачи мне потребуется 8 часов», — неправильный. Оценка всегда величина вероятностная. Правильный ответ, например, «от 4 (быстрее точно не смогу) до 16 часов (скорее всего, точно сделаю)». Большой разброс не должен смущать руководителя, он отражает высокий уровень неопределенности при решении программистских задач.
3. Планирует свою работу и составляет график
При составлении план-графика решения задачи, программист должен расставлять приоритеты своих работ таким образом, чтобы максимально быстро снизить имеющиеся риски, а не добиться быстрого прогресса в решении. Отложенные «мутные» подзадачи могут выявить тупик в принятом проектном решении, и все придется начинать сначала.
4. Соблюдает принятые стандарты
Ну, тут все просто. «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете». (с) Стив Макконнелл.
5. Обеспечивает требуемое качество, минимизируя затраты и риски
Это, наверное, самый сложный навык. Надо научиться находить золотую середину между запрограммировал, «как получится», и написал «самый совершенный код».
6. Выполняет тестирование и отладку кода
«Откомпилировалось – отправляем в тестирование!» — подход неверный. Программист обязан найти максимум ошибок в своем коде. Он может сделать это намного эффективнее, поскольку для него программа – «прозрачный ящик». Большинство ошибок лежит на границах областей определения и изменения переменных алгоритма. Тестировщик же будет тестировать код, как «черный ящик», бомбя по площадям перебором большого количества наборов данных.
7. Анализирует найденные дефекты и отклонения от графика
Ну и последнее, как любая самоуправляемая система программист должен обеспечивать обратную связь. Обязан анализировать фактические отклонения от планов по срокам и качеству и выявлять их причины для того чтобы скорректировать свой рабочий процесс и минимизировать подобные отклонения в будущем.
Заключение
Как-то подошли ко мне два студента с вопросом: «А почему Вася получает в три раза больше каждого из нас? Он что, пишет код в три раза быстрее?». «Нет, — ответил я, – он пишет код медленнее вас. Просто он решает такие задачи, которые вы вместе, пока, не сможете решить за любое отведенное вам время. Потому учиться, учиться и учиться!» Мастер с большой буквы отличается от просто профессионального программиста не навыками, а сложностью и масштабностью решаемых задач.