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

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

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

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

## そもそもの発端

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

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

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/29987/ab0c4d9a-e76b-e6ec-6e29-a222910d020f.png)

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

## では、どうすればいいのか？

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

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

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

## どのように動くのか？

### 単語・熟語の登録

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

![add.gif](https://qiita-image-store.s3.amazonaws.com/0/29987/caa4b1ae-560c-c4c2-ad76-461e1e621ade.gif)

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

### 単語・熟語を覚える

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

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

具体的な動作は以下のようになります。[^2]

![rem.gif](https://qiita-image-store.s3.amazonaws.com/0/29987/0a03cf83-b744-7367-117b-b569d925e726.gif)

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

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

![fin.gif](https://qiita-image-store.s3.amazonaws.com/0/29987/64ac56fc-0c90-9df6-96ee-65d0a7e9c82b.gif)

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

### 動き方のまとめ

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

## 実装Tips

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

### リアクションの実装

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

```js

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](https://github.com/remy/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]: キャプチャの都合上、デスクトップから録画していますが、本来はスマートフォン上でやります。
[^3]: 入力先頭に `a`(add) を付与すると、bot が単語・熟語の登録と解釈します。