Интервью с Сергеем Вакуленко

Сегодня у меня в гостях Сергей Вакуленко – программист, специалист по встраиваемым операционным системам и аппаратному обеспечению, в частности по различным микроконтроллерам. Ничто так не представляет человека, как его проекты. Проекты Сергея можно найти на его домашней странице. Недавно Сергей переехал в США и работает в MIPS. У нас есть шанс побеседовать с Сергеем.


Если на просьбу написать несколько строчек кода человек начинает вместо этого уходить в объяснения – дело тухлое. Рыбак не может не любить держать в руках удочку.


Спасибо, Сергей, за интервью.

Сергей, первый вопрос не будет оригинальным, но это не делает его менее интересным. Расскажите, как судьба привела вас в мир компьютеров и программирования? Поделитесь вашей историей.

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

Нельзя сказать, что на физтехе в то время как-то особенно хорошо учили программированию. Но там существовал кружок, неформальный клуб людей, очень увлеченных этим. Назывался “НСО” - научное студенческое общество. Немного, может быть человек пятнадцать на весь институт: от первокурсников до аспирантов. В среднем два-три человека с каждого курса. Народ регулярно собирался в общаге или в аудиториях, обсуждали всякие интересные вещи, старшекуры читали лекции для младших и т.п. Именно там я узнал про языки Лисп, Рефал, Си, систему Юникс. Участвовали мы и в студенческих олимпиадах по программированию. Физтех регулярно брал первое место в командном зачете.

Вы были одним из первых программистов, которые начали использовать UNIX в СССР. Что это был за UNIX и на каких машинах он работал?

Впервые я увидел живой Юникс в Курчатовском институте в 1986 году. В то время наша физтовская команда вместе с Курчатником занималась развитием системного софта для БЭСМ-6. В ИТМиВТ готовилась к выпуску новая машина этого ряда: Эльбрус-Б. Курчатовцы предложили не тащить на нее старую замшелую БЭСМовскую операционку, а сразу поставить Юникс. Нашей команде было предложено разработать систему программирования: Си-компилятор, ассемблер, загрузчик, библиотекарь и прочую мелочевку. Для меня потом это стало темой диплома.

В качестве инструментальной машины на первых порах использовалась СМ-1470. Довольно медленная машинка, со съемными 2.5-мегабайтными дисками. Но через год, в 1987 на физтехе появился учебный класс с машиной Labtam - классический юникс System V на процессоре NS32032. Это уже было кое-что. Я быстренько перенес туда экранный редактор RE из ОС Демос, к радости преподавателей, разобрался с русификацией терминалов (цветные графические, не хухры-мухры). И за это получил возможность использовать компьютер для своих разработок, в любое время кроме учебных занятий. Там и создавалась большая часть Си-компилятора для БЭСМ-6 и Эльбруса-Б.

В курчатнике тем временем народ перенес ОС Демос на “Электронику-85”, а также занялся разработкой версии Unix по заказу французской фирмы Utec - на процессоре Motorola 68000. Процесс шел успешно, система быстро стала стабильной, и одна из машинок Utec долгое время была нашей основной рабочей лошадкой. В первый раз я установил Emacs именно на нее.

Чуть позже, где-то в 1988 стали появляться персоналки с i286, на которых работал Xenix. Вполне юникс, но архитектура процессора ограничивала программные сегменты размером 64к. Мне в конце концов удалось собрать на нем gcc, но ценой перелопачивания приличной части кода. Зато с i386 уже никаких проблем не было. Главной системой сразу стал Interactive Unix, который Курчатник честно купил на Западе.

Юникс на БЭСМ-6 и Эльбрус-Б сделали в Новосибирском филиале ИТМиВТ. Мой компилятор пригодился. Но потом пришла волна писишек, и большие машины потеряли смысл.

У вас есть целый раздел в проектах - Ретрокомпьютинг. Видно, что вы целенаправленно собираете информацию о компьютерах прошлого и часто создаете их симуляторы, как программные, так и аппаратные. Что вас так привлекает в этом? В основной работе помогает?

Древние компьютеры - это же так интересно! :) Дело в том, что в них сохранилась и видна красота технических идей. Которую современные компьютеры, к сожалению, утеряли: стали слишком сложными и запутанными. Взляд назад помогает увидеть красоту в простоте, чего так не хватает в современных разработках. И в работе помогает, конечно: симуляторы и виртуальные машины сейчас самый передний фронт. Собственно, моя основная работа в MIPS - симуляторы.

Попробую задать провокационный вопрос. На моем личном опыте, особенно сейчас, когда сложность “железа” и программ увеличивается семимильными шагами с каждым днем, есть весьма четкое разделение между “железячниками” и программистами. Часто спецы по железу ужасно программируют, а программисты, в большинстве своем, не способны создавать “железо”. Но вы являетесь редким исключением. Как вы считаете – существует ли такая грань? Должен ли, например, спец по железу уметь написать алгоритм “min-cost-max-flow”, а программист спаять Спектрум?

Разделение существует, несомненно. Все известные мне серьезные инженеры четко делятся на электроников и программеров. Две разные наклонности: орудовать паяльником или возиться с формулами. Наверное, между ними заложено определенное противоречие. Структурное мышление и алгоритмическое. Строим или двигаемся. Но самое интересное происходит на стыке.

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

Все-таки, кто вы больше: программист или “железячник”? Когда есть выбор – каким типом проектов вам больше нравится заниматься?

Мне всегда было интересно происходящее на стыке. Паяльник был моим настольным инструментом лет с 12-ти. Простые схемы, от приемников до цветомузыки. Постоянно сканировал журнал Радио и другие в поисках интересных решений. Больше теоретически: нужные детали добыть было неоткуда. С литературой тоже напряг. В девятом классе моей настольной книжкой стал “Снобол-4”. Про другие языки тоже знал, конечно, но эта штука меня основательно увлекла. Все-таки я больше программист: алгоритмы и исходники мне ближе, чем паяльник и осциллограф. Вот чем симуляторы подкупают: вы получаете виртуальный хардвер по цене софтвера. :)

Можете назвать каких-нибудь известных программистов, которые для вас являются примером?

Да, конечно: главными учебниками для меня были идеи и исходные тексты великих мастеров. Деннис Ритчи и Кен Томпсон, Unix v6. Стивен Джонсон, компилятор pcc. Маршалл Кирк Маккузик, BSD Unix. Ричард Столлман, компилятор gcc. Эндрю Таненбаум, Minix. Это, так сказать, удаленные авторитеты, а еще коллеги и старшие товарищи, передавшие, так сказать, живой опыт: Сергей Рыжков, Алексей Руднев, Вадим Антонов, Сергей Аншуков, Валерий Бардин. Люди, создававшие ОС Демос и российский Интернет. Это были интереснейшие технологические задачки, с борьбой идей и бурной внутренней жизнью.

У вас в проектах есть несколько реализаций этюдов (язык ТРАК и игра Калах) из эпохальной (по крайне мере для меня) книги “Этюды для программистов” Чарльза Уэзерелла. Есть ли еще этюды, которые все еще хочется реализовать? Может взломать шифр Виженера?

Эту книжку я зачитал до дыр на первом-втором курсах физтеха. Она и сейчас стоит под рукой, на полке. Шифр Виженера взломал мой друг Леня Брухис. Он мне красочно рассказал всю историю в подробностях, что мое любопытство оказалось полностью удовлетворено. :) И задачку сжатия он тоже решил, так в NetBSD появилась утилита freeze.

Я сейчас перелистал - оказывается, остальные задачи я уже более-менее все решал, от бухгалтерии до компиляторов. Но по жизни появляется много других интересных идей, типа RetroBSD. Пока самая долгосрочная из них - создание RTOS для микроконтроллеров с защитой памяти, но без MMU.

Есть еще книги, про которые сильно повлияли на вас?

Snobol-4, как я уже говорил. Это был поворотный момент в осознании того, чем может быть компьютер. Интересно, что сейчас существует более современный язык того же автора - Icon.

“Операционная система Unix” Стива Баурна. После БЭСМ-6 и ЕС это был культурный шок: я не сразу поверил, что ОС может быть настолько простой и эффективной.

“Язык программирования Си” Кернигана и Ритчи. После Фортрана и Паскаля - ощущение свободы, как будто кандалы сняли.

“Структура и интерпретация компьютерных программ” Абельсона и Сассман - тогда еще в оригинале, ее только недавно перевели. Великая книга, с которой надо начинать всякое преподавание программирования.

Эндрю Таненбаум: “Операционные системы. Разработка и реализация” (Minix) и другие его книги. Это просто энциклопедия компьютерных знаний.

Когда появилась возможность заказывать книжки с amazon.com - примерно с 1996 года Сбербанк начал выдавать кредитки Visa - это было еще один глоток свободы. Сейчас уже много хороших переводных изданий появилось.

У вас еще еще одна страничка, где среди множества прочих интересных вещей, есть каталог “languages”, где вы пробуете различные языки. Как вы выбираете задачи, чтобы “пощупать” язык? И как вы, собственно, выбираете языки для изучения? Любимый язык есть?

Да, там я складываю небольшие примерчики, чтобы попробовать, “почувствовать” всякие интересные языки. Иногда попадается интересная задачка, из книжек или из ленты друзей в ЖЖ. Возникает идея сравнить ее на разных языках. Все языки интересны, а некоторые часто еще и имеют реальную практическую ценность. Например, D и Go - си-подобные компилирующие языки с автоматическим управлением памятью - удобнее чем Си++ и Java для большинства задач. Обдумываю применить Objective C для встроенных систем - он имеет прекрасную компонентную модель, достаточно поменять семантику runtime.

Языки, которыми обычно пользуюсь - Си и Питон. Избегаю и другим не рекомендую Си++ и Перл для реальных разработок, из чисто практических соображений. Посматриваю на Хаскель и Эрланг, как источник идей на будущее. Все языки интересны, и радует, что развитие не останавливается.

Уверен, вы слышали про Raspberry Pi. Можете прокомментировать как человек, знающий процесс изнутри – реально ли создать подобное устройство за те деньги, за которые его продают? Или это убыточный проект? Просто если это не так, почему такие проекты не являются массовыми?

Цена примерно соответствует себестоимости. В целом это хороший маркетинговый проект Broadcom и ARM, с пользой для социума. Они не массовые, потому что отсутствует коммерческая составляющая, и вокруг не образуется эко-система из фирм, развивающих и поддерживающих проект. В отличие от Ардуино, например.

На каком языке стоит начинать учиться программированию? Есть подходы, например, используя диалекты Лиспа, когда люди учатся программировать, практически не тратя времени на изучение самого языка (синтаксис Лиспа объясняется за пару минут).

Здесь у меня нет однозначного мнения. Я пробовал давать своим сыновьям и Лого, и варианты Лиспа, но лучший результат получается, все же, с Паскалем. Си и Джава хорошо идут позже, в студенческом возрасте. Для школьников, возможно, Питон был бы лучшим выбором.

Императивное и функциональное. В мире современного “железа” есть ли применение для функционального подхода? Оправдано ли оно, или это дань моде?

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

Разработка и тестирование. Расскажите, как вы тестируете (на работе или дома) “железячные” проекты? Применимо ли TDD (test driven development) в разработке аппаратуры? Как автоматизируется тестирование аппаратуры?

Всякие домашние проекты я обычно тестирую кое-как: хобби оно и есть хобби. Даже название придумал: тяп ляп инжиниринг лтд. Но на работе - совсем другое дело. Поработав в MIPS, теперь я понимаю, как надо вести разработку: это действительно test driven development, ровный процесс с выходом ожидаемого качества. Ценный опыт. Но очень высокие требования к составу и уровню команды.

Разработка системы на кристалле происходит примерно так. Архитектор разрабатывает внешнюю спецификацию и архитектуру. Это постоянный процесс: к концу разработки подробно известно, что происходит в каждом блоке системы на каждом такте. Инженеры-электроники собственно проектируют систему, создавая синтезируемый код на Верилоге. Группа тестирования дополняет его до полной системы, создавая RTL-симулятор. Отдельно программисты делают функциональный симулятор системы, исходя из внешней спецификации. Параллельно делаются подробные тесты для каждого элемента или функции системы, в соответствии с архитектурой. Тесты гоняются на RTL-симуляторе и на софтверном симуляторе, и проверяется их идентичность. Ошибки означают расхождение или в аппаратуре, или в архитектуре. Процесс разработки и тестирования итеративный, и когда он завершается, заказчик получает: описание архитектуры и ее программный симулятор, функционально полный хардвер и точный его симулятор, плюс огромный набор верификационных тестов. Хотите что-то доработать? Нет проблем: вносите изменения, прогоняйте тесты, чините сломавшиеся места. Очень технологично.

На чем вы работаете? Например дома. Судя по проектам, вы используете и Windows, и Linux, и Mac.

На работе Linux на столе и большинстве серверов, дома Mac-mini и Windows на виртуальной машине. Ноутбуки я постепенно перестал уважать, iPad закрыл все потребности. Раньше основной домашней машиной был Линукс, но приходилось при каждом серьезном обновлении системы решать проблемы с драйверами. То звук отвалится, то USB, то видео. С переходом на Мак жизнь упростилась.

Кстати, вы “социальный” программист? У вас есть G+ и Facebook, Твиттера вроде нет. Какие блоги вы читаете? И еще более интересно – сколько? Ведь время всегда ограничено, и как-то приходится выбирать между проектами и работой, и чтением новостей.

Лента друзей в ЖЖ и фейсбуке для меня главные источники информации о мире. G+ пока не прижился, еще менее удобный, чем ФБ. С утра, как проснусь, хватаю iPad и читаю все новости за ночь. :) И днем тоже частенько отвлекаюсь от работы на ЖЖ, в качестве перекура. Пишу и комментирую реже, когда находится что-то интересное. Еще активно использую Google Reader, собираю в кучу RSS-ленты разных газет, новостевых сайтов, elementy.ru, anekdot.ru, dirty.ru - сейчас практически все поддерживают эту фишку.

Если вы вам надо было бы нанять толкового программиста – какие бы вопросы вы задавали?

Какими своими проектами вы гордитесь? Какой проект вы бы хотели сделать? Ну и код полистать, конечно.

Мне приходилось интервьюировать программистов. Если на просьбу написать несколько строчек кода человек начинает вместо этого уходить в объяснения - дело тухлое. Рыбак не может не любить держать в руках удочку.

Сложно было найти работу в США? И в моральном, и техническом смысле? Много ли русско-говорящих в MIPS?

Нельзя сказать, что я ее целенаправленно искал, просто оказия подвернулась (и даже две сразу). Мне очень помог Юра Панчул, с которым мы знакомы еще со времен учебы на физтехе. Он меня давно звал, уже лет пятнадцать, но в этот раз звёзды правильно встали. Насколько я вижу, найти работу несложно - при определенном уровне квалификации. Здесь точно так же не хватает специалистов, как и в России. А поскольку MIPS начинает строить планы сотрудничества с российскими разработчиками, пополнение команды русскими инженерами приветствуется.

В моральном плане переезжать нет никаких проблем: все тебя поддерживают и одобряют. Труднее было пережить развал, останов и прекращение всех дел, в которые я был включен в Москве, но это происходило независимо и до решения о переезде. Как в известном анекдоте: говорят, у нас кризиса не будет. Как не будет, только что ведь уже не было?

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

Русскоговорящих в MIPS шесть человек, включая меня. Из них четверо из exUSSR и двое американцев, изучавших русский язык. Плюс много старых знакомых из Курчатника и ИТМиВТ, плюс новые знакомства - по родной речи скучать не приходится.

Ну и под занавес, вы сам выбрали профессию, или она таки сама выбрала вас?

Я выбрал, однозначно. Но мне очень повезло с людьми, с которыми сводила судьба. Вообще, в каждом человеке заложено зерно, которое стремится прорасти. Важно попасть на правильную почву. Тут мне грех жаловаться.

Сергей, спасибо за интервью. Ждем ваших новых проектов. Удачи.

Большое спасибо за интересные вопросы.

Всего хорошего,

Сергей


Ссылки на сайты Сергея

// Сергей Вакуленко, Александр Дёмин // Июнь 2012.


Disclaimer

Комментарии