12/31/2016

プログラミングをマスターすること

エクストリームプログラミングの提唱者であるケント・ベックのエッセイ(6月7日に書かれたもの)。

何年も達人(master)プログラマーを見てきて、私は彼らの仕事の流れに特定の共通するパターンに気付きました。コーチングスキルを持ったジャーニーマン・プログラマーからはそれらのパターンが無いことに気付きました。パターンを取り入れることでどのような違いが生まれるのかを知りました。

印象的なプログラマは地球上で尊い3e9秒(95年)を最大限活用する方法を知っています。

そのテーマはあなたの脳を見積もることです。ジャーニーマンは一度に多くの問題を解決することで、より大きな問題を解決する方法を身に付けます。達人は一度に数個の問題を解決することで、それよりも大きな問題を解決する方法を身に付けます。知恵の一部は細分化されているので、個別の解決策を統合することで、それらを単に同時に解決するだけでなく、より小さい問題になります。

時間(Time)

  • スライスする(Slicing)。大きなプロジェクトを理解し、薄いスライスに切り取り、コンテキストに適合するようスライスを並べ替えます。私はプロジェクトを細かくスライスし、異なるニーズを満たす新しい並び替えをいつでも見つけることができます。

  • 一度に一つのこと(One thing at a time)。オーバーヘッドを減らそうとフィードバックサイクル数を減らすことに重視しています。これは想定したコストが回避したサイクルオーバーヘッドよりも大きいデバッグ困難な状況につながります。

  • まず動かし、適正な状態にし、速くする(Make it run, make it right, make it fast)。(一度に一つのこと、スライスする、そして簡単な変更の例)

  • 簡単な変更(Easy changes)。難しい変更に直面した時、まず簡単にしてみて(警告、これは難しいかもしれない)、そして簡単な変更を行います。(例、スライスする、一度に一つのこと、集中、分離)。スライスすることの例。

  • 集中(Concentration)。複数の要素を変更する必要がある場合、まず変更が一つの要素にしか起こらないようコードを並び替えます。

  • 隔離(Isolation)。要素の一部しか変更しない場合は、サブ要素全体を変更するようその部分を抽出します。

  • ベースライン測定(Baseline Measurement)。現在の状態を測定することによってプロジェクトを開始して下さい。これは、我々のエンジニアリング本能に反して、物事の修正を始めることになりますが、ベースラインを測定すれば、物事を修正しているかどうかが実際に分かります。

学習(Learning)

  • 決定する(Call your shot)。コードを実行する前に、何が起こるかを正確にはっきりと予測して下さい。

  • 具体的な仮説(Concrete hypotheses)。プログラムが正しく動作しない時、変更する前にあなたが間違っていると考えていることを正確にまとめて下さい。複数の仮説がある場合、鑑別診断(differential diagnosis)を行なって下さい。

  • 無関係な詳細を削除する(Remove extraneous detail)。バグを報告する時、最短の再現手順を見つけて下さい。バグを隔離する時、最短のテストケースを見つけて下さい。新しいAPIを使う時、最も基本的な例から初めて下さい。間違っている時は、「全てのことが重要にはできない (All that stuff can’t possibly matter)」が重要な前提となります。

    • 例: モバイルでバグがあったら、curlで再現して下さい

  • 複数のスケール(Multiple scales)。スケール間を自由に移動して下さい。これはテストの問題では無く、設計の問題かも知れません。技術的な問題ではなく、人間の問題かも知れません[不正行為、これは常に真実です]。

論理を超える(Transcend Logic)

  • シンメトリ(Symmetry)。ほとんど同じ物は、等しい部分とはっきり異なる部分に分けることができます。

  • 美意識(Aesthetics)。美しさは登るための強い勾配です。それは無視するための自由の勾配でもあります(例: 機能の集まりを一つの巨大な混乱(mess)に埋め込む)。

  • リズム(Rhythm)。適切な時期まで待ってエネルギーを温存し、混乱を避けて下さい。行動する時が来たら、勢いよく行動して下さい。

  • トレードオフ(Tradeoffs)。全ての決定はトレードオフの対象になります。今日選択する答えを知ること(あるいは昨日選択した回答)よりも何が決定に依存するのかを知ることがより重要です。

リスク(Risk)

  • 楽しいリスト(Fun list)。ほとんど無関係な(tangential)アイデアが生まれた時、それを書き留めて、すぐに仕事に戻って下さい。停止場所に達したら、このリストを再検討して下さい。

  • アイデアを養う(Feed Ideas)。アイデアは驚いた小さな小鳥のようなものです。あなたが怖がらせてしまったら、周りに来るのをやめてしまうでしょう。アイデアがある時は、少しづつ育てて下さい。自尊心の欠如からではなくデータから、できるだけ速やかに取り消して下さい。

  • 80/15/5。低リスクで妥当な報酬のある仕事に80%の時間を費やして下さい。高リスク/高報酬の仕事に関しては15%の時間を費やして下さい。報酬に関わらず、あなたを喜ばせるものには5%の時間を費やして下さい。次の世代にあなたの80%の仕事を教えて下さい。誰かが引き継ぐ準備が整うまで、15%の成果の一つが(あるいはそれほど多くはありませんが、5%の成果の一つ)報酬となり、新しい80%になるでしょう。その繰り返しです。

結び(Conclusion)

大まか流れは、時間を管理し、脳全体を使って注意深くリスクを負うことを学習し、素早くアイデアを優先付けをすることによって、リスクを軽減することにあるようだ。

Hacker News