Сообщений 103    Оценка 1060 [+10/-5]         Оценить  
Система Orphus

Специальность - каменщик

Автор: Dr. Joseph M. Newcomer
Перевод: Андрей Лягусский
Источник: "A Brick Science Degree"
Опубликовано: 25.12.2004
Исправлено: 13.03.2005
Версия текста: 1.0

Каменщик как профильная специальность

Некоторые из нас, здесь, в Реальном Мире, были шокированы уровнем (если такое слово вообще применимо в данном случае) блестящих юных студентов-выпускников в области информатики. Занимаясь преподаванием, я встречал людей, которые были практически безграмотны в своей профессии. Каких знаний можно ожидать от выпускника? Безусловно, выпускник должен уметь создать список элементов и манипулировать этим списком, ну и уметь установить/сбросить биты в значении. Выпускники должны знать синтаксис любого языка, о серьезном владении которого они заявляют. Я преподаю на курсах, для которых «знание языка С» является обязательным. Иногда мне кажется, что будущие студенты интерпретируют это требование как «способность почти без ошибок произнести по буквам название языка».

Студент застрял на проблеме с написанием куска кода. Я говорю ему «ну, в данном случае надо написать что-то вроде ‘если условие то...’ и выполнять вычисления только если условие срабатывает». Это казалось очевидным. Через пару минут заглянув через его плечо, я увидел в его коде (программа на С):

// ...
if condition then
// ...

и студент сидел и думал, что делать дальше!

А еще как-то я присутствовал в полном классе (ну, вообще-то из 8 человек) свежеиспеченных бакалавров из одного флоридского университета что близ Орландо. Эти ребята четыре часа сидели над задачей по многопоточному программированию, пытаясь сформировать связный список! Потратив на них еще два часа во вторник, я направился к менеджеру курсов и сказал ей – «у Вас здесь серьезная проблема». Эта женщина была программистом, и мои слова ее шокировали. Она предложила мне просто написать нужный код и дать его этим бакалаврам. Я так и сделал. Написал функцию:

void AddToList(Item* p)
{
   if (head == NULL)
      head = tail = p;
   else
   {
      tail->next = p;
      tail = p;
   }  
}

У одного из присутствующих возникли серьезные проблемы с этим кодом. Он не компилировался. А все потому что я сначала дал им прототип функции:

void AddToList(Item* data)
{
	// ... здесь ваш код
}

Конечно, вы можете предположить что случилось: он скопировал код прямо из моего примера, и никак не мог понять, почему переменная p неопределена.

Но хуже всех была женщина, работавшая в Software Engineering Institute. Она только что была нанята сразу после окончания университета Карнеги-Меллона, который представляет одну из самых авторитетных школ в области информатики в США, а может быть и в мире. Эта женщина написала:

printf("The value is %d," value);

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

Я сделал пару замечаний о том, что она слишком глупа так как не понимает того, о чем говорит, и я совершенно не собираюсь тратить свое время на объяснение синтаксиса языка С бакалавру по информатике из университета Карнеги-Меллона. Я также сделал все от меня зависящее, чтобы она и близко не могла подойти к компьютеру, но ни у кого не было понимания ситуации, чтобы избавиться от нее. Правда, я ухитрялся избегать ее в оставшееся время моего присутствия там. Она уже написала программу, которую предположительно мы все должны были использовать; программа получилась такой отвратительной, что смутила бы и моего племянника когда ему было 12 лет; к этому возрасту он уже два года занимался программированием (в 2003 году он закончил обучение со специализацией в компьютерной графике).

Питер Вискарола в колонке «Peter Pontificates» в рассылке по OSR, привел схожие наблюдения. Он говорил об интервьюировании потенциальных кандидатов, изучивших за два семестра курс по операционным системам, и неспособных объяснить что такое синхронизация. О людях, изучивших за два семестра курс по операционным системам, и не написавших ни единой строки кода за все это время. Я знаю кое-кого в Microsoft, кто при интервьюировании кандидатов перед приемом на работу давал им задание – «вставить элемент в список, не нарушая при этом порядка сортировки». Из 27 собеседовавшихся, только одна женщина, работавшая в то время над своей докторской, смогла выполнить задание.

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

Каменщик как профильная специальность

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

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

На следующий год мы представляем студентам Теорию Кирпичей. Как кирпичи изготавливаются. Из чего изготавливаются. Влияние примесей на качество кирпичей, как негативное (испорченные кирпичи), так и положительное (например, расцветка). Преподаем химию кирпичей. Рассказываем про соответствующие температуры обжига для каждого вида кирпича. Студенты учатся анализировать качества кирпичей (устойчивость к деформации, водоотталкивающие свойства, надежность и прочие параметры определенные в дисциплине Анализ Кирпичей). Студенты наконец понимают, почему какие-то кирпичики изготавливаются с тремя круглыми отверстиями (они узнали о существовании отверстий еще год назад, но не знали, зачем эти отверстия нужны).

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

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

И вот они становятся выпускниками. И получают степень бакалавра по профессии каменщика.

Их первое задание – «построить декоративную кирпичную стену».

И в этот момент они осознают, или должны осознать, как мало в действительности они знают. Они никогда не занимались постройкой стен более чем из 18 кирпичей. И они еще не знают о такой штуке, которую все каменщики используют – о металлической проволоке, которая натягивается вдоль стены, чтобы все кирпичи лежали ровно даже на 100-метровой кладке. И они вообще ничего не знают о современных подходах в строительстве, вроде лазера который позволяет прочерчивать ровную линию вдоль стены. И они не знают как противостоять сильному ветру на высокой стене. Никто не говорил им о подкладках под стойку и о линии промерзания. Они даже не знают как пользоваться простым молотком, чтобы разбить один кирпич на два. И у них нет никаких, даже самых туманных представлений об эстетике, и поэтому они не знают что же слово «декоративный» обозначает в действительности.

В строительных традициях есть такая вещь как тренировка, но это всего лишь подготовка перед «ученичеством», которое продолжается несколько лет под опекой опытных строителей. Только после того, как будет продемонстрирован определенный набор навыков, производится повышение из «ученика» в «подмастерья». Когда будет достигнут серьезный уровень эксперта, человек становится «мастером». Частенько начинающие программисты позиционируются как опытные, и поэтому за ними нет никакого присмотра. Я провел много времени за воспитанием молодых людей, и полагаю что воспитание – абсолютно необходимая часть профессионального становления каждого. Но для того чтобы быть достойными воспитания, подопечные должны быть как минимум практически грамотными. За немногими выдающимися исключениями (вроде того случая в SEI), я не встречал людей неспособных к обучению. Все-таки у них была степень бакалавра из (в основном) ведущих университетов. Если они не знают основ своей профессии, это может быть их вина, или существовали ошибки в образовательной программе по которой они учились. От каменщика ожидается физическая способность выполнять свою работу, умение складывать и вычитать, умение пользоваться линейкой и знать о том, с какого конца нужно держать лопатку и каким концом лопатки набирать раствор. Эта женщина из SEI, если говорить о ее заявленной профессии, была неспособна даже распознать кирпич. Не говоря уже о чем-то более сложном.

Когда я рассказал эту историю своему другу, Кевину Нолишу, ведущему инженеру в Marconi, он мне ответил – «есть одно различие между твоей историей и реальностью. Более распространенный вариант развития событий такой: бригадир подошел бы к новичку, положил ему руку на плечо, и, указывая на кучу стройматериалов, произнес – «ну что, сынок, давай-ка приступай к работе»».

Что же касается школ с образовательной программой, более ориентированной на прикладные вопросы – здесь все просто. Программа идет так:

Послевыпускной сценарий повторяет уже указанный.

Это как в школах, которые предлагают профильный курс по информатике, во время которого, все четыре года, все программирование выполняется исключительно на Pascal, или С, или Fortran, Basic, Visual Basic, Java, COBOL, или чем-то еще (язык меняется в зависимости от текущей моды, проблема остается). Если вы спросите у студентов, что такое «конечный автомат», они просто тупо посмотрят на вас. Скажите им что сложность их алгоритма квадратична, и они будут смотреть на вас остекленевшими глазами. Они не смогут распознать NP-полную проблему или нерешаемую проблему если таковая появится и собьет их с ног. Они наверняка никогда не выполняли работу в команде, и никогда не писали программу объемом свыше 1000 строк исходного кода.

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

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

Реальная история: однажды мы интервьюировали кандидата, и он показал себя немного ниже планки. Тогда мой напарник задал вопрос – «каков размер самой большой программы, Вами написанной?», на что кандидат с гордостью ответил – «800 строчек!».

За предыдущие выходные я написал 2500 строк кода. Это включая пару часов чтобы посетить симфонический концерт. У меня есть привычка ссылаться на «тривиальные программы из 10000 строк кода», которая шокирует всех студентов, с которыми я разговариваю. Большинство из них думает что 5000 строк кода - это серьезная работа. Большинство моих серьезных программ достигало 100000 строк кода в объеме; некоторые были по 250000 строк.

Как-то я написал 100000 строк кода за год. Мой напарник, который занимался также бизнес-управлением в компании, написал только 70000. Программа достигла объема в 80000 строк в феврале, когда я только был нанят. Через год, к началу марта она состояла из 280000 строк (числа не должны суммироваться, так как мы выбросили пару модулей. Мы с напарником работали над практически непересекающимся набором модулей, так что мы легко могли подсчитать, кто и что написал). Это был чистый самоучка, который писал самый элегантный код из всех когда-либо мною виденных. Это был ремесленник в программировании (он и правда был ремесленником, сделавшим много фантастических вещей из дерева, прежде чем вернуться к обучению по профилю информатики).

ПРИМЕЧАНИЕ

За пять дней, предшествующих написанию этого эссе, я написал 4470 строк кода. Оплачиваемое время составило 31 час. Получается 144 строки в час (Японский Стандарт Продуктивности), не учитывая 28-страничное руководство, написанное в то же время. Японский Стандарт Продуктивности разрешает мне включать строки кода из существующих библиотек, которые можно использовать. Если я вычту 1038 строк существующей библиотеки, которая была использована, получится 3432 строки или 110 строк в час действительной продуктивности. Это меньше чем мой обычный стандарт, потому что это был действительно красивый «эталонный код», который должен был компилироваться как минимум на трех различных платформах, и я попотел над ним. Плюс был выполнен один нетривиальный пересмотр кода, повлекший за собой вычищение нескольких сотен строк для упрощения задачи в связи с корректировкой модели. В то же время, индустриальный стандарт продуктивности – это 5 строк в час, а для «супер-программистов» - 20 строк в час. И это не включая полное тестирование и документацию.

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

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

Недавно меня попросили прокомментировать кусок кода, написанный под Windows. Этот код попал в категорию самых некомпетентно написанных, из всех мною виденных программ. И он не имел смысла ни на одном языке, ни на одной платформе, ни в одной среде. Мой комментарий состоял в том что я прекратил чтение кода на четвертой строке, потому что уже из этих строк было ясно, что код абсолютно безнадежен. Вот и все. Продолжение последовало через пару дней – еще худший пример кода от того же программиста. Отправитель кода спрашивал, как он может сообщить своему менеджеру что указанный программист – просто пустое место. Я ответил что это не самое страшное. Кто-то, представляющий из себя пустое место, не причиняет вреда. В данном же случае человек был опасен, потому что не просто представлял из себя пустое место, но еще и активно создавал проблемы. В случае с настолько некомпетентной личностью единственный выход – держать его как можно дальше от любого компилятора. «И вообще, как такой отвратительный код прошел через процедуру оценки кода?» - был мой вопрос. «Ведь Вы выполняете данную процедуру, не так ли?» - продолжал я, хотя отлично знал, что ответом будет слово «Нет». Ни одна нормальная организация не пропустила бы код вроде этого. Недостатки этого программиста были бы вскрыты моментально. Стало бы понятно, что надо либо заняться обучением этого человека либо избавиться от него.

Пересмотр кода – очень важная штука. Нет такого кода, который нельзя было бы улучшить с помощью его пересмотра. И я отдельно выделяю свой собственный код. Мне приходилось выполнять пересмотр кода для своих клиентов, так как я обучал их программистов справляться с этим самостоятельно. Я находил ошибки. Находил плохо реализованные алгоритмы. Мой код всегда улучшался после пересмотра, и это был отличный материал для такого рода работы. Улучшения всегда состояли в мелких изменениях, но все-таки это были значимые изменения. А программисты, которых я тренировал, всегда могли узнать что-то новое и полезное.

Ни один опытный строитель не возьмет под свое попечительство новоиспеченного специалиста-каменщика чтобы строить декоративную стену, если не будет твердо уверен, что последний соответствующим образом подготовлен к этому, и будет внимательно наблюдать за ним. И конечно, будет далеко не вежлив отвечая на глупые вопросы («Что значит ‘Какая подставка?’. В какой $%#! тебя учили строить стены?»). Но менеджеры все равно предполагают, что их новички с дипломом по информатике достаточно компетентны, чтобы заниматься программированием. По-моему, такое редко бывает истиной. Большинство выпускников почти стали грамотными; некоторые из них смогут запрограммировать работу со списком не моргнув и глазом (я не шучу, так как уже приводил пример полного класса бакалавров, где никто не знал как работать со списком). Часть кода, который я видел в промышленных системах, не пережил бы процедуры пересмотра. Представьте себе постройку здания, при которой ни разу не выполнялась проверка на предмет его безопасности. Даже я вынужден был обратиться в строительную комиссию чтобы получить разрешение на некоторую перепланировку своего дома. И мне пришлось предоставить чертежи. Я достаточно образован, чтобы понять, что у меня нет никаких идей насчет постройки настила, или усиления конструкции дома, но я знаю как нанять людей способных это сделать. Если бы я собирался строить свою карьеру как архитектор, я конечно нашел бы самых лучших профессионалов, чтобы у них учиться.

ПРИМЕЧАНИЕ

Однажды мне понадобилось разрешение на перепланировку. Человек передо мной в очереди с пристрастием допрашивался человеком за стойкой насчет вещей вроде прочности на сдвиг соединения пристройки с домом, несущей способности пола в пристройке, и тому подобное. Я в это время думал – «я обречен, ведь не смогу ответить ни на один из подобных вопросов!». Подошла моя очередь. Я достал чертежи. Человек за стойкой взял их, посмотрел на тисненую печать «Утверждено профессиональным архитектором» внизу листа, посмотрел на меня и сказал – «Это будет стоить 15$». И все. Чертежи стоили мне 400$. Цените каждый пенс.

Есть одна причина по которой я полагаю, что являюсь хорошим программистом – я учился у самых лучших. И наверное у одних из худших («Никогда я не стану делать никаких убогих поделок»). Безусловно, все стоящее что я умею, я перенял у программистов более опытных и с более отточенным вкусом, чем у меня (особенно это касается времен, когда мне было около 20). Ко времени когда мне было 30, я уже был неплохим программистом, и я все время стараюсь стать лучше. Я читаю много кода. И вижу много отличных идей. И стараюсь освоить их.


Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
    Сообщений 103    Оценка 1060 [+10/-5]         Оценить