Некоторое время назад мы начали дистанционно заниматься моб-программированием в нашей Meetup-Group (Bavarian Coding Group). После некоторого исследования и предложения сделать это с помощью совместного использования экрана или TeamViewer мы обнаружили новый (тогда еще) навык VS Code: Live Code Sharing.
Один человек открывает проект, другие подключаются, и каждый может печатать, а другие видят нажатия клавиш в реальном времени в своем редакторе. Совместное использование работало нормально.
tl; dr Для совместной работы над базой кода, синхронизированной в «реальном времени», синхронизация возможна только тогда, когда код находится в синтаксически и семантически правильном состоянии. Тесты подтверждают и то, и другое. Так что синхронизируйте только тогда, когда ваши тесты пройдут. Вы можете использовать Git вместе с bash-скриптом для автоматической синхронизации в фоновом режиме.
Увеличить масштаб
По мере продвижения мы решили распараллелить процесс написания тестов и реализации кода (это хорошее и забавное упражнение). При этом проблемы начинались всякий раз, когда тестировщики хотели выполнить тесты, исправления - когда вводил текст, что приводило к ошибкам компилятора, и наоборот. Мы явно синхронизировались и ждем друг друга, чтобы код пришел в правильном синтаксическом состоянии. Таким образом, совместное использование кода в реальном времени не может превышать двух или трех человек.
Синхронизировать только правильный код
Проблема с VS Code в том, что он синхронизирует каждое нажатие клавиши и, следовательно, неправильный синтаксический код. Политика для решения этой проблемы проста: Только код синхронизации, это правильно.
Что значит правильный? Во-первых, синтаксически правильно, а во-вторых, семантически правильно? Что такое семантически правильный код? Когда он проходит тесты. Когда тесты зеленые, наш код семантически и синтаксически правильный.
Реализация довольно прямолинейна:
result = testCode() if(result.positive) synchronize()
Эта логика заменяет (или дополняет) процедуру тестирования.
Синхронизировать через Git
Моя первоначальная попытка состояла в том, чтобы использовать rsync для метода synchronize()
. Но rsync не оптимизирован для исходного кода и, следовательно, имеет свои проблемы (например, слияние). К счастью, Кент Бек придумал свою статью Лимбо, за которой последовала Лимбо по дешевке, где он использовал Git вместо rsync. Вы можете себе представить, что Git работает с кодом лучше, чем rsync. Окончательное решение состоит из двух скриптов:
$ cat sync #!/bin/bash while true do git pull origin master git push origin master done
Вы выполняете это, когда начинаете кодировать и как только вы тестируете свой код:
./run_tests && git commit -am working
Идти дальше
Да. Всего два простых bash-скрипта. Вы даже можете представить, что выполняете вторые сценарии в цикле и используете средство запуска тестов для визуализации неудачных тестов и забудьте о двух циклах - они всего лишь инфраструктура.
$ cat testing #!/bin/bash while true do ./run_tests && git commit -am working done
Заключение
Я попробовал, и он отлично работает, особенно когда вы находитесь в виртуальной комнате со своими товарищами по команде, где вы можете разговаривать друг с другом.
Пример
Например, см. Здесь: Code-Sync: Stack Example