Книга: Джоэл и снова о программировании
Назад: Глава девятая. Лекция в Йеле
Дальше: Часть третья. Значение проектирования

Глава десятая. Советы студентам, изучающим вычислительную науку

2 янваpя 2005 года, воскресенье

Несмотря на то что лишь год или два назад я распространялся по поводу того, что богатые графические клиенты Windows — наше будущее, тем не менее я иногда получаю письма от студентов с просьбой посоветовать им, в каком направлении продвигать свою карьеру. А поскольку сейчас как раз сезон приема на работу, я решил изложить свои обычные рекомендации, которые можно прочесть, посмеяться и забыть.
К счастью, большинство студентов достаточно самонадеянны и никогда не обращаются за советом к старшим, что в области вычислительной науки весьма разумно, потому что старшие склонны говорить допотопные глупости вроде «спрос на набивщиков перфокарт к 2010 году превысит 100 000 000» или «сейчас везде требуются программисты на Lisp».
Я тоже понятия не имею, о чем говорю, когда даю советы студентам. Я так безнадежно отстал, что не могу разобраться с AIM и по старинке пользуюсь (вот ужас!) электронной почтой, популярной в те времена, когда музыка выходила на плоских круглых пластинках, называемых «CD».
Поэтому лучше не слушать то, что я здесь говорю, а вместо этого написать какую-нибудь сетевую программу, помогающую студентам назначать свидания.
И все же.
Если вам нравится программировать, то у вас есть ряд преимуществ. Во-первых, вы из тех немногих счастливчиков, кто может неплохо зарабатывать себе на жизнь, занимаясь тем, что им нравится. Большинству повезло меньше. Сама идея «любить свою работу» достаточно нова. Всегда счи-
талось, что работа — нечто неприятное, чем нужно заниматься, чтобы заработать деньги, которые нужны для того, чтобы, выйдя в 65 лет на пенсию, вы наконец-то смогли заняться тем, что вам нравится, — если хватит денег, и вы еще не слишком дряхлы для этого дела в случае, когда оно требует крепких ног, хорошего зрения, способности пройти пять метров без одышки и так далее.
Так, о чем я говорил? Ах, да, советы.
Чтобы больше не отвлекаться, вот вам Семь Бесплатных Советов Джоэла Студентам, изучающим вычислительную науку (стоят они ровно столько, сколько вы за них заплатили):
1. Научитесь писать до окончания учебы.
2. Изучите язык C до окончания учебы.
3. Изучите микроэкономику до окончания учебы.
4. Не пренебрегайте курсами, не имеющими непосредственного отношения к вычислительной науке, даже если они кажутся вам неинтересными.
5. Выберите курсы, где активно занимаются программированием.
6. Не бойтесь, что все рабочие места для программистов окажутся в Индии.
7. Постарайтесь найти хорошую летнюю практику.
А теперь читайте обоснования, если только вы не настолько доверчивы, чтобы бездумно следовать моим советам, ибо тогда добавится еще один пункт, восьмой: найдите специалиста, который поможет вам поднять самооценку.

Научитесь писать до окончания учебы

Достигла бы Linux такого успеха, если бы Линус Торвальдс не сумел так успешно ее пропагандировать? Да, он блестящий программист, но именно благодаря его таланту излагать свои мысли по-английски и распространять их с помощью электронной почты и почтовых списков Linux привлекла множество добровольных разработчиков со всех концов света.
Вы слышали о последнем веянии моды — «экстремальном программировании»? Не стану высказывать здесь свое мнение об XP, но причина, по которой вам стало известно о нем, это его рекламирование очень одаренными писателями и ораторами.
Даже в ограниченных рамках какой-нибудь организации, занимающейся программированием, наибольшей властью и влиянием пользуются те программисты, которые пишут и говорят по-английски понятно, убедительно и спокойно. Иметь высокий рост тоже полезно, но тут что-либо изменить уже не в ваших силах.
Разница между неплохим и выдающимся программистами не в количестве языков программирования, которыми они владеют, и не в том, какой язык предпочитают, — Python или Java. Разница в их способности доносить свои идеи. Их сила — в умении убеждать других. Они пишут ясные комментарии и технические спецификации, благодаря чему их код понятен другим программистам, а значит, другие программисты могут использовать и развивать их код, вместо того чтобы переписывать его. Без этого код бесполезен. Благодаря написанной ими четкой технической документации для конечных пользователей те смогут понять, какую работу выполняет этот код, и это единственный способ для таких пользователей увидеть ценность этого кода. Где-то в глубинах SourceForge погребена масса прекрасного и полезного кода, которым никто не пользуется, потому что создавшие его программисты — плохие писатели (или вообще никакие), и никто не знает об их трудах, и их великолепный код так и чахнет где-то.
Я не беру на работу программистов, которые не умеют писать, — то есть хорошо писать — по-английски. Если вы умеете писать, то, где бы вы ни работали, вам скоро предложат написать спецификацию, и это будет означать, что вы уже приобрели некоторый вес и замечены руководством.
В большинстве колледжей есть курсы, обозначенные как «требующие интенсивной письменной работы», то есть для сдачи экзаменов по ним нужно исписать массу страниц. Найдите такой курс и запишитесь на него! Ищите курсы из любой области, где есть еженедельные или ежедневные письменные задания.
Заведите себе дневник или блог. Чем больше вы станете писать, тем лучше научитесь это делать, и наоборот: чем лучше вы будете это делать, тем больше станете писать.

Изучите язык С до окончания учебы

Пункт второй: язык C. Обратите внимание: я не сказал «C++». Хотя C встречается все реже, это по-прежнему лингва-франка профессиональных программистов. Это язык, на котором они общаются между собой, и, главное, он гораздо теснее связан с машиной, чем «современные» языки, которым вас учат в колледжах, вроде ML, Java, Python или еще какой-нибудь модной сегодня ерунды. Нужно хотя бы в течение семестра тесно поработать с машиной, иначе вы никогда не научитесь писать эффективный код на языках верхнего уровня. Вы также никогда не сможете заниматься компиляторами или операционными системами, а этот вид работы — один из лучших для программиста. Вам никогда не поручат разрабатывать архитектуру крупного проекта. Мне все равно, в какой мере вы знакомы с продолжениями, замыканиями и обработкой исключений: если вы не можете объяснить, почему while (*s++ = *t++); копирует строку, и это не самая очевидная для вас вещь на свете, значит, вы, по моим представлениям, программируете безрассудно — как врач, который, не зная основ анатомии, выписывает рецепты в соответствии с рекомендациями рекламного агента фармацевтической фирмы.

Изучите микроэкономику до окончания учебы

Очень краткое замечание для тех, кто не прослушал ни одного курса по экономике: эти курсы из тех, которые очень хорошо начинаются, излагая полезные теории и осмысленные факты с практическими примерами и так далее, а потом их уровень неуклонно снижается. То, что было полезно в начале, это микроэкономика, служащая основой буквально каждой значительной теории в бизнесе. Затем наступает деградация: вы переходите к макроэкономике (которую вполне можно опустить) с ее интересными теориями вроде связи процентных ставок и безработицы, для чего есть больше опровержений, чем доказательств, а дальше все становится еще хуже, и даже те, кто выбрал основной специальностью экономику, часто переходят на физику, что, кстати, помогает им лучше устроиться на Уоллстрит. Но микроэкономику следует изучить, потому что нужно понимать, что такое спрос и предложение, что такое конкурентное преимущество и чистая приведенная стоимость, дисконтирование и предельная полезность, чтобы получить представление о том, как действует бизнес.
Зачем изучать экономику тому, кто выбрал основной специальностью вычислительную науку? Потому что программист, разбирающийся в основах бизнеса, ценнее для бизнеса, чем тот, который не разбирается. Только и всего. Меня многократно приводили в отчаяние программисты, выдвигавшие сумасшедшие идеи, которые имели смысл в коде — и никакого смысла в капитализме. Если вы разбираетесь в этих вещах, то ваша ценность как программиста возрастает, и ваше вознаграждение тоже, о причинах чего также можно узнать, изучая микроэкономику.

Не пренебрегайте курсами, не имеющими непосредственного отношения к вычислительной науке, даже если они кажутся вам неинтересными

Пренебрежение курсами, не относящимися к специальности, — верный способ снизить свой средний балл (GPA). Отнеситесь к своему GPA со всей серьезностью. Многочисленные кадровые агенты и работодатели -и я в их числе — сразу ищут в резюме GPA, и в этом нет ничего предосудительного. В конце концов, GPA лучше, чем любой другой числовой показатель, отражает мнение десятков преподавателей о вашей работе, сложившееся на протяжении долгого времени и в многочисленных ситуациях. Результат экзамена SAT? Это всего лишь один тест, длящийся несколько часов. В GPA нашли отражение сотни контрольных работ, промежуточных экзаменов и работы в классе на протяжении четырех лет. Да, с ним связаны свои проблемы. На протяжении ряда лет происходила инфляция этой оценки. Ваш GPA ничего не говорит о том, как вы его получили, — через простые курсы экономики домашнего хозяйства в коммунальном колледже или изучая квантовую механику на старших курсах Калифорнийского технологического института. Отсеяв всех с GPA 2.5 из коммунального колледжа, я требую характеристики и рекомендации. А затем смотрю, чтобы высокие оценки были по всем предметам, а не только по вычислительной науке.
Почему мне, работодателю, который ищет программистов, интересно, какие оценки у кандидата по европейской истории? В конце концов, история — скучная вещь. Вы говорите, что я должен взять вас, хотя когда работа скучная, вы не очень стараетесь? В программировании тоже есть скучные вещи. Любая работа временами бывает скучной. И я не хочу принимать на работу людей, которые хотят заниматься только интересными вещами.
Во время учебы я записался на курс под названием «культурная антропология», потому что решил — должен же я что-то знать об антропологии, а этот курс показался мне интересным обзором.
Интересным? Если бы я только знал, что меня ждет! Мне пришлось читать страшно нудные книги об индейцах влажных лесов Бразилии и аборигенах островов Тробриан, которые, при всем уважении к ним, меня вовсе не интересуют. В какой-то момент занятия стали такими нудными, что я предпочел бы им даже такое захватывающее зрелище, как наблюдение за ростом травы. Я совершенно утратил интерес к этому предмету. Полностью и окончательно. Слезы текли из глаз — так я устал от бесконечных рассказов о сборе картофеля. Не знаю, почему тробрианские островитяне столько времени посвящали сбору картофеля, не могу вспомнить — это очень скучно, но по этому курсу предстоял экзамен в середине семестра, поэтому я упрямо корпел над ним. В конечном итоге, я решил, что культурная антропология — это данное мне судьбой испытание готовности противостоять скуке. Если я смогу получить «А» по курсу, который требует от меня заучить все, что касается индейского праздника с приношением даров, то смогу выдержать любое дело, каким бы скучным оно ни оказалось. Когда впоследствии я случайно попал в Линкольнский центр и должен был просидеть восемнадцать часов, слушая «Кольцо Нибелунгов» Вагнера, это показалось мне едва ли не удовольствием по сравнению с изучением обычаев народа Квакиутл, которое я должен был вспомнить с благодарностью.
Я получил свою «А». И если я смог это сделать, то и вы сможете.

Выберите курсы, где активно занимаются программированием

Я точно помню, когда я решил не поступать в аспирантуру. Это было во время курса динамической логики, который в Йеле читала Ленора Зак, блестящий преподаватель факультета CS.
Едва ли мои мрачные воспоминания помогут воздать должное этой области, но все же позвольте довести рассказ до конца. Идея формальной логики состоит в том, что вы доказываете справедливость одних вещей, исходя из справедливости других. Например, в силу формальной логики предложения «всех, у кого хорошие оценки, берут на работу» и «у Джонни хорошие оценки» в сумме позволяют вывести новую истину, а именно, что «Джонни возьмут на работу». Это все довольно причудливо, и деконструктивисту хватит десяти секунд, чтобы расправиться со всем полезным, что есть в формальной логике, оставив вам нечто забавное, но бесполезное.
Динамическая логика — это то же самое, но дополнительно появляется время. Например, из «После того, как свет включен, вы можете видеть свои ботинки» плюс «Свет включен ранее» следует «Вы можете видеть свои ботинки».
Динамическая логика привлекает таких блестящих теоретиков, как профессор Зак, потому что она укрепляет надежду на формальное доказательство предложений, касающихся компьютерных программ, что могло бы принести пользу в случае, скажем, формального доказательства того, что память на флеш-карте марсохода не переполнится, и он не станет непрерывно перезагружаться вместо того, чтобы ездить по Красной планете и разыскивать на ней марсиан.
Итак, на первой лекции курса профессор Зак исписала две классные доски и изрядную часть соседней стены доказательством того, что если у вас есть электрический выключатель, и свет не горит, то, щелкнув выключателем, вы зажжете свет.
Доказательство было безумно сложным, и допустить в нем ошибки было очень легко. Труднее было проверить корректность доказательства, чем поверить, что, щелкнув выключателем, вы зажжете свет. На самом деле, во всем этом длиннющем доказательстве было опущено множество переходов, потому что формально обосновывать их было бы слишком скучно. Одни переходы обосновывались излюбленным методом доказательства по индукции, другие доказывались от противного, были еще такие, справедливость которых подтверждалась одним из старшекурсников.
На дом было задано доказать обратное: если света не было и теперь он горит, значит, вы щелкнули выключателем.
Я честно пытался доказать это.
Я долго просидел в библиотеке.
Через пару часов я обнаружил ошибку в первоначальном доказательстве, которое я пытался смоделировать. Может быть, я просто ошибся, когда записывал его, но это привело меня к некоторому выводу: если нужно три часа, чтобы записать на доске доказательство тривиального факта, и при этом сто раз можно допустить ошибку, то таким методом никогда не удастся доказать что-либо интересное.
Но для тех, кто занимается математической логикой, это не имеет никакого значения: им интересна не польза, а сам процесс.
Я бросил этот курс и поклялся никогда не поступать в аспирантуру по вычислительной науке.
Вывод из всей этой истории: вычислительная наука и разработка программного обеспечения — разные вещи. Если вам очень повезет, то в учебном плане вашего колледжа разработка программного обеспечения может занимать приличное место, но так бывает не всегда — в элитных учебных заведениях полагают, что практические навыки лучше получать в профессионально-технических училищах и по программам реабилитации бывших заключенных. Обычное программирование можете изучать в каком-то другом месте. Мы — Йельский университет, мы Штампуем Будущих Мировых Лидеров. Думаете, вы платите 160 000 долларов за право изучать циклы while? Что вам тут — семинар поJava в отеле Airport Marriott?
Тьфу!
Беда в том, что у нас фактически нет профессионального обучения разработке программного обеспечения, поэтому если вы решили стать программистом, то, скорее всего, выберете в качестве основной специальности вычислительную науку. Это замечательная специальность, но разработка программного обеспечения — несколько иное дело.
Однако вам может повезти, и на факультете CS окажется много курсов, где интенсивно занимаются программированием, так же как на историческом факультете можно найти достаточно курсов, где придется столько писать, что вы научитесь это делать. Это лучшие курсы, какие можно выбрать. Если вы любите программирование, не отчаивайтесь, что вам не понятен смысл курсов по лямбда-исчислению или линейной алгебре, где вам не придется притронуться к компьютеру. Ищите курсы уровня 400 со словом «практикум» в названии. Это просто способ скрыть полезный курс от либерально-претенциозной администрации с помощью латинского названия.

Не бойтесь, что все рабочие места для программистов отдадут в Индию

Прежде всего, если вы живете в Индии, вам нечего было беспокоиться по этому поводу раньше и нечего начинать тревожиться сейчас о тех рабочих местах, которые уходят в Индию. Это замечательные рабочие места, дай бог вам здоровья.
Но мне постоянно приходится слышать об опасном снижении числа поступающих на факультеты CS, одна из причин которого, якобы, «боязнь студентов связываться с областью, в которой все работы уходят в Индию». Это совершенная неправда, и вот почему. Во-первых, глупо выбирать себе карьеру, основываясь на сегодняшней моде в бизнесе. Во-вторых, изучение программирования дает очень хорошую подготовку для целого ряда замечательно интересных областей, таких как проектирование бизнеспроцессов, и пусть хоть все связанные с программированием работы уйдут в Индию и Китай. В третьих, — можете мне поверить — настоящих программистов очень не хватает — как здесь, так и в Индии. Да, есть группа безработных ИТ-специалистов, которые подняли большой шум по поводу того, что долго не могут найти себе работу. Но знаете, что я вам скажу? Может, им это и не понравится, но по-настоящему хороший программист найдет себе работу. В-четвертых, у вас есть на примете что-то лучшее? Вы собираетесь выбрать специальностью историю? Тогда вам остается только юридический колледж. Но мне доподлинно известно: 99% практикующих юристов ненавидят свою работу; кроме того, они работают по 90 часов в неделю. Я уже говорил: если вы любите программировать, вам сильно повезло, потому что вы окажетесь среди тех немногих, кто хорошо зарабатывает, занимаясь любимым делом.
Но мне кажется, что студенты об этом не задумываются. Сокращение числа поступающих на факультеты CS — это просто восстановление исторически оправданного уровня после неумеренного роста во время дотком-бума. Тот, прошлый пузырь, раздули те, кто, не особенно любя программирование, считал, что факультет CS поможет им получить высокооплачиваемую работу и вывести собственную компанию на биржу в 24 года. К счастью, таких уже давно нет.

Постарайтесь найти хорошую летнюю практику

Умные охотники за головами знают, что тот, кто любит программирование, в восьмом классе написал базу данных для своего зубного врача и три года вел занятия в летнем компьютерном лагере, прежде чем поступить в колледж, а потом построил систему управления контентом для газеты своего кампуса и проходил летнюю практику в софтверных компаниях. Вот такие вещи они и ищут в ваших резюме.
Если вам нравится программирование, то самая большая ошибка, которую вы можете совершить, это наняться — летом, на полставки или еще как — на какую-то работу, не связанную с программированием. Я знаю, что очень многие 19-летние хотят подработать в универмаге, складывая рубашки, но у вас есть очень ценные умения, даже если вам всего 19, и глупо складывать рубашки вместо того, чтобы воспользоваться этими навыками. К моменту окончания учебы в вашем резюме должна быть перечислена целая куча программистских работ. Выпускники Abercrombie & Fitch 9 в будущем поступают на работу в Enterprise Rent-a-Car 10, «помогая людям решать их проблемы с арендой автомобилей». (Кроме Тома Веллинга. Он играет Супермена на ТВ.)
Чтобы значительно облегчить вам жизнь и подчеркнуть, что вся эта статья посвящена исключительно заботе о наших собственных интересах, сообщаю, что моя компания Fog Creek Software принимает студентов на летнюю практику по программированию, прохождение которой сильно повысит ценность вашего резюме. «Вы, несомненно, больше узнаете о написании кода, разработках и бизнесе во время практики в Fog Creek Software, чем в каком-либо другом месте», — пишет Бен, один из наших прошлогодних практикантов, и я не подсылал в общежитие наемного бандита, чтобы заставить его это признать. Заявления принимаются до 1 февраля. Спешите.
Если вы послушаетесь моих советов, это может также кончиться тем, что вы поспешно продадите свои акции Microsoft и откажетесь от работы в Google, потому что захотите иметь собственный офис с отдельным входом, или совершите еще какие-нибудь глупости, но я в этом не виноват. Я же предупреждал: не слушайте меня.

 

***

9 «Аберкромби энд Фитч» — сеть популярных в Америке магазинов.
10 Крупнейшая в Америке компания по аренде транспортных средств.

 

Назад: Глава девятая. Лекция в Йеле
Дальше: Часть третья. Значение проектирования