基礎的なことを勉強する

2016-07-02 /

はじめに

コンピューターサイエンスの基礎知識が足りてないような気がしていた。 業界のいろんな人々と比べて足りないと歯噛みした。 当たり前のように使われる用語がわからなかったりする経験がある。 それらの用語はどれもコンピュータ・サイエンスでは基礎とされる用語だ。

その基礎についての知識が欲しかった。

基礎が無いままでもきっと仕事は進む。 でもそのままでは業務に特化されたノウハウが身につくだけだ。 局所最適化のループに入ってしまう。

その業務を上手くできるけど他の業務では全く応用が効かない人間になってしまう。

自分は今一緒に働いている同僚と比べても特に地頭がない人間だ。 同僚たちがスムーズに変化に適応していく中で、自分だけが追いつけてないような気がする。みんなとても器用なのだ。 これに対抗するためには基礎を固めて武器を増やし、それを応用力に転化することだ。

だから、今年ももう半分くらい終わったけど、やっぱり基礎を固め直そうと思うようになった。

やること

すぐには役に立つとは思えないけど視野を広げるような分野とか。

  • コンピュータの基礎
  • プログラミングの基礎

やらないこと

応用系。仕事ですぐ使える類の分野とかモデリングとかマネジメントとか。

  • ネットワークプロトコル
  • インフラデザイン
  • セキュリティ
  • 形式手法
  • ドメインモデリング
  • チームマネジメント

コンピュータ

基本情報とかでやったきりだ。

いま読んでいる。

GPGPUプログラミングの概説は知っておきたいのでそこまでは読みたい。

目次読んだ感じだとALUの話も出ているしよさげ。未購入。

割と有名な本。未購入。 多分これを読むだけでひいひい言いそう。

恐怖のパタヘネ本。未購入。 ここまで読める気がしないので低優先にしておく。

OS

実質的にLinuxだけ。まあ仕事で使うのほとんどLinuxカーネルだし。

サーバ系のトラブルシュートをする時の武器となってくれるはず。

未購入。そこそこな薄さで読みやすそう。

プログラミング言語

たぶん今回の基礎を勉強しようと思うきっかけとなった分野。

Haskellが導いてくれた型システム入門。 ラムダ計算の基礎から学べる。 とりあえず単純型付きラムダまではいきたい。

Schemeを使っていろいろデータ構造を作ったりあれしたり。 最初の整数論的な問題すら解けなくて心折れて積んでいる。 3章くらいまで読めればまずはいいのではないか。

データ構造とアルゴリズム

この分野はやや優先度を下げている。

古本屋で買った。 実際のプログラミング言語を使った演習はなくて、 理論の数学的性質を淡々と証明していく感じ。グラフ理論を基礎にした説明なので、基礎の勉強を謳うこの記事の趣旨にはよくフィットする。 証明にもいくぶん慣れてきたので読めそうな気がしている。

個人的にハイライトは後半の計算オーダーのあたりなのでそこまでは読みたい。

Richard Bird御大のHaskell本。 一度読んだけど忘れた。 アルゴリズム、計算量、証明などを包括的に学べるしHaskellだし。 運算と呼ばれる机上でプログラムを展開し実装の一部分を置き換えていく方法で、 より効率のよいプログラムを導き出す。 関数プログラミングならではのアプローチ。

こちらもRichard Birdの本。 問題を解くためのコードは書けるけど効率的にならなくて計算がなかなか停止しない問題に立ち向かう。 これも運算で効率的な実装を発見するのが趣旨。

こちらはもっと有名な本。未購入。 Javaを使ってアルゴリズムを丁寧に解説。

数学

個人的に一番楽しんでできそう。 だって紙とペンさえあればできる娯楽だ。

割と無学でも根気があれば読めそう。 証明よりも計算がメイン。

高校レベルの数学とその発展を学べる。 プログラマとしてはこのレベルくらい学んでおけば充分かなと思い。

一度読んで撃沈。でも数学の美しさを感じるにはうってつけ。 オイラーを読んだ後なら読めるのではないかと目論んでいる。

問題の解法・アプローチについて。 Clojure開発者のRich Hickeyも問題解決を教える良書として紹介していた。

行く末

向こう一年くらいはこのラインナップをどこまで消化できるかだ。 全部は無理なので各分野で1冊ずつ読みきりたい。

CPUとかカーネルなどの低レイヤと、型システムや証明という抽象レイヤの二極化が自分の中で加速しそう。

そしてそれは正しいことだと思っている。

プログラマとして抽象化の武器と身につけて、インフラ屋として低レイヤの武器を身につける。そうすると大体のものは自分の独力で作れるようになる気がする。

その先はどうだろう。勉強したいことはある。

  • 開発プロセス
  • チームマネジメント
  • ドメインモデル

などなど、5年前に考えていたことを、もう一度地に足つけて勉強することになるのだろうな。