Archive for the ‘本’ category

アジャイルレトロスペクティブズ 強いチームを育てる「ふりかえり」の手引き

9月 13th, 2009

アジャイルレトロスペクティブズ 強いチームを育てる「ふりかえり」の手引き (単行本)
4274066983

お盆休み前に読み終わってたんだけどブログを更新していなかったので。

「振り返り」時に使える技法を効果とともに紹介/解説してくれている。最初に効果的な振り返りの流れを定義した後、問題の抽出、解決のためのアイデア出し、チームとしての方針決定などで使える事例がたくさん載っています。自分たちでやり方を考えるのは大変だし、どういうときに効果があるのかもやってみないと分からないのが解説されているのはいいかも。

Pragmatic Programmer(達人プログラマー)シリーズの一冊だけど、プログラムの話はいっさい出てきません。業務全体に活用できる話かも。

クリーンコード一人読書(5) 第14章〜第17章

7月 3rd, 2009

今回がラスト

○第14章 継続的改良
コマンドライン引数を解析するArgsクラスを題材に著者がリファクタリングをしていく過程を追体験できる。
最初に最終結果が提示されたため、それがスタート地点かと思ってびっくりしたが実際は真逆だった。
最初に最終結果を見せなければもうちょっと追って見る気力が出てきたのに。

○第15章 JUnitフレームワーク
JUnitに対して著者がリファクタリングをしていく過程を追体験。
特記事項は無いので割愛

○第16章 SerialDateのリファクタリング
OSSのライブラリに対して著者がリファクタリングしていく過程を追体験。
特記事項は無いので割愛。

○第17章 においと経験則
筆者によるチェックポイントのまとめ、よくまとまっていて、レビュー時に使えそうなので全て写経!

  • 不適切な情報: 作者、更新日、更新履歴は不要
  • 退化コメントを削除:コメントは陳腐化するのでいらなくなったらこまめに削除
  • 冗長なコメント
  • 記述不足のコメント
  • コメントアウトされたコード:読みにくくなる以外の効果は無い
  • ビルドに複数のステップを要する:1操作でできるべき
  • テストに複数のステップを要する:1操作でできるべき
  • 多すぎる引数
  • 出力引数:オブジェクトの状態を積極的に変更する
  • フラグ引数:2つの関数に分けよう
  • 死んだ関数:呼ばれてない関数は削除する
  • 1 つのソースに複数言語を混ぜない:コメントにHTML形式のレイアウトを入れない とか
  • あって当然の振る舞いが実装されてない:大文字/小文字の区別とか
  • 境界値に対する不正確な振る舞い:きちんとテストすること
  • 安全軽視:コンパイラの警告はきちんと対処する
  • 重複:DRY! Once and only once
  • 抽象レベルが正しくないコード
  • 継承クラスに依存したクラス
  • 情報過多:メソッドは少ないほどいい、インスタンスは少ないほどいい
  • デッドコード:決して通ることが無いif文は無いか、カバレッジ計測ツールで確認
  • 垂直分離:変数宣言は使用場所の近くで
  • 不整合:規約の選択は慎重に、決めたらコロコロ変えない
  • 雑然:未使用変数、意味が無いコメント、呼ばれない関数は削除する
  • 人為的な結合:意図の無い結合は避ける
  • 機能の羨望:実装を他のクラスにさらすべきではない
  • セレクタ引数:小さな関数に分割しよう
  • 不明瞭な意図:計算過程を変数名で説明するとよい
  • 責務を持たせる場所の間違い:直感的にあるべき場所に置く
  • 不適切なstatic
  • 説明的変数を積極的に使う
  • 関数名は名は体を表すべき
  • アルゴリズムを理解する
  • 論理的な依存性を物理的なものとする
  • if/else, switchよりも多態を使う
  • 標準規約に従う
  • マジックナンバーを定数化する
  • 正確であること
  • 規約より構造
  • 条件をカプセル化する
  • 条件の否定形を避ける
  • 関数では1つのことに集中する
  • 隠れた時間軸上の依存関係を見えるようにする
  • いい加減にならないこと:矛盾が生じないように
  • 境界条件はカプセル化する
  • 関数は一つの抽象レベルを担うべき
  • 設定可能なデータは高い抽象レベルに置く
  • 推移的なナビゲーションを避ける
  • 記述的な名前を選ぶ
  • 抽象レベルに適切な名前を選ぶ
  • 可能な限り標準の用語を使用する
  • はっきりした名前
  • 広いスコープには長い名前を割り当てる
  • エンコーディングを避ける
  • 名前で副作用をあらわす
  • 不十分なテストを避ける
  • カバレッジツールを活用する
  • 些細なテストを省略しない
  • 境界条件をテストする
  • バグの周辺は徹底的にテストする
  • 失敗パターンの傾向に着目する
  • テストは高速に実行できるように

これで400ページ弱の本が読み終わったー!

Clean Code アジャイルソフトウェア達人の技 (大型本)
4048676881

クリーンコード一人読書(4) 第8章〜第13章

6月 28th, 2009

○第8章 境界
内部コードと外部コード(3rd party製のライブラリとか)をうまくつなぐ方法について。

直接使うのではなく、ラッパを一つかませると良い。使用者側は特定のニーズに特化したインターフェースを求めるが、ラッパがあれば万事解決。
外部コードをつなぐときには、テストコードを先に書くと振る舞いの勉強ができ、かつ次回以降のアップデートでテストケースができるためオススメ。こうしたテストには「学習テスト」という名前があるらしい。

よい設計は過大な投資ややり直しを求めること無しに変更への対処を可能とする。自分たちのコードの広範囲が3rd partyの実装詳細に関する知識を持たないようにする。

○第9章 単体テスト
テスト駆動開発(TDD: Test Driven Development)の3大原則

  1. 失敗する単体テストのコードを書く前に製品のコードを書いてはならない
  2. コンパイルが通り、適切に失敗する単体テストができるまでは次の単体テストを買いてはならない。
  3. 現在失敗している単体テストが通るまで、次の製品コードを書いてはならない。

テストコードと製品コードはほぼ同時に書く、テストコードの方が数秒先行するだけ。
きちんとやればテストコードの行数は製品コードの量に匹敵し、管理上の問題が必要になるぐらいのはず。
(同じぐらいの分量だと足りない気もするんだけど、適切な量はどれぐらいなんだろう・・・?)

テストも製品コードと同等の品質基準に従うべき。きちんとメンテナンスされ続ける必要がある。
テストがメンテナンスされてないと、新規コードを書く時間よりテストコードを書く時間の方がかかるようになってしまい、テストがされなくなってしまう。結果製品コードも腐ってしまう。

単体テストが以下の性質を実現する。

  • コードの柔軟性
  • 保守容易性
  • 再利用性

テストがあれば変更を恐れずできる。
テストに重要なのは何を置いても「読みやすさ」である。
製品コードほどの実行効率は必要ないことに気づく。読みやすさの工夫の余地が広がるはず。

きちんと整理された1つのテストは「構築ー操作ー検査」のパターンに合致するはず。
1つのテストでは1つの概念を扱う。
クリーンテストはF.I.R.S.T.の規則に従う

  • Fast: テストは高速に実行できる
  • Independent: テストは互いに関連しない。
  • Repeatable: 再現性がある。
  • Self-Validating: テストの結果は成功か失敗か明確に判断できる。
  • Timely: 必要なときにすぐ書ける。

○第10章 クラス
クラスは小さくなければならない。行数ではなく、1つのクラスが担う責務に着目して測るのが重要。
クラス名は責務を表した名前を付け、実装は単一責務の原則(SRP: Single Responsibility Principle)に従うようにする。
責務に着目するとクラスの分割がやりやすくなる。

クラス内のメソッドが操作する変数が多い方がクラスの「凝集性」が高い。
凝集性が高いとメソッド変数は互いに依存し合っていることになり、全体として1つのロジックをなすようになる。

○第11章 システム
システムレベルでもきれいな状態に保つことは大事。
依存性注入(Dependency Injection)を考慮したフレームワークを使うといいよ。

最初から正しいシステムというのは神話、適切に関心ごとを分離して保守していくことでアーキテクチャも改善していくことができる。

モジュール化と関心ごとの分離は管理と意思決定を延期することができ、一般的に後で決断をする方が最善の情報に裏付けられた決断を行うことができる。

○第12章 創発
単純な設計のための4つの規則

  • 全テストを実行する
  • 重複が無い
  • プログラマの意図が表現されてる
  • クラスとメソッドを最小化する

・全テストの実行
システムがテスト可能でなければ検証可能でない。
SRPに従ったクラスはテストも容易。
システムを完全にテストしようとすると依存性注入などのテクニックが自然と使われるようになり、より優れた設計を生み出してくれる。
コードを壊す恐れが減るため、リファクタリングも思い切ってできる。

・重複の排除
重複は余計な作業、余計な危険、不必要な複雑さを引き起こすため悪である。
大きな再利用を実現するため、小さな再利用を理解することが大事。

・表現に富む
書き手の意図が明快であるほど、別の人が理解しやすくなる。
書いた本人が書いた時点で理解できるのは当たり前、なぜなら解く対象の問題を深く理解しているから。
ソフトウェア開発の大半は保守なのでメンテナンスのしやすさの方が大事。

表現に富んだコードを書くには以下が重要

  • よい命名
  • 関数とクラスを小さく保つ
  • 標準の用語(デザインパターンとか)を使う
  • 単体テストで使用例を文書化する

・クラスとメソッドを最小限にする
規則の中でも最も優先順位が低い。最小限にするあまり実際的でないルールや実装を行ってはならない。

○第13章 同時並行性
きれいな同時並行プログラムを書くことは困難を極める。

  • 同時平行性は常にパフォーマンスが改善される訳ではない。待ち時間が大量にあって、複数処理で共有できる場合のみ。
  • 同時並行プログラムはシングルスレッド時とアルゴリズムも設計も違ってしかるべき。
  • 同時並行性の実現には余分なオーバーヘッド、複雑さを伴う。
  • 同時並行性のバグは再現性がない。

それでも同時並行性が必要なときは以下の点に留意する。

  • 単一責務の原則を守る。同時並行性に関するコードは他と分離する
  • データスコープを限定する。クリティカルセッションの数を抑える
  • 可能な場合はデータのコピーを利用する。
  • スレッドはできるだけ独立させる。

同時平行性の大抵の問題は以下のいずれかか、組み合わせで表現できる。

  1. プロデューサー/コンシューマー:キューを使ってジョブをやりとり
  2. リーダー/ライター:飢餓状態、古い情報の集積、スループットの低下など問題が多い
  3. 食事する哲学者の問題 – Wikipedia

問題を早期に発見して作り込まないようにする。

  • 怪しい問題があったらスレッドを疑う
  • 最初にスレッド化されないコードを完成させる
  • スレッド化されたコードの実行条件は変えられるようにする
  • プロセッサの数よりもスレッド数を多くしてテストする
  • 異なるプラットフォームでテストを実行する。

Clean Code アジャイルソフトウェア達人の技 (大型本)
4048676881

クリーンコード一人読書(3) 第5章〜第7章

6月 18th, 2009

例によって括弧書きはコメント

○第5章 書式化
チームで仕事をしているなら1つの書式ルールで合意をとり、すべてのメンバーはそれに従うべき。
(当たり前のことだけどできてないことが多いコードが多い。ルールを文書化しておくと規約に沿ってないコードを書いたときも指摘しやすい。静的解析ツールのルール定義をしておくのもありかなと思う。)

コードの書式化は宗教戦争の引き金ではなく、長期にわたって保守容易性と拡張性を提供してくれるもの。

大きなファイルよりも小さなファイルの方が理解しやすい、当たり前のこと。
ソースファイル中の記述は抽象レベルが高いものが上、実装詳細が下にあることが望ましい。新聞と同じ構造。

縦方向で書式化に関連するのは空行の入れ方。パッケージ宣言、インポート文、各関数など別の概念のものは空行を挟むと良い。
逆に一続きの処理の間に空行がはいると読みにくくなる。関連するコードは空行を挟まず、物理的に近い位置に記述できることが望ましい。
変数宣言は使用位置に近いところで、ループ変数はループの中で宣言する。

横方向の書式化はインデントや空白、1行の文字数がある。
文字数はモニタに入りきるぐらいで、120文字ぐらいがいいのではないか。
空白をうまく挟むことで処理を強調できる。代入の左右に置くと変数名が読みやすくなるし、計算式の途中に入れると演算子の優先順位が読みやすくなる。
タブを使った変数の位置合わせは意味が無い。位置あわせしないと読みづらいような宣言はそもそも何かおかしい(関数/クラスが大きすぎる とか)。

○第6章 オブジェクトとデータ構造
すべてのメンバにゲッタとセッタを用意するのはアホのすること、最悪。
目指すべきは「抽象インターフェースを公開することで、データの実装を知らせること無しに利用者に対してデータの本質を操作することを可能とする。」

データ/オブジェクトには非対称性があり、状況に応じて使い分けることが大事。

データ構造(structとか)を使用するコードは新たな関数を既存のデータ構造に影響を与えずに追加することが可能。オブジェクト指向の場合、既存の関数を帰ること無く新たなクラスを追加することが可能。

言い換えると

データ構造を使用するコードは、新たなデータ構造を追加する場合、既存関数全てに手を入れる必要がある。オブジェクト指向の場合、新たな関数を追加する場合、既存クラス全てに手を入れる必要がある(interfaceを使った場合ね)。

○第7章 エラー処理
エラー処理は重要だが、エラー処理のせいでロジックが不明瞭になっているとしたらそれは間違っている。

例外が使えるなら戻り値によるエラー情報でなく、例外を積極的に活用する。
3rd partyのライブラリなど多数の例外に対応する必要がある場合はラッパを作って、不要な例外処理をロジック側に書かなくてもよくする工夫も有効。

nullは返さない、nullを渡さない。
nullを返す実装を作ると呼び出し側でチェックが必要になり、記述が複雑になる。空のリストを返すとか工夫をすることで、nullを返すのと同じ効果を得ることが可能なはず。
nullを渡すコードを原則禁止にしてしまえば、nullが渡って来た場合、誤りであるとすぐに気づくことができる。

Clean Code アジャイルソフトウェア達人の技 (大型本)
4048676881

クリーンコード一人読書(2) 第2章〜第4章

6月 9th, 2009

少し間が空きましたが、3章進みました。
納得できるもの、感心できるものもあれば疑問に思うところもちらほら。

○第2章 意味のある名前
いい名前を付けるには時間がかかるが、より多くの時間をあとで節約できる。
以下の命題に答えられる名前を付ける。

  • なぜ存在するのか
  • 何をするのか
  • どう使用するのか

嘘の情報や、紛らわしい名前はさける。具体的には”意図した意味以外に使われる名前”は避ける。例えば配列名にAccountListと名付けるとList構造で実装されていると連想させてしまう。(よくこういう名前を付けてるけど混同したこと無いな・・・)

  • 意味が無い名前も避ける、例えば一般的すぎる”Info”や”Data”。
  • 発音できない名前は使わない。
  • 検索可能な名前を使う。
  • メンバ変数にプレフィックスは不要。
  • ハンガリアン記法もコンパイラの方が賢いので不要。
  • 解決する問題領域の用語を使う。用語集や語彙集があるといい。
  • 当たり前のことだけど変数名には”名詞”、関数名には”動詞”

(最近は長い名前の変数名も使うようになった気がする。省略形をうまく作ったつもりでも引き継げないことの方が多い。
システム全体で用語集/語彙集を作っておくというのはいいかも。作ったときはコード規約に入れておくといいのかな?)

○第3章 関数
関数の原則は”小さくある”こと。一つの関数では一つのことだけを行い、それ以外のことを行わないこと。この原則に従うとif/else文やwhile文のブロック行は1行になり、関数の中にはネストされた構造も登場しなくなる。
関数の実装から別の関数を抽出できるか調べることで、関数が一つのことに集中しているかどうかを調べることができる。

関数は抽象レベルが高いものを先に記述する。こうすることでコードを物語のように読むことができる。(1ファイル中の並びはアルファベット順でいいのかと思ってた。確かに抽象度順がいいかも。)

関数の引数は0が理想、3以上は避けるべき。オブジェクトの状態を変更するようにコードを書くことで、0引数の関数が実現できる。あわせて出力先を引数で受け取るのも避けるべき(C言語ではこれは無理だ・・・)

例外を多用する、戻り値でエラーコードを返さない。エラーコードを使うとすべてのファイルが特定のエラーコードが記述されたファイルを参照するようになり、そのファイルの修正がしにくくなる。
try〜catchでエラーを補足するのも1つの処理になるので、エラーを補足する関数も別途分ける。

  • 副作用をさける。
  • 処理を行う関数と、応答を返す関数は分ける。
  • 最初から完璧な関数が書ける訳は無い。

○第4章 コメント
「ダメなコードをコメントで取り繕っては行けない。書き直すのだ。」
適切なコメントのあり方は、コードでうまく表現することに失敗したとき、それを補うのに使うこと。

コメントの使用がダメな理由は古いコメントはメンテナンスされる保証が無いから。
コメントを書く労力はコメント無しでコードを明確化する努力に当てるべき。
不正確なコメントがあるぐらいなら無い方がマシ。書かずに済むコメントよりも良いものは無い。

必要なコメントもある

  • 著作権/著作者の表示
  • 意図の説明
  • 曖昧な引数・戻り値の明確化
  • 結果に対する警告(この処理はスレッドセーフじゃないとか)
  • TODOコメント

ダメなコメントの例

  • プログラマの独り言、コードの他の箇所も理解していないと意図が分からないようなもの
  • 冗長なコメント(以下はデフォルトコンストラクタ とか)、コードの処理以上に説明しているコメント
  • 変更記録 → ソースコード管理システムに任せましょう
  • 閉じ括弧コメント→括弧の対応が1画面内に収まるぐらいに整理する

Clean Code アジャイルソフトウェア達人の技 (大型本)
4048676881

クリーンコード一人読書(1) 前書き〜第1章

6月 4th, 2009

今週からクリーンコードを毎晩読んでいます。
コードをどう書くべきか、かなり泥臭いところを懇切丁寧に解決した本です。
まだ触りを読んだだけですが、良書の感じがします。

あまりネット上に言及している記事が無いので自分の勉強がてら勉強したことを書いていくことにします。続くと思います、多分。

○前書き
ソフトウェア開発では小さなことこそが重要。
建築家はきちんと閉まらないドア、曲がった床のタイル、汚れた机をよしとするか?
「神は細部に宿る」

5S原則はソフトウェア開発にも当てはまる。

  • 整理:どこに何があるかを把握する。名前付けはきちんとできているか。
  • 整頓:コードは読む人が”ここにあるだろう”と推測した場所にあるべき
  • 清掃:コードをコメントアウトで汚してないか
  • 清潔:コーディングスタイル、仕事の進め方
  • しつけ:変革を厭わない姿勢を持っているか

設計に終わりは無い。常に元あった状態よりも良くしてチェックインすること。
ソフトウェア開発における改善(リファクタリング)はコストではなく、価値につながる。

○序論
職人技の習得は

  • 職人に必要な知識を得る(原則、パターン、経験則)
  • 知識を咀嚼して自分のものとする

からなる。
クリーンコードを書くには努力が必要。経験則とコードを洗練してく過程で行った判断が何よりも重要。

○第1章 クリーンコード
要件を詳細に定義し、機械に実行可能なものとするのがプログラミングであり、コードである。
よく定義された要件はコードと同じ、常にコードは必要である。

粗悪なコードはコードを追加/修正するのに必要なコストが結局高くつき開発スピードが遅くなって管理できなくなってしまう(ウェーディング(wading)と言うらしい)
プログラマはコードのプロなので、混乱のリスクを理解できない管理者に屈服してはならない。

きれいなコードを「読める」のと「書ける」のには大きな差がある、センスが重要。クリーンコードの定義は人により異なるが、以下の要件を満たすものが挙げられることが多い。

  • エレガントであること
  • 明快な抽象化、まっすぐな境界線
  • 原作者以外でも読め、拡張ができる
  • 誰かが気配りを持って書いたコード
  • テストがあり、重複が無く、システムの知識が表現されている

クリーンコードにも流派があって当然で、この本で紹介しているのは流派の1つに過ぎないことを頭に留めておくことは大事。

Clean Code アジャイルソフトウェア達人の技
Robert C. Martin
アスキー・メディアワークス
売り上げランキング: 5682

家電名機カタログ—古今東西の傑作家電を完全網羅

5月 10th, 2009

家電名機カタログ—古今東西の傑作家電を完全網羅 (100%ムックシリーズ) (大型本)
4883809390

家電批評のムック本を本屋で見かけて衝動買いしてきました。ずば抜けた歴史に残る家電 ”神機” を扱っています。以前の雑誌記事をつなぎ合わせた感じも否めませんが、まとまっていて保存するにはこっちの方が便利かもしれません。

新人教育に渡した本 & 渡したい本

4月 19th, 2009

はてなブックマークのホットエントリにあった エンジニアがタイトル買い、著者買いすべき本 – {Fight the Future => じゅくのblog}を見て、去年新人教育用に何冊かリストアップして渡したことを思い出しました。実際に読んでくれて役立ったか分からないけど、挙っていた本だとリファクタリング—プログラムの体質改善テクニック (Object Technology Series) (単行本)Joel on Software (単行本)アジャイルプラクティス 達人プログラマに学ぶ現場開発者の習慣 (単行本(ソフトカバー))がありました。元ネタに挙っていた本は個人的にもお勧めなものばかりです。

他にも数冊渡したはずで、全部は思い出せないのですが思い出せる限りでオススメの本をあげておきます。

C言語ポインタ完全制覇 (標準プログラマーズライブラリ) (単行本)
4774111422
↑多分渡して一番役立った本です。研修でポインタを教わってもどう使っていいのか分からないのが新人の常なので適切な問題(ポインタに絡む実装や修正の依頼)とセットで渡してあげると効果が倍増するはずです。

定本 Cプログラマのためのアルゴリズムとデータ構造 (SOFTBANK BOOKS) (単行本)
4797304952
↑またはプログラミングの宝箱 アルゴリズムとデータ構造 (C magazine) (単行本)でもいいかも。
下手な研修だと木構造とか文字列検索とか教わってこないので素養としてこれぐらいは読んでおいて欲しいかも。

ライト、ついてますか—問題発見の人間学 (単行本)
4320023684
↑実際には渡せなかったけど、あるならこれも渡したかった。
元ネタにはワインバーグの本は無かったけど、著者買いしてもはずれが少ない人だと思います。

我らクレイジー☆エンジニア主義 (講談社BIZ) (単行本)
4062820366
↑最後は趣味、仕事に望む気持ちの持ちようとして希望に燃える新人にはいい刺激になるかも。

他にもいい本はいっぱい触れてきた気がするんですが、いざまとめるとなるとなかなか出てきませんね。

Ship It! ソフトウェアプロジェクト 成功のための達人式ガイドブック

3月 22nd, 2009
Ship It! ソフトウェアプロジェクト 成功のための達人式ガイドブック
Jared Richardson William Gwaltney Jr. でびあんぐる
オーム社
売り上げランキング: 52053
おすすめ度の平均: 3.5

3 実践的です。実用で鍛えられただけあります。
4 行動を起こすための実用書

1月の下旬から2月に読んだ本なんですが、感想を書き忘れていました。

達人プログラマシリーズの1冊ですが、前に読んだ”アジャイルプラクティス”の方が個人的にはお気に入りです。自分にとって既知の内容が多かったからかもしれません。

次は”Manage It!”か”Release It!”を読みたいと思っています。

Where is the green sheep?

3月 22nd, 2009
Where Is the Green Sheep (Horn Book Fanfare List (Awards))
Mem Fox
Harcourt Childrens Books (J)
売り上げランキング: 150683
おすすめ度の平均: 4.0

4 Here is the XXX sheep.が25回。

会社でお世話になっているオーストラリアの研究所の方から出産祝いに貰った絵本です。
平易な英語で、いろいろな羊の絵が書いてあります。
うちの娘は色使いがきれいな”bath sheep(お風呂に入っている羊)”が好きみたいです。

オーストラリアでは有名な絵本らしいのですが、こういうプレゼントはうれしいですね。

Pages: Prev 1 2 3 4 5 6 7 8 9 10 ...18 19 20 Next