Читаем Кодеры за работой. Размышления о ремесле программиста полностью

И я усвоил вот что: если устал, то выходит дерьмово, и на другой день это выбрасываешь. Двадцать лет назад я продолжал работу, даже чувствуя, что с кодом не все в порядке. С годами я заметил, что по-настоящему хорошо получается, когда я полностью в потоке — не забочусь о времени, мало думаю о самой программе, просто сижу расслабленно, что-то набираю и гляжу, что там на экране. Вот тогда код выходит хорошим. Раньше я не понимал, что это такое, когда что-то подсказывает тебе: «Нет-нет, все не так». Сейчас, если что-то говорит «нет», я останавливаюсь. Я знаю по опыту, что надо на время завязать с кодом — оставить эту задачу, подумать о чем-то другом.

Я хорошо успевал по математике в школе и считал, что у меня логический склад ума. Но потом психологические тесты показали, что у меня прекрасно развита интуиция, а вот с логикой хуже. Не то чтобы плохо — я могу заниматься математикой и программированием вполне на уровне. Но поскольку я хорошо успевал по математике, то думал, что наука вся построена на логике и математике. Теперь не скажу этого, потому что знаю, как много значит интуиция, уверенность в правильности.

Сейбел: Итак, теперь вы намного больше размышляете о коде. Что именно вы делаете на этом этапе?

Армстронг: Ну, я не просто сижу и думаю — я делаю пометки на бумаге. Пожалуй, это слабо связано с кодом — если взглянуть со стороны, я о чем-то думаю, что-то черчу. Еще один очень важный момент — я спрашиваю своих коллег: «А как бы вы решили эту задачу?» Нередко бывает такое: приходишь к кому-то и говоришь: «Прямо не знаю, как сделать вот это — так или так, выбрать А или Б», — рассказываешь про А и Б и вдруг на полуслове хлопаешь себя ладонью по лбу: «Конечно, Б! Большое, большое тебе спасибо».

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

Сейбел: Что тут главное — реплики других, вопросы, сам процесс объяснения?

Армстронг: Думаю, вот что: вы переводите задачу из той части мозга, которая ее решает, в ту часть, которая вербализует. Это две разные части. Вы форсируете решение. Я, правда, никогда не пробовал говорить вслух в пустой комнате.

Сейбел: Я слышал, что на одном факультете компьютерных наук в кабинете преподавателя был плюшевый медведь, которому следовало изложить вопрос, прежде чем побеспокоить преподавателя. «Значит так, мистер Медведь, я работаю над такой-то задачей и думаю, как лучше сделать... ага, понял!»

Армстронг: Да? Надо попробовать.

Сейбел: Поговорите со своими кошками.

Армстронг: О, само собой! Я работал с одним парнем чуть постарше меня, очень умным. Всякий раз, когда я приходил к нему в офис с каким-то вопросом, он говорил: «Программа — это черный ящик. Есть вход, выход и функциональная связь между ними. Какой у тебя вход, какой выход, какая функциональная связь?» В ходе беседы я вдруг выкрикивал: «Да ты гений!» — и выбегал из комнаты, а тот удивленно качал головой: «Он даже не объяснил мне, в чем проблема». Так что тот парень был вроде медведя.

Сейбел: А что вы чертите — куски кода или просто линии, фигуры?

Армстронг: Чаще всего кружки со стрелками. Когда рисуешь что-то на доске, объясняя людям, то это кружки со стрелками, уравнения, разные обозначения, но не код. Только иногда это куски кода, потому что так экономнее всего что-то выразить. Это в период обдумывания. Код пишу лишь изредка, чтобы понять, сколько времени что займет. Написав строк десять кода, я оцениваю время.

Сейбел: То есть сколько времени займет выполнение программы на компьютере?

Армстронг: Да. Я не знаю, будет это микросекунда или миллисекунда. Я могу что-то предполагать, но предположение должно подтвердиться. Поэтому я смотрю только на те части, про которые ничего не понимаю. Но у меня большой опыт программирования, связанный с Erlang, и я примерно понимаю, что будет делать программа. За сколько-то лет пути решения задач не изменились: определить самые трудные части, написать небольшие прототипы, выявить области, в которых не уверен, написав совсем небольшие кусочки кода. В принципе, сейчас я делаю то же самое, но уже не так нуждаюсь в этих небольших экспериментах, если пишу на Erlang. Если же пишу на Ruby или Java, то вспоминаю прошлое и провожу эксперименты, так как не знаю, что может быть дальше.

Сейбел: И посреди обдумывания вы вдруг понимаете, каким должен быть код?

Армстронг: Да, все части складываются воедино. Но, вероятно, объяснить другим я не смогу — просто приходит сильнейшее чувство, что если начать писать программу сейчас, она заработает. Я не знаю в точности, что это за решение. Это как с яйцом. Цыпленок готов вылупиться из яйца. Я тоже готов.

Перейти на страницу:

Похожие книги

Адмирал Советского Союза
Адмирал Советского Союза

Николай Герасимович Кузнецов – адмирал Флота Советского Союза, один из тех, кому мы обязаны победой в Великой Отечественной войне. В 1939 г., по личному указанию Сталина, 34-летний Кузнецов был назначен народным комиссаром ВМФ СССР. Во время войны он входил в Ставку Верховного Главнокомандования, оперативно и энергично руководил флотом. За свои выдающиеся заслуги Н.Г. Кузнецов получил высшее воинское звание на флоте и стал Героем Советского Союза.В своей книге Н.Г. Кузнецов рассказывает о своем боевом пути начиная от Гражданской войны в Испании до окончательного разгрома гитлеровской Германии и поражения милитаристской Японии. Оборона Ханко, Либавы, Таллина, Одессы, Севастополя, Москвы, Ленинграда, Сталинграда, крупнейшие операции флотов на Севере, Балтике и Черном море – все это есть в книге легендарного советского адмирала. Кроме того, он вспоминает о своих встречах с высшими государственными, партийными и военными руководителями СССР, рассказывает о методах и стиле работы И.В. Сталина, Г.К. Жукова и многих других известных деятелей своего времени.Воспоминания впервые выходят в полном виде, ранее они никогда не издавались под одной обложкой.

Николай Герасимович Кузнецов

Биографии и Мемуары
100 великих гениев
100 великих гениев

Существует много определений гениальности. Например, Ньютон полагал, что гениальность – это терпение мысли, сосредоточенной в известном направлении. Гёте считал, что отличительная черта гениальности – умение духа распознать, что ему на пользу. Кант говорил, что гениальность – это талант изобретения того, чему нельзя научиться. То есть гению дано открыть нечто неведомое. Автор книги Р.К. Баландин попытался дать свое определение гениальности и составить свой рассказ о наиболее прославленных гениях человечества.Принцип классификации в книге простой – персоналии располагаются по роду занятий (особо выделены универсальные гении). Автор рассматривает достижения великих созидателей, прежде всего, в сфере религии, философии, искусства, литературы и науки, то есть в тех областях духа, где наиболее полно проявились их творческие способности. Раздел «Неведомый гений» призван показать, как много замечательных творцов остаются безымянными и как мало нам известно о них.

Рудольф Константинович Баландин

Биографии и Мемуары
100 великих интриг
100 великих интриг

Нередко политические интриги становятся главными двигателями истории. Заговоры, покушения, провокации, аресты, казни, бунты и военные перевороты – все эти события могут составлять только часть одной, хитро спланированной, интриги, начинавшейся с короткой записки, вовремя произнесенной фразы или многозначительного молчания во время важной беседы царствующих особ и закончившейся грандиозным сломом целой эпохи.Суд над Сократом, заговор Катилины, Цезарь и Клеопатра, интриги Мессалины, мрачная слава Старца Горы, заговор Пацци, Варфоломеевская ночь, убийство Валленштейна, таинственная смерть Людвига Баварского, загадки Нюрнбергского процесса… Об этом и многом другом рассказывает очередная книга серии.

Виктор Николаевич Еремин

Биографии и Мемуары / История / Энциклопедии / Образование и наука / Словари и Энциклопедии