株式会社Global Mobility ServiceでソフトウェアエンジニアのインターンをさせてもらっているShirubaです。グローバルな環境で利用されている社会的サービスの開発の一端を担いたい志ある方は、ぜひ緩くお話ししましょう〜🙋♂️→ 採用ページ
2ヶ月間のフルタイムインターンを通して、「知識量」が圧倒的に不足していることを実感しました。「知識をコードに落とし込む力」に関しては今後の業務を通して補っていけると思うこともあって、4月になるまでにできる限り「知識量」をつけておきたいと思いました。
知識があると、会社のミーティングとかでの話にもついていけるようになるし、コーディングの幅も広がると思います。そういう経緯で、空き時間に興味のある本を図書館から借りて読むことにしました。その時読んだ本をゆるく紹介していくコーナーです。
- 興味の赴くままに読んだので、ジャンルは絞っていない
- 実践的な本を求めていたので、啓蒙的な本・心構え的な本・チーム作法的な本は今回は手をつけていない
Linux
「普通のやつらの下を行け! NewsPicks CTOが新人エンジニアに伝えたい3つのこと」を読んだことがきっかけ。「低レベルな技術を身につけておきなはれ。おすすめはLinuxカーネルなんやで。」的なことが書いてあったので、Linuxカーネルを見ておきたいなと思った。
またDockerの記事を読み漁っていると、「コンテナ技術入門 - 仮想化との違いを知り、要素技術を触って学ぼう」の記事を見つけたのだけど、cgroupとかLinuxカーネルの技術が出てきて少ししんどかったので、Linuxを体系的に学んでおきたいなと思ったこともきっかけの1つ。
試して理解-Linuxのしくみ-実験と図解で学ぶOSとハードウェアの基礎知識
スラスラ読める良書。こういったLinux入門書を1冊読んでからLinux Kernel Developmentに入ったらスムーズに入れると思う。
Linux-Kernel-Development
良書。和訳がないのがネック。
コンピュータ
大学でコンピュータサイエンスを学んだわけでもないので、コンピュータの知識もつけておきたいなと思った。
コンピュータの構成と設計
情報量が多く難易度が高かったため、途中で挫折。ただネットでは名著的な紹介が多いので、今後読んでいきたい本。
CPUの創りかた
スラスラ読めた。良書。
コンピュータシステムの理論と実装
PC内でプログラムが動くまでの仕組みについて一通り知ることができる。すごく簡潔にまとまっていて読みやすく、非常に良書。
ネットワーク
ネットワークはなぜつながるのか-第2版-
良書。「ブラウザでWebサーバにアクセスする」という視点を持って説明してくれているので、具体的にどのようにTCP/IPが利用されているのかが分かる。恐らくTCP/IP系だと「マスタリングTCP/IP」をオススメされることが多いのかもしれないが、その本とはまた異なる視点を持っていて良い。
マスタリングTCP-IP―入門編―-第6版
非常に良書。読みやすい。
インフラ-ネットワークエンジニアのためのネットワーク技術-設計入門-
マスタリングTCP/IPよりも実践に即した内容だった。インフラ・ネットワークを実際に触り出したら再度手を出したい本。(なので、TCP/IPを実践で触っていない方は、前者2冊で入門すると良いと思う。)
UNIXネットワークプログラミング
第6章を読むのが目的だったので、第6章で読むのを終えた。図解してくれている部分も多く、TCP/IPの基礎を抑えていたら、特に苦しむことなく読み進めていける。
驚異的に分厚い。
オブジェクト指向
株式会社Global Mobility Serviceでは一部typescriptを使って開発している。システム内部のリファクタの一環として、クラスを用いた抽象化を適用することになったのだけど、そこで「しんぐるとん」とかが話に出てきてKOされた。今後このような事態をなくすために基本だけ抑えておこうと思い、オブジェクト指向について評判の良い本を数冊読んでおくことにした。
オブジェクト指向でなぜつくるのか-第2版-
「オブジェクト指向とは何ぞや」的な本。オブジェクト指向が求められた歴史的背景なども説明してくれている。良書。オブジェクト指向についての副読本的立ち位置だと思う。
増補改訂版Java言語で学ぶデザインパターン入門
劇的に読みやすい。
GoFのデザインパターンに基づいて、全て簡潔にサンプルコードを交えて紹介してくれている。自分で使いこなすことはできないが、Singletonとか抽象クラスとかInterfaceとかって何なのかが朧げながら理解できた。
Javaを学習したことがなかったので、ハードルを感じていたが、別段JavaJavaしているわけではなかったので安心した。オブジェクト指向言語を学んだことがあるなら読み進められるかと思われる。
リファクタリング 既存のコードを安全に改善する(第2版)
現在進行形で読んでいる。4月までに読み終えられるだろうか。
プログラミング全般
純粋に興味があったから読んでみた本たち。
定本 Cプログラマのためのアルゴリズムとデータ構造
アルゴリズムを学んだことが無い方は、この本から読み始めると良いと思う。良書。
珠玉のプログラミング-本質を見抜いたアルゴリズムとデータ構造-
初心者の自分には読んでも身にならない本だと判断し、途中で読むのをやめた。ある程度アルゴリズムについて実践をこなした段階で読むと、目から鱗なんだと思う。初心者の自分には、まだ早かった感。
計算機プログラムの構造と解釈-第2版-
良書だと思う。MITで使われてきたプログラミングの教科書だそう。自分は本を読んだことが無いので分からないが、原著SICPの翻訳版である「計算機プログラムの構造と解釈」の和訳が酷いらしく、見兼ねた方が「計算機プログラムの構造と解釈」の和訳の和訳をネットに挙げていたので、そちらを読んだ。とても読みやすく、「関数型プログラミング」や「代入」、「環境」など色々学べた。下に貼ってるのがリンク。
https://takeda25.hatenablog.jp/entry/20151030/1446174031
http://vocrf.net/docs_ja/jsicp.pdf
Haskell
某プログラマに、自分がこれまで使ったことがある言語(Ruby,PHP)を伝えると、「関数型言語をやってないから、そっちやってみたらいいよ。」「色々なパラダイム知ると1つのパラダイムを俯瞰できるよ。」「Haskellのこの本(すごいHaskellたのしく学ぼう)オススメだよ。」的なことを言われたので、それを読んでみた。
ちなみに、Javascriptを用いて関数型言語の特徴について理解するなら以下の動画とか良かった。
Learning Functional Programming with JavaScript
すごいHaskellたのしく学ぼう
非常に良書だった。再帰関数とか高階関数とか関数のカリー化とか関数型言語特有の概念を理解することができた(と思う)。ファンクターとかモナドとかも概念的には分かったよ程度なので、今後実践でも応用できるくらいに理解するまでは踏み込んでいきたい。
プログラミングHaskell
「すごいhaskell」には書かれていない内容もあったので良かった。遅延評価についても詳しく紹介されていたり。
ポインターによる共有を用いた名前渡しは、「遅延評価」と呼ばれる。Haskellで使われているのは、この評価戦略であり、そのためHaskellは遅延プログラミング言語と呼ばれる。遅延評価は名前渡しに基づいているので、停止し得るなら評価を必ず停止できるという性質を持つ。また、ポインターによる共有を用いているので、簡約の回数が値渡しよりも多くなることはない。
Go
正直、いろいろなプログラミング言語の触りだけを触っていくのは、良い勉強法では無いと思ったが、C言語系列(低レベルな言語)は経験がなかったので見ておきたかった。先に紹介した「Unixネットワークプログラミング」とかを読んでいても、C言語で書かれていたりしたので、ある程度知っておいた方が良いんだろうなとは思う。
ただC言語が古い感もあったので、どうせならということで、C言語の特徴を取り入れていて時流な言語であるGoを見ておくことにした。(ちなみにDockerも内部はGoで書かれていたりする。)
プログラミング言語Go
某会社のCTO曰く「言語を学ぶ際には、その言語の呼吸を知ることが大事。」「C言語でいうとカーニハン」とかって話していたので、そのカーニハンとやらが共著者であるこの本を読むことにした。
実際、カプセル化の利点とかエラー処理の戦略とか、色々Go言語に留まらない知識を与えてくれる本だった。ただ、レベルは高めだったので、身につくまで読み返して行きたい本。
Go言語による並行処理
並行処理を使うタスクのGithub上のレビューで「悲観ロック」とかいう単語が書かれていて、分からなすぎて爆死。並行処理の知識をつけておきたいと思った。ので、Go言語を見たついでにこの本も読んでおいた。
全部は読んでいないが、メモリアクセス同期に関する知識やゴルーチンとチャネルに関する知識を深めることができた。
機械学習
Webエンジニアとはいえ、明らかにAI関連の話題を将来的に避けては通れないと思うので、今のうちに概観をざっと眺めておいた。
MarI/O - Machine Learning for Video Gamesが面白くて、機械学習に興味を持ったというのもある。
Kaggleで勝つデータ分析の技術-
機械学習に関して、ざっくりと全体像を知ることができる。良書。
機械学習スタートアップシリーズ-ベイズ推論による機械学習入門-
なんとなく手を出してみたけど、難しい。途中で読むのをやめた。
ゼロから作るDeep-Learning-―Pythonで学ぶディープラーニングの理論と実装-
ニューラルネットワークについて知識を深めることができる良書。ただこの本を、帯に書かれている「入門書」と表現するのには違和感を感じる。
ゼロから作るDeep-Learning-―自然言語処理編-
word2vecやembeddingレイヤ、RNN、seq2seq、Attentionなど、自然言語処理の触りが非常に分かりやすく体系的にまとまっていた。オススメ。
scikit-learnとTensorFlowによる実践機械学習-
和訳されてないけど第2版が出ているので、そちらを読むと良いと思う。良書。
Python-機械学習プログラミング-達人データサイエンティストによる理論と実践-
非常に読みやすい。良書。「scikit-learnとTensorFlowによる実践機械学習-」とこの本の両方を読む必要はないように思う。
強化学習
強化学習の原典的な感じで紹介されていたので英語版で読んでみたけど、挫折。
良書だとは思うし、自分が読んだのが英語版だったので日本語版については知らないけど、機械学習に入門したいなら次に紹介する「機械学習スタートアップシリーズ-Pythonで学ぶ強化学習-」の方が読みやすいと思う。
機械学習スタートアップシリーズ-Pythonで学ぶ強化学習-
めちゃくちゃ分かりやすかった。強化学習を学びたい方の最初の1冊としてオススメ。
はじめてのパターン認識
機械学習に関して数学の面から知識を深める本。(ネット曰く入門書。)劇的に難しかった。ネットに落ちている解説記事を参考になんとか通し読みできたが、ほぼ文系卒の自分には難しすぎた。
その他
体系的に学ぶ 安全なWebアプリケーションの作り方
非常に読みやすい。良書。
暗号技術入門
セキュリティ関連でネットを調べていると、この本がよくオススメされていたので読んだ。暗号技術について1通り学ぶことができたと思う。図解が多く非常に分かりやすい。スラスラ読める良書。
はじめて学ぶソフトウェアのテスト技法
Githubのレビューで「ぶらっくぼっくす」とか「ほわいとぼっくす」とか話しが出ていて、分からなすぎて脳死。よくよく考えたらテストについて体系的に学習したことがないことに気づいたので、とりあえず本書を読んでみることにした。
簡潔に書かれていて読みやすいが、デシジョンデーブルとか状態遷移テストとか、何やら実際にコードに落とし込むものではなくテスト設計に重きを置いている本だったので、自分が求めていた本ではなかった感。
良書なんだとは思う。
リーダブルコード-―より良いコードを書くためのシンプルで実践的なテクニック
あらゆる先輩方に読んどけと勧められたように思う。言わずもがな良書。何回も定期的に読み返さないと身につかない感。
最後に
まだ読んでみたい本が沢山あるので、ここまでの本を今後コーディング実践を通して消化しつつ新しいものにも手をだしていきたい。