web-dev-qa-db-ja.com

大規模なレガシーFortranプログラムを近代化する方法は?

問題の背景

最近、ソフトウェアエンジニア/科学者/アナリストとして政府機関に参加しました。以前は、ソフトウェア業界で働いていました-前の仕事で3年間のソフトウェアエンジニアリングの経験を積んでいます(計算科学/科学計算で約7年になる)。私の現在の仕事は、従来の科学プログラムを近代化するための戦略を考え出すことです。

近代化する科学プログラムは、基本的に数学的最適化を行う大規模なレガシー計算システムです。開発は1990年代に始まり、残念ながらベストプラクティスに追いついていません。それは科学者やアナリストによって書かれたものです。

システムの主要コンポーネントは、最適化を行うFortranベースのプログラム(90から始まるさまざまなバージョン、いくつかの新しいバージョンが組み込まれ、2018コンパイラーでコンパイル)です。このプログラムは、400K行のFortranコード、20K行のシェルスクリプト、および60K行の外部数学ソルバーコードで構成されています。テストスイートがないため、レガシーラベル。プログラムは、最適化における特定の物理コンポーネントの動作を記述する12個のモジュールと考えることができます。 Fortranプログラムの一般的なフローは、mainルーチンで説明されています。このルーチンでは、これらの数十のモジュールが順次呼び出されます。 mainルーチンは、他のいくつかのデータオーケストレーションとI/Oも行います。おそらく自社開発のFortranラッパーを介して、市販製品および最適化ソルバーへのいくつかのインターフェースがあります。 IMOの最大の問題の1つは、グローバル変数の使用です。mainとモジュールの両方がこれらのグローバルにアクセスできるため、どこからでも状態を変更できます( 私の特定の質問)を参照 =)。

主にシェルスクリプトとして記述された、メインのFortranプログラムを管理するサブシステムまたはユーティリティ用の独自のコードがたくさんあります。これらのサブシステムは次のとおりです。

  • 内部prem Windowsサーバー上のメインFortranプログラムの実行を管理するキューシステム
  • fortran UNFファイルをCSVおよびExcel形式に変換するポストプロセッサー
  • fortranプログラムの結果をプロットするVisual Basicで記述されたカスタム視覚化パッケージ
  • rCS VCSのラッパーとしてのバージョン管理ユーティリティ
  • fortranコンパイルをラップするコンパイラユーティリティ。

これらは、Fortranプログラムとその入出力を操作するために必要な主要なサブシステムまたはユーティリティですが、サーバースペース管理やライセンス管理などの長期的な処理を行う他のFortranプログラムやシェルスクリプトが多数あります。

私の直属のチームは、Fortranコードの実行と他のモジュールとの統合を担当しています(そのため、Fortranのすべての40万行が私たちの範囲にあるわけではなく、たぶん10-20%です。残りは、12のモジュールを担当する他のグループと一緒にいます。私たちは彼らのコードを制御できないため、組織の苦痛)。私のチームは、私と別のソフトウェア開発者で構成されており、どちらも科学計算から転換した中堅レベルのソフトウェア開発者です。ソフトウェアとCSの伝統的なバックグラウンドを持つジュニアソフトウェア開発者が間もなく参加します。私たちの上級ソフトウェア開発者(システム全体の元々の開発者の1人)は1か月で退職します。現在、代わりの製品を探しているところです。

問題

私の質問は:考慮すべき近代化計画/戦略のコンポーネントとシーケンスは何ですか?近代化は基本的に、レガシーから技術的(たとえば、アーキテクチャ、フレームワーク)と組織的(たとえば、開発のためのアジャイルプロセス管理)の両方の、より近代的なプロセス。

提案された戦略

現在、大まかに言って、私の計画は次のとおりです。

  1. メインのFortranプログラムの一部ではないシステムの自作コードの範囲を評価します。
  2. これらの各自製ソリューションをベストプラクティスのオープンソースソリューションに置き換えて、可能な限りコードを最小限に抑えます;
    • 現在の順序は最新のVCS(Git/Gitlab)、次にキューイングシステム、そしてvizパッケージですが、順序はサブシステムごとに存在するコードの量によって決まります。
  3. コードの残りの部分-できればメインのFortranプログラムだけで、オープンソースソリューションを見つけることができない重要なサブシステムではない-特性テストで現在の動作をキャプチャします。
  4. リファクタリング(Fortranの更新、FortranからPythonへの数値処理を行わないすべての機能の移植など)。テストに合格し、繰り返します。
  5. コンテナー化にDockerを使用して、クラウドコンピューティングを有効にする(ベンダーロックインを回避する)ためにアーキテクチャを更新することにより、コードを「未来化」します。

研究

私は同様のトピックのいくつかの素晴らしい議論を見てきました:

しかし、これらの質問と回答のいくつかはほぼ10年前のものであることに注意してください。したがって、より良いアプローチが利用できるかどうか疑問に思います。また、私は重いOOPビジネスアプリケーションではなく、手続き型の科学計算環境を扱っているので、おそらく上記のStackexchangeリンクで言及されている原則は、引き継がれません。また、上級ソフトウェアエンジニアではないので、検索や質問の定式化で正しい用語を使用しているかどうかはわかりません。システムにスクリプトやユーティリティが複雑になっているため、Fortranの移植やリファクタリングだけでなく、このような状況になります。とユニークな問題。

ありがとう!

3
ximiki

真剣に言って、このコードは30年間機能しています。それはさらに30のために働きます。

あなたはそれを「近代化」し、バグを追加するだけで人生を過ごすことができます。

新しいビットを好きなように書くことができるように、ビットをオフにしてコンポーネント化を開始します。

パフォーマンスの測定可能な改善、バグの修正、新機能に集中してください。独自の目的でリファクタリングを試みるのではなく、作業しながらコードを徐々に改善してください。

12
Ewan