прошлое_там
August 1, 2022

TDelphiMemories.Create(ButtHurt)

Уже больше, чем двадцать лет назад мы частенько собирались на хате у Василия Алибабаевича, но вместо того, чтобы люто бухать и накуриваться, как все нормальные подростки, умеренно бухали и в несколько рук писали код. Вершиной тогдашних средств разработки мы считали Visual Basic — ещё бы, ведь за «программированием мышкой» явно было будущее. Ну и что, что «барсику» требуется подкладывать dll с его рантаймом? Пока одна программа влезает на дискетку — не такая уж это проблема.

Как-то сидим мы так с пацанами, кайфуем, и тут Васян такой «пацаны, смарите, ОП» — и кликанул по новой, незнакомой иконке. Штука, которая неспешно запустилась вслед за этим, была чем-то на «барсик» похожа, но им не являлась.

Бля, Васян, ну ты и дебил конечно.

Поначалу «Дельфя» (а это была она, в третьей своей ипостаси) меня не заинтересовала. Эффект утёнка был слишком силён — «бейсик» был знаком ещё со школы, и казалось логичным продолжать копать в этом же направлении. Но со временем что-то стало меняться: VB находился в очевидном застое, а Delphi постоянно развивался: не успел я утащить от Васи на винте инсталлер третьей версии, как Алибабаевич уже хвалился, что надыбал пятую, а скоро будет шестая. В «Хакере» стали выходить статьи, обучающие кодингу в Delphi, и рассказы о том, что вот Borland (а тогда это было имя куда более уважаемое, чем Microsoft) щас как выпустит Kylix, и весь ваш дельфовский код можно будет кросскомпилировать под Linux, и всё, вендекапец! Опять же, начал появляться более-менее доступный интернет, и найти там советы и учебники по Delphi было куда проще, чем по VB.

А справка, какая там была справка! В те времена была популярна шутка, что русские программисты ставят борландовские компиляторы только ради хелпов, ну и, по факту, это действительно был топ. Каждый вызов описан, ставишь курсор, жмёшь F1 — и видишь полное описание, даже с примерами кода. Даже WinAPI вызовы были описаны; это неописуемое преимущество, когда у тебя нет возможности сходить в интернет за справкой.

Вслед за этим шло количество доступных компонентов. Добавить в программу скины? Для этого есть компонент. Сделать поддержку нового файлового формата? Для этого есть компонент! Создать простенькую OpenGL-игрушку — ага, ну вы поняли.
Ты просто мышкой кидаешь на форму какой-нибудь Indy.TidIRC — и твоя программа уже может коннектиться к IRC-чату в локалке. Можно понтоваться, что написал собственный клиент, и раздавать его всем желающим (вместе с собирателем pwl, конечно). Ау, бейсик, пока-пока!

А главное — IDE была по тем временам абсолютно прорывной. Чего стоило только дополнение после точки по Ctrl+Space — нигде такого не было, чтобы среда разработки сама предлагала тебе варианты. Неправильный код подчёркивался красненьким, как в «Ворде». А дебаггер! Хошь — трассируй построчно, хошь — ассемблерный код смотри (не то, чтобы я тогда понимал его, но выглядело круто, а чего ещё надо).

Сколько всякого говна я понаписал на шестой Delphi — не перечесть. Ещё больше говна я написал только на Delphi 7, которая прикатилась ко мне на жёсткий диск где-то году в 2002. Это уже были не laba1.dpr и не kursach.dpr, а что-то осмысленное, что я даже не стеснялся понемногу выкладывать в общий доступ. Какие-то мелкие утилитки, попытки написать альтернативы уже существующему софту — в общем всё то, чем тогда занимался каждый третий, если не каждый второй доморощенный говнокодер. За несколько лет у меня стали получаться более-менее осмысленные решения, которыми пользовались даже десятки человек, я писал к ним справки, вёл поддержку на форумах, и дичайше всем этим гордился.

Седьмая «Дельфя» — легендарнейший продукт, про который просто необходимо сделать отдельное упоминание. Я знаю места, где она, несмотря на свою устарелость (20 лет с момента выхода!) успешно используется по сию пору. Она очень простая, и при том, в ней есть какой-то оптимальный набор средств, позволяющий быстро сделать «настоящее» приложение под Винды, от Windows 95 до Windows 11 включительно, работающее максимально быстро, и не тягая за собой никаких рантаймов. При желании код из D7 всё ещё можно собрать в D2 под шестнадцатибитные третьи винды — так себе преимущество даже двадцать лет назад, но всё же. И бинарники получались вполне компактные — хотя холиваров между «дельфистами» и «сишниками» в своё время это порождало несчётное количество. Выяснение, чей «hello, world» будет меньше могло занять не одну сотню страниц, и в ход шли все аргументы:

— Пустая формочка на Delphi почти 500 килобайт весит! Позорище, вот на чистых сях 3 килобайта!
— Дебил, ты юниты неиспользуемые отруби, и в настройках компилера дебагинфо не включай, будет тебе 30 килобайт! А если на чистом WinAPI писать, то те же 3k и будет. А сколько на сях будет стоить пару кнопок добавить? А?
— Но дельфокодеры не умеют писать на чистом API, всем известно, что они могут только добавлять новые компоненты мышкой.
— Зато Delphi даже такую программу собирает быстро, а пока ваш код билдится, можно покурить три раза сходить.
— Так ты не билдь весь проект заново, а только изменённые модули пересобирай!
— И вместо трёх сигарет только на одну времени хватит, дооо, это победа, спасение лошадей от никотина.

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

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

D7 стал пиковой точкой развития классического Delphi, а дальше... Дальше что-то пошло не так.

Kylix откровенно не выстрелил. Вышло то ли две, то ли три его версии, но оказались они не совсем тем, чем должны были. Вместо фреймворка VCL, который, по сути и превращал в Delphi язык Object Pascal, там был куда более бедный и глючный CLX, построенный поверх Qt. Писать на нём было можно, и это даже немного работало, но ни о какой кросс-компиляции речи не шло, переписывать приходилось практически всю «оконную» часть программы. Поэтому проще было писать непосредственно на Qt.

Delphi 8 имела новый интерфейс IDE, отличавшийся от привычной и удобной «семёрки» и... не поддерживала Delphi для Win32. Писать там можно было только на Delphi.NET — новой версии языка, работавшей на новой платформе .NET, которая тогда ещё не стала стандартом де-факто разработки под винды, и много у кого вызывала неприязнь. Поменялся и язык, и вообще — это было не то. В Borland это быстро поняли, и уже в Delphi 9 вернули «как было», но никто не понимал, зачем уходить с D7, если лучше не стало.

Потом было ещё пару версий, в которых что-то добавлялось, что-то менялось, но особого прогресса в этих обновлениях не ощущалось. Попутно под брендом Delphi выходили какие-то новые инструменты, вроде Delphi для PHP — что это было, какие задачи должно было решать, и на кого рассчитывалось, похоже не знали сами Borland; всё это умирало максимум после третьей итерации.
Язык терял популярность, верно, и не сказать, что медленно; даже в постсовке, где Delphi была любима исторически, разработка постепенно переезжала на ещё недавно принимаемый в штыки .NET.

В 2009 году Borland, в попытке вернуть утраченные позиции, выпускают версию Delphi которая должна была стать следующей «семёркой». Delphi 2009 стала нативно поддерживать юникод (до этого требовались лютейшие костыли), сам язык подтянулся — добавились дженерики, замыкания, стали хорошо поддерживаться все визуальные фичи новых версий Windows, вроде Aero и Ribbon (базово это было и раньше, но работало так себе), среда разработки стала более современной и удобной.
Но было поздно: в том же 2009 (а по другим данным — даже в 2008) году подразделение, занимавшееся всем, что связано с Delphi, продаётся с долгами и потрохами. Позже и сама Borland продаётся за жалкие $75 млн, и, по сути, прекращает существование. Sic transit gloria mundi.

Казалось бы — на этом история и должна была бы закончиться. Никто больше ничего не ждал, да и никому уже не была нужна Delphi. Её нишу средства быстрой разработки прочно заняли C# и Java, а эта ветка эволюции умерла, оставив за собой только копролиты легаси, да любопытные ответвления, вроде FreePascal и Oxygene.

Но тут — фигак, новый владелец продукта, компания Embarcadero, уже через год выпускает следующую версию, которая не то, чтоб революционная, но реально новая, доработанная, а не то же самое в новой обёртке. Да ещё выкатывает роадмап, в котором обещает x64 компилятор, а главное — наберите воздуха — кроссконпеляцию в MacOS/iOS/Android! Свежо предание, спасибо, мы уже поели kylix, до сих пор плюёмся.
Но случилось странное — разработка пошла именно по роадмапу, и раз-два в год выходили обновления в которых всё это реально появлялось. Помню, как я охеревал, когда достал из архивов какую-то поделку на D7, поправил её под XE5, выбрал платформу «Android ARM», и полученный apk реально заработал на моём Galaxy Tab! Да, с лютыми тормозами, да, с какими-то интерфейсными косяками, но это всё равно было что-то невообразимо крутое.

В общем, Embarcadero попытались занять нишу кроссплатформенной графической разработки, в которой действительно бы работало правило «write once, compile anywhere». Я не знаю, насколько это в действительности у компании получилось, но продукт жив и развивается по сию пору, и продаётся за несколько тысяч долларов, что для корпоративной разработки — копейки. Полагаю, что своя ниша у него действительно есть, а очень сильных разработчиков на языке всё ещё много.


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

Из delphi-разработки я выкатился как раз десять лет назад, с тех пор основным моим языком является PHP. Сравнивать эти языки нет особого смысла, у них разные цели, разные парадигмы, разные возможности и инструменты. Если посмотреть со стороны, то Delphi выглядит куда «круче», чем «пыха», до сих пор много кем воспринимаемая, как html-шаблонизатор.
Впрочем, похеру: я могу с достаточной вероятностью успеха сесть за практически любой современный язык — go, python, lua, js, c#, java, etc., — и через пару часов (или дней) написать на них что-то осмысленное, что будет работать. Разобраться же со смыслом чужого кода на всех этих языках я смогу ещё быстрее. Я бы смог это сделать и без всего своего опыта, знаете почему?

Для них есть охуенные IDE, которые структурируют, оформляют, дополняют, определяют, контекстируют и подсказывают. Для вас буквально проводят языковой анализ, показывая: вот это функция, это её параметры, это их типы данных, а вот это класс, он из вот той библиотеки, делает то-то и то-то. Причём, вы даже не трогаете код, просто смотрите, и вам более-менее понятно:

Пример настройки цветоструктурной схемы для PHP в IDE PHPStorm.

Если вы наведёте курсор на элемент — то увидите всю инфу по нему:

Если кликните по элементу — увидите его вызовы:

И это только малейшая часть возможностей хорошей IDE. А ещё будут автодополнения, быстропоиски всего и вся, интеллектуальные рефакторинги. Совершенно интуитивная навигация — через десять минут вы будете отчётливо понимать, что нужно сделать, чтобы оказаться в нужной вам части проекта в один-два клика.
После минимальных телодвижений (буквально ответ «Да» на вопрос «Оно вам надо?») установятся, самоинтегрируются и практически станут частью IDE все внешние инструменты, нужные в работе — composer, git, docker, тестовые фреймоворки. Сразу под рукой будут средства для работы с базами данных.
IDE напишет вам заголовки классов и драфты документации. Создаст стабы тестов и проследит за соблюдением кодстайла.

В общем, IDE сделает всё, чтобы мыльный пузырь абстракции не лопался в ваших ручках. Она ваш бро. Или сис. В общем — френд.

А теперь гляньте в IDE Delphi, любой из последних версий (для этого, к счастью, не нужно платить тыщи баксов, Community Edition бесплатная, ну и торренты никто не отменял). Если вам повезёт, и она запустится без ошибки, то откройте какой-нибудь код (да хотя бы демки от самой Embarcadero), и попробуйте в него вникнуть:

Рандомный кусок кода отсюда

И взгляните на ту же логику, которую я воспроизвёл для демонстрации на PHP:

На скрине с delphi-кодом всё слито в единую портянку, в которой выделяются только литералы, коментарии, условные операторы компилятора да служебные слова.
PHPStorm сразу даёт понять, где переменная, а где константа, где статический метод, а где динамический, определить видимость вызова/переменной, ну и вообще — сами видите разницу. Пыховый код объективно проще прочесть и осознать — не из-за языка, повторюсь, а именно из-за помощи IDE.

Признаю, я чуть-чуть подкрутил настройки цветовой схемы, во-первых потому, что могу, во-вторых — потому что это легко. Могу ли я докрутить цветовую схему в Delphi?

Технически — да, фактически — нет.
В самой IDE настройки крайне ограничены, и сводятся к смене цветов того, что и так есть, и это даже не смешно.
Можно поставить китайский (в Китае немалое комьюнити Delphi-разработчиков) CnPack, который пытается чинить IDE, тогда станет чуть-чуть получше:

Вы видите разницу? А она есть.

Хотя всё равно говно.

И это — пример, в котором хоть как-то хоть что-то можно сделать, пусть и сторонними средствами. В других моментах можно натолкнуться на какую-то стену, об которую легко разбить себе голову.

— Вы не можете переопределить горячие клавиши, или определить свои (а они есть далеко не для всех нужных функций), можно только выбрать из списка преднастроенных пресетов. Хотя технически, опять же, это возможно — нужно создать свой плагин IDE, где кодом на том же Delphi описать нужное.
— Вы не можете просто сразу посмотреть места использования функции. Вам нужно запускать отдельный инструмент, который не менялся со времён восьмой версии. А, если вам нужно посмотреть, где используется переменная, атрибут класса или константа — у вас просто нет способа этого сделать, ну, кроме поиска по файлам.
— Кстати, поиск довольно тупорылый, буквально «в лоб», он не понимает контекст, по которому ищет. Я видел текстовые редакторы, где сделано лучше.
— Вы иногда не можете перейти в код модуля из его импорта. В какие-то модули можете, просто щелчком по имени, а некоторые надо открывать через список юнитов. Это ни от чего не зависит, это просто есть.
— git, технически, интегрируется — но всё, что эта «интеграция» даёт — куцую и неудобную менюшку с вызовами консольных команд. Посмотреть дифф, чекнуть историю или полистать коммиты или нельзя, или настолько неудобно, что ну его нафиг. Это нужно забыть, как страшный сон, и с помощью того же CnPack добавить контекстное меню Проводника с установленной «Тортиллой».
— Отладчик в Delphi традиционно очень крутой. В 2002 году он был запределен по функционалу, печалило разве то, что на больших проектах вечно терялась синхронизация с IDE при трейсинге (т.е. исполняется одна строка, а в IDE указатель на совершенно другой). Проблема чинится удалением всех собранных юнитов с полным перебилдом; почему «чинится»? — потому что в 2022 году проблема всё ещё существует. Ну и то, что когда-то было пределом мечтаний, сейчас ощущается как какой-то минимум.
— IDE всё-таки научилась поддерживать кодстайлы! Вы можете их даже настраивать, не очень очевидным способом, но методом проб и ошибок добиться нужного форматирования кода возможно! Можно даже сохранить эту настройку в файл, чтобы не потерять при переустановке. Но форматировать за вами код «на лету» IDE не будет, вам каждый раз придётся вызывать форматирование вручную. Это, пожалуй, бесит больше всего. Даже зависоны IDE с TIdiNahuiException in OGrob.Grob.Kladbishe.Pidor class так не злят.

Список этот я могу продолжать и продолжать. Каждый раз, когда мне нужно что-то написать на Delphi, всплывает что-то новое; раз в несколько лет я обновляю Delphi — и вижу ровно то же самое. Да, разработчики докручивают компиляторы и фреймворк, да, постоянно появляется поддержка всяких фишек ОС, да, сам язык постоянно развивается, не теряя совместимости с прежними версиями, и код на нём получается очень чёткий. Но насколько хорошо всё это, настолько же плохо со средой разработки.

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

Хотя... хотя сегодня я видел, в чём и как пишут разработчики 1С. Забудьте все мои жалобы, по сравнению с этим у Delphi всё прекрасно.