Clean Coder

プロ意識 プロになる前に注意したいこと プロにならないのは簡単だ。自分の仕事に責任を持たなければいい。すべて上司にお任せだ。 ミスをしたら上司が後始末をしてくれる。だた、プロは自分で後始末をする。 機能に危害を加えてはいけない ソフトウェアをリリースするときには、QAに問題を見つけてもらってはいけない。 不具合がありそうなコードをわざとQAに渡すようでは、プロの風土にも置けない。 では、不具合がありそうなコードとは何だろうか?詳細がわからないコードだ! コードが動いていることをどうやって把握するのだろうか?簡単だ。テストすればいい。 何度もテストするのだ。手を変え、品を変え、あらゆる方法でテストするのだ。 テストには時間がかかりすぎると思っているかもしれない。スケジュールや納期は守らないければいけない。 テストだけやってたらコードが書けないじゃないか。いい指摘だ! だからこそ、テストを自動化するんだ。すぐに実行できるユニットテストを何度も実行するんだ。 本物のプロは、構造を犠牲にして機能を届けるのはバカのやることだと思っている。 コードの柔軟性はその構造にかかっている。構造が不安定ならば未来も不安定になる。 ソフトウェアは適切なコストで変更できなければいけない。 労働倫理 1週間は168時間だ。雇用主に40時間、君のキャリアに20時間を使える。 残りは108時間。睡眠に56時間を使うとして、残りの52時間は自由に使える。 自分の専門を知る ソフトウェアのプロが備えるべき最低限のこと デザインパターン GOF の 24 のパターンについて説明できる。 POSA のパターンを実際に使える知識がある。 設計原則 SOLID 原則を知っている。コンポーネントの原則を熟知している。 方法論 XP・スクラム・リーン・カンバン・ウォーターフォール・構造化分析・構造化設計を理解している。 規律 TDD・ オブジェクト思考・設計構造化プログラミング・継続的インテグレーション・ペアプログラミングを実践している 成果物 UML・DFD・構造チャート・ペトリネット・状態遷移図・状態遷移表・フローチャート・ディシジョンテーブルの使い方を知っている。 ドメインを知る プログラミングの対象ドメインを理化する責任がある。会計システムを作っているのなら、会計の知識が必要。 ドメインの専門家になる必要はないが、仕事に必要な知識というものがある。 新しいドメインのプロジェクトが始まるときには、関連書籍を1~2冊読んでみよう。 専門家と一緒に時間を過ごして、彼らの原則や価値を理解しよう。 ビジネスを理解せずに仕様からただコードを書くのはプロとして最低だ。 仕様の間違いを発見・指摘できるように、ドメインを理解しなければいけない。 「ノー」と言う 奴隷は「ノー」と言うことを許されていない。労働者は「ノー」と言うことをためらうだろう。 だが、プロは「ノー」と言うことを期待されている。 反対者の役割 「なぜ」よりも「事実」のほうが重要。 だが、「なぜ」を説明することで相手の理解が深まり、事実を受け入れてくれることもある。 相手には技術的な知識があり、理解しようとしてくれるならば、理由を説明するのもいいだろう。 だが、理由を説明しても相手が納得しないこともある。 それどころか、あなたが全て悪いと決めつけていまうこともある。 詳細を説明しすぎると、マイクロマネジメントを招いてしまう。 試しにやってみる 「試しにやってみる」にはさまざまな意味がある。問題にしているのは、「余分な仕事をする」ことだ。 期日に間に合わせるために何かできたのであれば、それまで仕事をしていなかったことになる。 つまり、力を温存していたわけだ。 もし力を温存していないのんら、もし新しい計画がないのであれば、もし振る舞いを変えないのであれば、もし最初の見積もりに自信があるのであれば、 試しにやってみると約束するのは不誠実である。ウソをついているのと同じだ。おそらくは、自分のメンツを保ち、対立を避けるためにやっているのだろう。 「イエス」と言う代償 できることなら「イエス」と言いたい。健全なチームはみんなで「イエス」と言うことを目指している。 うまくいっているチームのマネージャーや開発者は、お互いに合意するまで実行計画の内容について交渉する。 しかし、これまで見てきたように、正しい「イエス」を言うには、「ノー」も恐れずに言わなければいけない。 コードの実現不可能性 プロはヒーローになることがある。しかし、それはヒーローになろうとしたからではない。 プロは、納期・予算どおりに仕事を成し遂げたときにヒーローになる。...

March 1, 2022

The Programmers Brain

Chapter 1 Examines the three congnitive processes that play a role when programming and how each is associated with its own type of cunfusion.

March 1, 2022

The Essence of Failure

「超」入門失敗の本質 第1章なぜ「戦略」が曖昧なのか? 戦略のミスは戦術でカバーできない 戦略を実現する方法が「戦術」 いかに優れた戦術で勝利を生み出しても、最終目標を達成することに結びつかなければ意味はありません。 戦術のミスは戦略でカバーすることができない、とはよく指摘されることですが、目標達成につながらない勝利のために、 戦術をどれほど洗練させても、最終的な目標を達成することはできない。 戦略とは、いかに「目標達成につながる勝利」を選ぶかを考えること。 日本人は戦略と戦術を混同しやすいが、戦術で勝利しても、最終的な勝利には結びつかない。 日本は戦略の「指標」が間違っていた 時代や環境が変化しても、同じ行動をとり続ければ優位性を失うように、日本軍は戦場での一大勝利を求めて「白兵銃剣主義」や「艦隊決戦主義」を繰り返し、次第にその威力を失っていく。 勝利につながる「指標」をいかに選ぶかが戦略である。 性能面や価格で一時的に勝利しても、より有利な指標が現れれば最終的な勝利にはつながらない。 「体験的学習」では勝った理由はわからない 大局観に欠け、部分のみに固執する日本軍 日本軍ならびに日本企業が歴史上証明してきたことは、必ずしも戦略が先になくとも勝利することができ、ビジネスにおいても成功することができるという驚くべき事実です。 これは日本軍にも通じる点ですが、「一点突破・全面展開」という流れを日本人と日本の組織が採用しがちなのは、戦略の定義という意味での論理が先にあるのではなく、体験的学習による察知で「成功する戦略(新指標)を発見している」構造だからでしょう。 日本軍 ⋅⋅⋅指標の発見→体験的学習察知(経験から偶然気づく) ⋅⋅⋅勝利に内在する指標を理解せず、再現性がない ⋅⋅⋅成功体験のコピーに陥る。一点突破、全面展開 米軍 ⋅⋅⋅指標の発見→勝利にづながる効果的な戦略を選ぶ(敵・味方の行動と結果を分析) ⋅⋅⋅常に戦略があることで勝利を再現性がある ⋅⋅⋅空母・輸送船の撃沈。無意味な戦闘は回避 「体験的学習」で一時的に勝利しても、成功要因を把握できないと、長期的には必ず敗北する。指標を理解していない勝利は継続できない。 第2章なぜ、「日本的思考」は変化に対応できないのか? 「ゲームのルール変化」に弱い日本組織の仕組み 前提条件が崩れると、新しい戦略を策定できない 新しい概念を創造し、それを活用するという学習法のなさ 目標のための組織ではなく、組織のための目標をつくりがち 異質性や異端を排除しようとする集団文化 品質の高い「個別製品」の零戦部隊が、レーダーという「ビジネスモデル」を搭載した米艦隊に一気に撃墜されてしまうイメージです。 「練磨」「改善を極めていく」文化を持つ日本人の組織が、現在の世界市場で苦戦する様は、かつての日本軍がその戦闘力を無力化されていく姿に似ている。 ビル・ゲイツやスティーブ・ジョブズのような経営者が、日本でうまれないのは、ルール自体を変えるような破壊的な発送ではなく、型の習熟と改善を基本とする日本的思考と関係している。 既存の枠組みを超えて「達人の努力を無効にする」革新型の組織は、「人」「技術」「技術の運用」の三つの創造的破壊により、ゲームを根底から変えてしまう。 「ダブル・ループ学習」で問題解決にあたる 「目標と問題構造を所与ないし一定とした」上で最適解を選び出す学習プロセスを、「シングル・ループ学習」という。 「シングル・ループ学習」は、目標や問題の基本構造が、自らの想定とは違っている、という疑問を持たないスタイルです。 「ダブル・ループ学習」とは、「想定した目標自体が違っている」のではないか、という疑問・検討を含めた学習スタイルを指す。 ダブル・ループ学習で疑問符をフィードバックする仕組みを持つ。「部下が努力しないからダメだ!」と叱る前に問題の全体像をリーダーや組織が正確に理解しているか、再確認が必要である。 第3章なぜ、「イノベーション」が生まれないのか?

February 26, 2022

Why We Sleep

睡眠こそ最強の解決策である なぜ朝型人間と夜型人間がいるのか 朝型と夜型の分類は、「クロノタイプ」とも呼ばれている。大人の場合、クロノタイプはほぼ遺伝で決まることが多い。 午後のコーヒーが夜の睡眠を奪う 睡眠と覚醒を決める要素は2つあり、24時間単位の概日リズムはその最初の1つだ。そして2つ目の要素が「睡眠圧」になる。今この瞬間も、あなたの脳内では、「アデノシン」と呼ばれる化学物質が着々と増えている。アデノシンの増加は、起きている間ずっと続いている。だから起きている時間が長くなるほど、脳内のアデノシンも多くなるということだ。アデノシンは、起きている時間を計測する装置だという考え方もできる。 脳内のアデノシンが増えると、眠りたいという欲求が高まる。この現象が「睡眠圧」だ。脳内に蓄積されたアデノシンは、脳の覚醒を司る部位のボリュームを下げ、睡眠を司る部分のボリュームをあげるという、2つの技を同時にこなすことができる。アデノシンの量がピークに達すると、もう眠くて眠くてたまらないという状態だ。たいていの人は、12時間から16時間起きているとこの状態になる。 しかし、ある種の化学物質を使えば、アデノシンから出る睡眠信号を消し、眠気を覚ますことができる。その物質が「カフェイン」だ。 カフェインの半減期は、平均して5時間から7時間になる。たとえば午後7時30頃に夕食のコーヒーを1杯飲んだとすると、午前1時30分になってもまだ半分のカフェインが体内に残っていることになる。 なぜ深い眠りと浅い眠りがあるのか 深いノンレム睡眠のいちばん大切な機能は、もういらなくなったニューロンのつながりを削除することだ。対照的に夢を見るレム睡眠は、ニューロンのつながりを強化する役割をはたしている。 2つの睡眠で記憶スペースの容量不足を解消する 粘土を使って像を造ると想像してみよう。まず、大きな粘土のかたまりを台座に置く。大きな粘土のかたまりは、寝るまでに脳内に蓄積されたすべの記憶にあたる。次に、粘土のかたまりを削り、大まかな形にしていく。これが長時間続くノンレム睡眠だ。その間に、細部の造形を行うこともある(短いレム睡眠)。 この最初の段階が終わると、また粘土を大まかに削る作業が始まる(2度目の長いノンレム睡眠)、それからさらに細部をつくり込んでいく(先ほどより少し長いレム睡眠)。このサイクルを何度か繰り返すと、求められる作業のバランスが変わる。大まかに削る作業はほぼ終わり、今度は細部のつくり込みがメインになる(レム睡眠が大半を占め、ノンレム睡眠の出番はほとんどなくなる)。 このように、睡眠は巧みな技を使って、記憶スペースの容量不足という問題を解決している。 ノンレム睡眠で情報を整理し、レム睡眠で情報を統合する 深い眠りのゆっくりした脳波が、短期の記憶が保管されている場所から新しい記憶の入った荷物を受け取り、長期の記憶を保管する場所に届けている。 覚醒時の脳波の役割が、外側の情報を受け取ることであるなら、ノンレム睡眠の脳波の役割は受け取った情報を吟味することだ。その吟味の過程で、情報を移動したり、記憶を整理したりしている。 夢をみているとき、身体はマヒ状態になる 夢を見る段階が始まる数秒前になると、身体は完全に麻痺した状態になりそれが睡眠の終わりまでずっと続く。 レム睡眠とノンレム睡眠、どちらが重要か? 進化の過程で最初に出現したのはノンレム睡眠。 徹夜明けの脳波、レム睡眠よりも、深いノンレム睡眠のほうをはるか求める。 回復のチャンスがどれだけあろうとも、脳は、一度の睡眠で失われた睡眠のすべてを取り戻そうとしないということだ。ノンレム睡眠とレム睡眠を個別に見て、トータルの睡眠時間を見ても同じ結果になる。 人間だけでなくすべての種族は、失われた睡眠を一度に取り戻すことはできない。 レム睡眠こそ最大のギフトだ レム睡眠の間に見る夢には、進化の面でもう1つ大きな貢献をしている。それは、創造性を育てることだ。ノンレム睡眠の役割は、新しい記憶を長期の保管庫に移動させることだった。しかし、それらの新しい記憶を取り出し、それまでの経験のカタログと衝突させるのはレム睡眠の役目だ。 レム睡眠の間に起こる記憶の衝突から、創造性の火花が生まれる。それまで関連のなかった情報の間に、新しいつながりがつくられるからだ。睡眠サイクルをくり返しながら、レム睡眠は脳内に広大な情報のネットワークをつくっていく。 また、レム睡眠は一歩引いて視野を広げ、答えのようなものを導き出すこともできる。つまり、バラバラの情報を個別に理解するだけでなく、情報全体が意味することも理解できるのだ。そして目を覚ますと、昨日までの難問の解決策が見つかり、革新的なアイデアが思いついたりするのである。 自閉症スペクトラムとレム睡眠 1990年代、生まれたばかりのラットの研究が始まった。彼らのレム睡眠を阻害したところ、神経の屋根、つまり脳の皮質がつくられなくなった。脳の建設工事そのものが完全に中断してしまったので。どんなに日がたっても、レム睡眠を奪われた脳波、もうそれ以上の発達を見せることがなかった。レム睡眠を復活させると、皮質の建設工事も再開された。しかし建設のペースが上がるわけではなく、脳が完全な発達を遂げることはなかった。生まれたばかりの時期に睡眠を奪われると、脳の発達の遅れは一生残るということだ。 なぜ睡眠で記憶力が高まるのか? 睡眠紡錘波の活動を観察しているときに、100ミリ秒から200ミリ秒ごとに一定の感覚で流れる電気の存在に気が付いた。 その電流は、新しい記憶を保管する海馬と、もっと大容量で、長期記憶を保存する部位は脳の皮質に存在する。海馬がUSBメモリーだとするなら、この部位はハードディスクのようなものだ。 その瞬間、私たちは、睡眠の世界で人知れず行われている電気の活動を目撃していた。新しく入ってきた情報を、一時的な小容量の保存庫(海馬)から、長期的な大容量の保存庫(皮質に)移動していた。 こうして睡眠中に海馬の中がきれいに掃除されるので、起きたときにまた新しい情報を取り入れることができるのだ。 徹夜は成績を下げる 徹夜グループは睡眠をとったグループに比べ、成績が40%悪かった。深いノンレム睡眠を奪われて浅い眠りになると、たとえ睡眠はとっても海馬の学習能力は低下する。 睡眠不足の脳は、新しい記憶を司るニューロンのつながりを形成することができなくなる。つまり、新しい記憶を脳にしっかり刻みつけることが、ほぼ不可能になるのだ。 24時間ずっと起きていたラットも、ほんの2時間か3時間の睡眠を奪ったラットも、ほんの2時間か3時間の睡眠を奪っただけのラットも、結果は同じだった。シナプスの中で記憶の土台になるプロテインを形成するのは、学習プロセスの中で記憶の土台になるプロテインを形成するのは、学習プロセスの中でもっとも基本的な作業だが、睡眠不足の脳はそれさえもできなくなってしまう。 この分野の最新の研究によると、睡眠不足はDNAにも影響を与える。 という。具体的には、海馬の脳細胞の中にある、学習に関連した遺伝子だ。つまり睡眠不足は、脳内にある記憶をつくる装置に、そこまで深いダメージを与えるということだ。この状態で何かを記憶するのは、波打ち際に砂のお城をつくることに似ている。結果は言わなくてもわかるだろう。 学習したその日に寝ないと記憶は脳に定着しない 睡眠による記憶の強化はまったく認められなかった。つまり、何かを新しく学習したその日の夜に眠らないと、記憶を刻みつけるチャンスを失ってしまう。その後でどんなにたくさん寝ても、最初の睡眠を取り戻すことはできない。 睡眠不足と肥満 睡眠が足りないと、満足感を知らせるホルモンであるレプチンの分泌が減り、食欲を刺激するグレリンの分泌が増える。これはまさに、ダブルパンチの精神攻撃だ。睡眠不足という1人の敵が、「満腹感をなくす」というパンチと、「空腹感を増やす」というパンチを同時に放ってくる。その結果、睡眠不足の人は、どんなに食べてきても満足できなくなってしまう。 夜は涼しく-理想的な寝室の温度は18.3度 眠りに入るには身体の中心の体温(中核温)が摂氏1度ほど下がる必要がある。そのため、暑すぎる部屋よりは、寒すぎる部屋のほうが寝付きがいい。寒すぎる部屋は少なくとも脳と身体の温度を下げて、眠るのに最適な状態にしてくれるからだ。 中核温が低下すると、脳の中央にある温度に敏感な細胞がその細胞がその変化を感知する。この細胞は視床下部の中にある。温度の細胞のすぐ隣にあるのが、脳内の24時間時計である視交叉上核だ。もちろん、それには理由がる。夜になり、中核温がある一定の温度より下がると、温度の細胞がすぐ隣にいる視交叉上核にメモを送る。そのメモと、あたりが暗くなってきたという情報を頼りに、視交叉上核はメラトニンの分泌を始める。 つまり、メラトニンの分泌を促す情報は、日が暮れて暗くなることだけではない。日が暮れて温度が下がることも、メラトニンの分泌には必要だ。 睡眠不足はなぜ損失を与えるのか 実験では、睡眠不足の被験者と、睡眠を十分にとっている被験者を集め、それぞれに自分のやりたいタスクを選んでもらった。タスクの内容は、単純作業(留守番電話を聞く)から頭を使う仕事(問題解決能力と創造性が必要とされる複雑なプロジェクトの遂行)までさまざまだ。そして、**いちばん簡単な仕事を選ぶのは、きまって睡眠不足の被験者だった。**彼らはつねに楽な道を選び、創造的な解決策をほとんど思いつかない。 興味深いことに、先ほど紹介した実験の参加者たちは、自分が寝不足の時は簡単な仕事を選んでいることも、仕事の効率が落ちていることも自覚していなかった。

February 19, 2022

Clean Code

意味のある名前 意図が明確な名前にする 意味のある対比を行う 発音可能な名前を使用する 検索可能な名前を用いる マジックナンバーは定数に メンタルマッピングを避ける 抽象レベルに適切な名前を選ぶ 広いスコープには長い名前を エンコーディングを避ける 名前で副作用を示すべき 関数 小さいこと! 1つのことを行う 内容をよく表す名前を使う 引数は少なく フラグ引数は使わず、メソッドを分割する 副作用をさける try/catchブロックの分離 DRY(Don’t Repeat Yourself) 死んだ関数は削除すべき コメント 「ダメなコードをコメントで取り繕ってはいけない。書き直すのだ」 コメントで、ダメなコードを取り繕うことはできない 自分自身をコードで説明する 意図の説明 結果に対する警告 書式化 縦方向の書式化 垂直概念分離性 垂直密度 垂直距離 水平分離性と密度 テスト 1つのテストに1つのアサート 1つのテストでは1つの概念を扱う カバレッジツールを使用する ささいなテストを省略しない 無視することを指定されたテストは、あいまいさへの問いかけである 境界条件テストには注意払う バグの周辺は徹底的にテストを 失敗パターンは何かを語る テストカバレッジパターンは何かを語る テストは高速に実行できるべき

February 17, 2022