技術書を読んで分からなかったら、その本のせいにしよう

技術書を読んでいると、どうしても分からなかったり、読み進めたくても全然進まなかったりします。

それは、その本の説明が悪いのであって、決して貴方の能力の問題ではありません。

どんな説明が分かりやすいかは十人十色です。

尊敬する人に進められた本であっても、分からなかったら今は置いておきましょう。

「自分は頭が悪いんだ」とか思ってしまったら、せっかくの学習意欲が萎えてしまいます。

その本のせいにして、別の本を探しましょう。きっと、貴方に合った本がどこかにあるはずです。

何冊も本を読んだけどやっぱり理解できなかった場合は、それもやっぱり本のせいにしましょう。

そして、その分野は放置しておいて、興味がある別の分野の本を読みましょう。

数年経って、放置していた分野に興味が出てきたら、また改めて本を探してみましょう。

別の分野を勉強していたことによって前提知識がついて、前は読めなかった本が読めるようになっているかもしれません。

もしくは、とても分かりやすい新しい本が出ているかもしれません。

とにかく、間違っても「自分は頭が悪いんだ」などと思ってはいけません。

繰り返しになりますが、分からなかったら、その本のせいにしましょう。

僕がオンライン研修をどのようにやっていたか

このご時世により、4月〜6月までの新人研修はオンラインで実施していました。講師だけでなく、受講者さんもご自宅からオンラインで研修に参加する形です。

使っていたツールとしては、主に下記の3つです。

  • Zoom
  • Slack
  • 自作の進捗管理アプリ(これは長くなるので別記事↓で!)
  • その他

また、ツール以外にも僕が心がけていたことなどをまとめておこうと思います。

別記事↓

masatoshitada.hatenadiary.jp

Zoom

研修の配信ではZoomを利用していました。主な用途としては、講師の画面を共有することによる講義の配信です。

正直、画面共有とブレイクアウトルームの機能さえあれば、Zoom以外でもいいと思います。

ブレイクアウトルーム

演習やディスカッションは、ブレイクアウトルーム機能で数人のチームで進めてもらっていました。

ブレイクアウトルームにすると、講師の声が受講者さんに届かなくなります(講師がルームに1つずつ参加すればいいのですが、それでも1つずつしか声が届きません)。全員宛てのテキストメッセージを送信したりもできるのですが、それに反応を返す術が受講者さんにありません。正直、講師はけっこう寂しいですね・・・😅

しかし、このブレイクアウトルーム機能は積極的に使ったほうがいいと思います。受講者さんにとっては、同期と交流する貴重な機会になるからです。

リモート操作

受講者さんのPCに何かトラブルがあった場合は、その受講者さんに画面共有してもらって原因を探します。それでは解決が難しい問題だった場合は、リモート操作機能で講師が受講者さんのPCを操作しました。

しかしこの機能、講師のOSがmacOSだとキーボード操作が微妙でした(講師がWindows OSだと問題なし)。これは改善してほしいなー。

リモート操作に関しては他のツールもある(TeamViewerとかMacのリモート操作機能とか)ので、それらを検討してもいいと思います。

Slack

Slackには本当にお世話になりました。チャットとしての使いやすさ・操作しやすさもそうですが、UI・アプリ・豊富な絵文字によるリアクションなどで楽しい雰囲気を作りやすいです。後述しますが、楽しい雰囲気作りはとても重要でした。

ちなみに、20〜30名で1ヶ月程度の研修であれば、無料プランで十分と思います。長期間だったり人数が多い場合は、有料プランを検討したほうがいいかもしれません。

チャンネル分け

基本的には、こんな感じでチャンネルを分けていました。

  • 質問
    • 受講者さんからの質問と、講師からの回答(スレッド機能を活用)
    • iPadで書いた図、補足説明、参考URLなどもこちらに書く
  • お知らせ
    • 運営側からの連絡事項を記入
  • 雑談
    • 研修以外の話題
  • 提出
    • 演習課題のソースコードなどを、受講者さんにZIPでアップロードしてもらう

投票アプリ

最初は演習などの進捗管理に使っていたのですが、講義中の発問などにも使えます。オンライン研修では講義が一方通行になりがちです。たまに発問して投票アプリで回答してもらうと、とても双方向感が出て講師も受講者さんも楽しいです。

僕はVotum Pollを使っていました。人数が多くなっても、投票した人の名前が省略(「他○名」みたいに)されないことが決め手でした。

slack.com

自作の進捗管理アプリ

別記事で!

masatoshitada.hatenadiary.jp

その他のツール

ゲーミングヘッドセット

PCのマイクを使って話すこともできたのですが、音質だったり、家の中の音をなるべく拾わないようにと考えると、専用のマイクは必須でした。

Amazonでいろいろ調べた結果、ゲーム用のヘッドセットが一番コスパが良いと判断しました。

咽喉マイクも試したのですが、

  • マイクの音質が良くない(トランシーバーで話してるみたいな声になる)
  • 水を飲んだりする音がリアルに聞こえる
  • 周りの音も拾わないわけではない(キータッチ音とかが少し聞こえた)

という理由から使いませんでした。

Parallels Desktop

自宅PCはMacBook Pro、会社の業務用PCはiMacですが、研修ではWindowsを使うこともあります。途中までは自社の研修用Windows PCを使っていたのですが、Slackなどでタイピングが多くなるオンライン研修で、慣れないキーボードやショートカットはかなりの負担でした。

なので、MacBook Proに仮想化してWindows 10をインストールしました。

以前は仮想化にVirtual Boxを使っていたのですが、動きが遅い、画面描画が汚い、不安定(業務用iMacではゲストOSを起動しようとすると何故かホストのmacOSがダウンする)など、様々な問題がありました。

そこで、TwitterでTLの方から教えていただいたParallels Desktopを使ってみると、これは良かった!

  • 動きが軽快!
  • 画面描画が綺麗!
  • 安定して動作する!
  • 設定すればMacとほぼ同じショートカットが使える!(設定方法は別記事

トライアル期間が終わった後、すぐに課金しましたw

iPad + ペン

オンライン研修では、オフラインではいつも使っている物理ホワイトボードが使えません。

どうやって図を書いて共有するか、色々と検討しました。

(1) ペンタブレットを使う → 不採用
  • 書いている場所(ペンタブ)と、書いているものが映る場所(PC画面)が違うので、書くのが難しかった
  • 液晶ペンタブだと値段がiPad並み
(2) iPadのSidecar機能でMacの画面をiPadに映し、図を書く → 不採用
  • 個人で持っていたiPad Air 2と古く、Sidecarに対応していなかった
(3) iPadおよびMacに画面同期アプリをインストールし、iPadの画面をMacに映し、図を書く → 不採用
  • 使っていたiPadのお絵かきアプリ「アイデアメモ」が横向き(Landscape)に対応していなかった(縦向き(Portrait)だとZoom画面に映る図が小さくなってしまう)
(4) iPadもZoomミーティングに参加させて、Zoomのホワイトボード機能で図を書く → 採用!!
  • 横向きでも絵を書ける
  • スクショを取ればSlackにも簡単にアップできる

iPad Air 2はApple Pencilに対応してないので、安物のペンを買いました。

最初の2ヶ月くらいは良かったのですが、2ヶ月を過ぎたくらいから不安定(たまに書けなくなる)になってきました。これは対策を考え中・・・

会社から持って帰ってきたモニター

研修開始前に、会社で使っていた業務用追加モニターを、家に持って帰ってきました。

オンライン研修ではZoomとかSlackとか色々と開くので、持って帰ってきといてよかったです。

ノートPCスタンド + #magicTray

最初はMacBook Proだけだったのですが、

  • 常に下を向くので、首や肩に悪いかなと思った
  • MacBook Proのバタフライキーボードに不具合が出てきた(Enterが2回連続で押される)

という理由から、ノートPCスタンドを使い始めました。

そして、Magic Keyboard + Magic Trackpadをサムライズムさんの #magicTray に乗せて使っています!

心がけていたこと

受講者さんからのフィードバックを即座に反映する

受講者さんには、毎日の日報で「オンライン研修の進め方に対して感想や要望」を書いてもらっていました。

オンライン研修は初めての試みだったので、日々色んな施策を試していました。日報を確認して、どの施策が好評だったのか(or 不評だったのか)、他にどんな要望があるのかを毎日確認した上で、翌日の研修に活かしていました。

4月・5月・6月とそれぞれ別のお客様だったのですが、それぞれ感想や要望は違っていました。フィットした施策は毎回違っていました。

フィードバックをすぐ翌日に反映することで、受講者さんからの信頼を得るという効果もあったと思います。

質問しやすい雰囲気を作る

オンライン研修では、ネットワーク切断などのトラブルがよく発生します。

なので「『ここの部分を聞き逃したのでもう一度説明してください』という質問は歓迎です!」と伝えました。

副次的に、それ以外の質問も増えたように感じます。

楽しい雰囲気を作る

4月・5月は緊急事態宣言下であったり、入社以来ほとんど上司や同期とも会ったことが無いなど、不安を感じている方も多かったようです。

普段の講義やSlackの雑談チャンネルなどで、楽しい雰囲気を作ることを心がけました。

前の方でも書きましたが、Slackは楽しい雰囲気が作りやすくて本当にお世話になりました。

最後に

ここまで書いたことは4〜6月までに僕が試行錯誤した結果なので、環境によって合うもの・合わないものなどあると思います。

何か1つでも、参考になれば嬉しいです。

Spring Boot・Spring Session・Herokuでオンライン研修に役立つアプリを自分で作った話

このご時世もあり、お客様の新人研修をリモートで実施することになりました。僕が担当した範囲では、講師だけでなくすべての受講者さんがほぼ全日程、自宅からオンラインで研修に参加しました(ツールとしては主にZoomとSlackを利用。そのへんは別記事にて)。

別記事↓

masatoshitada.hatenadiary.jp

4月に初めてオンライン実施した中で大きな課題が見えてきたので、5月以降の研修に向けて、ゴールデンウィーク中にその課題を解決するためのアプリを自分で作ることにしました。

4月で見えてきた課題

4月の研修が、僕にとって初めてのオンライン研修担当でした。色々と試行錯誤しましたが、「技術を身につけていただく」という点ではオフラインの研修と変わらずにできたと感じました。

しかし、課題もありました。

オフラインならば講師が、部屋を巡回して受講者さんの進捗を把握したり、PC画面を覗き込んでトラブルを見つけたりできます。

オンライン研修では、それができません。作業や演習の進捗にしても、PCトラブル等にしても、すべて受講者さん側からアクションしてもらわないと、講師は気付くことすらできません。

4月はチャットとしてSlackを使っていたので、Votum Pollという投票アプリで進捗やトラブルを報告してもらっていました(下記はイメージ図)。

f:id:MasatoshiTada:20200622110008j:plain

これはこれで良かったのですが「誰がまだ報告していないかをひと目で確認できない」という弱点がありました。

未報告の人はトラブルで困っているケースが多いため、いち早くその人を特定して講師から様子を伺う必要があります。しかし、実際の研修では受講者さんが数十名いらっしゃるので、その中から未報告の人を特定するのはとても時間がかかりました。

Slackで使える投票アプリは他にも色々試したのですが、僕が確認した限りでは、未報告の人を一覧できるアプリはありませんでした。

進捗管理アプリのコンセプト

このような課題と、色々と探しても適したツールが無さそうということから、自分で作ることにしました。コンセプトは次のとおりです。

(実際に考えてたときのメモ書きです。走り書きなので字が汚くてすいませんw) f:id:MasatoshiTada:20200622112317j:plain

(1) スマホ操作

オンライン研修では受講者さんは、Zoom・Slack・IDE・ブラウザなど、PCの1つの画面で多くのものを動かしています。全員が2つ目の画面(追加モニターやタブレットなど)を持っているとは限りません。そのような状況で、PCで動かすものを更に増やしたくありませんでした。

代わりのデバイスとして考えられるのは、全員が持っていて操作にも慣れているであろう、スマートフォンでした。

短期間でiOSアプリ・Androidアプリとして作ることは困難だったため(審査に時間がかかるし、そもそも自分に知識が無い)、ブラウザから操作できるWebアプリとして作ることにしました。

(2) ボタン一発

イメージとしては「Amazon Dash Button」です。ボタン1つで進捗やトラブルを報告できるようにしたいと考えました。

(3) トラブル報告しやすい

「ボタン一発」と重なりますが、進捗だけでなくトラブルも簡単に報告できるようにしたいと考えました。

(4) 報告していない人を含めて一目瞭然

Slackの投票アプリで大変だった「未報告の人を早く特定する」を可能にしたいと考えました。

ユースケース

作るべき機能を整理するためにユースケース図を書いてみました。

(実際に書いたユースケース図) f:id:MasatoshiTada:20200622113749j:plain

アクターとしては「講師」「受講者」の2種類です。

  • 講師
    • ユーザー(=受講者)を登録する
    • 項目(=報告する項目)を設定する
    • 進捗を見る
  • 受講者
    • 進捗を報告する
    • トラブルを報告する

画面デザイン

絵心も知識も無いので「デザイン」なんて呼べる代物では無いのですが😅

(実際に書いたデザイン) f:id:MasatoshiTada:20200622114440j:plain

受講者さんが使うスマホ画面には、大きめのボタンを配置します。特に重要なトラブル報告ボタンは一番上に配置しました。

これを書いていた当時はWebSocketを使って「講師が項目を登録したら、受講者さんの画面も自動更新される」ことを考えていたのですが、後で説明する理由から一番下に「再読み込み」ボタンを配置するだけにしました。

技術選定

ベース技術

  • サーバーサイド = Spring Boot
  • フロント = jQuery

開発を思いついたのがゴールデンウィーク中、かつゴールデンウィーク明けには次の研修が始まる予定だったため、今回の開発はプライベートの時間を使っていました。

しかし自宅に生後数ヶ月の子供がいるため、そんなに多くの時間を割くことはできませんでした。もし時間があれば、学習ついでに未知の技術(考えていたのはサーバーサイドはGo、フロントはReact)を使ってみたかったのですが。。。時間を割くことに協力してくれた妻には、本当に感謝です。

なので、「自分が新規に学習しなくても使える技術」で開発することがMUSTでした。となると僕には、サーバーサイドはSpring Boot、フロントはjQueryという選択肢しか無かったのです。

今後時間があれば、Go + Reactにしたり、Slackアプリとして作ってみたりしたいですね。

デプロイ先の選定と通信の暗号化

この進捗管理アプリは受講者さんの氏名という個人情報を扱うので、暗号化は必須要件でした。具体的には「ブラウザ↔サーバー間(HTTPS)」「サーバー↔DB間」の通信の暗号化です。

僕はインフラ知識はほとんどありません。サーバーをHTTPSで公開した経験もありませんでした。そんなインフラド素人でも簡単に通信暗号化できるようなプラットフォームが必要でした。

Pivotal Web Servicesや他のクラウドサービスなど色々と試したのですが、最終的には会社の若者に教えてもらったHerokuを使うことにしました。

Herokuは自分で証明書などを用意する必要もなく、デフォルトで通信がHTTPSになります。

SSL Endpoint | Heroku Dev Center

Spring Bootアプリの場合、 spring.datasource.url などのプロパティ設定は環境変数を使ってよろしくやってくれます。

Connecting to Relational Databases on Heroku with Java | Heroku Dev Center

Heroku Postgresを使えば、アプリをデプロイするだけでJDBC URLに sslmode=require というパラメーターが付加され、DBとの通信も暗号化されます。

Connecting to Relational Databases on Heroku with Java | Heroku Dev Center

Gitで管理したプロジェクトのルートディレクトリで、下記のコマンド3つを実行するだけでデプロイできます。

# URLが 一意なアプリ名.herokuapp.com になる
heroku create 一意なアプリ名

# Heroku Postgresを作成
heroku addons:create heroku-postgresql:hobby-dev

# Herokuにデプロイ
git push heroku master

「デプロイするだけでオールOK!」というのは、僕のようなインフラ弱者にはとてもありがたいです!!

負荷分散とセッション共有

受講者さんは数十名規模であったため、スケールアウトによる負荷分散を考える必要がありました。アクセスを捌く意味ではインスタンス数を増やせばいいのですが、その場合セッション共有を考慮する必要があります。通常、セッションはサーバー内にインメモリで保持されるため、複数インスタンス間で共有できないからです。

Spring Sessionを使えば、セッション情報をRedisやRDBなどに保存できます。これにより、複数インスタンス間でセッション情報を共有できます。

以前Spring Session Redisを使ったことがありました。しかし今回は、Spring Session JDBCRDBにセッション情報を保存することにしました。

  • 管理するミドルウェアを増やしたくなかった
  • サーバー↔Redis間の通信暗号化をどうするのか調査する時間が無かった
  • 初めて使うけどSpring Bootだし多分簡単だろう

というのが理由です。

pom.xmlに下記のライブラリを追加して、

<dependencies>
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <scope>runtime</scope>
    </dependency>
    <!-- その他、starter-web, starter-thymeleaf, spring-boot-starter-security, mybatis-spring-boot-starterなど -->
</dependencies>

application.propertiesに下記の設定を書くだけです。

spring.session.timeout=1h
spring.session.store-type=jdbc
# デフォルトで用意されているSpring Session用のCREATE TABLE文を、起動時に実行する
spring.session.jdbc.initialize-schema=always

しかし・・・Herokuは無料プランでは1アプリ1インスタンスのみという制約がありました。しかも、実際に運用したら1インスタンスで数十名のアクセスを捌けたので(数十名が一気に同時アクセスするわけではないため)、今回はSpring Sessionは要らなかったかもしれませんw

WebSocketかポーリングか

  • 講師用画面で、受講者さんの進捗をリアルタイムで確認する
  • 受講者用画面で、講師が更新した進捗項目をリアルタイムに確認する

これを実現するには、WebSocketやポーリング(例:5秒毎にアクセスする)などを利用する必要があります。

最初はWebSocketを考えていたのですが、やりたいこと(特に、講師が項目を更新したというイベントを拾って受講者用画面を更新)をSpring Bootで実現することがどうも難しそうだったこと、WebSocketでの通信暗号化をどうするのか調査する時間が無かったことから、ポーリングを選びました。今考えても、これで十分だったと思っています。

また、受講者用画面の更新は、受講者さん自身に画面の再読み込みをしてもらえばOKと判断しました。工数的な問題もあったのですが、講師が進捗項目を更新するのは演習や作業ごとなので、そんなに頻繁ではないということが理由です。ただし、iPhoneChromeだと再読み込みの操作に手間がかかる([…]をタップ→[再読み込み]をタップ、という2ステップになる)ため、画面一番下に「再読み込み」ボタン(押されたら location.reload() するだけ)を付けることにしました。

完成したアプリ

今回は説明していませんが、もちろん講師用画面・受講者用画面ともにログイン必須になっています。

講師用画面

f:id:MasatoshiTada:20200622142713p:plain

本来だと数十名の情報が1画面で確認できます。

5秒に1回ポーリングするので、ほぼリアルタイムに進捗を確認できます。また、誰がヘルプを求めているか、誰が未報告かをひと目で確認できます。これにより、誰に声をかければよいのかすぐに判断できるようになりました。

講師名が文字化けしてるのはご愛嬌w

受講者用画面

f:id:MasatoshiTada:20200622170849p:plain

f:id:MasatoshiTada:20200622170902p:plain

ヘルプボタンを一番上に配置して、ヘルプを求めやすいようにしました。目立つように赤色、かつサイズを少し大きくしてあります。

受講者さんが自分で報告した項目が分かりやすいように、選択したボタンはベタ塗りになるようにしています。

一番下には再読み込みボタンを配置しました。

実際に運用して

作ってよかった、の一言です。誰がヘルプを求めているか・誰が未報告かがひと目で確認できるため、すぐに講師として適切なアクションを取ることができたのが、特に良かったです。

突貫工事で作ったので色々と粗はあるのですが、工数をあまり割けなかった中で「本質的な課題は何か」「それを最小限の手間で解決するにはどうするか」を真剣に考えたのは、とても良い経験になりました。

ちなみに、ソースコードがひどいのでGitHubなどで公開するつもりはありませんw

「みんなのJava」を読んだ #minjava

ザッとですが読んだので、感想を書こうと思います!

この本の対象者

ある程度はJavaの経験がある人向けですね。Java 8くらいまでの知識はあるけどそこから知識をアップデートしたいという人が、全体像をザックリ掴むにはうってつけの本です。あくまで全体像なので、あとは気になった内容は自分で調べればいいと思います。そのための情報源(各種リンクなど)も記載されています。

ご自分で勉強して最新のJavaを追っている方でも、この本はとても役に立つと思います。この本がカバーしている範囲はとても広いので、そういった方でも勉強になる部分は多いのではないでしょうか。

一方、Javaがまったく初めてという人は、この本の対象からは外れると思います。Java界隈の用語が当然のように出てくるので。

バランスが良い

前述の通り全体像をザックリ掴むための本ですが、コード例や、章によっては実際に動かすための手順も説明されているため、手を動かしながら学ぶこともできます。

紙面も限られている中でこのバランス感を出すのは大変だっただろうな・・・。

著者人が豪華of豪華

著者は皆さん、Javaコミュニティで情報発信していらっしゃる方で、「この内容はこの人だろうな」という方ばかりです。当然、各章の内容はとてもしっかりと書かれています。おそらく、この本を書くために改めて調査したこともたくさんあるでしょうし、その労力は想像できません。本当にありがたいです。

各技術の背景がしっかり説明されている

各章、「この技術が出現した背景は何か」から説明されています。単に技術そのものを知るだけでなく、なぜその技術が必要なのかというところまで含めて理解できます。

特に個人的に勉強になったこと

第2章以降の内容は濃淡はあれども少しは追ったことがある技術だったのですが、第1章のJava 9〜14(=Java SE)の内容はあまり追えていなかったので、とても勉強になりました。まだザッとしか読んでいないので、もう1周読もうと思います。

まだプレビューな新機能も多いですが、おそらく次のLTSであるJava 17(2021年9月リリース?)のころには正式に使えるようになっていると思うので、楽しみですね!

ということで

Java経験がある方には、この本はとてもオススメです。

著者の皆様、素晴らしい本を書いていただき、ありがとうございます!

僕の英語学習で役に立った物たち

この記事は、英語に関するポエムです。

これまで3年くらい英語の勉強を続けてきて、海外カンファレンスでLTしたり、TOEICで900点近いスコアをコンスタントに出せるようになってきたので、これまで勉強したことをまとめておこうと思います。

エンジニアにとっての英語の必要性

英語に限らず、語学は一般に4つのスキルに分けられます。

  1. Reading (読む)
  2. Writing (書く)
  3. Listening (聞く)
  4. Speaking (話す)

今のエンジニアの方々にとって、ほぼ必須なのは1.でしょう。現代のITは進化が速いため、日本語の書籍やドキュメントなどは数が減っているように感じます。なので、公式のドキュメントを読んだり、GitHubのIssueを読んだり、Stack Overflowを読んだりすることは日常茶飯事でしょう。

そこから一歩進んでいる方は、2.も必要になるでしょう。GitHubのIssueを書いたり、海外ベンダーにメールで問い合わせたり。

また、海外カンファレンスに参加したり、外資系企業に転職したりするには、3.や4.も必要になります。

僕の英語レベル

高校生まで

英語(特に長文読解)は比較的得意でした。センター試験では9割くらい取れてました。ただ、文法の理解があいまい、かつ語彙力(知っている英単語の数)が低いため、私大や国公立2次試験の問題になるとてんでダメ、という感じ。典型的な理系で、暗記がとても苦手でした。

大学生

大学生になってからは英語に触れる機会はあまりなく、たまに読む英語論文もとても苦労していました。4年生のときに初めてTOEICを受験して、たしか440点くらいだったと記憶しています。

社会人

社会人になってからも、英語に触れる機会はほぼありませんでした。

しかし、2013年くらいからJava EEをやるようになり、当時は日本語の書籍も少なかったため、JSRやJava EE Tutorialなどを英語原文で読まざるを得ないようになりました。このころは、とても苦労して1段落を読むのに何時間もかかっていたと記憶しています。

さらに、2016年くらいからPivotal社とのビジネスをするようになった時に、「これは腹をくくるしか無い」と思って、本格的に英語の勉強に取り組むようになりました。

基本的にはTOEICを活用して勉強しました。2016年に820点くらい、2017年に860点、2018年は少しサボって820点台に逆戻り、2019年は2回受けて910点・875点を獲得できました。

また、2017年から3年連続でPivotalのSpringOneカンファレンスに参加しました。2019年にはSpringOneで5分間のLTをすることができました。

2019年現在の僕のスキル

  • Reading
    • 英語ドキュメントは読むのに苦労しない。出てくる英単語は95%以上知っているもの。ただし、日本語ドキュメントよりMP消費は速い(体力・気力が必要にはなる)。
    • リアルタイムのチャットには何とかついていける。
  • Writing
    • Grammarly(後述の校正ツール)を使えば、メールやチャット、GitHubのIssueを書くなどは問題なし。
  • Listening
    • ややゆっくりめに喋ってもらえば、何を言っているか分かる
    • ネイティブの本気のスピードで喋られるとほとんど分からない
    • 海外ドラマなどを観てもサッパリ分からない
    • 海外カンファレンスに参加しても、喋っている内容は半分も分からない
  • Speaking
    • 文法(時制とか)的に正確に喋るには時間が必要
    • 日本語で思ったことをそのまま英語で喋ることはできない。いったん簡単な表現などに変換すれば喋れる。

学習の目標設定

学習って、明確な目標が無いと続かないと思います。その目標は、結果が素早く自分に分かりやすく出るものが良いですね。

僕の目標は、TOEICと年1回の海外カンファレンス参加です。「TOEICで前回よりも良いスコアを取りたい」「海外カンファレンスで、去年よりも聞ける・喋れるようになりたい」というのがモチベーションでした。

英文法

英語の基礎は、英文法と英単語です。英単語は英文を構成するパーツであり、英文法はパーツの組み合わせ方です。無理やりITに例えるなら、英単語は個別のテクノロジーで、英文法はアーキテクチャーでしょうか。

どちらから先に学ぶかは人それぞれと思いますが、僕は先に英文法を選択しました。苦手なので英単語の暗記は後回しにしたかった、というのが理由です。

英文法もまともにやるとかなり範囲が広いので、TOEIC対策の薄めの本をやることにしました。下記の本は本当に必要最小限に内容が絞られていて、モチベーションが続きやすかったです。

TOEIC(R) TEST 英文法 出るとこだけ!

英単語

前述の通り、英単語から逃げる事はできません。単語が分からないと、読めないし書けないし聞けないし話せません。

まずは、TOEIC対策で必要最小限の単語が載っている本を使いました。付属の赤シートを使いつつ、とにかく反復して反復して覚えました。熟語はよく分からないので飛ばしました。これだけでも、TOEICの英文も技術ドキュメントもかなり読めるようになりました。

CD-ROM付 改訂版 TOEIC(R)TEST 英単語 出るとこだけ!

2018年暮れに、下記の本を買いました。英熟語の多くは「動詞+前置詞」なもので、その感覚を養ってくれました。やや厚さはありますが、イラストばかりなのである程度気楽に読むことができました。

DUO elements 前置詞/副詞

熟語に自信を持てたので、2019年初頭くらいに一気に語彙を増やすことを決意しました。熟語と同じシリーズの「DUO 3.0」を選びました。

例文で覚える形式、例文がちょっと面白くて覚えやすい、CDで60分で全て聞けるなど、自分にとってとても覚えやすかったです。通しで数十回は聞きました。

DUO 3.0を丸暗記したことで、技術ドキュメントなどを読んでいて知らない単語で引っかかる回数が更に減り、スムーズに読むことができるようになりました。

DUO 3.0

Reading

リーディングに関しては特別なことはしていません。試験対策がてらTOEIC公式問題集を解いたのと、あとは日常的に業務などで技術ドキュメントを読んでいました。その中で、時間をかけて少しずつ鍛えられていった感じです。

公式TOEIC Listening & Reading 問題集 5

Writing

ライティングに関しても、特別なことはしていません。業務などで英語メールを書いたり、プライベートではGitHubのIssueを書いたりしていました。

ライティングでお勧めしたいのはGrammarlyという英文校正ツールです。英文法的に間違いがあれば指摘してくれます。それだけでなく、ニュアンスなども指摘してくれるため、特にメールを書くときは神ツールです。各OSに対応したアプリもあるし、各ブラウザのエクステンションとしても使えます。

Grammarly

Speaking

話すときに必要なのは「フレーズ」です。特定のシチュエーションでお決まりのフレーズを知っておくことが重要になります。

初めて読んだのが下記の本です。シチュエーションはビジネス限定ですが、日常会話でも使えるフレーズが多いです。会話例が面白いし、重要なフレーズは繰り返し出てくるので、何回も聞いて覚えました。

英会話ペラペラビジネス100 - ビジネスコミュニケーションを成功させる知的な大人の会話術

次に読んだのは、NHKの「おとなの基礎英語」シリーズです。これはシチュエーションドラマがとても面白く、何回も見て覚えました。

NHKテレビ DVD BOOK おとなの基礎英語 Season4

NHKテレビ DVD BOOK おとなの基礎英語 Season5

NHKテレビ DVD BOOK おとなの基礎英語 Season6

おそらく、英語学習に興味がある人が一度は通るのが下記の「瞬間英作文」という本です。タイトルの通り、書かれている日本語に対応した英文を瞬間的に発話するという本です。文法としては中学レベルなのですが、時制や単数形・複数形などを意識して瞬間的に発話するのは、最初はとても難しかったです。とてもいい練習になりました。

どんどん話すための瞬間英作文トレーニング

2019年の後半になってから(DUO 3.0の勉強が終わった後くらい)、「自分が滑らかにしゃべれないのは音読が足りてないからではないか」と思いました。DUO 3.0は単語熟語集としては自分的には最強なのですが、1つ1つの例文が短いため音読向きではありません。

長めの文章の本は無いかな?と思って見つけたのが「速読英熟語」でした。音読しやすい文章量だし、熟語の復習にもなるかなと。

速読英熟語

やはり実際に声に出して読む練習を重ねることで、いざ喋るときも口から滑らかに英語が出るようになりました。少なくとも以前よりは。

Listening

正直、リスニングは僕にとっては最も自信のないスキルです。そんな中で、今まで僕が効果があったかなというものを紹介します。

語彙力アップ

まずは英単語・英熟語を知ることです。音が聞き取れても、単語を知らないと意味が分かりません。単語集などで勉強する際、繰り返し付属のCDを聴いて各単語の発音を理解しましょう。

併せて、自分でも発音することをお勧めします。このとき、日本人的なカタカナ発音ではなく、CDの真似をしましょう。発音記号も読めるようになった方が良いです。読むだけで音をイメージできるようになります。

TOEICリスニング出るとこだけ!

TOEIC(R) TEST リスニング 出るとこだけ!

このシリーズには本当にお世話になっています。2016年に社会人初TOEICの際に読みました。

YouTube動画を見る

最近は、ネイティブの方も非ネイティブの方も、YouTubeで英語の解説をしている人が増えています。YouTubeなので無料です。活用しない手はありません。

おすすめは、ニック先生とサマー先生です。特に下記の動画は必見です。お二人とも、とてもお上手な日本語で解説してくれますのでご安心を!

ニック先生:英語が聞き取れるようになる 7つのポイント(Part 1)

ニック先生:英語が聞き取れるようになる 7つのポイント(Part 2)

サマー先生:知らないと困る音声変化シリーズ

ELSA

ELSA

自分の英語発音を判定してくれるスマホアプリです。たまたまセールがあったので、ライフタイム会員(一生有効)になりました。セールで10000円くらいでした。

「なぜリスニングなのに発音?」と思われるかもしれませんが、自分が発音できるようになった音は、聞き取れることが多いです。これは実感としてそう思います。

ELSAは判定するだけなので、具体的な発音方法は別途Webなどで調べながら学習しました。

これからどうするか

英語だけの学習は、一旦おしまいにしようと思っています。技術の勉強がおざなりになっていたので・・・。TOEICもしばらくは受けないつもりです。

今後は、技術書やビジネス書を英語原著で読んだりしようと思っています。

まとめ

今の僕は、試行錯誤しながら3年くらい勉強した結果です。

とは言っても、今回書いたものの2倍以上は、続かなかったり効果が無かったりした勉強法があります。その度にめげそうになったりしましたが、自分をなだめたりごまかしたりしつつ、英語学習を継続してきました。とにかく継続することが大事です。

少しでもこの記事が、読んでくださった方の試行錯誤に役立てば嬉しいです。

SpringOne PlatformでLTしてきたぞ!

Pivotalが毎年開催しているカンファレンスSpringOne Platformに、今年も参加してきました。一昨年・昨年に続き、三回目の参加になります。

今年は初の試みとして、カンファレンス前夜祭でのLTにチャレンジしてきましたので、そのことについて書こうと思います。

経緯

SpringOneの前夜祭では、LTが恒例行事になっています。このLTは公募制で、事前にCfPを出しての選考があります。

僕は今回で3回目のSpringOne参加になるので、今年は是非LTにチャレンジしたいなと思っていました。

そう思っていた矢先、SpringOne参加者へのメールでLTへのCfP開始のお知らせが来たので、これはCfPを出すしかないなと思った次第です。

ただ、そのメールが来たのが8/20で、締め切りが9/2というなかなかのハードスケジュール😅

ネタを何するか?

CfPを書くに当たり、問題は2つあります。1つはネタを何にするか、もう1つは魅力的なCfPを英語でどう書くか、でした。

まずネタについて。SpringOneという海外のカンファレンスで発表するには何がふさわしいか。海外の方が知らないような内容は何か。また、Pivotalのカンファレンスなので、マイクロサービス・Cloud Foundry・Kubernetesなどに関連した技術がいいでしょう。

いろいろ考えたのですが、自分が話すことができるネタは、2つしか思いつきませんでした。1つはORマッパーのDoma、もう1つはサーキットブレイカーのResilience4jです。他のネタも浮かんではいたのですが、カンファレンス本体のセッションと重なることも多く、ボツとしました。

前者のDomaは、仕事でも使っていました。公式ドキュメントの英語化プロジェクトの際に参加できなかった(いろいろ考えてるうちに完成していた😅)ので、何らかの自分なりに貢献をしようと思ったのでした。

後者のResilience4jは、以前国内でのLTもしていました。実は本体のセッションと内容が重なるのですが、マイクロサービス関連のことで今の時期に自信をもって喋れることは、これしかありませんでした。

魅力的なCfPを英語でどう書くか

英語の勉強はここ2-3年やっていたので書くことはある程度は大丈夫なのですが、CfPを魅力的に書くにはまた別のスキルが求められます。これは、経験のある方にレビューしてもらうしか無いなと思いました。

ふだんJJUG界隈でお世話になっている方で、真っ先に浮かんだのがJavaチャンピオンの一人である @cero_t さんでした。海外での登壇経験が豊富で、SpringOneでの登壇経験もおありだからです。お願いしたところ、Oracle Code One直前にも関わらず快く引き受けてくださいました。

前出2つのCfPを自分で書いて、@cero_tさんにレビューしてもらうことを何回か繰り返しました。そのやり取りの中で、CfPを書く際のポイントを的確にアドバイスしていただきました。

少し話はそれますが、英文自体のチェックはGrammarlyを使っていました。以前から有償版を使っています。文法自体の正確さだけでなく、表現として適切かどうかもチェックしてくれて、非常に便利です。

結果は・・・

締め切りから2週間程度で結果通知がメールで来ました。結果として、Resilience4jネタが採用されました。

そのメールの中で、「当日の1週間前までに発表スライドを送ってくれ」と書かれていました。ジャスト2週間!

発表スライドを作る

このLTはちょっと特殊なLTです。時間は5分間、スライドは全20枚と決まっており、さらにスライドは1ページ15秒で自動的に進められる(自分で進めることはできない)のです。

スライドを作るとともに、英語で話す内容も考えなくてはなりません。

発表スライドのレビューは、数年前のSpringOneで同じLTに登壇されていた@bufferingsさんにお願いしました。

思わぬ交流

スライドを作るためには、技術的にもいろいろと調べる必要があります。そういったことをTwitterでぶつぶつ言ってると、思いもよらぬリプライを頂きました。

Resilience4jの作者である@rbrtwnklrさんです。おそらく、「Resilience4j」でエゴサーチしてらっしゃったんでしょうねw

ちょうどResilience4jの1.0.0がリリースされる直前の時期で、内部アーキテクチャが変わったことなどをTwitter上で色々教えていただきました。また、「スライドのレビューもするよ!」と言ってくださりました。OSSTwitterの面白いところですね。

海外の方なのでやり取りはすべて英語なのですが、読み書きはできるので問題ありませんでした。英語の勉強しててよかった!!!

ひたすら練習

@rbrtwnklrさんに教えて頂いたこともあり、スライドは早めに完成しました。あとは英語でしゃべる練習です。各スライド15秒以内で喋らなければならないので、実際に口に出して練習しつつ、話す文章の量を調整する・・・という作業をひたすら行いました。

最初は文章をカッチリ決めて丸覚えする方向だったのですが、それだと緊張して内容が飛んだときにリカバリーできないと考えたため、スライドを見ながらしゃべる内容を考えるスタイルに切り替えました。結果的には、何回も繰り返し練習してたので丸暗記してしまいましたが。。。

いよいよ本番!

10/7(月) 19:00〜、本番のLTでした。LTスピーカーは僕を含めて10名(日本人は僕だけ)、僕は5番目の発表となりました。

緊張感は高まるばかり・・・。1〜4番目の方々は、英語はもちろん発表自体も非常にお上手な方ばかりで、より緊張感が増しました。

「内容も修正できないし、英語力は瞬間的に上がらないし、本番でできることといえば元気よくやることくらいだ。声出していこう!」と思い切ることにしました。

いよいよ自分の出番です。観客はおそらく300名近く。場所は海外。やっぱり緊張します。

実際に話してみると、舌が回らない、話す文章が一瞬出てこないということが何回もありました。また、緊張から練習よりも早口になってしまい各スライドで時間が余ってしまう、ということが何回もありました。観客の方を見る余裕もありません。

それでもなんとか、最後まで話すことができました。

やってみてどうだったか

「これが今の自分の実力なんだろう」と思いましたし、今できる全力は出せたと思っています。それでも、終わった後は「もっと上手くしゃべれるようになりたい」という気持ちが大半を占めていました。後悔はありませんが、力不足を実感しました。

でも、聞いてくださっていた@suzukijさん(翌日に70分セッションで発表予定!)から「カッコよかったですよ!」と言っていただけたり、翌日に「Resilience4jのLT聞いたよ!」と声を掛けてくださった方がいたり(もちろん英語で)、やっぱりやって良かったな、とも思っています。

また機会を見つけてチャレンジしたいです。

CfPをレビューしてくださった@cero_tさん。スライドのレビューをしてくださった@bufferginsさん、@rbrtwnklrさん。改めて本当にありがとうございました。みなさん無しでは、今回のチャレンジはありませんでした。

チャレンジするということ

自分も30半ばになり、社内に自分より若いメンバーも増え、若手とは言えなくなってきました。

若手はみんな自分よりも技術力が高いし、そんな中でオッサンたる自分が新しいことへのチャレンジを続けないと、存在価値が無いんじゃないかと。

社会人になって10何年になりますが、チャレンジすることをやめているオッサンは本当にカッコ悪いなと思っていました。

未知の領域に踏み出すほんの少しの勇気と思い切り、諦めない粘り強さ、そして自分を信じることを、これからも続けていこうと思います。

2018年振り返り。

コミュニティ登壇

  • 2月
    • WEBエンジニア勉強会で12Factorネタ
    • JSUG SpringOne報告会
  • 4月
    • GlassFish勉強会でBean Validation 2.0ネタ
  • 5月
    • JJUG CCCでSpring 5.0ネタ
  • 6月
    • Springハンズオン(自社、JSUGJava女子部)
  • 7月
    • DevRelConで初の英語登壇(スポンサーLT)
    • Springハンズオン(岡JUG)
  • 8月
    • Springハンズオン(関ジャバ)
  • 10月
    • JSUG Spring FestでSpring Security 5.1 + OAuth 2.0ネタ(&運営)
  • 11月
    • 中央線MeetupでSpring Securityネタ
  • 12月
    • Springハンズオン(JJUG CCC)

12月で、CCCでの登壇が10回連続10回目となりました。

その他、GlassFishユーザー会やSpringユーザー会で何回か勉強会の運営側をやっていました。

特に9月にGlassFishユーザー会で開催したJDKリリースモデル(Azulさん、IBMさん)の回は印象深いです。

Jakarta EEが落ち着いた頃に、またGlassFish勉強会やりたいですね。

仕事

  • これまでの色々な活動が実り、Pivotal認定のSpring研修がヒットしました。特にCore Springは弊社のトップ5に入るくらいの人気コースになりました。
  • 出張でJava EE系の研修もたくさん実施しました。
  • 今年一番うれしかったのは、かずひらさんといろふさんがSpring Security研修を受けに来てくれたことです。とても楽しい1日でした。お二人の質問レベルがハンパないので、大変でもありましたが。
  • 昨年に引き続き、SpringOneに行く機会をいただきました。昨年仲良くなった方が退職されて会えず少し残念・・・。

英語

去年12月にSpringOneに行って以来、目標を失っていて正直サボってました・・・。それでも10月のTOEICで825点を取れて意外にキープできてるなと思いました。

その後は、主に文法の再勉強をしています。そして来年、またTOEICを受けてみようかなと。

その他

  • 開発環境の中でDBなどのミドルウェアの類は、すべてDockerで動かすようにしました。
  • 前のMacBook Airがメモリ8GBしかなかったので、11月にメモリ16GBのMacBook Proに買い替えました。
  • 中小企業診断士を休止&退会しました。残りポイントなどのことを考えると、実質的に診断士ではなくなりました。コスパがあんまり・・・と思ったので。

来年に向けて

  • 仕事でGitが必要になったので、冬休みの宿題として勉強中です。
  • もろもろ日程が合えば、JOnsenに行ってみたいです。
  • コミュニティ活動は、変わらず続けていきます。
  • 英語は強みにしたいけどまだまだなので、勉強を続けていきます。現役のエンジニアではない自分には、技術以外の強みも必要だと思っています。
  • 技術としては、AWSKubernetesといったクラウド技術全般を触っていきたいなと思っています。