Программирование как профессия
Около полутора лет назад в специальной программистской рассылке, на которую я был подписан и которая посвящена тонкостям и сложностям одного формального языка, появилось письмо с темой "Отдохни!" и характерным текстом:
"Привет ВСЕМ!!! Простите, но не мог удержаться".
И дальше смущенный смайлик. Несмотря на то, что автор письма понимал, что его сообщение не очень к месту, ему очень хотелось поделиться своей находкой, и знал он, что никто его за это легкое отвлечение не осудит. В письме был следующий текст:
"Дорогой All! Прочтите статью. Взял я ее из газеты "Компьютерная Россия", которую на Comtec'е раздавали нахаляву. После ее прочтения просто гордость за наших компьютерщиков берет".
Речь идет о коротком тексте, который многие видели - он разбрелся по Сети в изобилии. Вот из него некоторые выдержки:
«Что думают о русских программистах их западные коллеги.
Русские программисты никогда не читают руководств и редко пользуются online подсказкой - они легко понимают новые программы, потому что ранее уже попробовали все программы подобного рода.
Русские программисты всегда используют самые последние версии самых лучших программ - потому что не платят за софт, а либо взламывают дистрибутив, либо покупают CD с кучей нелицензионного софта.
Русские программисты очень любят поэкспериментировать с железом. Они разберут компьютер и соберут его обратно в течение нескольких минут. Они помнят установки джамперов на большинстве материнских плат, жестких дисках и других устройствах. Они никогда не забывают, какие прерывания и адреса памяти используются в настоящее время в их компьютере.
Русские программисты программируют на всех уровнях, и таблицы процессорных кодов всегда находятся у них на рабочем столе. Они помнят назубок список функций 21-ого прерывания.
Русские программисты предпочитают Borland, а Microsoft компиляторы инсталлируют только из-за того, что в них хороший helр для Windows AРI.
Есть два вида Русских программистов - первые ненавидят Windows и программируют под Unix, вторые ненавидят Windows и программируют под них.
Русские программисты никогда не сдаются. Они могут вылавливать ошибки, забыв о сне и еде.
Жены Русских программистов несчастны, потому как им уделяется очень мало внимания, пока в доме есть хоть один компьютер.
Русским программистам недоплачивают. Hо и не существует суммы в мире, способной успокоить их желания.
Русские программисты не любят использовать шаблоны. Их программы - это индивидуально написанные произведения с большой долей импровизации».
Вряд ли западные коллеги думают что-то подобное. Программирование, пожалуй, одно из космополитичных занятий. И национальная принадлежность программиста никогда не была фактором, определяющим его преимущества или недостатки. Дело не в том, что этот восторженный текст написал, конечно же, русский программист, а в том, что программист этот очень хотел, пусть и в шутливой форме, дать самоопределение, понять, кто же он есть, и чем же он на самом деле занят, и потому я собираюсь совершенно серьезно проанализировать эту шутливую заметку.
Когда я был молод (поглаживая окладистую бороду) в середине восьмидесятых мимо меня пробегала распечатанная на безобразном "прыгающем" принтере статья о "настоящих программистах", написанная как раз западными коллегами. Называлась она "Почему настоящие программисты не используют "Паскаль". Я думаю, многие ветераны ее помнят: У меня нет ее текста и я приведу отрывки из нее по памяти. Я приношу извинения, если что-то невольно забыл или процитировал не слишком точно.
«Настоящий программист никогда не приходит на работу вовремя.
Настоящий программист никогда не работает с 8 до 5, если только не с 8 вечера до 5 утра.
Настоящий программист ненавидит кофе и булочки, потому что в три часа ночи ничего больше не купишь.
Получив задачу на девять месяцев, настоящий программист будет девять месяцев заниматься одним маленьким, но очень интересным модулем, а весь проект напишет в последние дни за три сеанса по 52 часа, и ни у кого не повернется язык заикнуться о документации или комментарии.
Настоящего программиста всегда можно узнать на банкете или званом приеме по тому, как он будет объяснять совершенно обалдевшиму гостю новые методы защиты операционной системы и новейшие способы взламывания этой защиты.
Настоящий программист исправляет свои программы прямо в памяти машины с инженерного пульта, поэтому очень скоро они не имеют ничего общего с исходным текстом.
Настоящий программист пишет очень быстрые программы и никогда не устает их ускорять, даже если потребуется выкинуть все операторы цикла и вызовы процедур или перейти на ассемблер.
Одного настоящего программиста разбудили ночью звонком из другого города, где полетела операционка, и он, не вставая с постели, продиктовал первые 2000 ячеек.
В бортовом компьютере спутника "Пионер", летевшем к Сатурну, оказалось свободно 250 байт памяти. Настоящий программист умудрился засунуть на свободное место программу распознавания, и она прекрасно работала и открыла неизвестный спутник Сатурна.
Настоящий программист никогда не использует "Паскаль": потому что писать на "Паскале" может любой младенец и даже некоторые барышни, потому что плевать он хотел на всю вашу модульность, структурность и прочую удобочитаемость, его программа - это родное дитя, и он никогда не отдаст его в чужие потные руки.
Пусть на "Паскале" пишет сосунок Вирт, раз у него не хватает мозгов программировать в машинных кодах, а настоящий программист останется верен себе и машине».
Многие компьютерные реалии, упомянутые в этих максимах, устарели еще в то время, когда я читал этот текст впервые. Я уже очень смутно представляю, что значит "править программу прямо с инженерного пульта", но я привел, все что вспомнил, потому что, вообще-то, все понятно, и любой программист независимо от степени его "настоящести" понимает, о чем собственно речь. Не правда ли, много сходного в этих заметках разделенных почти двадцатью годами? А ведь и в первой, и во второй речь идет не о чем-то, а о программистской кухне, которая теснейшим образом связана с самой стремительно развивающейся областью в современном мире - компьютерными информационными технологиями. Значит, что-то остается неизменным, что-то важное и существенное, раз такого рода тексты периодически возникают в программистском фольклоре.
Первое, что явно выражено в обоих приведенных мной текстах - это желание подчеркнуть особость той деятельности, которой занят программист, его кардинальное отличие от других профессий, связанных с компьютером. Положение программиста противоречиво, как любое положение на границе - он переводит требования пользователя на язык машины. Но сам программист совершенно не согласен с положением транслятора. И в этом он совершенно прав, поскольку требования пользователя содержательны, а язык машины формален, и потому точный перевод невозможен, а удовлетворительный достижим только при определенном умении переводчика. И программисту приходится доказывать и пользователю, и машине, что он не менее необходим. Они как-то пониманием этого проникнуться не спешат. За двадцать лет мало что изменилось. Мир не стал формальным, а компьютер не научился оперировать некорректными расплывчатыми образами вместо однозначных команд. А значит, место программиста осталось неизменным, хотя и очень многое поменялось. Положение на границе требует постоянной заботы о том, чтобы удержать равновесие. А это не всегда просто, и требует незаурядного мастерства, того мастерства, которое вообще-то никто не видит, кроме коллег. Пользователя интересуют его собственные проблемы и справедливо не волнует, как именно они будут решены. А программист за очень редкими исключениями не может сказать ему - подожди лет двадцать, дай подумать. В отличие от фундаментальных наук, таких как математика или физика, программирование - насквозь живая и прикладная область человеческой деятельности. Оно занимается конструированием реальных объектов и без этих объектов не существует. Но программист в то же время решает множество глубоких исследовательских задач, хотя делает он это, как правило, экспериментально. И он требует внимания к своей деятельности и уважения к ней, не меньшего, чем к чистой науке. И тогда появляются манифесты, подобные приведенным мной в начале, и они всегда встречаются одобрительным гулом всего программистского сообщества.
Какими же инструментами располагает программист при конструировании реального объекта? Ведь именно на инструменте сосредоточено внимание профессионала, и именно по умению пользоваться этим инструментом можно судить, кто перед тобой - действительно профессионал или профан. Программист работает с формальным языком. Обычно за карьеру, языков, на которых пишет профессионал, накапливается около десятка. Иногда больше, иногда меньше, это уже зависит от специфики задач. Формальный язык - это тот воздух, которым дышит программист. Состав этого воздуха, его структура и формируют мировоззрение профессионала. Поэтому так важен язык, и особенно важен родной язык. А он у каждого программиста есть. Не обязательно это первый язык, не обязательно даже, что именно на этом языке пришлось написать больше всего программ. Важно, что у каждого профессионала есть язык, писать на котором максимально комфортно, даже если по своей структуре он и не очень подходит для решаемой задачи. Человек может быть расположен к деталям и частностям низкоуровневой реализации - и тогда ему близок ассемблер или базовый С. А может напротив, почти не интересоваться тем, как же на самом деле работает процессор и ориентироваться на прикладные задачи и использовать крупноблочные языковые конструкции - мощные объектные библиотеки.
Именно то, что язык является вечным спутником программиста, и отличает программиста от других очень многочисленных профессий и профессионалов, занятых в работе с компьютером. Для всех вместе прижилось в русском языке понятие "компьютерщик". Для меня это понятие абсолютно безинформативно. Я не знаю, кто такие "компьютерщики", но знаю чем занимаются, скажем, системные администраторы, или многочисленные пользователи, работающие с очень сложными иногда пакетами, в интерфейсе которых разобраться может быть сложнее, чем научиться простейшим языковым конструкциям. Дело здесь не в сложности, а в принципе.
Программист - это не администратор, не менеджер, не пользователь, это человек пишущий код на любом формальном языке. Наиболее эзотерический из языков программирования это - ассемблер. Он ближе всего к машине и дальше всего от человека. Еще ближе к "железу" уже только программирование прямо в битовых наборах - когда человек, весело насвистывая, набивает бесконечные ряды нулей и единичек, а потом эта абракадабра почему-то начинает работать. Чем более крупноблочный язык, тем он ближе к человеку, понятнее, тем более он открыт. Если объект описывает поведение экранного окна - ясно, что происходит. Если команда пересылает содержимое одной ячейки в другую, понять зачем она это делает, вне контекста нельзя. Ассемблер - самый эзотерический из языков программирования. И поэтому-то среди программистов так ценится умение писать как раз на ассемблере - в машинных кодах. Как написано в процитированных заметках:
"Пусть на "Паскале" пишет сосунок Вирт, раз у него не хватает мозгов программировать в машинных кодах, а настоящий программист останется верен себе и машине".
Или уже менее агрессивно в более новом тексте:
"Русские программисты программируют на всех уровнях, и таблицы процессорных кодов всегда находятся у них на рабочем столе".
То, что формальные конструкции конечны и в высокой степени детерминированы, не спасает от неизбежных трудностей, без которых они были бы идеально просты, строги - но мертвы. Программы живут во времени. Программа, которую перестали переписывать, впадает в состояние агонии и очень быстро умирает. Программа живет, пока ее пишут. И, следовательно, все программы которые мы используем - недописаны, недостаточно оттестированы. Программист прирастает к своему детищу и какое-то время составляет с ним одно целое. Чтобы программа была работоспособна, ей нужно отдать частичку самого себя, и не раз, а постоянно. Она питается энергией человека.
Программист относится к написанному им коду с той же ревностью, с какой относится к своему тексту писатель. И потому так велико желание оставить свои неповторимые следы в программе. Будь то путаница безусловных переходов, или отказ использовать шаблоны, порождающие стандартный код. Нужно сказать, что еще 10-15 лет назад добиться самовыражения в программировании, выработать свой индивидуальный стиль было намного проще чем сегодня. Коммерческие пакеты становятся все стандартнее, все чаще используются готовые решения - на всех уровнях, от работы с железом до программирования пользовательских инферфейсов. Но сказать, что сегодня совершенно невозможно себя проявить, конечно, нельзя. Когда вы только подходите к проблеме, вам кажется, что на все случаи жизни давно готовы библиотеки, и вам осталось только собрать домик из трех кубиков. Но тут приходит пользователь, и негромко, но твердо просит чтобы у этого домика был наклон на северо-восток, в точности такой как у Пизанской башни. И дай Бог, если из трех приготовленных кубиков сгодится в деле один, остальные придется писать самому. А пользователь - это реальность, и деться от него некуда, а воображение его безгранично.
Почему такое неприятие продукции Microsoft у сегодняшних программистов и языка Паскаль у программистов предыдущего поколения? Ведь Паскаль и его очень хорошие компиляторы трудно обвинить в ненадежности, как это всегда делается по отношению к Windows.
Если взять чисто коммерческое программирование, направленное на написание конечных приложений, а не собственно системные программы, программировать под Windows проще, чем под UNIX, программировать на Паскале много проще, чем на ассемблере или даже Фортране. Разве проще - это хуже?
Хуже. Безусловно. Чем универсальнее решение, тем это решение менее точное и менее эффективное. Идя по пути универсализма, мы неизбежно игнорируем детали и частности. Если человек ставит перед собой задачу предельного совершенствования программы, его не удовлетворит приблизительность универсального подхода. Отсюда и следует такое скептическое отношение профессионалов к программам и компиляторам, пригодным в любом случае.
Другое дело, что написать достаточно богатое приложение на ассемблере очень трудно. И выигрыш от применения низкоуровневых частных решений не оправдывается. Пока мы будем отлаживать наш громоздкий, но очень эффективный код, Intel выпустит новый, гораздо более быстрый процессор и весь выигрыш в эффективности будет потерян. И приходится, скрепя сердце, отступать. Но удовлетвориться приблизительно точным решением трудно. И потому формулируется такое жесткое требование - "никогда не использовать Паскаль!", хотя, часто, оно все-таки чистая декларация, а не руководство к действию.
Программирование - это очень тяжелая работа, даже если она делается с хохотком и матерком, даже если она увлекает и захватывает. Илья Эренбург (писатель) говорил, что нет ничего труднее в жизни, чем водить перышком по бумаге. Я думаю, что водить курсором по экрану не многим легче. Самое, может быть, трудное, на что не обращаешь или почти не обращаешь внимания в молодости, и что может стать с возрастом непреодолимым барьером, заставляющим иногда менять профессию, это - умение не терять концентрацию внимания на протяжении многих часов подряд. Известно, что одним из самых неприятных эффектов, связанных с работой за компьютером, является пересыхание глазных яблок - человек моргает слишком редко, и глазное яблоко недостаточно смачивается. Программист тоже очень редко моргает, иначе можно "проморгать" ошибку. Только здесь ситуация много хуже - нельзя "моргать" не только глазом, но и умом. Программирование - это умение концентрироваться, умение представлять задачу по детали, до точки с запятой, и не выпускать ее из плотной хватки многие часы, дни, месяцы подряд. Честно говоря, "юноше обдумывающему делать жизнь с кого", я бы такого не пожелал.
Мне памятен один молодой человек, который на вопрос на чем он собирается писать программу, ответил "На Паскале". Я поинтересовался: "Ты много на нем писал?" "Совсем не писал, вчера выучил", - ответил решительный юноша. Как это "вчера выучил" мне совершенно не понятно. Язык выучить вообще нельзя, ни один, но если в отношении, например, к английскому подобную глупость не скажет, пожалуй, никто, то о формальном языке такие утверждения слышать случается.
Программировать нельзя научиться. Можно только научиться учиться программировать. Здесь невозможно даже сравнительно недолгое время просуществовать старым багажом. Нужно либо бежать, либо сходить с дистанции. Постоянно, на протяжении многих лет поддерживать себя в тренинге, в тонусе, каждый день заглядывать немножко вперед - иначе завтрашний день накроет тебя волной инноваций, и ты не сможешь из-под нее выбраться. Постоянно думать, а не только "лепить" команды. К такому ритму жизни лучше всего приспособлены молодые, решительные люди, способные рисковать и брать ответственность на себя. За тестирование новых версий денег не платят. За изящные решения платят только в том случае, когда они еще и эффективные. А если не экспериментировать, не пробовать, не писать бесконечно тестовые и исследовательские программы, ты через очень короткое время окажешься просто не способен вообще что-нибудь написать.
Так кто же такой программист? Каким он хотел бы видеть себя в идеале? Он не представляют свое существование без компьютера, без клавиатуры (без мыши как раз можно, но попробуйте набрать мышкой текст), без задачи и языка, на котором эта задача пишется. Они становятся его продолжением - частью тела и ума. Цель, которую преследует программист это не решение задачи - его задача всегда неразрешима, не сдача к сроку очередной версии программы - это всегда только промежуточный финиш, на котором особенно некогда задерживаться, и как раз с наступлением которого и становится понятно, как же на самом деле следовало писать. Цель программиста - совершенный код, который бы воплотил в цифре образы реального мира, преломленные через сознание и представленные в виде элегантных языковых конструкций. И как всякое совершенство эта цель недостижима. А значит, нужно снова и снова садиться за клавиши и писать, радоваться находкам и печалится над неудачами. Жить, каждый день делая цифровой мир чуть-чуть человечнее.
Все ссылки в тексте программ ведут на страницы лиц и организаций, не связанных с радио "Свобода"; редакция не несет ответственности за содержание этих страниц.