Кодеры за работой. Размышления о ремесле программиста
Шрифт:
Норвиг: Когда я поступал, компьютерные курсы были в ведении факультета прикладной математики. Когда я заканчивал колледж, уже был отдельный компьютерный факультет, но я специализировался по математике. Пойти на компьютерный факультет значило специализироваться по программам IBM. Надо было изучать их язык ассемблера, их операционную систему OS/360 и так далее. Не очень-то увлекательно. Я ходил на лекции, которые мне нравились, но погружаться во все это не хотел.
После колледжа я два года проработал в Кембридже, в одной компании, выпускавшей ПО. Потом я подумал: «Колледж надоел мне за четыре года, работа — за два, значит, колледж я
Сейбел: Чем вы там занимались?
Норвиг: Они разрабатывали инструменты для проектирования программ, а также занимались консалтингом. Основатели компании работали в Дрейперовской лаборатории в Кембридже над проектом «Аполлон» и еще над чем-то. Поэтому у них были связи в ВВС и правительственные заказы. У них был интересный взгляд на то, как проектировать программы. Я не очень верил в саму идею, но это было занятно.
Одним из проектов была программа построения блок-схем — она должна была анализировать готовую программу и генерировать для нее блок-схему. Отличная мысль, потому что блок-схемы нужны. Но на самом деле их всегда рисуют не до, а после написания программ. Эта программа была умная, потому что умела работать с частичной грамматикой, так что при работе с синтаксически некорректной программой пропускала те ее части, которые не могла разобрать. Она должна была уметь разбирать, к примеру, операторы IF, поскольку те образовывали разные блоки, но по поводу других частей говорила: «Сбросим это все в один блок». И вот мы получили контракт на разработку, в котором было указано, что программа должна работать под UNIX. Мы одолжили машину в Массачусетском технологическом институте и применяли для компилятора все инструменты UNIX — yacc и так далее. В последний момент нам сказали: «Нет, использоваться будет VMS». Так что никакой уасс мы уже не могли применять, но решили, что он нам и не нужен — ведь мы брали его только для составления таблиц, а это мы уже сделали.
Сейбел: Пока грамматика не меняется, все в порядке.
Норвиг: Да, так что мы поставили программу, заказчики были счастливы, а потом, разумеется, грамматика изменилась. У нас больше не было доступа к машинам с UNIX. Мне пришлось править грамматику, роясь в таблицах, и я решил: если вот здесь у нас переход в новое состояние, я создам свое состояние, и переход будет к нему.
Сейбел: Это было правильное решение? Вы не думали о том, чтобы просто написать новый парсер?
Норвиг: Наверное, так и надо было поступить. Но ведь я сделал лишь одну небольшую правку.
Сейбел: А не получилось так, что им каждые три недели приходилось сталкиваться с очередным изменением в грамматике?
Норвиг: Я тогда уже ушел в магистратуру, и это уже была не моя проблема.
Сейбел: Уже не ваша... Итак, вы защитили диссертацию. Вы бы хотели, чтобы ваше обучение программированию шло по-другому?
Норвиг: В конце концов я занялся промышленной разработкой ПО. Возможно, стоило заняться этим раньше. Постепенно я всему научился, но много времени провел в колледже и магистратуре. Правда, мне нравилось, так что ни о чем не жалею.
Сейбел: А чему вам пришлось учиться, если говорить о промышленной разработке ПО?
Норвиг: Планировать работу и делать так, чтобы довольны были все — разработчики, клиенты, менеджеры. В магистратуре ведь все это не нужно — просто приходи к своему руководителю
Важнейший шаг — переход от индивидуальной работы к командной: начинаешь понимать, как люди взаимодействуют друг с другом. Этому тоже не учат в колледже. Сейчас в некоторых колледжах обратили на это внимание, но в мои времена к командной работе относились плохо — считали ее жульничеством.
Сейбел: Какие навыки, кроме умения писать код, нужны тем, кто приходит в индустрию ПО?
Норвиг: Надо уметь уживаться с другими. Уметь понимать заказчика: знать, что именно ты создаешь и правильным ли путем идешь. Уметь взаимодействовать с клиентами и со своими коллегами. Уметь взаимодействовать с клиентом и своим начальством в одно и то же время. Это все разные социальные отношения, требующие разных навыков.
Сейбел: Программирование стало более социальным?
Норвиг: Думаю, да. Компьютерщики были больше обособлены от всех остальных. Раньше в основном шла пакетная обработка, интерфейсы были куда проще. Можно было работать по модели «водопада»: ввод — колода карт, вывод — отчет с таким-то номером в такой-то колонке.
Возможно, это была не лучшая модель для спецификаций, и с самого начала нужно было теснее взаимодействовать с клиентом. Но так сохранялась обособленность. Сейчас все намного подвижнее, больше взаимодействия, и лучше не составлять полную спецификацию в начале, а сесть вместе с клиентом и устроить мозговой штурм.
Сейбел: А были особенно памятные случаи, которые подчеркивают разницу между одиночной и командной работой?
Норвиг: Особенно памятных, пожалуй, не было. Просто пришло осознание того, что я не могу сделать все сам. Программирование — это в немалой степени способность держать в голове столько, сколько можешь, но это работает только до какого-то предела. По крайней мере, у меня это так. А потом надо полагаться на других, чтобы получить хорошие абстракции и использовать то, что у них есть. Теперь я все чаще думаю в терминах «Вероятно, это уже сделано. И как?», а не «Я знаю, как это сделано, потому что сам это сделал». По идее, вот так — а если не так, надо понять почему и научиться это использовать.
Сейбел: Освоение командного подхода позволяет самому браться за вещи большего размера, чем раньше? Вы как бы сам себе команда, только растянутая во времени?
Норвиг: Это так. И я наблюдаю это у молодых программистов. Еще одна разница между «тогда» и «сейчас»: программирование больше похоже на сборку из готовых модулей, чем на создание чего-то с нуля. Сейчас, делая домашнее задание — скажем, сайт, — школьник возьмет для одной части Ruby on Rails, для другой — Drupal, для третьей — скрипт на Python, а потом скачает статистическую программу. И все это связывается между собой с помощью скриптов, а не пишется с нуля. Сегодня важнее понимать интерфейсы и уметь их соединять, чем знать в деталях, что делается внутри ПО.
Сейбел: Значит ли это, что успешный программист сегодня — человек другого склада?
Норвиг: Успешные люди, по-моему, не изменились, насколько я вижу. Но в целом — да, в наши дни лучше уметь быстро понять, что тебе нужно, чем досконально знать все процессы. Тут, конечно, есть этакая бравада: «Я просто беру и делаю это». Человек смело признается: «Я не понимаю, что тут внутри, но я залез в документацию и нашел там эти три штуки. Попробовал — работает. Значит, вперед».