Let's write β

プログラミング中にできたことか、思ったこととか

独学でプログラミングしてきてよかった本まとめ

良いコードを書きながら速くチームで成し遂げたい

ビジネス的には、ビジネスの機運を適切につかむためにも速くリリースすることが必要である事が多く、 一方で出来合いのコードで速くリリースし続けると負債となって溜まっていってしまいます。

そういうジレンマを解消するために日々「良いコードを書きつつチームとして速くプロダクトに落とし込む」 練習をしているのですが、その過程で読んだ中で良かった本などをまとめてみました。

コンピュータの理論

job_suugakusya.png

コンピュータは物理的な物体としての「電子計算機」であるという側面とともに、 理論的な「計算モデル」によって成り立っているという側面があります。

そのためには、コンピュータの数学的な背景から学ぶと理論的な視点からコードの良し悪しを見られるようになると思います。

良かった本

アルゴリズム

論理、計算論、数学

量子コンピュータ

Tips: ひとが物事をやる時のやり方を見る

日々小さなことでも、人が物事をやるときにどのようにしてこなしているか 観察していると、いろいろなアイデアをえることができたりしました。 特に、人々が共同で作業を分担して行っている組織の仕組みややり方は自然にマルチエージェント型のシステム構成になっていることが多く、 また、人々が空間的に広がって作業している場合の情報交換の仕組みや、 時間軸上で広がっているときの情報交換の仕組みから、 分散ハードウェアやマルチスレッド処理のアルゴリズムの素描となるようなものを見ることができて面白かったです。

コンピュータのハードウェア的側面

computer_single_board.png

一方でコンピュータは目の前に実在する物体でもあるので、 具体的なハードウェア(CPU、キャッシュ)、その上で行われているOSの仕組み等を見てみると、 ハードウェアを意識したコードを書けるようになると思います。

  • 規則装置の電子的な仕組み
  • CPUの仕組み
  • キャッシュ階層の構造
  • OSのメモリ管理
  • OSのハードウェア管理

良かった本

プログラミング言語

コードを書くときには特定のプログラミング言語を使ってプログラムを書くことになるので、 プログラミング言語は人とコンピュータとのインタフェースの役割を担っていると思います。

そのため、プログラミング言語の言語的特性や各機能やパラダイムのメリットデメリットや、 言語設計の上での課題でのアプローチの方針を見てみると、より言語の機能を適切に使ったコードを書けたり、 広い視野で課題への良いアプローチを考えることができるようになると思います。

  • さまざまな言語のパラダイム
  • 型理論
  • 様々な言語の持つ機能とそのプロコン
  • 様々な言語の字面上の認知特性
  • 言語の設計思想(大規模開発にたいしてこの言語はどのようにアプローチをしているのか?..etc)

個人的にやってみて視野が広がったプログラミング言語

ハードウェア

  • Nasm
  • X86 (32bit, 64bit 両方だとなおよし)

手続きプログラミング

  • C
  • Rust (分類はここで適切?)

オブジェクト指向

スタック型言語

  • Forth

関数プログラミング

論理型言語

LL言語

分散処理

言語の勉強は大好きなので、他にも良い言語があったら是非教えてください。

良かった本

型理論

関数プログラミング

オブジェクト指向

その他

大規模なプログラムの組み立て方

一人で、短期間にコードを書き上げるのなら比較的力技でもなんとかなりますが、 ある程度の時間をかけてチームで開発をしていくに当たっては、プログラム全体のアーキテクチャを適切に 組んでいくと、よりコード全体が読みやすいコードになっていくと思います。

良かった本

Tips: 違和感を感じたら整理してみる

プログラムを書いているときに、「なんだかごちゃごちゃしてきちゃったな」って感じる時がありました。 そういうときは、その違和感がどこから来るのか整理してみて、どこからその違和感が来るのか、どうやったらそれがなくなるのか、 どういう問題点があるんだろうというのを整理してみました。 すると、異なる視点から構造化してみるとコードがかなりシンプルになってスッキリしたケースがかなり有りました。 違和感を感じたら、その場で直せなくてもどこかにメモをして時間のあるときにまとめてみると良いかもしれません。

チーム開発の知見

business_akusyu.png

プロダクトやチームの編成も視野に入れて適切なプロジェクト管理の手法を選べると 開発時の人的な衝突や、プロジェクトの炎上の危機を未然に防げるかもしれません。

コードも適切にテストのフローを入れておくことで、 余裕を持ってしてデグレのチェックや仕様変更への柔軟な対応もできるようになりました。

  • プロジェクト運営の様々な手法(ウォーターフォール、XP、アジャイル..etc)
  • チーム開発の知見(自己組織化、リモートワーク..etc)
  • いろいろな開発手法(TDD, DDD, 静的解析ツール)
  • チームビルディング(リーダーシップ、自己組織化, 心理的安全性)

良かった本

メンタルや考え方の生産性を上げる

atama_taisou.png

より抽象的な問題へのアプローチや脳の本来持つ問題解決力をうまく活かしたり、 作業中の身体への健康の不安などを減らせるとより集中したり安心して作業に取り組めます。

良かった本

おまけ: 歴史を知る

作業をしているとどうしても体力的に疲れてしまったり、辛いことと言うのは必ずどこかで出会うことになるので、 そういう時エンジニアの歴史や、かっこいいエピソードなどを読んでエンジニアという職業をもっと好きになりました。 エンジニア界隈のコミュニティーとかについても読み物として読むのは楽しいと思います。

好きな本