Ученый позволяет вам провести рефакторинг вживую

Одна из самых больших проблем сегодня – это работа с живым кодом. Теперь у команды 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 важно то, что он может заставить других программистов задуматься о том, как можно делать подобные вещи. Возможно, мы сможем сделать это больше похожим на строительство параллельного моста, прежде чем снести старый.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *