SKYROCKETING WORK!

日常のエントロピーを上げてくぞ🚀

NAISTに入学してからもうすぐ3ヶ月が過ぎます。

このエントリは社会人学生 Advent Calendar 2019 - Adventarの22日目の記事です!

自分は今年の9月末に退職をして10月からNAISTで修士課程に在籍して自然言語処理をやっている元社会人学生です。
本エントリでは1クォータが過ぎての感想です。

NAISTでの生活はどうか、講義や研究はどうなのかみたいな、特に聞かれてもいない「元気にやってますか?」への解答を語ります。
会社をやめて修士課程に入ろうかと考えている人の参考になったら良いなと思います。

ちょっとポエミーな文章になっていますので、ご注意を。

ここまでのあらすじ

入学数日後に書いた意気込みと合格体験記、退職エントリの入り混じったポエムです。
www.skyrocketing.work

NAISTで過ごして1ヶ月が経ち、興奮冷めやらぬまま書いた近況報告です。
www.skyrocketing.work

本題

約3ヶ月を振り返ってみてどうだったか。

引き続き、入ってよかったなと思っています。
1mmも後悔の感情が湧くことなく、本当に楽しく過ごしています。
むしろ、もっと早く入りたかったなという気持ちでいっぱい。

けれども、これは3年間のWeb Developer経験があったからこその感情でもあると思っているので、縁だと思うことにしてます。

講義が始まってから急激に忙しくなり、目の前の調査や勉強をやり遂げるのに必死になっていた気がします。
特にクォーターの後半に入ると、レポートの量が増えたり、講義の内容と課題の内容も難しくなったり、試験対策がはじまったりと非常に慌ただしい毎日でした。
この1クォーターはマラソン大会であっぷあっぷしながらなんとか走り抜けたような感じです。

忙しすぎて研究室にひたすらこもってた時期のツイート

しかし、振り返ってみると「もう3ヶ月が経ってしまったのか...。」という気持ちと、「まだ3ヶ月しか経ってなかったのか。」という驚きが入り混じった複雑な感情が渦巻いてることに気が付きました。
前者の焦燥感のような気持ちは、「これが3回続くだけで1年が終わってしまうのか。」という不安です。
本当に研究成果が出せるのだろうか、卒業後に自分が進みたい道に進めるのだろうかという不穏な気持ちが渦巻いています。

一方で、後者の驚きというのはたった3ヶ月で自然言語処理や機械学習、その周辺分野の知識を現在の状態までキャッチアップ出来たことに対する期待感です。
おそらく、これは独学で続けていたら成し得なかったことだろうと思っているからです。

そこで1クォーターが終わったいま感じている大学院に入学して「よかったこと」と「不安に思っていること」を綴りたいと思います。

良かったと感じたこと

働いているとき以上に知識の拡張をできている実感がある

講義や研究、そして環境、それに捧げることのできる時間のおかげもあってか、働いているとき以上に知識の拡張をできていると感じています。
自分はCSを専攻してきていないのもあってか、講義を受けるだけでもはじめて知る知識が多く、また講義の課題を通して「はじめて○○を実装してみた」といったこともあり、刺激的な毎日をを送っています。*1

そして、なんといっても研究をするために専門領域の学習や調査にひたすら時間を注ぐことができるのが大きいです...!
というのも、先行研究を読みすすめると自分が全く知らない要素技術に出会う機会が非常に多いです。 *2
それにぶつかるたびに、内容を理解しようと要素技術に関してググったり本を参照したりして必死にキャッチアップするといったことを繰り返してきました。
そのおかげもあってか、わからなかったことがわかるようになっていることに気がつく機会が増えたり、「あ、これはXXXで知った内容だ!」と気がつく機会があったり、学習したことが知識がしっかりと積み重なってるんだなぁという実感が湧くようになってきました。

3ヶ月という短期間で、これを実感できたのは注ぐことのできる時間いざとなったら相談できる研究室の環境のおかげだろうと感じています。

刺激を受ける環境に身を置くことができる

研究室とはすごいもので、その専門領域に関して非常に詳しく濃い方々が近くに集まっているんですよね。
そして、そんな場所で皆がその領域で新しい貢献を生み出そうと毎日研究を進めていて、ときには相談をしあったり、ときには切磋琢磨をしあえる環境なのです。
刺激を受けないわけないですよね...!

不安になっていること

後悔は特にないのですが、不安がないかと言われたら少しはあります。
大別したら2つ。

  • お金の話
  • 時間の話
お金の話

仕事を辞めて学生になっているので、もちろんお金は不安です。
現在でも週に数時間程度のリモートワークをして収入を得ておりますが、働いていた当時に比べれば収入はとても減ってしまっています。
そこに加えて、大学の学費などが積み重なってくることを考えると、覚悟はしていたもののどうしても不安感は拭えません。

また、博士課程にも進学するとなれば、これはより悩ましい問題になるんだろうなと考えています...。
数億円とか降ってこないかな...。

時間の話

これは進路に関わった話です。
実際に大学院に入ってみて、すごく楽しい毎日を送っています。
まだ調査の段階であって具体的な進捗が出ているわけではないのですが、この分野の研究をすることに楽しみを覚えています。
それもあってか、博士課程を少しずつ考えるようになってきました。

けれども、先にあるような収入の問題を考えると学振を狙うか給与のいただける研究室(基本的には海外...?)にいかねばならないなぁと考えています。
そのためには、研究の成果を出す必要がありますし、GPAのために良い成績を取らねばなりませんし、もっと英語を使えるようにしなければならないといった数々の課題を抱えております...。
それもあってから、最近はよく「時間が足りないなぁ...。」と思うことが非常に多くなりました。

なんにせよ、すべては努力と計画、工夫で解決せねばなぁと思っており、目標のための計画を立てつつ毎日の行動を最適化して1分1秒を大切に過ごしていこうと思います。

やっていき

ちなみに、研究としてはこの分野で頑張っていくつもりです。

www.skyrocketing.work

気になることやらなにかあれば、@otakumesiまで連絡をどうぞ。
研究の話でも学校やNAISTの入試の相談でも、気軽に話しかけてください!

*1:例えば、因子分析や線形動的システムをnumpyだけで実装したのははじめての経験でした。

*2:投稿されてる論文はなんにせよ新規性のある提案をしようとしているのだから当然といえば当然である。

退職をしてNAISTの修士課程に入学します

※これはポエムであり、自分語りです。ただただ時系列順に書き連ねていきます。
本記事は退職エントリというよりは入学エントリ、合格体験記に近いです。

TL;DR

FROM: 株式会社リブセンス
TO: 奈良先端科学技術大学院大学 先端科学技術研究科 博士前期課程

リブセンスは、9月27日が最終出社でした。

10月2日より奈良先端科学技術大学院大学(NAIST)の先端科学技術研究科の博士前期課程に入学します。
専攻は自然言語処理で、松本研に入る予定。

f:id:otakumesi:20190930124931p:plain

進学を考え始めた時の話

遡ること昨年の春過ぎ...。
この頃からコンピューターサイエンスをやりたいと考え始めていました。
それは自分が経済学部出身であることを負い目を感じていたことや、自身の未熟な技術力に対する欠乏感から湧いた気持ちだったように思います。

当時は「流行りを追い続けるのではなく、それらの技術が基礎に置いている技術を学びたい」と同僚によく相談していました。

はじめはコンピューターサイエンスを独学する方向で考えていました。
ですが、アメリカ就職に失敗したはなしというエントリ読んでから、真剣にアカデミックを考えるようになりました。
というのも、自分も海外志向で人生で一度はシリコンバレーで働いてみたいと思っているからです。

とはいえ、このときはまだ具体的に研究していきたい分野を考えておらず、それもあって具体的な進路は考えていませんでした。
なので、ググって見つけた(当時は)学費が安くて三年制だったタリン工科大学の学部や、
北陸先端科学技術大学院大学の東京社会人コースを目指そうかなぐらいの気持ちでいました。

NAISTへと進路を固めた時の話

自分はリブセンスでSEOに関わるようなチームに所属をしていて、昨年の夏くらいの当時はサイト内の検索に触れる開発していました。
そんな最中で、SIGIR2018 報告会 〜世界の検索テクノロジーとメルカリの未来〜という勉強会に参加して、その面白さに感化されて検索技術に関心を持ったのがひとつのキッカケです。
また、SEOに関わる中で某検索エンジンに課題を感じるようになってきて、それをどうにかするような研究をしたいと思うようになりました。

この辺の話は、NAISTへの道というスライドにまとめています。

そこで検索技術を学習するために掘り下げていき、たどり着いたのが自然言語処理でした。
小町守さんの自然言語処理を独習したい人のためにというページを参考に学習を進めていたことを覚えています。

実際に学習をはじめてみると、自然言語処理はすごく楽しいと思える分野であるという発見がありました。
というのも、自分はソフトウェア開発に対して、「ドメイン領域を理解して、それをシステムに落とし込むために知恵を絞る」ところに最も楽しさを感じていたので、言語学の知見や人の営みを参考にコンピューターで言語を取り扱う方法を考案するというのがとても面白く感じたのでした。

とはいえ、検索技術にしても自然言語処理にしても学習の道筋が整備されているわけではなく独学の限界を感じ、次第に大学院のような学習環境が整っている場所に行ったほうがよいと考えて進学を決意しました。

そこで、研究室を調べはじめて最終的にNAISTの松本研にたどり着いたわけです。*1
所属している皆さんのブログエントリを読んで「ここで研究できたら絶対楽しいだろうな。」と思い、第一志望に定めることにしました。

入試のための準備の日々

NAISTの入試科目は以下の通りだったので、計画的に準備していきました。

  • 数学(解析・線形代数)
  • 英語(TOEIC)
  • 小論文(主に研究計画)

途中で忙しさのあまり心が荒んでたこともあったのですが、人生で自分が乗るべきたったひとつの電車というエントリに励まされ、自分はいま乗るべき電車に乗るための荷造りをしているんだと奮いたたせてモチベーションを高めたりしてました。

数学

自身が文系出身であるため、数学が足を引っ張ることのないように最初の時期から最も力をいれていました。
まずは、マセマのキャンパスゼミシリーズを二周ほどして基礎知識を叩き込むなどやってます。

その後はリポジトリにまとまっていた過去問を何周もしました。
実際の入試は過去問と全く違う問題が出てきて、泣きそうになりましたが...。(それはそう。)
github.com

英語

TOEICなので割愛。

小論文

以下の研究計画を提出しました。

github.com

これに至るまでの経緯をば...。

研究計画を練るのに以下のプロセスを踏んでいました。
(この辺はリブセンスで施策の企画をさせてもらった経験が活きたなと思ってます。マジ感謝。)

  1. 自分の達成したい課題を明確にする
  2. それに関連する分野の動向を把握する
  3. 提案内容を考える

自分の達成したい課題を明確にする

前述したとおりに、僕には業務でSEOに関わる中で某検索エンジンに感じるようになった課題があったので特に悩まず...。
その課題とは、利用者に検索の意図を言葉にすることを強要しているために、言語化能力によって検索能力に格差が生じていることでした。

それに関連する分野の動向を把握する

その次には関連する分野を定めてレビュー論文を読むことをしていたのでした。

まずは各種の自然言語処理タスクについて学ぶことで、解決したい課題がどの分野に属しているかのあたりをつけました。
とはいえ、知識の浅い自分には限界があったため、松本研に研究室訪問をして松本先生に相談したりもしてます。

最終的には情報検索や情報抽出周りを深堀りしていくと当てをつけて各種レビュー論文を読んでました。
論文探しには、はじめはGoogle ScholararXivを使っていて、"Information Extraction"や"Infomation Retrieval"という語に、"Review"や"Survey"といった語を絡めて検索しては出てきた無料で読める論文を漁ったりしてました。
その後に松本先生にACL Anthlogyを教えていただき、論文探しの視野が圧倒的に広がったりすることもありました。

このときは2014-現在までの論文を中心に読んで、現在はどこまでできて、どこまでができないのかなにが課題とされているのかの把握することにしていました。
その上で、なにをすれば課題のどの部分にアプローチできるのかを都度判断するようにもしていたのでした。

ちなみに同時に論文を読むための基礎的な知識をつけていたりもしてて、以下の記事を書いたのもこの時期です。

提案内容を考える

最初にたどり着きたいゴールだけを定めておいて、あとはアイデア発想法を用いて考えたり、四六時中トイレに居るときも寝る直前もシャワーを浴びてるときも考えたりして、なんとか辿り着きました。
何度も書き直した覚えがあります。
最後は急に降りてきた思いつきです。
全く参考にならなくてすみません...。

リブセンスについて

本当にすごく暖かい人たちばかりの良い会社でした。

自分がとても未熟なときに入社させてもらって、そこから本当に様々な経験をさせてもらうなど大変お世話になりました!

皆さんのおかげですごく成長させてもらい、本当に本当に感謝の気持ちしかないです。
もちろん大変な時期もあったけれど、それも含めて楽しい日々でした。

そして、特に昨年末に大学院進学を打ち明けたところ、周りのみなさんが全力でサポートしてくれたりしてくれて、なんていい職場なんだと感動したりもしたことを覚えています。

僕のリブセンスに対する思いは、ワンピースのサンジがバラティエを出るときの如く「くそお世話になりました!」と叫びたい気持ちなくらいで、簡単に言葉では表現できないくらいなので本当にいい会社だったことを最後に伝えさせていただきました。

最後に

ついに入学式が迫ってまいりました...。
二年以内に実績を出すつもりで頑張ってまいりますので、応援よろしくお願いします!

*1:小町さんがまとめている自然言語処理が学べる研究室を参考にしました

MECEを実現するのって難しいですよねという話

会社で働いてる時に上司に「MECEに考えよう」とか言われたことないですか?

このMECEが難しい概念だなと思ったので、ちょっと考えてみました。
内容を一言でまとめるなら「モレなく」を実現するのって難しいよな、という話です。

MECEってなに?

ロジカルシンキングの方法論のひとつ。
Mutually Exclusive and Collectively Exhaustiveの頭文字をとったもので、「モレなくダブり無く」という意味。

方法論の中ではとても有名ななので知ってる方や聞いたことある方も多いかなと思う。

「モレなく」のスコープを決めるのが難しい

閑話休題、このMECEの実現が難しいと感じた。
特に「モレなく」って部分。

ある問題を考える時に、考慮のモレがないとはどういうことか。
それは、その問題に関わる情報を余すことなく持っていて、それについては考えた、ということになる。

「これ、結構難しくないか?」と思う。

自身が完全な情報を持っていることなんてそうそうないからだ。
だけれど、それ以上に難しいことがある。

問題を解決するのに寄与しそうな情報のスコープを考えて決めなきゃいけないことだ。

  • その問題のステークホルダーは?
  • それを解決することで、直接影響する何らかの事柄はある?
    • KPI
    • ……
  • 間接的な影響は……
  • etc……

と想像していたらキリがない。

そして、いくら情報について考えきったとしても、問題の原因がスコープ外にあることも割とある。
つまり、最初から自分の頭の中には、そのスコープが無かった、という状況。
困る。

これって、どうしたらいいんですかねー。

ちょっと解決策を考えてみる

俺自身が神になることだ

ちょーつよい。もうすべて解決。やったね。

フレームワークを使う

冗談はさておき、現実的な話。

世の中には「ビジネスフレームワーク」というものがある。
「3C」や「リーンキャンバス」みたいなモノ。

ビジネスフレームワークは、過去に誰かが意思決定や分析をするときに考えなきゃならんかったことをまとめたもの、と言える。
なので、ある問題を考えるときにはダフリモレがないかを確認するのに使うことができる。
経験を追体験するのに使えるツールという感じ。

ビジネスに限らずこうしたモノはあると思っていて、「指差し確認」などもフレームワークに分類できると思う。
WAFのRailsだって、「Web開発に必要な技術をモレなくカバーしてパッケージにしたモノ」だと考えたら、この範疇のものに入ると思う。*1

周りに助けを求める

すべての分野にフレームワークがあるわけじゃなし。
そもそも、フレームワークも完全ではない。
フレームワークは事例を抽象したものに過ぎないので。
例えば、ブラックスワンのような外れ値的な事象に対応できない。

まあ、フレームワークが完全だったら、専門家はいらないですよね。

結局のところ、詳しい人に聞くというのが一番手っ取り早いんだろうなーと思う。
少なくとも、その分野に関してはスコープも認識できるはずで、自分以上に情報を持っているからだ。

とはいえ、その「詳しい」人の話がどこまで信頼できるか、を直接判断するすべがないことに留意したいなーと思う。

ひたすら想像力を働かせて手を動かす

問題について思考を重ねたり、インターネッツや図書館、社内のドキュメントを使って情報の探索をしていく。

これは自分が知っていないだけで、調べれば手に入るに情報がある場合にとても有効だと思う。

文献研究的な。

とはいえ、専門家の経験的知には届かないことは留意しておきたい。

*1:もっともRailsでモレなくが達成できるのかというと難しいのだけれど

目標を管理するために「OKR」について調べた

今年の秋入学をすることを目標に院試を受けようと考えている。
そのため、志望校合格のための進捗を管理しようと思うに至った。
そこで考えたのがOKRという方法論。

そのために、OKRについてまとめたので書いた。
読んだのは「Google re:Work - ガイド: OKRを設定する

OKR is 何

Objectives and Key Resultsの頭文字をとった単語で、目標管理のフレームワークの一つ。
GoogleやFacebook、メルカリが採用していることで、巷で話題になっている。

なぜOKRを使おうと思ったのか

受験勉強のため、目標を科目ごと単位の粒度で測りたかったのである。
特にOKRは中長期的な目標管理に使われている手法なので気になっていた。

OKRの目標の立て方

1. 目標を3〜5個に絞る

目標を具体的かつ客観的で、そして明確な言葉で考える。
このときに「続ける」「維持する」といった高みを目指さない表現は避けた方が良い
「富士山に登る」「試験で90点を取る」などの到達点や状態を表現すること。

2. 目標を計測する指標を3個決める。

1つの目標につき、指標は3個くらい選んでいく。

【指標を選ぶ時に大事なこと】
  • 計測可能であること
  • 目標達成に直接結びつく指標であること(間接的ではない)
  • 行動ではなく成果を定義すること
    • 例: 「5/10までにTOEICでXXX点を達成する」
    • 完遂の証拠が出せるものが良い

OKRのキーポイント

目標はちょっと大きすぎるくらいに設定する

いわゆる「ストレッチゴール」と呼ばれる目標を設定する。

達成率がだいたい60〜70%くらいになるように設定するのが良い。
コンスタントに70%を超えるようなら目標が簡単すぎると考え、逆に悪ければOKRの改善に使う。

ちなみに、このような性質があるため、OKRは人事評価において「実績」を評価するために使うツールではないことを認識したほうが良い。

OKRは上の階層から設定していく

会社レベルからはじまってトップダウンに、より下層の組織降りていき、最終的に個人の目標を設定していく。
OKRを設定するとき、より上位の層のOKRの成果につながっているかを意識すること。

OKRは「やりたいことリスト」ではなく、会社や事業にどのような影響を及ぼしたいかを定義し、達成するための方法を考えるもの。

OKRの評価の仕方

0.0〜0.1の間で評価をする。

成果指標が「やる」 / 「やらない」といった 0 / 1 の評価だった場合は、目標も 0 / 1 で評価する。
一方で、達成率を計測できる評価指標の場合は、50%達成していれば 0.5 などと評価していく。

このときに大事なのは評価手法に一貫性をもたせること。

OKRは定期的に更新する

OKRは目標をアジャイル的に運用していくフレームワークと言える。

四半期ごとにOKRの再検討というプロセスをいれる。
そこで、組織・ビジネス・環境の状態に合わせて目標の難易度や内容を変えていく。

OKRとその他のツールとの比較や直交性を検討する

CSFやKGI/KPIとの違いと位置づけ

よくKPI/KGIとOKRが比較されていたので、ちょっと調べて考えてみた。

f:id:otakumesi:20190203121601p:plain
OKRについて思ったことを図示してみた

つまり、OKRの目標設定段階に「CSFを使って考える」という選択肢が取れる。

同様に、指標を選ぶ場面で、KGI/KPIを使うことができると思う。
このとき、上位の組織にとってのKPIが下位の組織にとってKGIになると言えそう。

KPTやPDCAとの違いと位置づけ

なんでOKRと比較しようとしたんだっけ、と思うくらいぜんぜん違うものだった。

OKRを使ってみるぞ💪

院試の学習管理として使ってみようと思う。
そのため、この目標の関係者は僕ひとりだ。

実際のOKRは会社の目標からはじまり、組織単位から個人に至るまで、それぞれ目標を立てていく。
けれども、これは抽象的な目標を具体的な目標に降ろしていくプロセスに他ならない。

なので、個人のみの利用であっても大目標の下に小目標を立てていくという形を取ればよいと思う。

ということで...

大目標

「東京大学大学院 情報学環・学際情報学府 統合分析情報学コース」に申し分のない点数で合格する (ストレッチゴールなので、もちろんこの大学院以外も受ける予定である)

【期限】 今年の8月の入試で合格をする

成果指標
  • 基礎科目(数学 / C言語 / データ構造とアルゴリズム)の過去問および院試用問題集の正解率95%を達成する。
  • 選択科目(空間情報学 / IoT / 確率・統計 / 機械学習)
    • 過去問の全問正解
    • 各種テキストから単語や範囲を抜き出して説明を求められれば、すべて解説できる状態になっていること
    • 単元の課題に対して「自分の考え」を述べられる状態になっている。
  • TOEICの点数を930点を達成する
  • 研究計画書およびプレゼンを、大学時代の教授から90点程度の評価をいただく。(要調整)

以上の目標をもとに、中目標、小目標のOKRを作っていこうと思います。(後日公開予定)

『単語埋め込み』について調べたのでまとめてみた

単語埋め込み(Word Embedding)について調べたのでメモを簡単にまとめる。

ここ最近の自分の興味が自然言語処理に向いていて、その基礎となる概念として調べる必要があった。

単語の分散表現とは

単語の分散表現とも言われる。

深層学習ベースの自然言語処理で単語を表現する手法。
語彙の特徴を表現するベクトル空間に、単語の特徴量を表すベクトルを埋め込むことで語彙を表現する。

単語埋め込みの簡易図
図1. 単語埋め込みの簡易図(字が汚い手書きで申し訳ない)

なにが嬉しいのか

単語同士のベクトルの距離を比較することで類似度関連性を計算できるようになる。
図1の例を利用すると...

  • 「ネコ」と「ペルシャネコ」は距離が近いため、類似度も高く関連性も高いと言えそうだ
  • 「ネコ」と「犬」は距離が遠いため、類似度は低めっぽいが「ぞうきん」に比べれば近いので関連性はありそう
  • 「ぞうきん」と「犬」「ネコ」は類似度も低いし関連性も低そう

分散表現はどうやって獲得するの?

言語モデルを通して学習することによって獲得できる。

代表的なモデル

  • ニューラル言語モデル
  • CBoWモデル
  • skip-gramモデル

特にCBoWやskip-gramは、word2vecで使われている。

そもそも「単語埋め込み」や「単語の分散表現」の由来ってなに?

「単語埋め込み」の由来

最初の説明に書いたものをそのままコピペするようだけれど...
語彙の特徴を表現するベクトル空間に、単語の特徴量を表すベクトルを埋め込むことで語彙を表現する。」ことが由来。

「単語の分散表現」の由来

以下の2つの概念が組み合わさって「単語の分散表現」という概念を構成している。

【ニューラルネットワーク方面からの由来】

そもそも「分散表現」という用語は、認知心理学とニューラルネットワークの研究が起源。
脳のモデル化をする際に事象や概念といった離散的なモノを特徴量のベクトルとして表現するために登場した。

【自然言語処理方面からの由来】

自然言語処理には、1950年代から「分布仮説」という考えがある。
これは「単語の意味はその単語が使われた周囲の文脈によって決まる」という仮説。 この仮説に基づいて得られたベクトル表現も「分散表現」とも呼ばれた。

【2つの概念が組み合わさる】

初期のニューラル言語モデルが分散仮説の考え方をそのまま利用している考えれるようなモデルだった。
そのため、ニューラルネットワークの分散表現を獲得するのに分布仮説を用いてると解釈でき、両者の考えが統合されていった。

最後に

間違ってることがあったら指摘してください、早急に修正します :dogeza:

参考文献

プログラミングに向いてないかと思ってたけどなんとかなっている話

note.mu

バズってる記事への便乗記事。

僕自身がもともと絶望的にプログラミングに向いていないと思っていた人間だったので語りたくなった。

【お話をする内容】

  • 現在の私のスペック
  • なぜプログラミングが向いていないと思ったのか
  • どのようにして書けるようになってきたのか

現在の私のスペック

  • 24歳で文系卒(隠すと良くないので補足すると高校の頃は情報学科的なところにいた)
  • 都内のWeb企業でWebエンジニアをしている
  • 普通にWebエンジニアとして仕事する分には特に支障がない程度には書ける(と思っている)

なぜプログラミングが向いていないと思ったのか

ひとことで言えば、まったく「書ける気がしなかった」からだ。
特にコードの意味がわからなかった。
プログラミング言語やフレームワークの教科書を開くと、サンプルコードが書いてあると思う。
それを見るたびに、「え、世のソフトウェアエンジニアはこれ全部を暗記してんの?無理じゃね?」とか思っていた。

ましてや、高校の頃に情報学科にいて3年間もプログラミングについて学んだにもかかわらず、いま思うとコピペプログラマくらいの力しかついていなかった。*1
他人のコードをコピペして動くまで勘で書き換えていくことくらいしかできなかったのだ。

どのようにして書けるようになってきたのか

僕にとっての転換点はいくつもある。
ざっくりまとめると以下の4つだ。

  • リーダブルコードに出会う
  • コーディングを支える技術に出会う
  • コードリーディングをするようになった
  • オブジェクト指向設計を勉強した

リーダブルコードに出会う

最初の転機は「リーダブルコード」に出会ったことだ。
この本は「プログラムは読めるモノ」だという認識を僕に与えてくれた。
それまでは記号の羅列にしか見えなかったコードが、この本との出会いを境に読めるものに変わった。

この本を読むまでは関数が「よくわからん記号で名付けられたブラックボックス」に見えていた。
しかし、関数は実は「つけられた名前のとおりに振る舞う道具」だったのだ。
これは、当時の僕には衝撃的で世界が変わるようだった。

この本をキッカケに知らない英単語が使われている関数名は、辞書で調べて意味を把握するようにしている。

また、私が書くコードにも「意図」が込められるようになった。
atestと名付けられていた変数名や関数名が、userfollow_userに変わったのだ。

コーディングを支える技術に出会う

リーダブルコードを読み終わってあとでも、いまいちよくわかっていない概念があった。
それは各種言語機能とライブラリの関数の違いだった。
classforputsraise StandardErrorの違いがわかっていなかったのだ。
それを解決してくれたのが「コーディングを支える技術」だった。

コーディングを支える技術 ~成り立ちから学ぶプログラミング作法 (WEB+DB PRESS plus)

コーディングを支える技術 ~成り立ちから学ぶプログラミング作法 (WEB+DB PRESS plus)

本書はある言語機能はどういったものでなにを解決するために現れたのかを解説している本だ。
この本もまた僕のプログラミングへの視点を変えてくれた。
それまでごった煮だった概念が各種の言語機能とその他で見分けが付くようになったのだ。

そして、この本はプログラミング言語の違いは言語機能の違いにあるという認識を与えてくれた。

コードリーディングをするようになった

大学2年生の春に、Webアプリ開発を学ぼうとRailsチュートリアルを3回ほど繰り返した。
チュートリアルを終え、意気揚々とアプリケーションを作り始めると数多くの壁にぶつかったことを覚えている。
チュートリアルで学んでないことができなかったからだ。

その結果として「XXXはどうやってやるのだろうか?」というヒントを得るべく、Railsで作られたOSSのソースコードを参考にするようになった。

これは非常に正解だった。
洗練されたOSSは、素晴らしいレシピブックだったからだ。
「どうすれば読めるコードになるのか」がそこにあるのだ。
見事な処理の分割の仕方を目の当たりにして、僕に「設計」の存在を意識させるキッカケとなった。

オブジェクト指向設計を勉強した

コードリーディングをするようになると、OSSを開発している人たちは「なぜ、こんなコードを思いつくのだろうか」と考えるようになった。

思いつき方がまったくわからない僕は「やはりプログラミングの才能がなかったのだ」と思い始めていた。
なんとかわかる方法がないかと一生懸命調べ続けた。
迷走して「プログラマ 思考法」とかで調べてた気がする。

そんなこんなである時に、たまたま「どうやら多くのクラスはデザインパターンというものを参考作られているらしい」ということがわかった。
そして、その概念がオブジェクト指向設計の延長にあることを知り、その勉強をしようと考えた。

以下の記事を読んで、「オブジェクト指向のこころ」を買った。*2

takatoshiono.hatenablog.com

オブジェクト指向のこころ (SOFTWARE PATTERNS SERIES)

オブジェクト指向のこころ (SOFTWARE PATTERNS SERIES)

  • 作者: アラン・シャロウェイ,ジェームズ・R・トロット,村上雅章
  • 出版社/メーカー: 丸善出版
  • 発売日: 2014/03/11
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (6件) を見る

この本ははじめて読むオブジェクト指向の本としては非常に難しくて、読み終えるのに1ヶ月半くらいかかった。
蛍光ペンをめちゃくちゃ引いて読み直したり、付箋を付けて解釈して自分の言葉に直したりを繰り返した覚えがある。

この本で学んだもっとも重要なモノは「責務」という概念だ。
オブジェクト指向設計とは「責務を分割したり組み合わせてデザインすることだ」という認識を得られた。
本書によって、僕の見る世界がまた変わったのだった。

そして、この本を読み終えたあとも、オブジェクト指向をいまいちよくわかってない部分も多く、補足をしてくれる本を探していた。
そんな矢先に以下の記事に出会って「オブジェクト指向実践ガイド」を購入した。*3
tango-ruby.hatenablog.com

(当時はまだ日本語版が出版されていなく、すがる思いで原著を買った。)

この本は徹頭徹尾「実践」に重きをおいた本で、非常にわかりやすい。
小さく粗く作って、綺麗で柔軟な強い設計に改善していく過程を追っていける。
そのため、「設計しながらコードを書く」方法を学べる。
これはまさに僕がわかっていなかった「コードの書き方」への明確なアンサーだった。

そして、この本で最も学んだことは「長く生きるアプリケーションは変更されていく」ことと、「変更に強い設計とはなにか」ということだった。

この本を読み終えたあたりでようやく意図してコードを書くことができるようになったと自覚できるようになったと思う。

まとめ

かくして、少しずつ視点の変化を積み重ねることで、Webエンジニアとしてなんとか働ける程度の技術力にはなったのである。

ちなみに「どのようにして書けるようになってきたのか」のすべてを達成するのに数年くらいかけている。
それくらいプログラミングは苦手だったのだが、プログラミングが好きだったこととできるようになることを楽しめたのが大きかった。
一歩前進するだけで、自分は実はプログラミングの才能があったんじゃないと錯覚するくらいには単純な人間だったため、ここまで勉強をし続けられたのだ。

「才能がなくて『プログラミング』を諦めよう」と考えている人も、時間さえ投資すれば最低限のプログラミングくらいはできるようになるんだよと思っていただけたら幸いである。

*1:末恐ろしいことに、この頃の僕も「プログラミングはできる」と思っていた。すぐにその幻想は崩れて才能がないとうなだれるのだが。

*2:当時は読めるような技術力がついたら記事を読もうとブクマしておく癖があったので、マイブックマークでオブジェクト指向と検索したら上の方に来たのだ

*3:ちょうど、Rubyで書かれていたのも買う理由になった。

コミュ障を治すために「人生が変わる会話術」を読んだ

丘村奈央子の「人生が変わる会話術」を読んだ。

人生が変わる会話術

人生が変わる会話術

【本エントリの要約】
会話の話題に困りがちな方にオススメ。
特に会話を相手との共通点から探してきた人には特効薬になるかも。

読んだキッカケ

僕は常々とコミュニケーション能力には課題を感じてきた。
特に頻繁に顔を合わせるが共通の趣味を持たない人との会話ほど、話題が見つからずに気まずい状況になることが多い。
初対面の際に使えるような当たり障りのない話題がすでに尽きているからだ。

過去に「話し上手になれれば、自然と話題が浮かぶのだろうか」と悩んで、数冊のコミュニケーションのノウハウ本を読んだことがある。
どの本も自分自身が実践できる水準には達していないと感じるような内容だった。
というのも、話題が浮かぶことは前提にされていたり、「それができたら苦労していない」と言いたくなるテクニックだったりしたからだ。

けれども、コミュニケーションの課題を放置するわけにはいかず、めげずに解決の糸口を探すべくインターネットサーフィンをしていた。

そんななかで以下の書評を見つけ、本書に興味を持った。
note.mu

普段はこうしたタイトルの本には興味を持つことがあまりないのだが、自分との違いに着目するという点に惹かれて購入したのだった。

この本から学んだ内容サマリ

  • 会話相手との共通点を無理に探さず、違いを話題にしてしまおう
  • 違いに着目するためには相手の話に興味を持つことが大事
    • そのためには、相手から情報をいただいているという心構えを持つと良いかも
      • 相手の視点というのは、決して自分だけでは手に入れられないからね
  • 次に話すことを考えるあまり、相手の話を聞いていなかったら本末転倒

感想

会話を共通点から探す自分にとっては、目からウロコが落ちた。
たった一つのシンプルな視点を得るだけで、これほど会話を気負わずに済むのかと驚いた。

コミュ障の特効薬のようだ、とも思えた。
この点だけでも、本書に出会えてよかったなと思う。

また、次に話すことを考えるあまり、相手の話をあまり聞いていないというくだりが図星で、 これまでの自分は会話相手にとても失礼なことをしていたなと、読みながら「ごめんなさい」と反省をしていた。
この反省の視点を得られたことにも感謝している。

タイトルの通りに「人生が変わる」本になるかもしれないなぁという期待感で胸がいっぱいになっている。
本書を読み終えた今後の自分に期待してほしい。

「イシューからはじめよ」を再読したら良かったよ、という話

この土日で安宅和人の「イシューからはじめよ」を再読した。

イシューからはじめよ――知的生産の「シンプルな本質」

イシューからはじめよ――知的生産の「シンプルな本質」

このエントリの趣旨は、「実際に働いてみてから読み直してみたらすごく頭に入ってきた」というつもり。

「イシューからはじめよ」との出会い

最初に読んだのは、おそらく3、4年前の大学生の頃だった。
この頃は卒業研究で頭を悩ませていて、すがる思いで手にとった覚えがある。

その当時も本書をしっかりと読んだつもりだったが、正直にいうと内容が頭に残らなかった。
ロジカルシンキングをわかりやすく説明してくれるため、少なくともその場では言っていることはわかる
しかし、この「わかる」はソフトウェアエンジニアがよく言う「完全に理解した(わかっていない)」*1に近いものだった。
いま思うと、それは「実体験」がなく、現実味を感じられなかったからだと思う。

「イシューからはじめよ」の再読した理由

現職でPJに携わる中で、もっと問題解決スキルを磨きたいという気持ちが高まった。
簡潔に説明すると、企画・分析の仕事をいただくようになったので、必要そうなスキルを基礎的なところから復習しようと考えた。

そこで、まずは問題解決の本を読むことにした。

問題解決の本は市場にありふれている。
どの本を選ぶかを迷ったが、新宿の紀伊國屋書店で数々の本をパラパラと覗いた末に、最終的に「イシューからはじめよ」を再読することに決めた。

そうした理由は3つある。

  • 明確なゴールに向かってストーリーが作られている
  • 問題解決フレームワークとビジネスフレームワークが混同されていない
  • 少ないページ数にもかかわらず、各種のフレームワークがまとまっている

明確なゴールに向かってストーリーが作られている

僕が知りたかったのは、分野を問わない抽象的な問題解決スキルだった。

しかし、いくつかの書籍をパラパラと覗く限りは、いくつかのフレームワークの紹介だけに留まっている本が多いように感じた。
本書は「良質なアウトプットを生み出す」というゴールのため、心構え動き方考え方がメインテーマになっており、関心のある分野は問わない。

そのため、「イシューからはじめよ」が、まさに僕がいま読みたい内容であった。

問題解決フレームワークとビジネスフレームワークが混同されていない

僕の中で、問題解決フレームワークとビジネスフレームワークは明確に線引されるものだと思っている。
つまり、ピラミッド構造 / MECE / 仮説思考と、3C / 5フォースは異なる分野のものだという認識だ。

問題解決フレームワークはどの分野にも応用が効く、汎用的なフレームワークだ。
対して、ビジネスフレームワークは、あくまで具体的な分野のフレームワークだ。

2回目でしつこいようだけれど、僕は汎用的な問題解決スキルに焦点を当てた本が読みたかった。
そのため、本書が僕の要望に非常にマッチした。

本書は問題解決に焦点を当てたフレームワークをメインに据えて紹介している。
ビジネスフレームワークは出てこないわけではないが、基本的には具体例の紹介に使われるに留まっている。

これは、本書の再読を選ぶ理由の一つになった。

少ないページ数にもかかわらず、各種のフレームワークがまとまっている

本書は243ページしかない。
技術書や専門書、同様に問題解決スキルの本を読もうとすると、これ以上にページ数が多いと思う。

少ないページにもかかわらず、以下のような多くの問題解決フレームワークについてわかりやすく丁寧に説明されている。

  • 仮説思考
  • MECE
  • ピラミッド構造 *Whyの並べ立て(帰納法)
    • 空・雨・傘(ちょっと違う気もするけど演繹法)
  • So What?
  • etc...

問題解決フレームワークを身につけるのに少ないページ数、冊数で済むのならそれに越したことはないと思っている。
僕らの時間は有限で、問題解決スキルだけが学ぶべきスキルではないからだ。
プライベートだって大事にしたいし、業務に関連したスキルも学ぶ必要もある。

なので、効率よく問題解決スキルを学べそうな本書を選ぶことにした。

実際に再読してみて

結論から言うと、再読してよかった。

実際に働いてから*2読んでみると、本書の内容が経験と絡み合って頭の中に入ってくる。
それは共感だったり、反省だったり、様々な感情がいりまじったものだけれど。

学生の頃に読んだときの感覚は、「わかるんだけれど、わかっていない」という「目が滑る」感覚に近かったと思う。
3,4年働いた現在に、もう一度読んでみると本書をより咀嚼できていることに気がついた。

本書は、僕にとって仕事の進め方のバイブルになった。
また、数年後経ってから読み返してみたら、もっと理解できたり、新しい情報を引き出せたりできるのかもしれない。
そして、このレビューも青臭いと感じて、恥ずかしいと感じるのかもしれない。

最後に

選んだ理由の項目が、思ったより分量が多くなってしまった。
(本書の内容的に削るべきなのですが、ここはご愛嬌。)

内容のとおり、バリューの高いメッセージが詰まった本でした。
このような素晴らしい本を書いてくださった安宅和人さんに感謝を申し上げます。

*1:ポプテピピックが元ネタのスラング

*2:言ってもまだまだ全然働いていないのですが...

Courseraの機械学習コースを働きながら2週間で修了した話

思い立ってCourseraの機械学習コースを修了した。

f:id:otakumesi:20181220161916p:plain
Coursera 機械学習コースの修了書

モチベーション

半年前から「いつかやろう」と思っていたが、モチベーションが高まらなかったため後回しになっていた。
しかし、ここ最近になって自然言語処理に興味を持って勉強を始めている。
そのため、機械学習を避けては通れなくなったのである。

そこで、意を決して評判の良いというCourseraの機械学習コースを受けたのだった。

機械学習コースの感想

「受けてよかった」という気持ちとAndrew先生へのリスペクトでいっぱいになっている。

「機械学習やりたいけどなんもわからん」という人が、いの一番に受けるべき講座だなと思った。
この講座を修了して、ようやく機械学習を学んでいくためのスタート地点に立てたなという感覚がある。
つまり、「機械学習なんもわからん」から「機械学習のちょっと難しそうな本くらいは読めそう」くらいにはなった(と思いたい)。

なんと言っても、Andrew先生の講義が非常に良い。
というのも、複雑な理論の説明の後には直感的理解の講義を挟んでフォローしてくれるのである。
抽象的な概念に面食らっても、次の動画に進めば理解できるような構成になっている。
なので、全く理解できなくて心配になったとしても次に進めばよい。
そういう構成なので安心して講義を進めていける。

また、機械学習という分野に対する鳥瞰図が得られることが一番の収穫だった。
僕は学習のはじめに鳥瞰図を得ることは学習において非常に大事している。
自分が本当にやりたいことに向かうためには、これからどの方向に進んでいけばいいのかがわかるようになるからだ。

この講義は、今後の僕の学習計画に道筋を与えてくれた。
なので、Andrew先生に感謝の気持ちでいっぱいである。

機械学習コースで学べること

  • 機械学習に必要な基礎的な数学
  • 基礎的な機械学習アルゴリズム理論
  • 機械学習アルゴリズムの実装方法
  • 機械学習システムを構築する際に直面する壁とそれを乗り越える方法

はじめたい人のためのQ&A

高校数学すら完全に忘れているけど大丈夫?

総和の\Sigmaの使い方だけ知っておけば、あとはその場で説明してくれるので問題ない。
ただし、修了に時間がかかることだけは覚悟しておいた方がいいと思う。

加えて、その場の説明はちょっとだけざっくりとしているので、わからないときは完全に理解するまでググって調べる根気は必要。

プログラミングやったことないけど大丈夫?

Octaveの講義あるので、不可ではないですがオススメしません。
プログラミング課題のクリアができないか、あるいは相当時間がかかりそう。

Octaveについてどう思う?

プログラミング言語としてみると、とても表現力は低い。
しかし、数式を直感的に表現できるため、機械学習アルゴリズムの本質的な部分の実装に専念できる点で良かったのだと思う。
特にベクトル化した実装が数式をそのまま表現したものになるので、書いていて気持ち良かった。
(この理由は今後Pythonの学習が進むに連れて覆る可能性はある。)

働きながら2週間で終わらせたことの感想

人には絶対にオススメしない
このコースは本来は11週間をかけて終わらせるコースだ。

2週間で終わらせるために、睡眠時間とプライベートのあらゆる時間を削っている。
やっている最中は「命削ってるなぁ...」とか、1週間過ぎたあたりで「やっぱ、やめようかな」とか思ったりもした。

早く終わらせたい人でも1ヶ月くらいにすると良いと思う。

「自分も2週間で終わらせられるかな?」という疑問を持つ方もいらっしゃると思うので、参考までに私のスペックを書いておく。

  • 普段はしがないウェッブエンジニャー *1
  • 大学は文系だがゼミでデータ分析を専攻していた *2
  • 機械学習コースをはじめるまえに「線形代数」「微分積分」の復習をしていた *3

自分が思うに働きながらでも2週間で終わらせるために必要なポイントは2つある。

  • 業務が忙しくなく時間の確保ができること
  • 講座に出てくるレベルの数学はすでに理解していること

これからについて

自分がやっていきたいと思っていた分野は、深層学習ベースの自然言語処理だ。
そのため、今後は深層学習に注力していくだろうと思う。

とはいえ、まずは機械学習の復習とPythonの学習を兼ねて「機械学習のエッセンス」*4を読む予定。
この選択は 『機械学習のエッセンス』はゼロからガチで機械学習を生業にしたい人が「いの一番に」読むべき一冊 - 六本木で働くデータサイエンティストのブログ を読んで決めた。
そして、このコースで学習したニューラルネットワークを土台として、深層学習の学習に入るつもり。

「深層学習、完全に理解した」に至るための選ぼうと思っている教材
  • 深層学習(機械学習プロフェッショナルシリーズ) *5
  • PracticalAI*6

最後に

面白かったと感じた方!
よろしければ、Twitterをフォローしていただけると嬉しいです! twitter.com