С января обучаюсь web-программированию в школе с открытым расписанием. Там есть хорошая возможность много обсуждать задания между студентами и общаться с менторами. Некоторые заметили, что я задаю интересные вопросы и недавно спросили меня, как я учусь вообще.

Я взглянул на свою учебную деятельность и вывел простой алгоритм/последовательность/практику:

  • Попробовать что-то сделать, прийти к какому-то результату
    • Написать тест, сверстать сайт, написать функцию, не важно
  • Нарисовать схему/сделать модель/описать текстом полученные данные в экземплярах
    • Тест 1: пустой GraphQL запрос посылается на адрес сервиса AWS AppSync, поскольку в нем отсутствует подпись пользователя Б, сервис отвечает с сообщением В
    • Это хороший результат, но он слишком не_универсален, это данные/информация, а не знания
  • Сделать то же самое, но теперь в типах
    • Интеграционный тест: пустой GraphQL запрос посылается на GraphQL сервер, поскольку в запросе отсутствует заголовок с авторизацией, сервис отвечает отказом
    • Здесь начинаются интересные вопросы
      • Что такое интеграционный тест? Что интегрируется с чем?
      • Какие в принципе бывают GraphQL запросы? Давайте сделаем тест с очень длинным запросом, вообще без запроса, с неправильно форматированным запросом, …
      • А если мы используем не GraphQL, а REST API?
      • Какая в принципе бывает авторизация?
  • Теперь то же самое, но для каждого объекта указываю, во что он входит
    • GraphQL запрос - часть тела HTTP POST сообщения, входящего в стек TCP/IP
    • GraphQL сервер - часть облачной инфраструктуры, описанной как Infrastructure-as-Code, поднятой у провайдера облачной платформы
    • Авторизация - часть заголовка HTTP POST сообщения

Выполнять это все крайне контринтуитивно: тест написан, все работает (или не работает, как это и ожидается), хочется оставить первое описание, как самое понятное, ведь в нем объекты, которые видны на экране монитора.

Но этот подход позволяет мне учиться работать не с конкретным инструментом, но доходить до сути - выделять операции и объекты в типах, а также дотянуться вниманием до различных понятий, уложить их у себя в голове не отдельно, но связать с другими.

Также в разговорах я заметил, что постоянно говорю в типах предметной области/мета-модели, например, когда речь заходит о различных сервисах AWS, я говорю не их названия, но “база данных”, “функция”, “репозиторий”, “пайплайн”.

Для меня этот подход сейчас кажется тривиальным, но когда мне задали тот самый вопрос я был просто ошарашен фактом своего же мышлениях в типах, а не в экземплярах.