Мои вычислительные корни

Мои вычислительные корни

В разработку программного обеспечения я пришел с черного хода. В те времена, когда я учился в старших классах и колледже, область знаний «вычислительная техника» только зарождалась. Большинство менеджеров моего возраста, занимающихся разработкой ПО, также начинало в какойто другой области: математике, физике, химии или машиностроении. О компьютерах мы узнали, когда они появились у нас в качестве нового инструмента для вычислений. После этого наше увлечение наукой или инженерным делом в некоторых случаях перешло на программирование. Со временем из этого возникло желание создавать программы высокого качества.
Я хочу сказать, что подхожу к проблемам управления разработкой ПО с иной точки зрения, чем те, кто получил формальное университетское образование на факультете вычислительной техники. Я склонен рассматривать эти проблемы в первую и главную очередь как проблемы управления инженерными разработками. Мне посчастливилось работать с несколькими действительно талантливыми программистами, и сочетание таланта и умений, которые мы вместе приносили в программный проект, оказывало на него очень сильное воздействие.
Прежде всего, как случилось, что я стал инженером? Это долгая личная история, которая может показаться вам интересной. Если нет, переходите к следующей главе, но сначала прочтите «Резюме» в конце этой.
Ниспровергатель.
4 октября 1957 г. Советский Союз вывел на орбиту «спутник». Сообщалось, что размером он всего лишь с баскетбольный мяч, весит 184 фунта
и посылает сигналы, которые можно поймать коротковолновым приемником. Мир был в шоке, и в обществе бурно обсуждался удар, нанесенный превосходству Америки в области науки и техники. Все усугубилось тем, что 3 ноября того же года Советы запустили «Спутник II» весом 1121 фунтов,
на борту которого была собака по имени Лайка. Это произошло, когда первый спутник еще не успел пойти по спирали к Земле, чтобы прекратить свое существование, и эффект был огромен. Подобно бомбе, взорванной в Нагасаки после Хиросимы, Лайка показала, что русские могут делать такие вещи на регулярной основе, а не в виде единичного события. Пусть интервал между запусками специально был рассчитан на такой эффект, но психологически это было воспринято острее, чем соответствовало реальности. Холодная война была в разгаре, и русские сильно побили нас. Ведь если они смогли послать в космос собаку, не последует ли за ней вскоре обезьяна? А если уж там окажется обезьяна, не трудно видеть, что будет дальше. Запуск ракет из космоса становился вполне реальным. Говоря военным языком, русские заняли «командную высоту», а наше руководство в области науки, обороны и политики промахнулось.
Конечно, советский спутник оказался громом среди ясного неба, но это событие имело более важные последствия для страны. Джон Кеннеди воспользовался лозунгом «отставания в ракетной технике», который помог ему выиграть президентские выборы 1960 г., и затем вовлек страну в гонку в космосе 1960-х г., кульминацией которой стала высадка человека на Луне в 1969 г. За каких-то 12 лет мы догнали и обошли русских, вызвав трепет во всем мире. Это была яркая демонстрация силы «американского духа».
Конечно, потребовавшаяся для этого физика разрабатывалась еще Ньютоном, а создание ракетной техники, как ни странно, происходило под руководством ветеранов, создававших в Германии V-2 (если верить расхожему мнению). Но спутник, запущенный Советами, оказал влияние на целое поколение более скрытым образом: он бросил вызов самым основам нашей системы образования.
В принципе из запуска спутника следовало, что мы, американцы, отстали потому, что система образования у русских оказалась совершеннее и они смогли привлекать в науку и технику больше лучших и ярких умов. В то время как американцы оставались непревзойденными в массовом производстве товаров потребления и подъеме уровня жизни среднего класса, русские решали по-настоящему трудные проблемы и оказывались впереди нас в действительно важных областях. Неважно, так ли это было на самом деле, но такое ощущение было широко распространено и принималось безоговорочно. Какое-то время казалось, что вся страна пришла в смятение в связи с этими событиями. Что-то нужно было предпринимать.
Ответ.
В Америке существует проверенный временем способ разрешения всех кризисов. Если вы еще не догадались, о чем идет речь, то скажу, что он называется «закидать проблему деньгами». Смысл в том, что можно в значительной мере избавиться от существующей в демократическом обществе необходимости заключать сделки и достигать соглашения, если воспользоваться для влияния на поведение людей системой поощрений, имеющихся в свободном предпринимательстве. Этот метод не всегда самый эффективный и почти всегда выглядит непривлекательно, но он бывает действенным. Он может привлечь массу ненужных людей, которые заинтересованы в быстром обогащении, а не в решении проблемы, но он также находит и много «нужных» людей.
Далее. Заинтересовать надлежало не молодых людей моего возраста, а другой контингент. Конечно, кого-то из нас естественным образом могли привлечь романтика, таинственность и глубина науки. Другие могли проявить интерес из патриотических чувств. Но в целом гормоны диктовали то, что для большинства из нас (я имею здесь в виду лиц мужского пола и юношеского возраста) основные «проблемы» в течение ближайших лет будут связаны с противоположным полом. Те из нас, кто был склонен к технике, видел здесь более серьезные и сложные проблемы, чем полет на Луну. Можете мне поверить, что вид привлекательных девчонок, сидящих на плечах атлетически сложенных мужчин, был не менее сильным средством мотивации, чем атомная энергия. Спутник ничего не изменил в этой психологии.
Нет, чью психологию надо было изменить, так это психологию наших родителей. Потому что период с конца 50-х по начало 60-х годов XX века был последним, когда дети хотя бы делали вид, что слушаются родителей.
Время было на редкость удачным: не позднее чем через 10 лет бунтарский дух поколения шестидесятых сведет влияние родителей до крайнего минимума. Прежде всего потому, что мы были буквально последним поколением, которое хоть сколько-нибудь прислушивалось к словам своих родителей. Трудно представить себе, чтобы тинэйджеры семидесятых и восьмидесятых были похожи на своих сверстников конца пятидесятых и начала шестидесятых. Вспомните сериал «Father Knows Best»
и культуру среднего класса, по представлениям которой марихуану курили только джазовые музыканты, чтобы испытать вдохновение.
Конечно, мы понятия не имели, что бывает как-то иначе.
Как действовала эта программа.
Итак, началась великая пропагандистская кампания. Неофициальное послание родителям молодых американцев звучало примерно так: «Наука и техника имеют важнейшее значение для страны». Особенно важно было не упустить в этой кампании часть, касающуюся техники. Это обусловливалось в то время (и сейчас тоже) представлениями о науке и технике в общественном сознании. Заниматься наукой сложно; заниматься техникой - обычное дело. В науке есть обаяние, техника связана с грязью. Наукой занимаются философы-аристократы; инженеры ближе к синим воротничкам. Только блестящим людям открыт путь в науку; инженером может стать практически каждый, проявив достаточно трудолюбия. Все это стереотипы. Но задумайтесь: если бы вам нужно было с помощью национальной пропагандистской кампании привлечь как можно больше молодых людей в технические области, как бы вы поступили? Зазывали бы только в науку? Нет, чтобы улов оказался больше, надо было раскидывать сети шире и подчеркивать, что нужны и ученые, и инженеры. В результате если из кого-то не получится ученого, то не исключено, что из него можно сделать инженера.
Каждому родителю, сомневающемуся в том, что его сын сможет стать доктором медицины, приятно думать, что стоматология - почетная (и доходная) профессия.
Те, кому была адресована эта кампания, пережили Великую депрессию 1930-х. Из того, что за ней последовала Вторая мировая война и в тот момент (1957 г.) у них были дети школьного возраста, можно заключить, что сами они приличного образования не получили. (Они не ходили в колледж из-за депрессии, они потеряли еще пять лет из-за войны в начале 1940-х, а после войны они женились и завели детей. Многие из них так и не воспользовались своими правами участников войны.) Теперь они стали рабочими и принадлежали к нижней части среднего класса, дети готовились поступать в старшие классы, и материальные условия были нелегкими. Реклама была придумана толково: пусть ваш ребенок станет ученым или инженером, и он будет обеспечен на всю жизнь.
«Это ваш счастливый шанс. Не опоздайте. Постарайтесь, чтобы ваш ребенок избежал вашей судьбы!».
Дальше реклама становилась еще убедительнее: «Мы вам поможем. Мы выделим на образование столько денег, что ваши дети смогут обучаться бесплатно. Стипендий и дотаций будет полно. Пусть цена вас не волнует. Если у вашего ребенка есть талант, страна даст ему образование, и ему никогда больше не придется ни о чем беспокоиться».
Должен сказать, что это была замечательная кампания, и она была успешной.
Какой оказалась реальность? Как обычно, хорошее перемежалось плохим. Во многие научные и технические программы влили уйму денег. И сделали много чего еще: снижали налоги, процентную ставку и т. д. Спутник запустили, когда мне было 12 лет, а закончил я образовательную процедуру в 1972 г. (да, при серьезном подходе требуется много времени), когда получил докторскую степень по физике. Все мои занятия на старших курсах и в аспирантуре финансировались посредством заработков во время летних каникул и по выходным, стипендий и дотаций. Если не считать упущенных заработков, то следует признать, что мое образование не стоило мне (или моим родителям) ни цента. Я вышел на рынок труда полностью свободным от долгов. Только представьте себе - не надо отдавать никаких займов на образование!.
Плохо оказалось то, что обещанная пожизненная похлебка оказалась не более чем иллюзией, как и всегда случается с такими обещаниями. Наверное, сейчас трудно представить, чтобы кто-то мог поверить, будто степень бакалавра по инженерному делу обеспечит его материально на всю жизнь. Но тогда эта возможность казалась гораздо более правдоподобной и практичной, чем другие, и множество молодых мужчин (а позднее и женщин) выбрали этот путь. В одном отношении он оказался верным. Например, в начале семидесятых оказалось, что у нас физиков хоть пруд пруди, и закономерно возник кризис занятости, поскольку предложение превосходило спрос (по крайней мере, в научных кругах).
Мы забыли выключить насос: как всегда в делах, где участвует правительство, о тонкой настройке и мечтать нечего.
Конечно, в 1960 г. мы и не догадывались, что такое может произойти. Это было так же невероятно, как высадка человека на Луне.
Что было особенного в этом поколении инженеров?.
После этой довольно длинной прелюдии я хочу сказать несколько слов о 10 годах обучения студентов инженерных специальностей примерно с 1960 по 1970 г. Я поступил в инженерный колледж в 1962 г. и окончил его со степенью бакалавра химической технологии в 1966 г., поэтому считаю себя представителем указанной группы. После интенсивного обучения в старших классах я поступил в колледж почти ровно через пять лет после запуска спутника Советским Союзом. Я собирался стать инженером.
Кроме того, я собираюсь рассказать об инженерах, а не об ученых. Я выполнил свою дипломную работу по физике и получил докторскую степень по экспериментальной физике частиц высоких энергий в 1972 г., поэтому я могу претендовать на то, чтобы считаться и инженером, и физиком. Но в то время как в физике и других науках в это десятилетие произошло относительно мало изменений, в инженерном деле и инженерных колледжах изменения были радикальными.
Попутно замечу, что это, вероятно, была последняя крупная волна студентов-инженеров, родившихся в Америке. После того как прошла эта группа, мы снова перестали пускать своих детей в инженеры. Образовавшийся вакуум был заполнен студентами с других континентов.
Это поколение студентов инженерных специальностей оказалось в точке перегиба. Мы были последними, кому преподавали некоторые классические инженерные дисциплины. В разных колледжах были свои особенности (Cooper относился к консервативным заведениям), но до 1960 г. дело обстояло одним образом, а после 1970 г. - иным. Шестидесятые годы были переходным периодом, и в зависимости от того, в каком колледже вы учились, пропорции преподаваемых дисциплин несколько различались.
Например, мой первый курс был одним из последних наборов студентов, которым преподавались техническое черчение и проективная геометрия. Черчение подразумевало вычерчивание технических чертежей профессионального качества при помощи измерителей, циркулей и угольников. Сегодня вам может быть знакома лишь одна разновидность таких чертежей, называемая «синьками», а мы должны были понимать, что такое «вид сверху», «вид сбоку» и как на их основе создавать вид под произвольным углом. И - особое проклятие для меня - нельзя было закончить курс, не сделав хотя бы одного чертежа тушью на веленевой бумаге.
Это было частью той традиции, когда инженер находился рядом с механическим цехом. Нужно было уметь делать чертежи, понятные рабочему-станочнику. Это была та часть инженерного дела, которая предполагала «засученные рукава и распущенный галстук». Чтобы быть членом бригады, надо было уметь читать и изготавливать технические чертежи, даже если вы носите белую рубашку и галстук, а станочник носит рубашку с синим воротничком и фартук. В каком-то смысле вы должны были стать равны (хотя бы на время), и овладение мастерством черчения входило в ученичество. Мысль о том, что можно стать инженером, не научившись чертить детали механизмов, была нелепа. А сегодня мои рассказы об этом вызывают смех. Но тогда все это было очень серьезно. Представьте себе, что вы получаете высшую оценку по интегральному исчислению, потому что умеете брать интегралы по частям, и испытываете смертельный страх вылететь из колледжа, потому что прежде чем вы закончите проклятый чертеж, тушь обязательно затечет под угольник.
Вычисления.
В самой большой степени «перелом» затронул технику вычислений. Наше поколение оказалось мостиком между логарифмической линейкой и компьютером. Сейчас объясню.
В шестидесятые годы карманный калькулятор все еще был предметом из обихода Флэша Гордона.
Первый настоящий калькулятор для инженеров, HP-35, появился на сцене в 1972 г. (Какое совпадение - я как раз заканчивал свою диссертацию. Выбор времени - это все!) Логарифмическая линейка сразу и безвозвратно погибла. Но до того момента логарифмические линейки были главным товаром для инженеров. Попросту говоря, на линейке выполнялись расчеты. Применять компьютеры для получения обычных результатов тогда было просто невыгодно. Компьютеры были ориентированы на пакетную обработку, и чтобы получить результат, надо было написать программу. На языке FORTRAN. Слишком большие накладные расходы для разовой задачи. Это сегодня можно запустить Excel, а тогда приходилось вытаскивать логарифмическую линейку.
Учиться работать с логарифмической линейкой вы начинали на первом курсе, если не раньше. Недостаточно было понять, как ей пользоваться, требовалось научиться делать это уверенно, точно и быстро. С помощью линейки приходилось высчитывать ответы на 50-минутных экзаменах по физике, химии и инженерному делу. Тот, кто не умел пользоваться ей как настоящим инструментом или не умел считать быстро, оказывался чужим на этом празднике жизни. Это было так же плохо, как клякса туши под угольником.
Преподаватели тоже не давали сильно расслабляться. Иногда мы получали какие-то баллы, если показывали, что понимаем, как сделать расчет, но ошиблись. Но в итоге обнаруживалось, что без правильного ответа не было и достаточных баллов для получения хороших оценок. Какая свежая идея - куча баллов за правильный ответ и немножко за неправильный! Но, как заметил однажды один старый желчный профессор, «инженерам платят за правильные результаты». Кстати, я говорил, что скорость тоже учитывалась?.
Поэтому мы тренировались. Герман Биленко (Herman Bilenko), студент старшего курса электротехнической специальности, руководил клубом совершенствования навыков работы с логарифмической линейкой. Мы встречались за завтраком, он давал нам задачу, а мы соревновались, кто быстрее получит правильный результат. Как говорил Дэйв Барри (Dave Barry), «я ничего не выдумываю».
Тесное знакомство с числами.
Тем, кто никогда не имел дела с логарифмической линейкой, скажу, что чаще всего требовалось вычислить дробь, и в числителе, и в знаменателе которой было не меньше чем по четыре множителя. «Ответ», который давала линейка, мог выглядеть как, скажем, «123». Где поставить десятичную точку и каков будет показатель степени (например, «на десять в шестой степени»), должны решить вы сами. Это важнейший момент. Чтобы получить правильный ответ, требовалось правильно сделать две вещи. Вопервых, определить, где поставить десятичную точку в окончательном результате, полученном из восьми или более множителей. Во-вторых, определить, следуя правилам научного формата записи, какой показатель степени будет у окончательного результата, исходя из показателей степеней всех сомножителей. Крайне легко было в этих вычислениях сместиться на единицу в показателе или в положении десятичной точки. И если правильный результат был 1,23, то всегда можно было по ошибке или по небрежности получить 0,123 или 12,3. На профессиональном языке это называется «ошибка на порядок».
Конечно, ошибка в десять раз - это очень много. Представьте себе, что вам начислили зарплату, ошибившись в 10 раз, и вам все станет ясно. А при работе с логарифмической линейкой очень легко ошибиться в десять раз. Из этого следовало, что еще до проведения вычислений надо было сообразить, какой примерно ответ должен получиться. Нужно было «знать», что ответ получится в районе «единицы», и, если на линейке получался результат 0,123 или 12,3, становилось ясно, что допущена ошибка, и приходилось возвращаться и искать ее. Таким образом, оценивать результат приходилось заранее, и обойтись без этого было невозможно.
Те, кто не овладел этим мастерством, вылетали из колледжа, потому что совершить ошибку было очень легко. Если у вас не было нюха на ошибочный результат, вам грозили неприятности.
Понимание этих моментов приводило к выработке некоторых любопытных стилей поведения. Как правило, вычисления проводились в несколько этапов, при этом результат предыдущего этапа подставлялся в некоторую новую формулу, и это делалось многократно. Поэтому ошибки, сделанные на ранних этапах, размножались далее, и, когда в итоге получался совершенно абсурдный результат, приходилось мучительно двигаться в обратном направлении к самому началу. Как следствие, у нас развилась маниакальная привычка проверять каждый промежуточный результат, прежде чем двигаться дальше. Мы сами для себя стали «контролем качества» вычислений, не разрешая продолжать вычисления, пока не были уверены, что результат примерно правильный. Развить в себе такой инстинкт в самом начале карьеры было очень полезно.
Естественно, что попутно мы научились очень неплохо выполнять вычисления в уме. Никто, конечно, не мог сравниться с легендарным Фейнманом,
но и мы были совсем не плохи. Иногда такого искусства оказывалось достаточно, чтобы вскружить голову студентке-гуманитарию. Для нас же это был еще один навык, необходимый для выживания.
Кстати, часто предлагалось выполнить вычисления только с точностью до трех значащих цифр. Достаточно ли этого было? Это означало ошибку примерно в одну тысячную. В большинстве физических экспериментов хорошей считается точность ±1%. Поэтому, если у вас было три-четыре множителя в числителе и три-четыре множителя в знаменателе и все они имели точность не выше 1%, было бы заблуждением считать, что можно получить ответ с точностью одна тысячная. Ergo, в большинстве расчетов можно было смело пользоваться логарифмической линейкой.
Конечно, с появлением компьютеров все изменилось. Расчеты стали выполнять путем численной итерации уравнений - заменяя производные конечными разностями. И поскольку для получения результата надо было повторить тысячи шагов, ошибки могли незаметно накапливаться. Вот почему в компьютерах точность представления данных должна быть гораздо выше: на каждом шаге нужна очень большая точность, чтобы ошибки не накапливались. Но в конечном итоге результат никогда не бывает точнее входных данных. Многие либо вообще этого не понимают, либо с годами забыли об этом.
Так что там с этими компьютерами?.
Вы правы: я считаю, что мы потеряли большую часть мастерства, перейдя с логарифмических линеек на карманные калькуляторы. В последующие годы я поражался, видя, как студент набирает цифры на своем карманном калькуляторе, получает явно нелепый ответ и отстаивает его, заявляя, что «так посчитал калькулятор». Мысль о том, что при вводе могла быть допущена ошибка или что можно попытаться каким-то способом оценить правильность ответа, явно не приходит ему в голову. Печально.
Вы скажете, что ничего страшного, компьютеры все это изменили?.
Как бы не так. Но оставим эту тему. Гораздо интереснее посмотреть, как последнее поколение мастеров логарифмической линейки стало первым поколением профессиональных компьютерщиков. Ведь за 10 лет до того, как карманные калькуляторы вытеснили логарифмическую линейку, в университетах появились компьютеры, и те из нас, кто сумел заглянуть в будущее, увидели там компьютер.
Итак, мы изучали FORTRAN на машине класса IBM 1620. Не стану утомлять вас боевыми воспоминаниями. Но мы многое узнали о том, как перевести ручные вычисления в вычисления, производимые на машине. А поскольку эта процедура была весьма обременительной, мы писали программы только тогда, когда задача того действительно стоила, например для многократно проводимых вычислений.
Даже для тех из нас, кто почувствовал себя в программировании как рыба в воде, работа на компьютере была сущей мукой. Оказалась, что эти машины ужасно привередливы к расстановке знаков пунктуации и к случайным вторжениям в шестую колонку. (Если что-то было пробито в шестой колонке перфокарты с командой FORTRAN, это означало, что данную команду нужно присоединить к предыдущей, т. е. это было «поле продолжения». Естественно, когда это происходило случайно, компилятор FORTRAN с негодованием плевался.) Нам постоянно казалось, что наши программы отвергаются машиной по совершенно дурацким причинам.
В действительности все эти неудобства были следствием пакетной обработки. Единственная ошибка прерывала весь процесс, а исправлять их приходилось последовательно, по одной. Если не было возможности в течение дня выполнить несколько «проходов», то отладка затягивалась на очень длительное время. В результате мы старались быть аккуратными, потому что, нравилось нам или нет, машина ничего не прощала. Мы также стали помещать в программы множество операторов печати для диагностики, чтобы в критической ситуации можно было понять, когда, где и желательно почему произошла авария. Самое главное, мы стали первыми программистами «оборонительного стиля». С появлением интерактивных терминалов, а затем персональных компьютеров этот стиль стал менее распространен, но, поверьте, значение его не уменьшилось.
Мы также совершили открытие, которое вслед за нами будут повторять еще 40 лет: большинство задач университетского уровня являются «учебными» и не требуют слишком больших или тщательно сделанных программ. И по иронии судьбы мы не тратили много усилий на код, проверяющий правильность входных данных. Ведь компьютер - это инструмент для профессионалов, т. е. инженеров. Представить себе, что компьютером станут пользоваться «обычные граждане», а потому потребуется проверять вводимые данные, было так же сложно, как вообразить прогулку человека по лунной поверхности.
Получились ли из нас более умелые пользователи компьютеров благодаря тому, что мы владели логарифмической линейкой? Уверен, что да. Нас приучили подозрительно относиться к результатам любых вычислений, кто бы их ни выполнил - человек или зверь (компьютер считался зверем). Поэтому ряды результатов, аккуратно отпечатанные на бумаге с дырочками перфорации по обоим краям, не оказывали на нас гипнотического воздействия. Для нас не существовало GIGO.
Мы знали, что результат может быть ошибочным. Лишь после тщательной проверки мы могли согласиться, что на сей раз компьютер не наврал. Так же, как в случае карманного калькулятора, мы поражались, насколько часто люди слепо принимают результат только потому, что его напечатал «компьютер». Мы знали, что программу, давшую этот результат, написал человек, и мы знали, как легко сделать ошибку, когда пишешь программу. Мы слишком много их написали сами, и у нас был печальный опыт.
Наше вычислительное наследство.
В шестидесятые годы существовало поколение инженеров, обученных пользоваться как логарифмическими линейками, так и компьютерами. Тот, кто учился раньше, никогда до конца не принял компьютеры, а тот, кто учился позднее, так не научился толком считать вручную. Но эта группа молодых инженеров в наиболее активный период обучения застала инструменты как предыдущего, так и последующего поколений в тот момент, когда различие между теми и другими было наиболее существенно. На этой основе выросла целая культура отношения к результатам инженерных расчетов. Среди ее догматов были следующие:.
• Не принимать ответ только потому, что сам его вычислил. Подвергай сомнению все. Когда у нас появились компьютеры, из этого возник принцип «не верь входным данным».
• Разбивать сложные вычисления на части разумного размера и проверять все промежуточные результаты, чтобы избежать размножения ошибок.
• При ручных или машинных расчетах придумывать способ проверки, позволяющий обнаружить явно нелепый результат.
Это были не абстрактные идеи, а практические рецепты выживания. И они превратились в инстинкты, позволявшие выжить в холодном и безжалостном мире решения задач.
Моя теория состоит в том, что это золотое поколение инженеров стало лидером того колосса, каким является сегодня Силиконовая Долина, и что приближение этого поколения к пенсионному возрасту представляет для нас опасность. Компьютеры стали больше, быстрее, мощнее. На них выполняются замечательные программы. Но кто сможет заметить, что они выдали неверный результат?.
Резюме.
Эта глава посвящена ЭндрюМараско (1916-2004), который не успел увидеть книгу напечатанной.
Ужасно трагично, когда элегантная теория подвергается атаке со стороны грубых фактов. В прошлом году мой друг Боб Маршал прислал мне статью из «Invention and Technology», озаглавленную «Как Америка не стала соперничать со Спутником». В этой статье
Т. А. Геппенгеймер (T. A. Heppenheimer) утверждает: «Мы могли запустить искусственный спутник на орбиту Земли за год до Советов, но умышленно не стали этого делать. Дав им возможность осуществить пропагандистский триумф, мы обеспечили их конечное поражение в холодной войне». Интересно, не было ли это поражение отчасти обусловлено призывом целого поколения ученых и инженеров и не явилось ли одним из тех «неожиданных последствий», которое в данном случае оказалось нам на руку.
Какое отношение имеет весь этот экскурс в инженерное дело и вычисления к разработке ПО и руководству этим процессом? Он имеет отношение к тому,как решать задачи. Нас учили делать оценку, затем проводить вычисления, затем сравнивать результаты. Что делать, если результаты вычислений сильно противоречат вашим первоначальным оценкам? Надо рассмотреть три сценария:.
1.
Проверить, не было ли ошибки в вычислениях. Все хорошо, но вы напутали в числах.
2.
Вычисления проведены правильно, но есть какая-то ошибка в модели. Например, вы предположили, что зависимость линейная, а она должна быть квадратичной. Явление вы выбрали правильно, но смоделировали его неверно.
3.
Модель корректна, но выбрана неправильно. Имеется в виду, что действуют какие-то другие факторы, оказывающие влияние на вашу модель. Ваша модель правильно предсказывает результаты, но их искажает какой-то другой эффект, действующий в том же или в противоположном направлении, а вы этот эффект просмотрели.
Такой подход оказывается достаточно общим и потому применим к программному обеспечению. Например, я часто обнаруживал, что если отлаживать программу, дающую странный результат, именно в таком порядке, то удается обнаружить истину. Прежде чем подвергать сомнению базовые предположения, проверьте арифметику (или правильные ли вводятся данные и вовремя ли, если это программа). Затем проверьте модель в данном случае алгоритм. Если по-прежнему не ясно, в чем дело, посмотрите, нет ли чего-то, чего вы не поняли. В результате может обнаружиться, что подход к программированию был ошибочным с самого начала.
Наша подготовка в области вычислений имела глубокие последствия и привела к склонности почти все подвергать сомнению. Как я уже говорил, мы были первыми программистами «оборонительного стиля». Впоследствии в качестве менеджеров мы были требовательны к себе и к своим сотрудникам в соблюдении хорошей инженерной практики. Это означало усиленное внимание к базовой архитектуре и таким полезным вещам, как периодический пересмотр проекта и частое тестирование, начиная с ранних этапов.
Мы не пропускали мелочей. Мы знали, что если результаты «почти сходятся», это не доказательство их верности. Иногда в финансовых отчетах вы обнаруживаете, что итоги лишь чуть-чуть расходятся, и соблазнительно объяснить это «ошибками округления». Но очень часто оказывается, что совершены две существенные ошибки разного знака, почти погасившие одна другую. Когда боги вычислений милостивы к нам, они подкидывают такие ключи. Не поленитесь воспользоваться ими и всегда помните золотое правило Ричарда Хемминга: «Цель вычислений - понимание, а не числа».
Наконец, благодаря нашей инженерной подготовке мы были знакомы со сложностью и масштабированием. Я всегда буду помнить свой курсовой проект на старшем курсе. С целой группой студентов мы должны были с чистого листа сделать проект нефтеперегонного завода. Мы работали день и ночь в течение нескольких недель. И вот что выяснилось: трудно координировать работу нескольких инженеров, одновременно работающих над разными частями проекта, потому что продукты на выходе участка, разрабатываемого одним, оказываются входными продуктами для участка, разрабатываемого другим. Все приходится менять одновременно! Чтобы решить эту проблему, мы тщательно разработали интерфейсы и смогли сделать их устойчивыми. Много лет спустя эта идея оказалась незаменимой при создании больших и сложных программных систем. И другие идеи из науки «построения больших объектов» были так же с пользой заимствованы и пересажены на почву программирования.

Популярные статьи

Свежие статьи