サポートされていないソフトウェアを開発する方法

彼らは他の誰かの技術的負債を返済するために私に支払います。 私の仕事では、多くの困難なコードサポートを目にし、回避できた多くの問題を繰り返し見ます。



古いソフトウェアの機能のデバッグ、修正、サポート、および拡張を専門としています。 私の典型的なクライアントには、多かれ少なかれ機能するウェブサイトまたはアプリケーションがありますが、その著者は利用できません。 ビジネス要件が変更され、ソフトウェアはそれらの要件を満たせなくなりました。 または、私のクライアントは「すでに完了」しているものを持っていますが、予算と期限を使い果たした後、開発者と別れました。 通常、この状況には、欠落している機能とバグのリストが伴います。

私の典型的なクライアントは、通常、既存のプログラマーを破棄し、ゼロから開発を開始することを勧める他のプログラマーと話しました。 ほとんどのプログラマーはコードのサポートを好みません。特に、他の人のコードのサポートを嫌います。



コードを書くとき、プログラマはコードの追加サポートについて話すときに間違った質問をすることがよくあります。これがどうなるかについては、Matt DuVallの「サポートの神話」記事を参照してください。 以下は、仕事をせずに私を離れないために、プロジェクトで従う必要があるいくつかのプラクティスです。



バージョン管理システムを使用しないでください
ここ数年でバージョン管理システムなしで書かれた大規模なプロジェクトに出くわしたとき、私はいつも驚きます。 バージョン管理を使用していない場合、次のプログラマーは、どのファイルが現在のシステムの一部であり、どのファイルが古くなっているかバックアップであるかを把握する必要があります。 次のプログラマは、コード履歴を取得するための単一のコミットメッセージまたは変更ログを持ちません。 私の記事「ダメージ指向プログラミングの紹介」で、バージョン管理システムを使用しない方法について話しました。



開発環境をカスタマイズします。 可能な限り強い。
次の開発者がコードを使い始めるのを簡単にしないでください。 言語とユーティリティの特定のバージョンを要求し、オペレーティングシステムに付属するバージョンと競合することを確認してください。 Eclipse、またはVisual Studio、または狂気のようなvimをセットアップし、この環境でのみ動作するマクロとスクリプトを作成します。 開発環境の複製用のディスクイメージやスクリプトを保存しないでください。ドキュメントの作成について心配する必要はありません。すべてが直感的です。



最も複雑なビルドおよび展開システムを作成する
Webサイトの場合、テストサーバーまたはバトルサーバーへの展開は次のいずれかでなければなりません。



svn up git pull hg pull
      
      





プログラマーは、コードのシンプルさとエレガントさについて議論し、最も複雑で奇妙なビルドおよびデプロイメントシステムを鋭くデプロイしてビルドできます。 これは、プログラマがクライアントまたはPMの監督なしに(またはそれらを理解せずに)追跡できないことの1つであるため、簡単に制御できなくなります。 異なるスクリプト言語で8つの異なるツールをチェーン化する場合、ドキュメントを作成することさえ考えないでください。



テスト/中間システムを展開しないでください
戦闘システムの変化は刺激的です! テスト/中間サーバーについて考えないでください。 代わりに、シークレットログインとシークレットURLを使用して、新しい機能をテストしてください。 データベース内のテストデータと実際のデータを混合します。 コード制御を使用していないため、念のため以前のバージョンのコピーを保管してください。 ロギングをコードに埋め込まないでください。 テスト中は、送信メール、クレジットカード認証などを無効にしないでください。



すべてをゼロから書く
Django、Rails、CakePHPなどの有名なフレームワークを台無しにしないでください。 より優れたテンプレートエンジン、ORM、ソート、またはハッシュアルゴリズムを作成できます。 「ネイティブメソッドよりも高速」や「パラメーターの順序が悪いのでPHPライブラリ関数を置き換える」などのコメントが表示されるたびに、頭の後ろをひっかきます。



ライブラリとリソースの特定のバージョンに依存関係を追加します...
できるだけ多くのサードパーティコードを追加します。 必要な数の動的ライブラリをリンクします。 1つの関数にアクセスするためだけに、巨大な外部ライブラリに依存するコードを見ました。 サードパーティのライブラリのソースコードを変更して、最新バージョンに自動的に更新できないようにしますが、変更したバージョンをバージョン管理下に置いたり、変更したりする心配はありません。 私はあなたのバージョンを元のバージョンと比較し、それを理解することができます。



...しかし、これらの依存関係を保護または文書化しないでください。
何らかの理由で、更新やアップグレードのために重要な電話を受けています。 WordPressの一見無害なアップデート、Linuxアップデート、または新しいjQueryリリースは、クラッシュの連鎖反応を引き起こします。 外部リソースまたはサードパーティライブラリの特定のバージョンまたは変更されたバージョンのコードをチェックインしないでください。 自分に思い出させるコメントを追加しないでください。



さまざまなプログラミング言語を使用して、最先端を維持
HackerNewsとRedditは毎日、新しいクールな言語について話題になっています。 クライアントを犠牲にして試してください。 まともなプログラマーならすぐに新しい言語を学ぶことができるので、コードを扱う次のプログラマーが初心者であることが判明した場合、これはあなたの問題ではありません。 言語、互換性のないAPI、データ形式、さまざまなサーバー構成要件の違いは、楽しい冒険であり、StackOverflowに投稿されています。 誰もがRubyがクールでPHPが悪いことを知っているので、Rubyに挿入されたPHP Webサイトを見ました。 セミトレーニングされたキャッシング、トリミングされたRailsおよびNode.jsプロジェクト、特にNoSQLソリューション(「拡張性が高い!」)は私のパンとバターです。



プログラミングのヒントはどこにありますか?
コードが完全にオブジェクト指向であるか、見事で機能的であるかどうかはそれほど顕著ではありません。プログラマーは、ほとんどの場合、サポートする必要があるスパゲッティコードを見るからです。 diff、grep、Ctags、コードトレース、リファクタリング、デバッグの使用が得意です。 コードを理解しました。 バージョン管理システムがない場合、依存関係と設定が多すぎる場合、テスト/中間システムがない場合は、最も美しくエレガントなコードで作業することは依然として困難です。 Hoarders Houseできれいでかわいい装飾が施された部屋を見つけるようなものです。



All Articles