Hardcode. Хакер из преисподней (СИ), стр. 50
Я смотрел на этот зоопарк софта, и внутри мне становилось дурно. Мне ведь известны сквозные, бесшовные среды проектирования. Там конструктор, схемотехник и программист работали в едином облачном пространстве. Подвинул транзистор на 3D-модели — у теплофизика тут же пересчитали градиент температур, а у кодера автоматически обновился дескриптор периферии в микроконтроллере.
А сейчас настоящая задница. Бюрократия и процессы уничтожат любую задачу. Пусть у нас хоть трижды талантливый коллектив.
В принципе было бы очень даже неглупо написать сначала базовый продукт, выкинуть в open source без важных фич. Тогда, возможно, даже получится потянуть полноценный САПР. Особенно если залить денег. Та же грантовая система отлично поможет набрать энтузиастов.
Вечером, когда Иван Петрович ушёл домой, а Дима с Андреем уехали за очередной партией текстолита, я собрал софтверное ядро команды. Виталик расположился за своим столом, протирая очки и одновременно разминая шею. На экране моего ноутбука в скайпе висели два окна группового звонка.
Николай — тот самый матёрый системщик из мифов про айтишников, съевший собаку на низкоуровневых драйверах. Он у нас таганрожец. Из Минска смотрел в камеру бледный, невыспавшийся Алексей.
— Парни, есть идея, — начал я, разворачивая маркерную доску. — Мы тонем в рутине. Перенос данных из одного софта в другой сжирает половину времени. Нам нужна своя среда разработки. Единый САПР. Мы объединим в нём трёхмерное твердотельное моделирование, трассировку печатных плат, симуляцию тепловых и аэродинамических нагрузок и, самое главное, среду разработки прошивки. Всё в одном флаконе. Живой сквозной проект.
В скайпе повисла тяжёлая тишина. Первым её нарушил Николай. Из динамиков донеслось его глуховатое, прокуренное хмыканье.
— Командир, ты масштаб задачи представляешь? Ты хочешь скрестить Катю, Альтиум и Кейл. Над каждым из них институты десятилетиями работают. На каком железе ты это крутить собрался? Среднестатистический комп захлебнётся от одной только динамической перетрассировки платы в реальном времени, пока рендерится 3D-модель корпуса.
Виталик согласно закивал, преданно глядя на Николая.
— Да, шеф. Это же гигантские математические ядра. Матрицы плотности, уравнения Навье — Стокса для аэродинамики… Мы просто упрёмся в производительность процессоров. Про пассивную память я вообще молчу, ×32-системы вылетят по Out of Memory на первой же сложной сборке, — добавил Алексей.
Теоретически парни правы. Кто спорит? Только они рассуждали категориями архитектурных паттернов 2012 года. В эту эпоху индустрия разработки ПО переживала пубертатный период. Процессоры обзавелись несколькими ядрами, и программисты, дорвавшись до многопоточности, пихали её куда ни попадя. Под каждую чих-пых задачу плодились тяжёлые, независимые параллельные потоки, которые затем бесконечно воевали друг с другом за ресурсы. Оперативная память забивалась дублирующимися структурами данных, а синхронизация между ними превращалась в сущий кошмар из мьютексов и постоянных блокировок.
В моём же распоряжении был весь стек технологий из тридцатых годов. Я наизусть помнил элегантные алгоритмы иммутабельных структур данных, безналовые реактивные потоки и принципы распределённых вычислений, которые станут глобальным мейнстримом и золотым стандартом индустрии только лет через семнадцать-восемнадцать.
Но просто вывалить на них эти архитектурные чертежи в готовом виде было опасно. Николай и Алексей не были рядовыми формошлёпами, пишущими сайты на заказ. Это матёрые, прожжённые деды низкоуровневого софта, которые привыкли ковырять байты ногтями. Они мгновенно почуют неладное, если молодой программист выдаст им фундаментальную парадигму, до которой мировая компьютерная наука ещё физически не дозрела. В лучшем случае меня посчитают шпионом какой-нибудь зарубежной корпорации. Поэтому действовать нужно было ювелирно. Пришлось спешно натягивать маску самоучки.
— Смотрите, — я подошёл к доске и начал быстро набрасывать схему, стараясь, чтобы маркер скрипел тихо, без удара по нервам. — Нам не нужно тащить за собой старые движки. Мы не будем использовать стандартное полигональное представление для тяжёлого 3D. Мы напишем ядро на функционально представленных геометрических объектах. Слышали о таком? Математическое описание формы через функции трёх переменных. Это сократит потребление памяти под геометрию в сотни раз. Вместо миллионов полигонов — чистая математика.
В окошке Минска Алексей резко подался вперёд, чуть не сбив стоявшую перед ним чашку с кофе.
— Погоди… Если описывать твёрдое тело аналитически, то пересечения, вырезы и скругления — это просто логические операции над функциями. Довольно годно для оптимизации. Для этого не нужны гигабайты ОЗУ.
— Именно. Математики всё придумали за нас, и можно спокойно пользоваться, не изобретая велосипед, — подхватил я, чувствуя, как заглатывается наживка. — А теперь главное. Как связать это с прошивкой Виталика? Мы сделаем микроконтроллер софтверно-зависимым от геометрии. Внутри САПРа будет крутиться легковесный компилятор. Виталий пишет код, например, для фильтра Калмана. САПР знает физические параметры платы из геометрического ядра. Ёмкость дорожек, массу луча, на котором стоит датчик. И компилятор на лету подставляет эти физические константы прямо в регистры ассемблера при сборке бинарника.
Виталик выронил маркер, который крутил в руках.
— То есть мне не нужно будет пересчитывать тайминги под новую ревизию платы? Софт сам поймёт, что дорожка до гироскопа стала длиннее на три миллиметра и ёмкость изменилась?
— Сам поймёт, — твёрдо сказал я. — Николай, по твоей части: чтобы всё это не тормозило, мы откажемся от стандартной потоковой модели Windows. Сделаем модульную архитектуру на основе ориентированных ациклических графов. Алексей, ты под это дело соберёшь нам кастомное ультралёгкое графическое ядро на OpenGL, которое будет задействовать текстурные шейдеры для параллельного просчёта тепловых матриц. Графика сама посчитает тепло, понимаешь? Зачем нам грузить центральный процессор, если у нас есть видюха?
На другом конце провода в Таганроге Николай молчал минуты две. Он закурил сигарету и сделал несколько затяжек. Было слышно, как он тяжело дышит и зачем-то чиркает зажигалкой. Архитектура DAG-графов в связке с шейдерными вычислениями неграфических задач для 2012 года была концептом на грани фантастики, который только-только зарождался в закрытых лабораториях.
— Ну, ты и Кулибин! — наконец воскликнул Николай. — Если мы жёстко зафиксируем тайминги периферии и пустим расчёт геометрии через функциональные зависимости, то, может, и взлетит. Но летать должно даже на паршивом Core i3.
Алексей в Минске сразу яростно застучал по клавиатуре.
— Я сделаю микроядро для этой штуки, — быстро заговорил он, не глядя в камеру. — Выделю под графический конвейер отдельный изолированный контекст. Если мы правильно организуем передачу указателей через разделяемую память, у нас отклик интерфейса будет субмиллисекундный. Никаких фризов, как в Автокаде.
— Отлично, — я выдохнул, чувствуя, как со лба катится капля пота.
Кажется, пронесло! Никто не спросил, откуда у парня из забытого НИИ готовая, идеально сбалансированная архитектура софта будущего. Списали на гениальность или, скорее всего, на случайность.
— Виталик, на тебе верхний уровень интерфейса и интеграция компилятора. Николай — низкоуровневая оптимизация DAG-графа и работа с памятью. Лёша — графический движок и шейдерные вычисления.
Я стёр рукавом схемы с доски, пока их случайно не увидел Иван Петрович. Старик со своим колоссальным опытом советской оборонки сразу бы понял, что такая стройная и глубокая концепция не рождается в голове одного человека за пару дней. Ему-то я подам это позже как удачную оптимизацию для экономии бюджета.
Четыре дня прошли в повышенной суете, если можно так выразиться. Инженеры постоянно спорили об итогах испытаний, затем резко впадали в рабочий раж. Тут ещё возмутился Петрович. Конструктора не устроило, что я перекинул Виталия на другой проект. Возмущение старика понятно: нагрузка увеличилась, ещё ему самому пришлось основательно попахать за компьютером. Ничего страшного. С него не убудет, а основная часть задачи всё-таки выполнена. Осталось много неприятной мелочёвки, но тем не менее. Поэтому товарищу культурно отказали.
