#Про мой английский

Вообще в школе и университете английскому меня толком не научили: я делал все задания, но сейчас написание и чтение текстов мне даётся с большим трудом. Пару лет назад пришло понимнаие, что если самому ничего не делать делать, то мой английский так и останется на очень низком уровне.

Поэтому я пообещал себе смотреть всё с английской озвучкой и русскими субтитрами, если исходник изначально на английском. В оригинале сериалы и фильмы звучат намного лучше, я приноровился видеть одновременно экран и читать текст, плюс запомнил много выражений, и неожиданных смыслов у слов (например при общении по рации «copy that» = «принял»). Можно сказать что мой уровень вырос от этого действия. Но через год почувствовал что началась стагнация.

Поэтому я перешёл на следующий шаг и пробовал смотреть Футураму на английских субтитрах. Я даже в целом понимал что происходит, но много предложений ускользало от меня. Так посмотрел около 4 сезонов, и не сказал бы что хоть как-то прокачался. Недавно посмотрел 2 сезона сериала «Агенты Щ.И.Т.» на английских субтитрах, и уже понимал больше. Но ничего не училось. Я понял что без активных действий нельзя научиться с таким просмотром. Да и качество удовольствия страдает от непонимания.

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

Поэтому я принял решение что надо активно учить слова.

#Альтернативы

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

  1. Для проверки знания слова используется тест, где это слово находится рядом с 4 другими, разные значения слова не проверяются
  2. Проверка слов начинается с самых простых
  3. Нельзя сказать «я знаю это слово, убери»
  4. Нельзя добавить своё слово
  5. Нет статистики
  6. Нельзя автоматически выбрать неизвестные мне слова из текста или видео

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

#Прошлые попытки

Поэтому я ещё много лет назад хотел написать свою программу для изучения слов, где бы решил эти проблемы по-своему. Тогда я знал только C++, и не умел программировать ничего сложнее базовых вещей на WinAPI. Я пытался тогда написать такую программу, но у меня только на самую простейшую часть интерфейса ушло неимоверное число усилий. В итоге этот проект был заброшен. Кому интересно, вот ссылки: 1, 2.

×1
jpg

#Сегодняшний результат

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

И в результате у меня получилась программа, которая работает в браузере по следующему адресу: optozorax.github.io/learn_words.

А её исходники и бинари лежат здесь: github.com/optozorax/learn_words.

Вот скриншот с почти всеми окнами этой программы, так сказать, «для привлечения внимания»:

×1.6
png

#Способ проверки слова

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

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

Слово нельзя в один день несколько раз отпечатать и потом запомнить навсегда, запоминание должно проихсодить через интервалы времени. После добавления слова есть особый порядок когда его надо ввести снова:

  • В первый день с подсказкой 2 раза, подсказка нужна чтобы запомнить слово.
  • В первый день без подсказки 3 раза, далее всё будет без подсказки.
  • Через день 3 раза
  • Через неделю 2 раза
  • Через 20 дней 2 раза
  • После всего этого слово будет считаться выученным
  • В промежутках слово не предлагается для ввода.

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

Ниже показано как вводится несколько разных переводов одного слова «mean».

×1
png

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

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

По этим полям можно перемещаться при помощи Enter.

После ввода можно нажать кнопку «Next» и посмотреть насколько правильно мы ввели.

×1
png

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

Таким образом я решаю 1 проблему из введения.

#Способ добавления слов

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

Слово вместе со всеми его переводами можно добавить вручную. Это означает что ты сам должен знать какое слово тебе надо выучить и сам искать ему переводы.

×1
png

Этим мы решаем 2, 3, 4 проблемы из введения.

#2Добавление через текст и субтитры

Для этого есть специальное окошко для экспорта из субтитров формата srt.

×1
png

Затем можно нажать кнопку «Use this text».

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

×1
png

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

×1
png

После добавления информации об одном слове, автоматически происходит переход к следующему слову.

Здесь есть кнопка для «мусорных» слов. Это слова-артефакты парсинга субтитров, например <i>, Mack:, O-o-o-okay. Они записываются в программу только чтобы в будущем фильтроваться и не мешать. Не знаю в чём принципиальное различие между «Known this word» и «Trash word» с программистской точки зрения, но пусть будет.

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

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

Аналогично можно добавить слова из обычного текста. Можно перед прочтением статьи просто скопировать её в буфер обмена, вставить в программу и узнать все неизвестные слова.

Правда тут есть проблема, что у меня не происходит никакой нормализации слов, то есть слова с -s, -ing считаются разными, и вам для всех слов придётся вручную говорить «да, я это слово знаю». Ну и из-за этого размер базы должен быть в N раз больше, чем если бы слова нормализовывались. Я не делал это во имя простоты, и потому что обычно инструменты для нормализации распространяются как .exe или очень сложные для использования библиотеки. Или на базы для нормализации вообще наложены лицензионные ограничения.

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

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

Этим мы решаем 6 проблему из введения.

#2Синхронные субтитры

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

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

×1
png

И затем при добавлении слова, скролл автоматически прыгает на пару рус-англ для данного слова в субтитрах. Конечно, алгоритм расстановки субтитров рядом не идеален, но он ошибается всего на 1-2 позиции, что не очень критично.

×1
png

С такой фичей добавлять слова невероятно удобно. Вы не знаете, есть ли такая фича где-нибудь ещё?

#Статистика

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

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

×1
png

Есть полная статистика:

×1
png

Можно посмотреть статистику по дням: количество слов по категориям, время работы, количество попыток.

×1.6
png
×1.6
png
×1.6
png

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

×1.4
png

#2GitHub-like

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

×1
png

Поэтому я просто не мог не сделать свою программу без такой фичи.

×1
png

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

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

#Автоматическое переключение раскладки

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

У меня это реализовано таким образом, что просто имеется хэш-мапа, которая для каждой английской буквы знает какая должная быть русская и наоборот. То есть когда вам надо набрать русское слово, вы просто печатаете его как будто сейчас включена русская раскладка, а программа автоматически сама всё исправит. Этот подход хорош тем, что не требует особых прав от программы по переключению раскладки. Например, в браузере через WASM переключить раскладку точно невозможно в целях безопасности. Но этот подход плох тем, что не будет работать для языков, где используются одинаковые символы с обеих сторон, например английский-немецкий. Если вдруг этой программой будет пользоваться больше чем 2 человека, я подумаю насчёт решения этой проблемы.

В настройках можно указать вашу раскладку, введя в одном поле все русские буквы, а в другом поле все английские в том же порядке. Символ новой строки игнорируется, а пробел может быть использован когда у вас невозможно набрать нужный символ. Этот подход хорош тем, что у вас могут быть самые упоротые раскладки клавиатуры типо Дворака и Диктора, а автопереключение раскладки всё-равно будет работать.

×1.8
png

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

#Платформа

Программа может запускаться как в браузере, так и как нативное приложение.

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

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

#Экспорт данных

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

Специально для решения таких вопросов я сделал возможность экспортировать и импортировать всю статистику через буфер обмена. Пользователю просто передаётся эта информация и он может хранить её как ему вздумается.

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

×1
png

Так что вы сможете пользоваться этой программой даже если github умрёт или я заброшу её.

#Почти любой язык

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

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

#Open-source

Это open-source программа на 3.5к строк, что значит что вы вполне сможете внести сюда свои изменения, если будете в этом заинтересованы. Что хорошо по сравнению с программами, которые слишком велики для осознания.

#WIP

Но данная программа находится в состоянии WIP (Work In Progress), что означает что лично вам некоторых фич может не хватать. Если вы будете пользоваться этой программой, пишите мне про баги или фичи, которые вам нужны, буду думать.

#Пользование

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

В первый день я потратил очень много времени на добавление слов из самой первой серии «Агентов Щ.И.Т.»:

  • Вышло 900 уникальных слов.
  • Из них 70 слов я не знаю.
  • На отфильтровывание этого и перевод этих 70 я потратил 50 минут.

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

Затем я постарался выучить все эти 70 слов за один день. А что, немного слов, по идее должно быть быстро. В итоге:

  • На самом деле слов ~140, потому что добавляется рус-англ и англ-рус.
  • Если каждую пару надо ввести 5 раз за первый день, то это итого 700 попыток минимум.
  • У меня ушло 762 попытки: 681 правильная и 81 неправильная.
  • И всё это 55 минут непрерывного времени.

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

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

Мне кажется оптимально учить в день 10-20 слов, чтобы максимум выходило 20-30 минут в день, но делать это прям каждый день. Ещё слишком много слов в день не надо учить, потому что сегодня надо набирать не только новые слова, но и ещё слова, выученные 2, 9, 29 дней назад.

В программе можно выбирать сколько новых слов взять для сегодняшней тренировки:

×1
png

#Заключение

Теперь я занимаюсь изучением слов через свою программу. Я обязательно опубликую свои результаты и мысли через месяц и больше.

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

Но с другой стороны я поступил неправильно что недостаточно хорошо изучил рынок подобных программ, в частности нахваливаемую Anki. И получается, опять я занимался велосипедостроением. От губительного перфекционизма вылечился: не рефакторю код по 10 раз, теперь осталось вылечиться от велосипедостроения.

Я сделал эту программу со первичными фичами за 18 часов чистого времени, что невероятно быстро для программы с интерфейсом. Минимально рабочая версия была готова за 6 часов. За это спасибо концепции ImGUI, на которой невероятно просто и быстро можно делать интерфейсы, а ещё моему умению планировать программу и статической типизации Rust. Я полностью задокументировал процесс планирования этой программы, и каждого этапа её написания, так что скоро выйдет статья о том как она была написана и о том как я собираю идеи и организовываю себя для написания программ. Статья может быть полезна как новичкам, так и с точки зрения того как её откритикуют более опытные и умные люди.

Так что подписывайтесь на канал в телеграме, если ещё не: @optozorax_dev.


#UPD: обновление 0.2.1

Сейчас 11 августа 2021г. и я выпускаю версию 0.2.1 со следующими фичами:

#2Переезд на egui-web

  • С телефона теперь в принципе возможно пользоваться программой.
  • Работает IME для ввода иероглифов и нестандартных символов.
  • Белая тема выглядит лучше. Правда там некоторые цвета требуют доработок, это будет исправлено в следующих версиях.

#2Окно «Learn Words»

×1.1
png
  • Можно инвертировать результат набора. Например, если вы ошиблись в одной букве или набрали абсолютно эквивалентный синоним.
  • Если слово было набрано неправильно, то дальше нельзя идти пока это слово не будет набрано с подсказкой.
  • Улучшено поле ввода с подсказкой. Теперь оно просто не пускает дальше, пока подсказка не будет введена правильно, и светится зелёным когда подсказка введена правильно.
  • Теперь по полям можно передвигаться не только с помощью Enter, но и с помощью Backspace.
  • Теперь в очередь для изучения на текущую сессию для каждого слова добавляются его переводы. Раньше в один день вы могли изучать рус-англ пару, а в другой день англ-рус, в зависимости от того как рандом повезёт, и это оказалось неудобным на практике.
  • Теперь для повторения выбираются в первую очередь наиболее старые слова, а не в порядке рандома.
  • Теперь сначала набираются все слова с подказкой, а затем все слова без подсказок. Раньше они давались вперемешку и могло оказаться так что под конец набора всех слов вам даётся новое слово. Мне кажется лучше сначала набрать все новые слова, а потом доставать их из памяти вместе с повторяемыми.

#2Окно «Add subtitles from ...»

×1.4
png
  • Можно добавлять известные переводы для данного слова.
  • Можно скипать слова. Это может быть удобно чтобы из текста добавить только известные слова, а неизвестные скипнуть и оставить на будущее, или если вы не хотите прямо щас разбираться с очень сложным словом.
  • Появилась возможность вернуться к предыдущему слову.

#2Окно «Edit word»

×1.6
png
  • Пофикшены баги.
  • Можно добавлять и удалять элементы перевода.

#2Окно настроек

×1.5
png
  • Теперь можно задавать количество повторений через день, и вообще настроить поведение программы как захочется, чтобы оно было как в Anki, или как вам нравится. Например, кто-то советует изучать слова следующим образом: первую неделю каждый день повторять данное слово по одному разу. Вы можете настроить и это.

#2Прочее

  • Пофикшено измерение текущего дня.