English
bot
Slack

Slackを使って英語力を継続的に伸ばしている話

こんにちは、@iwashi86 です。本記事は、NTTコミュニケーションズ Advent Calendar 20日目の記事です。

本記事では、Slackを使いつつ英語力を上げていくために、社内ハッカソンで作ったbotについて述べます。大きく以下の3点について述べます。

  1. 経緯: そもそもの発端
  2. 解決方法: botを使ってどのようにするのか
  3. おまけ: botの実装Tips

そもそもの発端

英語力を上げるためには、継続的に勉強していく必要があります。これに関してはいわずもがなで、なんとなく直感的に同意いただけるかと思います。

英語力の中でも、特にボキャブラリーの豊富さは非常に有効で、知らない表現に出会ったときのプチフリーズ/諦めを防げます。そもそも表現を知らないと、その単語やフレーズ自体のリスニングに失敗することもあり、とにかく知っていることが重要です。

ボキャブラリー増強の手段として私は普段、NHK実践ビジネス英語を聴いて、英語を勉強しています。そこで出会った未知の表現を、メモっておいて、後から覚えようという作戦です。具体的なメモの方法として、 Slackの #language チャネルに投稿1しています。たとえば、こんな感じで書いています:

image.png

Slackに書くことで、多少のアウトプット効果もあり、やや記憶に定着するのは事実なのですが、実際に数日後に覚えていられるのは非常にレアで、99%の単語/熟語は、翌日に忘れてしまっているのが実態でした。ボキャブラリーを増やしたいのに、これでは困ります。

では、どうすればいいのか?

個人的に子育てなどもあり、プライベートでまとまった時間を捻出するのが難しいので、スキマ時間を狙って復習する作戦でいきました。スキマ時間とはたとえば、次の打合せまでの3分間や、電車の乗り換えの5分間などを想定しています。前述のとおり、英語は継続的に勉強するのが重要なので、とにかく空いた時間でこまめに&手軽に勉強する作戦です。

そこで、エンジニアとして生活していく中で、絶対に触れるツールであるSlackを使うことにしました。特別なアプリケーションを作ってしまうと、それをOpenするという行為すら忘れそうなので、ほぼいつも開いているSlackだと、都合が良いのです。

Slackで任意の機能を付けようとすると、もちろんbotなので、社内ハッカソンでサクッと作ってみました。

どのように動くのか?

単語・熟語の登録

スマートフォンから文字を打つのはつらいので、登録時はキーボードからやります。キーボードから入力された文字をbotが拾って、バックエンドのデータベース(今回はFirebaseを使用)に保存します。2

add.gif

単語・熟語の登録が正常に成功すると、botが :white_check_mark: リアクションを返してくれます。

単語・熟語を覚える

覚えるときは、手軽さを徹底重視して、スマートフォンからやります。とにかく気楽にやりたいので、スマフォからタイプする文字は、s(Startの略)だけにしました。実際にsを打ち込むと、データベースに保存されている英語表現とリアクション2種類(:white_check_mark: 知っているか、知らないか)が表示されます。英語表現は、データベースの中からランダムで表示します(デフォルト5題)。

利用者(覚えたい人)は、出題された英語表現を覚えていれば :white_check_mark: をタップ、覚えていない場合はもう一方のリアクションをタップします。

具体的な動作は以下のようになります。3

rem.gif

どちらかのリアクションをタップすると、即時フィードバックとして正答の日本語表現も表示されます。これで、自身が正しく覚えられていたかどうか、を確認できます。

最終的に暗記できたかどうかの判定は、3回連続で正解すること、で実施しています。仮に3回連続で成功すると、以下のように、botが 大変よくできました マークを付与し、データベース上から該当の表現を削除します2

fin.gif

ちなみに、反対に覚えていないほうのリアクションをタップすると、連続成功回数は0にリセットされるので、再度3回連続で正解する必要があります。

動き方のまとめ

以上のように、スマートフォン上の暗記時の操作を、徹底的に簡易化することで、復習しはじめるときのハードルを極限まで下げてみました。

実装Tips

(ほぼおまけですが、)bot実装上のTipsを2つほど述べます。

リアクションの実装

botが発言して、リアクションを付与するコードはこんな感じでした:

controller.hears('^s$', 'direct_message', async (bot, message) => {

  // Firebaseから問題を取得
  const questions = await fetchQuestions();

  if (questions.length === 0) {
    bot.reply(message, '登録語数が0だから、まず登録してね');
  }

  // 出題&リアクションを表示
  questions.forEach((question) => {
    bot.reply(message,
      `Q: ${question.id}`,
      (err, res) => {
        bot.api.reactions.add({
          name: 'white_check_mark',
          channel: message.channel,
          timestamp: res.message.ts,
        });
        bot.api.reactions.add({
          name: 'negative_squared_cross_mark',
          channel: message.channel,
          timestamp: res.message.ts,
        });
    });
  });
});

開発時の注意点

実装は特に難しくないのですが、一つだけ困ったことがありました。今回は開発時にnodemonを使って、ファイル変更を検知して開発していたのですが、頻繁に変更すると以下のエラーをもらうことがありました。

info: ** Using custom storage system.
info: ** API CALL: https://slack.com/api/rtm.connect
Error: Rate limit exceeded ← APIを高頻度で叩きすぎ
    at Request._callback     
    at Request.self.callback 
    at emitTwo (events.js:125:13)

そのため、もう少しAPIに優しい叩き方で作ったほうが結果的に良かったです。(今回のケースでは、nodemonを使わないほうが良かったです)

まとめ

本記事では、botを使って英語力を継続的に伸ばしている話について書きました。Slackのように日常的に触れるツールに、英語学習を混ぜ込んでいくと、自然と英語に触れる機会が増えるのでオススメです。


  1. メンバへの共有が主な目的ですが、副次的な効果として、チームにいるネイティブから何か補足があれば教えてくれることも。 

  2. 入力先頭に a(add) を付与すると、bot が単語・熟語の登録と解釈します。 

  3. キャプチャの都合上、デスクトップから録画していますが、本来はスマートフォン上でやります。