Роб Пайк и Брайан Керниган

В октябре 1984 года два идеолога опубликовали радикальный манифест… ну, или что-то вроде того.

Легенды computer science Брайан Керниган и Роб Пайк сформулировали в Program Design in the UNIX Environment паттерн архитектуры ПО, за сохранение которого оба боролись долгие годы.

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

Старые программы покрываются коркой сомнительных фич.

Суть статьи часто сводят к аббревиатуре DOTADIW, или «Do One Thing And Do It Well» («Делайте что-то одно и делайте это хорошо»). В Unix и его потомках есть множество программ, в которых воплощена эта мантра: ls просто создаёт список файлов, cat просто выводит содержимое файлов, grep просто фильтрует данные, wc просто подсчитывает слова и так далее. У каждой программы есть несколько опций, меняющих её поведение, но не слишком сильно. Например: wc можно сконфигурировать для подсчёта строк или слов, но не для подсчёта количества абзацев или вхождений какой-то фразы.

Мощь Unix, защищаемая Керниганом и Пайком, заключалась в возможности соединения этих простых программ в цепочку для создания сложных поведений. Зачем добавлять сопоставление регулярных выражений в wc, если с этим уже способна справиться grep? Для подсчёта количества функций в файле Rust можно выполнить такую команду:

cat main.rs | grep "^\s*fn\s" | wc -l

В переводе с Bash на русский это означает: прочитай файл, отфильтруй в нём только строки, содержащие функции (строки, в которых первый текст без пробелов равен fn), а затем подсчитай эти строки. Оператор pipe (|) просто передаёт вывод одной программы на вход следующей.

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

К сожалению, как и в случае с большинством манифестов, этот идеал не выдержал столкновения с реальностью. Программы для Unix могут общаться только в одном направлении и только при помощи отправки потоков текста. Модель имела определённый смысл в терминальной среде, но так и не совершила успешного перехода в десктопные операционные системы. Поэтому популярные современные программы наподобие Photoshop и Word максимально «покрыты коркой сомнительных фич». Прекрасная идея Кернигана и Пайка так никогда и не дала плодов.

▍ Гниение платформ


Допустим, Керниган и Пайк были правы хотя бы в одном: что раздувание ПО является проблемой. Огромные приложения сложно изучать, трудно использовать и в них куча багов. Частично это проблема UX, однако по большей мере это симптом проблемы разработчика.

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

Но, разумеется, пользователей не волнует скорость разработки и размер кодовой базы. К сожалению, эти качества неразрывно связаны с тем, что для пользователей важно: со скоростью, стоимостью, фичами и, что самое важное, с надёжностью.

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


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

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

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

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

Добавляемые баги примерно пропорциональны скорости, умноженной на процент времени, который тратят на новые фичи, умноженный на Pbug

Постепенно крупные кодовые базы достигают точки гниения (enshittification), после которой баги добавляются быстрее, чем их можно устранить. Конкретный размер, при котором это происходит, зависит от команды и архитектуры, но даже самые талантливые инженеры сталкиваются с гниением, если их кодовой базе позволяют неконтролируемо расти. Подведём итог: крупные монолитные кодовые базы приводят к отстойному ПО.

Но по-прежнему остаётся открытым такой вопрос: могут ли на практике кодовые базы меньшего размера приводить к созданию чуть менее отстойного ПО? Или у них есть собственные проблемы?

▍ Микросервисы: DOTADIW в больших масштабах



1990-е: спагетти-ориентированная архитектура (копипейст); 2000-е: лазанья-ориентированная архитектура (многослойный монолит); 2010-е: равиоли-ориентированная архитектура (микросервисы). Что дальше? Возможно, пицца-ориентированная архитектура. Источник: The Evolution of Software Architecture (Бенуа Хедиар)

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

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


Я заметил следующий общий паттерн:


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

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

Как минимум, микросервисы — отличный инструмент в арсенале разработчика серверов. Чем больше инструментов, тем лучше. В основном я фронтенд-разработчик, поэтому мне завидно! Какое же оружие я могу использовать против сил гниения?

▍ Апплеты?


При разбиении сервисов на мелкие части мы получаем микросервисы, а при разбиении фронтендов — очевидно, микрофронтенды. Но на самом деле микрофронтенды являются ребрендингом старой идеи: апплетов.

Типичный Java-апплет из начала 2000-х

«Апплет» (applet) — это уменьшительная форма слова App («приложение»). Это лаконичное обозначение маленькой программы с узкой функциональностью, которая не покроется коркой сомнительных фич.

К сожалению, похоже, большинство создателей апплетов не дочитали мантру Кернигана и Пайка до конца: хотя апплеты «делали что-то одно», им редко удавалось «делать это хорошо». Слово «апплет» обычно синонимично Java, хотя можно включить в этот зонтичный термин и приложения на ActiveX и Adobe Flash. Если вы слишком молоды, чтобы помнить, когда произвольные части веб-сайтов ломались из-за того, что какой-то плагин был «слишком старым» или «слишком новым», или «не поддерживался вашей ОС», то, наверно, мне стоит вас поздравить? Вы не пропустили ничего хорошего.

Ещё важнее то, что апплеты были практически полностью автономными. Не было никакой возможности объединить несколько апплетов в цепочку процесса аналогично командам Unix. Даже их взаимодействие с ОС и файловой системой было ограничено из соображений безопасности. Они были в «маленькими приложениями» в том же смысле, в каком детские электромобили являются «маленькими автомобилями»: забавные, но бесполезные.


Так что, возможно, настало время избавиться от принципа «делайте что-то одно и делайте это хорошо» для фронтендов, выбросив её в кучу других красивых, но неработающих идей наподобие цеппелинов и коммунизма. Терминал Unix не захватил в одночасье весь мир, не удалось этого сделать и апплетам. Возможно, гниение — просто неотъемлемая часть жизни фронтенд-разработчиков, фундаментальное следствие энтропии, постепенное угасание, свойственное и нашим стареющим телам.

А может быть, апплеты просто реализовали идею неправильно.

▍ Плагины!


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

Ещё более точная аналогия — трактор. У грузовика одна задача: брать грузы в одном месте и перевозить их в другое. У современных тракторов может быть куча предназначений: они могут возделывать землю, сеять, убирать снег, рыть ямы и так далее. То есть они представляют собой общую платформу, к которой подключаются («плагинятся») другие специализированные инструменты.


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

Чтобы превратиться в «синие воротнички», устройства, которые раньше назывались персональными компьютерами, должны адаптироваться к этому промышленному образу мышления. То же самое относится и к запускаемому на них ПО. Это не значит, что ПО не может быть развлекательным и удобным для пользователя, просто самое главное для него — это гибкость. Приложения могут или разрастаться, поглощая все возможные функции и рабочие процессы, или эволюционировать в расширяемые платформы, к которым пользователи по необходимости подключают новые компоненты.

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

Obsidian 1.4 в macOS и iOS

По своей сути Obsidian — это редактор markdown. И он справляется с этой задачей хорошо. Но его настоящая магия заключается в экосистеме плагинов. Плагины Obsidian не ограничиваются включением боковых панелей и добавлением новых элементов меню, они могут добавлять новую функциональность «холсту», на котором редактируется и потребляется контент. Уже написаны плагины, позволяющие встраивать код, генерировать индексы и даже интегрировать большие языковые модели напрямую в обычный процесс написания текстов. Сабреддит Obsidian похож на сообщество водителей грузовиков, хвастающихся своими машинами. Это программное обеспечение для изобретателей и экспериментаторов.

Хорошее расширяемое десктопное приложение должно уметь становиться своего рода «операционной системой», но построенной на основе некого вида «холста». VS Code — это холст для программных проектов, Blender — холст для 3D-сред, Figma — холст для дизайна UI. У каждого из этих приложений есть качественные встроенные функции редактирования, но каждое из них обогащается благодаря обширным экосистемам плагинов, добавляющих новую функциональность напрямую на холст.

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

В идеале этот центральный хаб должен быть максимально небольшим, как ядро операционной системы. В Obsidian даже базовые функции приложения наподобие диспетчера файлов и строки поиска реализованы как плагины. Пользователи получают от гибкости как прямую (не нравится диспетчер файлов? Просто замени его другим!), так и косвенную пользу (высокую скорость разработки). Obsidian — полностью функциональное ПО, созданное семью людьми и кошкой. По моим впечатлениям, оно очень надёжно и быстро совершенствуется.

Obsidian не «делает что-то одно и хорошо». Он чудесным образом «делает многое и делает это хорошо». Но в чём-то это мираж: на самом деле, Obsidian — не одно приложение, а что-то вроде многоклеточного организма. Каждая его часть — это отдельная и специализированная единица, как и задумывалось Керниганом и Пайком. Вместе они создают своего рода эмерджентное поведение, которое предполагалось как возможное благодаря шеллу Unix. В этом смысле Obsidian и его ilk (как и VS Code) нашёл Святой грааль разработки ПО.

Так в чём же секрет? И почему сейчас? Что такого в его модели плагинов, которая работает там, где другие модели потерпели поражение?

▍ Соединяем части


Крошечные части ПО с единственной функцией сами по себе не так уж полезны. Они становятся полезными, только когда объединяются способами, обеспечивающими появление более сложных поведений. Апплеты как концепция провалились, потому что их совершенно нельзя было комбинировать. Различия между другими моделями в основном сводятся к конкретному способу реализации соединения частей.

Хорошая аналогия — это игрушечные конструкторы. Один кирпичик Lego не особо полезен, но его можно скреплять с другими кирпичами, образуя красивые здания и конструкции. Программные архитектуры работают схожим образом.


Деревянные кубики никак друг с другом не соединяются. Кирпичики Lego соединяются, но только в одном измерении — из них можно создавать только линии и плоскости. K’nex могут прикрепляться под углами вокруг центрального хаба. А лабиринты для хомяков — это просто хаотичное соединение элементов произвольным образом.

Если отбросить сложные аналогии, то получим следующее:


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

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

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

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

Учёный может изучать сложный объект, исследуя его фундаментальную структуру через микроскоп. У инженера почти такая же задача, только у него нет микроскопа. Вместо этого инженеры должны изобретать каждый атом и молекулу, каждую систему и подсистему, пока в конечном итоге не получат нужный результат. Стать мастером в этой работе невозможно. Все мы стремимся к лучшему, но часто терпим неудачу.

Простых ответов не существует, но повсюду можно найти подсказки. Чтобы подобрать идеальную структуру для сложного ПО, обратите внимание на структуры, пережившие миллиарды лет жесточайшей эволюции: атомы и молекулы, солнечные системы и галактики, наши собственные внутренние органы. Тракторы и камеры. Obsidian и VS Code. Все они созданы из маленьких однофункциональных блоков, как и задумывалось Керниганом и Пайком.

Узнавайте о новых акциях и промокодах первыми из нашего Telegram-канала ????

Комментарии (44)


  1. Dima_Sharihin
    29.11.2023 13:19
    +6

    достигают точки гниения (enshittification)

    Как мягко перевели-то


    1. qrdl
      29.11.2023 13:19
      +3

      Скорее всего подойдет "изговниться", возвратная форма словарного глагола изговнить


      1. pavel_kudinov
        29.11.2023 13:19
        +4

        о как, оказывается, литературно "-ить", а в простонародье слышал, как правило, "-ять"

        век живи - век учись


        1. PuerteMuerte
          29.11.2023 13:19
          +16

          о как, оказывается, литературно "-ить", а в простонародье слышал, как правило, "-ять"

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


      1. vladkorotnev
        29.11.2023 13:19
        +21

        Пока читал, пришёл в голову вариант «точка всратификации» — т.е. после которой софт становится всратым в плохом смысле этого слова. И звучит так же всрато, как исходный термин на английском %)


        1. nomorewar
          29.11.2023 13:19
          +1

          Чисто из любопытства: можно примеры софта (желательно конкретного), который всрат в хорошем смысле этого слова?))


          1. domix32
            29.11.2023 13:19
            +4

            MS Paint


          1. DungeonLords
            29.11.2023 13:19
            +4

          1. greenTransistor
            29.11.2023 13:19

            Как насчет fossil?

            https://fossil-scm.org/

            Кроссплатформенная распределенная VCS с веб-интерфейсом, баг-трекером и wiki - и все это в бинарнике на 3 MiB.


  1. PuerteMuerte
    29.11.2023 13:19
    +2

    Суть статьи часто сводят к аббревиатуре DOTADIW, или «Do One Thing And Do It Well» («Делайте что-то одно и делайте это хорошо»).

    Я вспоминаю один старый шуточный рассказ про альтернативную реальность, где победил коммунизм, а Билл Гейтс работал в советской шарашке. И они в следующей версии Единой Операционной Системы собирались удалить команду Copy, потому что нарушала этот принцип, ведь можно было обойтись командами Move и Delete.


    1. SergioShpadi
      29.11.2023 13:19
      +16

      Команду move можно заменить командами copy и delete, но не наоборот


      1. PuerteMuerte
        29.11.2023 13:19
        +2

        Да, это я очепятался


    1. lkslks
      29.11.2023 13:19

      Наоборот Move <-> Copy.


    1. hard_sign
      29.11.2023 13:19
      +2

      Классика же. «Выливаем воду из чайника и сводим задачу к предыдущей».


    1. sim31r
      29.11.2023 13:19
      +1

      Ну Delete тоже лишняя. Move to null можно делать.


  1. Demon416
    29.11.2023 13:19
    +4

    Исходный манифест, да и сама "философия юникс" годятся исключительно для программ с интерфейсом командной строки.

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

    Давно пора ограничить применения идеологии только теми местами где она уместна.


    1. SkywardFire
      29.11.2023 13:19
      +1

      А где там пакетное?

      Как думаете, сколько времени потребуется на выполнение вот этого?)

      sleep 1 | sleep 1 | sleep 1 | sleep 1

      Ответ, в принципе, интуитивно очевиден, иначе бы не было вопроса,

      но всё же...

      За одну секунду (+ накладные расходы), т.к. все программы в конвейере запускаются одновременно, а их "последовательное" выполнение, которое, как я предполагаю, и имеется ввиду под "пакетным" в вашем ответе -- это исключительно психологическая иллюзия, т.к. вторая программа попросту ждёт ввода от первой.

      Чем не мягкий реалтайм?)


  1. pae174
    29.11.2023 13:19
    +4

    cat main.rs | grep "^\s*fn\s" | wc -l

    На больших файлах так делать не надо т.к. конвейер гарантированно работает медленнее, чем чтение файла самой утилитой grep.

    grep -c "^\s*fn\s" main.rs


    1. pavel_kudinov
      29.11.2023 13:19
      +5

      "гибкость vs производительность" в чистом виде

      по классике, положено делать всё сначала гибко, а потом там (и только там), где тормозит не совместимо с продакшеном - оптимизировать

      p.s. это, конечно, сарказм. сам считаю конвейеры хорошим примером красивой, но далеко не универсальной абстракцией, как раз хорошо иллюстрирующей ущербность принципа DOTADIW

      p.p.s. в нулевые после Perl много увлекался bash и потоковой обработкой через анонимные pipe'ы, это у которых вот такой синтаксис: >( | | )

      так вот начиная с определенной сложности кода и объемов данных bash банально начинал нестабильно работать, вылезали проблемы с гонками, пропусками строк и тп бред (в основном это про ситуации где приходилось на каждую строку ввода стартовать цепочку процессов, где-то что-то не справлялось с очень часто стартующими и умирающими пачками процессов и возникали оборванные pipe'ы, хотя там просто обработка текста шла и падать нечему было)

      в итоге красиво разбитые на потоковые микро-утилиты логики пришлось затаскивать обратно в Perl, где всё работало стабильно и быстро


      1. saboteur_kiev
        29.11.2023 13:19
        +6

        Так а чем использование чистого grep -c не гибкость???
        Тут просто пример сделан человеком, который или умышленно делал кривой пример, либо не знает как правильно пользоваться gnu тулз, чтобы минимизировать количество пайпов.

        так вот начиная с определенной сложности кода и объемов данных bash банально начинал нестабильно работать

        Нет у баша нестабильности от определенной сложности кода. Есть нестабильность, вызванная кривым кодом, в котором не предусмотрели поведение при ошибках или эксепшенах.
        Да, у шелл скриптов не хватает полезных конструкций, но вот называть его нестабильным - это просто неправильно.

        Ну и сравнивать обработку в баш (который в принципе не любит обрабатывать текст сам, любит вызывать внешние gnu tools), с перлом, который собственно был создан для обработки текста.. Понятно что перл лучший выбор в данном случае.


        1. mike-shevchenko
          29.11.2023 13:19
          +1

          Причем тут gnu tools? Керниган и Пайк работали в то время, когда никакого gnu ещё не было. grep и т.п. были придуманы ещё в Юниксе, и не всегда имели современный привычный набор фич.


          1. saboteur_kiev
            29.11.2023 13:19

            То есть причем? При том, что в примере человек правильно пользуется шеллом (пайпы), но плохо знает возможности gnu tools, частью которых сейчас является и grep и wс и многое другое, из-за чего лишнего.


      1. checkpoint
        29.11.2023 13:19
        +3

        Использование cat с одним файлом (без конкатенации) с последующей передачей в пайп является плохой привычкой. Команда cat сделана для конкатенации.

        Useless Use of cat Award


    1. Tamerlan666
      29.11.2023 13:19
      +1

      Каждый раз, когда вы пишете cat ... | grep ... - в мире умирает один котик. (c)


      1. mpa4b
        29.11.2023 13:19

        А каждый раз, когда двигаете курсор от имён файлов к паттерну -- второй.


    1. domix32
      29.11.2023 13:19

      Да там ещё и регулярка пробелы проверяет, а не границы слов. Так что автор тот ещё советчик. Ну а если хочется скорости, то проще вовсе ripgrep поставить и получить x5 на ровном месте на тех же кверях.


  1. saboteur_kiev
    29.11.2023 13:19
    +8

    К сожалению, как и в случае с большинством манифестов, этот идеал не выдержал столкновения с реальностью. Программы для Unix могут общаться только в одном направлении и только при помощи отправки потоков текста. Модель имела определённый смысл в терминальной среде, но так и не совершила успешного перехода в десктопные операционные системы. Поэтому популярные современные программы наподобие Photoshop и Word максимально «покрыты коркой сомнительных фич».

    Тут прям провокационное заявление с неправильной терминологией.

    Во-первых программы для юникс могут общаться не только при помощи отправки потоков (есть еще и аргументы).
    Во-вторых не совсем понятно почему современная десктопная операционная внезапно лишается терминала а еще точнее интерфейса с командной строкой.

    Если сравнивать GUI программу и CLI, то тут да - передать информацию из одной гуишной программой в другую крайне сложно, ибо нужно всегда согласовывать тип данных. В консоли работаешь с текстом, который в большинстве случаев поддается простой обработке. Да и современные способы работы с текстом только расширяют возможности (запросы в базу из консоли, работа с JSON/YAML)

    И манифест ОТЛИЧНО выдержал столкновение с реальностью, ибо он отлично работает для бесплатных open source продуктов, которые могут поддерживаться нерегулярно, контрибьюторы меняются. В этих случаях, зачастую адаптировать привычный простой инструмент под новую версию ОС займет немного времени, в отличие от комбайна с кучей разноплановых фич (которые требуют множество разноплановых зависимостей).
    Тут я категорически не согласен с тем, что манифест каким-то образом устарел.
    Просто понятно, что его нет смысла применять к крупным комбайнам типа фотошопа или оффиса, да и вообще крупным корпоративным продуктам.


  1. ericgrig
    29.11.2023 13:19

    Спасибо!

    Хорошая статья. Раскрыли тему с разных сторон. Думал в конце приведете свое высказывание: "Делай хорошо одно и умей взаимодействовать с другими, не создавая проблем".

    Ценю, что вы умеете излагать просто и доходчиво.


  1. ozz_life
    29.11.2023 13:19
    +2

    Пользуясь случаем хотел бы спросить какой-нибудь полезной литературы, как научиться проектировать приложения навроде Obsidian, с модулями и плагинами.


    1. fasvik
      29.11.2023 13:19

      Присоединяюсь к комментарию)

      Но, скорее всего, волшебной кнопки тут нет, только самому изучать да осмысливать(


  1. cdriper
    29.11.2023 13:19
    +2

    Obsidian такой себе пример, поделка на электроне


    1. domix32
      29.11.2023 13:19

      Назовёте лучше?


  1. gatoazul
    29.11.2023 13:19

    Из популярных программ Adobe Indesign сделан как микроядро, расширяемое плагинами


  1. sim31r
    29.11.2023 13:19

    В каком-то смысле это и принцип Шерлока Холмса )

    Голова не чердак для хлама


  1. vvzvlad
    29.11.2023 13:19

    По своей сути Obsidian — это редактор markdown. И он справляется с этой задачей хорошо. Но его настоящая магия заключается в экосистеме плагинов. Плагины Obsidian не ограничиваются включением боковых панелей и добавлением новых элементов меню, они могут добавлять новую функциональность «холсту», на котором редактируется и потребляется контент. Уже написаны плагины, позволяющие встраивать код, генерировать индексы и даже интегрировать большие языковые модели напрямую в обычный процесс написания текстов. Сабреддит Obsidian похож на сообщество водителей грузовиков, хвастающихся своими машинами.

    Сабреддит Obsidian похож на помойку, в которой в общем случае очень сложно найти нужную тебе фичу, потому что плагины то не работают с последней версией обсидиана, то делают что-то не то, что нужно тебе, то работают на десктопе, но ломаются на мобилке, то работают, но ломаются после обновления, то еще что-то.

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

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


    1. Aytuar
      29.11.2023 13:19

      Обратная сторона плагинов.


  1. SadOcean
    29.11.2023 13:19

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

    Занятно, что решения тоже есть, пусть и не идеалььные. Мы этого не осознаем, но платформы типа ОС (сама концепция программы), браузеры и прочие виртуальные машины - это средства, частично снимающие остроту проблемы.


    1. Alexey2005
      29.11.2023 13:19

      Да где ж там редко? Это одна из самых распространённых пользовательских жалоб, что продукт порезали с апдейтом.

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

      Но и в виндовых продуктах, включая даже саму Windows, поубирать часть фич постоянно умудряются.

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


  1. SkywardFire
    29.11.2023 13:19
    +1

    Прекрасная идея Кернигана и Пайка так никогда и не дала плодов.

    Разве? Дала, еще даже до публикации манифеста. Консоль и её трубы не просто популярны, а даже главный конкурент выпустил свой, "power" shell...

     Терминал Unix не захватил в одночасье весь мир

    Ну, как сказать, как сказать. Когда-то лично даже и не предполагал, что 2023 году, со всем этим вашим девопсом, умение в bash будет цениться и оплачиваться НАСТОЛЬКО хорошо.


    1. PuerteMuerte
      29.11.2023 13:19

      Консоль и её трубы не просто популярны, а даже главный конкурент выпустил свой, "power" shell...

      Справедливости ради, консоль с трубами у главного конкурента были с момента первых версий MS DOS, и с тех пор никуда не девались.

      умение в bash будет цениться и оплачиваться НАСТОЛЬКО хорошо

      Ни баш, ни пауершелл, это не про манифест Кернигана и Пайка. У них там было про атомарность функционала, а не про запуск консольных приложений-октопусов.


  1. eyeDM
    29.11.2023 13:19

    А мне сразу вспомнился виндовый Total Commander: весьма удобный, легковесный, гибко конфигурируемый комбайн, с тонной плагинов.


  1. Beholder
    29.11.2023 13:19

    Для подсчёта количества функций в файле Rust можно выполнить такую команду

    И тут вдруг мы попадаем на многострочный комментарий или многострочный строковый литерал, в котором случайно есть такая подстрока - и всё летит к чертям.

    Ещё посоветуйте HTML регекспами парсить...

    Или сколько "старых добрых" bash-скриптов сломают себе шею на именах файлов с пробелами.


    1. Alexey2005
      29.11.2023 13:19

      Если бы только с пробелами! Проблемы может создать и восклицательный знак, и слэш, и попавшиеся в неподходящем месте символы ~, #, =, и кавычки. И это ещё только имена файлов! Когда речь идёт о путях, там всё ещё печальнее, и способов зафейлиться на ровном месте намного больше.

      Подавляющее большинство граблей при работе с Bash вызваны именно его отвратительной работой со строками (подстановка). Как ни старайся, сколько ни предусматривай особых ситуаций, а рано или поздно при обработке большого количества файлов всё равно попадётся нечто такое, что сломает скрипт.

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


      1. TestNickname
        29.11.2023 13:19

        если нужно быстро и просто сделать что-то такое...

        что сможет хоть как-нибудь адекватно и удобоваримо прожевать ошибку и указать на место в котором она случилась, а не сдохнуть в процессе вывалив exitcode 1 где-то в дебрях субшелла, берём Питон.

        Нет, можно конечно и на баше добиться чего-то отдаленно похожего, но зачем?