タグ付けされた質問 「formal-methods」

22
なぜ一部のプログラマーは、理論と実践の間に対照があると思いますか?[閉まっている]
ソフトウェアエンジニアリングと土木工学を比較すると、私は異なる考え方を観察して驚いた:土木技師なら誰でも、庭に小さな小屋を建てたいなら、材料を手に入れて建てることができるのに対して、 10階建ての家(または、たとえばこのようなもの)では、崩壊しないことを確認するためにかなりの計算を行う必要があります。 対照的に、一部のプログラマーと話したり、ブログやフォーラムを読んだりして、次のように定式化できる幅広い意見をしばしば見つけます。理論と形式的方法は数学者/科学者向けであり、プログラミングは物事を成し遂げることです。 ここで通常暗示されているのは、プログラミングは非常に実用的なものであり、形式的な方法、数学、アルゴリズム理論、クリーン/コヒーレントなプログラミング言語などは興味深いトピックかもしれませんが、すべてが必要な場合は必要ないことです完了しました。 私の経験によれば、100行のスクリプト(小屋)をまとめるのにそれほど理論は必要ありませんが、複雑なアプリケーション(10階建ての建物)を開発するには、構造化された設計が必要です。定義されたメソッド、優れたプログラミング言語、アルゴリズムを検索できる優れた教科書など。 したがって、IMO(適切な量の)理論は、物事を成し遂げるためのツールの1つです。 私の質問は、なぜ一部のプログラマーが理論(形式的手法)と実践(物事を成し遂げる)の間に対照があると考えるのですか? ソフトウェアエンジニアリング(ソフトウェアの構築)は、例えば土木工学(住宅の構築)と比較して多くの人が容易に認識してい ますか? または、これらの2つの分野は本当に異なりますか(ミッションクリティカルなソフトウェアは別として、ソフトウェアの障害は建物の障害よりもはるかに許容されます)。 これまでの回答から理解したことを要約しようと思います。 ソフトウェアエンジニアリングとは対照的に、土木工学では、特定のタスクに必要な理論量(モデリング、設計)がはるかに明確です。 これは、土木工学が人類と同じくらい古く、ソフトウェア工学が数十年しか存在していないという事実に一部起因しています。 別の理由は、ソフトウェアがより不安定な種類のアーティファクトであり、より柔軟な要件(クラッシュする可能性がある)、さまざまなマーケティング戦略(すぐに市場に出すために良いデザインを犠牲にすることができる)などであるという事実です。 結果として、適切な設計/理論の量がソフトウェアエンジニアリングに適切であるかを判断するのははるかに困難です(少なすぎる->乱雑なコード、多すぎる->私は決して終わらない) (多くの)経験が役立ちます。 したがって、あなたの答えを正しく解釈すると、 理論が実際にどれだけ必要かについてのこの不確実性が、一部のプログラマーが理論に対して抱く愛と憎しみの混合の原因になります。

8
ソフトウェアの正式な方法を学んだ場合、それはどれほど有用ですか?
プログラミングのための正式な方法(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はほとんど役に立たない)の違いを実際に示しています。

3
正式な方法の広範な採用を妨げる障壁は何ですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 2年前に閉店。 正式な方法を使用して、アプリケーションのコードを指定、証明、生成できます。これはエラーが発生しにくいため、主に安全/クリティカルプログラムで使用されます。 日常のプログラミングやWebアプリケーションなどでもっと頻繁に使用しないのはなぜですか? 参考資料: 正式な方法 B法 ホアロジック

5
ソフトウェアテストの形式化された/数学的な理論はありますか?
グーグルの「ソフトウェアテスト理論」は、言葉のソフトな意味での理論を与えるようだ。数学、情報理論、またはその他の科学分野の意味で、理論として分類できるものを見つけることができませんでした。 私が探しているのは、テストとは何か、使用される概念、テストケースとは何か、テストの実行可能性、テストの実用性、テストの範囲、正式な定義/説明コードカバレッジなど 更新:また、正式な検証と私が尋ねたものとの関係について、直感的にはわかりませんが、明らかに何らかの関係があります。

3
大きなメソッドをリファクタリングして何も壊さないようにする場合、何が役立ちますか?
私は現在、大規模なコードベースの一部をリファクタリングしており、ユニットテストはまったくありません。私は力ずくでコードをリファクタリングしようとしました。つまり、コードが何をしていてどのような変更が意味を変えないかを推測しようとしましたが、成功しませんでした。コードベースのすべての機能をランダムに破壊しました。 リファクタリングには、レガシーC#コードをより機能的なスタイルに移行すること(レガシーコードはLINQを含む.NET Framework 3以降の機能を使用しません)、コードのメリットがあるジェネリックの追加などが含まれることに注意してください。 費用がいくらかかかるので、正式な方法は使用できません。 一方、少なくとも「リファクタリングされたレガシーコードにはユニットテストが付属する」というルールは、いくらコストがかかっても、厳密に従うべきだと思います。問題は、500 LOCプライベートメソッドのごく一部をリファクタリングするときに、単体テストを追加することが難しいように見えることです。 特定のコードに関連する単体テストを知るのに役立つものは何ですか?コードの静的分析が何らかの形で役立つと思いますが、次の目的で使用できるツールと手法は何ですか。 どのユニットテストを作成すればよいかを正確に把握し、 そして/または私が行った変更が元のコードに影響を及ぼし、今とは異なる方法で実行されているかどうかを知っていますか?

2
要求仕様を関数型プログラミングの述語ロジックに変換することは一般的な方法ですか?
最近、Haskellで実装されている小さなプロジェクトに取り組むよう割り当てられました。オブジェクト指向/命令的な背景から来て、コーディングの前に要件/ユーザーストーリーをユースケースとシーケンス図に変換することに慣れています。 しかし、私が割り当てられているHaskellプロジェクトでは、チームはユーザーの要件を述語論理命題/ステートメントに変換することを好みます。セーフティクリティカルなシステムやソフトウェアエンジニアリングの正式な方法でロジックが使用されていることは知っていましたが、日常のプログラミングではそれほどではありませんでした。これはFPレルムで一般的な方法ですか?これについてどこでもっと知ることができますか? 要件を「モデル化」し、述語から「関数」を導き、関数が操作するために必要な型仕様を書き留めるのは自然な方法のようです。しかし、それは実際にどのように行われる/推奨されるのですか、それとも私のチームに固有のものですか? (ここでこの質問をする前に徹底的に検索してみました。「関数型プログラミングの要件仕様」(および異なるキーワードの同義語と組み合わせ)を検索しても、意味のあるものは何もありません。)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.