Одна из самых больших проблем сегодня — это работа с живым кодом. Теперь у команды Github есть очень умный инструмент, который позволяет легко вносить и оценивать изменения в реальном коде так же, как вы можете заменить мост.
Идея состоит в том, что если вы собираетесь заменить мост, вы не будете его разрушать и строить новый, вы должны построить новый рядом со старым и переключиться на использование нового моста только тогда, когда это будет доказано.
Это не совсем идея Scientist — библиотеки Ruby для тщательного рефакторинга критических путей — но это общая мотивация. Это также связано с более старой и не очень известной идеей: BranchByAbstraction. Это шаблон разработки программного обеспечения, который упрощает рефакторинг путем постепенной замены одного модуля другим. Опять же, сходство не идеальное, и во многих отношениях Scientist является более прагматичной реализацией идеи контролируемой замены одного модуля другим.
Библиотека написана на Ruby, потому что большая часть инфраструктуры GitHub основана на Ruby и предназначена для ее рефакторинга и обновления.
Использование библиотеки «мило» с точки зрения ее жаргона — все основано на науке. Предположим, у вас есть альтернативная реализация метода, который вы пытаетесь внедрить поэтапно. Вы можете сделать это, используя такой код:
требуется «ученый»
класс MyClass
def метод (данные)
эксперимент = Ученый :: Default.new «myExperiement»
эксперимент.use {method1 (data)} # старый способ
эксперимент.попробуй {метод2 (данные} # новый способ
эксперимент. запуск
конец
конец
Ключевая идея состоит в том, что вы оборачиваете «использование» вокруг исходного поведения и «пробу» вокруг нового поведения. На «научном» жаргоне использование называется контролем, а попытка — кандидатом.
Результатом эксперимента всегда является то, что возвращает блок использования, но также выполняется блок попытки. Метод Experiment.run многое делает за кулисами:
Он решает, запускать ли блок try,
Рандомизирует порядок, в котором запускаются блоки use и try,
Измеряет продолжительность всех форм поведения,
Сравнивает результат попытки с результатом использования,
Проглатывает (но записывает) любые исключения, возникающие в блоке try,
Публикует всю эту информацию
Еще многое предстоит узнать. Вы можете указать, какие результаты используют контекстный метод и хэш, определяющий данные. Вы также можете опубликовать результаты, реализовав метод publish (result), и обработать данные любым удобным для вас способом. Убедившись, что эксперимент работает, вы можете просто снять строительные леса и начать использовать новый код.
Вы можете увидеть немного устаревшее описание того, как система была построена и использовалась в видео ниже:
Конечно, проблем много, и это не полное излечение. Если новый код имеет какие-либо побочные эффекты, такие как запись в базу данных или изменение состояния системы каким-либо образом, то параллельное выполнение старого и нового не так безопасно.
В Scientist важно то, что он может заставить других программистов задуматься о том, как можно делать подобные вещи. Возможно, мы сможем сделать это больше похожим на строительство параллельного моста, прежде чем снести старый.