20万行のスパゲッティコードを継承しました。


470

これが一般的な質問ではないことを願っています。経験豊富なアドバイスを本当に活用できました。

私は、過去10〜20年にわたって広大なコードベースを一緒に使用してきたかなり小さな科学者の店で、唯一の「SWエンジニア」として新たに採用されました。(実質的に廃止された言語で書かれました:G2 -Pascal with graphicsを考えてください)。プログラム自体は、複雑な化学処理プラントの物理モデルです。それを書いたチームは信じられないほど深いドメイン知識を持っていますが、プログラミングの基礎に関する正式なトレーニングはほとんど、またはまったくありません。彼らは最近、存在しない構成管理の結果についていくつかの難しい教訓を学びました。また、コード自体に文書化されていない「スラッジ」が大量に蓄積されているため、メンテナンス作業が大幅に妨げられています。私はあなたに状況の「政治」をspareしまない(常にある 政治!)、しかし言うことで十分ですが、先の道に必要なものについて意見のコンセンサスはありません。

彼らは、現代のソフトウェア開発の原則のいくつかをチームに提示し始めるように私に頼みました。彼らは、コーディング規約、ライフサイクル管理、高レベルの設計パターン、およびソース管理に関する業界標準の実践と戦略のいくつかを紹介してほしいと思っています。率直に言って、それはかなり困難な作業であり、どこから始めればよいのかわかりません。

最初は、The Pragmatic Programmer、またはFowler's Refactoring( "Code Smells"など)の中心概念のいくつかでそれらを指導したいと思っています。また、多くのアジャイル手法を紹介したいと思っています。しかし、最終的には、効果的にするために、5〜7の基本的な基礎に磨きをかける必要があると思います。言い換えれば、彼らが現実的に実装を開始できる最も重要な原則または慣行は何であり、それは彼らに最も「大金」を与えるでしょう。

それが私の質問です:スパゲッティをまっすぐにするのに役立つ(そして将来的にそれを防ぐために)最も効果的な戦略のリストに何含めますか?


124

13
G2はコードではなく、いくつかの威厳のあるGUIによって書かれた自動化されたコードに似ているため、実際にG2でリファクタリングするか、気の利いたもの全体を賢明なものにやり直すかを指定する必要があると思います。
エリックReppen

101
何をするにしても、これを一から書き直さないでください。それは重大な間違いです。20年の化学知識:それは決して再現できないものです。そして、あなたは当然科学者からの尊敬を失うでしょう。
フランチェスコ

13
@Francescoのコメント:Joelonsoftware.com/articles/fog0000000069.htmlに、Joel Spolskyの書き直さないことに関する合理的なアドバイスを追加します。
-Govert

16
最近読んだ素敵な引用は、「ソフトウェアはプロトタイプをまとめて、それを納入品として販売しようとする唯一のエンジニアリング分野です」
クリスS

回答:


466

序文

これは確かに困難な作業であり、カバーすべき多くの根拠があります。そのため、適切なツールと教材へのポインタを使用して、これをあなたのチームにとっていくらか包括的なガイドとして謙虚に提案します。

覚えておいてください:これらはガイドラインであり、それ自体は状況に基づいて採用、適応、または削除されることを意図しています。

注意:これらすべてを一度にチームにダンプすると、ほとんどの場合失敗します。汗をかくのに最適な要素をチェリーピックして、一度に1つずつゆっくりと紹介してください。

注:このすべてがG2などのビジュアルプログラミングシステムに直接適用されるわけではありません。これらに対処する方法の詳細については、最後の付録セクションを参照してください。


せっかちな人のためのエグゼクティブサマリー

  • リジッドプロジェクト構造を定義します:
    • プロジェクトテンプレート
    • コーディング規則
    • おなじみのビルドシステム
    • インフラストラクチャとツールの使用ガイドラインのセット。
  • 優れたSCMをインストールし、使用方法を知っていることを確認します。
  • それらのテクノロジーに適したIDEを示し、それらの使用方法を確実に理解させます。
  • ビルドシステムにコード品質チェッカー自動レポートを実装します
  • ビルドシステムを継続的な統合および継続的な検査システムに結合します。
  • 上記の助けを借りて、コード品質の「ホットスポット」を特定し、リファクタリングします。

長いバージョンについては...注意してください。


剛性は(しばしば)良い

剛性はしばしばあなたに反抗する力とみなされるため、これは議論の余地がある意見です。いくつかのプロジェクトのいくつかのフェーズについても同様です。ただし、構造的なサポート、つまり当て推量を排除するフレームワークと見なすと、無駄な時間と労力が大幅に削減されます。それはあなたのためではなく、あなたのために働きます。

剛性 = プロセス / 手順

ソフトウェア開発には、化学プラントや工場にマニュアル、手順、ドリル、緊急時のガイドラインがあるのとまったく同じ理由で、優れたプロセスと手順が必要です:悪い結果の防止、予測可能性の向上、生産性の最大化...

ただし、剛性は中程度です。

プロジェクト構造の剛性

各プロジェクトに独自の構造が付属している場合、ユーザー(および新規ユーザー)は失われ、プロジェクトを開くたびに最初からやり直す必要があります。プロのソフトウェアショップでこれを望んでおらず、ラボでもこれを望んでいません。

ビルドシステムの剛性

各プロジェクト異なって見える場合、彼らも異なって構築する可能性が高い です。ビルドには、あまり多くの研究や当て推量は必要ありません。あなたは、標準的なことを行うと、詳細を心配する必要はありませんできるようにしたい:configure; make installantmvn install、等...

同じビルドシステムを再利用し、時間の経過とともに進化させることで、一貫した品質レベルを確保することもできます。

READMEプロジェクトの詳細をすばやく指摘し、ユーザー/開発者/研究者がいる場合は優雅にガイドする必要があります。

これにより、ビルドインフラストラクチャの他の部分、つまり次のことも大幅に促進されます。

したがって、ビルド(プロジェクトなど)を最新の状態に保ちますが、時間の経過とともに厳しくし、違反や悪い慣行の報告をより効率的にします。

車輪を再発明せず、すでに行ったことを再利用しないでください。

推奨読書:

プログラミング言語の選択における剛性

特に研究環境では、すべてのチーム(さらに少ない開発者)が同じ言語と技術スタックを使用することは期待できません。ただし、「公式にサポートされている」ツールのセットを特定し、それらの使用を奨励することができます。良い理論的根拠のない残りの部分は(プロトタイプを超えて)許可されるべきではありません。

技術スタックをシンプルに保ち、必要なスキルの維持と幅を最小限に抑えます:強力なコア。

コーディング規約とガイドラインの厳格さ

コーディング規約とガイドラインは、チームとしてのアイデンティティと共有用語の両方を開発できるようにするものです。ソースファイルを開くたびにterra incognitaにエラーが発生するのは望ましくありません。

単一の単純な違反に基づいてコミットが拒否される程度まで、人生をより困難にするか、アクションを明示的に禁止する無意味なルールは負担です。しかしながら:

  • 考え抜かれたグランドルールセットは泣き言や思考の多くを奪う:誰もいない状況下で壊すべきではありません。

  • また、推奨ルールのセットは追加のガイダンスを提供します。

個人的なアプローチ:コーディング規約に関しては積極的です。一部の人はナチとも言います。私は、チームにとって認識できるスタイルである共通語を持つことを信じているから です。がらくたコードがチェックインされると、ハリウッドスターの顔のヘルペスのように目立ちます。レビューとアクションが自動的にトリガーされます。実際、不適合のコミットを拒否するために、事前コミットフックの使用を提唱することもあります。既に述べたように、それは過度に狂ってはならず、生産性の邪魔になるべきではありません。特に最初は、これらをゆっくりと紹介してください。しかし、実際の問題に取り組むことができないように、欠陥のあるコードを修正するのに多くの時間を費やすよりもはるかに望ましい方法です。

一部の言語では、これを設計上強制しています:

  • Javaは、あなたがそれを使って書くことができる鈍いがらくたの量を減らすことを意図していました(多くの人がそれをなんとかすることは間違いありませんが)。
  • この意味では、インデントによるPythonのブロック構造も別のアイデアです。

  • Goのgofmtツールを使用すると、スタイルに固有の議論と労力(そしてエゴ!!)を完全に取り除くgofmtことができます。コミットする前に実行してください。

コードの腐敗がすり抜けられないことを確認してください。コードの慣習継続的インテグレーション継続的インスペクションペアプログラミングコードレビューは、この悪魔に対する武器です。

さらに、以下で説明するように、コードはドキュメントです。これは、規則が読みやすさと明確さを促進する別の領域です。

ドキュメントの剛性

ドキュメントはコードと密接に関連しています。コード自体はドキュメントです。しかし、物事を構築、使用、保守する方法について明確な指示が必要です。

(WikiWikiやDMSのような)単一のコントロールポイントをドキュメントに使用するのは良いことです。プロジェクト用のスペース、よりランダムな冗談と実験用のスペースを作成します。すべてのスペースに共通の規則と規則を再利用させます。それをチーム精神の一部にしてください。

コードとツールに適用されるアドバイスのほとんどは、ドキュメントにも適用されます。

コードコメントの剛性

上記のコードコメントもドキュメントです。開発者は、自分のコードに対する感情を表明するのが好きです(私に尋ねると、ほとんどがプライドとフラストレーションです)。したがって、より正式なテキストがより少ないexp語やドラマで同じ意味を伝えることができた場合、コメント(またはコード)で不確実な用語でこれらを表現することは彼らにとって珍しいことではありません。楽しさと歴史的な理由でいくつかをすり抜けても構いません。それは、チーム文化発展の一部でもあります。しかし、誰もが受け入れられるものと受け入れられないものを知っていることが非常に重要であり、コメントノイズはそれだけです: noise

コミットログの剛性

コミットログは、SCMのライフサイクルの面倒で役に立たない「ステップ」ではありません。時間どおりに家に帰ったり、次のタスクに取り掛かったり、ランチに出かけた仲間に追いつくためにスキップしないでください。それらは重要であり、(ほとんどの)良いワインのように、時間が経過するほど価値が高くなります。だから彼らは正しくやる。同僚が巨大なコミットや非自明なハックのためにワンライナーを書いているのを見ると、びっくりします。

コミットは理由のために行われますが、その理由は、コードと入力した1行のコミットログによって常に明確に表現されていません。それだけではありません。

コードの各行には、ストーリー履歴があります。差分はその歴史を伝えることができますが、そのストーリーを書く必要があります。

なぜこの行を更新したのですか?->インターフェイスが変更されたため。

インターフェースが変更されたのはなぜですか?->それを定義するライブラリL1が更新されたため。

ライブラリが更新されたのはなぜですか?->機能Fに必要なライブラリL2は、ライブラリL1に依存していたためです。

そして、機能Xとは何ですか?->課題追跡のタスク3456を参照してください。

これは私のSCMの選択ではなく、あなたのラボにとっても最良の選択ではないかもしれません。しかしGit、これを正しく行い、とを使用short logsして 、他のほとんどのSCMシステムよりも適切なログを書き込むように強制しますlong logs。タスクID(はい、必要です)をリンクし、の一般的な要約を残してshortlog、長いログで展開します:変更セットのストーリーを書きます。

これはログです。更新を追跡および記録するためにここにあります。

経験則:後でこの変更について何かを探していた場合、あなたのログはあなたの質問に答えそうですか?

プロジェクト、ドキュメント、およびコードは生きています

それらを同期させてください。そうしないと、それらはもはやその共生エンティティを形成しません。あなたが持っているとき、それは驚異的に動作します:

  • SCMのコミットログをクリアし、課題トラッカーのタスクIDへのリンクを追加します。
  • このトラッカーのチケット自体がSCMのチェンジセット(および場合によってはCIシステムのビルド)にリンクする場所
  • そして、これらすべてにリンクするドキュメントシステム。

コードとドキュメントはまとまりが必要です。

テストの剛性

経験則:

  • 新しいコードには、(少なくとも)単体テストが付属します。
  • リファクタリングされたレガシーコードには、ユニットテストが付属します。

もちろん、これらには以下が必要です。

  • 貴重なものを実際にテストする(または時間とエネルギーの浪費)
  • よく書かれ、コメントされている(チェックインする他のコードと同じように)。

これらはドキュメントでもあり、コードの契約の概要を説明するのに役立ちます。特にTDDを使用する場合。あなたがそうしなくても、あなたはあなたの心の平和のためにそれらを必要とします。これらは、新しいコード(メンテナンスまたは機能)を組み込むときのセーフティネットと、コードの腐敗や環境障害から保護するための望楼です。

もちろん、さらに先に進み、修正する再現可能なバグごとに統合テスト回帰テストを行う必要があります。

ツールの使用における剛性

ときどき開発者/科学者がソースで新しい静的チェッカーを試したり、別のものを使用してグラフやモデルを生成したり、DSLを使用して新しいモジュールを実装したりすることは問題ありません。しかし、すべてのチームメンバーが知って使用することが期待される標準的なツールセットがあれば最適です。

それを超えて、メンバーがすべてである限り、メンバーが望むものを使用できるようにします。

  • 生産的
  • 定期的に支援を必要としない
  • 一般的なインフラストラクチャに定期的に調整しない
  • (コード、ビルドシステム、ドキュメントなどの一般的な領域を変更することにより)インフラストラクチャを中断しないでください
  • 他人の仕事影響しない
  • 要求されタスクをタイムリーに実行できます

そうでない場合は、デフォルトにフォールバックするように強制します。


剛性vs汎用性、適応性、プロトタイピングおよび緊急事態

柔軟性が良い場合があります。誰かに時折ハック、クイックアンドダーティアプローチ、またはお気に入りのペットツールを使用して仕事を終わらせること は問題ありません決してそれが習慣になってみましょうしないと、絶対にこのコードをサポートするために、実際のコードベースになってみましょうありません。


チーム精神の問題

コードベースの誇りを育む

  • コードに対するプライド意識を養う
    • ウォールボードを使用する
      • 継続的インテグレーションゲームのリーダーボード
      • 問題管理と欠陥カウント用のウォールボード
    • 課題追跡 / バグ追跡を使用する

非難ゲームを避ける

  • 継続的インテグレーション/継続的検査ゲームを使用してください:それは、良心的で生産的な競争を促進します。
  • 欠陥を追跡すること:それはちょうど良いハウスキーピングです。
  • DO 根本原因を特定する:それはちょうど、将来のプルーフプロセスです。
  • しかし、非難を割り当てないでください:それは逆効果です。

開発者ではなく、コードについてです

開発者にコードの品質を意識させますが、コードを、批判することのできない自分自身の拡張ではなく、独立したエンティティと見なします。

それは矛盾です:健康な職場では自我のないプログラミングを奨励する必要がありますが、動機付けの目的は自我に頼る必要があります。


科学者からプログラマーへ

コードを高く評価してプライドを持たない人は、良いコードを生成しません。このプロパティが出現するには、それがどれほど価値があり、楽しいかを発見する必要があります。純粋なプロフェッショナリズムと良いことをしたいという欲求だけでは十分ではありません。情熱が必要です。そのため、科学者をプログラマーに変える必要があります (広い意味で)。

誰かがコメントで、プロジェクトとそのコードで10〜20年経った後、誰もが愛着を感じるだろうと主張しました。多分私は間違っているかもしれませんが、彼らはコードの結果や仕事とその遺産に誇りを持っていると思います。コード自体やそれを書く行為についてではありません。

経験から、ほとんどの研究者はコーディングを必要と考えているか、せいぜい楽しい気晴らしと考えています。彼らはただそれが機能することを望んでいます。すでにそのことに精通しており、プログラミングに興味がある人は、ベストプラクティスの採用とテクノロジの切り替えを簡単に説得できます。それらを途中で取得する必要があります。


コードのメンテナンスは研究作業の一部です

誰もがくだらない研究論文を読むことはありません。そのため、出版の準備ができたとみなされるまで、何度もピアレビュー、校正、洗練、書き換え、承認されています。同じことが論文とコードベースにも当てはまります

コードベースの絶え間ないリファクタリングとリフレッシュは、コードの腐敗を防ぎ、技術的な負債を減らし、他のプロジェクトの作業の将来の再利用と適応を促進することを明確にします。


なぜこれ??!

上記のすべてに煩わされるのはなぜですか?以下のためのコードの品質。それとも 品質コードですか...?

これらのガイドラインは、チームをこの目標に向けることを目的としています。いくつかの側面は、単に彼らに道を見せてそれをさせることでそれを行い(これははるかに優れています)、他のものは手でそれらを取ります(しかし、それはあなたが人々を教育し習慣を発達させる方法です)。

目標がいつ到達できるかをどのように知るのですか?

品質は測定可能です

常に定量的にでありませんが、測定可能です。前述のように、チームに誇りを持たせる必要があり、進歩と良い結果を示すことが重要です。コードの品質を定期的に測定し、間隔の間の進捗状況とその重要性を示します。何が行われたか、そしてそれがどのように物事を改善したか、または悪化させたかを振り返るレトロスペクティブを行います。

継続的な検査に最適なツールがあります。ソナーはJavaの世界で人気のあるソナーですが、どのテクノロジーにも適応できます。他にもたくさんあります。コードを顕微鏡下に置き、これらの厄介な迷惑なバグや微生物を探します。


しかし、私のコードが既にCrapである場合はどうなりますか?

上記のすべては、Never Landへの旅行のように楽しくてかわいいですが、既に(蒸し暑い臭いの山)がらくたコードがあり、チームが変更を嫌がっているときは、それほど簡単ではありません。

ここに秘密がありますどこかから始める必要があります

個人的な逸話:プロジェクトでは、元々650,000以上のJava LOC、200,000以上のJSP行、40,000以上のJavaScript LOC、および400 MB以上のバイナリ依存関係のあるコードベースを使用しました。

約18か月後、500,000 Java LOC (MOSTLY CLEAN)、150,000行のJSP、および38,000 JavaScript LOCになり、依存関係はわずか100 MBになります(これらはSCMにはもうありません!)。

どうやってやったの? 上記のすべてを実行しました。または頑張った。

それはチームの努力ですが、私たちはゆっくり注入急いでいる間、私たちの製品の心拍数を監視するために、当社のプロセスの規制やツールに斬撃「脂肪」離れて:私たちはへのすべての開発を停止していない...がらくたコード、無用の依存関係をこれを行う:比較的平穏で静かな時期があり、コードベースに夢中になって自由に解体することができますが、ほとんどの場合、すべての機会を得るためにデフォルトで「レビューとリファクタリング」モードに設定します。 :ビルド中、ランチ中、バグ修正スプリント中、金曜日の午後中...

大きな「作業」がありました... 8500+ XML LOCの巨大なAntビルドからマルチモジュールMavenビルドにビルドシステムを切り替えることもその1つでした。その後、

  • 明確なモジュール(または少なくともそれはすでにはるかに優れていた、と私たちはまだ将来の大きな計画があります)、
  • 自動依存関係管理(メンテナンスと更新を簡単にし、不要な依存関係を削除するため)
  • より速く、簡単で、再現可能なビルド、
  • 品質に関する毎日のレポート。

あなたのコードダウングーグルグァバとApache Commonsのは、スリムでとのバグのために表面を減らす:もう一つは、私たちが依存関係を削減しようとしていたにもかかわらず、「ユーティリティツールベルト」の注入したあなたのコードたくさん。

また、新しいツール(JIRA、Fisheye、Crucible、Confluence、Jenkins)を使用する方が既存のツールよりも優れているとIT部門を説得しました。私たちはまだ軽視したもの(QC、Sharepoint、およびSupportWorks ...)に対処する必要がありましたが、全体的に改善されたエクスペリエンスであり、さらに余裕がありました。

そして、毎日、物事の修正とリファクタリングのみを扱う1から数十のコミットのトリクルがあります。私たちは時々ものを壊します(ユニットテストが必要です、そしてリファクタリングする前にそれらを書く方が良いでしょう)が、私たちの士気と製品の全体的な利益は莫大です。一度にコード品質の割合のほんの一部を取得します。そして、それが増加するのを見るのは楽しいです!!!

注:繰り返しになりますが、新しくより良いもののためのスペースを確保するには、剛性を振る必要があります。私の逸話では、私たちのIT部門は、私たちにいくつかのことを押し付けようとすることと、他の人には間違ったことをしようとすることに部分的に正しいです。または多分彼らは正しかった。物事は変わります。生産性を高めるより良い方法であることを証明してください。このための試用版とプロトタイプがここにあります。


素晴らしい品質のための極秘インクリメンタルスパゲッティコードリファクタリングサイクル

       +-----------------+      +-----------------+
       |  A N A L Y Z E  +----->| I D E N T I F Y |
       +-----------------+      +---------+-------+
                ^                           |
                |                           v
       +--------+--------+      +-----------------+
       |    C L E A N    +<-----|      F I X      |
       +-----------------+      +-----------------+

ツールベルトにいくつかの高品質ツールを用意したら:

  1. コード品質チェッカーを使用してコードを分析します。

    リンター、静的アナライザー、またはあなたが持っているもの。

  2. 重要なホットスポットとぶら下がっている果物を特定します。

    違反には重大度レベルがあり、重大度の高いクラスが多数含まれる大規模なクラスは大きな赤い旗です。したがって、ラジエーター/ヒートマップタイプのビューでは「ホットスポット」として表示されます。

  3. 最初にホットスポットを修正します。

    ビジネス価値が最も高いため、短期間でインパクトを最大化します。理想的には、重大な違反は潜在的なセキュリティの脆弱性またはクラッシュの原因であり、責任を誘発するリスクが高い(そして、場合によってはラボのパフォーマンスが低下する)ため、出現するとすぐに対処する必要があります。

  4. 自動化されたコードベーススイープで低レベルの違反をクリーンアップします。

    S / N比が向上するため、レーダーで重大な違反が発生したときに確認できます。多くの場合、最初は軽微な違反の大群があり、それらが処理されず、コードベースが荒らされたままになっている場合です。本当の「リスク」はありませんが、コードの可読性と保守性を損ないます。タスクの作業中に会ったときに修正するか、可能であれば自動コードスイープを使用した大規模なクリーニングクエストで修正します。適切なテストスイートと統合システムがない場合は、大きな自動スイープに注意してください。煩わしさを最小限に抑えるために、適切なタイミングで同僚に同意してください。

  5. 満足するまで繰り返します。

    これがまだアクティブな製品である場合、理想的には決してそうであってはなりません。進化し続けます。

良い家を保つための簡単なヒント

  • ホットフィックスモードの場合、カスタマーサポートリクエストに基づいて:

    • 新しい問題を不本意ながら導入する可能性があるため、通常は他の問題を修正しないことをお勧めします。
    • それをシールスタイルで行ってください:入って、バグを殺して、出て、パッチを送ってください。それは外科的で戦術的な攻撃です。
  • ただし、他のすべての場合、ファイルを開く場合は、次のことを義務付けてください。

    • 間違いなく 、それを確認し(メモを取り、問題を報告してください)、
    • 多分: それをきれいにする(スタイルのクリーンアップとマイナー違反)、
    • 理想的には、 リファクタリングします(大きなセクションとその隣人を再編成します)。

ファイルからファイルに1週間を費やして、複数の機能やモジュールにまたがる数千の修正の大規模な変更セットで終わることを避けてはいけません-それは将来の追跡を困難にします。コードの1つの問題=トラッカーの1つのチケット。時々、チェンジセットは複数のチケットに影響を与える可能性があります。しかし、頻繁に発生する場合は、おそらく何か間違ったことをしていることになります。


補遺:ビジュアルプログラミング環境の管理

オーダーメイドのプログラミングシステムの壁に囲まれた庭園

OPのG2のような複数のプログラミングシステムは異なる獣です...

  • ソース「コード」なし

    多くの場合、ソース「コード」のテキスト表現へのアクセスは許可されません。独自のバイナリ形式で保存される場合もあれば、テキスト形式で保存されますが、それらを隠してしまう場合もあります。オーダーメイドのグラフィカルプログラミングシステムは、反復的なデータ処理ワークフローの自動化を簡素化するため、実際には研究所では珍しいことではありません。

  • ツーリングなし

    それはさておき、それは。多くの場合、プログラミング環境、独自のデバッガー、独自のインタープリター、独自のドキュメント作成ツールおよび形式に制約されます。彼らは最終的に彼らのフォーマットをリバースエンジニアリングし、外部ツールを構築するのに十分な動機づけられた誰かの興味をキャプチャする場合を除き、それらは 壁に囲まれた庭です-ライセンスが許可する場合。

  • ドキュメントの欠如

    多くの場合、これらはニッチなプログラミングシステムであり、かなり閉鎖的な環境で使用されます。それらを使用する人々は頻繁にNDAに署名し、彼らが何をするかについて決して話しません。彼らのためのプログラミングコミュニティはまれです。そのため、リソースが不足しています。あなたは公式のリファレンスにこだわっています、そしてそれだけです。

皮肉な(そしてしばしばイライラする)ビットは、これらのシステムが行うすべてのことは、主流および汎用プログラミング言語を使用することで、そしておそらくより効率的に達成できることです。しかし、それはプログラミングのより深い知識を必要としますが、あなたの生物学者、化学者、または物理学者が(少し例を挙げると)プログラミングについて十分に知っていること、そして実装する(そして維持する)時間(そして欲求)を持つことをさらに期待することはできません複雑なシステム。長寿命であってもなくてもかまいません。DSLを使用するのと同じ理由で、これらの特注プログラミングシステムがあります。

個人的な逸話2:実際、私はこれらの1つに自分で取り組みました。OPのリクエストとはリンクしませんでしたが、私のプロジェクトは相互接続された大きなデータ処理およびデータストレージソフトウェアのセットでした(主にバイオインフォマティクス研究、ヘルスケア、化粧品、さらにはビジネス用)インテリジェンス、またはあらゆる種類の大量の研究データの追跡とデータ処理ワークフローとETLの準備を意味する任意のドメイン)。これらのアプリケーションの1つは、ドラッグアンドドロップインターフェイス、バージョン化されたプロジェクトワークスペース(メタデータストレージにテキストファイルとXMLファイルを使用)、異種データソースへの多数のプラグイン可能なドライバー、ビジュアルN個のデータソースからのデータを処理し、最終的にM個の変換された出力を生成するパイプラインを設計するキャンバス 可能な光沢のある視覚化と複雑な(およびインタラクティブな)オンラインレポート。ユーザーのニーズに合わせてシステムを設計するふりをして、NIH症候群に少し悩まされている、あなたの典型的な特注ビジュアルプログラミングシステム。

そして、あなたが期待するように、それは素晴らしいシステムであり、そのニーズに対して非常に柔軟ですが、「コマンドラインツールを代わりに使用しないのはなぜですか?」さまざまな「ベスト」プラクティスでそれを使用する多くのさまざまな人々に大規模なプロジェクトに取り組んでいるチーム。

素晴らしい、私たちは運命だ!-私たちはそれについて何をしますか?

まあ、結局のところ、上記のすべてがまだ保持されます。このシステムからほとんどのプログラミングを抽出して、より多くの主流のツールと言語を使用できない場合、システムの制約に適合させる必要があります。

バージョン管理とストレージについて

最終的には、最も制約があり壁に囲まれた環境であっても、ほとんどいつでもバージョン管理を行うことができます。ほとんどの場合、これらのシステムには依然として独自のバージョン管理機能があります(残念ながら多くの場合、これはかなり基本的なものであり、以前のスナップショットを保持するだけで、あまり可視性のない以前のバージョンに戻すことができます)。選択したSCMのように差分チェンジセットを正確に使用していないため、複数のユーザーが同時に変更を送信するのにはおそらく適していません。

それでも、もしそれらがそのような機能を提供するのであれば、おそらくあなたの解決策は、上記の私たちの愛される業界標準のガイドラインに従い、それらをこのプログラミングシステムに置き換えることです!!

ストレージシステムがデータベースの場合、おそらくエクスポート機能を公開するか、ファイルシステムレベルでバックアップできます。カスタムバイナリ形式を使用している場合は、バイナリデータを適切にサポートするVCSを使用してバージョン管理を試みることができます。きめ細かな制御はできませんが、少なくとも大惨事に対して背中を覆うことができ、ある程度の災害復旧のコンプライアンスがあります。

テストについて

プラットフォーム自体にテストを実装し、外部ツールとバックグラウンドジョブを使用して定期的なバックアップを設定します。おそらく、これらのテストは、このプログラミングシステムで開発されたプログラムを起動するのと同じように起動します。

確かに、それはハックの仕事であり、「通常の」プログラミングの一般的な基準には決して達していませんが、アイデアはプロのソフトウェア開発プロセスの外観を維持しようとしながらシステムに適応することです。

道は長くて険しい...

いつものようにニッチな環境とオーダーメイドのプログラミングシステムで、そして上で公開したように、あなたは奇妙なフォーマット、限られた(またはまったく存在しない)おそらく不格好なツールのセット、そしてコミュニティの代わりのボイドに対処します。

推奨事項:可能な限り、上記のガイドラインをカスタムプログラミングシステムの外部で実装するようにしてください。これにより、適切なサポートとコミュニティドライブを備えた「一般的な」ツールを使用できます。

回避策:これがオプションでない場合、このグローバルフレームワークを「ボックス」に後付けしてみてください。アイデアは、この業界標準のベストプラクティスの青写真をプログラミングシステムの上に重ね、それを最大限に活用することです。アドバイスは引き続き適用されます。構造とベストプラクティスを定義し、適合を促進します。

残念ながら、これはあなたが飛び込み、膨大な量の脚の仕事をする必要があるかもしれないことを意味します。そう...

有名な最後の言葉と謙虚な要求:

  • あなたが行うすべてを文書化します。
  • あなたの経験を共有してください。
  • あなたの書いたツールをオープンソースにしてください。

これをすべて行うことで、次のことができます。

  • 同様の状況の人々からサポートを受けるチャンスを増やすだけでなく、
  • また、他の人々に助けを提供し、テクノロジースタックに関する議論を促進します。

ご存知のとおり、あなたはObscure Language Xの新しい活気のあるコミュニティのまさに始まりにいる可能性があります。ない場合は、開始してください!

おそらく内部美しいかもしれませんが、これまでのところ誰も手がかりを持ってないので、このい壁を壊し他の人が覗き見できるようにしてください!


22
注:これに関するコメントは、手に負えなくなったためクリーンアップされています。ヘイレムは、最も関連性が高く有用なものを回答に取り入れました。また、答えは投稿の30,000文字の制限に非常に近いです。細心の注意を払って編集してください。
ChrisF

3
重要な区別である、継続的インテグレーションに欠けているものが1つだけあります。これは、悪いチェックインを人のせいにしないでください。間違えても大丈夫です。間違いは学習に役立ちますが、同僚があなたの間違いで苦しむことは時間とエネルギーを浪費し、最悪の場合にはinりを教えます。
ジェイソン

96
この回答はいつハードカバーで購入できますか?
-LarsH

5
私は最初、この答えによって消されました。理由は定かではありませんが、言葉遣いが間違った方向にこすりつけており、少し高すぎると感じました。しかし、ガイドをセクションごとに読んだところ(一度に座ったのとは対照的に)、私はそれが非常に役立つことがわかりました。この答えが気が遠く、コメントを読まずにこのコメントに到達した場合は、戻って1つのセクションを読んでください。
sdasdadas

5
硬すぎて、長く曲がりくねっており、明らかです。これがあなたのアジェンダ/戦略である場合、誰ももう一ヶ月かそこら後にあなたに耳を傾けることはありません。
ジョッペ

101

非常に最初のステップは、あろうバージョン管理システムの導入(SVN、Gitは、Mercurialの、TFSなど)。これは、リファクタリングを行うプロジェクトに必要です。

編集: VSCに関して-すべてのソース管理パッケージはバイナリを管理できますが、いくつかの制限があります。市場のほとんどのツールには、カスタム差分ビューアとエディタを使用する機能があり、この機能を使用します。バイナリソースファイルは、バージョン管理を使用しない言い訳ではありません

レガシーコードの処理方法に関する同様の投稿があります。従うのに良いリファレンスになるかもしれません- レガシーコードの使用に関するアドバイス


19
残念ながら、G2言語の欠点の1つは、ソースファイルが人間が読めないことです(これは基本的にはLabViewに似たグラフィカル言語です)。したがって、バージョン管理の実装はせいぜい自明ではありません。実際、これは現在(IMO)の最大の障害の1つです。
kmote

4
@kmote:G2のメーカーには、バージョン管理に役立つ独自の特別なツールがありますか?他の誰かがそのようなツールを作成しましたか?
FrustratedWithFormsDesigner

39
すべてのソース管理パッケージはバイナリを管理できますが、いくつかの制限があります。私が知っているすべてのツールには、カスタムdiffビューアーとエディターを使用する機能があり、この機能を使用します。バイナリソースファイルは、バージョン管理を使用しない言い訳ではありません。
mattnz

11
G2ファイル形式をリバースエンジニアリングし、diff-friendlyテキスト形式でダンプするユーティリティを作成できます。それは気が遠くなるように思えるかもしれませんが、そのような大きなコードベースにとっては、努力する価値があるでしょう(私のナイーブな意見では)。
ジョーイアダムス

6
@Erik:「ロールバック」ツールとしてのみバージョンコントロールを使用することは、食料品の買い物をするためにポルシェを購入するようなものです。
-mattnz

43

スパゲッティコードを使用する必要がある場合、最初に取り組むのはモジュール化です。線を描画し、コードベースの(多かれ少なかれ)独立した部分を抽出できる場所を見つけます。相互接続性と結合度が高いため、おそらくそれほど小さくはありませんが、それらを探すといくつかのモジュールラインが出現します。

モジュールを作成したら、面倒なプログラム全体をクリーンアップするという困難な作業に直面することはなくなります。今、代わりに、クリーンアップするいくつかの小さな独立した乱雑なモジュールがあります。ここでモジュールを選択して、小規模で繰り返します。大きな関数を小さな関数またはクラスに抽出できる場所を見つけます(G2がサポートしている場合)。

言語が十分に強力な型システムを持っている場合、これは非常に簡単です。なぜなら、コンパイラーに多くの面倒な作業をさせることができるからです。どこかで(意図的に)互換性を損なうような変更を加えてから、コンパイルを試みます。コンパイルエラーにより、変更が必要な場所に直接導かれ、​​それらの取得を停止すると、すべてが見つかります。 次に、プログラムを実行してすべてをテストします! リファクタリングを行う場合、継続的なテストが非常に重要です。


17
レガシーコードを効果的に使用することは、おそらくこれを読む必要があります。
Oded

3
さらに良い..プログラムを実行するだけでなく、新しいモジュールをユニットテストします:)
デミアンブレヒト

1
これが最良のアプローチです(すべてのロットをバージョン管理に入れるという明らかなステップもあります)。大きな答えのすべての欠点は一般的すぎて、一度に適用するには大きすぎます。全体的なものの概念を理解するまで赤ちゃんが歩きます。50kプロジェクトを1回継承しました(実際には、同じ50kの4つのバージョン)。1か月後、1つのバージョンがあり、基本的なリファクタリング/再構築を通じて約1万行を削除しました。1-リポジトリに貼り付け、2-ビルドできることを確認し、3-リファクタリング/再構築し、3を完了するまで繰り返します。

22

これがあなたにとって選択肢であるかどうかはわかりませんが、よりプロフェッショナルな開発者雇うよう説得しようとします。このようにして、彼らはドメインの問題に集中することができました(彼らはそこに十分あると確信しています)。

彼らは非常に賢い人だと思いますが、良い開発者になるには多くの時間が必要です。彼らは彼らの主要なビジネスではない活動に多くの時間を費やす準備ができていますか?私見、これは最良の結果を達成する方法ではありません。


16
OPは最初のプロの開発者です。OPが彼らをより多く雇うように説得する最善の方法は、OPが最初の6〜12か月で明らかな追加価値を提供することです。それが達成できれば、OPには信頼性があり、さらに雇用できる可能性があります。
MarkJ

20

ワオ。あなたはあなたの前に本当に大きな挑戦をしているように聞こえます!私は次の行に沿って何かをしたいと思います:

  • まず第一に:優先順位を付けます。最初に達成したいことは何ですか?プロジェクトの現在の状態で最も重要なことは何ですか?そこから何を得るのにどれくらいの時間を費やしますか。
  • バージョン管理システムがあることを確認してください。たとえば、GitまたはMercurial
  • ある種の継続的インテグレーションシステム(Jenkinsなど)を稼働させます。
  • 取得バグ追跡システムを稼働。私の意見では、カマキリはとてもいいです。
  • 見て、静的コード解析(何かがあなたが現在作業している言語のために利用可能な場合)。
  • 変数の命名からコードベースの一般的なコード規約およびガイドラインまで、あらゆるもので一貫性を達成するようにしください。
  • テスト対象のシステムを取得します。私の意見では、これはこのような大きなレガシーシステムにとって非常に重要です。テストケースを使用して既存の動作を文書化します。動作が奇妙に感じるかどうかは関係ありません(通常、コードが特定の理由に見える理由、良いまたは悪い、またはその両方; Pの理由があります)。レガシーコードで効果的に作業するMichael Feathersは、このための優れたリソースです。

10

彼らは、問題を解決する最初のステップは、あなたが問題を持っていることを認めることだと言います。それを念頭に置いて、現在のコードベースである広大なもつれを示す依存関係グラフを生成することから始めます。依存関係図を生成するための良いツールですか?は数年前ですが、そのようなグラフの作成に役立つツールへのポインタが含まれています。ポイントを家に帰すために、可能な限り多くを示す1つの大きな大きな、いグラフを使用します。相互依存関係が多すぎて、Buckaroo Banzaiから一列に並ぶ可能性のある問題について話します。

あなたはあなたが望むすべての解剖学をチェックすることができます、そして、通常の変化があるかもしれません、それがそれにすぐに来るとき、これは頭の中でずっと同じに見えます。いや、いや、いや、それに引っ張らないでください。あなたはそれが何に付けられているのか決してわかりません。

そこから、混乱を正すために開始する計画を紹介します。コードを可能な限り自己完結型のモジュールに分割します。それを行う方法についての提案を受け入れてください-あなたが話している人々はあなたよりもコードの歴史と機能をよく知っています。ただし、目標は、1つの大きな問題を取り上げ、それをいくつかの小さな問題に変換して、優先順位を付けてクリーンアップを開始することです。

注目すべき点:

  • モジュール間にクリーンなインターフェイスを作成し、それらの使用を開始します。古いコードは、必然的に、しばらくの間これらの素敵な新しいインターフェースを使用し続けないかもしれません-それがあなたが解決し始めている問題です。ただし、今後は新しいインターフェイスのみを使用することに全員が同意するようにしてください。インターフェースにないものが必要な場合は、インターフェースを修正し、それらを回避しないでください。

  • 同じ機能が繰り返されている場合を探します。統一に向けて働きます。

  • これらの変更は、人生をより簡単にすることを目的としており、難しくはないことを時々思い出してください。移行は苦痛を伴う場合がありますが、それは良い目的のためであり、全員がより多く参加すればするほど、利益は速くなります。


1
@kmote彼らは、彼らが助けを必要とし、より良いことをしたいことを認識していなければ、あなたを雇うことはなかっただろう。ハードの部分は、彼らはあなたの仕事は、問題(複数可)を修正するためではない、それは助けることだということを覚えて助けすることができる彼らは問題(複数可)を修正します。Buckaroo Banzaiは、特定の年齢の科学的なタイプにかなり人気があります。おそらく、物事を軽くするのに役立つでしょう。
カレブ

9

Gensym G2を少し調べた後、この問題にアプローチする方法は、コードベースがどれだけこのように見えるかに大きく依存するように見えます。

ここに画像の説明を入力してください

またはこれ:

ここに画像の説明を入力してください

これに対して、99のビールの提供

beer-bottles()

i:integer =99;
j:integer;
constant:integer =-1;

begin
for i=99 down to 1
    do
    j = (i+constant);
        if (i=1) then begin
            post"[i] bottle of beer on the wall";
            post" [i] bottle of beer";
            post" Take one down and pass it around ";
            post" No bottle of beer on the wall"; 
        end 
        else begin
            post"[i] bottles of beer on the wall";
            post" [i] bottles of beer";
            post" Take one down and pass it around ";
            if (i=2) then 
                post" [j] bottle of beer on the wall"
           else
                post" [j] bottles of beer on the wall"; 
           end
    end
end

後者の場合、事実上既知の量であるソースコードを使用しており、他の回答のいくつかはそれを扱うための非常に賢明なアドバイス提供します。

コードベースの大部分が後者である場合、またはかなり大きなチャンクである場合でも、非常に特殊化されているか、さらに悪いことに、リファクタリングできないコードがあるという興味深い問題が発生しますそれは取り外し可能かもしれませんが、適切に文書化されていない限り、一見そうではないように見える重要なコードを削除するかどうかはわかりません(スクラム操作の行に沿って何かを考えてください)。

ElYusubovが指摘したように、明らかにあなたの最優先事項はある種のバージョン管理をオンラインにすることですが、バージョン管理はバージョン8.3以降でサポートされているようです。G2はいくつかの異なる言語手法の組み合わせであるため、他の何かを見つけて動作させるのではなく、G2に付属のバージョン管理を使用するのが最も効果的であると思われます。

次に、リファクタリングを開始することを推奨する人もいますが、特にコードや視覚的な図を扱う場合は、コードに触れる前に、作業しているシステムを完全に理解しておくことを強くお勧めしますソフトウェアエンジニアリング方法論の正式なトレーニング(またはバックグラウンド)を持つ開発者。これにはいくつかの理由がありますが、最も明白な理由は、潜在的に100人年以上の仕事が投入されているアプリケーションを使用していることです。そこにドキュメントがあります。システムがどの産業に展開されているかは言わなかったので、私がG2について読んでいるものに基づいて、それはおそらく生命の安全にも影響を与える可能性さえあるミッションクリティカルなアプリケーションであると仮定することは安全であると思われます。したがって、何をしているかを正確に理解することは非常に重要です。文書化されていないコードがあり、チームの他のメンバーと共同で作業して、人々がコードの実行内容を確認できるように文書化されていることを確認します。

次に、できる限り多くのコードベースと視覚的な図をユニットテストでラップし始めます。G2でこれを行う方法については、ある程度の無知を認めなければなりませんが、これを適切に行うには、独自のテストフレームワークを作成する価値があります。また、チームの他のメンバーを紹介して、コードの品質に関係するより厳格なエンジニアリングの実践に慣れさせる理想的な時期でもあります(つまり、すべてのコードに単体テストとドキュメントが必要です)。

かなりの量のコードで単体テストを実施したら、haylemが提案するような方法でリファクタリングにアプローチできます。ただし、エキスパートシステムを開発するためのものであり、リファクタリングは困難な戦いになる可能性があることに注意してください。これは実際には、非常に一般的なコードを記述しないことがあると言われる環境があります。

最後に、他のチームメンバーの発言に細心の注意を払ってください。コードと図の品質が最高ではないからといって、必ずしも彼らに悪い影響を与えるわけではありません。最終的には、当分の間、彼らはアプリケーションが何をするのかをあなたよりもよく知っている可能性が高いので、抜本的な変更を行う前に座って、それが何をするのかを理解することは非常に重要です。


1
@haylem-わからない。200,000LOCに加えて、アプリケーションにn個のフロー図とチャートがある可能性があります。そのため、200,000 LOCはアプリケーションの複雑さを著しく過小評価している可能性があります。
rjzii

9

通常、前もって聞いた苦情は重要な問題とは関係ありません。結局のところ、ソフトウェアプロジェクトでこれらの苦情を聞くのはまったく正常です。

コードを理解するのは難しいですか?小切手。大規模なコードベース?小切手。

本当の問題は、人々が去り、新しい人が組織に加わると、典型的な見当識障害があることです。さらに、非現実的な期待とコード品質の問題があります。

ここに私が順番に取り組むものがあります:

  1. サーバーとローカルバージョンの両方のバックアップ
  2. バグトラッカーを設定する
  3. バージョン管理システムをセットアップする
  4. FAQ / Wikiのセットアップ
  5. すべての科学者/プログラマーの最初の報告会
    • 80/20ルールを思い出させます。バグの20%が問題の80%を担当しています。
    • 最大の問題に焦点を合わせ、機能強化のリクエストなどをオフにしてください。
    • ここでの目的は、大きなリストで人々を怖がらせることではなく、達成可能な小さな勝利のリストです。結局のところ、あなたもあなたの価値を証明する必要があります。
  6. ビルドシステムをセットアップする
    • 信頼できるビルドの取得に取り掛かります(これには時間がかかる場合があります)
    • すべてのプロジェクトを識別して名前を付ける
    • 循環依存関係を識別する
    • いくつかのオープンソースプロジェクトからバイナリがある場合は、ソースを取得してください
  7. API、サービスなど、G2コードをモジュール化する方法を特定する
  8. G2コードをテスト、文書化する方法を特定します。
  9. コードレビューシステムをセットアップする
  10. 二次報告
  11. 優れたプログラマのクラックチームを特定し、彼らと協力してモジュールをラップします。
  12. コミュニケーションとドキュメントを改善するために、この段階でコードレビューがあります。この段階では簡単にしてください。プロセスの問題を整理します。
  13. システムを他のプログラマーに展開します。クラックチームのメンバーを残りのピアメンターにしましょう。ここではスケーリングが問題であることを忘れないでください。あなたは事実上管理の役割にあります。

9

このような質問は、Software Carpentryプロジェクトが存在する全体の理由です。

過去14年間、私たちは科学者とエンジニアに基本的なソフトウェア開発スキルを教えてきました:バージョン管理、テスト、コードのモジュール化方法など。私たちのすべての資料は、Creative Commonsライセンスの下で無料で利用できます。また、人々が始めるのを助けるために、毎年2ダースの無料の2日間のワークショップを開催しています。

それに基づいて、私は最高の出発点はおそらくロバート・グラスの優れた(短い)本のソフトウェア工学の事実と誤りです:その証拠に基づいたアプローチは、科学者に良いプログラミング実践について彼らに伝えていることを確信させる良い方法です単なる意見以上のもの。
特定のプラクティスに関しては、人々が採用することを最も喜んでいる2つは、バージョン管理と単体テストです。それらが配置されると、Michael Feathersが「レガシーコードを効果的に使用する」で説明しているような系統的なリファクタリングに取り組むことができますThe Pragmatic Programmer(多くの
勧め、初心者が練習するのは難しい)をお勧めしなくなり、McConnellのコードは完成したと思う 開始するには多すぎます(基本を習得したら、6か月または1年で提供するのは素晴らしいことですが)。

また、Paul Duboisの優れた論文「科学プログラムの正確性を維持する」(2005年5月から6月にかけての科学とエンジニアリングのコンピューティング)をお勧めします。仕方。


興味深い提案。確認してみます。(注:Dubois論文のリンク切れ)
-kmote

7

まず、状況をクリアする必要があると思います。彼らはあなたに何を望んでいますか?

  • 古代言語を学ぶことを望んでいることはほとんどありません。これは今では行き止まりのように思えるからです。現在の科学者が辞めるか、パッチを適用したコードがますます失敗します。
  • 科学者(またはその一部)は、新しい言語と多くのプログラミングパラダイムを学ぶ準備ができていますか?それとも、長期的にプログラミングと科学活動を分離したいのでしょうか。必要に応じてプログラマーをもう少し増やしたいのでしょうか。これは、合理的で効率的な専門知識の分離のようです。

ここでの中心的な要件は「システムに知識を保存する」ことだと思うので、あなたはそれを調べて発掘しなければなりません!

最初のタスクは、ドキュメントを書くことです。

既存のシステムを使用して、これが新しいタスクであるかのように構造と要件を分析します。最初に教えるのではなく尋ねるので、彼らは喜んでいます-そして、あなたはすぐに十分ですが、プログラマーの観点からより組織化された背景知識を得るでしょう:「ここで何が起こっているのですか?」ドキュメント(システムの静的構造、ワークフロー、コンポーネント、問題)はすぐに価値があり、おそらくあなたよりも関連性の高い情報が表示されます(一部の人は "AHA!"を持っているので、すぐにコードの修正を開始できます) )...

その後、彼らはどこに行きたいのか尋ね始める必要がありますか?

G2から離れる準備ができている場合、どのシステム(プラットフォーム、言語、インターフェース、一般的な構造)を見たいですか?可能な場合はシステムの外部ラッパーを作成し、ターゲット構造を保持しますが、元のコンポーネントは保持します。そのため、このターゲット環境で新しいコンポーネントを実装できるようなフレームワークをゆっくり開始します。コアサービス(永続的なデータ接続と「ツールキット」:コア計算、描画、...ライブラリ)を見つける必要があるため、新しいプラットフォームと言語で使い慣れた環境を提供します。それら:古いコードを1つずつ取り出し、新しい環境で再実装(およびクリーンアップ!)します。準備ができたら、彼らは新しい言語を知っています。サービス層(ほとんどはあなたが作成した、申し訳ありません)は新しいコンポーネントをホストする準備ができています。

それらが移動しない場合は、G2を学習し、そこにモジュールフレームワークを作成する必要があります。モジュールフレームワークには、コンポーネントを(クリーニングを使用して)移動する必要があります。とにかく、言語はデータとアルゴリズムツリーのシリアル化にすぎません...

ドキュメントの分析と作成中に、GoFデザインパターンを読んで使用し、宣伝してください!:-)

...私の2セント


私はステップ1が彼らがあなたから望むものを解決することであることに同意します、しかし、次のステップはそれをすることであるべきです、そして、次のステップが情勢の状態を文書化することでないならば、それをあまりしません。あなたがそうするならば、彼らはそれを感謝しません。
ビル

@bill:質問は「今後の道に何が必要かについて意見の一致はありません」と言っています。彼らは知りません!「どうにかして」保存しなければならないシステムに関する真の洞察のない深刻な議論があると思います。この状況でのプログラマーの仕事は明らかです(少なくとも私には)。技術的な観点から正しい分析を行い、合理的な決定を下すのを助けます。
ロランドケドヴス

もちろん、彼らは自分が何を望んでいるかわからない、それが「解決」部分であり、これは単に文書やパターンのようなものを選んで、こういうことをすることとは異なる。それらは良いことですが、それはグループを巻き込むプロセスでなければなりません。最初に価値が見られないものから始めると、買収に苦労することになります。
ビル

@ビル:そのドキュメントの内容と作成について書いたのとまったく同じように言っていると思います...
;

4

私は同僚のためにロバート・マーティンのSOLID原則に関する一連のプレゼンテーションを行ったところです。これらの原則がどれほどG2に翻訳されているかはわかりませんが、5〜7の基本的なコアを探しているので、これらは最初から十分に確立されたセットのようです。7に切り上げたい場合は、DRYから始めてFail-Fastをスローできます。


1
素晴らしい提案!この無料の電子書籍の概要とともに、この素晴らしい概要を思い出しました。
kmote

3

唯一の運用上の問題は、変更管理の問題のように聞こえます。それが事実であり、そうでなければソフトウェアがそれを目的として実行する場合、私が与える最初のアドバイスは、あまりにも早くやりすぎたいという衝動に抵抗することです。

ソース管理、リファクタリング、より訓練された開発者はすべて良い提案ですが、この種の問題にゆっくりと対処し、制御された変更を加えることを十分に強調することができなければ初めてです。

混乱を切り抜けたいという衝動はときどき大きくなりますが、それを十分にリバースエンジニアリングして、交換バージョンを適切にテストできることがわかるまで、非常に注意する必要があります。


3

このような状況で作業するための最も重要な原則は次のとおりです。

  1. 我慢して。掘るのに20年かかった穴は、数週間で埋められません。

  2. ポジティブになれ。文句や不平を言う誘惑に抵抗してください。

  3. 実用的である。1日で達成できる前向きな変化を見て、今日それをしてください。まだバージョン管理システムを持っていますか?それを実装し、人々を訓練します。次に、テスト(ユニットテストなど)を自動化できるかどうかを確認します。リンス。繰り返す。

  4. モデルになりましょう。アジャイルであることによって、アジャイルがどのように機能するかを人々に示します(単に伝えるだけではありません)。上記の最初の3つのポイントは、優れたアジャイルガイの前身であるグッドガイになるための鍵です。私の意見では、賞賛に値する開発者である人々は、頭がいいだけでなく、優秀でモデルの従業員や同僚でもあります。

  5. テリトリーをマップします。巨大なレガシーコードベースをマッピングする手法があります。リポジトリのクローンを作成し、作業コピーを作成してから、何かを変更して、他に何が壊れるかを確認します。カップリングを調査することにより(グローバル状態、壊れたAPI、一貫したAPIの欠如、またはプログラムに対する抽象化またはインターフェースの欠如)、物事を変えると壊れるコードを読むことで、私は気まずさを発見し、チームの他のメンバーからの洞察(5年前にBoss Xが要求していたため、機能しなかったと付け加えました!)時間が経つにつれて、領土の精神的な地図を取得します。それがどれだけ大きいかがわかれば、マップを作成して家に帰るのに十分なことがわかります。巨大なコードベースの領域をマップし、チームの技術的知識を構築するように他の人を奨励します。一部の人々は「ドキュメント」にalkしています 機敏ではないからです。なんでも。私も科学的な環境で働いており、ドキュメントは私にとって重要です。アジャイルマニフェストは気の毒になります。

  6. 小さなアプリを作成します。従来のコードベースで作業するとき、私はパルプに着手します。小さなヘルパーアプリを作成することで、精神を取り戻します。これらのアプリは、巨大なG2コードベースを読んで理解し、修正するのに役立つでしょう。環境での作業に役立つミニIDEまたはパーサーツールを作成できます。メタプログラミングとツールの構築が、レガシーコードベースがあなたに課す巨大なデッドロックから抜け出すのを助けるだけでなく、あなたの脳があなたのG2言語によって制限なく飛ぶ能力を与える多くの場合があります。ツールとヘルパーは、最速で最高の言語で作成できます。私にとって、これらの言語にはPythonとDelphiが含まれます。あなたがPerlの男である場合、または実際にC ++またはC#でのプログラミングが好きな場合は、その言語でヘルパーツールを記述してください。


3
  1. リビジョン管理:元に戻すことができるという利点をドメインの専門家に示し、誰が何を変更したかなどを確認します(これは、すべてのバイナリファイルではより困難ですが、コンテンツが実際にコードである場合、確かに何らかのG2から差分を有効にできるテキストコンバーター。)

  2. 継続的インテグレーションとテスト:エンドツーエンドテスト(既にどこかに入力と期待される出力がある必要があるため)の作成に関与するドメインエキスパートを取得しますほぼすべての機能とユースケースをカバーしています。

  3. 一般的なコードを再利用可能なルーチンとコンポーネントにリファクタリングします。リビジョン管理のないソフトウェア以外の人は、おそらく一度に数百行をコピーアンドペーストしてルーチンを作成します。それらを見つけてリファクタリングし、すべてのテストに合格し、コードが短くなったことを示します。これは、そのアーキテクチャを学習するのにも役立ちます。ハードなアーキテクチャ上の決定を開始しなければならない時までに幸運なら、100KLOCにまで下がるかもしれません。

政治的に、このプロセスで古いタイマーから抵抗を見つけた場合は、コンサルタントを雇って、優れたソフトウェアの方法論について話します。意見が一致する良いものを見つけて、ドメインの専門家が同意しなくても経営陣にコンサルタントの必要性を買い取らせるようにしてください。(彼らは同意する必要があります-結局のところ、彼らはあなたを雇ったので、明らかに彼らはソフトウェアエンジニアリングの専門知識が必要であることを理解しています。)これはもちろん無駄なトリックです。彼らは何かをする必要がある、彼らはそれを無視するかもしれません。しかし、経営陣がコンサルタントに5000ドルを支払い、彼らが何をする必要があるかを伝えれば、彼らはそれにより多くの信頼を置くでしょう。ボーナスポイント:コンサルタントに、あなたが本当に望んでいる2倍の変化を助言してもらうと、あなたは「良い人」になり、ドメインの専門家の味方になり、コンサルタントが提案した半分の変化に妥協します。


3

「プログラム自体は、複雑な化学処理プラントの物理モデルです...」

「G2はコードではなく、いくつかの威厳あるGUIによって書かれた自動化されたコードなので...」– Erik Reppen

あなたのソフトウェアの主な目標が、複雑な化学プラントまたはその一部をシミュレートすること(おそらく最適化、パラメータ推定の実行)であると仮定した場合...かなり異なる提案を投げ出したいと思います。

高度な数学的モデリング言語を使用して、手作業でコーディングされたソフトウェアから本質的な数学的モデルであるエッセンスを抽出することを検討するとよいでしょう。

モデリング言語が行うことは、問題の説明を問題の解決に使用されるアルゴリズムから切り離すことです。これらのアルゴリズムは一般に、特定のクラス(化学プロセスなど)のほとんどのシミュレーション/最適化に適用できます。この場合、それらを実際に再発明して社内で保守することはできません。

業界で広く使用されている3つの商用パッケージは、gPROMS、Aspen Custom Modeller、および(モデルに空間ドメインに沿って分布する現象が含まれていない場合)DymolaなどのModelicaベースのソフトウェアパッケージです。

これらのパッケージはすべて、何らかの方法で「拡張」をサポートしているため、カスタムプログラミングを必要とするモデルの一部がある場合、それらをオブジェクト(たとえば.DLL)にカプセル化して、型。一方、モデルの大部分は簡潔であり、科学者が直接読みやすい形式で記述されています。これは、会社の知識とIPを取得するためのはるかに優れた方法です。

これらのプログラムのほとんどは、外部から呼び出されることにより、「小さな起動」とモノリシックコードの小さな部分(サブモデル)をその形式に移植できるようにする必要があります。これは、稼働中のシステムを維持し、一度に1つずつ検証するための良い方法です。

完全な免責事項:私はgPROMSの背後にある会社で8年間ソフトウェアエンジニアとして働いていました。その間、私は小さくてきちんと始まり、いくつかの巧妙なソリューションまたはアルゴリズムを実装していたカスタムソフトウェア(例:学界からのもの)の例を見て(そして時々組み込まれていました)それをきれいに保つソフトウェアエンジニア。(私は学際的なチームの大ファンです。)

だから、ある経験から言えば、ソフトウェア開発の初期の段階で不十分だった特定のキーの選択(言語やキーライブラリなど)は、長い間存在し続け、痛みを引き起こす傾向があります。それらの周りのソフトウェア。ここで何年も純粋なコードクリーニングに直面しているように思えます。(数字を使うのをためらっていますが、10年以上も考えています。G2からEclipse / Javaクイックスマートなどの優れた自動リファクタリングツールをサポートするものにコードを移植できない場合はさらに多くのことを考えています。)

私のデフォルトの状態は「リファクタリングして稼働中のシステムを維持する」ことですが、問題が「大きくなりすぎ」ると、より根本的な変更/再書き込みが全体的に速くなると思います。(そして、より新しい技術へのジャンプのような追加の利点をもたらす可能性があります。)新しいソフトウェアプラットフォームへの移植の経験があると言いますが、私が収集したことから、数学モデリングパッケージへの移植によりさらに劇的になります。

ある程度の見方をすると、サイズの縮小に非常に驚かれるかもしれません。たとえば、200,000 LoCは、実際には5,000行の方程式のように表すことができます(ここでは推測できますが、ビジネスの友人から実際の証言を試してもらうことができます)。さらに、Cのようなもので記述されたいくつかの比較的小さな機能モジュール(たとえば、物理的特性の計算-化学プロセスによっては市販のパッケージが存在する場合もあります)。これは、文字通りアルゴリズムソリューションコードを破棄し、数学的なソルバーの汎用「スタック」に苦労させるためです。シミュレーションを実行すると、コードを変更せずにプロセスを最適化するなど、シミュレーションでさらに多くのことができます。

最後に、さまざまな数学モデル(およびアルゴリズム)の唯一の信頼できるドキュメントがコード自体である場合、科学者や元の著者の助けを借りて、できるだけ早くそれらのモデルを抽出するのに役立つでしょう。それらのいくつかは移動したかもしれません。彼らは、数学モデリング言語がそれらのモデルをキャプチャするための非常に自然な方法であることに気付くはずです-彼らは(ショック)ホラーを楽しむ(書き換える)ことさえできます。


最後に、私の答えは見当違いかもしれないので、ここで既に参照されている良い本のリストにもう1冊の本を追加したいと思います。RobertMartinによるClean Codeです。学習と適用は簡単ですが、会社で新しいコードを開発している人々に世界の違いをもたらす可能性のある、シンプルで正当なヒントが満載です。


2

私は次のものを投げ捨てます:

  1. ここにはプログラマーが一人います。ねじ込み政治。彼らは彼らの貿易を知っています。あなたはあなたのものを知っています。あなたがそれに腹を立てる必要がある場合でも、その領域をマークします。彼らは科学者です。彼らはそのようなことを尊重することができますし、彼らはほとんど常に自分自身で同じことをしているので、そうすべきです。できる限りの手段で、今すぐ境界に印を付けてください。これは私が修正するものです。これは私が責任を負えないことです。

  2. 科学者はアルゴリズムを作成/テストします。あなたがコアコードに変換するために誰もが同意できる1〜3言語で独自のアルゴリズムを書くことができる科学者。それは彼らのものをテストします。それを超えて、彼らはあなたが重要な科学的なものと、彼らが建築のために何をしたのかを分離するのを助けなければならないでしょう。コードベースはホースされています。行う必要があるだろう多くのスラッシュとバーンがあります。最善を尽くすことができるように、彼らが最もよく知っているものを使用する作業バージョンを提供するオプションを提供します。彼らが責任を負うが、あなたが働くことができるボックスに彼らの知識を入れてください。

  3. できれば、イベント駆動型の言語とファーストクラスの関数を使用します。他のすべてが失敗した場合、イベントをトリガーするか、実際に意味のあるインターフェイスと状態メカニズムを使用してオブジェクトにコールバックを投げることは、血まみれの意味をまったく持たないコードでひざまで深くしている場合、非常に時間を節約できます意志。科学者はPythonが好きなようです。低レベルの数学を集中的に使用するCの要素をそれに結び付けるのは難しくありません。言ってるだけ'

  4. これまたは同様の問題を解決した人を探してください。研究に真剣に時間をかけましょう。これらの人は誰かからG2について聞いた。

  5. デザインパターン。アダプター。それらを使用します。このような状況では、たくさん使いましょう。

  6. 科学でできることを学びましょう。知識があればあるほど、コードの意図をより適切に判断できます。


13
科学者と真っ向からやり取りしないでください。絶対に。彼らはあなたの人生を生き地獄にします。:)
ヘイレム

2

最初に分析を行います。

何を教えるかを決める前に、分析を行います。最大の問題点がどこにあるかを把握します。それらを使用して、実行するプラクティスに優先順位を付けます。

一度にいくつかの変更のみを導入します(同様の状況で、2週間ごとに2-3の練習を行いました)

SDLCのプログラミングスタイルの変更レベルに応じて、プラクティスを3に制限します。彼らが彼らに慣れ始めるまで(私は彼らが新しいアプローチを学ぶという考えにもっと慣れるので、私は1〜2週間ごとに1つの新しい変化を導入することをプッシュするでしょう)。成功の基準が何であるかを特定することもお勧めします。練習が達成すべきこと(たとえチームの士気のような柔らかい目標であっても)。そうすれば、効果があるかどうかを示すことができます。

  • 変更の数を制限する理由

これらの人々がより優れたプログラマーになりたいと思っており、学習にオープンであると仮定したとしても、人々が新しい概念を学び、それらを適用することができる量と速度には限界があります。特に、CSの基盤を持っていないか、以前にソフトウェア開発ライフサイクルに参加したことがある場合。

毎週のまとめ会議を追加して、プラクティスがそれらにどのように影響したかを議論します。

この会議は、何がうまくいったのか、何が必要なのかを議論するために使用されるべきです。声を出して共同作業を行えるようにします。彼らが抱えている問題に対処し、今後の変更をプレビューするための計画を話し合います。プラクティスとその応用に焦点を当てた会議を維持してください。彼らが実践を適用することから見始めるべき利益について少し伝道してください。

特定のプラクティスが優先されます。

バージョン管理システム(IMO)を適切に使用することは、他のすべてに勝ります。モジュール化、結合/結合、機能/バグチケットトラッキングのレッスンが間近です。

動作しないプラクティスを削除します。

うまくいかないプラクティスを取り除くことを恐れないでください。コストが高くてもほとんど利益がない場合は、この慣行を削除してください。

改善はプロセスです。

持続的で一貫した改善がプロセスであることを伝えます。最大の問題点を特定し、解決策を適用し、待機/コーチしてから繰り返します。ある程度の勢いが上がるまで、最初は苦痛に感じるでしょう。来ている改善と既に成功している改善に全員が集中できるようにしてください。


0

あなたが持っている最初のステップは、新しいソフトウェア方法論に投資する必要性をチームに売ることであるように思えます。あなたの声明によると、チームにはコンセンサスはなく、コードの遅い「アップグレード」で先に進むことができるようにする必要があります。

私は(できれば)個人的に学んだハードレッスンを取り、ソフトウェア業界の問題の解決策としてあなたが望むそれぞれの重要な概念を紹介します。

たとえば、2人の開発者が異なるコピーを持っていて、テストされていないハイブリッドリリースを展開することになりました->バージョン管理、分岐、およびテストを導入します。

誰かが理解していなかった数行のコードを削除し、停止を引き起こした-> DDDを導入。

ハードレッスンが十分に詳細に共有されていない場合は、この規律が守られなかったときに物事がどのようにうまくいかなかったかの例を示してください。


0

すでに何度も述べたように、ソースコード管理はステップ1です。あなたが働く人々はプロの開発者ではないかもしれませんが、彼らは多くの企業やアジャイルなジャンボジャンボに反応しません。彼らは低レベルのコードモンキーでもないし、「あなたのやり方」で物事を強制することでそれらをそのように処理しようとしても飛ぶことはありません。

あなたはそこにあるものを調査する必要があります。ソースコード管理を使用していない場合は、適切なバージョンのコード(可能な場合)とすべての可能な成果物を特定するだけで長い時間がかかります。次に、同僚にソースコード管理の使用方法を教え、時間をかける価値があることを同僚に納得させる作業を行います。メリットから始めましょう!

あなたがそれをしている間に、他の垂れ下がった果物を見つけて、それらの問題を修正してください。

何よりも、彼らが言わなければならないことに耳を傾け、状況の改善に取り組みます。彼らがすることにあなたのスタンプを置こうとすることを心配しないでください。

幸運を!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.