Posts Tagged ‘プログラミング’

Subversion, Git, Redmine, Hudson – 今考えている連携

2月 21st, 2010


これからが本番、検索エンジンから来た方は先にSubversion, Git, Redmine, Hudson – 現状の連携 » tune webを読むことをおすすめします。上記が週末考えていた「こういう連携なら今の問題点を解消できるかな」と思えるフローです。「こうしたほうがいいよ」とかコメントありましたらお待ちしています。

1番のポイントはバージョン管理システムとしてGitを中心に据えました。社内はSubversionで統一するという規則があるので残すとして、開発チーム内ではgit svnを使ってGit化し、Subversionを直接触らないようにします。協力会社はSubversion縛りが無いのでGitで統一してもらいます。これまでは差分ファイルを送り合っていましたが、Gitを使えばパッチをうまく作り、修正単位でパッチファイルをやり取りすることが出来るでしょう。これまでは複数の修正がまとめて送られてきてましたが、パッチ単位ならレビューもやりやすく、「こうした方がいい」とか「こうして欲しい」というやりとりもやりやすくなります。

リポジトリがプロジェクト専用になるので、フックスクリプトも仕掛けやすくなります。現状は「空メッセージのコミットは禁止」程度の緩めのものですが、コミットメッセージに Issue ID を含むことを強制させる Git のフックスクリプトを書きました|SNS構築の手嶋屋を参考にすればRedmineのチケットが無いコミットは禁止できます。これで闇コミットがなくなるはず。

さらにGitを使えば「歴史を書き換えて」テストが通らないコミットをなかった事にも出来るはずです。コミット前にテストをする機能がTeamCityにはありますが、Hudsonにはありません。[#HUDSON-1682] Pre-tested commit feature – Hudson JIRAとして要望が挙げられていますが実現はまだ先になるでしょう。HudsonのGit Pluginのページにpushされた変更をテストして、成功したらmaster/stableにマージする設定手順がありましたが、リリースブランチを持ったときにも同じように出来るかは不明です。

というのをtwitterにつぶやいていたところ、@bleisさんと@masanobuimaiさんから情報をもらえました。Gitのフックスクリプトですが

  1. pre-receiveでpush前の状態をタグ付けする設定を追加
  2. post-receiveでHudsonの複数ジョブをキックして起動。
    1. テスト結果を取得して全て成功したらタグを消してgit svn dcommitを実行
    2. 1つでも失敗していたらpre-receiveでタグ付けしたバージョンに戻してpushをなかった事にする。

とすることでいけそうです。Hudsonのジョブ実行結果を知る方法は複数あると@masanobuimaiさんに教えてもらったのがPlugins – hudson – Hudson Wikiのページです。プラグイン無しでもリモートAPIを使っても出来るのかもしれません。
自前でフックスクリプトを用意する必要がありますが、出来ないことはなさそうです。
post-receiveでのテストに多少の時間がかかることを踏まえ、Redmineで参照するリポジトリはGitではなくSubversionにするのが良さそうです。

あとはRedmineのメール経由のチケット登録機能を有効にして、HudsonのナイトリーテストでこけたらカスタマイズしたメールをRedmine指定のアドレスに送ればOKですね。上の絵には「静的解析とメトリクス集計」が入ってますが、これは内製ツールです。リポジトリを集中管理してもらえるとこういうこともやってもらいやすくなりますね。

上記構成に3月中に取り組む予定です。うまく行くといいんだけど。

Subversion, Git, Redmine, Hudson – 現状の連携

2月 21st, 2010


会社の仕事を「Gitを中心に据えた開発ワークフロー」に変えたいなとこの週末ぼんやりと考えていたんですが、現状を整理して残しておくのも、あとで振り返った時も参考になるかもしれないと思って残しておきます。

開発しているものは画像処理ライブラリで、言語はC言語。プラットフォームはWindowsとLinux両方に対応していて、32bitと64bitどちらでも動くようにしたいのが前提。ほとんどのソースは共用出来るようにしています。開発者はWindowsを使ってVisualStudioで開発し、自動テストやリリース時はLinuxでMakefileを使ってビルドします。

バージョン管理は課で管理しているSubversionを使い、他のプロジェクトともリポジトリを共用しています。他に使っているツールはテスト自動化にHudsonとタスク管理と障害管理でRedmineがあります。Hudsonは2種類のテストを管理していて、コミットの度に動くビルドのテストとCUnitを使った単体テストと、毎晩複数枚の画像入力を処理するストレステストの実行を制御しています。Redmineはチケット駆動開発(TiDD)を意識し、コミットはチケットに関連付けるようにしています。あとは開発者の1人(自分です)がgit svnを使ってローカル開発をgitにしているぐらいです。

開発メンバは社内に2人、あとは社外の協力会社に手伝ってもらっています。両者の間にはネットワーク的に「超えられない壁」があり、リポジトリを参照させることができません。ということで双方でSubversionリポジトリを持ち、同期は定期的(1〜2週間おき)に差分ソースを送り合って手動で実行しています。

ここまでが現状の紹介、以下は上記フローによる問題点です。
問題1 双方でのソースの同期を取るのが大変
一週間から二週間に一度差分ファイルを送り合ってるけど、マージに時間がかかる上、複数の変更がごっちゃになっておくられてくるためレビューしたくても途中で断念してしまう。

問題2 単体テストが通らないコミットが履歴に残り消せない
ちょっとしたミスがあってビルドに失敗してもsvnの履歴が消せない。Windows上での単体テストはコミット前に確認するけどLinuxで毎回やるのが面倒になったり、32bitと64bitを全組み合わせでやるのは面倒だったりする。動くだろうと思ってコミットすると壊れていたりとか。
あとはgccでは警告をエラー扱いしているので、使われてない変数があるとかその程度のことでエラー扱いされてしまう。

問題3 闇コミット
RedmineでTiDDに近いことをしているが、闇コミットが結構ある。スタイル直しただけとか、変数名リファクタリングしたとか。複数プロジェクトでリポジトリを共用してるからチケットIDが無いコミットを弾くのが難しい

問題4 Redmine上でチケットとコミットの関連付けを直せない
テストで問題が見つかってもRedmineのチケットとコミットの関係を直すことが出来ない。間違ってるfixesが残ってしまい、何とも出来ない

問題5 HudsonでビルドにコケてもRedmineのチケットに自動登録されない
Hudsonでコミットごとの単体テストとは別にストレステストを含むナイトリーテストを設定しているが、テストに失敗した時にRedmineのチケットが自動登録されない

問題6 TortoiseSVNのパッチ機能が腐ってる
外注からパッチで差分を送ってもらうことも考えたが、TortoiseSVNの文字コード認識がおかしく、一度エディタで開いて文字コードを保存し直す必要があった。(ちなみにソースはUTF-8)

問題7 機能ブランチの管理が大変。
一度切るとなかなか戻ってこない。戻すにも準備がかなり必要になる。試しに作ったけどいらなかったブランチも扱いに困る。

問題だけ見ると「何でこんなフローにしたんだ」と自分でも思ってしまうけど、少しずつプラクティスを取り入れた結果うまく連携できてない現状になってしまった。近々Subversionのリポジトリを課管理から本部管理に移行するお仕事があるのでこれを機にこれまでの問題点を解消しようと思っています。

詳細は後半で → Subversion, Git, Redmine, Hudson – 今考えている連携 » tune web

公知のラベリング処理アルゴリズム

2月 6th, 2010

ラベリング処理というのは入力画像に対して、連結する画素(同じ色とか、同じ領域とか)ごとに同じ番号を割り振る処理のことです。領域別に処理する際の前処理に使ったり、画像中の微小領域のサイズを測定してノイズ除去に使ったりと色々と有用です。アルゴリズム入門 : 第 3 章 画像処理入門 1を読むとイメージが湧くかと思います。
ラベリング処理のイメージ図

ラベリング処理は1970年代から知られている処理ですが、高速なアルゴリズムが意外と知られていません。ネットで検索すると大学の授業での説明資料が見つかる程度で、文献をあたっても解説があまりにも少なく多くは役に立ちません。

古い本でラベリング処理のアルゴリズムが詳しく説明されたものを見つけたので多くの人に有用と思い、ここに書いておきます。参考にした本は近代科学社発行の長尾真さんによる「デジタル画像処理」で、1978年に発行されています。ラベリング処理の紹介は360ページ〜361ページに有ります。

1:値を隣接する画素に伝搬させる

Sの成分をラベル付けする簡単な手続きは、探索と”伝搬”からなるものである。1が見つかるまでSを走査し、その値をまだ使われてない最初のラベルの値、たとえばvに変える。そしてvを1に向けて繰り返し(必要なら並列に)伝搬させる。すなわち、vを近傍として持つ1をvに変える。もはや変化の可能性がなくなったとき、明らかに最初のvに連結した1は全てvになっている。ここでさらに走査を続ける。別の1が見つかれば、これはv成分には属してないので、新しいラベルを付けて同じ手続を繰り返す。

Sが処理対象の画像、ラベル付けする対象が1、割り振るラベル値がvです。
この手法は「この手続は簡単ではあるが、非常に時間がかかる。各々の伝搬の過程は、たとえ並列に処理しても、図形の面積の次数だけの反復を要するからである。」と紹介されています。最初に紹介したMSのサイトで使われているのがまさにこれです。おすすめできません。

2:境界線を抽出し、輪郭内部に同一の値を割り振る

成分のラベル付けの別な方法としては、9.1.2節で述べた境界を見つける手法を、いくつかの外側境界(すなわち、Sの成分でこれを囲むS^の成分に隣接している境界。演習9参照)を別々にマークを付けるよう修正し、各成分の外側境界に異なったラベルを用いる。これが済むと、必要に応じて外側境界のラベルを成分の内側へ”伝搬”させることができる。これを並列に行うなら、たかだか図形の半径に等しい反復数を要する。

手当たりしだいに伝搬させるのではなく、まずは領域の輪郭にユニークなラベル番号を付与し、必要であれば内側に値をコピーする。1番よりは効率的ですが、「外側境界のラベル付けの手続きは時間がかかる
」処理であり、図形の面積につれて増加する多数のステップを有します。

3:行毎に横のつながり(ラン)を求め、上下の対照表をもとにつなげて行く

たいていの目的には、境界よりむしろ1のランを追跡してラベル付けをする次の手法が最良策である。図形の第1行目において、各ランに異なったラベルを与える。第2(とそれ以下の)行では、1のランを調べて前行のランと位置を比べる。ランρが前行のどのランとも隣接していなければρに新しいラベルを付ける。ρが前行のちょうど1つのランに隣接しているなら、そのランのラベルを付ける。ρが前行の2つ以上のランに隣接しているなら、ρにはこれらのらべるの(たとえば)最小値を付けるが、これらのラベルはすべて同一成分に属することも控えておく。図形がこのようにしてすべて走査されたとき、控えを分類して等しいラベルの集まりを決定できる。必要なら、図形を再走査し各ラベルを、たとえば等価な最小の値のラベルに置き換えることが出来る。

ということで、3番目がおすすめです。処理時間が画像サイズに依存して決まるし、ラスタ走査のみなのでメモリ上のキャッシュも有効に動いてくれるでしょう。

上の説明文を素直に実装すれば効率のよいラベリング処理を実現出来るでしょう。

構成管理手段が作業手順を定義している

1月 14th, 2010

今更な話なんですが・・・

ソフトウェアの構成管理をするのは今時当たり前ですが、構成管理システム(バージョン管理システム)の使い方は千差万別です。今でもローカルフォルダに置いてあるとか、ネットワーク上の共有フォルダに置いてあるとか、外注先のローカルフォルダに置いてあるとか、ひどい例を探していくといくらでも考えられます。うちの一昨年の新人曰く「フォルダを作ってフルバージョンを残しておくこと」なんて新人犬種で教わってきたらしいので、ひどい世の中です。

新しい順に分類すると

  • 分散型バージョン管理:Git / Mercurial / Bazaar
  • 集中型バージョン管理:Subversion / Perforce
  • 集中型の旧世代:CVS / Visual Source Safe
  • 古代:フォルダを分ける、共有フォルダに置くとか。

といった形でしょうか。

そして、どうしていつまでも古いやり方を踏襲する人がいるのかという話です。勉強する時間が無いとか、やり方が分からないとか、組織で決められているとかいろいろ理由があるとおもうのですが、「使っている構成管理ツールにあわせて作業手順を決めているから、より優れたツールがもたらすメリットを説明されても何を問題としているのかわからない」という発想がふと浮かびました。

フォルダ管理の人は、一人でしか開発してないから複数人で共有する時の話をしてもピンとこない。もしくは構成管理も含めて外注しているからたまに来る納品物を共有フォルダに置いておくだけで十分なんでしょう。

CVSの人はソフトウェアのバージョンは1.X.Yみたいに増えていくものと信じ込んでいて、複数ファイルをまとめて管理するなんて発想はないんでしょう。VSSの人はファイルをいじるときは一人が長期間ロックするものだという前提があるんでしょう。

Subversionの人はブランチは大きな機能を追加するときにたまに使うものだと思ってるんでしょう。

構成管理ツールと言うのは単に機能を提供するだけではなくて、ソフトウェアの手順を暗黙的に決めてしまいます。逆に考えると、新しいツールを使うときは新しいやり方を最大限活かせるように作業手順を作りなおさないとダメでしょうね。

入門Gitを読んでいて感じたことが、ようやく自分の中で咀嚼できた気がします。

インクリメンタルとイテレーティブの違い

12月 13th, 2009

[Agile]イテレーティヴとインクリメンタルの違い | Ryuzee.comを読んで思うところがあったので少し出遅れたけどメモ変わりに。

インクリメンタルだと最初から完成した姿を見越してI/Fを完全に作り込むのはあまりに難しく、かといって完成した部分に都度手を入れていては差分開発による工数の削減にならず、スケジュールが問題化してしまう。だったら前に完成したところは触らず、追加分で黒魔術を駆使しようという勢力が優勢になり、バージョンを重ねるにつれて継ぎ接ぎ部分が問題化する。機能もソース規模も雪だるま式に増えていく一方で、全体最適なソフトを作ることはきっとできない気がする。

差分開発というキーワードは一般的だけど、自分たちが取り組んでいるのは「イテレーティブ型」で、将来にわたってソフトウェアが最大の価値を生めるようにしているからだと主張しないと、ソフトウェアアーキテクチャの設計が悪いから差分開発が徹底できてないと評価を下されてしまう。

マネージャー層の階層を上がるほど「インクリメンタル」を念頭に置いている人が多いような気がします。機能が一通り揃ったら開発を収束させて、別なソフトに触手を伸ばすのもインクリメンタルな発想ありきなマネージメントかな?

“TDD” Boot Campに行くよ♪

11月 18th, 2009

勉強会隆盛のこのご時世、足が遠い自分ですが登録してみました。”すくすく スクラム”さんの 12月19日 “TDD” Boot Camp  ~ “TDD” をつかめ! ~(東京都)です。60人の定員に対してこのブログを書いた段階で52名が登録されています。告知が今朝だったのでとても盛況なようですね。

去年末からTDDを取り入れて開発を進めていますが、我流で周りに実践者もあまりいません。普段の取り組みで悪いところやコツなど学んで来れたらと思っています。ワークショップも有るので「ただ話を聞いて何となく勉強した気になった」というのも避けられそうというのが申し込んだもう一つの理由です。

実は普段はC言語(xUnitはCUnitを使用)という自分なので、当日使う言語の予習が必要そうです。第1言語はRubyにしましたが、RSpecは書いたこと有りません。第2言語はJavaにしましたが、Java5よりも前で止まっています > < 。

PC持ち込みなので設定して持っていかないと! 忘年会シーズンに頑張れ自分!

【解決済】VisualStudioとgccでコンパイルできるソースのエンコーディング

11月 4th, 2009

UTF-8だと一見どっちも対応しているように見えるんだけど、VisualStudioはBOM有のみ、gccはBOM無しのみ対応しています。

んで、対策として取ったのが gitでリポジトリからのチェックアウト時に文字コードを変換する » tune webだったんですが、今日仕事中にこんなページを見つけました。
GOGA – 数式の夢とコンピュータの現実: UTF8のソースコードをgccとVCで共有すること

なんだ、VisualStudioの方は警告さえ抑えれば普通にコンパイルできるのかとさっそくやってみたのですが、見事に失敗しました。VisualStudioでコンパイルするとエラーが山ほどでてダメでした。
調べてみるとVisualStudio2003まではいけたらしいんですが、自分が使っているVisualStudio2005ではNGでした。今の最新版は2008ですし、来年には2010もでます。VisualStudioのバージョンによらず簡単な解決法を模索したいところなのですが、困りました。

「VisualStudio2008/2010ならBOM無しのUTF-8も扱えるよ」という情報をお持ちの方がいらっしゃいましたらぜひ教えてください。

→2010年5月2日 解決しました Windows/Linux両環境で動作するC言語ソースの一元管理をGitで行う » tune web

クリーンコード一人読書(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