Интервью…

Пол Дилация о себе, о Microsoft, .NET, C++, программировании и о России

Пол Дилация (Paul DiLascia) — внештатный писатель, консультант, а также независимый веб-дизайнер и разработчик пользовательских интерфейсов. Автор книги «Windows++: Writing Reusable Windows Code in C++» (Addison-Wesley, 1992). Пол уже много лет ведет рубрику «С++: вопросы и ответы» в журнале MSDN Magazine (ранее — в MSJ).

ВопросПол, расскажите немного о себе.

ОтветНе уверен, что мое детство будет интересно читателям, хотя однажды я разрисовал стенку какими-то каракулями. Не знаю, был это C++ или Perl… Я вырос на Манхэттене и ходил в специальную среднюю школу для одаренных детей. Затем поступил в MIT (Массачусетсский технологический институт), там я получил степень бакалавра математических наук. В течение года я работал над докторской (тоже по математике) в Гарварде. Бертран Рассел (Bertrand Russell) однажды сказал: «Математику можно определить как предмет, в котором мы никогда не знаем, о чем говорим, а если что-то и говорим, то не знаем, истина ли это». Насколько я могу судить, это чистая правда.

ВопросПочему Вы связали свою жизнь с компьютерами и программированием?

ОтветРазве кто-нибудь сейчас может сказать, как оказался там, где он есть? Когда я был еще подростком и учился в школе, у меня был Altair 8800. Как утверждалось в Popular Electronics Magazine в 1975 г. (http://www.blinkenlights.com/altair.shtml), Altair 800 был первым коммерчески успешным ПК. Удивительно, но это также был первый компьютер, работавший с ПО от Microsoft! Мне приходилось запускать программу загрузки, используя переключатели, а потом грузить интерпретатор Basic с бумажной ленты. По-моему, у компьютера было 16 Кб памяти. Сегодня в некоторых версиях Windows этого объема не хватило бы и одному файлу! Я написал трехмерную игру Star Trek на Microsoft Basic. Но это было просто хобби. Я всегда думал, что стану серьезным математиком.

В Гарварде я довольно быстро понял, что мне придется изучить всю математику, которую человечество построило за 2000 лет, прежде чем я сам смогу придумать что-нибудь новое и полезное. Между тем в программирование я мог внести свою лепту сразу. К тому же это сулило больше денег, да и девушки там посимпатичнее. Поэтому я бросил математику и стал программистом. В то время программирование было в диковинку, поэтому любой, кто хоть немного разбирался в нем, мог получить работу. Судите сами, на 10 тысяч вакансий программиста приходилось 6 человек со степенями в области компьютерных наук (computer science). Сегодня все наоборот: даже ваша бабушка из Уфы может написать «Hello, World!» на Visual Basic, и есть безработные доктора наук.

Одной из моих самых первых была работа в компании Infocom, выпускавшей компьютерные игры (известная серия Zork — ее рук дело). Это было примерно в 1982 г. Я написал интерпретатор Zork для Commodore 64 — одного из самых первых и удачных домашних компьютеров. Его продали в количестве более 20 млн. штук по всему миру (http://www.zimmers.net/cbmpics/c64s.html). Каждый раз, когда я пытался запустить свою программу, ломался диск. Честное слово — каждый раз! Я набирал «Run» и диск издавал громкий «КРЭК»! После этого его нельзя было восстановить. Я испортил около пяти дисков до того, как мы вызвали главного эксперта по аппаратному обеспечению из Commodore. Он очень разозлился, как будто я был виноват в том, что диски ломаются. Я сказал: «Эй, приятель, аппаратное обеспечение должно быть независимо от программ! Что бы я ни делал, моя программа не должна иметь возможности сломать диск!» Так в чем же было дело? Оказалось, я пытался записывать данные на самую крайнюю дорожку диска. Никто раньше не пробовал этого делать. Головка двигалась к самой крайней дорожке, но там был установлен механический ограничитель (находившийся слишком близко), и головка просто разбивалась об него. Только представьте себе ПО, ломающее диски. Во было время!

ВопросА чем Вы занимаетесь сейчас?

ОтветОфициально у меня единственная работа — писать в «MSDN Magazine», но я также участвую в консалтинговых проектах, если они достаточно интересны или многообещающи. На своем сайте www.dilascia.com я изо всех сил стараюсь показать, что не хочу работать, но люди почему-то меня по-прежнему нанимают! Вот так. Я разработал несколько коммерческих Web-сайтов типа www.tivoliaudio.com. По-моему, заниматься Web-программированием веселее, чем писать Windows-приложения. Да и Perl интереснее, чем С++. Но мое истинные увлечения — писательство и цифровой коллаж, которым я только недавно начал заниматься серьезно.

ВопросВ каких областях Вас можно считать экспертом?

ОтветНенавижу термин «эксперт». Я пишу в MSJ/MSDN уже более десяти лет и за это время понял, что не имеет никакого значения, в чем вы считаете себя экспертом. «Эксперт» — это тот, кто узнал что-то на 10 минут раньше других, в том числе и меня. У нас более 100 тысяч читателей, и среди них всегда найдутся «эксперты». Честно говоря, это не очень приятно. Из-за этого я постоянно нахожусь в напряжении и вынужден держать наготове свои антистрессовые пилюли.

ВопросВы ведете постоянную колонку в «MSDN Magazine», отвечаете на вопросы о C++ (в основном по MFC). Вы сами отбираете вопросы, на которые стоит отвечать? Может, Вы отвечаете вообще на все вопросы, которые к Вам приходят?

Ответ «Мой бог!»* Я никогда в жизни не смогу ответить абсолютно на все вопросы! Их в день приходит от 5 до 10 штук. Некоторые из них просто сумасшедшие. Например: «Как программировать на С++?» или «Как получить работу в Microsoft?». Однажды кто-то даже спросил (я не шучу!): «Как мне стать более похожим на вас?»

Но это еще не все. Есть и другая крайность. Иногда я получаю такие вопросы… единственное, что остается делать, — так это отвечать: «Извини, приятель, я ничем не могу тебе помочь. Очевидно, ты знаешь об этом гораздо больше меня!» Еще хуже, когда кто-то присылает мне две страницы кода на С++ и просит найти в них ошибку. В этом случае я вообще не отвечаю. Хотя отвечать я стараюсь всегда, даже если ответ: «Не знаю». Но около половины вопросов остается без ответа. Когда-нибудь я хотел бы написать целую колонку о самых забавных вопросах, но не думаю, что у ребят из Редмонда есть чувство юмора.

Я стараюсь отбирать вопросы, представляющие интерес для многих читателей. Например, как засунуть битовую карту в меню? Как получить основной IP-адрес компьютера? Как настроить диалог File Open? Как вызывать Win32-функции из C#? При этом я вовсе не хочу рисоваться перед читателями. Наоборот, я лучше отвечу на простой вопрос, если решу, что он интересен нашей аудитории, чем на какой-нибудь сложный, который позволит мне казаться очень умным, но лишь пять человек поймут, о чем шла речь. Конечно, если люди хотят думать, что я умный, я не против. Иногда я сам наталкиваюсь на то, что будет интересно читателям. Тогда я выдумываю вопрос и сам же отвечаю на него. Например, в этом интервью я, может, придумал несколько вопросов, которых вы не задавали. Кто знает?

ВопросКак Вы приобрели свои знания и опыт в С++?

ОтветНаписал книгу. Вообще лучший способ стать в чем-то экспертом — написать об этом книгу. Тогда люди будут думать, что вы действительно эксперт независимо от того, так ли это на самом деле.

Как только появился С++, я подумал, что это лучшее изобретение человечества с тех пор, как мы научились готовить попкорн в микроволновой печи (а у вас в России это возможно?). Мне казалось, что его ждет великое будущее. Первый компилятор С++ для ПК был Zortech. Он появился примерно в то же время, как начала набирать обороты Windows 3.1, году в 91–92-ом. Я тогда программировал компьютеры Vax под управлением Unix на языке C и хотел освоить C++ для ПК с Windows. Никто не знал, как писать под Windows на C++. (Еще не было ни OWL, ни MFC.) Так что я создал собственную инфраструктуру и написал о ней книгу — «Windows++». Писать книгу — все равно, что преподавать. Прежде чем объяснить что-то, вы должны понять это в десять раз лучше, чем обучаемый. Конечно, у меня уже был опыт: я годами писал ПО для разных компаний. Но создание своей инфраструктуры и работа над «Windows++» научили меня очень многому в плане программирования на С++ под Windows. Моя инфраструктура была очень похожа на MFC, хотя я написал ее намного раньше. Люди и сегодня читают «Windows++», хотя эта книга уже устарела.

Однажды какой-то англичанин написал мне, что встретил в Берлине какого-то немца. Немец вручил ему письмо, адресованное мне. Это письмо он (немец) получил от русского юноши, который лежал в госпитале в Берлине. Русский хотел узнать, не против ли я, если он переведет мою книгу «Windows++» на русский. Он сказал, что в России многие книги нелегально распространяются на дискетах из рук в руки. Но моя книга ему очень понравилась, поэтому он решил спросить разрешения. Таким образом, этот парень написал письмо на русском и отдал его немцу, который перевел его на немецкий и отдал его англичанину, а тот в свою очередь перевел письмо на английский перед тем, как выслать его мне. Это все было очень загадочно, как шпионы в ночи. Так что я ответил: «Если вы хотите перевести мою книгу на русский, то Бог вам в помощь!»

ВопросА почему Вы выбрали именно С++ как область своей специализации?

ОтветА я его не выбирал — просто я занимаюсь тем, что мне нравилось.

ВопросВы используете .NET-код в своей работе?

ОтветТолько когда пишу о нем.

ВопросКак Вы вообще находите .NET?

ОтветПрежде всего буду отвечать за себя, а не за Microsoft.

Лучшее в .NET — это возможность взаимодействия языков друг с другом. То есть вы можете писать компоненты, которые потом можно будет повторно использовать. А главное — для этого не понадобится каких-то особых усилий, как, например, в COM. В .NET все довольно просто. Вы можете писать на любом языке, и все будет работать. Сервисы взаимодействия просто удивительны. Хотите — вызывайте функции Windows API напрямую, а сервисы займутся преобразованиями и маршалингом. Если им это не удастся, есть способы научить их делать то, что нужно. Именно таким программирование и должно быть!

Хуже всего в .NET — Windows Forms. Честно говоря, не вижу, как писать серьезные GUI-приложения на основе .NET. Я бы никогда не стал использовать Windows Forms для автономных Windows-программ. Они получаются слишком медленными и неспособными задействовать все возможности ОС, которые могут вам понадобиться. Более того, слишком много классов «запечатано» — их нельзя переопределять. Например, вы не можете настроить диалог открытия файла. А между тем это одна из самых простых вещей, которые часто делают программисты. Если вы используете Windows Forms, около половины вашего кода будет опираться на сервисы взаимодействия, если только вы не работаете на Managed C++. Так зачем тогда вообще .NET?

Меня удивляет, как много шумихи вокруг «.NET против С++». Но главный вопрос — не «что лучше?», а «для чего?». Если вы разрабатываете Web-приложение, которое будет обращаться к базе данных и взаимодействовать с удаленными компонентами, или если вы просто хотите быстро написать прототип, тогда .NET удобнее. А если вы создаете автономное Windows-приложение (вроде расширения оболочки или программы для редактирования музыкальных файлов), лучше остановиться на C/C++. Главное — что вы пытаетесь сделать? Вы же не станете молотком завинчивать винт, а гвозди забивать отверткой! Хороший программист всегда знает, какой инструмент лучше подходит для конкретной работы.

Многие программисты, даже профессионалы, часто не понимают этих простых истин. Прямо сегодня я читал целую статью на тему «Как перенести С++-код на платформу .NET», автор которой даже не задался вопросом «а собственно зачем?». Зачем переносить программу на С++ в .NET? Потому что так хочет Билл Гейтс? Многие программисты вообще не задумываются об этом. Не стоит использовать .NET, C++ или другую систему только потому, что кто-то считает ее крутой, или потому, что вы хотите порисоваться перед друзьями. Вы должны применять систему тогда и только тогда, когда она эффективно решает стоящую перед вами задачу. Если вы не знаете, почему используете что-то, не используйте это! А если вам действительно понадобится какая-то конкретная система, вы ведь не станете спрашивать «зачем?» — очевидно, что это вопрос здравого смысла.

ВопросКаково Ваше мнение об использовании C++ для написания .NET-кода? У Вас есть какие-нибудь мысли о C++/CLI?

ОтветЕсли вам нравится С++, используйте его! Управляемые расширения — действительно классная штука. Они делают С++ полноправным гражданином .NET-общества. Но опять же — зачем? С++ хорошо подходит для GUI-приложений, которые должны быть быстрыми и достаточно близкими к ОС. Если это то, что вы ищете, зачем вообще .NET? C#/.NET лучше подходят для Web-приложений. Если это ваша цель, зачем C++? Языки программирования — не самоцель, а лишь средство достижения результата.

Что же насчет C++/CLI... Помилуйте, да я уже рассказал все, что мог!

ВопросКак часто Вам приходится писать код?

ОтветСтараюсь делать это как можно реже. Если речь не идет о Perl, конечно.

ВопросКакие средства разработки Вы предпочитаете?

ОтветСамо собой, я использую компилятор от Microsoft. Но не Visual IDE. Я вообще не переношу всякие IDE. С ними я чувствую себя пианистом без пальцев. Предпочитаю текстовый редактор Epsilon (он построен на базе Emacs — самого мощного текстового редактора, который когда-либо знала Вселенная). Это, конечно, вопрос скорости. Клавиатура позволяет делать это в десять раз быстрее, чем мышь. Молодые программисты, которые никогда в глаза не видели настоящего текстового редактора, просто млеют, когда видят меня за работой. Я нажимаю две кнопки, а происходит девять действий. Код создается словно по волшебству. Моргнете — и точно что-нибудь упустите! В Visual Studio, если вы хотите поменять текст на элементе управления, расположенном на форме, вам придется вводить символы в такое маленькое окошко, что вы не увидите оба конца набранного предложения!

Но, пожалуйста, не используйте Epsilon только потому, что это делаю я! Берите тот редактор, который нравится вам. Если вам нравится мышь, то кто я такой, чтобы с этим спорить?

Единственным дополнительным инструментом к моему редактору является отладчик. Но отладчик я использую, только если уже ничего не помогает. Обычно все ошибки я нахожу, вставляя выражения с TRACE или printf, которые показывают мне, что делает моя программа. Один из моих любимых инструментов — программа TraceWin, которая выводит на экран результаты TRACE (вы можете скачать TraceWin с моего сайта www.dilascia.com). Я предпочитаю начинать с чего-нибудь очень и очень простого. Потом добавляю новые функции — по одной за раз. Я пишу несколько строк кода, потом компилирую, запускаю и тестирую. Если все в порядке, пишу еще несколько строк и снова тестирую. Когда пишешь по десять строк кода за раз, ошибки находить очень легко! Единственная ситуация, в которой у меня всегда случаются проблемы, — когда пишу 250 строк кода и лишь потом тестирую. Тогда час работы с отладчиком мне гарантирован. Фу!

ВопросЧто Вы думаете о перспективах C++?

ОтветМногие считают, что C++ мертв, потому что выходит слишком много новых средств разработки и Microsoft не развивает MFC. А по мне это лучшее, что могло произойти с MFC! Я имею в виду вот что: вы действительно хотите писать свои приложения, используя систему, которая меняется каждые три месяца? Вы хотите стать бета-тестером Microsoft до конца жизни?

Настоящий переход это не «от C++ к .NET», а «от автономных программ (EXE) к Web-приложениям». Поэтому вопрос «С++ против .NET» не стоит. Проблема в другом: будут ли люди по-прежнему писать автономные приложения через десять лет? Чем больше людей будут писать Web-, а не GUI-приложения, тем меньше будет доля С++ в общем пироге программирования. Но потребность в автономных приложениях будет всегда хотя бы потому, что сеть слишком медленна и вам понадобятся программы для работы за локальным компьютером без выхода в сеть. Для автономных приложений C и C++ остаются самыми эффективными языками программирования. А как насчет серверов? Никто и не собирается писать Web-сервер на .NET!

Не забывайте: Windows сама по себе (как и Unix/Linux) написана на C и предоставляет API в стиле C. Пока это так, C/C++ будет оставаться самым коротким путем во взаимодействии с ОС. Даже в MFC очень многие части Windows остались неинкапсулированными. Так что вам придется либо писать свой маленький класс, либо вызывать C API напрямую. Это так естественно, что многие MFC-программисты даже не думают об этом. Хотя когда-нибудь Windows будет переписана на каком-нибудь языке высокого уровня с исполняющей средой вроде CLR. Только тогда C++ умрет. Но я бы не стал сейчас об этом думать — такой переход займет десятилетия, а не годы. Слишком много кода уже написано, и его надо поддерживать.

В общем, я думаю, что C++ проживет еще очень долго. Может, дольше, чем вы. А если так, о чем волноваться?

Вопрос А MFC?

ОтветТо же самое. То, что Microsoft не планирует совершенствовать MFC, означает, на мой взгляд, что MFC — вполне стабильная инфраструктура. И от этого только выигрывает.

ВопросКакова Ваша философия программирования?

ОтветВ английском есть акроним: KISS. Расшифровывается он так: Keep It Simple, Stupid*. Программирование — это управление сложностью программы. Между тем все, что вы можете сделать, упрощая свою программу, — это ускорить разработку, уменьшить число ошибок, повысить надежность, увеличить безопасность. Кроме тех случаев, когда вы пишете игры, пользователям нет дела до цветных кнопочек и анимированных меню. Единственное, что их интересует, — чтобы ваша программа работала, не уничтожала информацию пользователя, была проста и легка в обращении и помогала в работе.

Слишком много программистов тратят всю свою энергию на реализацию каких-нибудь диковинных средств UI вроде стыкуемых окон (docking windows) или розовых полос прокрутки только потому, что видели их где-то. Если вы пишете серьезный графический редактор с 14 панелями инструментов, тогда да — вам понадобятся стыкуемые окна. И если вы пишете программу для шестилетних девочек, розовые полосы прокрутки тоже будут кстати. Но для большинства программ эти средства — пустая трата вашего драгоценного времени. Вы заработаете больше денег, если реализуете какую-нибудь скучную функциональность, скажем, вывод на принтер или режим пакетного выполнения операций. У Microsoft есть 5000 программистов, чтобы создавать анимированные скрепки. А у вас их нет. Не попадайтесь в эту ловушку для завистливых!

Самые важные элементы программы невидимы — это скорость и надежность. Даже UI, если он достаточно хорош, невидим. Садясь в машину, вы же не думаете: «Так, я хочу ехать вперед, поэтому должен нажать ногой на педаль газа». Вы просто делаете это, и машина едет. Она становится расширением ваших сознания и тела. Таким должен быть и GUI. Если пользователь вынужден думать, вы проиграли.

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

Короче, заставьте свои программы работать, сделайте их надежными, быстрыми и простыми, не отвлекайтесь на мелочи вроде последних GUI-наворотов, которые вы видели где-то в Word или Excel. И еще: разберитесь в том, кто ваши пользователи и чего они хотят. Только после этого проектируйте программу. Чтобы она позволяла им делать, что нужно. Не перебегайте им дорогу и не заставляйте их терять время. Уважайте своих пользователей, будто это дорогие гости. Это должно быть легко, ведь русские славятся своим гостеприимством. Если вы собираетесь добавить какую-то новую функциональность, спросите себя: «Как это поможет моим пользователям?». Это относится ко всему программированию независимо от того, что именно вы пишете — GUI- или Web-приложения на C#, C++, Perl, VB или Java.

ВопросВы бывали в России?

ОтветНет, но надеюсь когда-нибудь побывать. Несколько лет назад я учил русский язык целое лето. Я хотел увидеть санкт-петербургские белые ночи. Но рутина поглотила меня, и я не сумел вырваться. Русский — самый сложный язык, который я когда-либо учил. Я уже забыл большую часть того, что выучил, так как у меня не было практики. Когда я учил русский, то написал небольшую программу YazMan (Язык-Man*), чтобы было легче запоминать слова. Программа показывала какое-нибудь слово на английском, например «book», а я должен был напечатать по-русски «книга». Если я отвечал правильно, программа издавала «дзинь» и выводила улыбающуюся рожицу. Если я ошибался, она выдавала «базз» и демонстрировала нахмуренные брови. Вы могли запросить подсказку, тогда программа показывала первую букву слова. Я использовал MFC и KOI-8. Моей учительнице (милой женщине из Армении, которая перед каждым уроком кормила меня необычными сладостями и поила турецким кофе) так приглянулась эта программа, что она решила ее купить и открыть собственный бизнес! Мне было стыдно брать деньги за программу, написанную всего за день, и я ее просто подарил.

Меня всегда интересовала Россия и ее история. У вас такие красивые музыка, искусство, литература… Такие красивые, чувствительные и интеллигентные люди… Но такие плохие правители и политические системы! Похоже, это российское проклятие. Меня всегда интересовал 1917 год: как большевики, которых было так мало, смогли захватить такую огромную власть. Но сейчас, я думаю, вам живется лучше. По крайней мере, я надеюсь!

ВопросМного русских слов помните?

Ответ «Повторите, пожалуйста. Я не понимаю. Где Москва? Где метро? Я не знаю. Я не русский, я программист. У мена компутер. Я не говорю по-русски. Вы говорите по-C++? Добрый ден. Очень спасибо! Пока!»*

ВопросХотите что-нибудь сказать нашим читателям напоследок?

ОтветЖизнь коротка. Не забудьте повеселиться!

Для MSDN Magazine/Русская Редакция
интервью подготовил Алексей Доля

Алексей Доля — независимый эксперт. Специализируется на программировании с использованием С, С++ и С#. С ним можно связаться по адресу TanaT@hotmail.ru.



* Пол так и сказал — прямо по-русски. — Прим. ред.

* Делай проще, дурачок (англ.). — Прим. ред.

* Название от самого Пола. — Прим. ред.

* Все слова даны в авторской орфографии, без правки. — Прим. ред.