Кодеры за работой. Размышления о ремесле программиста - Питер Сейбел
Шрифт:
Интервал:
Закладка:
Я не хочу этим сказать, что содержимое “черного ящика” не может быть сложным. Возьмите, например, такую утилиту, как grep. Если глядеть извне, это что-то вроде квадратика. На входе - поток данных, файл. Можно сказать cat foo | grep, и grep получает некие аргументы, регулярное выражение, которому нужно найти соответствие. Хорошо. И grep выдает все строки, соответствующие этому регулярному выражению. На уровне восприятия то, что делает grep, до крайности просто. На входе - файл. Регулярное выражение. На выходе - набор (поток) строк, соответствующих этому выражению. Но это не означает, что действующий внутри “черного ящика” алгоритм прост - он может быть предельно сложным.
Происходящее внутри “черного ящика” может быть предельно сложным. А процесс склеивания сложных компонентов необязательно сложен. Использовать grep совсем несложно. Вот чего я не вижу в архитектуре систем: четкого различия между склеиванием составных частей и устройством, порой очень сложным, самих частей.
Соединяя программы при помощи API языка программирования, мы не получаем абстракцию “черного ящика”. Мы отправляем их в одну и ту же область памяти. Если grep есть модуль, который предоставляет вызовы в своем API, и вы снабжаете его указателем char*, и вам надо выделять для этого память, и вы занимаетесь глубоким копированием этой строки - можно ли создать параллельный процесс, делающий все это? В таком случае это становится трудным для понимания. Не знаю, почему люди склеивают программы таким замысловатым образом. Надо выбирать методы попроще.
Сейбел: Если сравнить то, что вы думаете о программировании сейчас, и то, что думали в начале карьеры, в чем главное отличие?
Армстронг: Главные отличия в том, как я думаю о программировании, не имеют ничего общего с аппаратным обеспечением. Да, оно становится быстрее и мощнее, но наш мозг в миллион раз мощнее лучших программных инструментов. Я могу писать программу и вдруг, через много времени, обнаружить, что в ней ошибка: если произойдет вот это, и вот это, и вот это, случится сбой. Смотрю в код - и правда, ошибка! Хотя ничто в работе программы не говорит об этом. А теперь скажите, какая среда разработки на такое способна? Поэтому перемены, которые со мной произошли, - это перемены в моей голове.
Есть две перемены, связанные с опытом программирования. Вот первая: когда я был моложе, то обычно, закончив писать программу, переставал работать над ней. Ведь все закончено! Потом наступало озарение: “Что за бред?! Я идиот! Надо переписать”. И потом снова то же самое.
Помню, как размышлял: не лучше ли сначала все продумать, а потом записать? Не лучше ли испытать озарение, еще не написав программу? Думаю, теперь у меня получается. Поэтому я считаю, что в течение двадцати лет учился программированию. Сейчас я знаю, как это делается. Я ставил эксперименты, чтобы научиться. Теперь я умею программировать и не нуждаюсь в экспериментах.
Иногда, правда, я ставлю совсем небольшие эксперименты - пишу крошечные программы, только чтобы ответить на какой-то вопрос. Я все продумываю, и программа более-менее работает по моему плану, потому что я продумал ее. Это, конечно, занимает много времени. Пишешь программу, потом наступает озарение, все переписываешь - написание программы может занять год. Поэтому теперь я предпочитаю целый год думать над ней. Просто я ничего не набираю на клавиатуре.
Это первое. Второе - это интуиция. Когда был моложе, я мог программировать ночь напролет, до четырех утра, и страшно уставал. Как настоящий крутой программист, я писал код, час за часом. Выходило неважно, но я упорно продолжал работать, когда интуиция уже покинула меня.
И я усвоил вот что: если устал, то выходит дерьмово, и на другой день это выбрасываешь. Двадцать лет назад я продолжал работу, даже чувствуя, что с кодом не все в порядке. С годами я заметил, что по-настоящему хорошо получается, когда я полностью в потоке - не забочусь о времени, мало думаю о самой программе, просто сижу расслабленно, что-то набираю и гляжу, что там на экране. Вот тогда код выходит хорошим. Раньше я не понимал, что это такое, когда что-то подсказывает тебе: “Нет-нет, все не так”. Сейчас, если что-то говорит “нет”, я останавливаюсь. Я знаю по опыту, что надо на время завязать с кодом — оставить эту задачу, подумать о чем-то другом.
Я хорошо успевал по математике в школе и считал, что у меня логический склад ума. Но потом психологические тесты показали, что у меня прекрасно развита интуиция, а вот с логикой хуже. Не то чтобы плохо - я могу заниматься математикой и программированием вполне на уровне. Но поскольку я хорошо успевал по математике, то думал, что наука вся построена на логике и математике. Теперь не скажу этого, потому что знаю, как много значит интуиция, уверенность в правильности.
Сейбел: Итак, теперь вы намного больше размышляете о коде. Что именно вы делаете на этом этапе?
Армстронг: Ну, я не просто сижу и думаю - я делаю пометки на бумаге. Пожалуй, это слабо связано с кодом - если взглянуть со стороны, я о чем-то думаю, что-то черчу. Еще один очень важный момент - я спрашиваю своих коллег: “А как бы вы решили эту задачу?” Нередко бывает такое: приходишь к кому-то и говоришь: “Прямо не знаю, как сделать вот это - так или так, выбрать А или Б”, - рассказываешь про А и Б и вдруг на полуслове хлопаешь себя ладонью по лбу: “Конечно, Б! Большое, большое тебе спасибо”.
Если просто написать все это на доске, ничего не выйдет - нужна обратная связь. Нужен человек, выступающий в роли доски. Вы объясняете что-то, рисуете альтернативные решения, человек вступает в разговор и подсказывает оригинальный ход. И вы внезапно видите решение. Для меня это не распространяется на само написание кода, но диалог с коллегами, решающими сходные проблемы, может быть очень полезен.
Сейбел: Что тут главное - реплики других, вопросы, сам процесс объяснения?
Армстронг: Думаю, вот что: вы переводите задачу из той части мозга, которая ее решает, в ту часть, которая вербализует. Это две разные части. Вы форсируете решение. Я, правда, никогда не пробовал говорить вслух в пустой комнате.
Сейбел: Я слышал, что на одном факультете компьютерных наук в кабинете преподавателя был плюшевый медведь, которому следовало изложить вопрос, прежде чем побеспокоить преподавателя. “Значит так, мистер Медведь, я работаю над такой-то задачей и думаю, как лучше сделать... ага, понял!”
Армстронг: Да? Надо попробовать.
Сейбел: Поговорите со своими кошками.
Армстронг: О, само собой! Я работал с одним парнем чуть постарше меня, очень умным. Всякий раз, когда я приходил к нему в офис с каким-то вопросом, он говорил: “Программа - это черный ящик. Есть вход, выход и функциональная связь между ними. Какой у тебя вход, какой выход, какая функциональная связь?” В ходе беседы я вдруг выкрикивал: “Да ты гений!” - и выбегал из комнаты, а тот удивленно качал головой: “Он даже не объяснил мне, в чем проблема”. Так что тот парень был вроде медведя.
(adsbygoogle = window.adsbygoogle || []).push({});