Showing 84 Result(s)

レガシーコードからの脱却 まとめ – 9.8.2

9.8.2 保守しやすいコードを書く7つの戦略 内容 コードの共同所有を取り入れるコードの共同所有とは誰でもどのコードでも変更してよいことを意味する。チーム全員が同じコーディング規約を持つことで、誰が書いてもスタイルは保たれ扱いやすくなる。同じドメインモデル、開発プラクティス、用語を揃えることで更に良くなる。 リファクタリングを熱心に行うすでに動いているものであっても、状況に応じてリファクタリングはしていくと良い。リファクタリングは保守性につながる。 常時ペアで進めるペアプログラミングは知識共有の一番はやい方法。設計、開発、リファクタリング、デバッグ、テストでは常時ペアを組み、共有された知識で、コードの一貫性を保つ。 頻繁にコードレビューするペアを組んでいたとしても、ペアを組んでいない人がコードを見てフィードバックする機会になる。 ほかの開発者のやり方を学ぶ自分の外側にある知識を学びつつ自分も成長させる。 ソフトウェア開発を学ぶプロの専門家は継続的な学習が必要。ソフトウェア開発者もしかり。 コードを読み書きして、コーディングの練習をする作家スティーブン・キングは「作家になるために必ずしなければならないことが2つある。たくさん読み、たくさん書くことだ」と言った。ソフトウェア開発者も同じで、たくさん読み、たくさん書くこと。 学び 保守性を高める戦略 学びを活かすアイディア・行動 ペアプロ、コーディング規約作り

レガシーコードからの脱却 まとめ – 9.8 – 9.8.1

9.8 実践しよう 9.8.1 コード品質を上げる7つの戦略 内容 品質の定義を明確にする高品質のコードを作るには、高品質のコードとは何かを明確に定義しなければならない。高品質なコードとは少なくとも、理解しやすく拡張が簡単でなければならない。 品質のためのプラクティスを共有するたとえば、機能開発を重要視することで、それぞれのメソッドの凝集性を高くするなど。 完璧主義を手放す完璧なものは作れない。完璧でなくても明確な受け入れ基準を持てば、それを叶えるための最善は尽くせる。 トレードオフを理解する状況に応じたトレードオフを理解することで、完璧でなくてもニーズに応えられるかどうかを判断することができる。 「やり方」を隠す読み手は、どうやって実装されているかを気にすることなく欲しい物がなんなのかがわかるようになる。 良い名前をつけるソフトウェア自身が一番のドキュメントであることを理解し、それが何なのか、何をしてくれるものかをわかる名前をつける。略称を使う必要はなく、長さを気にする必要もない。説明的、肯定的、能動的、呼び出し側がどのように変化するのかが分かる名前をつける。 コードをテスト可能に保つ観測可能なコードとコード品質は相関関係がある。テスト可能なようにコードを書こう。 学び 品質を高める戦略。 学びを活かすアイディア・行動 今の所特になし

レガシーコードからの脱却 まとめ – 9.6

9.6 コード品質が私たちを導いてくれる 9.7 明日のベロシティのために今日品質を上げる 内容 「CLEAN」コードはテストのしやすさで測ることができる。 凝集性に問題がある場合、あるクラスのテストをたくさん書くことになる。 疎結合に問題がある場合、関係ない依存関係がたくさんあることになる。 カプセル化に問題がある場合、テストが実装に依存していることになる。 断定性に問題がある場合、テスト結果がテストオブジェクト以外から得られることになる。 冗長性に問題がある場合、あちこちで同じテストを書くことになる。 また、これらの品質は1つを上げるとその他の品質も上がっていく。 ケント・ベックは著書「テスト駆動開発」でコードの重複(冗長性)にだけ気をつければ、全体の品質は上がるとしているし、著者も凝集性にフォーカスするのを好んでいる。 これらはテストで測れるわけだから、テストを書いて進めるテストファースト開発をすることがおすすめ。 学び CLEANコードかどうかはテストでわかる。 フォーカスする品質は1つか2つでも効果がある。 学びを活かすアイディア・行動 今のところ特になし

レガシーコードからの脱却 まとめ – 9.4 – 9.5

9.4 高品質なコードは断定的である 内容 自分自身のことは自分自身で管理する。これをしないと凝集性が薄くなり、依存し合うコードが生まれやすい。そうなると複雑性が増し、保守しづらくなり、壊れやすくなる。 9.5 高品質なコードは冗長でない 内容 同じことを繰り返さない。保守の難易度が上がるから。 ただし、ミッションクリティカル(人命に関わるような)な場合で、その方が安全と判断するような、「意図的な重複」は良い。 良くないのは「意図しない重複」。 学び 「断定的」に関して、まだ理解が薄いので学習が必要 学びを活かすアイディア・行動 今の所特になし

レガシーコードからの脱却 まとめ – 9.3

9.3 高品質なコードはカプセル化されている 内容 カプセル化とはインターフェース(やりたいこと)と実装(どうやるか)を切り離すこと。 開発者はアウトサイドインとインサイドアウトの方法でカプセル化をする。これらの呼び名は著者がそう呼んでいるもので、 アウトサイドインプログラミングドメインを全体的に捉え、ユーザーのニーズとなる体験をベースに設計していく方法。 インサイドアウトプログラミング問題を小さく分解し、それらを組み合わせて1つのソリューションを作る方法。 開発者はこの両方の観点を持って開発に臨むべきだが、先に必要なのはアウトサイドインの方。インサイドアウトから始めると、全体を俯瞰せずに実装を進めることができるため、ドメインを全体視した場合の持つべきふるまいや役割と乖離する可能性があり、そういったモジュールは結果的に壊れやすいため。だからユーザーの体験に基づいて設計し、その実現方法はインサイドアウトの観点で進めるとよい。 基本的に、モジュールを使う側の視点で設計されたインターフェースはpublicで、それ以外はprivate、必要に応じて protected 、package というようなアクセスレベルで調整すると良い。 学び カプセル化の仕方はいろいろあるが、まずユーザーに届ける体験をベースに考えて、ユーザーが何をしたいのか、何を得たいのかをインターフェースにすし、具体的な実装は別で隠すという方法を基本的な考えに持つと良い。 学びを活かすアイディア・行動 今の所特になし

レガシーコードからの脱却 まとめ – 9.2

9.2 高品質なコードは疎結合である 内容 疎結合とは、部品と部品の結合部につなぎ目を入れて、お互いが直接干渉しない状態のこと。その逆は密結合。 これによってそれぞれを変更したときにお互いが影響しないため変更しやすくなる。テストするときはモックを使ってテストができる。JavaやC#ではインターフェースを使って実現できる。 ただし、なんでもかんでも疎結合にすればよいというわけではない。例えば、GUIに終了ボタンとボタン押下時の終了アクションがあり、要件的にその2つは必ずセットになっていないとおかしい場合、必ずしも疎結合でなければならないとは思えない。 つまり、疎結合であってほしいところと疎結合で、密結合であってほしいところは密結合であってほしい。 これを「意図による結合と不慮の結合」という言い方を著者はしている。疎結合が良くて密結合が悪いのではなく、それぞれあるべき結合度をコントロールできているかが重要。 特に、多くのことを行うAPIが不慮の結合になってしまうケースが見受けられる。こういう場合は内部で複数のAPIを呼び出すように実装することで、複雑性をそれぞれのAPIに任せることができ、結果的に疎結合にもなり凝集性も高くなる。また、性能や別の制約によってコード品質を下げてしまう場合があまりにも多いが、これは本当にしょうがない場合だけにするべき。 学び 結合度と凝集性は少し似ている。 学びを活かすアイディア・行動 GUIとプレゼンテーションロジックの結合度を考える

レガシーコードからの脱却 まとめ – 9 – 9.1

9 プラクティス5 「CLEAN」なコードを作る 9.1 高品質なコードは凝集性が高い 内容 良いソフトウェアの土台となる5つのコード品質を表す「CLEAN」を紹介。 Cohesive (凝集性) Loosely Coupled (疎結合) Encapsulated (カプセル化) Assertive (断定的) Non redundant (非冗長) Cohesive (凝集性) 高品質なコードは何よりもまず凝集性が高い。凝集性とは部品がどれだけ1つのことだけを扱うようにできているか。SOLID原則の「単一責務の原則」がどれだけ適用されているかということでもある。 凝集性を高くするための方法としてオブジェクト指向が用いられ、基本的な部品の単位をクラス(概念)となる。 ソフトウェアのコードは結局のところ言語的活動であるため、これらの部品が「何」を扱い「どんなふるまい」があるかを表すネーミングは非常に重要。表していることが明確でないと意味不明で読めないから。 「人」のように「会話」や「食べる」「歩行」「手がある」などさまざまなふるまいや性質を持っている複雑なものは、それぞれの要素を分解しそれぞれが凝集性が高い小さな部品とする。それらの部品を持つように構成させる。 また、オブジェクト指向言語のトレースの仕方の話になるが、構造化プログラミングのようにコードを上から下に読むだけでは読むことができない。オブジェクト指向のオブジェクトはhas-a関係、親子関係が階層になっており、純粋に処理を順番に読もうとすると、親クラスと子クラスをいったり来たりして読みづらい。基本的な読み方のスタンスとしては、その階層だけで処理を読み、具体的に知りたい場合は必要に応じて子クラスの詳細を読むようにする。そうすることで、文脈のレベルが保たれ、読みやすくなる。 学び 特になし 学びを活かすアイディア・行動 今の所特になし

レガシーコードからの脱却 まとめ – 8.7 – 8.9 – 8.10.2

8.7 コードレビューとレトロスペクティブのスケジュールを立てる 8.8 学習を増やし、知識を広げる 8.9 常にメンター、メンティーであれ 8.10.2 レトロスペクティブの7つの戦略 内容 ペアプロの本質の1つはリアルタイムなコードレビューが含まれているということ。しかし、チーム全体に共有する時間を持つと、尚良い。 また、ペアプロで上手くいったことや上手くいかなかったことの共有としてレトロスペクティブを行い、チームで共有することも良い。 今は、個がスペシャリストになればそれで良いという時代ではない。横断的に情報を展開し、さまざまなことができるチームになることに価値が置かれている。外部の人とも積極的に混ざり合い(機密情報はもちろん伏せる必要があるが)、楽しく知識を増やそう。 ときには孤立するかもしれない。しかし、目的にフォーカスする姿勢、教えることは教わることがという謙虚な姿勢と、新しいことを受け入れる勇気を持ち、協働して作る世界に入ることは自分にとって多くのメリットがあるはずだ。 レトロスペクティブの7つの戦略 小さな改善を探す組織(人)は変化を嫌う。特に、同時に多数な変化があることを嫌う。小さな改善を積み重ね、徐々に改善する。 プロセスを責めよ。人を責めるな誰かが原因で問題が発生した場合でも、その人の問題にフォーカスするのではなく、その人がそうなってしまった開発プロセス全体をフォーカスする。 なぜなぜ5回をやってみる問題がなぜ起こったかを自分たち自身で問う。4回目あたりから想像もしなかった真因が見える。 根本原因に取り組むそのまんま 全員の意見を聴く問題に対して全員の目線が揃っているかは重要。出揃っていない場合、偏った解決策になる可能性がある。 人に権限を改善行動に取り組む際には、必要なものを与える。特に、権限と責任を与え、勇気を持って取り組ませる。 進捗を測る改善は明確なゴール、指標で計測できる状態にすることで効果が図りやすく、さらなる改善につながる。 学び 学びを共有することにさらなる学びがある 学びを活かすアイディア・行動 まずペアプロの実践

レガシーコードからの脱却 まとめ – 8.5 – 8.6

8.5 スパイク、スウォーム、モブ 8.5.1 スパイク 8.5.2 スウォーム 8.5.3 モブ 8.6 タイムボックスの中で未知を研究する 内容 ペアプロ、バディプロの他に有効なプラクティスを紹介。 スパイク未知の課題解決のために1つのタスクに複数の開発者が取り組む。使う時間は限定し、課題が解決すればその会は解散する。 スウォーミングチーム全体(または複数のメンバー)で課題解決に取り組む。 モブ単一のストーリーを複数の開発者で進める。ペアプロの複数人版で、キーボードを打つのは常に1人、周りはディスカッションしながら指示をする。物によっては非常に有効。 また、これらの方法は、ソフトウェア開発だけでなく、通常の科学の研究者でも使えるプラクティスだということがわかった。そもそも未知なものを解決することに有効な手段ということだ。 学び 未知の問題は複数人で協力することで効果的なことが多い。 スパイクなんかは実際やってるね。 学びを活かすアイディア・行動 まずはペアプロをして徐々に取り入れていきたい。

レガシーコードからの脱却 まとめ – 8.3 – 8.4 – 8.10.1

8.3 ペアプログラミング 8.3.1 ペアプログラミングのメリット 8.3.2 どうやってペアを組むか 8.3.3 誰とペアを組むか 8.4 バディプログラミング 8.10.1 ペアプログラミングの7つの戦略 内容 ペアプログラミングへの誤解 まず、ペアプログラミングは非常にネガティブなイメージが、開発者でもマネージャーでも先行している。しかし、それはただ単にやり方が間違っているため。 うまくやれば、1人でやるより、はるかに早く、高品質に高いレベルでタスクを完了することができる。 ペアプログラミングのメリット メンバー間の高速な知識の共有。メンバー全員がある程度コードに親しんでいる状態は、ボトルネックになりにくいためチームにとっとかなり価値が高い。 ネーミングに有効。プログラミングでは至るところでネーミングするが、名が体をなしているネーミングが超重要で、しかも他の人とも共通で読めるものでなければならない。 コーディング標準がいらなくなる。コードに一貫性が生まれ、コード自体が標準化され、コーディング標準がいらなくなる。「コードはこうあるべき」というものを定義せずとも、チーム内で運用しやすいものが生まれやすい。 新規参画メンバーの成長にも良い。経験者メンバーと1〜2週間ペアプロ(最初のうちはシャドーイング)することで、新規参画メンバーのスピードがつく。 1人でやるよりも見られている緊張感のために変なコードを書かなくなるし、お互いが監視することでしっかりとした一日を過ごす。 割り込み作業がほぼなくなる。2人で作業しているところに割って入りづらくなるため。 時間の観点でも、生産性が半分になるわけではない。約15%増えるとされているが、高品質なコードとチーム全体がが総合的な運用コストをカバーする。 ペアプログラミングの注意点 ナビゲーター(指示する側)とドライバー(タイプする側)で分かれるが、両者の合意のもと進むことができるということをお互いが意識して、お互いが積極的に「そうやったのはなんで?こうやらないのはなぜ?」というような質問をして、それに対してしっかりと回答して、回答に対して耳を傾ける必要がある。 お互いが正直に意見を言えることが重要。 良いものは積極的に褒める。 休憩も両者のタイミングで取る。 片方が退屈しているようであれば、退屈している方は機能していないため、役割を交代してみたりする。 おすすめの方法は、テストファースト開発で、片方がテストを書き、片方がテストを通すコードを書きCleanにする。 役割の交換のタイミングは遅くて30分。忘れそうならタイマーを使うと良い。 ペアリングの方法 ペアプログラミングが本質的に期待するところとして「それぞれ違ったものが合わさり、新しいものが生まれる」「お互いに無いところを補いあう」というような考え方がある。同じような人とペアをしても学びは少ない。その考えに乗っ取り、 性格が違う人同士(強い性格、社交的な性格の人と、内向的な静かな人など)をペアにする。 経験の豊富な人と浅い人をペアにする。教える側と教わる側という関係になることが多いが、結果的に教える側は教えながら自分も多くを学ぶことになる。 ランダムにペアする。知らなかった自分の一面が引き出され、新たな可能性が広がる。すべてのパターンでペアリングしてみよう。 その他の有効な手法 自分の考えは他人の手でコンピュータに伝えなければならないという原則に則る。これによって当人たちの頭の中の問題解決空間が共有され始め、ペアフロー状態という桁違いに生産性の高い状態に入れる。 バディプログラミング ペアリングが苦手なチームや、1人で作業したほうが効率が良いタスクの場合に有効な方法。1日の最後に、やったことのレビューをお互いで行い、質問、回答、議論を行う。ペアプロよりもエクストリームではないが、ペアプロの導入としては取り入れやすい。 進捗を追跡する ペアリングが上手くいき始めたら、その効果、生産性を計測し、マネージャーに提示することで、さらにペアリングの運用が確固たるものになる。 学び ペアプロを新人の教育の場合のみに使われることを見てきたが、ペアプロの目的はチーム全体のフロー効率を上げるためにあり、知識の共有はその1つの効果でしかない。その認識をまず持つことが重要。 ユダヤ学習方式でもペアで教え合うこと・議論しあうことをしているが、この人に教えるという行為は記憶の定着率が一番高い。(読書、プレゼン、体験、人に教える、の中で)ペアプログラミングにはそのエッセンスが入っている。 ペアプログラミングをトレーニングしたくなった。 学びを活かすアイディア・行動 現場でペアプロの実践、バディプログラミングの実践。特にバディはやりやすい。