こんにちは、@iwashi86 です。本記事は、NTTコミュニケーションズ Advent Calendar 20日目の記事です。
本記事では、Slackを使いつつ英語力を上げていくために、社内ハッカソンで作ったbotについて述べます。大きく以下の3点について述べます。
- 経緯: そもそもの発端
- 解決方法: botを使ってどのようにするのか
- おまけ: botの実装Tips
そもそもの発端
英語力を上げるためには、継続的に勉強していく必要があります。これに関してはいわずもがなで、なんとなく直感的に同意いただけるかと思います。
英語力の中でも、特にボキャブラリーの豊富さは非常に有効で、知らない表現に出会ったときのプチフリーズ/諦めを防げます。そもそも表現を知らないと、その単語やフレーズ自体のリスニングに失敗することもあり、とにかく知っていることが重要です。
ボキャブラリー増強の手段として私は普段、NHK実践ビジネス英語を聴いて、英語を勉強しています。そこで出会った未知の表現を、メモっておいて、後から覚えようという作戦です。具体的なメモの方法として、 Slackの #language チャネルに投稿1しています。たとえば、こんな感じで書いています:
Slackに書くことで、多少のアウトプット効果もあり、やや記憶に定着するのは事実なのですが、実際に数日後に覚えていられるのは非常にレアで、99%の単語/熟語は、翌日に忘れてしまっているのが実態でした。ボキャブラリーを増やしたいのに、これでは困ります。
では、どうすればいいのか?
個人的に子育てなどもあり、プライベートでまとまった時間を捻出するのが難しいので、スキマ時間を狙って復習する作戦でいきました。スキマ時間とはたとえば、次の打合せまでの3分間や、電車の乗り換えの5分間などを想定しています。前述のとおり、英語は継続的に勉強するのが重要なので、とにかく空いた時間でこまめに&手軽に勉強する作戦です。
そこで、エンジニアとして生活していく中で、絶対に触れるツールであるSlackを使うことにしました。特別なアプリケーションを作ってしまうと、それをOpenするという行為すら忘れそうなので、ほぼいつも開いているSlackだと、都合が良いのです。
Slackで任意の機能を付けようとすると、もちろんbotなので、社内ハッカソンでサクッと作ってみました。
どのように動くのか?
単語・熟語の登録
スマートフォンから文字を打つのはつらいので、登録時はキーボードからやります。キーボードから入力された文字をbotが拾って、バックエンドのデータベース(今回はFirebaseを使用)に保存します。2
単語・熟語の登録が正常に成功すると、botが リアクションを返してくれます。
単語・熟語を覚える
覚えるときは、手軽さを徹底重視して、スマートフォンからやります。とにかく気楽にやりたいので、スマフォからタイプする文字は、s
(Startの略)だけにしました。実際にs
を打ち込むと、データベースに保存されている英語表現とリアクション2種類( 知っているか、知らないか)が表示されます。英語表現は、データベースの中からランダムで表示します(デフォルト5題)。
利用者(覚えたい人)は、出題された英語表現を覚えていれば をタップ、覚えていない場合はもう一方のリアクションをタップします。
具体的な動作は以下のようになります。3
どちらかのリアクションをタップすると、即時フィードバックとして正答の日本語表現も表示されます。これで、自身が正しく覚えられていたかどうか、を確認できます。
最終的に暗記できたかどうかの判定は、3回連続で正解すること、で実施しています。仮に3回連続で成功すると、以下のように、botが 大変よくできました
マークを付与し、データベース上から該当の表現を削除します2。
ちなみに、反対に覚えていないほうのリアクションをタップすると、連続成功回数は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のように日常的に触れるツールに、英語学習を混ぜ込んでいくと、自然と英語に触れる機会が増えるのでオススメです。