コンピュータ プログラミングにおける書き換えとは、ソース コードを再利用せずに既存の機能の大部分を再実装する行為または結果です。書き換えで既存のコードをまったく使用しない場合は、最初から書き換えると言われることがよくあります。
動機
ソフトウェアは通常、次の 1 つ以上の条件が当てはまる場合に書き換えられます。
- ソースコードが入手できない、または互換性のない ライセンスの下でのみ入手可能である
- そのコードは新しいターゲットプラットフォームに適合できない
- 既存のコードは扱いにくく、拡張も困難になっている
- デバッグ作業は複雑すぎるようだ
- プログラマーはソースコードを理解するのが難しいと感じる
- 開発者は新しい技術を学んだり、大きな変更を必要とする大規模な機能の見直しを希望している
- ソースコードのプログラミング言語を変更する必要がある
リスク
ジョエル・スポルスキー[1]などのソフトウェアエンジニアは、特にスケジュールの制約や競争圧力がある状況では、全面的な書き直しに対して警告を発しています。開発者は当初は過去の設計ミスを修正する機会を歓迎するかもしれませんが、書き直しは要求通りに機能する設計部分も破棄します。書き直しは、開発チームに新しい機能だけでなく、以前のコードに存在するすべての機能を提供することを約束し、新しいバグや、以前に修正されたバグの回帰を引き起こす可能性があります。[2] [3]書き直しは、古いバージョンで修正されていないバグの追跡にも影響します。[4]
増分書き換えは代替アプローチであり、開発者は既存のコードを新しい実装への呼び出しに徐々に置き換え、その実装を拡張して、古い実装を完全に置き換えます。このアプローチは、書き換え中に機能が広範囲に失われるのを防ぎます。クリーンルームソフトウェアエンジニアリングは別のアプローチであり、チームはソフトウェアの機能の徹底的な仕様書に基づいて作業する必要がありますが、コードにはアクセスできません。[5]
例
NetscapeのNavigator 4 の HTML レイアウトを改善するプロジェクトは、書き直しの失敗例として挙げられています。新しいレイアウト エンジン ( Gecko ) は Navigator とは独立して開発され、Navigator のコードと簡単に統合できませんでした。そのため、Navigator 自体が新しいエンジンに合わせて書き直され、多くの既存の機能が壊れ、リリースが数か月遅れました。一方、Microsoft はInternet Explorerの段階的な改善に注力していたため、同じ障害に直面することはありませんでした。[3] [6]皮肉なことに、Navigator 自体は、そのプログラムの開発者が監督したNCSA Mosaicのクリーンルーム書き直しの成功例でした。ブラウザー戦争を参照してください。
歴史上、大幅な書き換えがあったとされるプロジェクトをいくつか紹介します。
- Apache HTTP サーバー(1)
- AOLインスタントメッセンジャー(1)
- バインド(1)
- フリーネット(1)
- グラブ(1)
- マジョルドモ(1)
- メディアウィキ(1)
- モジラ/ネットスケープ(1)
- アイスキャスト(0–1)
- ネットキャット(1)
- オープンRPG (1)
- PHP(1~2)
- プロジェクト・ザナドゥ(0–1)
- サンセキュアグローバルデスクトップ(1)
- v速報(2)
- Webオブジェクト(1)
- ゾープ(1)
テクニック
参照
参考文献
- ^ Spolsky, Joel. 「絶対にしてはいけないこと、パート I」。Joel on Software。2015年 1 月 23 日閲覧。
- ^ Ronkes Agerbeek、Joost (2005 年 4 月 15 日)。「Never Rewrite Code From Scratch」。2008 年 10 月 10 日時点のオリジナルよりアーカイブ。2008 年 9 月 11日閲覧。
- ^ ab Spolsky, Joel (2000 年 4 月 6 日). 「絶対にしてはいけないこと」. 2008 年 9 月 11 日閲覧。
- ^ ザウィンスキー、ジェイミー。「注意欠陥ティーンエイジャーの連鎖」 。 2008年9月11日閲覧。
- ^ Tilly, Ben (2001 年 9 月 29 日)。「巨大なコード ベースをゼロから書き直す」。2008 年 9 月 11 日閲覧。
- ^ ザウィンスキー、ジェイミー(1999年3月31日)。「辞任と事後検証」。2008年9月11日閲覧。
外部リンク
- C2 Wiki の RewriteCodeFromScratch
- 絶対にしてはいけないこと、パート 1ジョエル スポルスキー著
