Обзор книги Питера Сейбела "Кодеры за работой. Размышление о ремесле программиста"
Для особо ленивых
Если вам лень читать много букв ниже - можете посмотреть мой ролик, по которому сделана эта статья на YouTube - https://youtu.be/B1lWO5MQDak
Предупреждение.
Данный обзор книги подразумевает и субъективное мнение автора в том числе. Поскольку сам автор данного обзора является программистом с более чем двадцатилетним стажем, имеет опыт разработки как с хорошо построенными процессами, так плохо построенными процессами. Данная книга рассматривается в этом контексте, как и вопрос, почему читателю стоит ее прочитать.
В данном обзоре не будет полного пересказа содержимого книги для любителей попиариться в Instagram, Facebook свеженепрочитанной книгой в своей библиотеке. Данная книга представляет собой довольно объемный труд и подразумевает медленное ее прочтение, а не по диагонали.
Если вы любитель щеголять свеженепрочитанными книгами в своем Инстаграмм перед подчиненными и коллегами, добро пожаловать отсюда.
Об авторе

Питер Сейбел(Peter Seibel) - программист, ставший писателем, и, одновременно, писатель, ставший программистом. Получив степень бакалавра, по английскому языку в Йельском университете и недолго работая журналистом, он был соблазнен сетью. В начале 90-х годов он писал на Perl для Mother Jones Magazine и Organic Online. Он участвовал в разработке на Java в качестве сотрудника WebLogic, а затем преподавал программирование на Java. В 2003 году он уволился с должности архитектора транзакционной системы обмена сообщениями на Java, планируя изучить Lisp на год. Вместо этого он потратил два года на написание книги “Practical Common Lisp”. С тех пор он руководит Gigamonkeys Consulting, работает над Coders at Work.
О чем данная книга
Данная книга представляет большой труд по истории нашей отрасли. Эта книга о ЛЮДЯХ. Питер Сейбел проделал очень большую работу, собрав в своей книге очень многих значимых представителей профессии, благодаря которым, наш мир сейчас такой, какой он есть.
Это люди, создававшие интернет в текущем его виде, заложившие основу языков программирования, с которыми мы сейчас по своей профессии работаем, заложившие основы операционных систем, чьи основные принципы используют сегодня основные операционные системы на базе ядра Linux, основные программы для работы с базами данных - все то с чем мы работаем сейчас для создания бизнес-приложений.
Автор выстраивает свое интервью с каждым из инженеров в своей книге по схожему принципу, что позволяет увидеть разницу в подходах к работе. Питер Сейбел дает читателю представление «а как было раньше», возможность сравнить с тем, как программы пишут сегодня. Это представляет большой интерес для программистов , руководителей, аналитиков и других специалистов.
Плюсом является то, что автор книги – Питер Сейбел – человек не «снаружи» системы, он вовлечен в нашу работу, он знает какие вопросы задать, что уточнить.
Минусом этой книги является то, что это не легкая книга на один вечер. Она требует обстоятельного вдумчивого чтения и общего понимания специфических тем, обсуждение которых ведет автор со своими собеседниками. Более того, можно сказать это небольшой такой экскурс в историю нашей профессии, в историю того как зарождалась сеть в частности.
Некоторые собеседники Питера Сейбела
- Джейми Завински – один из разработчиков браузера Netscape, человек сделавший много для развития языка LISP, бывший ведущий разработчик XEmacs, разработчик XScreensaver
- Брэд Фицпатрик – создатель LiveJournal
- Джошуа Блох – создатель Collections Framework в Java(когда жива была Sun Microsystems)
- Брендан Айк – создатель языка JavaScript
- Саймон Пейтон-Джонс – создатель Haskell
- Джо Армстронг – создатель Erlang
- Питер Дойч – человек создавший Ghostscript(система, которая сегодня касается в принципе каждого, в быту и работе)
- Ден Ингаллс – участвовал в создании языка Smalltalk
- Берни Козелл – программист, участвовавший в создании ARPANET
- Кен Томпсон – один из создателей UNIX(системы, наследие которой сильно повлияло на всю отрасль
- Дональд Кнут – создатель TEX, автор больших трудов по программированию
Я не буду рассматривать всех, тех, с кем Питер проводил интервью, я рассмотрю интервью с наиболее интересными для меня личностями.
Это Джейми Завински, Кен Томпсон и Дональд Кнут.
Джейми Завински

Джейми Завински начал программировать еще в старшей школе и за довольно короткое время успел поучаствовать в очень разных проектах.
Для всех пользователей интернета, наверное, самый значимый проект, с которым работал Завински - Netscape Navigator.
Программист также рассказывает о своем опыте создания компиляторов для LISP, о написании встроенного отладчика для этого языка, чем была решена проблема сложностей с отладкой LISP программ через GDB(GNU Debugger).
Также Завински поучаствовал в оптимизации системы скриптов в Emacs - редакторе, который используют многие программисты.
В интервью он рассказывает почему не любит язык C++ и почему ненавидит перл, но при этом его применяет.(интервью было проведено еще в тот момент когда нормой было наличия PERL на всех серверах).
Завински - сторонник прагматичного подхода, когда инженер решает, как написать тот или иной кусок кода самостоятельно, не заморачиваясь на паттерны проектирования или что-то еще.
Джейми Завински о работе и процессах в Netscape.
Очень интересная часть интервью про процессы работы в компании Netscape.
Это очень знаковая для многих тема. Netscape делала очень крутой браузер/почтовый клиент, который многие из нас использовали. По моему мнению, расцвет его был во времена 4 версии. А вот 6 версия и выше превратились в глючное распухшее нечто, мало пригодное к использованию.
Часть разговора про компанию Netscape интересна для меня, потому как она во многом про кривые процессы.

Netscape Navigator - браузер, изначально сделанный на на основе NSCA Mosaic. Версия 2.0 браузера включала почтовый клиент. Более старшие версии включали редактор HTML страниц. В рамках этого проекта был создан JavaScript и заданы тенденции развития интернета, последствия которых мы видим и сегодня.
Длительное время на рынке браузеров были 2 основных конкурента – Netscape Navigator и Internet Explorer. Тенденция начала меняться когда появился браузер Opera, а потом появился браузер Mozilla(позже Firefox). У пользователей многих операционных систем, таких как Linux, Solaris, OS/2 долгое время не было альтернатив браузеру от Netscape.
Большинство основателей netscape были бывшими разработчиками Mosaic, но по утверждению разработчиков их новый браузер не имел ничего общего по кодовой базе с браузером Mosaic.
В одна команда(меньше десяти человек) делала браузер для нескольких операционных систем. Было неформальное деление – кто делает серверную часть, кто клиентскую, кто занимается общей компоновкой системы, а кто занимается задачами специфичными для конкретных ОС.
Завински рассказывает про ненормированный рабочий день и высказывает мнение что, когда делаешь сложную систему - по другому ее не написать.
Часть работы Завински была – работа с интерфейсами для операционных систем UNIX.
После создания версии 2.0 руководство компании Netscape решило выделить почтовый клиент(который уже был в составе браузера) в отдельную разработку. Для чего они купили еще одну компанию Collabra, у которых был свой почтовый клиент. Как это бывает, Завински и еще одного разработчика заставили работать в подчинении разработчиков из Collabra. А эти ребята любили язык C++ и писать программное обеспечение,следуя модным шаблонам архитектурного проектирования. Причем упаковка всего и вся в модные шаблоны проектирования у этих людей была превыше целесообразности. Продукт начал распухать. По мнению Завински это и сгубило компанию.
От себя могу сказать что ушел с Netscape на альтернативу в виде браузера Opera, как только там весь фунционал стал работать сравнимо по качеству. Версия 6.0, 7.0 браузера Netscape на Linux на машинах того времени была малоработоспосбна. В это время появилась не только Opera, но и появилось много браузеров на основе движка KHTML(на основе которого был сделан Webkit для safari).
Джейми Завински. О ремесле и реальной жизни
Завински в интервью рассказывает о предпочтении писать код с нуля, чем разбираться в старом коде – чаще проще и быстрее переписать плохо работающий код, чем разбираться, ЧТО в нем плохо работает, о компромиссах между скоростью написания кода и 100% качеством и функционалом(когда 80% того и того порой бывает достаточно).
Еще Завински предпочитает делать модульные тесты, которые запускает сам программист во время разработки, но при этом сам не сторонник 100% автоматического тестирования кода, по той простой причине что программист вместо решения целевых задач начинает писать автотесты.
Завински не считает практичным что каждый разработчик знает каждую часть проекта. Он не считает практичной новомодную идею, что за весь код отвечает вся команда, а не отдельные люди каждый за свой участок.
Кен Томпсон

Кен Томпсон принимал участие в создании такого количества вещей, что наверное все сложно будет перечислить. В семидесятых годах прошлого века вместе с Денисом Ричи он разработал многозадачную операционную систему Unix. В интервью, он рассказывает, что хотя систему делали с нуля, многие вещи почерпнули из предшественника ОС MULTICS.(например иерархическую ФС, отдельную оболочку для выполнения пользовательских команд, где каждая команда пользователя представлялась как отдельный процесс).
Томпсон рассказывает, что Bell Labs потерпели неудачу с Multics. Фундаментальные исследования по операционным системам(чем была разработка UNIX) не соответствовали генеральной линии компании, что было риском увольнения для всех вовлеченных в проект. Но у команды получилось сделать цельную работающую ОС, что было в итоге оценено компанией.
UNIX и наследники этой ОС имеют сложную и разветвленную историю. Но, конкретно Томпсона, можно считать одним из авторов ОС. В рамках этой работы они с Ричи помогли развитию языка C, на котором все это писали. Томпсон так же в дальнейшем принимал участие в разработке Plan 9, ОС Inferno. Томпсон принимал участие в раннем тестировании языка C++ и в интервью он хорошо “прошелся” по Страустрапу. По его утверждению, чтобы заручиться поддержкой как можно большого количества заинтересованных людей Страустрап добавлял в язык недоделанный функционал и превратил его в мусорную кучу полунедоделанных идей, вместо того чтобы ограничить в первых версиях языка добавление лишних сырых вещей.
Благодаря Томпсону и Роберту Пайку мы имеем сегодня универсальную кодировку UTF-8 для работы с текстом. Принятие UTF-8 за стандарт практически везде сняло множество проблем с национальными кодировками.
В последние годы Томпсон работает в компании Google. Для современных программистов его имя тоже должно что-то значить, поскольку Кен Томпсон считается одним из авторов языка Go(создан в корпорации Google)
Кен Томпсон. Подходы к работе
В интервью про создание UNIX рассказывает что основную работу начал, когда жена и дети на месяц уехали. Вместо рисования схем Кен предпочитает длительные размышления^ как все должно работать. В процессе этих размышления вырисовывается общая схема проекта. Порой для этого требуется много времени. Несколько недель чисто на размышления.
Интересно где в наших реалиях сегодня такое программистам позволяют? :)
Во время работы над UNIX Кен Томпсон перешел на свои ритмы сна/бодрствования, не привязанные к дневным ритмам, и много работал. Утверждает, что только когда программиста ничего не отвлекает - только так он способен выдать максимум.
Он критикует современное программное обеспечения за слишком большое количество слоев и огрехи компоновки, когда чтобы поправить что-то незначительное, надо лезть смотреть логику в куче слоев одновременно и править не только в одном изолированном месте, а сразу в куче мест программы.
Еще в интервью есть очень интересный момент на тему того, как Томпсон отвечает на вопрос про собеседование новых сотрудников. Он предлагает не заниматься головоломками, вопросами про знание теории и языков. Его предложение состоит в том, что надо понять как соискатель мыслит. Для чего достаточно попросить рассказать о самом сложном проекте, который делал человек. И задавать вопросы по мере повествования. Нет ничего лучше, чем посмотреть, как человек принимал решения «выстраданные на собственной шкуре» нежели какое-либо теоретизирование.
Дональд Кнут.

Дональд Кнут – деятель, который не укладывается в голове у любого нормального человека. Масштаб его поражает практически всех программистов, кто начинает интересоваться тем, чем занимался этот человек.
Кнут большую часть жизни проработал в Стендфорде. Огромный труд его жизни, который знает практически каждый программист(хотя бы заочно) – «Искусство программирования на ЭВМ» – это несколько томов, которые многие пользуют как справочник и как учебник.
Кнут – автор системы Tex для издательской работы и системы шрифтов METAFONT, автор языка программирования Tex. Данная система широко известна в научных кругах, поскольку никакая другая система не дает такой гибкости работы с формулами, графиками, и специфическим научным материалом. В свое время я был вынужден пользоваться Microsoft Word + Equation для курсовых и дипломных работ и уперся в проблемы производительности и нормальной возможности распечатки научных текстов у этого десктопного ПО. Tex/Latex сложен в обращении, требует отдельного его изучения, но хорошо решает эти проблемы.
Дональд Кнут – автор большого количества статей, и он же сделал большой вклад в теорию оценки порядка сложности алгоритмов.
Кнут известен как композитор и органист. Он сочиняет музыку на религиозные темы.
Дональд Кнут. О работе и жизни
Пакет Tex писался карандашом в блокноте больше полугода. Только после «готовности» на бумаге - Дональд Кнут начал вводить текст программы в компьютер и6 в процессе, вносить исправления в бумажную версию. Фактически сам Тex – это полноценный язык программирования для издательской деятельности.
Кнут утверждает, что во время разработки программного обеспечения невозможно заниматься преподавательской деятельностью. Создание издательской системы для него лично открыло тот факт, насколько полного погружения в работу и самоотречения требует работа программиста.
В интервью Кнут затрагивает проблемы переоптимизации программного обеспечения. Например, что нецелесообразно делать сложные сбалансированные деревья там, где достаточно обойтись простым бинарным деревом.
Также Кнут подымает проблему моды на «черные» ящики в современной разработке программного обеспечения. Когда программисты склеивают готовые библиотеки и компоненты, не интересуются что внутри и как это работает. Проблема потери такого интереса и желания разобраться у разработчиков – это большая проблема в современной. разработке.
Кроме всего прочего, Кнут – автор литературного программирования. Литературное программирование – метод написания программ, когда программист по определенному шаблону пишет больше документацию(вместе с кодом), чем сам код, из этого кода уже генерирует собственно ту программу, которая пойдет на выполнение.
Достоинство метода - код как литературное произведение, получается полностью задокументирован. Но есть и недостаток, на который указывают многие собеседники Сейбела в этой книге - программисту придется поддерживать 2 конструкции программы. Одну – эфемерную литературную версию, одну - тот код, что действительно делает всю работу. Именно поэтому идея не пришлась разработчикам по вкусу – она создает лишнюю работу.
Еще в интервью Кнут говорит о постоянно растущей сложности в отрасли. Что приводит к тому что все кто с ней связаны так или иначе постоянно упираются в предел собственных физических возможностей.
Общие вещи, о которых говорят разработчики.
У представителей отрасли из этой книги часто схожее мнение по многим вопросам. Например, многие из них скептически относятся к таким вещам, как парное программирование или экстремальное программирование. Про экстремальное программирование Кнут говорит как про “очередную панацею, не решившую проблему для которой его придумали”.
На парное программирование у разных людей разные взгляды. Для Фицпатрика(создателя LiveJournal) парное программирование это способ удержать его внимание на несколько часов часа на одной проблеме. Но там в интервью Бред Фицпатрик говорит о том, что у него в принципе проблемы с долговременной концентрацией на задаче. Некоторые из программистов в этой книге считают, что метод применим для правки небольших кусков кода совместно. Питер Норвиг из корпорации Google вообще считает, что на совместную работу должно уходить не более 10% времени людей из команды.
Практически у большинства программистов, представленных в этой книге есть необходимость при разработке ПО предварительного максимального погружения в проект, чтобы все обдумать, продумать конструкции в голове, а потом уже приступить к реализации. И практически ни один из этих товарищей, по из словам, не использует UML или еще какие-то модные инструменты для предварительного проектирования программ.
У меня больше всего заставили задуматься над процессами Кен Томпсон и Завински. И то что многие из этих товарищей говорят о бесполезности головоломок и вопросов по теории при найме новых людей
Заключение
При чтении интервью, особо с создателем UNIX Кеном Томпсоном возникает ощущение, что случись Томпсону писать систему по “модным гибким методологиям agile, SCRUM, KANBAN”, которые нынче бездумно внедряют многие компании, случись Кнуту писать свой Tex с кучей аналитиков, менеджеров и бесконечных совещаний, случись Питеру Дойчу писать ghostscript по новым “метолодологиям” - этих систем сегодня бы не было.
Книга Сейбела в первую очередь про людей, во вторую очередь про процессы, а уже в третью очередь она про тех самых людей, благодаря которым у нас коммуникационное оборудование работает как оно должно работать (наследие ARPA), сайты работают так как они работают(наследие Netscape), серверные операционные системы работают по принципам которые были заложены в Unix, а в наших дистрибутивах Linux и даже MacOS - мы имеем систему печати документов, которая в определенных ситуациях очень выручает
И читать про то как это все делалось, кем это делалось - очень интересно. Книга очень крутая, я рекомендую ее к прочтению. Единственное, что хочется предупредить, что читается она тяжело и долго, но оно того стоит.
