ソフトウェアの正式な方法を学んだ場合、それはどれほど有用ですか?


17

プログラミングのための正式な方法(FM)の使用に関するトレーニングを受けている場合:

  • あなたはそれをどれほど便利に見つけましたか?
  • FMトレーニングには何が含まれていましたか(コース、本など)。
  • どのFMツールを使用していますか?
  • FMを使用しない場合と比べて、速度/品質の面でどのような利点がありますか?
  • FMでどのようなソフトウェアを作成しますか?
  • そして、FMを直接使用しない場合、少なくとも学ぶ価値はありましたか??

私はこのコミュニティで見られるようなFMに関する多くの経験/意見を聞きたいです。私はそれについて読み始めており、もっと知りたいです。

バックグラウンド

プログラミングとソフトウェア開発/エンジニアリングは、地球上の最新の人間のスキル/職業の一部です。そのため、当然のことながら、フィールドは未熟です。これは、通常遅れてエラーが発生しやすいコードとしてフィールドのメイン出力に表示されます 業界の未熟さは、平均的なコーダーとトップのコーダーの間の生産性の大きなマージン(少なくとも10:1)によっても示されます。そのような陰惨な事実は文献で十分にカバーされており、Steve McConnellのCode Completeなどの本で紹介されています。

エラーの根本的な原因(プログラミングの数学的厳密性の欠如)の1つに対処するために、ソフトウェア/ CSの主要人物(E.ダイクストラなど)によって正式な方法(FM)の使用が提案されています。たとえば、ダイクストラは、プログラムとその証明を一緒に開発する学生を提唱しました

FMは、米国に比べてヨーロッパのCSカリキュラムではるかに普及しているようです。しかし、過去数年間で、新しい「軽量」FMアプローチと合金のようなツールが注目を集めています。それでも、FMは業界で一般的な使用法とはほど遠いので、ここでその理由についてのフィードバックを期待しています。

更新

現在(2010年10月14日)、以下の6つの回答のうち、「現実の世界」でのFMの使用について明確に主張している人はいません。誰かができるかどうか、私は本当に興味があります。あるいは、FMは、学界(FMは未来です!)と産業(FMはほとんど役に立たない)の違いを実際に示しています。


現実世界の仕事で彼らのために非常に少数のユースケースがあるので、あなたの更新については、多分誰もが「現実世界」の仕事にFMの使用を主張していない
リチャード・

回答:


8

些細なことには絶対に役に立たない。

アロイに焦点を当てた「フォーマルメソッド」と呼ばれるコースがありました。どこでもそれを使用することはできません。LTSAを使用した同時実行モデリングに焦点を当てた別のクラスがありましたが、同様に役に立ちませんでした。

問題は、ソフトウェアのほとんどのバグと問題(少なくとも私の経験では)は、それらのツールの抽象化レベル以下で発生する複雑さに起因するということです。


共有してくれてありがとう。FMのトレーニングは、後の仕事に少なくとも役立ったと思いますか。たとえば、より明確に考えるのに役立ちましたか?か否か?
リミスト

@limist:私は本当にそうは思わない。つまり、私は少しAlloyが好きでしたが、私が考える方法を拡張するだけでも役に立たないと思います。
フィッシュトースター

2
これはまさに私が与えたであろう答えです。私が大学で受けた最も完全に冗長なクラスであり、私がこれまでに振り返って学んだことを嬉しく思ったことはありません。問題の根源は、フォーマル仕様が正しくモデル化するためにコードよりも複雑でなければならないことだと思うので、リモートで複雑なコードの場合、それはフォーマルなモデルを作成するという非常に骨の折れる作業です。ハードウェア設計や同様の取り消せない仕事以外の誰かがそれを望んでいる、あるいはできることを想像してはいけません。
グレナトロン

1
それは残念です。私は、あなたが合理的に完全なモデルを持っていることをテストするのに役立つかもしれないと想像していました。実際のバグはほとんどの場合モデルの下にあります(ミューテックスなどを台無しにします)が、モデル自体の欠陥を見つけるためにAlloyを使用することが有用だと思いました。(直観的には、証明アシスタントを使用しようとすることはあまり役に立たないようです。反例の方が役立つと思いますが、それは合金のようなものの領域にあるようです(理想的には、できると良いと思います同じシステムで両方にアプローチします。)
ブルーススティーブンス

7

CSP(Communicating Sequential Processes)のバックグラウンドがあります。ホーンを鳴らすのではなく、Timed CSPで修士論文を書きました。特に、正式なメソッドで記述された仕様を実行可能なC ++に「コンパイル」します。私は正式な方法の経験があると言えます。学位を取得して業界で仕事を得た後は、正式な方法をまったく使用していません。正式な方法はまだ理論的すぎて、業界に適用できません。正式な方法により、組み込みシステムの分野で実用的なアプリケーションがいくつか見つかりました。たとえば、NASAはプロジェクトで正式な方法を使用しています。正式な方法は、業界で広く採用されるにはほど遠いものと思われます。正式な方法でソフトウェア仕様を記述し、それを選択したフレームワークに「人間が解釈」することは、単に意味がありません。ユニットインテグレーションテストと統合テストは、コードの正確性を「検証」するのに非常に優れた機能を発揮しますが、プレーンイングリッシュとダイアグラムはそのためにより適切に機能します。おもう正式な方法はしばらく学界に残るでしょう


共有してくれてありがとう、これについて頻繁に繰り返されるフォローアップをお願いします。Q:FMのトレーニングは、後の仕事に少なくとも役立ちました。たとえば、より明確に考えるのに役立ちましたか。か否か?
リミスト

マスターおめでとうございます!
クリス

@limist:非常に優れた理論的経験だったと思いますが、業界ではほとんど実用的なアプリケーションが見つかりませんでした。
イソリック

4

状態図とペトリネットは、プロトコルとリアルタイムシステムのモデリングと分析に役立ちます。まず、ソリューションの設計を支援します。次に、非常に特殊な状況で刺激的なソフトウェアのテストケースを見つけるのに役立ちます。


4

正式な方法についての本をいくつか読んで、それを適用しました。私の即座の反応は、「うん、これらの本は、私が完璧な数学者である限り、優れたプログラマーになる方法を教えてくれる」というものでした。もう1つの弱点は、別の正式な記述との同等性しか証明できないことです。プログラムの正式な仕様を作成することは、プログラムを高水準言語で作成することと同等であり、かなり大きな仕様でバグを導入することを避ける方法はありません。

正式な方法を大規模に機能させたことはありません。それらは、何か小さくてトリッキーな正しいものを取得し、それらが正しいことを私に納得させるのに役立ちます。そのようにして、私はわずかに大きなビルディングブロックで作業でき、時にはもう少し作業を完了できます。

私が取り上げた、より一般的に役立つものの1つは、不変式の概念、つまり、常に真実であるプログラムとその状態に関するステートメントです。あなたが推論できるものはすべて良いです。

上記のように、私は完璧な数学者ではないので、私の証明には時々誤りが含まれます。ただし、私の経験では、これらはキャッチして修正しやすい大きな間抜けなミスになる傾向があります。


4

私は正式なプログラム分析の大学院課程を受講しました。そこでは、運用上のセマンティクスに焦点を当てました。seL4の取り組みに関する最終論文を作成し、彼らが使用した正式な方法をレビューしました。実用性に関する私の第一のポイントは、それが限界値であることでした。プログラムを作成するだけでなく、証明を作成する必要があります。ワオ。バグの2つのソース。1つだけではありません。さらに、実際のコードには膨大な量の制限がありました。I / O を含む物理コンピューターを正式に記述することは非常に困難です。


テープスタイルのI / Oを説明するのに刺すのを見たことがあります。著者は、ランダムアクセスファイルを正式に記述するための解決策がなく、それらを悪口で口説いて満足しました。
デビッドソーンリー

1
@David:これらのランダムアクセスファイル。悪いニュース。あなたはそれらを使いたくありません。=)
ポールネイサン

3

昨年、TLA +を独習し、それ以来ずっとTLA +を使用しています。これは、プロジェクトを開始するたびに最初に到達するツールの1つです。ほとんどの人が犯す間違いは、正式な方法がオールオアナッシングだと仮定していることです。正式な方法を使用していないか、完全な検証を行っているかのいずれかです。ただし、それらの間には、正式な仕様があります。ここでは、プロジェクトの抽象的な仕様が不変式を壊さないことを確認します。検証とは異なり、仕様は業界で使用するのに十分実用的です。

仕様言語は、プログラミング言語よりも表現力豊かです。たとえば、分散データストアの(非常に)シンプルなPlusCal仕様は次のとおりです。

process node \in 1..5 \* Nodes
variables online = TRUE,
          stored \in SUBSET data; \* Some set
begin 
  Transfer:
    either
      with node \in Nodes, datum \in stored do
        node.stored := node.stored \union {datum};
      end
    or \* crash
      online := FALSE;
    end either;
end process;

このスニペットは、5つのノードを同時に実行し、任意の順序で転送を実行することを指定しています。各転送は、任意のノードへの任意のデータです。さらに、特定の転送が失敗し、ノードがクラッシュする可能性があることを指定しました。また、TLA +モデルチェッカーでこれらすべての動作をシミュレートできます!そうすれば、順序、故障率などに関係なく、要件が維持されていることをテストできます。そういえば、いくつかの要件を追加しましょう。まず、データをオフラインノードに転送しないこと:

[][\A node \in Nodes: ~online => UNCHANGED node.stored]_vars

簡易バージョンでは、モデルチェッカーがエラー状態を検出します。「特定のデータが少なくとも1つのオンラインノードにある」ことも指定できます。

\A d \in data: \E n \in Nodes: n.online /\ d \in n.stored

これも失敗します。これらを単体テストでチェックしてください。

仕様の主な制限は、実際のコードとは無関係に存在することです。設計が正しいことだけを伝えることができ、正しく実装したことはわかりません。しかし、検証よりも指定の方が高速であり、テストするには微妙すぎるバグをキャッチするため、努力する価値があると思います。並行性または複数のシステムを含むコードは、ほとんど正式な仕様に適しています。


1

富士通に買収される前は、私はICLの部署で働いていました。彼らはソフトウェアが宣伝どおりに機能したことの証明を必要とするいくつかの大きな政府型契約を結んでいたので、Zで書かれた正式な仕様を取り、実行時にコードを検証するマシンを構築し、パス/不合格。

それは驚くべきことでしたが、尊敬されている@FishToasterが指摘するように、それは些細ではないものには役に立たなかった。


0
  1. あなたはそれをどれほど便利に見つけましたか?

ペトリネットのコンピュータープログラミングへの応用は非常に便利です。ペトリネットに基づいた方法である「ネット要素と注釈」を作成しました(Chionglo、2014)。2014年からこの方法を適用して、PDFフォームアプリケーションにAcrobat / JavaScript APIを使用するJavaScriptプログラムを記述しています。

  1. FMトレーニングには何が関係していましたか(コース、本など)?

私は独学でペトリネットを「訓練」しました。ペトリネットに関する章を教科書「ペトリネットとグラフセット:離散事象システムのモデリングツール」(David and Alla、1992)から読みました。ペトリネットに関する研究論文も読んでいます。「Net Elements and Annotations」を作成して文書化した後、数週間にわたってこの方法を適用することを練習しました。

  1. どのFMツールを使用していますか?

PowerPointを使用してペトリネット図を描画します。Wordを使用して注釈のフォームビューを作成します。AcrobatとNotepadも使用して、トークンゲームをPDFフォームアプリケーションとして作成します。エントリをフォームに追加した後、これらのエントリのJavaScriptコードへの変換は体系的です。したがって、翻訳を自動化できるはずです。PowerPointのグラフィックスオブジェクトに「エントリ」が追加された場合、それらを体系的にJavaScriptコードに翻訳し、この翻訳を自動化することも可能です。また、これらの翻訳を実行し、PDFフォームアプリケーションを作成するための追加リソースを作成する作業中のツールセットを使用します(Chionglo、2018年、2017年)。

  1. FMを使用しない場合と比較して、速度/品質の面でどのような利点がありますか?

「Net Elements and Annotations」を使用せずにJavaScriptプログラムを作成するよりも速く、「Net Elements and Annotations」を使用してJavaScriptプログラムを作成できます。そして、大規模なプログラムの場合、コーディングを停止して、後で(またはずっと後で)どこに続行するか迷うことなくコーディングに戻ることができます(Chionglo、2019)。場合によっては、「Net Elements and Annotations」を使用してJavaScriptプログラムを作成できますが、「Net Elements and Annotations」を使用せずにJavaScriptプログラムを作成することはできません。たとえば、「Net Elements and Annotations」を使用せずに再帰関数の非再帰実装を作成することはできませんでした(Chionglo、2019b; 2018b; 2016)。これらは、進行中のツールの有無にかかわらず当てはまります。

  1. FMではどのようなソフトウェアを作成しますか?

「Net Elements and Annotations」を使用して、PDFフォームアプリケーションにAcrobat / JavaScript APIを使用するJavaScriptプログラムを作成します。また、この方法を適用して、HTMLドキュメント用のJavaScriptプログラムを作成し、Arduino Sketchesを作成することもできます(Chionglo、2019c、2019d)。

  1. そして、FMを直接使用しない場合、少なくとも学ぶ価値はありましたか?

参照資料

JF Chionglo(2019b)。再帰関係のN番目の項の計算:非再帰関数の使用-数学スタック交換での質問への回答。< https://www.academia.edu/38496025/Computing_the_N-th_Term_of_a_Recursive_Relation_Using_a_Non-Recursive_Function_A_Reply_to_a_Question_at_Mathematics_Stack_Exchange >。

JF Chionglo(2019c)。炎の効果の制御ロジック、シミュレーション、スケッチ:Arduino Community Forumのリクエストへの回答。https://www.academia.edu/40342956/Flame_Effect_Control_Logic_Simulation_and_Sketch_A_Reply_to_a_Request_at_the_Arduino_Community_Forum

JF Chionglo(2019)。長い休憩の後にアプリケーションのコーディングを続ける方法 「2週間の休憩の後、コードのどこで停止したかをどのように知っていますか?」–ソフトウェアエンジニアリングスタック交換。https://www.academia.edu/39705042/How_I_Continue_Coding_an_Application_after_a_Long_Break_Reply_to_How_do_you_know_where_you_stopped_in_your_codes_after_a_2-week_break_Software_Engineering_Stack_Exchange

JF Chionglo(2019d)。Show-and-Hide Control Logic:Stack Overflowの質問に触発されました。< https://www.academia.edu/40283015/Show-and-Hide_Control_Logic_Inspired_by_a_Question_at_Stack_Overflow >。

JF Chionglo(2018b)。数値の階乗のペトリネットモデル:およびそれを計算する非再帰的なJavaScript関数。<>。

JF Chionglo(2018年)。Hyper Form™の作成-進行中のワークフロー:ネットプログラミング研究の最新情報。https://www.academia.edu/37697498/Create_Hyper_Form_-A_Workflow_in_Progress_Update_on_the_Net_Programming_Research

JF Chionglo(2017)。ネットプログラミング:研究提案:PowerPointおよびAcrobatでPDFフォームアプリケーションを開発するため。https://www.academia.edu/33374809/Net_Programming_A_Research_Proposal_For_Developing_PDF_Form_Applications_with_PowerPoint_and_Acrobat。

JF Chionglo(2016)。フィボナッチ数を計算するためのペトリネットモデル。https://www.academia.edu/31748108/A_Petri_Net_Model_for_Computing_the_Fibonacci_Number。

JF Chionglo(2014)。コンピュータプログラミングのネット要素と注釈:PDFでの計算と相互作用。https://www.academia.edu/26906314/Net_Elements_and_Annotations_for_Computer_Programming_Computations_and_Interactions_in_PDF

デビッド、R、およびH.アラ。(1992)。Petri Nets and Grafcet:離散イベントシステムのモデリングツール。アッパーサドル、ニュージャージー州:プレンティスホール。

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