最近、ソフトウェアエンジニア/科学者/アナリストとして政府機関に参加しました。以前は、ソフトウェア業界で働いていました-前の仕事で3年間のソフトウェアエンジニアリングの経験を積んでいます(計算科学/科学計算で約7年になる)。私の現在の仕事は、従来の科学プログラムを近代化するための戦略を考え出すことです。
近代化する科学プログラムは、基本的に数学的最適化を行う大規模なレガシー計算システムです。開発は1990年代に始まり、残念ながらベストプラクティスに追いついていません。それは科学者やアナリストによって書かれたものです。
システムの主要コンポーネントは、最適化を行うFortranベースのプログラム(90から始まるさまざまなバージョン、いくつかの新しいバージョンが組み込まれ、2018コンパイラーでコンパイル)です。このプログラムは、400K行のFortranコード、20K行のシェルスクリプト、および60K行の外部数学ソルバーコードで構成されています。テストスイートがないため、レガシーラベル。プログラムは、最適化における特定の物理コンポーネントの動作を記述する12個のモジュールと考えることができます。 Fortranプログラムの一般的なフローは、main
ルーチンで説明されています。このルーチンでは、これらの数十のモジュールが順次呼び出されます。 main
ルーチンは、他のいくつかのデータオーケストレーションとI/Oも行います。おそらく自社開発のFortranラッパーを介して、市販製品および最適化ソルバーへのいくつかのインターフェースがあります。 IMOの最大の問題の1つは、グローバル変数の使用です。main
とモジュールの両方がこれらのグローバルにアクセスできるため、どこからでも状態を変更できます( 私の特定の質問)を参照 =)。
主にシェルスクリプトとして記述された、メインのFortranプログラムを管理するサブシステムまたはユーティリティ用の独自のコードがたくさんあります。これらのサブシステムは次のとおりです。
これらは、Fortranプログラムとその入出力を操作するために必要な主要なサブシステムまたはユーティリティですが、サーバースペース管理やライセンス管理などの長期的な処理を行う他のFortranプログラムやシェルスクリプトが多数あります。
私の直属のチームは、Fortranコードの実行と他のモジュールとの統合を担当しています(そのため、Fortranのすべての40万行が私たちの範囲にあるわけではなく、たぶん10-20%です。残りは、12のモジュールを担当する他のグループと一緒にいます。私たちは彼らのコードを制御できないため、組織の苦痛)。私のチームは、私と別のソフトウェア開発者で構成されており、どちらも科学計算から転換した中堅レベルのソフトウェア開発者です。ソフトウェアとCSの伝統的なバックグラウンドを持つジュニアソフトウェア開発者が間もなく参加します。私たちの上級ソフトウェア開発者(システム全体の元々の開発者の1人)は1か月で退職します。現在、代わりの製品を探しているところです。
私の質問は:考慮すべき近代化計画/戦略のコンポーネントとシーケンスは何ですか?近代化は基本的に、レガシーから技術的(たとえば、アーキテクチャ、フレームワーク)と組織的(たとえば、開発のためのアジャイルプロセス管理)の両方の、より近代的なプロセス。
現在、大まかに言って、私の計画は次のとおりです。
私は同様のトピックのいくつかの素晴らしい議論を見てきました:
しかし、これらの質問と回答のいくつかはほぼ10年前のものであることに注意してください。したがって、より良いアプローチが利用できるかどうか疑問に思います。また、私は重いOOPビジネスアプリケーションではなく、手続き型の科学計算環境を扱っているので、おそらく上記のStackexchangeリンクで言及されている原則は、引き継がれません。また、上級ソフトウェアエンジニアではないので、検索や質問の定式化で正しい用語を使用しているかどうかはわかりません。システムにスクリプトやユーティリティが複雑になっているため、Fortranの移植やリファクタリングだけでなく、このような状況になります。とユニークな問題。
ありがとう!
真剣に言って、このコードは30年間機能しています。それはさらに30のために働きます。
あなたはそれを「近代化」し、バグを追加するだけで人生を過ごすことができます。
新しいビットを好きなように書くことができるように、ビットをオフにしてコンポーネント化を開始します。
パフォーマンスの測定可能な改善、バグの修正、新機能に集中してください。独自の目的でリファクタリングを試みるのではなく、作業しながらコードを徐々に改善してください。