Я не знаю как это сделать! Честно-честно
Это статья о простом приеме мотивации молодого специалиста. Если коротко: сильный специалист признается, что не знает как решить задачу, что бы мотивировать новичка. О паре случаев из жизни под катом.
Сам я на эту удочку попался случайно и безо всякого умысла коллеги.
Я пришел работать perl-программистом в одну известную сетевую игру. Хотя до этого работал системным аналитиком, в т.ч. по высоконагруженным системам. Но системные аналитики в геймдеве исторически не востребованы. А мне хотелось посмотреть на игру, в которой я сам зависал, «изнутри».
Мои профессиональные данные на собеседовании обсуждались чисто формально. Я был знаком с ведущим программистом и главным локомотивом проекта. Назовём его «М».
В том числе, мы с ним часто общались на профессиональные темы. Поэтому на собеседовании М., в основном, рассказывал какие соискатели приходили до меня, и как они талантливо фейлили тесты. На единственный вопрос заданный мне по теме, я сказал, что сложные регэкспы зло, а люди, дающие их на собеседовании, провокаторы. Эта же задача решается двумя сплитами с простыми регэкспами. М. это вполне устроило.
Вот разговор с руководством затянулся. Большую часть времени меня пугали, какой сложный человек М. и как мне тяжело будет с ним работать. Я дипломатично кивал и улыбался (вспоминал истории рассказанные М., они действительно были забавны). Объяснять же очевидные для меня и (для М.) вещи людям, не разбирающимся в программистских тараканах, было не совсем этично.
Тараканы у М. были очень крупные, но для меня безопасные. Просто М. терпеть не мог два типа людей: тех кто мешал ему работать и людей некомпетентных. Притом вторых сильнее: они физически вызвали у него такую же реакцию, как у меня звук пенопласта по стеклу.
И было почему: М. был (и, я уверен, остался) реально крут. Я могу вспомнить только одного человека, с ним сравнимого. А по скорости мышления и объёму контролируемого кода М. до сих пор мой top-1. Его работоспособности можно было удивляться. Но самое главное, что меня восхищало — его отношение к поставленной задаче.
В этом он напоминал легендарного кота моего знакомого. Легендарность котом была завоевана в отношении к Еде. Он никогда не играл с Едой, не ходил вокруг Еды с загадочным видом, не относил Еду в удобное место. Он просто подбегал к Еде по кратчайшей траектории и начинал есть с ближайшего к нему краю. При этом если Еда была живой, то алгоритм не менялся. Еду ели с того места за которое поймали, не заморачиваясь, что Еда пищит и вырывается. Если всю Еду за один раз съесть не получалось, то кот просто засыпал с Едой во рту и, проснувшись, незамедлительно продолжал есть с того же места.
М. работал именно так. Он мог отвлечься недолго перед работой, но дальше… Ну, вы поняли.
Игрушка, над которой мы работали, была известна не только заоблачными ценами на донат и огромным дружным комюнити. Но и адскими лагами. Спроси посреди ночи любого игрока: с чем у него ассоциируется число 503 — ответ будет предсказуем: Service Unavailable. Я как спец по нагруженным системам, ессно, поинтересовался, нет ли какого известного узкого места. К моему удивлению оно было.
От предыдущего разработчика осталась система шаблонов, построенная с runtime-парсером на RegExp. Как она тормозила можно себе представить. Как она тормозила в FCGI можно себе представить, понимая как работает FCGI (или другая асинхронная система).
Вот тогда я и услышал фразу: и »я не знаю, что тут можно сделать». От М…
Меня это завело. Но задача предсказуемо не решалась в лоб. Формат шаблонов заметно отличался от гототовых библиотек и просто написать конвертер на тех же регэкспах, не прокатывало. А шаблонов было под две сотни. И все их перебивать руками грустно. В итоге, решили прикрутить Template Toolkit к наиболее уязвимому месту — странице инфы об персонаже. Имевшей адский шаблон и кушавшей 25% ресурсов серверов. А в дальнейшем перепилить шаблоны по ходу пьесы.
Тут я как раз подхватил жесткую ангину, не успев толком войти в тему. Валяясь дома, я взял старый парсер и отломав от него хвост, приделал новый. Теперь он не собирал страницу, а превращал её в синтаксическое дерево. Естественно, это обеспечивало полную совместимость. Теперь при старте FCGI или первом обращении к шаблону мы получали дерево. А для необходимости рендера, скармливали дерево и данные процедуре, которая работала в 7 раз быстрее изначальной катавасии (на среднем шаблоне). Дальнейшим шагом было написание компилятора дерева в perl-код, что дало производительность ещё в 6 раз большую. Процесс обслуживающий многострадальный info.pl затерялся во втором десятке top’а.
Если задать вопрос: мог ли М. решить эту задачу сам? Думаю да. Просто его больше интересовала боёвка игры. И «я не знаю, что можно сделать» было оправданием нежелания разбираться в скучных для него вещах. В принципе, задача чисто инженерная, а я как аналитик просто знал, как ее решить. Когда М. был бы вынужден отвлечься от обдумывания глобальной переделки магии в игре и вгружаться в скучные шаблоны. Было еще несколько инженерных задач, где я высказывал идею, а М. реализовывал их буквально за время пока я ходил покурить и обдумать более детальную реализацию.
В любом случае мне было приятно решить «нереальную» задачу, а М. оттого, что в команде появился хороший программист (и что ему не надо решать «вспомогательные задачи»).
На этом можно было закончить историю. Если бы не «В».
В. сидел рядом с М. и мешал смотреть в окно. Потому, что если М. поворачивал к окну голову, то при этом он видел В… А это несказанно портило М. настроение. Нельзя сказать, что В. был ужасающе некомпетентен. Чего у него нельзя было отнять, так это желание сделать работу хорошо.
Из-за этого он работал крайне медленно, заморачиваясь на мелких деталях и бесподобно лажая в главном. Обычно В. поручали работу, которую руководство считало нужной, а М. бесполезной или вредной. В. не знал осечек. Он находил простые, надежные и в тоже время неожиданные способы уронить сервер, или организовать глобальную дыру в безопасности. В крайнем случае, просто сделать что-то почти стабильно работающее на тестовом сервере и стабильно не работающее на продакшене.
Ситуацию усугубляло то, что В. был флегматик. Глаза у него почти никогда не горели. Работать он начинал только после пары перекуров и нескольких волевых попыток обреченно собраться с мыслями. Также он безропотно сносил как издевательские разносы М., так и мои попытки доходчиво объяснить ему косяки.
Но, в один прекрасный день, объясняя ему простое (для меня) возможное решение поставленной задачи, я посмотрел в начинающие мутнеть глаза и решил схулиганить. Заявив: да, вот такой есть алгоритм, но я не представляю, как его тут можно применить.
Сработало. Хотя В. привычно ушел курить и собираться с мыслями, но поступь его была твердой. Вернулся он раньше обычного и работал более целеустремленно. А главное, на насмешки М. (следовавшие почти каждый раз когда М. случайно поворачивался к окну) В. лишь загадочно улыбался.
Тем временем, у меня начались разногласия с владельцами компании не связанные с программированием. В итоге я уволился.
Через некоторое время мы снова работали с М. в одной компании. И как-то разговор зашёл про В. О котором, М. отозвался с реальным уважением, мол, взялся за ум и вообще молодец. Хотя то, что В. молодец я уже знал и сам. В. вытащил проект, которым занимался (околоигровая блогосфера) на весьма приличный уровень. Хотя и М. и я считали это проект мертворождённым.
Не знаю, повлияло ли на В. мое «признание». Или просто «пришло время» раскрыться. Но я помню свои ощущения от фразы »я не знаю, как это сделать». И пусть я хвастун, но мне кажется, что это сработала именно моя уловка.