class: center, middle description: Є такий стародавній підхід до розробки - read-eval-print loop. Кожна друга мова програмування рекламує свій шел як REPL. Спойлер: це не правда, але вони просто не знають, як повинно бути. Ask for more! Давайте поглянемо, що воно таке насправді. :-) # REPL .meta[
Alexander Solovyov
CTO @ Kasta
] --- class: center, full-height background-image: url(img/me-in-dorm.jpg) # .left[2004] ??? На фото - я в 8 общаге в конце 2004-го, за месяц-два до Оранжевой революции, на 3 курсе, модератор NNTP (это такой вид форумов для тех, кто застал жизнь без веба) группы npu-kpi.comp.software. NNTP в КПИ был очень популярен, потому что интернет был медленный и дорогой, а внутренняя сеть была очень большой. --- class: center
??? Я пользовался slrn (а не tin'ом, холивар!) и написал себе набор скриптов на перле, которые форматировали сообщения для выставления штрафов и в MySQL трекали сумму набранных баллов. Это моя первая полноценная программа, если не считать лаб и курсовых в универе. :) --- class: center # 2005
??? Мой друг Юра Сазонец написал свой набор скриптов для модерации, для Gnus'а, программы чтения ньюсов в Emacs'е. Он очевидно круче работал, и так я познакомился с Емаксом - после 3 лет ви. :) Емакс, очевидно, был переворотом сознания: это вроде и редактор, но и одновременно интерактивная среда, которая большей частью написана на том же языке, на котором предполагается кастомизация. И это позволяет вытворять совершенно безумные вещи, которые человеку, не знакомому с происходящим, не прийдут в голову никогда. У Саймака есть книга "На Юпитере", про то, что люди превращались в юпитерианское животное, чтобы посмотреть на Юпитер и вернуться с рассказом, но никто не возвращался. Никто не хотел обратно становиться человеком после того, как побывал в таком облике. С Емаксом ситуация похожая. :) --- class: center # 2008
??? К 2008 году я уже пошёл работать программистом и как-то оказалось, что Емакс - это странное отвлетвление прогресса, и на самом деле ты не можешь по чуть-чуть растить свои программы в своём IDE. Релоад хттп-сервера выбрасывает всё состояние, если третья форма отрендерилась неправильно из-за данных из первой, начинай путь сначала, перепроверить изменённый ЖС-хендлер можно только релоадом страницы и наклацыванием состояния. Грусть. В то же время я использовал (и дорабатывал) jabber- и irc-клиенты в емаксе, и экспириенс разработки был совершенно другой, конечно. Хотя писал я всё на питоне, который тоже имеет REPL, как в лиспе. Ну или шелл, как ни назови. --- class: middle, center
??? Разработчики Джанги старались, как могли разработчики, которые писали на пайтоне. Шелл подгружал всякие хелперы, все его импрувили, и всё такое. --- # Execute, fix, rince and repeat ```python $ make shell >>> from project.package import models >>> models.call_something() Exception >>> ^D # повторить, пока не заработает ``` ??? Питон умеет перезагружать модули, но из-за накапливаемого в объектах и в глобальных переменных и того, как построены проекты на питоне - релоад нормально не работает. Всякие фласки и джанги на релоаде выбрасывают всё состояние, что могут и импортируют всё заново, и это обычно работает, но иногда ломается. Эксперименты в шелле в то же время все обычно делают выходом и входом и накоплением состояния опять. --- # REPL ## .center[`(loop (print (eval (read))))`] * Изучение * Эксперименты * Тесты * Дебаг и исправления --- class: center, middle # JAVASCRIPT CONSOLE?! ??? Это как `Console` в девтулзах браузеров, только хорошо. Консоль это тоже хорошо, по сравнению с языками, где её нет, конечно, но цель моя - рассказать, как бывает совсем хорошо. --- class: center, middle # КАК БЫ НЕ ТАК! ??? Это ж тупо как шелл в питоне. Ваш редактор коннектится к соплям папы карло, а не к консоли джаваскрипта. --- class: center, middle # Изучение ??? С изучением в принципе везде одинаково - разве что в JS в шелле доку не почитаешь. --- class: center # Дополнение
--- class: center # Документация
--- class: center # Исходный код
--- class: center, middle # Эксперименты ??? Внезапно, тема экспериментов сильно шире, чем то, что предлагают нам шеллы обычных языков. Нормальная для меня ситуация - когда я пишу функцию на кложе, я её части исполняю, чтоб посмотреть, что результат ожидаемый. Более того, когда я функцию дописал/изменил, я её тоже могу отправить в репл и она заменит собой текущую имплементацию, в результате меняя поведение всей программы. --- class: center # Возможность исполнить отдельное выражение
--- class: center # Редактор, подключенный к реплу
--- class: center # Репл, подключенный к программе
--- class: center # Изменения программы на лету
--- class: center, middle # Тесты --- class: center # Результаты экспериментов переносятся в тесты
--- # Тесты * Код, который легко тестировать * Не TDD, а DDT ??? В результате того, что разработка с REPL'ом обычно выглядит итеративно, bottom up, и эксперименты легко перенести в тесты, и программа складывается из кусочков, которые хорошо подходят для тестирования. Не Test-Driven Development, а Development-Driven Testing --- class: center
??? Интересно, что программа управления Deep Space 1 была написана на Common Lisp'е (LispWorks), и получила награду `NASA Software of the Year 1999`. За то, что в процессе полёта благодаря REPL'у удалось идентифицировать причину проблемы и починить её. > Drifting off course several light-minutes away from Earth --- # Figwheel * figwheel.org * REPL для ClojureScript * Live Reload для ClojureScript * Life-changing опыт ??? Не хочется забыть упомянуть Figwheel, который вырос из того, как обычно на функциональных языках разрабатывают. Это проект, который даёт REPL из редактора прямо в браузер, так что можно менять поведение SPA, и заодно следит за изменениями файлов и апдейтит код в браузере сам. У ЖС, несмотря на то, что это в теории должно работать, на практике классы, состояние в разных неожиданных местах и вообще общий подход делают сложным работу обновления по живому. Более того, долго этим назывался автоматический релоад страницы после изменения файла. TODO: вставить видео фигвила --- class: full-height background-image: url(img/figwheel-main-demo-image.png) --- # Ссылки * http://vvvvalvalval.github.io/posts/what-makes-a-good-repl.html * https://vimeo.com/230220635 * https://www.youtube.com/watch?v=Ngt29DyNDRM * https://en.wikipedia.org/wiki/Deep_Space_1#Remote_Agent * https://figwheel.org