Джефф стал известен еще в начале 90-х, когда написал книгу о том, как программировать Windows 3.1. Его книга «Programming Applications for Microsoft Windows» стала классикой, позже выпускалась как «Windows via C/C++» и выдержала несколько изданий.

С появлением .NET он написал «CLR via C#» — тоже получилась классика, тоже несколько изданий. В то время он был одним из основателей компании Wintellect и, формально не будучи частью Microsoft, оказался более свободен в оценках. Чем и заработал репутацию крупного независимого эксперта по Windows. Это человек-легенда уровня Чарльза Петцольда и Дона Бокса.
  У нас много разных вопросов к вам, и я начну с несколько менее относящихся к технической части. Правильно ли я понял, что вы одновременно работаете в Microsoft и Wintellect?
 Я был владельцем Wintellect в течение восемнадцати лет и вплоть до прошлой недели. Три года назад я пришёл в команду Azure в Microsoft, и с тех пор я не работаю в Wintellect. Каких-либо существенных связей с Wintellect у меня не осталось.
  Понял вас. Но я всё же хотел бы задать вам несколько вопросов относительно вашего опыта как создателя Wintellect. На наших конференциях собирается много программистов, которые хорошо знакомы с процессом разработки ПО, и некоторые из них, скорее всего, подумывают о том, чтобы создать свою компанию, но при этом с предпринимательской стороной дела они не знакомы. У вас же есть знания и в той, и в другой области, поэтому было бы интересно услышать ваш совет людям, собирающимся основать свою компанию.
  Вы однозначно не будете тратить всё своё время на разработку, и будете узнавать много нового о других сферах: о бизнесе, управлении деньгами, экономике, финансах, найме и увольнении. Вам нужно будет постоянно принимать довольно много решений и много взаимодействовать с людьми: с клиентами, партнёрами. Вам нужно будет находить варианты, устраивающие все стороны. Несмотря на всё это, в Wintellect мне удавалось проводить достаточно времени за разработкой, поскольку у нас работали люди, занимавшиеся в основном бизнесом. Тем не менее, мне также приходилось участвовать в предпринимательской стороне дела, и я это делал с радостью, поскольку это был интересный новый опыт. Тот факт, что мне не нужно было думать о битах и байтах круглые сутки, сделал меня, на мой взгляд, более цельной личностью. Я ни о чём не сожалею.
  Столкнулись ли вы с какими-либо неожиданными трудностями? Или, наоборот, оказались ли какие-либо вещи проще, чем вы ожидали?
  Наш путь однозначно был весьма неровным: иногда бизнес шёл хорошо, приходили новые клиенты. В другие периоды всё было несколько иначе. Когда мы сделали видеоподписку WintellectNOW, запустить её и добиться прибыльности оказалось значительно сложнее, чем мы думали. В итоге это получилось, и сейчас она достаточно успешна, но это заняло примерно на год больше, чем мы рассчитывали. Помимо этого, неожиданности случаются с работниками: некоторые замечательны, другие приносят компании вред, и эти вещи часто выясняются лишь позже — в повседневной работе они незаметны. В целом, наши ожидания часто обманывались и в хорошую, и в плохую сторону.
  Мне кажется, что многие разработчики не хотят создавать свою компанию, опасаясь, что, тратя время на бизнес, они перестанут ориентироваться в новейших технологиях. Было ли для вас сложно оставаться в курсе технической стороны дела?
  Это хороший вопрос. На мой взгляд, решение заключается в специализации. Когда Wintellect была основана, в ней было три технических партнёра. Каждый из нас занимался определённой областью. Никто из нас не смог бы быть экспертом во всех этих областях. Моей сферой было системное программирование— операционные системы, языки, рантаймы, многопоточность и тому подобное. Такая организация дел здорово экономит ресурсы. Если у некоторого языка новая версия выходит один раз в год, следить за этим несложно, и в тех сферах, которые мне важны — у меня это никогда не вызывало трудностей.
  Вы занимаетесь многими вещами, связанными с предпринимательской стороной дела: выступаете с докладами, пишете книги. Есть ли у вас ощущение, что эти различные формы деятельности мешают друг другу, или наоборот? Например, помогает ли написание книги с будущими докладами?
 Определённо помогает. Из всех занятий написание книг поглощает больше всего времени и нервов, заставляет уделять внимание языку, грамматике, организации материала, поиску правильных демонстраций. Это очень трудно, и написание каждой книги занимает, как правило, много месяцев. Но когда эта работа проделана, сделать слайды уже значительно проще, поскольку демонстрации уже есть, и надо просто дать выжимку материала. Далее, понимание внутреннего устройства различных систем позволяет мне давать правильные советы и выбирать нужную технологию для решения проблем при работе консультантом или в Microsoft в команде Azure Storage. В целом, все эти виды деятельности очень сильно помогают друг другу.
  Изменил ли ваш опыт написания книг то, как вы читаете книги? Уделяете ли вы больше внимания книгам из-за этого?
  Думаю, что изменил, и, мне кажется, я также уделяю больше внимания презентациям других докладчиков. Я смотрю, есть ли у докладчика навык подачи материала, насколько он знаком с материалом, повторяет ли он уже сказанное другими или действительно глубоко осмысляет проблему. На те же вещи я обращаю внимание и в книгах: хорошо ли написана книга, присутствует там ли глубокое техническое понимание вопроса, даются ли там прямые рекомендации или описывается внутреннее устройство системы. В своих книгах я стараюсь описать работу системы, отметить положительные и отрицательные стороны, показать способы откладки возможных проблем, описать требования к производительности. Мне кажется, что мои книги считаются относительно успешными благодаря тому, что я даю много контекста для каждой технологии, а не просто указываю: сделай так, сделай иначе. Я продолжаю изучать новые технологии, поэтому я читаю техническую литературу, смотрю видео с YouTube и из других источников, посещаю доклады. Мне недостаточно просто узнать, что некоторая технология работает так-то и так-то, мне необходимо как можно глубже вникнуть в неё, понять, в каких случаях она хороша, а в каких — нет, какие у неё есть подвохи.
  Коль скоро вы следите за книгами и докладами других авторов, можете ли порекомендовать чьи-либо работы или видео?
  В последнее время я изучаю Go и Python в связи с моей работой в Microsoft, для этой цели я читаю логи команды Go и спецификацию этого языка. Меня всегда удивляло, что разработчики не читают спецификацию языка, на котором они пишут — ведь в ней полностью изложено, как язык должен работать. Вместо этого люди читают книги. Я рекомендую всегда читать спецификацию. В остальном же я обычно смотрю видеозаписи выступлений на конференциях о различных технологиях. Здесь что-либо посоветовать сложно — некоторые докладчики лучше, другие хуже.
  Вам необязательно называть кого-то, кто однозначно лучше всех других — просто скажите, кто вам понравился.
  Мне нравятся докладчики, которые вдаются в детали вопроса. Меня всегда интересуют доклады об управлении памятью. Из-за управления памятью обычно возникает много проблем с производительностью, что для меня весьма важно. Любой доклад о работе сборщика мусора в языке, на котором я пишу, будет мне интересен: например, используется ли в нём сжатие или нет и тому подобное. В особенности хорошо, когда доклад говорит о вещах, информация о которых малодоступна — работа сборщика мусора обычно не описывается даже в спецификации. Есть паттерны, которые делают сборку мусора более эффективной. Всё это меня интересует.
 Давайте немного влезу в разговор со своими скучными техническими вопросами. Джеффри, вы же из Microsoft. Зачем вам Go и Python, если есть чудесный C#?
  В Microsoft я работаю в команде, занимающейся SDK и инструментами для Azure Storage. Мы разрабатываем SDK для Azure Storage на множестве различных языков — Go, .NET, Python, Java, NodeJS, PHP, Ruby, C, C++. Мы изменяем структуру наших SDK, и первая реализация была выполнена на Go. Это было критическое изменение, и мы не были уверены, как на него отреагируют наши клиенты. У нас на тот момент не было Go SDK, поэтому первый SDK был написан на Go, чтобы у наших клиентов что-нибудь не сломалось. Но, получив положительные отклики, мы перешли на Java, поскольку у нас были важные клиенты, которым была нужна асинхронная библиотека Java. В связи с этим я начал изучать RxJava и, в целом, больше работать с Java. Естественно, здесь мне сильно помог мой опыт с C#. Сейчас мы занимаемся NodeJS, поэтому в данный момент я изучаю его и TypeScript. Кроме того, мы начали портировать новый SDK на .NET — здесь для меня было меньше нового, поскольку я с ним уже знаком. Следующий на очереди у нас Python, поэтому я также изучаю его. В этом заключается работа нашей команды — мы пишем SDK для всех этих языков, поэтому моя деятельность не ограничивается одним языком.
 Хорошо, понял. На Amazon можно найти огромное количество ваших книг. Самая старая книга, что я нашёл там, «Windows via C/C++», датирована 2007 годом. Но вы ведь приобрели известность как автор книг еще в 90-х. Как же так?
  На самом деле, у меня есть книга, изданная ещё раньше, но она совсем старая, я не уверен, что она есть на Amazon. Она была написана для Windows 3.0, т.е. речь идёт о 1990 или 1991 годе. Но её купило совсем немного людей, и про неё её мало кто знает.
 Как и про Windows 3.0.
 Да, это было давно.
 Затем вы перешли на C# и стали писать книги про него, верно? Какое, на ваш взгляд, будущее у С++? Оно вообще есть? Стоит ли нам продолжать тянуть на себе багаж C++, или лучше переходить на Rust, Go или что-либо подобное?
  Я не думаю, что у нас когда-либо останется только один язык, который победит все остальные. Сила языков программирования в том, что каждый из них особенно хорошо выполняет определённый вид работы. Я примерно каждый месяц проверяю индексы популярности различных языков, и на сегодняшний день С и С++ остаются очень широкораспространёнными. Поскольку у нашей команды Azure в Microsoft много клиентов, которые пользуются С и С++, мы от этих языков уходить не собираемся. Более того, благодаря IOT, в последнее время наблюдается рост интереса к этим языкам. Речь идёт о небольших устройствах вроде термостата, контролирующего температуру в вашей квартире. У них мало памяти и слабые процессоры, и, помимо ассемблера, лучше всего для них подходят С и С++. Так что я думаю, что эти языки будут продолжать использоваться ещё очень долго. Коль скоро мы заговорили о Rust — у меня есть некоторый опыт с ним, и, на мой взгляд, в нём очень много весьма интересных идей. Это может быть своего рода безопасный С/С++. На мой взгляд, он весьма перспективен. Тем не менее, он показался мне довольно незрелым. Наша команда ещё не занималась им, но мы продолжаем за ним следить, и в будущем ситуация может поменяться.
  Я правильно понимаю, что у вас есть SDK для С и С++?
  Да, у нас есть C++ SDK для Azure Storage. У некоторых других команд тоже есть C/C++ SDK, но не у всех, и они ещё не решили, будут ли они создавать их в будущем.
  Как эволюционировала отрасль разработки Windows? Как я понимаю, вы там повидали всё на свете. Первое, что помню я сам — это Delphi. Потом набрал популярность С#, и пока что я не вижу никаких признаков падения С#/.NET, Java и тому подобного. Являются ли они, на ваш взгляд, последней ступенью эволюции императивного программирования? Какова вероятность того, что в ближайший год или десять лет появится нечто совершенно новое? Скажем, язык с поддержкой нейросетей?
  Я человек уже почтенного возраста, в особенности по сравнению с вами, и видел в нашей отрасли весьма многое. Я занимаюсь программированием где-то 45 лет. Существенное изменение за эти годы заключается в том, что операционная система стала менее важна. Я в основном занимался сервисами программного обеспечения для бэкенда и инструментами для командной строки. Раньше я значительно больше работал с GUI, и мои первые книги были посвящены именно этому: приложениям GUI с меню, listbox-ами, combobox-ами, обработкой событий от мыши, клавиш и так далее. В определённый момент у меня перестало хватать на это нервов, поскольку в этой области постоянно встреваешь в крайне ожесточённые споры о том, следует ли в некотором случае использовать listbox или combobox, должна ли ширина быть 100 или 1000 пикселей, каким должен быть цвет. У меня эти дискуссии вызывали отвращение, поэтому в итоге я перестал этим заниматься. Что касается языков, то, я думаю, у нас по-прежнему будет множество различных вариантов. Языки умирают очень долго, даже сегодня можно встретить людей, пишущих на Cobol, Fortran или крайне малоизвестных языках. Новые языки всё время будут возникать — в последнее время некоторую известность приобрела Julia, несколько дольше существует Clojure. Эти новые языки привлекают существенное внимание на некоторое время, после чего некоторые становятся успешными, а другие нет. С# прошёл впечатляющий путь, ему 15 лет, и он по-прежнему крайне распространён. На мой взгляд, команда .NET из Microsoft во многом вдохнула в него новую жизнь благодаря тому, что они создали .NET Core, который теперь работает на Linux. Если вы пишете на C#, ваши навыки применимы в огромном количестве различных сценариев. Я думаю, что интерес к С# не будет ослабевать ещё много лет.
  Не хочешь ли ты теперь написать «GNU/Linux Runtime via C#»?
  Да, хочу. На мой взгляд, для разработчиков сервисов GNU/Linux по многим причинам лучше подходит, чем Windows — за исключением некоторых случаев. Я считаю, что С# — прекрасный язык. Я недавно познакомился с Java: из соображений корректности могу только сказать, что после неё я стал значительно больше ценить С#. Мне очень нравятся типы-значения (value types) в С#. Мы недавно работали с отображением файла в память в Java, и не могли закрыть его напрямую, приходилось ждать сборки мусора. Некоторые решения в Java мне кажутся совершенно бессмысленными. На мой взгляд, С# и .NET сделаны значительно лучше.
  Года через три у нас, у джавистов, появятся типы-значения.
 Да, я знаю, и у вас есть какие-то дженерики…
  «Какие-то» — на мой взгляд, очень точное описание.
  Ну да, ваши дженерики немного странноватые. Но Java — безумно популярный язык, и люди его весьма продуктивно используют. Он, безусловно, очень важен. Но, на мой взгляд, в .NET некоторые аспекты выполнены лучше. Даже если вы добавите типы-значения, нам по-прежнему нужно будет предоставлять поддержку более старых версий Java. Так что реализовать эти новые возможности нельзя будет еще несколько лет. Но это и хорошо: все языки развиваются, в них появляются новые возможности. Java, .NET, C# — все они будут жить ещё очень долго, в особенности с учётом некоторых последних изменений, таких, как .NET Core. Так что, на мой взгляд, C# для GNU/Linux — это замечательное сочетание для людей, пишущих сервисы. 
  Но для взаимодействия с бэкендом нужен UI. Когда-то у нас были только текстовые консоли, а потом появился UI, и это сделало софт значительно более функциональным. А сегодня есть Electron и другие основанные на JavaScript движки, и на них любой школьник может написать интерфейс. Не опасаетесь ли вы, что в будущем вообще всё будет писаться на JavaScript?
  Нет, я так не думаю. Во-первых, это вопрос производительности: в JavaScript она не может сравниться с C, C++, Go, или даже C# и Java. Далее, я не могу представить себе написание масштабного проекта без типобезопасности на фазе компиляции. Когда я попал в мир типобезопасных языков, то влюбился в него с первого взгляда. JavaScript сам по себе не предоставляет типобезопасности, поэтому я не стал бы использовать его в крупном проекте. А вот TypeScript стал бы, и наш новый SDK мы пишем на TypeScript. Он представляет из себя значительный шаг вперёд по сравнению с обычным JavaScript. Но я не думаю, что весь мир когда-либо станет использовать только один язык для какой-либо одной цели. В этом попросту нет смысла. Даже если мы говорим об IOT, то среда для запуска JavaScript требует достаточно много ресурсов, и многие устройства их попросту не могут предоставить.
  Хорошо, с JavaScript проблем нет. А где они есть? В чём заключаются главные проблемы для вас лично и для отрасли в целом?
  Я не уверен, что они связаны с языками или операционными системами. Операционные системы на данный момент, в сущности, стали обычными бытовыми вещами. Они используются для отправки электронных сообщений и выхода в интернет. Для большинства людей не имеет большого значения, используют ли они Windows, Mac или Linux. Языки, которые мы сегодня используем — уже достаточно мощные. Большинство языков, по сути, просто перемещают данные из точки А в точку B. У вас есть коллекция, вы её просматриваете, фильтруете содержимое — такого рода действия может выполнять каждый язык. Далее, нам необходимо, чтобы машины коммуницировали друг с другом. Здесь стандартом является TCP, широко используется HTTP, но есть и другие протоколы. Все эти технологии замечательно работают, тем не менее производительность можно улучшать и дальше. На мой взгляд, наиболее серьёзные трудности сегодня связаны с созданием сервисов. Разработчики развёртывают сервисы в облачных средах, и им необходимо, чтобы эти среды обладали гибкостью и возможностью масштабировать приложения. Я уже упоминал наш сайт с подпиской на видео, который стал успешным значительно позже, чем мы ожидали. Когда мы его писали, мы не знали, будет ли у нас десять клиентов, сотня, тысяча или миллион. Поэтому я с самого начала проектировал его, рассчитывая на масштабирование, что заставило на первых этапах много работать над архитектурой и продумывать паттерны использования, а также возможные будущие изменения в системе. В общем, я считаю, что наибольшие сложности сегодня связаны с созданием масштабируемых, гибких и надёжных облачных сервисов. Именно этим мы занимается в Microsoft в команде Azure, и, судя по нашим разговорам с клиентами, именно это создаёт больше всего трудностей.
  И Azure предлагает решение для этих проблем? Или нет?
  Да я не сказал бы. Никакой облачный провайдер не является решением для этих трудностей. Провайдер только предоставляет инфраструктуру, железо, на котором будет работать ваш код. Он также может предоставлять некоторые сервисы, как, например, Azure Storage (команда, в которой я работаю) или CosmosDB, или сервисы-конкуренты от Amazon — всё это может существенно упростить вам жизнь. Может помочь управлять состоянием, предоставлять надежную базу данных. Но так или иначе многие проблемы вам необходимо будет решать самим. Например, если у нас запущено десять экземпляров первой версии приложения, как обновить их до второй версии, не останавливая их работу и продолжая обрабатывать запросы? Для этого существует несколько различных паттернов. Azure может помочь реализовать некоторые из них, но не все. И нам нужно самим правильно написать код, чтобы первая и вторая версии приложения были запущены параллельно и могли коммуницировать друг с другом, пока не произойдет переход на вторую версию. Облачные провайдеры упрощают некоторые из этих задач, но для их клиентов по-прежнему остаётся много работы, которую необходимо выполнить самостоятельно, чтобы обеспечить требуемую гибкость.
 Давайте теперь поговорим о людях. На сайте Wintellect есть эпиграф, большой такой заголовище: «We don't just build software. We build developers.». Можете поделиться, как создавать современных разработчиков?
  В Wintellect есть три основных направления бизнеса. Мы консультируем другие компании, просматриваем их архитектуры и обучаем их разработчиков. У нас есть специальные занятия, на которых рассказывается, как работает управление памятью в Windows, сборка мусора в .NET. В целом, у нас подход похожий на тот, который я использую в своей книге: мы демонстрируем некоторую технологию, показываем, на что она способна. И таким образом мы улучшаем навыки других разработчиков. В нашей команде в Microsoft мы нанимаем довольно много людей, только что закончивших колледж. Их опыт работы — год или два, мой — десятилетия. Каждый четверг в час дня я делаю часовое занятие для молодых разработчиков из нашей команды. Мы выбираем определённую тему и обсуждаем её. Прошлая тема была сборка мусора, до этого мы говорили о тредах, асинхронных операциях ввода/вывода и их преимуществах. Я пытаюсь развить их как разработчиков, рассказывая об истории программирования, о том, какие вещи более важны, а какие менее и так далее. Благодаря этому, я надеюсь, их код будет более высокого качества, что улучшит качество обслуживания наших клиентов. Я периодически повторяю фразу: что на входе, то и на выходе («you get out what you put in»). Если на входе я трачу больше усилий, обучая наших сотрудников, то на выходе я получаю более высокое качество работы, что в целом улучшает положение компании. Таким образом, я существенно заинтересован в будущем этих людей.
  Вы сказали, что находите время лично обсуждать с вашими сотрудниками сборку мусора, управление памятью и тому подобные вещи. В дополнение к этому вы — основатель компании, известный автор, докладчик, хакер низкоуровневых систем и корпоративный разработчик. Как вы успеваете всё это делать? Да ещё и одновременно? Обычно хакеры мирового уровня и люди, выступающие на публике, обладают психологическими характеристиками, находящимися на разных концах спектра. Это различие на уровне психологии, на уровне работы коры головного мозга. Есть ли у вас какие-то специальные трюки? Или может быть, вы мутант из «Людей Икс»? Почему спрашиваю: я тоже пытаюсь одновременно и программировать, и писать статьи, и читать доклады — и всё это дико сложно.
  Спасибо за добрые слова. Но надо сказать, что далеко не всё это у меня одинаково хорошо получается — что-то лучше, что-то хуже. Что-то — намного хуже. И я не занимаюсь всем этим одновременно. Если меня и отличает что-либо от других людей, то это высокий уровень самодисциплины. Это в особенности касается написания книг. Я просыпаюсь утром, одеваюсь, иду в свой офис, часами сижу один в комнате и печатаю без конца, проверяю различные сценарии и так далее. Потом я обедаю, возвращаюсь в эту комнату и снова работаю, никак не общаясь с другими людьми. Когда работаешь в команде, кто-то всегда продолжает работать над проектом, когда у тебя перерыв. А когда ты пишешь книгу, вся ответственность на тебе одном. Наличие самодисциплины позволяет мне этим заниматься. Возможно, это наиболее важное качество, отличающее меня от некоторых других знакомых мне людей.
  Значит, у вас очень жёсткий график, в котором расписано, чем вы занимаетесь в каждый определённый час дня?
  Да, я ставлю себе цели. Например, с утра я говорю себе: сегодня мне нужно закончить седьмую главу. После чего я сажусь и работаю над ней. Иногда по разным причинам этого достичь не удаётся. В этом случае на следующее утро я себе говорю: ну сегодня-то мне точно нужно закончить седьмую главу. В конечном итоге это удаётся сделать, но в процессе я постоянно понукаю себя, ставя себе цели, постоянно ограничиваю себя по времени. Если же выполнить её не удаётся, я пожимаю плечами и ставлю себе новую цель на следующий день. Благодаря этому я очень упорен в работе.
 Последний вопрос. Насколько я знаю, у вас есть права пилота?
  Да, для вертолёта и для самолёта.
 То есть у вас где-то в аэропорту стоит условно «свой» самолёт, который можно взять и полетать?
 Да. Но я больше не летаю. Много лет назад, непосредственно после колледжа, когда я ещё был холост и у меня не было детей, я экспериментировал и пробовал много различных хобби. Один мой знакомый предложил вместе попробовать научиться летать на самолете. Я согласился, мы отправились в аэропорт и нашли инструктора. Попробовав, я решил, что это прекраснейшее развлечение, стал посещать занятия регулярно и в итоге получил права. Вместе с моим знакомым мы приходили в аэропорт, садились в самолёт, летали какое-то время и приземлялись в том же месте, с которого взлетели. Но в самолёте невозможно остановиться и как следует что-либо рассмотреть. А в вертолёте это сделать можно. Поэтому я решил получить права на вертолёт. Вообще говоря, на вертолёте летать значительно интереснее, чем на самолёте. Не обижайтесь, но если вы не согласны с этим — вы не правы. Потом ситуация изменилась, потому что это дорогое хобби, которое требует много времени и постоянной тренировки. Если не пользоваться навыком, он быстро ржавеет. Когда я женился и у меня появились дети, стал также важен тот факт, что в полёте всегда есть определённый риск. Затем был основан Wintellect, и я ушёл в бизнес. Иногда, чтобы в жизни появилось что-то новое, старому нужно уйти. Такова жизнь, и это хорошо.
 Последний-последний вопрос. Есть какое-нибудь пожелание для наших читателей на Хабре?
  Я был влюблён в нашу отрасль последние 45 лет, я не могу представить себе какого-либо другого занятия для себя. Технология постоянно изменяется, всё время есть что-то новое, чему нужно учиться. Это прекрасный выбор карьеры. Я постоянно встречаю здесь замечательных людей, и я рад считать их своими друзьями. Даже это интервью принесло мне массу положительных эмоций несмотря на то, что мы с вами только познакомились. Оглядываясь на прожитую мной жизнь, я не могу представить себе какого-либо другого пути. Я думаю, мы живём в замечательное время, и делаем прекрасное дело. Моё пожелание — наслаждайтесь этим! Скорее всего, это надолго.
 Деврел Axiom JDK, продюсер в Failover Bar