14
Наставники, ученики и мастерство
Уровень выпускников в области компьютерных технологий меня постоянно разочаровывает. Дело не в том, что они недостаточно умны или талантливы – просто их не учили тому, что необходимо знать настоящему программисту.
Диплом для неподготовленных
Однажды я проводил собеседование с девушкой, занятой дипломной работой в области компьютерных технологий в известном университете. Она подала документы на летнюю стажировку. Я попросил ее написать для меня решение несложной задачи, а она ответила: «Вообще-то я не пишу код».
Пожалуйста, перечитайте предыдущий абзац, а потом переходите к следую щему.
Я спросил, какие курсы по программированию она посещала во время обучения. Она ответила, что не посещала никаких.
Возможно, вам стоит прочитать главу с самого начала. Вы хотя бы убедитесь в том, что вы не попали в альтернативную Вселенную и вам не приснился страшный сон.
Вы спросите, как студент с учебной программой магистра в области компьютерных технологий мог обойтись без единого курса программирования? Я тогда задал себе тот же вопрос. И до сих пор не нахожу ответа.
Конечно, это самый выдающийся случай в серии разочарований, испытанных мной во время собеседований с выпускниками. Не все выпускники в области компьютерных технологий настолько плохи – вовсе нет! Однако я заметил у них нечто общее: почти все они изучали программирование самостоятельно до поступления в университет и продолжали изучать его, несмотря на учебу в университете.
Не поймите меня неправильно. Я считаю, что в университете можно получить отличное образование. Просто наряду с этим можно украдкой проскользнуть через систему и получить диплом… не получив ничего более.
Другая проблема: даже самые лучшие курсы по компьютерным технологиям обычно не готовят молодого выпускника к тому, с чем он столкнется в этой отрасли. И дело даже не столько в недостатках учебных программ, как в реалиях почти всех дисциплин. То, что вы узнаете во время учебы, часто очень сильно отличается от того, с чем вы сталкиваетесь на работе.
Обучение
Как мы учимся программировать? Позвольте рассказать вам одну историю о наставниках и учениках.
Digi-comp I, мой первый компьютер
В 1964 году моя мама подарила мне на 12-летие маленький механический компьютер. Он назывался Digi-Comp I[51] и состоял из трех пластиковых триггеров и шести пластиковых конъюнкторов. Выходы триггеров можно было соединять с входами конъюнкторов или наоборот – выходы конъюнкторов со входами триггеров. Короче говоря, устройство позволяло создать трехразрядный конечный автомат.
В комплект входила инструкция с несколькими программами. Чтобы запрограммировать машину, следовало протолкнуть пластиковую трубочку (короткий отрезок соломинки для коктейля) в штифт на триггере. В руководстве было точно указано, куда вставлять трубочки, но ни слова не говорилось о том, что эти трубочки делают. Знали бы вы, как это меня раздражало!
Я часами разглядывал машину и пытался понять, как она работает на самом нижнем уровне; но даже для спасения жизни я бы не смог заставить ее сделать то, что мне нужно. На последней странице руководства было сказано, что если я заплачу доллар, то мне пришлют руководство по программированию машины.[52]
Я послал доллар и стал ждать с нетерпением двенадцатилетнего подростка. Когда книга пришла, я проглотил ее за день. Это было простое изложение булевой алгебры с азами булевой логики, законов ассоциативности и дистрибутивности и теоремы де Моргана. В руководстве было показано, как выразить задачу в виде последовательности логических формул и как сократить эти формулы для 6 конъюнкторов.
Я написал свою первую программу. Я написал уравнения, сократил их и отобразил на трубки и штифты машины. И программа заработала!
Даже сейчас от воспоминаний у меня мурашки бегут по спине. Те впечатления определили судьбу 12-летнего подростка почти полвека назад. Программирование захватило меня, и моя жизнь уже никогда не будет прежней.
Помните момент, когда заработала ваша первая программа? Она изменила вашу жизнь или открыла перед вами путь, с которого вы уже не смогли свернуть?
Я не мог во всем разобраться сам. У меня были наставники. Очень добрые и способные люди (которым я многим обязан) не пожалели времени на то, чтобы написать изложение булевой алгебры, доступное для 12-летнего подростка. Они связали математическую теорию с практическими навыками программирования маленького механического компьютера; благодаря им я смог заставить компьютер сделать то, что мне было нужно.
Я только что снял с полки свой экземпляр этого судьбоносного учебника. Я храню его в пластиковом пакете с застежкой. Время берет свое: страницы пожелтели и стали хрупкими. Но сила слов сияет, как и прежде. Элегантное изложение булевой алгебры занимает всего три страницы неплотного текста. Пошаговый анализ формул каждой из исходных программ до сих пор производит впечатление. Это был настоящий шедевр; работа, которая изменила жизнь по крайней мере одного молодого человека. А я, скорее всего, даже не узнаю имен авторов.
ECP-18 в средней школе
В 15-летнем возрасте, когда я учился в старших классах, мне нравилось проводить время в математической лаборатории. Однажды туда привезли устройство размером с циркулярный станок. Это был учебный компьютер для средних школ, он назывался ECP-18. Нашей школе был предоставлен двухнедельный пробный период.
Я стоял в стороне и слушал разговоры учителей и техников. У машины были 15-разрядные слова (что такое «слово»?) и барабанный накопитель на 1024 слова. (Тогда я уже знал, что это такое, но только теоретически.)
Когда машину включили, она издала свист наподобие того, который издает реактивный самолет при взлете. Я предположил, что это раскручивался барабан. Когда устройство набрало обороты, оно работало относительно тихо.
Машина была очаровательной. Она напоминала офисный стол, над которым возвышалась потрясающая панель управления – как на капитанском мостике боевого корабля. Панель была украшена рядами лампочек, которые также можно было нажимать, как кнопки. Сидя за таким столом, человек ощущал себя словно в кресле капитана Керка.[53]
Я наблюдал за тем, как техники нажимали кнопки. Когда кнопку нажимали, лампочка загоралась, а при повторном нажатии она гасла. Также они нажимали другие кнопки с названиями типа «Загрузить» и «Выполнить».
Кнопки в каждом ряду были объединены в пять групп по три. Мой Digi-Comp тоже был трехразрядным, так что я мог читать восьмеричные цифры в двоичной форме. Было нетрудно понять, что каждая строка представляет пять восьмеричных цифр.
Я слышал, как техники, нажимавшие кнопки, что-то бормочут. Они нажимали 1, 5, 2, 0, 4 в строке «Буфер памяти», говоря при этом: «Сохранить в 204». Они нажимали 1, 0, 2, 1, 3 и бормотали: «Загрузить 213 в аккумулятор». Там был ряд кнопок с подписью «Аккумулятор!»
Через десять минут моему 15-летнему разуму было абсолютно ясно, что 15 означает «сохранить», а 10 – «загрузить», что в аккумуляторе находились сохраняемые или загружаемые данные, а остальные числа были номерами одного из 1024 слов на барабане. (Так вот что такое «слово»!)
Слово за слово (непреднамеренный каламбур), мой пытливый ум все глубже проникал в коды инструкций и концепции. К тому моменту, когда техники ушли, я уже понимал основные принципы работы машины.
Этим же днем, во время часов для самостоятельной работы, я пробрался в математическую лабораторию и начал экспериментировать с компьютером. К тому времени я уже отлично знал, что проще попросить прощения, чем добиться разрешения! Я ввел программу, которая умножала содержимое аккумулятора на 2 и прибавляла 1. Я ввел в аккумулятор 5, запустил программу – и увидел в аккумуляторе 13! Программа работала!
Я ввел еще несколько таких же простых программ, и они тоже работали так, как положено. Я был повелителем Вселенной!
Сутки спустя я понял, насколько я был глуп – и как мне повезло. Я нашел в лаборатории памятку, в которой были перечислены все инструкции и коды операций, в том числе и тех, которые я не мог узнать, наблюдая за техниками. Я с радостью узнал, что известные мне коды были интерпретированы правильно, а остальные вызвали прилив энтузиазма. Однако среди новых инструкций я заметил инструкцию остановки HLT. Так уж совпало, что инструкция остановки была словом из одних нулей. И еще совпало то, что я включал в конец каждой из своих программ слово из одних нулей, чтобы стереть содержимое аккумулятора. Концепция остановки мне просто не приходила в голову. Мне казалось, что программа сама остановится, когда все сделает!
Помню, я однажды сидел в математической лаборатории, наблюдая за тем, как один из учителей боролся со своей программой. Он пытался ввести два числа в десятичной форме с подключенного телетайпа, а потом распечатать их сумму. Каждый, кто пытался программировать подобные задачи на машинном языке мини-компьютеров, знает, что они отнюдь не тривиальны. Нужно прочитать символы, разбить их на цифры, затем преобразовать в двоичную форму, просуммировать, преобразовать их обратно в десятичную систему и закодировать в символы. Поверьте, когда программа вводится в двоичном виде с передней панели, все намного хуже!