Чтение онлайн

на главную - закладки

Жанры

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

Сейбел Питер

Шрифт:

Программисты научились пользоваться разными языками, но не научились пользоваться легкими способами склейки программ. Конвейеры UNIX - “А переходит в Б переходит в В” - банально простой способ склейки. Пользуются ли ими программисты? Нет, они берут несколько API и связывают их в одной и той же области памяти, что очень сложно и не позволяет поддерживать разные языки. Если языки из одного семейства, это проще - с императивными языками, например, все прекрасно. А если, допустим, у нас есть Пролог и Си? У них совершенно разное представление об управлении памятью. Их невозможно скомпоновать. То есть повторное использование кода тоже невозможно. Вероятно, тут замешаны крупные коммерческие интересы:

кому-то очень не хочется, чтобы все это работало вместе. Появляются тысячи рабочих мест для консультантов, тысячи утилит для решения проблем, которых нет, - они решены много лет назад.

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

Программирование полностью отличается от того, как мы конструируем вещи в реальном мире. Допустим, вы автопроизводитель. Вы покупаете компоненты у субподрядчиков - батареи у Lucas, генераторы еще у кого-то - и соединяете их вместе, последовательно. Когда вы строите дом, то кладете кирпичи один на другой и помещаете дверь там-то. Именно так делаются чипы: есть готовая плата, обеспечивающая эти соединения. Покупая чипы, вы соединяете их ножки проводами. Хорошо бы и программы делать так, но мы не делаем.

Причина, по которой мы этого не делаем, связана с параллелизмом. Чипы, соединенные последовательно, выполняют операции параллельно. И они посылают сообщения. Они основаны на парадигме обмена сообщениями - той парадигме программирования, в которую я верю. Но сегодня она не применяется для создания программ. Erlang мог пойти по этому пути - во всяком случае, я бы этого хотел: эволюционировать в сторону компонентного строения. Пока я еще этим не занялся, но хотел бы разработать графический внешний интерфейс для создания компонентов и начать писать программы для связывания их воедино. Потоковое программирование крайне декларативно. В нем нет такого понятия, как последовательные состояния. В нем нет программного счетчика, который в них переходит. Что-то просто есть, и все. Декларативная модель легка для понимания. Но в большинстве языков она не реализована.

Я не хочу этим сказать, что содержимое “черного ящика” не может быть сложным. Возьмите, например, такую утилиту, как grep. Если глядеть извне, это что-то вроде квадратика. На входе - поток данных, файл. Можно сказать cat foo | grep, и grep получает некие аргументы, регулярное выражение, которому нужно найти соответствие. Хорошо. И grep выдает все строки, соответствующие этому регулярному выражению. На уровне восприятия то, что делает grep, до крайности просто. На входе - файл. Регулярное выражение. На выходе - набор (поток) строк, соответствующих этому выражению. Но это не означает, что действующий внутри “черного ящика” алгоритм прост - он может быть предельно сложным.

Происходящее внутри “черного ящика” может быть предельно сложным. А процесс склеивания сложных компонентов необязательно сложен. Использовать grep совсем несложно. Вот чего я не вижу в архитектуре систем: четкого различия между склеиванием составных частей и устройством, порой очень сложным, самих частей.

Соединяя программы при помощи API языка программирования, мы не получаем абстракцию “черного ящика”. Мы отправляем их в одну и ту же область памяти. Если grep есть модуль, который предоставляет вызовы в своем API, и вы снабжаете его указателем char*, и вам надо выделять для этого память, и вы занимаетесь

глубоким копированием этой строки - можно ли создать параллельный процесс, делающий все это? В таком случае это становится трудным для понимания. Не знаю, почему люди склеивают программы таким замысловатым образом. Надо выбирать методы попроще.

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

Армстронг: Главные отличия в том, как я думаю о программировании, не имеют ничего общего с аппаратным обеспечением. Да, оно становится быстрее и мощнее, но наш мозг в миллион раз мощнее лучших программных инструментов. Я могу писать программу и вдруг, через много времени, обнаружить, что в ней ошибка: если произойдет вот это, и вот это, и вот это, случится сбой. Смотрю в код - и правда, ошибка! Хотя ничто в работе программы не говорит об этом. А теперь скажите, какая среда разработки на такое способна? Поэтому перемены, которые со мной произошли, - это перемены в моей голове.

Есть две перемены, связанные с опытом программирования. Вот первая: когда я был моложе, то обычно, закончив писать программу, переставал работать над ней. Ведь все закончено! Потом наступало озарение: “Что за бред?! Я идиот! Надо переписать”. И потом снова то же самое.

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

Иногда, правда, я ставлю совсем небольшие эксперименты - пишу крошечные программы, только чтобы ответить на какой-то вопрос. Я все продумываю, и программа более-менее работает по моему плану, потому что я продумал ее. Это, конечно, занимает много времени. Пишешь программу, потом наступает озарение, все переписываешь - написание программы может занять год. Поэтому теперь я предпочитаю целый год думать над ней. Просто я ничего не набираю на клавиатуре.

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

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

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

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

Поделиться:
Популярные книги

Вонгозеро

Вагнер Яна
1. Вонгозеро
Детективы:
триллеры
9.19
рейтинг книги
Вонгозеро

Кротовский, может, хватит?

Парсиев Дмитрий
3. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
аниме
7.50
рейтинг книги
Кротовский, может, хватит?

Сборник коротких эротических рассказов

Коллектив авторов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Сборник коротких эротических рассказов

Архонт

Прокофьев Роман Юрьевич
5. Стеллар
Фантастика:
боевая фантастика
рпг
7.80
рейтинг книги
Архонт

Медиум

Злобин Михаил
1. О чем молчат могилы
Фантастика:
фэнтези
7.90
рейтинг книги
Медиум

Титан империи 8

Артемов Александр Александрович
8. Титан Империи
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Титан империи 8

Ведьма Вильхельма

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
8.67
рейтинг книги
Ведьма Вильхельма

Волхв

Земляной Андрей Борисович
3. Волшебник
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Волхв

Я еще не барон

Дрейк Сириус
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще не барон

Темный Патриарх Светлого Рода

Лисицин Евгений
1. Темный Патриарх Светлого Рода
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода

Пистоль и шпага

Дроздов Анатолий Федорович
2. Штуцер и тесак
Фантастика:
альтернативная история
8.28
рейтинг книги
Пистоль и шпага

Корпулентные достоинства, или Знатный переполох. Дилогия

Цвик Катерина Александровна
Фантастика:
юмористическая фантастика
7.53
рейтинг книги
Корпулентные достоинства, или Знатный переполох. Дилогия

Ученик. Книга 4

Первухин Андрей Евгеньевич
4. Ученик
Фантастика:
фэнтези
5.67
рейтинг книги
Ученик. Книга 4

Часовое имя

Щерба Наталья Васильевна
4. Часодеи
Детские:
детская фантастика
9.56
рейтинг книги
Часовое имя