give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

フィヨルドブートキャンプのメンター陣が語る「このバイブルに育てられた」学びの一冊

はじめに

ちょっと前に「「このバイブルに育てられた」駆け出しエンジニアだった頃に読み込んだ、学びの一冊をご紹介」というweb記事が話題になっていました。

type.jp

たぶん、長年ITエンジニアをやっている人なら1冊か2冊はそういった「バイブル」があると思います。

そこでフィヨルドブートキャンプのメンターに「あなたが「このバイブルに育てられた」と思う一冊は何ですか?」という質問をしてみました。
なお、回答者はメンターだけでなく、アドバイザー(メンターではないが、受講生の学習状況を確認できる企業関係者)や卒業生も含まれています。

というわけで、以下がその回答です!

【もくじ】

※おことわり=各書籍のリンクはAmazonアソシエイトのリンクになっています。

メンターの伊藤淳一さん=「情熱プログラマー」

twitter.com

最初は僕自身が語ります(苦笑)。

僕が選ぶなら「Code Complete」と「情熱プログラマー」と「ピープルウェア」。1冊に絞れ、って言われたら「情熱プログラマー」かな〜。

「情熱プログラマー」を読んでから、エンジニアとしてどう生き残っていくか、とか、ただ仕事としてコードを書く"だけ"のサラリーマンエンジニアで終わらないようにするためにはどうしたらいいか、みたいなことを考え始めた結果、今の僕がある気がします。

Code Completeは自分の中できれいなコードと汚いコードを判断する基準を作ってくれた本。

ピープルウェアはエンジニアにとって良い組織と悪い組織があることを教えてくれた本。

どの本ももし読んでなかったら今の自分はなかったはず!

blog.jnito.com

メンターのinoueさん=「リーダブルコード」か「アジャイルサムライ」

twitter.com

「リーダブルコード」か「アジャイルサムライ」です!

両方とも、初心者にも分かりやすく、かつキャリアを重ねてもずっと役に立つ稀有な本だと思います。
実際、僕はエンジニアとして働き始める前に二冊とも読みました。それでもなお、未だにバイブルだと思っています。

ただ、両方ともフィヨルドブートキャンプの参考書籍にあるのでちょっと面白くないですね。
他にあるとしたら「データ指向アプリケーションデザイン」が良かったかなと思いますが、初心者向けではないですし僕自身も未だ理解できていないところがたくさんあります 😅

しかし、何回も繰り返し読む価値のある本だと思います。一応感想も書きました。

summertree.hatenablog.com

メンターのべーたさん=「猫でもわかるC#プログラミング」と「ノンデザイナーズ・デザインブック」

twitter.com

すでに著名な本のタイトルは出ているので、実務的に自分が触れた本について、ご紹介するのも一興かと思い書き込みします。 (バイブル...? バイブルというより、もうちょっと俗っぽいカテゴリかもしれませんがお許しください! 🙏 )

「猫でもわかるC#プログラミング」

プログラミングのプの字も知らない高校(高専)1年生の時に教科書として与えられた本がコレでした。完全にこの一冊でプログラミングできるようになったという訳ではありませんが、色々(変数,型,演算子,制御構文,クラス,継承,etc...)と身につくまで、この本にずいぶん助けられました。自分のプログラミング学習は、ざっくりと C# (C,C++もかじる) → JavaScript → Ruby と辿ってきたのですが、この本から学んだ「根っこの部分」はどの言語にも活かせるものだったと感じています。
とはいえ、当時からC#もまた進化しちゃってると思うので、今は全然書ける気がしませんが... 😅

「ノンデザイナーズ・デザインブック」

プログラミングじゃないんですが、この本と出会って、なんとなくですが業務とかで作る資料のクオリティがちょっと上がりました 😄 基本原則の「近接/整列/反復/コントラスト」は知っていて良かったなと今でも思っています!

メンターのkomagataさん=「プログラミングPerl」と「ピープルウェア」

twitter.com

僕は「プログラミングPerl」です。

その理由はこちらのブログに詳しく書いています。

しかし未熟とはいえ業務としてのプログラミング、つまり「何が分からないのかも分からない」という状況への耐性は出来ていたので、リリースまで家に帰らない覚悟を決め、Webで評判の高かった"ラクダの絵の描かれた本"を買って先輩独自のWebフレームワークのソースを端から読んでいく事にした。

(略)

しかしその後、あることを切っ掛けに今まで意味不明な記号の羅列や呪文の様にしか見えなかったソースや本の文章が急激に理解できるようになった。パズルのピースがはまっていくように次々と頭の中の記憶の断片が意味の通る知識としてつながった。これはちょっとしたカタルシスだった。

(略)

「あれも読める、これも読める、読めるぞー!」

(略)

つまりオライリーとは僕にとって"全然分からないものが分かるようになる魔法の本"なのである。

何故オライリーの本を買うのか - komagataのブログ

ただPerl書かない人が読んでも仕方ないので、今でも役に立つと思うものの中では僕も「ピープルウェア」です。

ピープルウェアでソフトウェアプロジェクトの社会学的な面がとっても大事だということを知りました。

技術的には問題ないのに失敗したプロジェクトのフェーズ1の後にこれらトム・デマルコ系の本を読み漁って、結果フェーズ2が成功したのでとっても印象深い本です。

qiita.com

メンターのゆーいちさん=「達人プログラマー」と「メタプログラングRuby」

twitter.com

色々出ちゃってますねー。

「リーダブルコード」と「ノンデザイナーズデザインブック」は僕もおすすめします。ずーっと役に立ちます。

出てないので影響あったのは

達人プログラマー

読んだのは初版です。書いてあること全然守れてない(毎年新言語学ぶとか… 😓 )ですけど。
トッププログラマーはこうなのか…と感動しました。

メタプログラングRuby

読んで欲しいかどうかは微妙ですが、僕にとって影響が大きかった本です。

Rubyの高度なメタプログラミングの機能を使って色々できる事を解説しています。

当時Javaの仕事をしていて、これを読んで、「Rubyはこんなことできるのか、面白い!プログラマーを信頼してるからこんな事を可能にしてるという事か。素晴らしい!」ってなりました。
初めて行ったRubyコミュニティのYokohama.rbで輪読会したのもあって、Rubyで仕事したい!という気持ちが高まりましたね。

今仕事でこの本に書いてあるコード出てきたらレビューでNG出すんですけどね 😅

内容はもちろん、出会うタイミングも大事だなって思いますね。

メンターのYuheiOkazakiさん=「オブジェクト指向でなぜつくるのか」と「テスト駆動開発」

twitter.com

同じく既にいろいろ出ているので、出ていないものから選ぶと 「オブジェクト指向でなぜつくるのか」と「テスト駆動開発」ですね。

自分はC言語&組込み業界からプログラミングに入ったので、オブジェクト指向もテスト駆動もあまり浸透していない世界でお仕事をしていました。それもあってこの2冊は知らない世界のより上手いやり方を知る、という意味で大きな影響を受けたと思います。(そして後の転職に繋がる 😅 )

オブジェクト指向についてはC言語自体がそういう機能を持っていないこともあって、概念を理解・実践するのが非常に難しい状態でした。この本を通じて、何のためにオブジェクト指向で作り、逆に何ができていればオブジェクト指向と言えるのかを知ることができました。

テスト駆動は「小さいサイクルを回す」ことの重要性を知るきっかけになりました。当時していたお仕事は手動で何度もテストを繰り返す(組込みなので実機を触ってのデバッグが多いこともあり)というカルチャーだったので、効率化や品質担保という観点で衝撃的でした。

アドバイザーの大倉雅史さん=「オブジェクト指向のこころ」

twitter.com

私は『オブジェクト指向のこころ』ですね。

Javaを題材にした本であり、当時の自分は(ついでに言うと今の自分も)Javaは全く読み書きできないにもかかわらず、非常に多くの示唆を受けました。私はこの本を読んで以後オブジェクト指向に関する本はほとんど読んでいないのですが、正直この1冊でも十分なように思っています。

アドバイザーのUchio Kondoさん=「Linuxプログラミングインタフェース」と「アジャイルな見積りと計画づくり」

twitter.com
実はそんな感じのブログを昔書いてました!
udzura.hatenablog.jp

Linuxプログラミングインタフェース

この中でインパクトの大きい一冊、となると完全に「Linuxプログラミングインタフェース」なんですが、フィヨルドブートキャンプの多くの皆様のめざしたい方向と直接は関係ないと思うので ^^;

自分の直近数年の活動の方向性を決定づける本だった。当時、Linuxにより一層踏み込んだプログラミングを「自分の問題」にしたかったのだが、この本を足がかりに踏み込みを進めることができた気がする。

あと、この本はいわゆる(?)オライリー社から出ている鈍器の一角で、物理的には1,600ページほどある。電子で読んだので、読み終えてからページ数に気づいたのだが。そういう本を一つでも読み終えたのは多少は自信につながった。

自分の中で大切に思ってる本の話 - ローファイ日記

アジャイルな見積りと計画づくり

ジュニアな時に読んだ「アジャイルな見積りと計画づくり」は色々と影響を受けました。

この本は某F社にいるときに、とにかく周りの仕事が進まない、優先順位がつかない、今でいうトイルで運用が忙殺される、みたいな不満の塊の只中にいるときに読んだ。

僕のスクラムというか、仕事の進め方の基本を間違いなく構築している本はこれ。その後も何冊かスクラムに関する本は読んだが、この本で言われている内容は本当に基本的かつ普遍的だなあと感じる。だいたい、この本の内容と、この本を読んだ後転職したA社でのやり方、あとは大学の時のサークルやバイトの時に学んだこととかを思い出しながらお仕事の帽子をかぶっている。

とにかく、未来のことはよくわからない、なのでどういう事態が勃発してもなんとなく対応できるように考えや仕組みにバッファを持っといたり、ざっくりと現場の進捗を把握する方法を身につけましょう、みたいにこの本を解釈していて、それが今でも判断の原点になっている。

自分の中で大切に思ってる本の話 - ローファイ日記

今ならアジャイルサムライでもいいのかな? # でもアジャ見積の方が好きなんですよね...

卒業生のmhさん=「UNIXという考え方」

twitter.com

卒業生ですが、「UNIXという考え方」という古典的名著を思い出しました。
20年前くらいに読みましたが、シンプルな小さい部品を組み合わせて、
大きいプログラムを作るという思想が今でも役立っているなぁと感じます。

まとめ

というわけで、みなさんが選んでくれた「このバイブルに育てられた」学びの一冊は以下のようになりました!

伊藤淳一さん 情熱プログラマー
inoueさん リーダブルコード アジャイルサムライ
べーたさん 猫でもわかるC#プログラミング ノンデザイナーズ・デザインブック
komagataさん プログラミングPerl ピープルウェア
ゆーいちさん 達人プログラマー メタプログラングRuby
YuheiOkazakiさん オブジェクト指向でなぜつくるのか テスト駆動開発
Shohei Umemotoさん RailsによるアジャイルWebアプリケーション開発
大倉雅史さん オブジェクト指向のこころ
Uchio Kondoさん Linuxプログラミングインタフェース アジャイルな見積りと計画づくり
mhさん UNIXという考え方

たしかにどの本も「流行りの技術を学ぶ本」とかではなく、何年(何十年?)も長く使えそうな知識が詰まった名著ばかりですね!
全部読むのは大変だと思うので、面白そうと感じた本を何冊かピックアップして読むのがいいと思います。
もしかするとその本があなたのバイブルになるかもしれませんよ!

最後に、回答してくださったメンターやアドバイザー、卒業生のみなさん、どうもありがとうございました😄

bootcamp.fjord.jp

PR:フィヨルドブートキャンプでアドベントカレンダーやってます!

フィヨルドブートキャンプの在校生や卒業生、メンターが技術情報や日々の思いをアウトプットするアドベントカレンダーです。
フィヨルドブートキャンプってどんなことやってるの?という興味がある人はぜひチェックしてみてください!

adventar.org
adventar.org

ちなみに、枠が余ってたらこのエントリもアドベントカレンダーに入れようと思ったのですが、Part 1、Part 2ともすでに満席で入れられませんでした😅

マトリョーシカ人形のようなメソッド設計を避ける

フィヨルドブートキャンプのコードレビューでよく指摘してるシリーズです。

次のようなパンを焼くRubyプログラムがあります。
このプログラムはどういう工程を経てパンが焼かれるのか、ぱっと把握できますか?

def main
  パンを焼く(粉, 水)
end

def パンを焼く(粉, 水)
  焼く(パンを発酵させる(粉, 水))
end

def パンを発酵させる(粉, 水)
  発酵させる(パンを整形する(粉, 水))
end

def パンを整形する(粉, 水)
  整形する(パンをこねる(粉, 水))
end

def パンをこねる(粉, 水)
  こねる(粉, 水)
end

main

上のプログラムは次のように書いても同じように処理されますが、工程の全体像がつかみやすいのはどちらでしょうか?

def main
  生地 = パンをこねる(粉, 水)
  整形された生地 = パンを整形する(生地)
  発酵した生地 = パンを発酵させる(整形された生地)
  パンを焼く(発酵した生地)
end

def パンをこねる(粉, 水)
  こねる(粉, 水)
end

def パンを整形する(生地)
  整形する(生地)
end

def パンを発酵させる(整形された生地)
  発酵させる(整形された生地)
end

def パンを焼く(発酵した生地)
  焼く(発酵した生地)
end

おそらく後者の方がぱっと全体像が理解しやすいと思います。
(こねる→整形する→発酵させる→焼く、という流れがmainメソッドを見ればわかるため)

前者と後者の違いは何か?

前者の場合、メソッド呼び出しと戻り値の関係を図式化すると以下のようになります。

実行すべき順序は「こねる→整形→発酵→焼く」ですが、メソッド呼び出しの順序は「焼く→発酵→整形→こねる」のように逆順になるため、処理の流れが直感的に理解しにくくなります。

また、コードの読み手は

「焼く、の前に発酵するの?」
「発酵、の前に整形するの?」
「整形、の前にこねるの?(で、どこまで続くの?)」

と、一番最初の処理に到達するまで手前のメソッドを確認し続けなければなりません。
これはまるで一番小さな人形に到達するまで、マトリョーシカ人形の蓋を開けていくような作業です。

Image: マトリョーシカ人形 - Wikipedia

一方、後者であれば以下のようになります。

一般的に、シーケンシャル(逐次的)な処理があり、前の処理の結果を利用して次の処理に進むような場合は、このように起点となるメソッド(この場合はmainメソッド)において、

  • 処理1を呼びだしてその戻り値1を受け取る
  • 処理2に戻り値1を渡して、その戻り値2を受け取る
  • 処理3に戻り値2を渡して・・・

と呼び出した方が、起点となるメソッドを見るだけで処理の全体像が把握しやすくなります。

前者のもう一つの問題点

前者のようなメソッド設計は「パンを焼く」メソッドが再利用しづらくなっています。
なぜなら、「パンを焼く」メソッドが受け取る引数は粉と水だからです。
つまり、常に処理のスタート地点からでないと呼び出せないメソッドになっています。
(この問題は「パンを焼く」以外のメソッドについても同様)

# 一番最後の工程のために、一番最初の工程で必要な引数を渡さなければならない
def パンを焼く(粉, 水)
  焼く(パンを発酵させる(粉, 水))
end

本来であれば、パンを焼くために必要なインプット(引数)は発酵した生地だけなので、以下のように発酵した生地を引数として受け取る方が再利用性が高くなります。

def パンを焼く(発酵した生地)
  焼く(発酵した生地)
end

たとえば、以下は冷凍して保存しておいた発酵生地を解凍し、それを「パンを焼く」メソッドに渡す例です。

解凍した生地 = 解凍する(冷凍された発酵生地)
パンを焼く(解凍した生地)

これであれば、「パンを焼く」メソッドがいろんなユースケースで再利用できますね。

参考:意図的にマトリョーシカにする場合もある

この記事では「マトリョーシカ人形のようなメソッド設計を避けよう」という話を書いていますが、意図的にマトリョーシカ人形っぽい設計を採用する場合もあります。

詳しくは触れませんが、Rack(もしくはPythonのWSGI)のアーキテクチャはマトリョーシカ人形的です(タマネギによくたとえられます)。

Image: "RBS generation framework using Rack architecture"の予習記事 - READYFOR Tech Blog

デザインパターンのDecoratorパターンもマトリョーシカっぽい設計になることがあります。
参考 JavaでDecoratorパターン - Qiita

ただし、どちらもケースもインターフェースを完全に揃えているのがポイントです。
すなわち、内側の処理も外側の処理も「同じメソッド名・同じ型の引数・同じ型の戻り値」になっており、各処理を自由に差し替えられる利点を持っています。

このへんの話を詳しく説明し始めると長くなるのでここでは割愛します(気になる人は調べてみましょう!)。
とりあえず、上級テクニックではあるものの、きちんとルールを決めて使えば「マトリョーシカ人形」も有効に働くケースがある、ということだけ覚えておいてください。

おまけ:Elixirのパイプライン演算子を使うとこうなる

マトリョーシカではないRubyコードはこんなふうに書きましたが、

def main
  生地 = パンをこねる(粉, 水)
  整形された生地 = パンを整形する(生地)
  発酵した生地 = パンを発酵させる(整形された生地)
  パンを焼く(発酵した生地)
end

Elixirのパイプライン演算子を使うと、上と同じ処理がこんなふうに書けます。

def main do
  パンをこねる(粉, 水)
  |> パンを整形する
  |> パンを発酵させる
  |> パンを焼く
end

こういう処理だとElixir(というか関数型言語?)の方がよりシンプルで美しく書けますね。

【PR】フィヨルドブートキャンプでメンターやってます

僕はフィヨルドブートキャンプというプログラミングスクールでメンターをやっています。
完全未経験の人でもプログラミングを学べるので、興味がある人はぜひ覗いてみてください〜。

bootcamp.fjord.jp

ガスで焼くたこ焼きがホットプレートで焼くたこ焼きの5倍美味しかった

最近、たこ焼き系YouTuberなる人がいるらしく、その人が「たこ焼きを焼くなら絶対コレ!!」とオススメしていたたこ焼き器を買いました。
イワタニの炎たこ 2(えんたこツー)というカセットガスで焼くたこ焼き器です。

今まではホットプレート用の「たこ焼きプレート」を使って焼いていたのですが、ガスで焼くたこ焼き器で焼いたら、たしかにめっちゃ味が変わりました!!

なんか外がカリッと香ばしく焼けます。中ももちっと、ふわっと、とろっと焼けます。

特に外の香ばしさは、ピザのこんがり焼けたクラストに近いイメージです。

Buffalo Chicken Pizza

ホットプレートで焼いたたこ焼きは冷めるとふにゃっとして美味しくなくなりますが、ガスで焼くと冷めてもなんか美味しい!

あと、火力が強いのでホットプレートよりも早く焼けるところもgoodです。

食べる前は「そんなに変わるんか〜?」と半信半疑でしたが、実際に食べてみると「うおお、これは確かに違う!!」となりました。
みなさんも騙されたと思ってぜひ買ってみてください!

P.S.
食べるのに夢中で、たこ焼きのできあがり写真を撮るのを忘れてしまいました。どうもすいません……。