Когда твой парень — fullstack Работая программистом и проживая в пяти минутах ходьбы от офиса, крайне тяжело успеть «отойти» от работы, отойдя от работы. Я думаю, многим это знакомо: последние полчаса ты сидишь и думаешь над непонятно откуда взявшейся неочевидной ошибкой и в итоге, так и не решив проблему, проверяешь, что все твои сегодняшние коммиты улетели в корпоративный репозиторий, выключаешь машину и выходишь из кабинета, зная, что завтра с утра на свежую голову всё решится. Как бы не так! Конечно же, решение приходит в самый не подходящий момент: кого-то застаёт за рулём, кого-то в трамвае, кого-то, кому повезло работать рядом с домом, где-нибудь во дворе, а то и в лифте. В моём случае следующий за решением поток мысли выливается на девушку, которая, ну ещё бы, в программировании, что называется, ни в зуб ногой. И вот однажды она приходит к тебе и торжественно заявляет:
 — Я готова! Готова учиться программированию! Давай! В этой статье не будет исходных кодов, в ней я постараюсь ответить на вопросы, которые встали передо мной на этапе планирования курса по программированию для собственной девушки. О том, как я, не имея никакого практического опыта в обучении, решил ввести в программирование человека, объяснившего, что «ты же умный» и «всё у нас получится», расскажу под катом. Добро пожаловать! На этот, казалось бы, абсолютно справедливый вопрос я получил не менее справедливый ответ:
 — Ты всё равно постоянно говоришь о программировании, а так я хоть понимать тебя буду. Честно? Не уверен, что это веская причина для того, чтобы стать программистом, пусть даже и не профессиональным. С другой стороны, я глубоко убеждён в том, что в будущем, возможно, не столь отдалённом, программирование если и не станет чем-то бытовым, то, как минимум, сделает очень серьёзный шаг в этом направлении. А как известно, не можешь остановить хаос — возглавь его! Так, заручившись поддержкой любимой девушки, и надеждой на то что мне перепало хоть немного от бабушки, бывшей некогда педагогом, я сел составлять план обучения. Конечно, можно было погуглить туториалы по созданию чего-то простого на каком-нибудь условном питоне, но, как часто это бывает, я люблю велосипеды, а значит, чей-то курс нам не подойдёт — надо своими руками. На самом деле, конечно, как и любой велосипедист, я тут же нашёл множество причин не использовать существующие решения. И, пожалуй, кто-то найдёт их не объективными, но я и не претендую на последнюю инстанцию. Итак, что же не так в куче бесплатных онлайн курсов? Обучать программированию русскоговорящего человека нужно, само собой, на русском языке. Множество терминов, регулярно читаемых нами в документации к stdlib очередного языка, воспринимаются нами, профессиональными программистами, интуитивно: statement, expression или даже parse — это то, что нам не приходится переводить, даже если наш уровень английского предполагает именно перевод, а не мгновенное понимание текста. Человеку, не связанному с программированием и даже просто с IT, многие из наших терминов просто сломают голову, напрочь отбив желание продолжать обучение. Курсов на русском языке много, но все они, на мой взгляд, не подходят для обычного человека. Почему? Во-первых, в массе своей, это либо курсы по веб-программированию (PHP, JS, Python, etc), либо по этому вашему энтерпрайзу (Java, C#, etc), либо же это C/C++ — всё это не торт для новичка. Первая категория обычно не учит собственно программированию, предлагая за несколько уроков сделать готовый продукт — сайт обычно. Я не вижу в этом ничего плохого, если цель человека — создать сайт, но давайте будем честны: подобные курсы дадут вам некий архитектурный паттерн (MVC, скорее всего), кодовую базу для нескольких модулей, и всё — никаких знаний. Именно благодаря этим курсам мы имеем такое количество глупых вопросов в телеграмм-каналах и форумах, посвящённых какому-то языку или технологии. И винить новоиспечённых программистов в этих глупых вопросах нельзя — они не получили базовых знаний, отсюда и все беды. Что касается двух других категорий, то я, опять-таки, считаю, что это не то, что с чего нужно начинать новичку. Я помню как однокурсники в университете упирались в тему указателей. Большинство из них до сих пор ничего в этом не смыслит, а ведь это были пары: живой преподаватель, возможность диалога, обязанность практиковаться — все условия. К слову, если не ошибаюсь, то я единственный из своего курса, кто работает по специальности. Думаю, что поспособствовало этому изучение в школе QBasic и Pascal, простых, понятных и дающих базовые понимания. Вынашивая все эти мысли в голове, я пришёл к мысли, что лучшим языком для обучения, на мой взгляд, на сегодняшний день является Go: простой синтаксис, сильная статическая типизация, возможность начать работу без плясок с бубном и, что немало важно, собирать под любую платформу без тех же плясок — всё это делает Go идеальным кандидатом в первые языки программирования. Стоит добавить, что до этого я не писал на Go, но по работе мне как раз нужно было написать быстрый многопоточный веб-сервис, а это значило, что я смогу обучать свою девушку, параллельно обучаясь сам. Именно тут и выяснилось, что материалов для обучения человека программированию с нуля на Go в рунете нет. Есть прекрасные туры, профильные сайты и всё-всё-всё, что позволит тебе освоить язык за день-два, если ты уже умеешь в программирование. Но она — не умеет. Здравствуй, велосипед! Бо́льшая часть курсов предлагает в итоге иметь в своём уютном домашнем репозитории либо произвольное количество разрозненных примеров, либо некий готовый продукт, обычно вам не нужный. Конечно, бесплатный курс «Простой магазин на React+Redux» — это опыт, однако, как я уже говорил, на практике это полезно разве что человеку, желающему заиметь магазин, но не желающему нанимать кого-либо для его разработки. По факту же, прошедшие подобный курс новички, в программировании нисколько не продвинутся. На мой взгляд, идеальным вариантом для начинающего разработчика было бы именно изучение основ программирования, но на примере создания интересного ему продукта. Разработка проекта с нуля позволит познакомить человека со всеми этапами жизни проекта от, прошу прощения за тавтологию, его проектирования — до развёртывания в боевой среде и последующей поддержки. При этом ученик не должен получать готовые архитектурные решения и, тем более, исходные коды. Всё это должно стать продуктом изучения соответствующих аспектов разработки. Но что может заинтересовать девушку?
Свою первую программу (не считая того, что мы писали на уроках) я написал для младшего брата, когда тот стал учить таблицу умножения: ввод диапазона чисел, случайный вывод двух из них брату с предложением ввести их произведение, проверка и так далее по кругу. Это был, наверное, мой седьмой класс. В этом возрасте написать полезную (хоть сколько-нибудь) программу было для меня счастьем, то есть я был заинтересован. Но заинтересовать семиклассника написанием примитивного «калькулятора» — легко, чем заинтересовать взрослую девушку? Идея пришла, как водится, из быта. В очередной раз за готовкой, она попросила меня записать в блокнот пропорции ингредиентов. Дорогая, нам срочно нужен велосипед! Мы давно хотели завести какую-то книгу рецептов, потому что она у меня любит экспериментировать, и эти эксперименты часто оказываются весьма успешными. Но неужели это просто будет база рецептов? Конечно нет! На чём, что и в каком порядке будем писать, я понял в тот же миг. То, что начнём мы с Golang, — это было решено ещё до того, как стало понятно, что мы будем писать. Теперь же можно было определиться с тем, за что именно будет отвечать Go.
API. Конечно же, API! Язык позволяет средствами стандартной библиотеки поднять простой http-сервер, который будет прослойкой между БД и клиентами. Кстати, в качестве БД решено было использовать PostgreSQL. SQL — отличный язык для развития логики работы с данными, плюс мы сможем потрогать PL/pgSQL, который, в общем-то, в достаточной степени схож с Go, а значит, на этапе разработки бэкенда мы уже сможем в той или иной степени выучить три языка. Поскольку в данной ситуации дэдлайнов, как и отдельных команд разработчиков, нет, мы можем позволить себе приступать к фронтенду после того, как наша серверная часть будет завершена.
Почему именно так? Во-первых, это позволит не переключаться между слишком большим для новичка количеством языком и технологий. Во-вторых, мы должны научить человека в архитектуру. Посему пускай сначала разработает полноценный бэкенд, а уже потом переходит к клиенту. Что касается клиента, тут для меня выбор тоже был очевиден. Игнорировать тренд на реактивность — глупо, ведь у нас нет тонн легаси-кода, кроме того, некоторые из этих фреймворков крайне просты в изучении. Речь идёт о Vue.js. Конечно, можно было бы использовать React или более экзотические решение наподобие Svelte, но мне кажется, что эти технологии — для более зрелых разработчиков. Кроме того, клиентская часть будет писаться на TypeScript. Наверное, со мной многие не согласятся, но всё же я считаю, что динамическая типизация — это хоть и благо, но благо только в руках тех, кто понимает, что же такое типизация вообще. Именно поэтому продолжать обучение, как мне кажется, правильней на языке со статической типизацией. Именно на языке, поэтому Flow не рассматривался. С другой стороны хотелось сохранить максимальное соответствие с JS, не уводя девушку в CoffeeScript, Elm и т.д. Говоря о фронтенде и современном стеке технологий, нельзя не вспомнить о Progressive Web Application (PWA). По-моему, это идеальная технология для обучения или, точнее сказать, для того, чтоб заинтересовать ученика. Собственное приложение в мобильном телефоне вне зависимости от платформы? Не нужно учить сложные для новичка языки? Это же прекрасная мотивация, пожалуй, одна из лучших, как мне кажется. Поэтому наш фронтенд должен, кроме всего, удовлетворять всем требованиям, предъявляемым к PWA. Последний вопрос, на который мне оставалось найти ответ, — это формат общения клиента с сервером. На одной чаше, как же иначе, был REST со всеми его преимуществами и недостатками, а на другой — GraphQL. Предлагать чистый REST мне не хотелось, так как это влечёт определённые проблемы, которые и породили такие решения как GraphQL. Однако сам GraphQL, на мой взгляд, тоже не является удачной технологией, хотя определённый интерес представляет. Но опять-таки, интерес для меня, для других разработчиков — да, но для новичка GraphQL, как способ решения проблем, сопряжённых с использованием классического REST, интересен не будет, ведь новичку все эти проблемы неведомы, не так ли? Почему бы не попытаться совместить идеи REST и GraphQL? Конечно продумывание собственной реализации выходит за рамки обучения азам программирования, но написание — отнюдь. Поэтому решено было втихомолку придумать собственный велосипед, и предложить реализовать его в рамках работы над проектом. Что же нам предстоит пройти: Для меня это первый опыт обучения человека программированию. Возможно, этот подход покажет себя не так, каким я вижу его в собственной голове. Однако, надеюсь, он всё же себя оправдает, а мой опыт станет полезным кому-то, кто попадёт в ту же ситуацию. Спасибо за внимание!