Первоначально опубликовано на https://blog.pagekeysolutions.com.

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

Как и в любом другом проекте, он казался легким… пока я не начал!

Я создал план, разработал приложение и реализовал его как мог. Хотя в нем меньше функций, чем я первоначально предполагал, я смогу реализовать, те, которые в нем есть, пока работают хорошо (несмотря на несколько ошибок, которые люди обнаружили сразу после того, как он был опубликовано).

Попробуй это сейчас!

Бум! доступно на Android и iOS. Вы можете попробовать сами!

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

Ссылка на магазин Google Play

Ссылка на Apple App Store

Языковые данные, используемые для всех тестов, намеренно общедоступны (подробнее об этом позже). Вы можете найти ссылки на эти данные внутри приложения или проверить его. Если вы знаете один из языков, которые мы преподаем (пока только испанский, русский и французский) и хотите сделать больше и больше, не стесняйтесь создавать задачу и запрос на слияние на GitLab, чтобы добавить больше уроков. Я надеюсь добавить больше в ближайшее время, поэтому, если у вас есть идеи, дайте мне знать!

Для людей, которые не знакомы с тем, как работает GitLab, будьте уверены, что я осознал свою ошибку — Git — не лучший способ совместной работы для всех нас. Я работаю над более простым способом сделать это, так что следите за обновлениями!

Почему

Вы больше не можете сидеть в Интернете, смотреть телевизор или слушать радио, не услышав рекламу приложений для изучения языка. Каждая компания, разрабатывающая языковое приложение, хочет убедить вас, что их решение отличается от других и поможет вам свободно говорить на целевом языке. Просто воспользуйтесь их продуктом, и все получится!

Я давно интересовался изучением языков как хобби, поэтому я попробовал свою долю программного обеспечения для изучения языков. Я помню волнение, которое я испытал, когда впервые получил в руки копию Rosetta Stone для испанского языка из местной библиотеки еще в шестом классе. Это было отличное начало, но достаточно скоро я начал искать в Интернете дополнительные ресурсы. В конце концов я начал читать статьи людей, которые сделали то, что я хотел сделать: стали свободно говорить на иностранном языке по своему выбору.

Как оказалось, одна из первых вещей, которые вам рассказывают в блогах и видеороликах на YouTube об изучении языков, заключается в том, что вы не можете делать что-то одно выучить язык. ; вы должны попробовать массу техник, собирая кусочки из разных вещей, которые вы делаете на этом пути. Чем более четкую тактику вы опробуете, тем лучше вы научитесь.

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

Не будем забывать, сколько времени прошло с тех пор, как эти продукты были впервые выпущены. Я не буду называть какой-то конкретный продукт или компанию — я оставлю это вам в качестве упражнения. Подумайте о продукте для изучения языка, о любом из них. Теперь задайте себе несколько вопросов.

Как давно он существует? Хорошо. Итак, в чем главная особенность продукта? Как это поддерживает вашу вовлеченность? Когда в последний раз они добавляли что-то радикально новое, чтобы изменить ваше обучение, увлечь вас и добавить еще один аспект в ваш языковой репертуар?

Ответ на последний вопрос является ключевым. Скорее всего, это было давно.

Застой, который я наблюдал, конечно, понятен; Я не могу винить эти компании за то, что они делают что-то одно и делают это хорошо, и не могу осуждать их за то, что они вносят лишь крошечные постепенные улучшения до тех пор, пока это остается прибыльным.

Но с другой стороны, я вижу потребность, которая лишь частично удовлетворяется. Изучающие язык вынуждены использовать более одного решения, если они хотят добиться успеха. Те, кто это осознают, перепробуют многое и, скорее всего, достигнут своих целей — другие могут просто с досадой недоумевать, почему они не прогрессируют.

Итак, вот возможность: если существующие языковые компании хотят чувствовать себя комфортно и делать что-то хорошо, кто-то вроде меня сможет заполнить пробелы для людей, которые хотят большего.

Что (моё решение)

Сделаем шаг назад. Это звучало довольно амбициозно, даже высокомерно для человека, у которого, похоже, еще даже нет плана. Что сделает это приложение таким замечательным?

Справедливости ради следует отметить, что существует множество препятствий, которые могут встать на пути одного человека, пытающегося конкурировать с хорошо зарекомендовавшими себя, хорошо финансируемыми компаниями, существующими десятилетиями. Но кто знает? Я могу получить несколько союзников по пути, чтобы помочь. (Напишите мне — [email protected])

Если все пойдет хорошо, и я смогу заставить все работать, я хотел бы Boom! представить увлекательные викторины, которые произвольно генерируют контент, чтобы люди использовали лексику и грамматику по-новому. Я хочу, чтобы этот контент был общедоступным, идоступным для общего редактирования (хотя перед объединением правок будет проведен процесс проверки).

Идея состоит в том, что если каждый сможет редактировать и свободно загружать контент для изучения языка, он станет общедоступным ресурсом лучше, чем все, что было разработано в частном порядке. Кроме того, следующему человеку не нужно начинать с нуля. Если бы кто-то использовал те же данные для создания более изящного приложения, которое обучает людей более эффективно, мы все выиграем.

У меня есть растущий список других функций, которые будут связаны с той же системой, чтобы обеспечить новизну и (в конечном итоге) некоторое подобие виртуального социального взаимодействия, держать людей в напряжении и получать удовольствие от обучения. Я еще не развил эти идеи настолько, чтобы ими поделиться, но, надеюсь, скоро смогу добавить их в приложение.

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

Как

Я бы разделил то, что я сделал до этого момента, на управленческие и технические обсуждения.

Управление проектами и временем

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

Благодаря совету моей подруги Даниэлы Гил, которая является знатоком управления, я смог спланировать почти все действия, которые мне нужно было выполнить для этого приложения, прежде чем начинать какую-либо работу, включая такие задачи, как запуск сервера, регистрация приложение в магазине и даже создание собственного бизнеса, чтобы легче управлять финансовой стороной дела. Конечно, главной задачей было написание кода, который я тоже постарался разобрать.

Использование Структуры Разбивки Работы (WBS) с самого начала имело два преимущества: во-первых, это давало мне мотивацию, потому что я мог видеть четкий путь к тому, что я хотел сделать, и, во-вторых, оно не позволяло мне отвлекаться, спускаясь вниз по плану. кроличью нору и, в конечном счете, не закончив проект.

Технический дизайн

Еще одним полезным ресурсом, на который я наткнулся как раз вовремя, был мой курс Основы программной инженерии, который я прохожу в Whiting School of Engineering Университета Джона Хопкинса. Курс Основы программной инженерии дал мне все инструменты, необходимые для продумывания написания приложения от начала до конца. Я благодарен своим профессорам Сэму Шаппелю, Джо Демаско и Джеффу Гаронзику за информативный практический курс.

В ходе курса подчеркивалась необходимость соблюдать дисциплину и избегать шаблона проектирования «кодируй и исправляй». Я был полон решимости воплотить эту ценность, стремясь создать как можно более подробный дизайн, прежде чем писать какой-либо код!

Это тоже окупилось. Предварительный дизайн дал мне ясность и сэкономил мне много часов (из которых у меня очень мало свободного для такого типа проекта). Вместо того, чтобы кодировать по кругу, не задумываясь о том, что я делаю, дизайн способствовал целенаправленной модульной реализации. Это было похоже на то, что я был сам себе начальником, сначала рассматривая только высокоуровневый дизайн приложения, не касаясь кода. Именно эта сдержанность не позволила моим помешанным на программировании пальцам закопать этот проект в дыру, из которой он никогда не выберется.

Ответы на многие важные вопросы были получены с использованием тактики, взятой из моего курса по программной инженерии (и нескольких курсов по системной инженерии). Особенно удобно было создавать контекстную диаграмму, тщательно определять варианты использования, создавать каркасы и моделировать данные.

Пользовательский интерфейс

С самого начала я знал, что мне нужен клиент и сервер для выполнения этой работы. Я уже имел в виду технологический стек, благодаря нескольким прототипам, которые я собрал для развлечения. Мой план состоял в том, чтобы использовать Flutter для внешнего интерфейса и Ruby on Rails для внутреннего интерфейса.

Если вы не слышали об этом, Flutter — это платформа пользовательского интерфейса с открытым исходным кодом, разработанная Google, которая позволяет вам написать код один раз и опубликовать его на iOS, Android, в Интернете и даже на рабочем столе! (хотя Desktop все еще находится в стадии бета-тестирования.)

Он использует совершенно новый язык программирования под названием Dart, который был специально создан для работы с Flutter (насколько мне известно). Это очень похоже на Java, но с гораздо меньшим количеством надоедливого стандартного кода для написания и с гораздо лучшей поддержкой асинхронного программирования. Сначала меня немного смутило использование фьючерсов, асинхронных функций и синтаксиса их анонимных функций (однострочный — () => Statement(), многострочный — () => {<block here>}). Однако, как только я к этому привык, все стало очень, очень хорошо сочетаться друг с другом.

Я немного познакомился с асинхронным программированием, возясь с Node.js, но я помню, как бросил его в отчаянии, когда заметил, что все мои программы имеют тенденцию превращаться в бесконечную яму вложенных функций по мере увеличения сложности.

У меня не было такой проблемы с Дартом. Может быть, это из-за строгой типизации и сходства с Java, или, может быть, это просто потому, что я застрял с ним немного дольше и читал больше о том, как делать что-то правильно (вместо того, чтобы идти вперед и пытаться делать что-то по-своему, что возможно было частью проблемы с моими приключениями в Node.js 🙂).

Я хочу поблагодарить Ника Кларка, который впервые познакомил меня с Flutter прошлым летом, когда мы вместе работали над проектом. Хотя мы не стали использовать Flutter в нашем конечном продукте, это дало мне некоторое начальное знакомство с ним, что позволило мне глубже погрузиться в этот проект. Ник, ты, должно быть, действительно держишь ухо востро, потому что это была отличная находка.

Бэкенд

Я использовал приложение Ruby-on-Rails только для API для серверной части. Я разместил его на своем собственном сервере в облаке.

Предварительный дизайн вариантов использования позволил мне использовать Разработку через тестирование (TDD) почти для всего кода, который я написал для серверной части.

Поначалу я был очень строг, заставляя себя писать неудачный тест, прежде чем прикасаться к какому-либо коду реализации. Ближе к концу я немного расслабился, пропуская несколько функций тут и там, которые было особенно сложно протестировать. Однако по большей части любые изменения кода начинались с написания или изменения тестов. Это дало мне гораздо больше уверенности при внесении любых изменений и, казалось, привело к довольно надежному результату.

Из того, что я читал в Интернете, использование строго типизированного языка могло значительно сократить количество тестов, которые мне нужно было написать. Однако, пока они не придумают Rails for Rust или что-то в этом роде, я остаюсь с Rails, потому что он отлично работает.

Успехи

На данный момент мой самый большой успех в этом проекте заключается в том, что он готов, я отправил его, он готов! Слишком многие из моих прошлых идей превратились в беспорядочные прототипы, которые я сунул в цифровой ящик, чтобы больше никогда не увидеть дневной свет. И это были времена, когда я действительно доходил до стадии написания кода; У меня было множество идей для приложений, над которыми я никогда не работал.

В целом, большинство этих проектов так и не были завершены из-за отсутствия ясности, отсутствия интереса или застревания в некоторых технических деталях. Предварительный дизайн Boom! сыграл огромную роль в решении этих проблем.

Первая версия этого приложения не особенно умопомрачительна, но она действительно работает. На данный момент этого достаточно!

Уроки выучены

Гораздо труднее вернуться назад и вспомнить извлеченные уроки, если я не веду записи на этот счет. Итак, первый усвоенный урок — вести записи и записывать все по ходу дела!

Второй вывод, который я сделал, заключался в том, чтобы уважать нетехнические детали. Если бы у меня была конкретная дата для завершения этого приложения, я бы, конечно, был сорван из-за незапланированных часов, которые я должен был потратить на создание учетных записей, начиная бизнес и, среди прочего, прыгать через обручи для программы Apple Developer. Было много, много дополнительных шагов к этим задачам, которых я не ожидал. К счастью, у меня был полностью произвольный график, поэтому несколько дополнительных дней для вывода приложения на рынок ничего не стоили.

Сначала окупается дизайн. Как упоминалось выше, тщательное продумывание дизайна заранее, прежде чем приступать к кодированию, было огромным преимуществом для того, чтобы все было собрано вовремя, и на этом пути было всего несколько заминок.

Git предназначен для разработчиков программного обеспечения. Изначально я думал, что идеальное решение — сделать так, чтобы все вносили свой вклад в единый репозиторий языковых данных Git. Вы получаете построчное сравнение, вы можете точно видеть, кто что внес и когда именно они это сделали, и вы можете использовать ветки для работы над уроками, которые еще не готовы для основного приложения. Тем не менее, Git не так просто освоить, если у вас нет опыта работы с ним. Хотя рабочий процесс Git для управления исходным кодом работает невероятно хорошо, он неотличный инструмент для совместной работы людей, не занимающихся кодированием. В будущем я хотел бы отказаться от текущего дизайна вклада на основе Git в пользу полностью интегрированного рабочего процесса в приложении.

Однако я все еще разочарован, потому что я все еще хочу применить непринужденную красоту Git к новым вещам. Казалось бы, отличная идея использовать Git для управления языковыми данными с открытым исходным кодом, но для любых лингвистов, не имеющих опыта работы с программным обеспечением, которые могут захотеть внести свой вклад, это довольно крутая кривая обучения.

В настоящее время языковые данные записываются вручную (с помощью редактора кода) в один файл JSON, dataset.json, и на стороне Rails есть код для загрузки этого файла и вставки соответствующих записей в БД в соответствии со структурой файла JSON. Минусы этого сразу же стали очевидны: файл JSON трудно редактировать, в нем легко сделать ошибки, и, что хуже всего, мне приходится сбрасывать предыдущий «набор языковых данных» в пользу нового, даже если это крошечное изменение. В настоящее время это очищает любую «память» приложения о том, какие уроки вы прошли, что является огромным недостатком дизайна. Я мог бы обойти это, включив идентификатор для всего в dataset.json, но это сделало бы его еще сложнее редактировать.

В будущем я хочу пойти в другом направлении; приложение будет хранить самую актуальную копию всех языковых данных в базе данных, и данные останутся общедоступными с помощью функции «Экспортировать как». Это более гибко — загрузите его в формате JSON, конечно, но, возможно, вы предпочитаете CSV или даже что-то дурацкое, например PowerPoint! В этот момент все возможно, так как все данные легко доступны в базе данных, откуда их можно легко получить с помощью скриптов. Резервное копирование данных также будет довольно легко — лучше не забывать об этом!

Следующие шаги

Я собираюсь отдохнуть от этого проекта. Я учусь в аспирантуре, и у меня не так много времени, чтобы работать над такими вещами в течение семестра. Летом, возможно, снова соберусь.

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

Небольшое изменение, которое я могу внести в ближайшее время, — это добавить небольшой тег «альфа» к логотипу, чтобы указать, что приложение находится на очень ранней стадии разработки и может иметь проблемы (или просто не иметь функций).

Монетизация была бы хороша, но на самом деле мне, вероятно, потребуются тысячи пользователей, чтобы сделать ее стоящей, и я не думаю, что это будет возможно, пока она не станет более качественной. А пока я лучше сосредоточусь на улучшении того, что у меня уже есть.

Прозрачность в отношении монетизации и того, как это делается, была бы отличной целью. Хорошо известно, что «если это бесплатно, вы и есть продукт». Но приложение, которое зарабатывает деньги, показывая вам рекламу или что-то в этом роде, редко прямо говорит об этом.

Я чувствую, что если что-то связано с использованием внимания людей, которое становится все более ценным и дефицитным ресурсом в нашем мире, тогда мы должны предельно ясно объяснить, что происходит. Приложения, которые используют методы привыкания, чтобы тратить наше время на просмотр рекламы с целью получения прибыли, потенциально крадут моменты из жизни людей, которые можно использовать для общения с людьми, которых они любят, или для продвижения общества значимой работой. Это не обязательно плохо, если приложение служит хорошей цели, такой как образование, но мы все равно должны признать, что у нас есть что-то, что можно получить, привлекая людей.

При этом, может быть, я немного лицемерю из-за такой системы, но, по крайней мере, я открыто говорю об этом! У вас есть идеи по улучшению бизнес-моделей для Интернета? Дай мне знать!

Втягиваться

Вы дошли до конца? Спасибо за это!

Пожалуйста, скачайте приложение и попробуйте его, если вы еще этого не сделали. Я очень открыт для отзывов и идей для новых функций. Просто присылайте свои мысли на [email protected].

Вы также можете оставить комментарий, но я получаю много спама в своем блоге и еще не придумал, как его отфильтровать. 😅

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

Первоначально опубликовано на https://blog.pagekeysolutions.com.