В этом выступлении я объясняю мотивы использования ОТВЕТА, а также где и как его можно использовать. Выступление в основном представляет собой живую демонстрацию.
Вот слайды в формате keynote , формат ppt (непроверенный!) и Слайд-шоу (каким-то образом сломано!) .
и || Слайд-шоу (каким-то образом сломано!)
и || Слайд-шоу (каким-то образом сломано!)
Всем привет, я Даниэль Лебреро, спасибо, что пришли, и сегодня мы здесь, чтобы поговорить о разработке, основанной на REPL.
Но прежде чем мы начнем, я должен кое в чем признаться.
На моей самой первой работе в качестве разработчика мне пришлось работать с тремя технологиями, которые оказали глубокое и длительное влияние на мою карьеру разработчика.
Этими тремя технологиями были Netscape, Internet Explorer 4 и Internet Explorer 5.
Благодаря этим трем технологиям я решил стать серверным разработчиком, избегая какой-либо работы с интерфейсом в течение многих лет. И я был очень счастливым Java-разработчиком, живущим в мире XML и JSON.
Но в недавнем проекте мне снова пришлось работать с командой front-end, и я должен признаться, что с того дня, с того проекта, я на самом деле очень-очень завидую разработчикам front-end, вплоть до того, что я рассматриваю возможность стать одним из них.
Вы можете задаться вопросом: “Вау, разве это не безумие?”
Может быть, JavaScript, который использовали эти разработчики, как-то отличался от JavaScript I, который мне пришлось изучать и страдать 20 лет назад?
Вы знаете, Javascript развивается, но это потому, что это все тот же JavaScript.
Может быть, они исправили все те несовместимости между браузерами, которые раньше сводили меня с ума?
Кажется, что это не так, кажется, что они есть, а теперь со всеми телефонами и планшетами еще хуже.
Чтобы действительно понять, почему я так завидую интерфейсным разработчикам, давайте посмотрим на мою фотографию, на которой я выполняю какую-то интерфейсную работу.
Это я пытаюсь заставить макет с двумя столбцами работать в Internet Explorer и Opera; и, как вы можете видеть, у меня это не очень хорошо получается, и как бы я ни старался, и я стараюсь, и я стараюсь, результат всегда один и тот же: это просто большая куча дерьма.
Но даже если CSS вообще не имеет никакого смысла, на этой картинке есть что-то действительно приятное, что-то действительно мощное. Итак, давайте посмотрим на это еще раз.
Сосредоточьтесь на рабочем процессе мистера Гриффина.
Посмотрите, как он тянет за веревочку в одном направлении, и он сразу видит, без какой-либо задержки, каков результат на блайнде. И ему это не нравится, он просто дергает за ниточку в другом направлении. И он продолжает делать это, пока не закончит.
И он продолжает делать это, пока не закончит.
Мы знаем из agile, scrum и lean, что циклы обратной связи очень важны, но почему эта немедленная обратная связь так важна для нас?
Потому что без этой немедленной обратной связи очень трудно попасть в поток или зону.
Поток – это то состояние, в котором вы чувствуете себя Нео, когда он осознает, что он Избранный.
Когда вы находитесь в потоке, вы настолько сосредоточены, что реальный мир исчезает и заменяется вашим кодом, его дизайном и данными, проходящими через него.
Когда вы находитесь в потоке, ни одна проблема не является достаточно сложной, ни одна ошибка не может скрыться от вас, а ваши решения чисты, просты и элегантны.
Когда вы находитесь в потоке, вы наиболее продуктивны, и дело не в том, что вы просто производите больше, то, что вы производите, имеет лучшее качество.
Но эта производительность – всего лишь приятный побочный эффект пребывания в потоке. То, что мы действительно ищем, – это это чувство радости, это чувство достижения, это чувство создания чего-то прекрасного.
И именно из-за этого чувства я, спустя 20 лет, все еще являюсь разработчиком программного обеспечения.
И именно из-за этого чувства я, спустя 20 лет, все еще являюсь разработчиком программного обеспечения.
звучит знакомо? Вот как мало нужно, чтобы вытолкнуть вас из потока.
И мы, разработчики серверной части, являемся экспертами в такого рода сбоях.
Атрибуция изображения: Атрибуция изображения: .
Мы делаем это постоянно, и мы думаем, что они неизбежны, у нас даже есть комиксы об этом.
Но, вероятно, мы смеемся над этим, потому что, возможно, не знаем, чего стоит одно прерывание, выход из потока.
Есть пара исследований, в которых они пытались количественно определить, что это такое Есть пара исследований, в которых они пытались количественно определить, что это такое
Есть пара исследований, в которых они пытались количественно определить, что это такое
Есть пара исследований, в которых они пытались количественно определить, что это такое Есть пара исследований, в которых они пытались количественно определить, что это такое
Есть пара исследований, в которых они пытались количественно определить, что это такое И если ваши перерывы длятся более 10 секунд, вполне вероятно, что в конечном итоге вы будете играть со своим телефоном, или просматривать новости, или просматривать свои социальные сети.
И кто здесь может собрать, скомпилировать, запустить среду выполнения за одну секунду или меньше?
Во время подготовки этой презентации в качестве теста я создал новое приложение Tomcat, используя совершенно новый архетип компании, и я просто подсчитал, сколько времени потребовалось проекту для создания и запуска. В проекте был один контроллер, у которого ничего не было, и один тест, который ничего не делал.
Кто хочет угадать, сколько времени потребовалось Tomcat, чтобы запустить пустое приложение? В моем случае это было 30 секунд, так что это 30 секунд – большой срок или 30 секунд – разумный промежуток времени?
Итак, давайте подумаем в течение 30 секунд о 30 секундах. Ладно, ты готова?
(30-секундная пауза)
Это были 30 секунд, и я не знаю, что я чувствовал к вам, но для меня, стоящего здесь перед всеми вами, это были очень долгие 30 секунд, и мы делаем это постоянно.
И лучше от этого не станет, верно? По мере того, как мы добавляем больше тестов, больше кода, ситуация будет становиться все хуже, хуже и хуже.
Но мы это знаем, так что, вероятно, если вы хотите сохранить продуктивность, вы уже следуете совету этого очень мудрого человека:
Не запускайте Tomcat. Не запускайте Tomcat.
итак, что вы делаете: вы не запускаете свое приложение. Что вы делаете вместо этого, вы полагаетесь на хороший набор модульных тестов, чтобы узнать, добиваетесь ли вы прогресса и знаете, не нарушили ли вы что-нибудь.
И помните, что хороший набор тестов должен выполняться за 10 секунд или меньше, если вы не хотите терять фокус.
Если вы занимаетесь TDD достаточно долго, вы, вероятно, знаете, что у TDD есть некоторые недостатки, поэтому давайте рассмотрим их.
Кто может сказать мне, что общего у насмешек, заглушек, подделок и шпионов?
Что такое насмешки? Насмешки – это просто ложь.
Что такое подделки? Все это просто ложь, верно?
Это ложь, которую мы создаем, чтобы наш набор тестов был действительно быстрым, чтобы наш рабочий процесс был нормальным, но это просто ложь.
Они не настоящие. Теперь, я думаю, мы не можем избежать их, но чего мы действительно хотим, так это достоверной лжи.
Мы хотим создать наши макеты, чтобы они вели себя как настоящие. Но как вы можете это сделать?
Но как вы можете это сделать? И как вы это делаете?
Что ж, если вы разговариваете с базой данных, единственный известный мне способ – это зайти и порыться в базе данных, посмотреть, какие там таблицы, какие столбцы, каков возможный диапазон значений в этих столбцах.
Если вам нужно интегрироваться со сторонней конечной точкой HTTP restful, единственный известный мне способ – пойти туда и потыкать в эту штуку.
И TDD не дает нам никакого инструмента, чтобы иметь возможность пойти и понять, как работает реальный мир, так что мы можем пойти и поиздеваться над вами.
Я занимаюсь TDD уже 16-17 лет, и одна вещь, которую я усвоил, заключается в том, что независимо от того, сколько у вас тестов, каков охват вашего кода является
они всегда, всегда какие-то жучки.
Вы запускаете эту штуку, возможно, ваша конфигурация отсутствует или неверна. Возможно, ваша проводка Spring не совсем совпадает с вашим модульным тестированием.
Так что у вас всегда будет такая ситуация, и TDD снова ничего вам не даст, когда он сломается.
- Мы хотим написать код и получить немедленную обратную связь.
- Мы не хотим сидеть и ждать, пока произойдет сборка и развертывание.
- Нам нужны инструменты для понимания реального мира,
- Таким образом, у нас может быть простой способ создания правдивой лжи.
- И мы не хотим никаких сюрпризов при запуске приложения.
И какой инструмент мы можем использовать, чтобы получить все эти вещи? Вы не удивитесь, если ОТВЕТИТЕ, что это возможный инструмент.
REPL расшифровывается как read, eval, цикл печати, и мы все, вероятно, использовали
REPL расшифровывается как read, eval, цикл печати, и мы все, вероятно, использовали Читает вашу команду, затем вычисляет, запускает ее, а затем выводит результат, а затем выполняет цикл, возвращаясь к чтению, чтобы вы могли ввести другую команду.
По сути, ОТВЕТ – это то же самое, с той лишь разницей, что вместо написания команд Unix мы собираемся писать
Итак, мы собираемся сделать демо, и то, что будет делать демо, это:
Мы собираемся использовать Maven для запуска Tomcat, Tomcat запустит наше приложение, нашу войну, а внутри войны мы собираемся запустить REPL внутри нашего приложения.
Теперь, поскольку вводить что-то на этом действительно маленьком экране действительно громоздко, ОТВЕТ, вместо чтения со стандартного ввода, будет прослушивать сокет, а затем из нашей любимой IDE мы просто подключимся к этому сокету, и мы собираемся пишите код там, где мы всегда пишем код в вашей IDE. Мы будем использовать ярлык для отправки кода в приложение. Код будет запущен внутри приложения, а затем мы получим обратно результаты, которые будут напечатаны в нижнем окне.
Хорошо, я собираюсь сделать демонстрацию в Clojure.
Clojure – прямо сейчас мой любимый язык. Clojure – это lisp для JVM, и суть презентации не в Clojure, поэтому я не ожидаю, что кто-то поймет какой-либо код, и я не собираюсь объяснять какой-либо код, поэтому единственное, что я хочу, чтобы вы сделали, это сосредоточились на рабочем процессе, о том, как с помощью REPL мы выполняем всю задачу и
Итак, одна из причин получить ОТВЕТ – это иметь возможность выучить язык. Итак, одна из причин получить ОТВЕТ – это иметь возможность выучить язык.
(Демонстрационное начало мин. 12:25, пропустите его )
Итак, самое первое, что мы собираемся сделать, – это запустить приложение. Итак, это первое, что нужно сделать, если у вас есть хороший ОТВЕТ, прежде чем даже писать или думать о том, что вы собираетесь написать, самое первое, что вы делаете, это запускаете приложение.
Обычно это самый медленный этап всего рабочего процесса и обычно занимает около 30 секунд или около того. Теперь это то, что вы будете делать раз в день, или, может быть, раз в неделю, или раз в месяц. Это зависит от того, как часто вам нужно менять проекты. Вы будете стараться поддерживать его в рабочем состоянии все время.
Итак, то, что мы собираемся создать, – это небольшое приложение restful, которое будет отправляться в базу данных, получать некоторые транзакции для пользователя, и оно будет выполнять своего рода сводку, и оно будет предоставлять это на конечной точке HTTP.
Базовый рабочий процесс с ЗАМЕНОЙ
Итак, мы собираемся изучить совсем немного Clojure, но это для того, чтобы вы привыкли к тому, что я буду делать все время.
Итак, в Clojure все – это список, это шепелявость.
Итак, первое, что есть в списке, – это функция, которую вы хотите вызвать, а затем ноль или более параметров.
Я собираюсь нажать волшебный ярлык и отправить этот конкретный фрагмент кода в Tomcat, и Tomcat вернет мне ответ. Итак, вы видите здесь, что я отправил и получил тройку обратно.
Вопросы? Ясно? Потому что я собираюсь делать это все время.
Итак, предположим, что вы хотите узнать немного больше о плюсовой функции: что произойдет, если вы передадите три параметра плюсовой функции? Вы просто пишете код, запускаете его и видите, что Clojure позволяет вам это делать. Что произойдет, если вы просто передадите один параметр функции plus? Это тоже работает. Что произойдет, если вы не передадите никаких параметров? Он возвращает ноль. Что произойдет, если вы передадите очень длинное значение? Кажется, это работает. Давайте перейдем к более длинному значению: оно выдает исключение arithmeticexception.
Итак, то, что мы здесь делаем, – это просто попытка понять, как работает функция plus. И как мы это делаем? Мы вносим небольшие изменения, мы пишем небольшие программы, запускаем каждую из них и сразу видим результат.
Точно так же, как мы делаем это с функцией plus, которая является частью основного языка, вы можете делать это с абсолютно любой библиотекой, которую хотите изучить.
Этого достаточно для Clojure.
Тестирование конфигурации при ЗАМЕНЕ
Итак, теперь мы собираемся создать приложение по-настоящему. Опять же, мы собираемся перейти к базе данных, и для данного клиента мы получим список всех его транзакций, и мы собираемся сделать что-то очень простое, чтобы суммировать все эти транзакции.
Первое, что я хочу сделать, это просто подключиться к базе данных, просто проверьте правильность нашей конфигурации базы данных. И чтобы сделать это, мы просто пытаемся запустить выберите один из двух
.
И если вы знаете Java, это говорит вам о том, что для Postgres нет подходящего драйвера, поэтому, если я зайду в свой pom, мы увидим здесь, что я забыл его раскомментировать. И обычная вещь, которую вы сделаете, – это раскомментируете зависимости и перезапустите JVM, чтобы посмотреть, работает ли это.
Но вместо этого JVM может загружать код из любого места и может делать это во время выполнения, поэтому мы просто говорим JVM, пожалуйста, перейдите в Maven, загрузите все зависимости для драйвера Postgres и просто установите его. А потом мы просто попробуем это снова.
Кажется, что мы получаем еще одно исключение, но это другое, база данных не существует. И это потому, что я допускаю небольшую опечатку, мы исправляем ее, даем еще одну попытку, и теперь мы подключены к базе данных.
Так что же мы делаем? мы в основном тестируем нашу конфигурацию. Я не знаю, как вы это делаете, но для меня это обычно очень болезненно, потому что, когда вам нужно тестировать такие вещи, как конфигурация, вам приходится постоянно перезапускать JVM, чтобы проверить, работает ли он, находит ли он файлы конфигурации, если он их не находит, если вы вводите учетные данные правильно это или нет, но здесь мы можем сделать это интерактивным способом.
Изучение базы данных
Теперь мы собираемся исследовать реальный мир. Допустим, мы знаем базу данных, в которой хранятся данные, но мы не знаем, что находится внутри базы данных, поэтому я обычно открываю что-то вроде Oracle SQLDeveloper, а затем я бы ввел учетные данные, а затем я начну навигацию и посмотрю в пользовательском интерфейсе, чтобы увидеть, что находится в там.
Но вместо этого мы собираемся сделать следующее: используя API метаданных JDBC из Tomcat, мы просто будем запрашивать базу данных, ища все таблицы, начинающиеся с “transac”. Здесь мы видим, что Postgres возвращает нам три объекта, три карты. Вместо того, чтобы печатать его таким образом, потому что его немного сложно читать, и потому что мы находимся на JVM, мы просто напишем функцию, чтобы напечатать ее более табличным способом, так что
Вместо того, чтобы печатать его таким образом, потому что его немного сложно читать, и потому что мы находимся на JVM, мы просто напишем функцию, чтобы напечатать ее более табличным способом, так что
Теперь мы понимаем, что есть две валюты, так что, вероятно, если вы хотите правильно подвести итог, нам нужна какая-то иностранная валюта. Итак, мы идем к нашему архитектору и просим его, чтобы у нас была такая проблема, у меня есть евро в одной стороне, фунты в другой, что нам делать? Он говорит: ну, у нас где-то есть конечная точка restful, которую вы можете нажать, и это даст вам обмен на форекс. Итак, он дает нам URL-адрес, и мы просто собираемся ткнуть в его restful.
Код HTTP-клиента, по одному биту за раз
Код HTTP-клиента, по одному биту за раз Код HTTP-клиента, по одному биту за раз Это 400, и если мы посмотрим на корпус, там будет написано что-то вроде того, что дата отсутствует.
Итак, давайте добавим его в параметры нашего запроса, попробуем еще раз, теперь мы видим, что в теле содержится некоторый JSON. Мы на правильном пути, так что давайте просто извлекем тело, которое выглядит хорошо, и давайте проанализируем JSON, и все.
Посмотрите на то, что мы делаем, посмотрите на поток, мы пишем один маленький фрагмент кода, и мы немедленно запускаем его, и мы видим результат, и мы делаем это для каждого маленького шага.
Теперь мы, вероятно, хотим проверить, есть ли у нас старые данные? Похоже, у нас есть данные. А как насчет данных, которые очень-очень старые? С тех пор у нас нет данных до 1970 года. Что произойдет, если по какой-то причине мы запросим данные в будущем? У нас есть данные в будущем, это очень интересная функция. А что произойдет, если мы передадим строку? Мы получаем сообщение об ошибке, в котором говорится, что данные должны быть длинными.
Итак, мы исследуем, как это работает, и теперь, например, мы знаем, как выглядят ошибки, так что теперь мы можем пойти и построить нашу логику вокруг обработки ошибок.
Генерация кода для хранимых процедур
Теперь, когда вы создаете это, приходит ваш руководитель группы и говорит: ну, в базе данных уже есть какой-то сохраненный процесс, который будет выполнять всю эту логику за вас, так что не обращайте внимания на архитекторов. Они ничего не знают.
Итак, что вы собираетесь делать, это точно то же самое, что и раньше, мы собираемся запросить базу данных через JDBC API, какие у нас есть хранимые процедуры, которые содержат слово “trans”. И мы видим, что у нас есть “transcations_in_gbp”. Итак, давайте еще раз взглянем на то, что представляет собой этот хранимый процесс. Итак, мы видим, что он возвращает курсор, и для этого требуется клиент
Итак, теперь, когда мы знаем, что ожидает сохраненный proc и что для этого требуется, мы могли бы написать наш код, но вы знаете, что клиентский код JDBC – это просто ад, но то, что мы делаем здесь в конце дня, – это просто печать этой вещи в виде таблицы, но почему мы нужно распечатать его в виде таблицы? Мы также можем распечатать его в виде фрагмента кода.
(def-proc transactions-in-gbp "transactions_in_gbp" [:return Types/OTHER :return-value] [:in Types/BIGINT :clientid])
Поэтому я распечатал его как фрагмент кода, скопировал, вставил в наш файл, и теперь мы можем попробовать. Работает ли это? Кажется, это работает. Что произойдет, если я передам несуществующий клиент? Никакой ценности. Что произойдет, если я передам нулевое значение? Что произойдет, если я передам строку? Исключение.
Почему не разработчик SQL или почтальон? Почему ОТВЕТ для исследования?
Итак, мы просто копаемся, чтобы понять, как все работает, но вы можете задаться вопросом, почему это лучше, чем использование Oracle SQL developer, верно? Это специфичный для SQL инструмент.
Что это за фрагмент кода, который мы только что сгенерировали? Это наш первый фрагмент производственного кода. Это производственный код. Если бы вы использовали SQL Developer, мы бы знали, что делать, но теперь нам придется продолжать вводить код, чтобы иметь возможность вызывать базу данных, и этот код вам нужно будет протестировать, потому что вы на самом деле не знаете, работает он или нет.
Но насколько вероятно, что этот сохраненный процесс, когда мы его развертываем при запуске в приложении, завершится сбоем? Что это не работает? Если вы подумаете об этом, каждый раз, когда мы оцениваем, каждый раз, когда мы отправляем фрагмент кода в ОТВЕТ, мы отправляем его внутри Tomcat, так что в основном то, что мы делаем, – это развертывание фрагмента кода в Tomcat, так что очень маловероятно, что этот код не работа.
Я не объяснял этого, но где мы вносим эти изменения? Файл, который мы редактируем, не является специальным местом, это файл проекта. Как только мы закончим работу, мы просто зафиксируем этот файл как есть. Нам не нужно копировать этот код в другое место. Это производственный код, он находится в правильном месте.
Еще одна причина, по которой вы хотели бы использовать ОТВЕТ вместо SQL Developer или Postman, заключается в следующем … Сколько людей знают, как выполнить цикл for? Все знают, как выполнять цикл for. Сколько людей знают, как выполнить цикл for в Postman? Мне сказали, что это возможно. Мы делаем зацикливания весь день, верно? Если у вас есть ОТВЕТ, у вас есть целый язык, ваш производственный язык, это не такой уж другой язык, это ваш производственный язык, чтобы делать все.
Точно так же, поскольку мы находимся в JVM, что произойдет, если по какой-то причине для вашего расследования вам понадобилось получить данные из базы данных и каким-то образом соотнести их с HTTP-сервисом? Что ж, если вы используете Postman и SQL Developer, вам нужно экспортировать полученный результат в CSV в обоих инструментах и, возможно, создать какой-нибудь скрипт Bash… но опять же, мы работаем на JVM, так что вы могли бы просто написать небольшой фрагмент кода, чтобы сделать это за нас, потому что в JVM есть библиотеки абсолютно для всего.
Мы можем стать более изобретательными, и если нам это действительно нужно, мы также можем создавать графики. В JVM есть множество библиотек построения графиков, так что, опять же, в нашем распоряжении есть все инструменты JVM, чтобы понять, как работает реальный мир.
TDD и ОТВЕТ
Итак, давайте предположим, что мы завершили этот этап исследования, чтобы понять, как работает реальный мир, и теперь мы хотим переключиться на наш рабочий процесс TDD. Итак, первое, что мы сделаем, это напишем тест, это тест, и если вы видите, он говорит, что он терпит неудачу, но это потому, что мы не предоставили ему никаких данных, никаких фиктивных данных.
Мы могли бы пойти сюда и ввести все фиктивные данные, но если вы подумаете об этом, мы уже вызываем DB, поэтому один из вариантов – просто скопировать результаты этого вызова DB в нашу тестовую установку.
Насколько вероятно, что в этих данных, которые мы используем в наших тестах, есть опечатка? Или это не тот тип? Это было получено из базы данных, поэтому в результате нашей исследовательской работы мы можем получать фрагменты данных и сразу же использовать их в наших тестах.
Хорошо, допустим, ваш бизнес-менеджер говорит, что мы не хотим, чтобы наша функция сводки учитывала записи с типом 101. Итак, если вы используете TDD, первое, что вы сделаете, это измените ожидание. Вы пишете тест, видите, что он провалился, теперь вы хотите сделать его зеленым, поэтому мы перейдем к коду, удалим типы 101, запустим его снова, и он станет зеленым. Круто, значит, мы выполнили то, о чем нас просили.
Теперь бизнес-менеджер меняет свое мнение: ну, вы знаете, мы не хотим считать цифры, потому что они выглядят очень плохо, поэтому резюме должно быть 23. Вы снова запускаете свой тест, а теперь переходите к своему рабочему файлу и вносите изменения… Но это переключение между файлами немного раздражает.
Таким образом, мы можем указать ОТВЕТУ отслеживать все изменения, которые мы вносим в проект, и запускать тест, как только мы сохраним файл. Итак, мы сохраняем файл сейчас, он запускает тест автоматически, и мне ничего не нужно делать.
И самое приятное в этом то, что это не просто выполнение всех тестов. Если я перейду к файлу, в котором нет тестов, посмотрите, что он здесь говорит? Ну, он не запускал никаких тестов, потому что в этом файле вообще нет никаких тестов. Таким образом, он не просто запустит все тесты, весь ваш набор тестов, он просто запустит тест, на который могут повлиять внесенные вами изменения.
Подключение ваших контроллеров
Теперь, когда мы довольны нашей бизнес-логикой, единственное, чего нам не хватает, – это создать конечную точку REST, чтобы предоставить эту функцию внешнему миру.
Этот конкретный сервис использует Swagger. Все знакомы с Суэггером? Swagger – это стандартный способ определения ваших конечных точек в формате JSON, поэтому, когда вы используете это определение без каких-либо инструментов. В этом случае тот, который использует это определение JSON, – это Swagger UI, который просто рисует конечные точки API, и это позволяет вам легко выполнять HTTP-вызовы и играть с конечными точками.
Давайте добавим нашу новую конечную точку, и мы просто скопируем предыдущую, назовем ее total, и давайте посмотрим, сработает ли это. Обновите браузер, и мы видим, что теперь общая сумма здесь, это наша новая конечная точка. Вместо “who” нам потребуется клиент типа long, и нам нужно подключить наши зависимости, давайте вызовем базу данных и попробуем. Итого двадцать три.
Хорошо, я лично не устанавливаю и не пытаюсь устанавливать какую-либо логику на свои контроллеры, поэтому я обычно не тестирую их, и то, что мы здесь сделали, – это просто проверка того, что проводка действительно работает.
Допустим, помимо общей суммы, вы хотите вернуть клиента. Мы могли бы пойти и проверить это здесь, но это, опять же, переход от одного инструмента к другому для проведения вашего тестирования становится раздражающим. И я почти уверен, что JVM способна выполнять HTTP-вызовы, поэтому мы пишем небольшой фрагмент кода, который сразу же выполнит HTTP-вызов, так что теперь, если мы изменим клиента на учетную запись, видите, он изменился автоматически. И нам не нужно переходить на другой инструмент, и мы видим, что изменения появляются, и мы можем это проверить.
Эта петля обратной связи действует мгновенно.
Государство
Теперь, когда у нас есть все это автоматическое обновление кода, что происходит с состоянием приложения? Здесь у нас есть часть состояния, которую мы собираемся использовать для подсчета количества HTTP-запросов, выполненных этой службой.
В нашей новой конечной точке мы просто собираемся вернуть этот счетчик с количеством запросов: 1, 2, 3, … теперь у нас их 12. Теперь мы собираемся изменить это, так что же произойдет, когда он обновит мои изменения? Счетчик, этот элемент состояния, вернулся к 0.
Что происходит? Когда код обновляется, мы теряем это состояние. Это может быть то, чего вы хотите, но иногда это немного раздражает, например, когда у вас есть какое-то кэширование, и вы тестируете кэширование. Загрузка кэширования из базы данных занимает целую вечность, потеря состояния кэша действительно очень раздражает. Это просто замедляет вас, поэтому мы можем сказать, что ОТВЕТ таков: для этой конкретной части штата я не хочу, чтобы вы уничтожали ее, когда происходят изменения.
Таким образом, мы можем выборочно решать, какую часть состояний мы хотим сохранить, но дело не только в этом.
Поскольку мы действительно находимся внутри JVM, мы можем пойти и проверить состояние, любое состояние, которое у вас есть в вашем приложении, вы можете пойти и потыкать в него. Это похоже на подключение отладчика к JVM.
И точно так же, как вы можете проверить его, вы могли бы пойти и просто изменить его.
Но иногда, даже заявив, что вы думаете, что не хотите от этого избавляться, вы можете захотеть избавиться от этого. Таким образом, есть способ сказать ОТВЕТУ избавиться от всего, даже от тех вещей, от которых вы сказали ему не избавляться.
И точно так же, как мы проверяем состояние, мы также можем определить любое состояние, проходящее через ваше приложение, и зафиксировать его, а затем проверить позже.
Некоторые РЕАЛЬНЫЕ преимущества
Итак, что мы получили из нашего ОТВЕТА?
- Идеальный инструмент для изучения языка программирования и его библиотек.
- Пишите код с немедленной обратной связью.
- Никакой сборки или развертывания. Живое изменение нашего запущенного приложения без его перезапуска.
- Инструменты для понимания реального мира: все библиотеки JVM.
- Простой способ создать правдивую ложь для наших тестов.
- Меньше неожиданностей при запуске приложения.
- Добавление новых библиотек в запущенное приложение.
- Автоматически запустите модульный тест, на который повлияло изменение.
- Проверять состояние и управлять им.
- Оставайтесь в комфорте вашего любимого IDE.
ОТВЕТ в постановке и производстве?
Если вы подумаете об этом, ОТВЕТ прослушивает сокет, а вещи, которые прослушивают сокет, означают, что на самом деле вам не нужно запускать их локально.
Итак, что произойдет, если мы оставим этот ОТВЕТ с открытым сокетом в наших промежуточных и производственных средах? А затем, со своей СТОРОНЫ, мы подключаем его к промежуточной или производственной среде?
Сколько раз вам сообщали об ошибке, и вы думали: “Если бы я мог просто посмотреть состояние этого конкретного объекта в промежуточном состоянии, я бы сразу понял, в чем проблема, и я смогу сразу же ее исправить”.
Или как вы много раз думали: “Если бы я мог просто добавить сюда одну строку журнала, я бы знал, что происходит”, а затем вы вносите это изменение в свой журнал, снова развертываете и понимаете: “О, это была не совсем та строка журнала, которую я хотел, Мне действительно нужна другая строка журнала”.
Получив ОТВЕТ, мы сможем внести все эти изменения немедленно, в любой среде, которую вы пожелаете.
Но кто был бы настолько сумасшедшим, чтобы хотеть иметь такую мощь в производстве? Это просто слишком опасно, верно?
В мае 1999 года мы смогли отладить и исправить состояние гонки, которое не обнаружилось во время наземных испытаний. Отладка программы, работающей на аппаратном обеспечении стоимостью 100 миллионов долларов, которое находится на расстоянии 100 миллионов километров, – интересный опыт. Наличие цикла чтения-оценки-печати, запущенного на космическом корабле, оказалось неоценимым в поиске и устранении проблемы. Рон Гаррет Инженер Лаборатории реактивного движения НАСА
Поэтому я собираюсь заявить, что если у НАСА есть такая мощность в производстве, вероятно, мы также можем ее использовать. Вы должны быть предельно осторожны, но почему бы и нет?
Итак, чтобы сделать все то, что, как мы сказали, дает вам ОТВЕТ, я собираюсь добавить еще два:
- Отлаживайте промежуточные и производственные среды
- Управление космическими аппаратами
Больше Ответов
(еще одна 30-секундная пауза) о, извините, это всего лишь 30 секунд. Не волнуйся, это всего лишь второй раз за один час…
Помните, почему нам нужен REPL: вы делаете это для своей радости, и вы делаете это для производительности компании.
Как я уже сказал, это не относится исключительно к Clojure, здесь есть другие видеоролики о подобных вещах на разных языках и в разных средах. Но каждый ОТВЕТ будет иметь разные возможности, они не все равны.
- Javascript: https://vimeo.com/123513496
- ClojureScript: https://www.youtube.com/watch?v=KZjFVdU8VLI
- Вяз: http://debug.elm-lang.org/
- Заводной: https://www.youtube.com/watch?v=bTRUC78X87g
- Питон: Питон:
- iOS: https://www.youtube.com/watch?v=Ci4uviG8S0o
- Android: Android:
- Единство: https://www.youtube.com/watch?v=tJr_TD1BtF0
- Музыка: https://www.youtube.com/watch?v=yY1FSsUV-8c
А как насчет JAVA REPL?
Это я, когда я прочитал, что Java собиралась получить ОТВЕТ, а затем то, что должен был получить этот REPL.
Из всего списка вещей, которые вы видели, что может дать вам ОТВЕТ, цель Java REPL – облегчить изучение языка, не более того, но даже это забавно, потому что язык в REPL не совсем такой же, как в Java, поскольку он имеет разную семантику, другой синтаксис, в то время как в более мощных репликах вы получаете весь язык целиком, разницы нет.
Рекомендации
- Код: https://github.com/dlebrero/repl-driven-development-talk
- Брет Виктор: Изобретение по принципу Изобретение по принципу
- Рон Гаррет: Эксперимент с удаленным агентом: Отладка кода за 60 Миллионов миль Прочь https://www.youtube.com/watch?v=_gZK0tW8EhQ
- Якоб Нильсен – Юзабилити-инжиниринг:
Спасибо!
Оригинал: “https://dev.to/danlebrero/repl-driven-development-immediate-feedback-for-your-backend-code-4b0o”