Раздутие размеров программного обеспечения давно превысило его функциональность, главным образом из-за того, что достижения аппаратного обеспечения позволяют этому случиться. Путь к упрощению софта лежит в дисциплинирующих методологиях и возвращении к основам.
Требования к памяти современных рабочих станций обычно существенно возрастают - от нескольких до многих мегабайт – и это происходит каждый раз, когда выходит новая версия программы. Когда потребность превышает имеющийся объём памяти, приходит время покупать дополнительную память. Когда система больше не поддаётся расширению, пора покупать новую, более мощную рабочую станцию. Увеличиваются ли производительность и функциональность софта пропорционально росту потребляемых ресурсов? В основном - нет.
Около 25 лет назад интерактивный текстовый редактор можно было разработать, вложившись всего в 8 000 байт памяти. (Современные редакторы требуют в 100 раз больше!) Операционная система должна была обходиться 8 000 байтами, а компилятор умещаться в 32 Кбайта, тогда как их современные потомки требуют мегабайты. Стало ли всё это раздувшееся ПО быстрее? Наоборот. Если бы не аппаратное обеспечение, ставшее быстрее в тысячу раз, современный софт был бы совершенно непригоден к использованию.
Улучшенное удобство и функциональность якобы оправдывают рост размеров программ, но более пристальный взгляд показывает, что эти оправдания шатки. Текстовый редактор по‑прежнему выполняет довольно простую задачу вставки, удаления и перемещения частей текста; компилятор всё так же переводит текст в исполняемый код; операционная система всё так же управляет памятью, дисковым пространством и процессорным временем. Эти базовые обязанности не изменились с появлением окон, стратегий копирования‑вставки и выпадающих меню, равно как и с заменой осмысленных командных слов красивыми иконками.
Очевидный взрыв сложности ПО в основном принимается благодаря головокружительному прогрессу полупроводниковых технологий, которые улучшили соотношение цена/производительность в степени, не имеющей аналогов в других отраслях техники.
Например, с 1978 по 1993 год семейство процессоров Intel 8086 увеличило мощность в 335 раз, плотность транзисторов - в 107 раз, а цену - примерно в 3 раза. Перспективы продолжения роста производительности всё ещё устойчивы, и нет признаков того, что ненасытный аппетит софта будет удовлетворён в ближайшее время. Эта тенденция породила множество правил, законов и следствий, которые - как обычно в таких случаях - выражены в общих терминах; следовательно, они ни доказуемы, ни опровержимы. С долей юмора два следующих закона довольно точно отражают состояние дел:
Программное обеспечение расширяется, чтобы заполнить всю доступную память. (Паркинсон).
Программное обеспечение замедляется быстрее, чем ускоряется аппаратное обеспечение. (Райзер)
Неконтролируемый рост размеров софта также принимается потому, что пользователи с трудом отличают важные функции от тех, что лишь «приятны в наличии». Примеры второго типа: произвольно перекрывающиеся окна, продиктованные широко принятой, но не критически осмысленной метафорой рабочего стола; и вычурные иконки на экране, такие как почтовые ящики или мусорные корзины, которые к тому же сопровождаются анимацией перемещения выбранных объектов к месту назначения. Эти детали милы, но не обязательны, и у них есть скрытая цена.
Причины «раздутого софта»
Очевидно, двум факторам способствуют принятие всё более разрастающегося софта: (1) быстро растущая мощность аппаратного обеспечения и (2) неспособность пользователей отличить обязательные функции от необязательных. Но, возможно, ещё важнее, чем искать причины терпимости, - задаться вопросом: что толкает софт к усложнению?
Основная причина сложности - то, что поставщики ПО без критики принимают почти любую функцию, которую хотят пользователи. Любая несовместимость с исходной концепцией системы либо игнорируется, либо остаётся незамеченной, что делает дизайн сложнее, а использование - неудобнее. Когда мощь системы измеряется количеством функций, количество становится важнее качества. Каждый новый релиз должен предлагать дополнительные возможности, даже если некоторые из них не добавляют функциональности.
Все функции, сразу
Ещё одна важная причина сложности - монолитный дизайн, при котором все мыслимые функции включены в систему. Каждый клиент платит за все функции, но реально использует лишь немногие. В идеале должна предлагаться только базовая система с необходимыми средствами, допускающая расширения. Каждый пользователь мог бы выбирать только те расширения, которые действительно нужны для конкретной задачи.
Рост вычислительной мощности, без сомнения, был основным стимулом для разработчиков браться за более сложные задачи, а сложные задачи неизбежно требуют сложных решений. Но беспокоит не присущая сложность, а само-причиненная. Многие проблемы давно решены, но теперь для их решения предлагаются решения, обёрнутые в более громоздкое ПО.
Рост сложности во многом вызван нашей недавней страстью к дружественному пользовательскому взаимодействию. Я уже упоминал окна и иконки; легко можно добавить цвет, градации серого, тени, всплывающие окна, рисунки и всяческие украшения.
Для некоторых сложность = мощь
Удобство использования системы всегда должно быть первостепенной целью, но оно должно основываться на базовой концепции, делающей использование почти интуитивным. Всё чаще люди ошибочно принимают сложность за изящество, что озадачивает - непонятное должно вызывать подозрение, а не восхищение.
Возможно, эта тенденция вызвана ошибочным убеждением, что использование некоего загадочного устройства наделяет пользователя ореолом силы. (На деле - чувством беспомощности, если не импотенции.) Поэтому соблазн сложности как инструмента продаж легко понять: сложность укрепляет зависимость клиента от поставщика.
Хорошо известно, что крупные софтверные компании много инвестируют - и успешно - в службу поддержки, нанимая сотни консультантов, отвечающих на звонки клиентов круглосуточно. Однако гораздо экономичнее для производителя и потребителя - продукт на основе системной концепции, то есть основанный на общих правилах вывода, а не на наборах инструкций, применимых лишь к конкретным ситуациям, - подкреплённый систематической документацией и учебными материалами. Конечно, клиент, заранее оплачивающий контракты на поддержку, является более стабильным источником дохода, чем клиент, полностью освоивший продукт. Индустрия и академия, вероятно, преследуют разные цели; отсюда ещё один «закон»:
Зависимость клиента прибыльнее, чем обучение клиента.
Меня по‑настоящему поражают руководства - на сотни страниц - сопровождающие прикладные программы, языки программирования и операционные системы. Они однозначно свидетельствуют как о запутанном дизайне без чётких концепций, так и о стремлении удержать клиента.
Этого недостатка ясных концепций недостаточно, чтобы объяснить взрыв размеров софта. Проектирование решений для сложных задач, будь то софт или железо, - сложный, дорогой и длительный процесс. Улучшение соотношения цена/производительность в железе было достигнуто скорее за счёт лучшей технологии дублирования (фабрикации) дизайнов, чем за счёт лучшего искусства проектирования. Программное обеспечение же - это сплошной дизайн, а его тиражирование стоит производителю сущие копейки.
Хорошая инженерия характеризуется постепенным, пошаговым совершенствованием продуктов.
Начальные проекты сложных программных приложений неизбежно получаются громоздкими, даже когда их разрабатывают компетентные инженеры. По-настоящему хорошие решения возникают после итеративных улучшений или после переработок, использующих новые идеи, и самые ценные итерации - те, что приводят к упрощению программы. Эволюции такого рода, однако, чрезвычайно редки в современной практике разработки ПО - они требуют трудоёмких мыслительных процессов, которые редко вознаграждаются. Вместо этого недостатки программ обычно исправляются быстро придуманными добавками, которые неизбежно приводят к хорошо известному раздутию.
Никогда не хватает времени
Возможно, время - наиболее важная причина появления громоздкого софта. Давление по срокам, которое испытывают разработчики, препятствует тщательному планированию. Оно также мешает улучшать решения, которые уже считаются приемлемыми; вместо этого поощряются быстрые доработки и исправления. Давление по срокам постепенно размывает стандарты качества и стремления к совершенству у инженера. Оно негативно влияет и на людей, и на продукты.
Факт, что поставщик, чья продукция выходит на рынок первой, как правило, оказывается успешнее конкурента, который приходит вторым, даже с более удачным дизайном, - ещё один пагубный фактор для индустрии. Склонность принимать «первого» как де-факто стандарт - прискорбное явление, основанное на той же гонке со временем.
Хорошая инженерия характеризуется постепенным, пошаговым совершенствованием продукта, обеспечивающим рост производительности при заданных ограничениях и доступных ресурсах. Ограничения ресурсов ПО, однако, легкомысленно игнорируются: быстрый рост скорости процессоров и объёмов памяти обычно считают компенсацией небрежного дизайна. Тщательные инженерные привычки не окупаются в краткосрочной перспективе, что является одной из причин того, почему программное обеспечение занимает сомнительное положение среди признанных инженерных дисциплин.
Языки и методология проектирования
Хотя исследования в области программного обеспечения, которые теоретически содержат ключ к многим будущим технологиям, получили серьёзную поддержку, их результаты кажутся едва ли полезными для индустрии. Методичное проектирование, например, оказывается нежелательным, поскольку такие продукты требуют слишком много «времени до выхода на рынок». Аналитическая проверка и техники доказательства корректности обстоят ещё хуже; кроме того, они требуют более высокого интеллектуального уровня, чем обычная практика «попробуй - и исправь». Предложение сократить сложность ПО, сосредоточившись только на необходимом, быстро отвергается как нелепое на фоне любви клиентов к побрякушкам. Когда действует принцип «всё дозволено», методологии и дисциплина становятся первыми жертвами.
Абстракция работает только с языками, которые предполагают строгую типизацию переменных и функций. В этом отношении язык C терпит неудачу.
Методологии языков программирования особенно спорны. В 1970-х было широко распространено мнение, что разработка программ должна основываться на хорошо структурированных методах и уровнях абстракции с чётко определёнными спецификациями. Абстрактный тип данных лучше всего выражал эту идею и нашёл отражение в таких новых тогда языках, как Modula-2 и Ada. Сегодня программисты покидают хорошо структурированные языки и переходят в основном на C. Язык C даже не позволяет компиляторам выполнять надёжную проверку типов, хотя эта задача компилятора - одна из самых полезных в разработке, поскольку она позволяет находить концептуальные ошибки на ранней стадии. Без проверки типов идея абстракции в языках остаётся пустой и академической. Абстракция возможна только в языках, предполагающих строгую статическую типизацию каждой переменной и функции. В этом отношении C терпит неудачу - он напоминает ассемблер, где «всё возможно».
Изобретение колеса заново?
Примечательно, что абстрактный тип данных вновь появился спустя 25 лет после своего изобретения под названием объектно-ориентированный. Суть этого современного термина, считаемого многими панацеей, заключается в построении иерархий классов (типов). Хотя старую концепцию не приняли без новой наклейки «объектно-ориентированный», программисты распознали внутреннюю силу абстрактного типа данных и вернулись к нему. Чтобы язык заслуживал этого описания, он должен обеспечивать строгую статическую типизацию, которую нельзя нарушить, благодаря чему программисты могут полагаться на компилятор при выявлении несоответствий. К сожалению, самый популярный объектно-ориентированный язык - C++ - не помогает здесь, поскольку он был объявлен совместимым со своим предком C. Его широкая популярность подтверждает следующие «законы»:
Прогресс приемлем, только если он совместим с текущим состоянием.
Следовать стандарту всегда безопаснее.
В такой ситуации программисты изнуряют себя в языке, который препятствует структурному мышлению и дисциплинированному конструированию программ (и отказывает в базовой поддержке компилятора). Они также прибегают к временным решениям, которые главным образом увеличивают объём ПО.
Какой мрачный образ; какой пессимист! - подумает читатель. Ни намёка на светлое будущее вычислений, доселе считавшееся само собой разумеющимся.
Этот, пусть и мрачный, взгляд реалистичен; тем не менее, при желании есть путь улучшить текущее положение.
Проект OBERON
В период между 1986 и 1989 годами Юрг Гуткнехт и я разработали и реализовали новую программную систему - называемую Oberon - для современных рабочих станций, основываясь исключительно на аппаратном обеспечении. Наша первоочередная цель состояла в том, чтобы показать: программное обеспечение можно разрабатывать, используя лишь малую часть памяти и вычислительной мощности, обычно считающейся необходимой, - и при этом не жертвуя гибкостью, функциональностью или удобством использования.
Система Oberon используется с 1989 года, применяясь для подготовки документов, разработки программного обеспечения, САПР электронных схем и многого другого. В систему входят:
управление памятью,
файловая система,
менеджер оконного отображения,
сеть с серверами,
компилятор,
редакторы текста, графики и документов.
Разработанная и реализованная - с нуля - двумя людьми за три года, Oberon была перенесена на несколько коммерческих рабочих станций и нашла множество энтузиастов, особенно потому, что доступна бесплатно.
Наша второстепенная цель - создать систему, которую можно изучить и объяснить детально, систему, пригодную как кейс по проектированию ПО, который можно исследовать сверху вниз и для которого можно явно сформулировать дизайнерские решения. (Действительно, существует нехватка опубликованных примеров по построению компактного ПО, что становится особенно очевидно при преподавании курсов.) Итогом нашей работы стала одна книга, описывающая всю систему и содержащая исходный код всех модулей.
Как возможно построить программную систему усилиями примерно пяти человеко-лет и представить её в одной книге?
Три основных принципа
Во-первых, мы сосредоточились на essentials - на сути. Мы исключили всё, что не вносило фундаментального вклада в мощь или гибкость. Например, взаимодействие с пользователем в базовой системе ограничено текстовой информацией - никаких графических элементов, изображений или иконок.
Во-вторых, мы хотели использовать по-настоящему объектно-ориентированный язык программирования, один из безопасных по типам. Это, вместе с нашей верой в то, что первый принцип должен применяться к инструментам ещё более строго, чем к самой разрабатываемой системе, вынудило нас разработать собственный язык и создать для него компилятор. Так появился Oberon - язык, происходящий от Modula-2 посредством исключения менее важных (например, поддиапазонов и перечислений) и небезопасных возможностей (например, преобразований типов и вариантных записей).
В-третьих, чтобы быть простым, эффективным и полезным, мы хотели, чтобы система была гибко расширяемой. Это означало, что новые модули могут добавляться, включая новые процедуры, основанные на вызове существующих. Это также означало, что можно определять новые типы данных (в новых модулях), совместимые с существующими. Мы называем их расширенными типами, и они - единственный фундаментальный концепт, добавленный к Modula-2.
Расширение типов
Если, например, тип Viewer определён в модуле Viewers, тогда тип TextViewer может быть определён как расширение Viewer (обычно в другом модуле, добавляемом в систему). Все операции, применимые к Viewer, одинаково применимы к TextViewer, и все свойства Viewer также присущи TextViewer.
Расширяемость гарантирует, что модули могут добавляться позже без требований изменения или перекомпиляции. Очевидно, типобезопасность критична и должна пересекать границы модулей.
Расширение типа - типичная объектно-ориентированная возможность. Чтобы избежать вводящих в заблуждение антропоморфизмов, мы предпочитаем говорить «TextViewer совместим с Viewer», а не «TextViewer наследует Viewer». Мы также избегаем вводить новую терминологию для широко известных концепций; например, мы сохраняем слово тип вместо класс, а также слова переменная и процедура, избегая экземпляр и метод. Очевидно, наш первый принцип - фокус на essentials - применим и к терминологии.
История одного типа данных
Пример типа данных иллюстрирует нашу стратегию построения базовой функциональности в ядре системы, с добавлением дополнительных возможностей через расширения.
В ядре системы тип Text определён как последовательность символов с атрибутами шрифта, смещения и цвета. Базовые операции редактирования предоставлены модулем TextFrames.
Модуль электронной почты не включён в ядро, но может быть добавлен при необходимости. Когда он добавляется, модуль электронной почты опирается на ядро и импортирует типы Text и TextFrame для отображения текстов. Это означает, что стандартные операции редактирования могут применяться к полученным письмам. Письма можно изменять, копировать и вставлять в другие тексты на экране с помощью операций ядра. Единственные операции, которые предоставляет модуль почты - получение, отправка и удаление сообщений, плюс команда показа каталога почтового ящика.
Активация операций
Другой пример, иллюстрирующий нашу стратегию - активация операций. Программы в Oberon не запускаются; вместо этого отдельные процедуры экспортируются из модулей. Если модуль M экспортирует процедуру P, тогда P может быть вызвана (активирована), просто указав на строку M.P в любом тексте на экране и щёлкнув кнопкой мыши. Такое прямолинейное выполнение команд открывает следующие возможности:
Часто используемые команды включаются в короткие фрагменты текста - tool-texts, которые напоминают настраиваемые меню, хотя для них не требуется специальное меню-программное обеспечение. Они обычно отображаются в небольших окнах (viewers).
Расширив систему простым графическим редактором, предоставляющим подписи на основе текстов Oberon, команды могут быть выделены и украшены рамками и тенями. Это создаёт всплывающие и/или выпадающие меню, кнопки и иконки - «бесплатно», поскольку используется тот же механизм активации команд.
Сообщение, полученное по электронной почте, может содержать текст и команды. Команды выполняются, когда получатель щёлкает по ним внутри письма (без копирования в специальное окно). Мы используем это, например, когда объявляем о новых или обновлённых модулях: письмо содержит команды получения и список имён модулей для загрузки из сети. Весь процесс требует лишь нескольких щелчков.
Сохраняя простоту
Стратегия сохранения ядра системы простым, но расширяемым, вознаграждает скромного пользователя. Ядро Oberon занимает менее 200 Кбайт, включая редактор и компилятор. Система на базе Oberon нуждается в расширении только если требуются большие или сложные приложения (например, CAD). Если используются несколько таких приложений, система не требует их одновременной загрузки. Эта экономия достигается благодаря следующим свойствам:
Модули загружаются по требованию. Сигналом служит активация команды, определённой в ещё не загруженном модуле, или загрузка модуля, импортирующего ещё не загруженный модуль. Загрузка модуля может происходить и из-за доступа к данным. Например, если документ содержит графику, а графический модуль не загружен, доступ сам по себе приводит к его загрузке.
Каждый модуль находится в памяти в виде одной копии. Это правило запрещает создание связанных загрузочных файлов (core images). Обычно связанные файлы вводятся в ОС потому, что процесс линковки медленный и сложный. В Oberon линковка неотделима от загрузки. Это допустимо, поскольку процессы быстры и выполняются автоматически при первом обращении к модулю.
Цена простоты
Опытный инженер, зная, что бесплатных обедов не бывает, спросит: какова скрытая цена такой экономии? Упрощённый ответ: в ясной концептуальной основе и хорошо продуманной структуре системы. Если ядро - или любой модуль - должно быть расширяемым, дизайнер обязан понимать, как оно будет использоваться. Самый трудный аспект системы - её декомпозиция на модули. Каждый модуль - это часть с точно определённым интерфейсом (импортами и экспортами).
Каждый модуль также инкапсулирует свои методы реализации. Все процедуры должны быть согласованы при работе с экспортируемыми типами. Правильная декомпозиция - задача трудная и редко достижимая без итераций. Улучшения возможны лишь до момента релиза.
Обобщить правила проектирования сложно. Если определён абстрактный тип данных, должны быть тщательно рассмотрены базовые операции, но комплексных операций следует избегать. Также можно уверенно сказать, что правило «спецификация до реализации» должно быть ослаблено: спецификации могут оказаться столь же неподходящими, как и реализации - ошибочными.
В заключение - девять уроков, извлечённых из проекта Oberon, которые стоит иметь в виду каждому, кто начинает разрабатывать новую систему ПО:
Исключительное использование строго типизированного языка оказалось наиболее значимым фактором при проектировании такой сложной системы в короткие сроки. (Трудозатраты были лишь небольшой долей того, что обычно требуется для проектов сопоставимого размера.) Статическая типизация: (a) позволяет компилятору находить несоответствия до выполнения программы; (b) позволяет проектировщику менять структуры с меньшим риском негативных последствий; (c) ускоряет процесс улучшения, включая изменения, которые иначе были бы невозможны.
Самая трудная задача - найти подходящую декомпозицию системы в иерархию модулей, минимизируя дублирование. Oberon значительно помогает, обеспечивая проверки типов между модулями.
Концепция расширения типов была ключевой для создания расширяемой системы, где новые модули добавляют функциональность, а новые классы объектов интегрируются совместимо со старой системой.
В расширяемой системе ключевая задача - определить примитивы, обеспечивающие максимальную гибкость расширений, избегая их чрезмерного количества.
Вера в то, что сложные системы требуют армий разработчиков, ошибочна. Система, которую не может понять целиком хотя бы один человек, скорее всего не должна быть построена.
Проблемы коммуникации растут с ростом команды. Если они доминируют, и команда, и проект в беде.
Уменьшение сложности и размера должно быть целью на каждом шаге - в спецификации, дизайне и реализации. Компетентность программиста должна оцениваться по способности находить простые решения, а не по количеству строк в день. Плодовитые в этом смысле программисты - путь к катастрофе.
Нет замены личному опыту программирования. Деление команды на менеджеров, дизайнеров, программистов, аналитиков и пользователей - вредно. Все должны участвовать во всех аспектах разработки. Особенно важно, чтобы каждый - включая менеджеров - некоторое время был пользователем системы.
Программы должны быть переписаны и отшлифованы до такого состояния, при котором их текст можно показать другим специалистам. Намного сложнее написать программу, которую не стыдно показать другим, чем просто работающую. Программы должны писаться для людей так же, как для компьютеров.
Проект Oberon показал, что гибкие и мощные системы можно создавать с существенно меньшими ресурсами и в более короткие сроки. Болезнь раздувания ПО - не «закон природы». Она предотвратима, и задача инженера - ограничить её.
Ссылки
E. Perratore et al., “Fighting Fatware,” Byte, Vol. 18, No. 4, Apr. 1993, pp. 98–108.
M. Reiser, The Oberon System, Addison-Wesley, Reading, Mass., 1991.
N. Wirth, J. Gutknecht, Project Oberon - The Design of an Operating System and Compiler, Addison-Wesley, Reading, Mass., 1992.
M. Reiser, N. Wirth, Programming in Oberon - Steps Beyond Pascal and Modula, Addison-Wesley, Reading, Mass., 1992.
Никлаус Вирт (1934 - 2024) - профессор компьютерных наук Швейцарского федерального технологического института (ETH), Цюрих. Он разработал языки Pascal (1970), Modula (1980) и Oberon (1988), рабочие станции Lilith (1980) и Ceres (1986), а также их операционные системы. Лауреат премий IEEE Emmanuel Piore и Turing Award (1984).
Комментарии (49)

panzerfaust
20.11.2025 06:15Все функции, сразу
Где ж вы в наше время такое видели? Все продукты начинаются со стадии "палки и желуди", а функции там появляются спустя годы. "Ранний доступ" для геймдева вообще база.

randomsimplenumber
20.11.2025 06:15Потому что разработчикам платят не за компактность программы. Потому что как правило всем пофиг на размер. Ну, есть colibri os, на дискету помещается. Кому она нужна?

longtolik
20.11.2025 06:15Тут просто разные интересы, кому что. Если что-то в космос запускать, то нужна.
На ДВК-3 был компилятор Fortran, на дискету помещался. Кому он нужен... Но совсем недавно на hh была вакансия - программисты Fortran и Cobol, зарплата - $12000 в месяц.

randomsimplenumber
20.11.2025 06:15Для космоса важен не размер а надежность. Архитектура, тестирование, линтеры и прочая методология.
программисты Fortran и Cobol, зарплата - $12000 в месяц.
Совсем недавно карликам в цирке хорошо платили ;). Иногда бывают очень специфические требования.
Ну, фортран, допустим. Он что, дает какой то особо компактный код по сравнению с плюсами?

longtolik
20.11.2025 06:15Не буду спорить.
Размер программы несколько связан с надежностью, Она должна быть ясная и понятная.
Почему Фортран нравится тому работодателю - это его надо спросить, Подозреваю, что расчеты, сделанные на Фортране кому-то представляются надежными. (Как-то была шумиха, что у Питона результаты различаются в зависимости, скажем, от операционной системы, из-за разного представления чисел с плавающей запятой в системах и архитектурах процессоров. Сотни научных работ были скомпрометированы.). Были сообщения, что Фортран до сих пор применяется, и дискеты тоже, но нанимают группы программистов, чтобы всё-таки перевести на современную базу, возможно, для этого и нанимают.

AndrewBond
20.11.2025 06:15Ну, фортран, допустим. Он что, дает какой то особо компактный код по сравнению с плюсами?
Он вроде как дает возможность работать с числами, с которыми плюсы не могут и делать это с заданной точностью. Нормальные люди этой разницы не увидят, но, в каких-то областях по-другому никак.

randomsimplenumber
20.11.2025 06:15Нет. Просто на фортране написано миллионы строк легаси, оно протестировано 100500 раз и работает. А форматы чисел - они стандартые же. Или есть особенные уличные, в которые только фортран может?

AndrewBond
20.11.2025 06:15про библиотеки и наследие - это банально. Встречал как-то статьи с примерами, где для конкретных задач С++ вообще нельзя было использовать, то ли накопление ошибки, то ли негарантированная точность и предсказуемость результата при заданных форматах чисел.

randomsimplenumber
20.11.2025 06:15Уличная магия какая то. Откуда непредсказуемость? Могут случиться чудеса оптимизации у конкретного компилятора с конкретными настройками. Или у конкретного программиста.

domix32
20.11.2025 06:15С фортраном исторически сложилось, потому что его активно использовали в системах распределённых вычисления - то бишь кластеры суперкомпьютеров гоняют чаще всего именно его. Тот же OpenMP изначально на фортране написан.
Cobol занял нишу транзакционных систем, в частности в банкинге. И многие системы на коболе работают по принципу "работает - не трожь". Поэтому обновлять эти сисемы на что-то посовременнее мало кто хотел, но при этом популярность языка стала уступать и найти инженера на Cobol становится год от года проблемнее, отсюда и растущие ценники зп для этого языка.

Bonus2k
20.11.2025 06:15А кто запрещает юзать колибри, msdos, linux без de?

randomsimplenumber
20.11.2025 06:15А кто-то заставляет юзать великий и ужасный electron?
Юзайте на здоровье то что нравится. Только не спрашивайте, как в ms-dos запустить свежий chromium. Запускайте vc.com ;)

isumix
20.11.2025 06:15Обрисую крайнюю степень этого явления. Веб приложение, вместо того чтобы использовать в имеющемся у пользователя броузере, поставляют с electron-ом (копией броузера с доп-функциями), потом заворачивают это все в snap/flatpack (копию операционной системы), и все это работает через несколько слоев виртуализации. Не говоря уже про грмоздкие вэб-фрейворки который ре-рендерят и делают diff-инг DOM дерева на каждый чих.

randomsimplenumber
20.11.2025 06:15Ну и другая крайность - несколько дней подпиливать системный браузер и подбирать версии окружения, чтобы оно заработало без snap. Или раздать всем абсолютно одинаковые компы с абсолютно одинаковой ОС, а то зоопарк кругом.
Не говоря уже про грмоздкие вэб-фрейворки который ре-рендерят и делают diff-инг DOM дерева на каждый чих.
Никто не хочет платить за компактные фреймворки. А громоздкие - бесплатно достаются.

isumix
20.11.2025 06:15Ну это как всегда зависит от задачи. Например примерно 90% проблем уже моно решить через АПИ обычного броузера. Остальные 10% решаются с использованием микро-сервера запущенного на localhost (микро относительно electron). Если сервер написан на ноде или питоне, то проблема системных библиотек не актуальна. Бесплатные фреймворки без ререндеров и диффов тоже имеются.

randomsimplenumber
20.11.2025 06:15Ну и собирать сего франкенштейна нужно будет под каждую систему по особенному.

alexs963
20.11.2025 06:15Особенно важно, чтобы каждый - включая менеджеров - некоторое время был пользователем системы.
Золотые слова.

randomsimplenumber
20.11.2025 06:15Менеджер должен выполнять работу тестировщика. А тестировщик зачем?

alexs963
20.11.2025 06:15Речь не про тестирование, а про то что бы менеджер попробовал в работе то, что он предлагает другим и понимал сильные и слабые стороны продукта.

randomsimplenumber
20.11.2025 06:15Менеджер и так знает, что за г@@@о он продает. И еще он видит, что его покупают ;)

AndreyDmitriev
20.11.2025 06:15Желающим "компактного и быстрого" ПО я всегда предлагаю расчехлить любой ассемблер, да писать прямо на нём. Можно ли написать Windows приложение с интерфейсом прямо на асме? Вполне. И будет ну очень быстро работать, и компактным тоже будет. Вопрос только в том, сколько времени придётся на всё это положить.
Что б вы понимали — я представитель "старой школы", учил программирование в конце восьмидесятых в Политехе, начав с Фортрана, затем был Паскаль. Это два прекрасных учебных языка. Си я выучил самостоятельно по K&R, написав на нём программу управления рентгеновским дифрактометром для дипломной работы (походу мне пришлось ещё и PDP-11 макро ассемблер изучить, чтобы воспользоваться всеми преимуществами ОС RT11FB). На ДВК-4 памяти было вроде 56 килобайт, ещё был жёсткий диск на 5 мегабайт, РАМ диск мегабайтный и верх крутизны - адаптер КЦГД. И всё работало и достаточно быстро. Мне также удалось "потрогать" в физтехе и Модулу-2 и Оберон. Но в конце девяностых я писал уже на Дельфи 4 и был просто счастлив, это казалось верхом совершенства. То есть я вижу весь этот прогресс за тридцать лет. Сейчас мне приходится писать на LabVIEW (тут у меня 25 лет опыта), это графическая среда разработки, о которой я тридцать лет назад не мог даже и мечтать, равно как и о других, та же Студия — фантастический проект, я помню как я редактировал код на ДВК, как компилировал, как разбивал программу на слои-оверлеи, чтобы сделать подгрузку с диска того, что не лезло в куцую память. Цена же всех современных возможностей — огромное количество машинного кода. Та же LabVIEW выгоняет довольно "рыхлый" машинный код, но это плата за удобство.
Что касается современной разработки — тут нужен разумный, я бы сказал рационально-прагматический подход. Из негативного — я вижу довольно много разработчиков, даже банально не понимающих как работает компьютер, процессор, память (как физическая, так и виртуальная), кэш, вот это вот всё. Вот у них как раз и будет монструозные навороты из Электронов и иже с ними. К счастью, мне не надо лезть в Веб, я разрабатываю десктопные приложения для промышленных рентгеновских систем. Детектор подгоняет мне картинки по 32 мегабайта 15 кадров в секунду. То есть каждую секунду мне прилетает объём эквивалентный в прошлом сотне(!) дисков ДВК, который мне нужно обрабатывать в реальном времени, и я это успешно делаю, иногда заглядывая в листинги Ассемблера, интенсивно используя SIMD вплоть до AVX-512. И мой опыт тридцатилетней давности с ДВК мне в этом очень помогает для оптимизации "узких мест" и "бутылочных горлышек". Но у меня как-то не возникает желания бесконечно оптимизировать интерфейсную часть, я стараюсь писать ПО так, чтобы это было удобно для пользователя, и если интерфейс запускает сколько-то там потоков для рендеринга вкупе с сотнями мегабайт памяти, ну так и что с того, у меня их нынче гигабайты? Это даёт мне время для глубокой оптимизации и дотошного профайлинга именно алгоритмической части. Это технический прогресс — мы идём по пути усложнения и со своей стороны боремся как можем с этим усложнением как раз теми самыми фреймворками. У некоторых возникают "перекосы", да, но это скорее вызвано слишком "поверхностным" пониманием сути вещей и архитектуры программно-аппаратной части, неумением пользоваться отладчиком и общим нежеланием учиться, чтобы получить результат "здесь и сейчас", ну и менеджмент до кучи подгоняет, не давая разработчикам времени просто сесть, разобраться и подумать, заставляя по итогу "забивать гвозди микроскопом". А каждый хороший разработчик должен быть хотя бы немножко "хакером" (в хорошем смысле слова) и иметь представление как работают железки и программы (а они нынче фантастические в сравнении с теми, что я помню) и расходовать ресурсы максимально экономно и вместе с тем эффективно.
Сейчас вот Раст изучаю — там для аскетов куча возможностей — берите тот же Ratatui, и ваяйте себе в удовольствие консольные интерфейсы, и всё летает, реально.

cempod
20.11.2025 06:15В любом подходе можно найти плюсы и минусы, важно поддерживать баланс, как мне кажется. Производительность железа растёт, можно и удобства для разработчиков добавить, и фишек для пользователей, лишь бы с умом это делалось. Но грустно наблюдать, когда одно и то же приложение годами практически не меняется, а требует от устройства всё больше и больше, а таких примеров сейчас хватает.
Всё же ситуация, когда, допустим, веб страницу со статейками и видосиками используют в качестве бенчмарка, для меня выглядит как преступление.

ihouser
20.11.2025 06:15
Инженеры делают 1 2 3, а программисты на оборот 3 2 1.

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

ihouser
20.11.2025 06:15Это переработка в сторону глубокий оптимизации. Никакой миниатюризации как в процессорах.
А программисты в основном оптимизацией не занимается. Только нагромождение новых функций при помощи новых фреймворков.
Но. И те и другие делают именно то чего от них ожидают, за что платят.

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

pda0
20.11.2025 06:15первый и второй рапторы такие не потому что инженерам захотелось обвешать систему финтифлюшками как новогоднюю ёлку
Именно потому. Просто вы не правильно на них смотрите. Raptor v1 - отладочная сборка, v2 debug friendly оптимизированная, v3 - максимально оптимизированная.

sappience
20.11.2025 06:15У инженеров есть стоимость разработки и стоимость производства. Есть смысл вложиться еще в разработку чтобы удешевить производство. А у программистов стоимость производства (т.е. создание любой следующей копии после первой) нулевая или околонулевая. Вот и нет причин оптимизировать ее.
Если бы в ракетостроении всегда можно было откупиться деньгами (как докупить памяти в комп), то так бы и делали. Но законы физики суровы -- лишняя масса двигателя и он не взлетит. Или не долетит. Нельзя просто докупить еще пару движков в ракету. Поползет всё. Сначала общая масса движков, потом масса и объем топлива для них, и производительность насосов, и толщина стенок бака и их вес, и масса корпуса и поперечное сечение и сопротивление воздуха. Которые могут просто "съесть" эффект от "докупания".

checkpoint
20.11.2025 06:15Еще добавлю. У инженеров есть стоимость ошибки и она порой очень высока. У программистов стоимость ошибки - НОЛЬ! Из-за этого программисты совсем потеряли берега.

randomsimplenumber
20.11.2025 06:15Смотря какие программисты и какие инженегры. Ну, ошипся инженер. Его в лес отвезут? Максимум премию не получит.

checkpoint
20.11.2025 06:15Инженер премию не получит, а главный конструктор присядет лет на 10. Вы слашали чтобы программиста посадили за баг коде ?

randomsimplenumber
20.11.2025 06:15главный конструктор присядет лет на 10
Да? И были преценденты? И за что его посадили? За то что его подчиненный неправильно чего то наинженерил? Кул стори.
Ну, допустим. Кто у программистов занимает должность, аналогичную Королеву? Что за проект они пилят?

domix32
20.11.2025 06:15никаких графических элементов, изображений или иконок.
Забавно. А потом видимо ждём, чтобы пользователь с одного раза все правильно ввёл без подсказок, автозаполнений, без отображения состояния, валидации форм и прочего - если мы отдаём всю сложность пользователю, то логично почему система оказывается минималистичной. Сколько такой подход потом тех.поддержке нервов сжигает и как всё это будет конкурировать с некомпактным ПО, естественно, остаётся за рамками статьи.
Можно написать редактор в 8000 байт, но что тот редактор будет уметь кроме отображения глифов в терминал и сохранения на диск? Наверняка undo/redo даже не вместится. Подсветку синтаксиса или проверку орфографии наверное и упоминать не стоит.
longtolik
Всё верно. К слову, в те же годы: компьютер на Intel-386SX, 2 Мб памяти, Word 6.0. Как раз я сделал программу для работы с сетевой картой на самом низком уровне на ассемблере. Сижу, смотрю пакеты в сети. Запускаю Word - и пошло-поехало - лезет в сеть, хотя чего ему там делать. Еще и Интернета у нас не было. Вот для того и нужны были мегабайты программ. Видимо. Чтобы замаскировать модули, которые "что-то делают". Потом был драйвер мыши на 19 мегабайт, как сказал знакомый, он должен еще и речь распознавать. Примерно столько же занимает драйвер поворота экрана в мониторе. Один бит отслеживает (экран в горизонтальном положении или в вертикальном). Но если учесть, что можно делать снимок экрана и отправлять, то нужны уже большие объемы, да еще завуалировать нужно.
Не хорошо это, сделали из искусства бизнес.
randomsimplenumber
В те годы, когда был актуален 386sx, 2мб памяти и интернет - что то сверхбогатое. Тогда даже вирусы не рассчитывали на наличие сети.
pda0
Там даже TCP/IP не так просто установить было. До Win 95 OSR2 сеть по умолчанию предполагалась сугубо локальной с NetBEUI или IPX. Скорее всего какой-нибудь каскадный эффект от операционки. Типа, Word запросил список принтеров и венда начала в сетевое окружение стучать. Или что-то типа того. А человек теорию заговора на ровном месте создал. :)
longtolik
Тогда постеров не было. Но стек TCP IP и UDP - куда устанавливать. Делается ручками - главное , сам пакет принимать и передавать, по заголовкам пакетов мак адреса источника, приемника и т.д. и вперёд. Считанные байты программы. Не помню уже, что было в пакетах, но явно не принтеры. А вообще, все пакеты в сети просматривались. Про Wireshark ещё и не слыхали.
pda0
Я не понял смысл сказанного тогда.
Вот это намекает, что в Word 6.0 была встроена какая-то шпионская активность. Куда он мог отсылать что-то, если учесть, что во времена Win 3.11 и Word 6.0 подавляющее большинство компьютеров с сетевой картой были замкнуты на локальную сеть компании и никакого доступа в интернет не имели?
randomsimplenumber
Я бы предположил наличие вируса в пиратском word.
pda0
Пошёл сканировать диски, включая сетевые? Вполне возможно. Кстати, не обязательно даже заражённый exe, вирус могли подцепить позднее:
randomsimplenumber
Стандартный способ размножения - прицепиться к исполняемому файлу.
longtolik
Не утверждаю про шпионскую активность, но пакеты Word точно отсылал по сети, Вот куда, надо его создателей спросить. Возможно, у кого-то уже был интернет в то время, Если уж совсем лезть в теории заговора, то он мог считывать информацию из сети и отправлять ее посредством ПЭМИ, в то время под подозрением были даже дроссели на ферритовых стержнях на материнской плате, а ЭЛТ-мониторы - те точно "фонили".
Сеть была локальная, по коаксиальному кабелю с терминаторами на концах сегментов (одноранговая, кажется, называлась, еще "кольцо" бывало). Сетевая плата - на шине ISA, код инициализации у меня и сейчас где-то есть, и прием-передача пакетов. Настраивал адрес FF:FF:FF:FF, чтобы принимать все пакеты. Когда кто-то работал на компьютерах, то в проскакивающих пакетах просматривались имена пользователей и паролей в открытом виде (нехорошо),
pda0
Я имею ввиду, что вы даже не установили, что пакеты именно word.exe отсылал, а не операционная система в ответ на какие-то действия ворда.
longtolik
Не понятно, на какую деятельность Word система должна посылать в сеть пакеты
pda0
Выше же писал. Word опрашивает принтеры. Word сканирует каталоги. Пути могут вести в сетевое окружение.
randomsimplenumber
Ну да, :)
lubagov
Я запускал Word 6.0 на Win 3.11 For Workgroups на i80386 SX 40MHz, и 2мб SIM памяти. Это жалкое жуткое зрелище, он запускался пол часа, ему мало 2мб. Хотя он конечно запустился во славу файлу подкачки, но это было настолько дико долго, и пользоваться им было нельзя. В целом у меня стояло 2 планки по 1мб, справедливости ради если добавить ещё две, то Word бы работал вполне прилично.
Хотя вообще сеть была, и она вполне была функциональна, в Win3.11 все что надо было, и уж не говоря о Windows NT3.51 в нем из коробки уже был стек TCP/IP.
Word 6.0 релиз 1993 года, а например Netscape Navigator в 1994, в тогда же появилась и ICQ на UDP правда.