Никита Прокопов (tonsky) wrote,
Никита Прокопов
tonsky

Category:

Clean не нужен

Когда-нибудь задумывались, зачем в билд-системах команда clean? То есть, понятно, почему она в них была, но почему она до сих пор есть? Почему иногда билд собирается только с чистого листа?

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

Единственная вещь, которая идеально кэшируется это неизменяемые данные. get_cached(file_name) будет ломаться, get_cached(digest(file_content)) нет. Естественно, туда можно (нужно) еще всего напихать, типа окружения, версии компилятора, флагов, цели. Но смысл в том, что кэш по контенту работает сам, успевай только мусор подбирать. Главное — корректность.

Это подтверждает успех гуглового Bazel: ненадежные билды на makefiles вдруг стали железно надежными, стоило им перейти на такую схему. Это может быть и было дорого на 386-х, но сейчас один фильм на диске весит столько, сколько ваши разработчики не нагенерируют артефактов за все время жизни проекта.

Я очень жалею, что в ClojureScript не используется подобная схема, хотя казалось бы, кому, из всех людей. (Clojure здесь ловко выкрутилась — грузит файлы из исходников на лету). Билды портятся, приходится стирать и начинать все заново. Я не хочу ничего знать об этом, компьютер вычислительная машина, он должен работать надежно и предсказуемо. Билд это не гадание на нейронных сетях, вход, выход, алгоритм, все детерменировано. Избавьте меня.

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

Ладно мы, динамщики, у нас билды недолгие, единственно противно что ломаются при рассинхроне. Но все вот эти ребята, которые на C++ игры пишут и у которых ночной «чистый» билд по шесть часов, они как до сих пор к этой схеме не пришли? Это же классическое «лучше день потерять». Причем даже терять много не придется, система простая как тряпка. Зато окупаемость, о, мне сложно представить ее масштабы.

В идеале, конечно, понятия билда вообще не должно существовать. Билды не имеют отношения к работе программиста, это просто формальный, неудачный шаг. Зато их отсутствие целый пласт проблем снимает. JS, Python, Clojure все делают правильно. Но если уж делать билд, непонятно, почему не сделать его надежным и правильным. Таким, чтобы не было отдельного понятия «инкрементальный билд», чтобы любой билд был инкрементальным, быстрым, с распределенным кэшем. И чтобы я больше ничего о команде clean не слышал.
Tags: девелопмент, инструментарий, мир будующего, неонка included, очень просто, формула успеха
Subscribe
  • Post a new comment

    Error

    default userpic
    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 43 comments