Некоторое время назад мы начали дистанционно заниматься моб-программированием в нашей 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