Pull to refresh

Я не знаю как это сделать! Честно-честно

Reading time5 min
Views52K
Это статья о простом приеме мотивации молодого специалиста. Если коротко: сильный специалист признается, что не знает как решить задачу, чтобы мотивировать новичка. О паре случаев из жизни под катом.

Сам я на эту удочку попался случайно и безо всякого умысла коллеги.

Я пришел работать perl-программистом в одну известную сетевую игру. Хотя до этого работал системным аналитиком, в т.ч. по высоконагруженным системам. Но системные аналитики в геймдеве исторически не востребованы. А мне хотелось посмотреть на игру, в которой я сам зависал, «изнутри».

Мои профессиональные данные на собеседовании обсуждались чисто формально. Я был знаком с ведущим программистом и главным локомотивом проекта. Назовём его $М.

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

Вот разговор с руководством затянулся. Большую часть времени меня пугали, какой сложный человек $М и как мне тяжело будет с ним работать. Я дипломатично кивал и улыбался (вспоминал истории рассказанные $М, они действительно были забавны). Объяснять же очевидные для меня и (для $М) вещи людям, не разбирающимся в программистских тараканах, было не совсем этично.

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

И было почему: $М был (и, я уверен, остался) реально крут. Я могу вспомнить только одного человека, с ним сравнимого. А по скорости мышления и объёму контролируемого кода $М до сих пор мой top-1. Его работоспособности можно было удивляться. Но самое главное, что меня восхищало – его отношение к поставленной задаче.

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

$М работал именно так. Он мог отвлечься недолго перед работой, но дальше… Ну, вы поняли.

Игрушка, над которой мы работали, была известна не только заоблачными ценами на донат и огромным дружным комюнити. Но и адскими лагами. Спроси посреди ночи любого игрока: с чем у него ассоциируется число 503 – ответ будет предсказуем: Service Unavailable. Я как спец по нагруженным системам, ессно, поинтересовался, нет ли какого известного узкого места. К моему удивлению оно было.

От предыдущего разработчика осталась система шаблонов, построенная с runtime-парсером на RegExp. Как она тормозила можно себе представить. Как она тормозила в FCGI, можно себе представить, понимая как работает FCGI (или другая асинхронная система).

Вот тогда я и услышал фразу: и «я не знаю, что тут можно сделать». От $М.

Меня это завело. Но задача предсказуемо не решалась в лоб. Формат шаблонов заметно отличался от гототовых библиотек и просто написать конвертер на тех же регэкспах, не прокатывало. А шаблонов было под две сотни. И все их перебивать руками грустно. В итоге, решили прикрутить Template Toolkit к наиболее уязвимому месту — странице инфы об персонаже. Имевшей адский шаблон и кушавшей 25% ресурсов серверов. А в дальнейшем перепилить шаблоны по ходу пьесы.

Тут я как раз подхватил жесткую ангину, не успев толком войти в тему. Валяясь дома, я взял старый парсер и отломав от него хвост, приделал новый. Теперь он не собирал страницу, а превращал её в синтаксическое дерево. Естественно, это обеспечивало полную совместимость. Теперь при старте FCGI или первом обращении к шаблону мы получали дерево. А для необходимости рендера, скармливали дерево и данные процедуре, которая работала в 7 раз быстрее изначальной катавасии (на среднем шаблоне). Дальнейшим шагом было написание компилятора дерева в perl-код, что дало производительность ещё в 6 раз большую. Процесс обслуживающий многострадальный inf.pl затерялся во втором десятке top'а.

Если задать вопрос: мог ли $М решить эту задачу сам? Думаю да. Просто его больше интересовала боёвка игры. И «я не знаю, что можно сделать» было оправданием нежелания разбираться в скучных для него вещах. В принципе, задача чисто инженерная, а я как аналитик просто знал, как ее решить. Когда $М был бы вынужден отвлечься от обдумывания глобальной переделки магии в игре и вгружаться в скучные шаблоны. Было еще несколько инженерных задач, где я высказывал идею, а $М реализовывал их буквально за время пока я ходил покурить.

В любом случае мне было приятно решить «нереальную» задачу, а $М оттого, что в команде появился хороший программист (и что ему не надо решать «вспомогательные задачи»).

На этом можно было закончить историю. Если бы не «$В».

$В сидел рядом с $М и мешал смотреть в окно. Потому, что если $М поворачивал к окну голову, то при этом он видел $В. А это несказанно портило $М настроение. Нельзя сказать, что $В был ужасающе некомпетентен. Чего у него нельзя было отнять, так это желание сделать работу хорошо.

Из-за этого он работал крайне медленно, заморачиваясь на мелких деталях и бесподобно лажая в главном. Обычно $В поручали работу, которую руководство считало нужной, а $М бесполезной или вредной. $В не знал осечек. Он находил простые, надежные и в тоже время неожиданные способы уронить сервер, или организовать глобальную дыру в безопасности. В крайнем случае, просто сделать что-то почти стабильно работающее на тестовом сервере и стабильно не работающее на продакшене.

Ситуацию усугубляло то, что $В был флегматик. Глаза у него почти никогда не горели. Работать он начинал только после пары перекуров и нескольких волевых попыток обреченно собраться с мыслями. Также он безропотно сносил как издевательские разносы $М, так и мои попытки доходчиво объяснить ему косяки.

Но, в один прекрасный день, объясняя ему простое (для меня) возможное решение поставленной задачи, я посмотрел в начинающие мутнеть глаза и решил схулиганить. Заявив: да, вот такой есть алгоритм, но я не представляю, как его тут можно применить.

Сработало. Хотя $В привычно ушел курить и собираться с мыслями, но поступь его была твердой. Вернулся он раньше обычного и работал более целеустремленно. А главное, на насмешки $М ( следовавшие почти каждый раз когда $М случайно поворачивался к окну) $В лишь загадочно улыбался.

Тем временем, у меня начались разногласия с владельцами компании не связанные с программированием. В итоге я уволился.

Через некоторое время мы снова работали с $М в одной компании. И как-то разговор зашёл про $В. О котором, $М отозвался с реальным уважением, мол, взялся за ум и вообще молодец. Хотя то, что $В молодец я уже знал и сам. $В вытащил проект, которым занимался (околоигровая блогосфера) на весьма приличный уровень. Хотя и $М и я считали это проект мертворождённым.

Не знаю, повлияло ли на $В мое «признание». Или просто «пришло время» раскрыться. Но я помню свои ощущения от фразы «я не знаю, как это сделать». И пусть я хвастун, но мне кажется, что это сработала именно моя уловка.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
Total votes 104: ↑91 and ↓13+78
Comments33

Articles