Тридцать лет назад, 11 ноября 1996 года, бразильский студент Рафаэль Сагула выложил в сеть исходники своей крошечной утилиты для скачивания по HTTP. Это был httpget 0.1: чуть больше ста строк на C, почти без проверок ошибок и с минимумом возможностей.

httpget

Я наткнулся на исходники httpget через несколько дней после того, как Рафаэль их выложил. Как работает HTTP, я тогда не знал. Знал, что «язык», на котором программа просит у сервера ресурс, называется протоколом, и не намного больше. Ни про httpget, ни про Рафаэля я раньше не слышал. Скорее всего, нашёл утилиту через AltaVista: Google ещё не было. Подробностей уже не помню.

Код был настолько простым, что основы протокола читались из него сразу. Думаю, так же потом рассуждали бесчисленные люди, которые впервые видели HTTP изнутри. Гораздо позже я понял, что эта простота обманчива, но тогда я был скорее восхищён и увлечён. Сетевое программирование мне и до того нравилось, а HTTP сразу показался понятным.

В httpget 0.1 почти не было проверок ошибок, и работала утилита с голыми IPv4-адресами: ни имён хостов, ни URL.

Я был наивным и увлечённым разработчиком с идеями открытого кода (хотя сам термин Open Source появится только через 15–16 месяцев). Исправил несколько ошибок, на которые сразу наткнулся, и добавил резолвинг имён. Делал диффы и отправлял патчи Рафаэлю по почте: так тогда и обменивались изменениями в коде. Про системы контроля версий RCS и CVS я знал, но пользовался ими от случая к случаю. Полностью проект curl перешёл на CVS только в сентябре 1999 года, а на git мы переехали в 2010-м.

Интернет в 1996 году

В Швеции, где я тогда жил и живу до сих пор, обычный домашний интернет в 1996 году давал в среднем 30 кбит/с. Тридцать килобит в секунду. Модемы стандарта V.90 на 56 килобит ещё не появились. Простые смертные выходили в сеть через модем по единственной телефонной линии. Сегодня средняя скорость подключения в Швеции — 200 мегабит в секунду.

Тридцать лет назад во всём мире было всего 36 миллионов пользователей интернета и 250 тысяч сайтов. Сегодня пользователей 6–7 миллиардов, сайтов — миллиард.

Протоколы были проще. Шифрование вроде SSL уже существовало, но им почти не пользовались, только на редких сайтах.

Компьютеры в 1996 году

В ноябре 1996-го моим основным домашним компьютером всё ещё была Amiga 3000 с процессором 68030 на 25 МГц. В начале 1997-го я пересел на машину быстрее и современнее: Intel Pentium 120 МГц. На ней стояла Windows 95, и главным её делом был X-сервер, чтобы из дома подключаться к рабочим компьютерам и открывать терминалы X11. Первые версии httpget я собирал удалённо на SunOS, Solaris и Dell Unix: просто они стояли у нас на работе.

Linux я впервые поставил и попробовал на работе в 1997 году. Поднял наши первые публичные веб-серверы и, разумеется, проверил, что curl на них работает. Дома на Linux перешёл только в 2000-м, заодно обновившись до Pentium III на 733 МГц.

Что мне нужно было скачивать

В 1996 году я работал программистом встраиваемых систем и писал на C под Unix в небольшой шведской компании Frontec Railway Systems. Тогда же я открыл для себя IRC и полюбил его, а в свободное время мы с друзьями писали IRC-бота по имени Dancer. То есть в свободное время я писал TCP-клиент на C.

Бот понемногу обрастал возможностями, и мне захотелось сделать через его механизм расширений конвертер валют для участников канала (так в IRC называется чат-комната). Канал у нас был международный, цены обсуждали постоянно, и бот, который быстро скажет, сколько долларов в сотне немецких марок, был бы полезен.

Курсы нужно было обновлять примерно раз в день, чтобы они оставались достаточно точными. Я нашёл HTTP-страницу со списком курсов и утилиту httpget, чтобы её скачивать, и бот начал выдавать актуальные пересчёты. Всё работало.

Как я стал программистом

Компьютеры и программирование я открыл подростком на Commodore 64 и сразу пропал. Сначала Бейсик, потом довольно быстро ассемблер 6510. В конце 1980-х у нас с друзьями были демогруппы: под названием Horizon мы писали на ассемблере демки (и пробовали писать игры). Тогда же появилась привычка тратить свободное время на программирование.

В начале 1990-х я пересел на Amiga, начал писать текстовый редактор и устроился на первую работу, в IBM, где впервые плотно занялся C и Unix. С друзьями мы держали BBS (The Holy Grail), а потом вдвоём с братом Бьорном написали для неё собственный софт. На Amiga я выучил ассемблер Motorola 68000, на PC писал на ассемблере 8086.

В университете я не учился. Первую работу с компьютерами, в IBM, получил в двадцать лет. Думал, что в университет пойду позже, но так и не пошёл. Остаюсь без образования.

В начале 1990-х я открыл для себя и интернет, и мир свободно доступного исходного кода, и на этом пропал окончательно.

Мейнтейнер

Возиться с моими патчами к httpget Рафаэлю не очень хотелось. Думаю, он просто выложил код, не собираясь дальше ничего с ним делать. Мейнтейнером httpget стал я и продолжал его доводить. Главным моим проектом оставался IRC-бот Dancer, а httpget был побочным: лишь бы конвертер валют продолжал работать.

Gopher и новое имя

В какой-то момент я нашёл gopher-сайт, где курсов валют было гораздо больше, чем на HTTP-странице, которую я парсил. Конечно, пришлось добавить в утилиту и gopher. После этого она умела не только HTTP, и имя перестало ей подходить. Утилита стала называться urlget. Потом нашёлся третий список курсов, по FTP, и да, поддержку FTP я тоже добавил.

Сообщество

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

Это было время множества разновидностей Unix. Я хотел, чтобы утилитой могли пользоваться как можно шире, и понимал, что без помощи друзей не проверю сборку и работу на всех этих системах.

Загрузка на сервер и имя curl

В начале 1998 года я добавил в urlget отправку данных (загрузку по FTP и HTTP POST) и снова понял, что имя не подходит. Я решил, что в новом имени должно быть слово URL, его должно быть легко произнести по-английски и легко (и быстро) набрать на клавиатуре. Так появился cURL.

Буква «c» в начале могла означать client, но мне нравилось и то, что имя читается как see URL: утилита показывает ресурс по адресу, и вы его видите (в терминале). Придумывать имена трудно.

curl 4.0 вышел 20 марта 1998 года. К тому моменту он вырос до 3300 строк кода, у него было 24 параметра командной строки и три протокола.

Смена приоритетов

Постепенно IRC-бот и конвертер валют мне надоели, а curl остался. Им пользовались, я получал отзывы, он становился лучше.

Я запускал другие открытые проекты и участвовал в чужих, но главным моим детищем и делом оставался curl.

Библиотека

Что такое библиотека функций, которая даёт полезные возможности другим программам, я узнал ещё во времена Amiga. Например, скриптовый язык FPL для нашего текстового редактора FrexxEd я написал как библиотеку, и потом мы использовали этот язык и в нашем софте для BBS FrexxLink (он работал на OS/2), и в IRC-боте Dancer.

Библиотека — это следующий уровень: открыт не только исходный код, но и сами возможности, причём в удобном виде.

Мысль превратить curl в библиотеку сидела у меня в голове с самого начала. Летом 2000 года я переработал внутренности, и в августе мы выпустили первую libcurl. Вдруг кому-то ещё понадобится передавать данные по сети в своих сервисах или утилитах? Оказалось, понадобилось.

Одним из первых libcurl взял PHP: там почти сразу решили сделать её стандартным механизмом сетевых передач. Мы стали ключевым компонентом и частью их успеха, а это принесло пользователей, тестирование, отчёты об ошибках и запросы новых функций. Библиотека от этого стала надёжной.

Язык

curl — дитя 1990-х. Если тогда нужна была программа, которая легко собирается и работает на большинстве операционных систем и процессорных архитектур, выбора языков почти не было. Можно было, наверное, взять C++, но он мне никогда не нравился — и сейчас не нравится. К тому же я твёрдо верю в непрерывные улучшения и итерации, а не в переписывание. curl ни разу не переписывали, и, если будет по-моему, никогда не перепишут. Но внутренности мы регулярно рефакторим и перестраиваем под меняющийся мир.

Рост

Я хотел, чтобы curl мог использовать кто угодно на любой машине, и с самого начала проектировал и писал его под это: переносимый код, либеральная лицензия.

Поначалу мы почти всё делали неправильно, но учились, приспосабливались, пробовали снова, повторяли цикл и выпускали релиз за релизом. Постепенно стали делать лучше. В каждом релизе — куча исправленных ошибок и часто пара новых функций. Я продолжал тратить на curl свободное время. Каждый день, каждую неделю, каждый год. Если дать чему-то достаточно времени, может вырасти что-то большое.

Жизнь

Первые двадцать три года этого пути curl был для меня только хобби. Пока шла работа над curl, шла и жизнь. Я много раз менял работу. Женился, купил дом, у меня родились двое детей, и я видел, как они выросли в замечательных взрослых. Где-то по дороге мне удалось превратить хобби в основную работу. Живу мечтой.

curl — моя жизнь. Моя жизнь — это curl. Меня сотни раз приглашали выступать перед аудиторией в дюжине стран. За работу над открытым кодом я получил несколько наград и даже золотые медали из рук королевских особ.

Время

Конечной цели у меня с curl нет и никогда не было. Я просто хочу, чтобы он передавал данные по сети наилучшим образом: быстро, безопасно, по правильным протоколам и оптимально. Спешить некуда. Это бесконечное движение вперёд: шлифовать и подтягивать каждый болт, какой найдётся.

Тридцать лет пролетели, а темп разработки всё ещё высокий. Мы регулярно реализуем новые возможности протоколов раньше всех. У нас ведущие реализации многих сетевых решений. Наш код без лишнего шума держит на себе огромную часть интернет-инфраструктуры мира.

Мотивация

Мне до сих пор нравится создавать. Писать код, который делает то, чего раньше не было, и, может быть, ещё больше — добиваться, чтобы программа делала то, что пользователям нужно и нравится. Исправлять ошибки мне нравится отчасти поэтому, но ещё я люблю головоломки и сложную отладку. Проектировать архитектуру, придумывать API и решать, как дать мощные сетевые возможности миллиардам устройств — вот из-за чего мне каждое утро хочется снова сесть за работу. Даже спустя тридцать лет.

Инженерия

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

Я хочу, чтобы curl лидировал в сетевых передачах, в реализациях протоколов и во всём, что касается проекта. Хочу, чтобы мы были образцовым открытым проектом и вели каждую мелочь почти избыточно прозрачно и прогрессивно. curl должен быть одним из главных претендентов на звание самого безопасного программного компонента, какой можно найти. Проект должен быть дружелюбным и открытым для новичков, и пользователей, и разработчиков. И ни один другой проект не должен сравниться с нами по объёму, точности и полноте документации. Не говоря уже о том, что мы никогда не ломаем API и ABI. Приложения и скрипты должны продолжать работать без изменений, даже когда обновляют curl. До скончания веков.

Я твёрдо верю в итерации и в то, что переписывать нельзя. Мы исправляем, рефакторим и чистим, но переписать проект на другом языке или даже на том же самом — исключено.

Проще говоря: так и выглядит правильная программная инженерия.

IETF

curl говорит больше чем на двух дюжинах протоколов (если считать по схемам URL), но всегда был известен прежде всего по HTTP(S), и, думаю, больше всего труда мы вложили именно в HTTP-движок. Мы знаем, что многие отлаживают curl-ом HTTP вообще и свои серверные реализации в частности. Поддержку и HTTP/2, и HTTP/3 мы внедрили одними из первых. Нам часто говорят, что наш способ общаться по HTTP и наш исходный код используют как образец того, как надо делать. Это честь и огромная ответственность, и мы относимся к ней серьёзно.

Сначала я разобрался в HTTP по исходникам httpget, а потом, конечно, изучал RFC с подробностями. В конце 2000-х я узнал о рабочей группе HTTPbis и подписался на рассылку, где готовилось обновление спецификации HTTP. В 2009 году я впервые попал на встречу IETF — она проходила в Стокгольме. Там я впервые познакомился с авторами HTTP RFC и ключевыми людьми: Роем, Ларри, Марком, Джулианом и другими. Все они прекрасные люди, и я почувствовал, что, если буду больше общаться в HTTP-кругах IETF, смогу сделать curl лучше. А ещё хотелось вернуть сообществу свой опыт и взгляд и, может быть, хоть чуть-чуть улучшить мир.

Позже это сообщество запустило серию HTTP Workshop, и я был на каждом из них. Общение с главными разработчиками реализаций HTTP в мире радует, многому учит и помогает быть скромнее. Думаю, от этих связей выигрывают и сам HTTP, и все причастные реализации.

Независимость

curl — не юридическое лицо и вообще никакая не формальная организация. Это группа слабо связанных людей в интернете с общей целью, несколько почтовых рассылок, сайт и несколько git-репозиториев. curl не стоит ни под чьим зонтиком, не входит ни в какую большую организацию и не принадлежит никакой компании и не контролируется ею. Наверное, это настолько свободный и независимый проект, насколько вообще может быть программный проект. Я считаю, что для curl это отличная позиция: она даёт нам максимум гибкости и контроля над собственной судьбой.

Цифры

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

Где он работает

Для меня, как и для многих, самое крутое место, где использовался curl, — это, пожалуй, Марс. NASA подтвердило, что curl помогал в миссии посадки на Марс, хотя где и для чего именно, не говорят.

Меня до смешного часто спрашивают: «Где ты видел curl в самом странном месте?» Я давно перестал удивляться тому, какие устройства подключены к интернету и, значит, где работает curl. Лампочки, посудомойки, кондиционеры, тепловые насосы, автомобили, принтеры, блендеры, духовки, игрушечные роботы, дроны, оружие, мотоциклы, медицинские приборы, холодильники, саундбары и эспрессо-машины. И конечно, все «традиционные» места, где curl и так ожидаешь увидеть: игры, серверы, автомобили, принтеры, телевизоры, часы, планшеты, игровые приставки, Bluetooth-колонки, роутеры, мобильные приложения и их операционные системы.

Современное общество стремится рано или поздно подключить к сети всё, а когда что-то подключено, для передачи данных можно использовать curl и libcurl.

Великодушный пожизненный диктатор

Benevolent Dictator For Life, BDFL. Так часто называют механизм управления во многих открытых проектах. По сути, у корабля один капитан. Тот, кто задаёт направление, может объявлять, как в проекте устроено, и твёрдо говорит «да» и «нет». К добру или к худу, я остаюсь BDFL проекта curl. Я не устаю повторять, что curl — не моноспектакль и никогда не был цирком одного актёра. Код в него внесли буквально тысячи людей, и каждый год приходят сотни новых авторов. Капитан, может, и я, но корабль больше определённого размера без большой команды не управляется, и curl не исключение.

Вполне возможно, я ещё долго останусь BDFL: я люблю эту роль и не знаю, как иначе жить и вести проект curl. Плана преемственности нет, и я против него. Нет ни наследника, ни вице-BDFL, готового принять дела. Вместо этого мы документируем всё до мелочей, чтобы секретов не было и формальная передача дел не понадобилась (кроме нескольких паролей). Если завтра меня собьёт грузовик, вы разберётесь и продолжите. Я вам не нужен.

Последствия

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

Гораздо мрачнее другая сторона следов, которые curl оставляет в продуктах: когда вредоносные инструменты, сервисы и атакующие пользуются программами, которые можно связать со мной и моим адресом. Меня не раз обвиняли в атаках и во «взломе» людей и компаний. Мне не раз угрожали смертью, и я сильно подозреваю, что мои проблемы с визой в США начались из-за чего-то в этом роде.

Всё бесплатно

Я придерживаюсь этики и духа открытого кода. Это основа моих убеждений, и я уверен, что так лучше всего создавать софт, на котором строится общество. Я изо всех сил держусь либеральной лицензии curl, потому что люблю саму идею. Но продать такое непросто: отдать всё бесплатно, а потом пытаться найти того, кто за это заплатит. Думаю, честно будет сказать: если бы я хотел заработать побольше денег, надо было разыгрывать эту партию иначе. Это была бы другая жизнь. Не моя.

Гордость

Конечно, я безмерно горжусь тем, чего мы добились. Маленькая игрушка 1996 года положила начало пути, который привёл к созданию и поддержке одного из краеугольных камней современной интернет-инфраструктуры. Мы пришли сюда не разговорами, не маркетингом и не тем, что кого-то обманом заставили взять наш код. Мы покорили мир тем, что десятилетиями стабильно выпускали код высшего качества. curl работает во всех этих устройствах и сервисах всех этих компаний, потому что для них это правильный выбор: его выбирают за открытость, надёжность и скорость — и за то, что он, скорее всего, никуда не денется. Все могут рассчитывать, что мы и дальше будем выпускать обновления так же надёжно и с минимумом хлопот. Во веки веков.

Будущее

О будущем можно думать в разных измерениях. Будущее открытого кода. Будущее curl. Будущее сетевых передач. Будущее языка C и моё личное будущее. Как минимум.

Не думаю, что угадываю будущее лучше других людей. У меня никогда это не получалось, и я особо не пытался. Я всегда смотрю только на ближайшие месяцы и быстро подстраиваюсь, когда обстоятельства меняются.

Я считаю, что открытый код — надёжный способ создавать базовый софт, и сейчас, и в будущем. Проблема финансирования останется, и слишком много проектов живут и умирают вместе со своим единственным мейнтейнером. Но общие открытые строительные блоки просто необходимы, чтобы быстро разрабатывать, делать надёжные компоненты и выпускать продукты и сервисы с той скоростью, которой мы, похоже, хотим. Я не верю, что ИИ убьёт открытый код.

Думаю, у curl впереди ещё много лет службы. Прежде всего потому, что это решение, которому доверяют, и по длине проверенной истории с ним никто и близко не сравнится. Во-вторых, он работает на всех платформах, как никакая альтернатива. Не исключаю, что когда-нибудь его заменит что-то другое, когда проекты на C начнут постепенно выводить из оборота. (Если это вообще случится.)

Сама передача данных по сети, похоже, — идея фундаментальная и в похожем виде проживёт ещё долго. Протоколы будут развиваться, меняться и обновляться, но схема «клиент — сервер — протокол» выглядит прочной и, скорее всего, останется надолго.

Сам я буду работать над curl и сетевыми передачами, пока мне интересно и пока это вызов. Через несколько недель мне исполнится 56. Надеюсь посвятить этому ещё несколько десятилетий.

Спасибо

Спасибо маме и папе за понимание и поддержку, когда я подростком с головой ушёл в мир компьютеров и программирования. Спасибо Бьорну и Челлю за все отличные времена и за то, как весело мы вместе учились разработке и делали первые неуверенные шаги как программисты. Спасибо команде Horizon за веселье, за все демки и копи-пати, которые мы устраивали и на которые ездили. Спасибо клубу Huddinge Vi Unga, которому принадлежала машина и который несколько лет оплачивал две телефонные линии для нашей BBS, пока мы открывали для себя FidoNet и целый мир людей и общения. Спасибо Юнасу, который устроил меня на первую работу в IBM, когда у меня не было никакого опыта. Спасибо Бьёрну, вместе с которым мы сделали бота Dancer, и людям из IRC-чата #amiga в EFnet, а потом в IRCnet за поддержку. Спасибо моим начальникам во Frontec середины 1990-х, которые разрешали мне в свободное время программировать на их Unix-машинах (хотя, наверное, не знали, насколько много я этим занимался). Спасибо всем первым пользователям curl, которые меня подталкивали, рано добавили его во все важные дистрибутивы Linux и показали, что у этой штуки есть будущее. Спасибо Анье, моей жене, за то, что терпит, сколько времени я провожу за компьютером, и мои рассуждения о какой-нибудь засевшей в голове мелочи из проекта curl, которыми я иногда утомляю её до смерти. Спасибо моим детям Агнес и Рексу за то, что они свет моей жизни, за то, что они замечательные, и за то, что их не особо впечатляет и интересует, чем я занимаюсь. Живите своей жизнью. Спасибо всем, кто когда-либо помогал проекту curl в любой роли. Особенно — Стефану, Виктору, Джеймсу, Виктору, Дэну, Джею, Даниэлю и Максу, которые уже целую вечность в основной команде мейнтейнеров. Спасибо Бьорну, Челлю и Линусу из Haxx за то, что они потрясающие друзья и всегда поддерживали меня и curl, когда это было нужно, — и, конечно, за побочное приключение с Rockbox. Спасибо Ларри из wolfSSL, который поверил в меня и в curl настолько, что не моргнув глазом позволил мне заниматься curl на полную ставку. Спасибо всем спонсорам и донорам curl и всем замечательным платящим клиентам поддержки curl: вместе вы и даёте мне возможность делать то, что я делаю. Спасибо всем, кто приглашал меня на конференции и мероприятия выступать и знакомиться с людьми. Спасибо Патрику, который выдвинул меня на премию Польхема, которую я затем получил в виде золотой медали. Спасибо Михаэлю за выдвижение на золотую медаль IVA. Спасибо всем, чьи имена я забыл здесь упомянуть.

Спасибо всем, кто пользуется curl и продолжает участвовать в его разработке.

Разве 25-летие было не только что?

Было. У нас два дня рождения: httpget появился в ноябре 1996 года, curl — в марте 1998-го.

Памяти

Рафаэль Сагула ушёл слишком рано: он умер в 2016 году. Я благодарен ему за то, что он дал всему этому начало.