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


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


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