Андрей Орлов - Записки автоматизатора. Профессиональная исповедь
В итоге к такой работе стремятся в основном только желающие быть «самым крутым программером ликероводочного завода», но именно такие не слишком нужны вам. Вам нужны хорошие программисты.
Хорошие программисты встречаются редко, поэтому им много что прощается. Но я бы хотел предостеречь молодых читателей от стандартной логической ошибки: хороший программист – это не тот, кто опаздывает на работу и на любую встречу, в какое бы время она ни происходила, не тот, кто не меняет носки и не принимает душ, и не тот, у которого последствия насморка свисают на небритый подбородок. Хороший программист – это тот, кто адекватно понимает задачи и в состоянии их решить с помощью программных средств быстро и без ошибок.
Поверьте, среди хороших программистов встречаются и аккуратные, и чистоплотные. Я встречал даже таких, которые свою кофейную кружку моют каждый день.
Поэтому, чтобы стать хорошим программистом, не нужно отпускать бороду, переставать мыться и регулярно портить воздух в помещении, а нужно:
1) учиться понимать, что в отличие от языка программирования внешний мир нельзя узнать и описать полностью;
2) учиться понимать задачи, даже когда их формулируют на неформальном языке, даже когда их формулируют не совсем корректно: внешний мир сам не всегда корректен;
3) учиться придумывать и описывать алгоритмы, желательно оптимальные;
4) учиться работать в команде;
5) учиться работать внутри ПО больших эксплуатируемых систем, не напоминая слона в посудной лавке.
Отбор программистов для работы всегда напоминает лотерею. Что и как ни проверяй, понять, в состоянии ли работать программист в вашей команде, удастся в лучшем случае через полгода. Зато тех, кто точно не будет в состоянии работать, можно отсеять на стадии собеседования.
В резюме программистов я сразу же смотрю раздел специальных знаний. И если в качестве языков программирования перечислены Word, Excel и html, резюме отправляется в корзину незамедлительно.
Просьба принести на собеседование несколько страниц исходных текстов своих программ на любом носителе почему-то сразу отсеивает процентов десять кандидатов. Ясно, что у вас нет никакой возможности проверить, написан ли исходник самим кандидатом, но вы можете понять, какой текст программы кандидат считает годным для предъявления новому работодателю, то есть качественным.
Кстати, совершенно не обязательно, чтобы кандидат в программисты очаровал вас во время интервью. Программист – не сейл, поэтому может быть и стеснительным, даже слегка аутичным, и свои успехи совершенно не обязан уметь рекламировать. Более того, к тем, кто себя умеет хорошо продать, следует относиться настороженно: совмещение профессий (а особенно, таких как сейл и программист) встречается редко.
Конечно, на интервью надо поверять уровень знания кандидатом программных средств, которые он продекларировал как использовавшиеся. Даже если работать придется с другими языками программирования и СУБД. Любой квалифицированный программист хоть какие-то языковые средства должен знать хорошо. Людей, поклоняющихся языку программирования как божеству, на работу стараюсь не брать. Кандидатов, которые начинают петь песни «Си рулит, Паскаль отстой», «Слава Юниксу» и т. п., даже когда их не просят петь вовсе, я отсеиваю. Они обычно не понимают, что язык – всего лишь рабочий инструмент, а не волшебная палочка. Я до сих пор убежден, что человек, который в состоянии формулировать алгоритмы на одном языке программирования, достаточно быстро и без проблем освоит любой язык. Но вот отсутствие алгоритмического мышления не может заменить даже знание всех языков мира.
Одну задачу я даю практически всем. Вот эту.
Написать программу на любом языке программирования.
Входные данные в формате чч: мм:
1) время прибытия поезда по расписанию; 2) время фактического прибытия поезда на станцию.
Выход: текст: «Поезд опоздал» / «Поезд пришел раньше» / «Поезд пришел вовремя», время задержки или опережения.
Поскольку у читателя совершенно случайно может возникнуть желание решить приведенную задачу, разбор ее решения я поместил в Приложение 1.
Конечно, посмотреть, как кандидат решает задачи, которые вы даете, интересно и познавательно. И некоторую информацию вам это даст. Однако не забывайте, что результат любых тестов объективно оценивает только способность испытуемого проходить тесты соответствующего вида. Вам нужен стайер, который должен бегать кроссы по пересеченной местности в составе команды, а вы пытаетесь его оценить по тому, как он бегает спринтерские дистанции в одиночку.
ПодрядЧасть работ может быть возложена на внешних подрядчиков. Основным критерием для возможности передачи работ служит одновременное выполнение перечисленных ниже требований:
– возможность четко сформулировать задачу;
– возможность выполнить эту задачу независимо от остальных задач;
– возможность быстро проверить результат и принять работу.
Таким образом, вполне годятся для передачи в подряд организация локальной сети, написание отчета по заранее описанной базе данных, но не вставка куска в чужой код. Не забывайте, что оговоренные с подрядчиком сроки должны быть как минимум в два раза меньше тех, которые вам реально необходимы. Впрочем, это не сильно помогает.
Стиль руководства
В математике функции бывают сразу четными и нечетными. Только это все подфункции тождественного нуля. А начальники умеют быть посредственными и непосредственными одновременно.
Про то, как нужно руководить людьми, написана куча литературы, особенно в Соединенных Штатах. Часть из нее даже полезно прочесть, хотя это и не может заменить вашего личного опыта и мозгов.
Сам я вряд ли могу научить, как надо руководить, зато точно могу сказать, как не надо.
Приводимый ниже текст написан мной несколько лет назад. Все слова в нем – мои, но все методики разработаны другим, причем вполне конкретным автором. Если он только пожелает, я с удовольствием размещу его фамилию на обложке этой книги как фамилию своего соавтора. Гонораром я уже предлагал делиться, но ответа не получил.
Руководство по руководствуКаждый подчиненный должен чувствовать, что он дерьмо.
Если он не чувствует этого, дайте ему это почувствовать всеми доступными вам средствами. Некоторые из них приводятся ниже.
1. Не давайте подчиненному получить удовлетворение процессом труда. Для этого проще всего дать ему невыполнимое задание или работу, рассчитанную на пять человек. Но это грубо и подрывает авторитет руководителя, поскольку демонстрирует его глупость или, в лучшем случае, неумение считать. Вот более приемлемые способы.
– Никогда не формулируйте четко, чем должен заниматься сотрудник. Если же он все-таки выдавил из вас перечень своих функций, немедленно поручите ему что-нибудь другое или, наоборот, поручите то же самое еще троим, причем желательно, чтобы сами исполнители об этом были не в курсе.
– Никогда не сообщайте сотруднику всю информацию, необходимую для выполнения задания. Если же информацию ему все же удалось получить, немедленно дайте другому сотруднику, занимающемуся тем же самым, информацию, противоречащую первой.
– Весьма полезно объявить человека ответственным за что-либо на совещании, на которое вы его не пригласили. Самое главное после этого – дать ему понять, что он сам не пошел на совещание.
– Всегда старайтесь, чтобы никто не знал, кому он кроме вас подчиняется. Если вы не можете не подчинить одного сотрудника другому, обязательно подчините его сразу двоим, а самому подчиненному назовите в качестве руководителя кого-нибудь третьего. Интересны также схемы, в которых сотрудник оказывается подчиненным сам себе через одно или два звена.
– Очень полезно держать на работе хотя бы одного сотрудника, который в состоянии провалить любое порученное ему дело. Такой сотрудник должен выполнять обязанности, пересекающиеся или стыкующиеся с обязанностями наибольшего возможного количества других сотрудников. Очень вероятно, что в этом случае уже никто не сможет сделать что-нибудь по-человечески.
Приучайте подчиненных делать все через задницу. Когда вы заметите, что у них даже это начало получаться, поменяйте часть тела. Частей тела много, ко всем не приспособятся.
2. Не давайте подчиненному получить удовлетворение результатом труда.
– Никогда не принимайте окончательных решений и не назначайте окончательных сроков. Это можно делать только для того, чтобы отменить первое и передвинуть второе. Если сотрудник подготовил все заранее, передвиньте срок на более поздний или отмените задание, в противном случае передвиньте срок на более раннее время.
– Если успех какой-либо работы неминуем, можно поступить одним из двух способов. Или дайте сотруднику другое задание (еще лучше – отправьте в командировку) и торжественно завершите дело сами, или начинайте активно ему мешать: дайте его подчиненным другие задания (желательно требующие их присутствия в другом месте и так, чтобы руководитель об этом не знал), отберите обещанные ранее ресурсы (деньги, автомашину, связь и т. п.). Конечно же, все это нужно делать в последний момент, когда изменить уже ничего нельзя.