ソフトウェアエンジニア必読!「デキる開発者」になるための虎の巻解説
mtdvio/every-programmer-should-know
この "mtdvio/every-programmer-should-know" は、ぶっちゃけ「デキるエンジニアになるための虎の巻」みたいなもんやで。
ソフトウェアエンジニアの視点から、これがどない役立って、どない導入して、どんなもんが載ってるか、コント風に関西弁で解説させてもらうわ!
(舞台IT企業の休憩室。ベテランエンジニアの「匠(たくみ)」と、若手エンジニアの「新(あらた)」がコーヒーを飲んでいる)
新
あー、もう!またこのバグか!先輩、こんなん、どないしたらええんですか!
匠 (コーヒーを一口)新、お前なぁ、いつも場当たり的な解決ばっかやろ?そのバグ、根本は「メモリ管理」の知識が欠けてるからやんか。
新
メモリ管理?えーと、GC(ガベージコレクション)が動いて...
匠 あかん、あかん!もっと根本や!お前、「mtdvio/every-programmer-should-know」って知ってるか?
新
え?なんかGitHubで見たことあるような...。長い名前のやつですよね?
匠 そう!これな、コンピュータサイエンスの「基礎の基礎」から、システム設計の「肝」まで、「プログラマーとして知っとくべき知識」を、ええ感じにまとめてくれてるんや。
基礎体力アップ!
データ構造とかアルゴリズムって、別に面接のためだけやないで。プログラムの「速さ」や「効率」に直結するんや。このリポジトリ見たら、「この処理なら、あのアルゴリズムやな」ってパッと閃くようになる。
デバッグ・トラブルシューティングの神髄!
OS、ネットワーク、データベース...バグっていろんなとこから湧いてくるやろ?この知識があれば、「あ、これはOSのファイルI/Oの問題ちゃうか?」とか、「ネットワークのレイヤー4で詰まってるな」って、原因の特定が早なるんや。
設計センス磨き!
「分散システム」とか「スケーラビリティ」とか、設計の知識もぎっしりや。これで「メンテナンスしやすくて、将来の負荷にも耐えられる、ええシステム」を作るセンスが身につくわ。
新
なるほど...つまり、小手先のテクニックより、真の土台を固めるための教科書、ってことですね!
匠 せや!これ読んで、「アセンブリ言語がどない動いとるんか」とか想像できたら、お前も一人前や!
匠 導入って言うても、これは「読むもん」やから、リポジトリを覗くだけでええんやけどな。
このリポジトリは、GitHubにあるんやから、やり方は簡単や!
GitHubで検索
ブラウザで「mtdvio/every-programmer-should-know」を検索する。
Clone(クローン)かStar(スター)
じっくり読みたいなら、自分のPCにクローンして、オフラインでも読めるようにしといたらええ。
git clone https://github.com/mtdvio/every-programmer-should-know.git
とりあえずブックマーク代わりにスターをつけるだけでもOKや。
(新がスマホでリポジトリを見ている)
新
うわっ!ほんまや、いっぱいある!「Computer Science」、「Networking」、「Databases」...めちゃくちゃ網羅的や!
匠
せやろ?特に、この辺りはプログラマーの血となり肉となる知識やで。
| 知識 | 何で大事なん? |
| OSI参照モデルとTCP/IP |
| インターネットは7層の積み木みたいになっとる。通信の不具合があったとき、「今、どの層で問題が起こっとるんや?」って切り分けできへんかったら、一生解決せんで! | | HTTPのステータスコード | 200 OK、404 Not Foundは知ってても、302 Foundとか503 Service Unavailableとかの意味までちゃんと理解しとるか?サーバーとクライアントの会話の言葉やで。 |
| 知識 | 何で大事なん? |
| ACID特性 | 銀行のシステムとか、お金を扱うシステムで、**「途中でエラーが起こってもデータがおかしくならへん」ための、データベースの「お約束」や。これ知らんと、トランザクション設計はできへんで。 |
| インデックス | データを探すときに、図書館の目次みたいなもんや。適切にインデックスを使わんと、システムがめちゃくちゃ遅なる**で。 |
| 知識 | 何で大事なん? |
| 時間計算量 (Time Complexity) $O(N)$など | 自分の書いたプログラムが、データ量が増えたとき、**「どれくらい遅くなるか」の指標や。これが分かれば、「このコードはヤバい!」**って事前に気づけるんや。 |
新 でも先輩、これってコードそのものより、「読んで学ぶ」って感じですよね?サンプルコードはないんですか?
匠 おう、ええ質問や!このリポジトリは、「特定の言語のコード」を教えてくれるんやなくて、「コードを書くための、正しい考え方」を教えてくれるんや。
(匠がホワイトボードに O(N2) と O(NlogN) のグラフを手書きする)
匠
例えばな、新。
新
ある日、1000件のデータを並び替える処理を書きました。
匠
ほう。どんなアルゴリズム使った?もしかして、バブルソートとかいう、おっとりしたやつか?
新
あ、そうです!簡単なんで...。
匠 バブルソートは、だいたいO(N2)(オー・エヌ・スクエア)って計算量になるんや。データ数が10倍(10000件)になったら、処理時間は100倍くらいかかるイメージや。
新
ひぇっ!10×10=100倍...!
匠 せやろ?ここで、このリポジトリに載ってるような知識、「マージソート」とか「クイックソート」を知っとったら、O(NlogN)(オー・エヌ・ログ・エヌ)っていう、もっと賢いアルゴリズムを使える。
もしお前がバブルソートしか知らんかったら...
# ♂ O(N^2)のコード (データが増えると遅い!)
# 知識が浅いと、これを選びがち
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
でも、このリポジトリで基礎を学んだら、「もっと効率的なやつがあるはず!」ってなって...
# ♀ O(N log N)のコード (データが増えても比較的速い!)
# 知識があると、こっちの選択肢を選べるようになる
def quick_sort(arr):
# ... クイックソートの賢い実装 ...
# 実際はライブラリを使うことが多いけど、仕組みを知るのが大事!
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
匠
このリポジトリはな、「この知識があるから、このコードを書ける」っていう、「知識と実装の懸け橋」になってくれるんや。サンプルコードそのものより、その裏にある偉大な先人の知恵を学んでくれ!
新 先輩...!なんか、急にやる気出てきましたわ!今日からこのリポジトリ、隅から隅まで読み込みます!「できるエンジニア」になりますわ!
匠
おう!頑張れや!そしたら、次はお前の設計したマイクロサービスで、うまいもん食いに行くで!
さあ、あなたもこのリポジトリで、ホンマもんのソフトウェアエンジニアとしての土台を固めてみませんか?