Биография | Автореферат | Библиотека | Ссылки | Отчёт о поиске

 

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

 

К счастью, большинство студентов достаточно смелы, чтобы никогда не стесняться спрашивать советов у старших, что в области вычислительной техники (Computer Science) весьма уместно, потому что старшие склонны говорить устаревшие глупости, подобные этим: “спрос на операторов превысит 100 000 000 к 2010 году” или “lisp программисты сейчас очень востребованы”.

И все таки.

Если программирование компьютеров вам в удовольствие - молитесь: вы в числе той немногочисленной группы людей, которая может зарабатывать неплохие деньги делая то, что нравится. Большинство людей лишены такого счастья. Идея, что вы можете “любить свою работу” – это современная концепция. Раньше предполагалось, что работа – это некая неприятная вещь, которую вам приходиться делать, для того чтобы заработать денег на то, чем вы будете заниматься, когда вам стукнет 65 и вы сможете уйти в отставку, и только если вы сможете себе позволить это занятие, и если вы не очень стары, и дряхлы для этих дел, и если эти дела не требуют крепких коленей, хороших глаз, и не требуют способности проходить 20 футов без отдышки, и т.д.

Без дальнейших отступлений, вот Семь Частей Бесплатного совета Джоэла Спольски для студентов изучающих вычислительную технику (будет все же лучше если вы за них заплатите):

1. Научитесь писать до окончания учебы.
2. Выучите С до окончания учебы.
3. Выучите микроэкономику до окончания учебы.
4. Не пропускайте лекции не относящиеся к вычислительной технике, только потому что они скучны.
5. Возьмите интенсивные курсы программирования.
6. Перестаньте беспокоиться о том, что вся работа переносится в Индию.
7. Не важно чем вы занимаетесь, найдите хорошую летнюю практику.

Теперь, перед объяснениями, если только вы не настолько доверчивы, чтобы выполнять все это только потому что я вам это сказал, на всякий случай добавлю еще: 8. Найдите профессиональную помощь, чтобы не потерять самоуважение.

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

Был бы Linux так успешен если бы Линус Торвальд не проповедовал бы его? Это был дар, такого выдающегося хакера как Линус, донести свои идеи написанные на английском через электронную почту и списки рассылки, что и сделало Linux таким привлекательным для всемирной бригады волонтеров.

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

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

Разница между хорошим программистом и великим программистом не в том сколько языков программирования они знают и не в том, что они предпочитают Python или Java. А в том могут ли они говорить о своих идеях. Убеждая других людей они получают больше рычагов для достижения своих целей. Они пишут понятные комментарии и технические спецификации, это позволяет другим программистам понимать их код, что, в свою очередь, означает, что другие программисты могут использовать их наработки вместе с их кодом, а не переписывать его. Даже несмотря на то, что их код бесполезный. Написав понятную техническую документацию для конечных пользователей, они позволяют людям понять, что этот код, предполагалось, должен был делать. И это единственный путь, как пользователи могут увидеть ценность этого кода. Множество великолепного, полезного кода скрыто где-то на sourceforge, который никто не использует, потому что его создали программисты, которые не могут хорошо писать (или не пишут вообще), и никто не знает, что же они такого сделали и их замечательный код чахнет где-то там.

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

В большинстве колледжей есть некие предметы “интенсивного письма”. Это означает, что вам придется написать огромное количество материала, чтобы сдать экзамены по этим предметам. Обратите внимание на эти предметы и возьмите их! Ищите предметы в любой области в которых есть задания на каждую неделю или на каждый день.

Заведите дневник или веб-блог. Чем больше вы пишите тем легче вам будет это делать, и наоборот, чем легче это делать тем больше вы будете писать.

Выучите С до окончания учебы.

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

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

Вот краткий обзор для тех кто не изучает экономические предметы: экономика – это однаиз тех областей, которая сразу же начинается с приятного возбуждения, она полна полезных теорий и фактов, которые действительно имеют смысл, которые могут быть доказаны на практике и т.д., и все это начинается прямо здесь. Вначале полезный импульс дает микроэкономика, которая является основой любой мало-мальски значимой теории в бизнесе. После этого все начинается ухудшаться: вы вступаете в область макроэкономики (вы можете пропустить ее если хотите) с ее интересными теориями о таких вещах как, например, зависимость между коэффицентом заинтересованности и безработицей, которая, похоже, гораздо чаще опровергается чем подтверждается. И чем дальше, тем все становится все хуже и хуже и многие студенты ранее специализировавшиеся на экономике переключаются на физику, что, впрочем, все равно дает им возможность получить теплое местечко на Wall Street. Но обязательно возьмите курс микроэкономики, потому что вам необходимо знать о предложении и спросе, о конкурентном преймуществе, вы должны понимать NPV1, предоставление скидок и предельную полезность прежде чем вы поймете почему бизнес работает именно так, а не иначе.

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

Не пропускайте лекции не относящиеся к вычислительной технике, только потому что они скучны.

Пропускать лекции не относящиеся к вычислительной технике – это отличный способ получить низкую среднюю оценку.

Никогда недооценивайте насколько важна ваша средняя оценка. Множество агентов по найму и менеджеров по персоналу, включая меня, сразу же ищут среднюю оценку когда просматривают резюме, и мы не собираемся извиняться за это. Почему? Потому что средняя оценка, более чем любое другое число, отражает сумму того, что дюжины профессоров за долгий период и в различных ситуациях думают о вашей работе. Вступительный экзамен ? Ха! Да это один тест на несколько часов. Средняя оценка отражает сотни письменных заданий и промежуточные экзамены и посещяемость за четыре года. Да, у этой оценки есть свои недостатки. За годы был подъем оценки. Средняя оценка ничего не говорит о том набрали ли вы ее посещая легкие лекции по домашней экономике в Podunk Community College или получили уровень образование изучая квантовую механику в Caltech. В конце концов, после того как я отсею тех кто имеет среднюю оценку в 2.5 балла из Podunk Community, я спрашиваю о копиях атестатов и рекомендации. И затем я смотрю на твердые высокие оценки, и не только по вычислительным наукам.

Почему же меня, работодателя для разработчиков программного обеспечения, заботит ваша высокая оценка по истории Европы? Как никак, история скучна. Ах, так вы говорите, что я должен нанять вас, потому что вы не собираетесь упорно работать если работа скучна? Ну, в программировании тоже много скучных вещей. Любая работа имеет свои скучные моменты. И я не хочу нанимать на работу людей, которые желают выполнять только приятную работу.

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

Интересный курс? Да ничего подобного! Я должен был читать невероятно монотонные книги об индейцах живущих в бразильских влажных лесах и тробрианских островитянах, которые, при всем моем уважении, не представляют для меня никакого интереса. В какой то момент, курс стал настолько невероятно скучным, что я затосковал по чему то более захватывающему, такому как, например, наблюдение за тем как растет трава. Я полность потерял интерес к теме предмета. Совершенно и основательно. Мои глаза слезились, я так устал от бесконечных дисскусий о собирании в кучу батанов. Я не знаю почему тробрианские островитяне проводят так много времени собирая в кучу батаны, это невероятно скучно. Но Нужно Было Сдавать Экзамены В Середине Семестра, поэтому я перепахивал все это. В конце концов я решил, что культурная антропология будет моим Вызовом Тоски: моей личной полосой препятствий скуки. Если я смогу получить высшую оценку по предмету, в котором требуется от меня знать все о куклах для заварных чайников, я смогу справиться со всем, неважно насколько это может быть скучным. В следующий раз я застрял в Lincoln Center просиживая все 18 часов на Вагнере “Кольцо нибелунга” (Wagner’s Ring Cycle), я могу поблагодарить мою учебу Квакиютль, которая сделала вещи более приятными в сравнении.

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

Возьмите интенсивные курсы программирования.

Я точно помню момент когда я поклялся никогда не заканчивать институт.

Это был курс динамической логики, преподаваемый динамичным Ленором Зуком (Lenore Zuck) в Йеле (Yale), одним из ярчайших представителей очень яркого факультета вычислительной техники.

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

Теперь, динамическая логика – это тоже самое плюс время. Например, “после того как включите свет, вы увидите свои туфли” плюс “свет был включен в прошлом” подразумевает “вы видите ваши туфли”.

Динамическая логика очень притягательна для таких великолепных теоретиков как профессор Зук, потому что она дает надежду, что вы сможете формально доказать вещи связанные с компьютерными программами, что может быть очень полезно. Например, вы могли бы формально доказать, что флеш карточка Mars Rover не будет переполняться и сама себя перезагружать на протяжении всего дня, в то время, как она движется вокруг красной планеты в поисках марсианина Марвина.

На первой же лекции доктор Зук полность заполнил две доски и стену рядом доказывая, что если у вас есть выключатель света и выключатель выключен и вы переключаете выключатель, то свет зажется.

Доказательство было безумно запутанным и весьма подверженно ошибкам. Было труднее доказать, что доказательство правильно чем убедить себя в том факте, что при включении выключателя света - включается свет. Конечно несколько досок доказательства содержало несколько пропущенных шагов, пропущенных потому что они были слишком неинтересны чтобы углубляться в них формально. Много шагов было достигнуто ветхо-заветным методом Доказательство по Индукции, другие доказательством от противного и для оставшихся использовались доказательства аспирантов.

Моим домашним заданием было доказать утверждение: если свет был выключен и сейчас он включен докажите, что вы переключили выключатель.

Я попытался. Я действительно попытался.

Я провел часы в библиотеке пытаясь.

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

Этот вывод не касается динамических логиков: они занимаются этим не потому что это полезно, а потому что такова их должность.

Я бросил лекции и поклялся никогда не оканчивать институт по вычислительной технике.

Мораль истории такова: вычислительная техника – это не тоже самое, что разработка программного обеспечения. Если вам повезет, институт может иметь достойный курс разработки программ, хотя, скорее всего этого не будет, потому что элитные школы думают, что обучение практическим навыкам лучше оставить професионально-техническим училищам и тюремным реабилитационным программам. Вы можете изучить море программирования везде. Мы Йельский Университет, мы Формируем Будущих Лидеров Мира. Вы думаете, что ваша $160000 плата за обучение дает вам право изучать циклы while? Вы думаете, что мы здесь, безответственный Java-семинар в гостинице Marriott в аэропорту? Фи!

Беда в том что у нас нет профессиональных школ по разработке программного обеспечения, поэтому, если вы хотите быть программистом, то вашей профилирующей дисциплиной возможно является вычислительная техника. Она вполне подходит для этого, но это другой предмет, это не разработка программ.

Вам может повезти, и вы найдете множество интенсивных курсов по программированию на кафедре вычислительной техники, точно также, как есть множество предметов на кафедре истории, на которых вы будете писать достаточно, для того чтобы научиться писать. И это лучшие предметы чтобы заниматься. Если вы любите программирование, не смущайтесь если не понимаете сути этих курсов в лямбда-исчислении или линейной алгебры где вы даже не прикасаетесь к компьютеру. Ищите 400-уровневый курс с Practicum (лат. практика) в названии. Это попытка Либеральной Вычурной Пропуканой Администрации спрятать нужный (до дрожи) курс вырядив его латинским названием.

Перестаньте беспокоиться о том, что вся работа переносится в Индию.

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

Но я продолжаю слышать о том, что число абитурьентов поступающих на факультеты вычислительной техники опасно снижается. Я слышал, что один человек сказал по этому поводу, что “студенты опасаются вступать в ту область в которой вся работа переносится в Индию”. Это так ошибочно по многим причинам. Первое – выбирать карьеру основываясь на сегодняшних причудах бизнеса глупо. Второе – программирование это невероятно хороший трейнинг для всех типов поразительно интересных рабочих мест, таких как инжиниринг бизнес процессов, даже если единичное рабочее место по программированию и переносится в Индию или Китай. Третье – поверьте мне, еще остается невероятно много места для действительно хороших программистов, и здесь, и в Индии. Конечно, полно безработных ИТ специалистов, которые сильно шумят о том, как долго они были без работы, но знаете что? Рискуя послать их, скажу, что у действительно хороших программистов есть работа. Четвертое – у вас есть идеи получше? Чем вы будете заниматься если ваш профилирующий предмет история? У вас просто нет выбора, кроме как пойти в юридическую школу. И здесь имеется одна вещь, на которую я хочу обратить ваше внимание: 99% юристов ненавидят свою работу, ненавидят каждую ее минуту, а они тоже работают по 90 часов в неделю. Как я уже говорил: если программирование компьютеров вам в удовольствие - молитесь: вы в числе той немногочисленной группы людей, которая может заработать неплохие деньги делая то, что нравится.

Все равно, я не думаю что студенты действительно думают об этом. Уменьшение числа учащихся на факультетах вычислительной техники – это возвращение исторически нормального уровня после большого пузыря вызванного дотком манией. Пузырь состоял из людей, которые в действительности не любили программирование, но думали, что поступив на факультет вычислительной техники найдут сексульно-привлекательную высоко оплачиваемую работу и шансы в 24 года выбросить акции на рынок и разбогатеть. Такие люди, к счастью, давно ушли.

Не важно чем вы занимаетесь, найдите хорошую летнюю практику.

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

Если вы любите программирование, самую большую ошибку которую вы можете сделать, это поступить на какую-нибудь летнюю работу, на частичную занятость, или наоборот на работу не связанную с программированием. Я знаю, что всем кому сейчас по 19 хотят работать в торговых пассажах, складывать одежду4, но ваше умение невероятно ценно, даже если вам 19 лет, чтобы растрачивать его на раскладывание одежды. К тому времени, как вы окончите институт, у вас в резюме должен быть целый набор работ по программированию. Выпускники А&F5 идут работать в Enterprise Rent-a-Car “помогать людям в их арендных нуждах”.

Изучение продвинутых языков не делает вас лучшим программистом.
Точка зрения сотрудника
Очень рекомендую прочитать как статью, так и комментарии. Если кратко, приводятся два основных аргумента:

1. После того, как ты понял и полюбил Python, писать на C# неприятно. Код громоздок и некрасив. Процедурный подход вызывает кучу потенциальных глюков. Кроме того, начав думать на Python, приходится работать “живым компилятором”, переводя эти мысли в C#.

2. Начав использовать функциональное программирование, пытаешься использовать его везде где только можно. C# не поддерживает многие концепции функционального программирования, в результате чего попытки применять функциональный стиль выглядят уродливо и непонятно. Многие задачи проще решать процедурно.

Люк делает вывод, что нет смысла заниматься самосовершенствованием, если потом не сможешь использовать обретенные навыки. С изменением среды, на самом деле, все плохо. Шансы рядового программиста или проджект-менеджера изменить политику и стандарты компании, как правило, асимптотически приближаются к нулю. Исключения, когда проектная команда обладает высокой степенью автономности и может использовать какие угодно инструменты, редки как девственность. В свое время это было одним из факторов, побудивших меня покинуть моего предыдущего работодателя и начать работать на себя. Добавлю еще, что все относительно. Можно заменить языки в обсуждаемом примере на другие, но проблема останется той же. Есть языки лучше, чем Python и Haskell, есть и множество языков, куда хуже C#. В реальной жизни все еще сложнее, потому что важно не столько качество языка, сколько пригодность его и связанной с ним платформы для решения конкретной задачи.

Точка зрения компании
С другой стороны, компания существует не для того, чтобы развлекать сотрудников. Компания существует для того, чтобы получать прибыль. Соответственно, инструменты выбираются в первую очередь по влиянию их использования на прибыль. Ряд задач требуют использования неоптимальных с точки зрения эстетики и уровня абстракции языков. Драйвера и embedded-приложения пишутся на C. Windows-приложения — на том, что поставляет в данный момент Microsoft (сейчас это C#). SAP кастомизируется с помощью ABAP, недалеко ушедшего в своем развитии от COBOL. Можете продолжать до бесконечности. Кроме того, есть ниши, где выбор языка может повлиять на маркетинговую привлекательность продукта. Java продается. C# продается. Hashkell… — а что это такое? Думаю, логика выбора языка в таком случае будет очевидна.

 

Joel Spolsky

О вреде изучения высокоуровневых языков

Эффективное программирование