コンピューターサイエンスを勉強したい

初投稿からいきなりポエムです(テックブログとは…?)。

ちゃんとした勉強をしたい

 高校生のころにプログラミングを始め、これまでは興味の赴くまま、機械学習の勉強や仮想通貨Botを作ったりゲームの解析などをしてきました。自分が楽しい・やりたいと感じるコードを書くことが結局一番当事者意識を生み、問題解決への執念とか自走力も高まると思っています。その点では今までやってきたように興味のみを追うのも自分自身の成長という観点では悪くないと思っています。

 しかしながら、エンジニアとしてキャリアをすすめていくにあたり、正統派の教育を受けたことが無いということに引っかかりを感じるようになりました。自分は大学院まで物理系を専攻しており、就職先もいわゆるIT企業ではなく、メーカーです。業務としてはWebアプリケーションや機器の通信コードを書くなどしていますが、会社で学んだことはドメイン知識が中心で、IT技術自体に関しては深い教育はありませんでした。IT技術についての深い教育の経験が無いことで普段の業務が全く回らなくなったことはありません。しかし、それは今の業務がPoCレベルであり、小さいからであると考えています。開発規模・要件や納期の厳しさ・周囲のエンジニアのレベルが増したときに、正統派の教育を受けてこなかったことが首を締めてくることが心配です。なぜなら、

  • 開発規模が上がるほど、保守性に配慮した開発手法や、スケーラビリティのある設計を知っていれば自明に避けられるアンチパターンを踏む確率が上がる
  • レベルの高いエンジニアが常識としている概念を理解できない
  • 車輪がなく、自分で発明しなければならないときに、頼る事ができる基本法則を知らない
  • 自分の成果物の品質を一般論ではなく、経験と勘にもとづいてしか説明できない

ことが想定されるからです。大きな開発規模、厳しい開発要件、高い周囲のエンジニアのレベルに耐えられることはエンジニアの価値における重要な軸です。世の中にインパクトを与えられるプロダクトは直接的・間接的に多くの人間に頻繁に使用されるプロダクトであり、必然的に開発規模も要件も必要となる人材レベルも高く、そういった環境下で能力を発揮できるエンジニアが求められるはずです。高い価値を持ったプロダクトを作れることは、価値の高いエンジニアの条件であると考えて差し支えないと思います。そういうわけで、興味を追うのに並行して正統派の勉強も進めていこうと思いました。

何を勉強すべき?

 ところで、正統派正統派言っていますが、エンジニアの正統派の勉強とは何でしょうか?物理を勉強したときには、まず基本法則を頭に叩き込み、基本法則から導出される便利な概念をさらい、最新のトピックをその便利な概念にもとづいて理解し、常に基本法則とのトレサビを取り続けることが正統派でした(なお、私は物理は修士までしか取っていないのでにわかです)。では、ソフトウェアエンジニアリングにおける基本法則、これ以上分解できない知識の最小単位とは何でしょうか?私が勝手に思い浮かべるものは以下のとおりです。

  • コンピューターサイエンス
  • ソフトウェアアーキテクチャ
  • 開発手法・開発サイクル
  • 数学・統計

とはいえ、これから勉強を始めようという人間が何を勉強すべきかを語る、すなわちその分野を知り尽くした人にしかできない行為をするのは笑止千万というものです。ITを知り尽くした人として違和感がない人、例えばまつもとゆきひろさんはなんと仰っているでしょうか?

【まつもとゆきひろ氏 特別講演】20代エンジニアのためのプログラマー勉強法のまとめ 2019/3/30

上記リンクによるとコンピューターサイエンス・アーキテクチャ・英語はいいぞとのことです。他にも天才プログラマと言われるSoftEther開発者の登大遊さんは

上位レイヤーは動きが激しく、付いていくための勉強を続けないといけない。一方、最初はものすごい量の勉強をしないといけないが一生変わらないものはなにか。それが低レイヤーだ

登大遊が語る「低レイヤー」のごだわり |転職ならdodaエンジニア IT

とおっしゃっています。n=2ですがやはり私がなんとなく思い浮かべた方向性はすごく間違っているわけではなさそうです。

コンピューターサイエンスの勉強指針

 ということで、コンピューターサイエンスから順番に勉強していこうと思います。コンピューターサイエンスを勉強するといったとき、何を勉強するべきなんでしょうか?コンピューターサイエンス系の大学院入試に合格できれば少なくとも情報系の学部卒程度の知識はあると仮定します。コンピューターサイエンスの大学院入試で問われることは、

情報数学、数値計算、離散数学、アルゴリズムと計算量、形式言語、論理学、

プログラミング言語論、コンピュータアーキテクチャ、オペレーティングシステム、

デジタル回路、機械学習

東京大学大学院情報理工学系研究科コンピュータ科学専攻 入試案内書

です。これを書きながらデジタル回路とか論理学はあまりにも興味と実務から離れていて流石にきついという気持ちがしてきました。また、機械学習は別枠で勉強するとします。興味と実務との関係の順番に並べると以下のとおりです。

  1. オペレーティングシステム
    OSは必ず使うため
  2. アルゴリズムと計算量
    コードを設計するとき使うため
  3. コンピュータアーキテクチャ
    データの転送のされ方や速度など考えてコードを書くとき使うため
  4. プログラミング言語論
    プログラミング言語は必ず使うため

    ~~興味の壁~~
  5. 形式言語(昔自作言語を作ったことはあるが…)
  6. 離散数学(グラフ理論たまによく使うが…)
  7. 数値計算(昔大学で単位を取った)
  8. 論理学(昔大学で単位を取った)
  9. 情報数学(昔大学で単位を取った)
  10. デジタル回路(確かに低レイヤーと言ったが…)

東京大学のページでは各分野で学習の役に立つ書籍を紹介してくれています。

書籍 | 東京大学 大学院 情報理工学系研究科

勉強したい順番と参考書籍リストに基づき、とりあえず以下二点を購入しました。

Operating System Concepts ペーパーバック – 2009/2/13

データ構造とアルゴリズム (新・情報 通信システム工学) 単行本 – 2007/10/1

できる限り安く上げるために中古を選んだ結果結構古い版のものしか手に入りませんでしたが低レイヤーなのでそう大きくは変わっていないでしょう。

 本を読むだけなら内容をわかっていることの証明にならないと思うので、学んだことをこのブログでアウトプットしていけたらと思います。また、いつか院試を解いてみたいとも思っています。

本当に勉強できるのか?

 意識高いことを言ってきましたが、結局勉強できなければ意味がありません。今まで何回かブログを作っては三日坊主となってやめた前科があるので、今回こそブログを続け、勉強の記録を残していきたいです。自分にあまりに高いハードルを課して超えられなくなるとモチベーションが下がってやめてしまうと思うので、勉強頻度が月1まで下がっても継続できていると考えることにします。そうすることで、飽きて別のブログを立ち上げない→このブログが最後のブログとなる→タイトル回収 できたら嬉しいです。

コメント

  1. k@k より:

    今日から読みはじめました。
    道標として読み、自分も学ぶ努力をしたいと思っています。
    続けてくださると嬉しいです。

    • knksm より:

      コメントありがとうございます!
      反応いただけてモチベーションになりました笑
      お互いがんばりましょう!

タイトルとURLをコピーしました