ソフトウェア工学

システム開発ライフサイクル内で働く専門家、学者、学生向けのQ&A

3
エラー処理の考慮事項
問題: 長い間、私はexceptionsメカニズムが本当に何をすべきかを実際には解決しないと感じているため、メカニズムについて心配しています。 クレーム:このトピックについては長い議論があり、それらのほとんどはexceptionsエラーコードの比較と返送に苦労しています。これは間違いなくここのトピックではありません。 エラーを定義しようとすると、Bjarne Stroustrup&Herb SutterのCppCoreGuidelinesに同意します エラーは、関数が公示された目的を達成できないことを意味します クレーム:exceptionメカニズムは、エラーを処理するための言語セマンティックです。 クレーム:私には、タスクを達成しないための機能には「言い訳」がありません:機能が結果を保証できないように事前/事後条件を誤って定義したか、開発に時間を費やすために特定の例外的なケースが十分に重要ではないと考えられます解決策。IMOでは、通常のコードとエラーコードの処理の違いは(実装前に)非常に主観的なものだと考えています。 クレーム:例外を使用して、事前または事後条件が維持されていないことを示すことはexception、主にデバッグの目的で、メカニズムの別の目的です。私はexceptionsここのこの使用法をターゲットにしません。 多くの書籍、チュートリアル、およびその他のソースでは、エラー処理は非常に客観的な科学として示される傾向がexceptionsありますが、それは解決され、catchあらゆる状況から回復できる堅牢なソフトウェアが必要です。しかし、開発者としての数年間は、別のアプローチから問題を見るようになりました。 プログラマは、特定のケースがあまりにもまれに慎重に実装できないと思われる場合に例外をスローすることにより、タスクを単純化する傾向があります。この典型的なケースは次のとおりです。メモリ不足の問題、ディスクの空き容量の問題、破損したファイルの問題など。これで十分かもしれませんが、必ずしもアーキテクチャレベルから決定されるわけではありません。 プログラマは、ライブラリの例外に関するドキュメントを注意深く読んでいない傾向があり、通常、関数がスローするタイミングとタイミングを認識していません。さらに、たとえ知っていても、実際には管理していません。 プログラマーは、十分早くに例外をキャッチしない傾向があります。そして、それらをキャッチする場合、ほとんどの場合、ログに記録してさらにスローします。(最初のポイントを参照)。 これには2つの結果があります。 頻繁に発生するエラーは、開発の初期段階で検出され、デバッグされます(これは良いことです)。 まれな例外は管理されず、ユーザーのホームでシステムがクラッシュします(素敵なログメッセージが表示されます)。エラーが報告される場合もあれば、そうでない場合もあります。 それを考慮すると、IMOのエラーメカニズムの主な目的は次のとおりです。 特定のケースが管理されていないコードで可視化する。 この状況が発生した場合、問題のランタイムを関連コード(少なくとも呼び出し元)に伝えます。 回復メカニズムを提供します exceptionエラー処理メカニズムとしてのセマンティックの主な欠陥はIMOです。throwソースコードのどこにa があるかは簡単にわかりますが、宣言を見ることで特定の関数がスローできるかどうかはわかりません。これは、上で紹介したすべての問題をもたらします。 言語は、言語の他の側面(たとえば、強力なタイプの変数)の場合ほど厳密にエラーコードを適用およびチェックしません。 解決策を試す これを改善するために、非常に単純なエラー処理システムを開発しました。これは、通常のコードと同じレベルのエラー処理をエラー処理にしようと試みます。 アイデアは次のとおりです。 各(関連する)関数は、success非常に軽いオブジェクトへの参照を受け取り、場合によってはエラー状態に設定することがあります。オブジェクトは、テキスト付きのエラーが保存されるまで非常に軽いです。 提供されたオブジェクトに既にエラーが含まれている場合、関数はそのタスクをスキップすることが推奨されます。 エラーを無効にしないでください。 完全な設計では、明らかに各側面(約10ページ)を徹底的に検討し、OOPへの適用方法も検討します。 Successクラスの例: class Success { public: enum SuccessStatus { ok = 0, // All is fine error = 1, // …

3
コードインデントの起源
コードインデントを導入したユーザーと、導入された時期と場所を調べることに興味があります。 コードを理解することはとても重要に思えますが、普遍的ではありませんでした。ほとんどのFortranおよびBasicコードはインデントされていない(ですか?)ため、Cobolでも同じことが言えます。 連続した行折り返しのテキストとして書かれた古いLispコードを見たことさえあると確信しています。それを解析するためだけに頭の中の括弧を数える必要がありました。 では、このような大きな改善はどこから来たのでしょうか?私はその起源の言及を見たことがありません。 元の使用例とは別に、私はインデントの元の議論も探しています。

6
64ビットWindowsで32ビットソフトウェアをテストする必要がありますか?
私はソフトウェア開発者としてソフトウェア開発チームで働いています。私は今、3年間同じプロジェクトに取り組んでいます。このソフトウェアは、.NET 4の32ビットデスクトップベースのC#アプリケーションです。Windows7のターゲットプラットフォーム(昨年までWindows XPをサポートする必要がありました)。ソフトウェアは、カスタムドライバが記述されているさまざまなカスタムハードウェアと通信します。ハードウェアの製造とドライバーソフトウェアは、お客様が作成します。もちろん、32ビットと64ビットのWindows用に異なるドライバーがあります。 システムテストフェーズでは、32ビットと64ビットの両方のWindows 7ですべて/ほとんどのテストケースを実行します。Windowsの1つのフレーバーのみに存在するソフトウェアにバグがあるかどうかは思い出せません。このような経験があるので、64ビットWindowsで32ビットソフトウェアをテストする必要があるのでしょうか? 業界標準とは何ですか?

8
Makeを直接使用することは時代遅れと見なされますか?[閉まっている]
ですから、メイクファイルを直接作成することや、2015年にそれを行うのは馬鹿げたことです。CMakeなどのツールを知っており、実際にCMakeを頻繁に使用しています。大切なのは、CMakeはMakefileを作成して、自分でそれを行うという退屈な作業をなくすことです。もちろん、それは他の多くの素晴らしい機能を追加します...しかし、最終的にはまだMakefileです。 だから私の質問は、Makeユーティリティ全体を指すmakeに関する「時代遅れの」話ですか、それとも自分のMakefileを手動で書くというアイデアですか?私はC / C ++開発にIDEをまったく使用しません(ちょうどemacs)ので、常にMakefileを作成しました。 Makeが古いと見なされる場合、C / C ++開発者は小さな個人プロジェクトを構築するために何を使用すべきですか?
31 c++  c  builds  make  cmake 

4
Webアプリケーションで競合状態を防ぐ方法
アリスとボブが両方とも商品リストを編集しているeコマースサイトを考えてみましょう。アリスは説明を改善し、ボブは価格を更新しています。同時にAcme Wonderウィジェットの編集を開始します。ボブは最初に終了し、製品を新しい価格で保存します。アリスは説明を更新するのに少し時間がかかり、完了すると、新しい説明で製品を保存します。残念ながら、彼女は価格を古い価格で上書きしますが、これは意図していませんでした。 私の経験では、これらの問題はWebアプリでは非常に一般的です。一部のソフトウェア(Wikiソフトウェアなど)にはこれに対する保護があります-通常、2番目の保存は「編集中にページが更新されました」で失敗します。しかし、ほとんどのWebサイトにはこの保護がありません。 コントローラーメソッド自体がスレッドセーフであることに注意してください。通常、データベーストランザクションを使用します。これにより、アリスとボブがまったく同じ瞬間に保存しようとしても、破損を引き起こさないという意味で安全になります。競合状態は、アリスまたはボブがブラウザに古いデータを持っていることから生じます。 このような競合状態をどのように防ぐことができますか?特に、私は知りたい: 使用できるテクニックは何ですか?たとえば、最終変更時刻の追跡。それぞれの長所と短所は何ですか。 役立つユーザーエクスペリエンスとは何ですか? この保護はどのフレームワークに組み込まれていますか?

7
ビジネスロジックがビューに忍び寄らないようにすることは可能ですか?
私は過去3年間、個人および職場の両方でいくつかのWebアプリケーションプロジェクトを開発してきましたが、少なくとも一部のビジネスロジックがアプリケーションのビューレイヤーで終了する可能性があるかどうかはわかりません。 ほとんどの場合、「ユーザーがオプションxを選択した場合、アプリケーションはユーザーがyの情報を提供できるようにする必要があり、そうでない場合は情報zを提供する必要がある」などの問題があります。または、モデルにいくつかの変更を適用する必要がありますが、ユーザーが明示的に要求するまでコミットしないAJAX操作を実行します。これらは私が遭遇した最も単純な問題の一部であり、ビュー内の複雑なロジックを回避する方法がわかりません。 MVCについて説明した本のほとんどは、通常、サーバー上のデータを更新して表示するCRUD操作など、非常に簡単な例を示していますが、CRUDはほとんどのリッチアプリケーションには当てはまりません。 ビジネスロジックをまったく持たないビューを実現することは可能ですか?

9
MVCを非プログラマーに説明する[非公開]
MVCを非プログラマーに説明する必要があります。つまり、進捗レポートのコンテキストで、他の部門のマネージャーに。私がしていることの1つは、MVC分離に向けてコードベースをリファクタリングすることです。 MVC分離とは何ですか?彼らが尋ねる必要があるのはなぜですか? このようなかなり技術的な答えを読んだ後: 本当にMVCとは何ですか?、私はプログラマーではない人と話をするので、完全に満足しているわけではありません。彼らはうなずくかもしれませんが、おそらくそれが何であり、なぜそれが必要なのか理解できないでしょう。 現実には、「ソフトウェアに変更を加える柔軟性を向上させるために、懸念、義務、機能、クラス、ブロック、タスク、物事の分離」以外のMVCを完全には把握していません。DIやOOのツールや手法などの手法を使用して、データベースをビューから分離し、ビジネスロジックからビューを分離することは、MVC分離と考えています。 たとえば、次に販売や会計のバックグラウンドを持っているプログラマーでない人にMVCを説明するとき、何を伝えますか?
31 mvc 

10
プログラムで署名を非表示にするにはどうすればよいですか?[閉まっている]
大学のプログラミングコースがあり、仲間の学生がFacebookグループでプログラミングに関する質問をしています。私はすべてのプログラムを共有することを少しためらっています。特に、割り当ての1つに何かクールなものがある場合は、これらはTAによって見られ、誰かが同じプログラムを持っているかどうかに気づき、それがどこから来たのかを質問し始める可能性があるためですから。それでも、他の人を助けるためにコードを共有したいこともありますが、人々が私の仕事を手に入れたくありません。(明確化:タスクとの共同作業が許可されています)これはもちろん細い線です。私は何人かの人々を助けたいと思っていますが、彼らが自分でコードを書き換える学問的な誠実さを持たないかもしれないと心配しています。 私の仲間の学生のほとんどはスキルがそれほど高度ではないので、個別の場所に細工されたBase-64エンコード文字列に自分の名前を隠すことは避けたいと思います。それでも、ランダムな文字列が座っているのはあまりにも明白かもしれません。 不審に見えることなくプログラムで自分の名前を隠すためのオプションは何ですか? CodeGolfで、評価したときにアスキーアートが他のものに変わることを見てきました。私が利用できる同様の戦略はありますか?理想的な解決策は、目立たないように見えるものですが、実際には、最初からコーディングしたことを証明する機能があります。 明確化:(申し訳ありませんが、以前にこれを言ったはずです)協力することはできますが、ポイントを獲得するためにプログラムをTAに説明する必要があります。特にそれが漏れた場合、他のコードでイースターエッグを隠すことは満足のためです。特に、生成された問題に対する答えが同等であることを確認するためにプログラムを交換したり、他の人が問題を解決する方法を確認したりするためです。
31 copyright 

10
物理量は、オーバーフローまたはアンダーフローなしで64ビット整数で表すことができると仮定するのは妥当ですか?
JDKの元のバイナリ検索アルゴリズムは32ビット整数を使用し、次の場合にオーバーフローバグがありました(low + high) > INT_MAX(http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html) 。 (符号付き)64ビット整数を使用して同じバイナリ検索アルゴリズムを書き換えた場合、low + high10 ^ 18バイトのメモリを持つことは物理的に不可能であるため、INT64_MAXを決して超えないと想定できますか? (符号付き)64ビット整数を使用して物理量を表す場合、アンダーフローとオーバーフローは発生しないと想定するのは合理的ですか?

3
商用WebアプリケーションでApacheソフトウェアライセンス、バージョン2.0およびGNU LGPL 3ライセンスプラグインを使用できますか?
2つのプラグインがあります。1つはGNU LGPL 3ライセンスを持ち、もう1つはApacheソフトウェアライセンスバージョン2.0を持っています。商用アプリで使用できますか?はいの場合、どのような予防策を講じる必要がありますか?

9
「なぜ」という答えを得ずにプログラマに質問する方法
私たちは皆この経験をしました。質問への回答を知っている人に行き、その人に質問すると、彼らは典型的な回答「なぜ?」で答えます。あなたはあなたが知る必要がある理由を説明し、彼らはあなたの問題を解決しようとします。 会話を元の質問に戻してその答えを得るには、時間がかかり、腕をひねり、忍耐が必要です。 プログラマーがこれを常に行うのはなぜですか?また、プログラマーが年をとるにつれて行動が悪化するのはなぜですか? 元の質問に対する答えを抽出するのに最も効率的な方法でプログラマに質問をする方法はありますか?

8
「何十万もの」スレッドが必要になるのはいつですか?
Erlang、Go、およびRustはすべて、安価な「スレッド」/コルーチンを使用した同時プログラミングをサポートしていると何らかの形で主張しています。ゴーよくある質問の状態: 同じアドレス空間に数十万のゴルーチンを作成するのが実用的です。 錆チュートリアルは言います: タスクは従来のスレッドよりも作成コストが大幅に低いため、Rustは標準的な32ビットシステムで数十万の同時タスクを作成できます。 Erlangのドキュメントによると: 233ワードのデフォルトの初期ヒープサイズは、数十万または数百万のプロセスを持つErlangシステムをサポートするためにかなり控えめです。 私の質問:どんな種類のアプリケーションが非常に多くの同時実行スレッドを必要としますか?最も忙しいWebサーバーだけが、数千もの同時訪問者を受け取ります。私が書いたボスワーカー/ジョブディスパッチタイプのアプリケーションは、スレッド/プロセスの数が物理コアの数よりもはるかに多い場合に、リターンを減少させます。数値アプリケーションにとっては理にかなっていると思いますが、実際には、ほとんどの人はこれらの新しい世代の言語ではなく、Fortran / C / C ++で書かれたサードパーティのライブラリに並列処理を委任します。

10
従業員に課題トラッカーを更新させるのがそれほど難しいのはなぜですか?
私は、会社と職場の両方で、人々に問題を更新してもらうために常にこの苦労を経験してきました。私は、人々が心の良さから実際にそれを行ういくつかのケースを経験しましたが、時間の〜70%は人々を追いかけなければなりません。 一般的に何らかの形で管理を行う(私は最優先の開発者です)ため、私が説明しようとする主な理由は、人々を追いかけたり、進行状況の照会を中断したりしたくないからです。結局、人々は多くのことを尋ねられると思います。まれで極端な場合には、(レポートを作成する必要があるときに)チケットを更新することになります。 だから、この問題に遭遇しましたか?開発者にどのように問題追跡ツールを頻繁に更新するように奨励しましたか?あなたはどの程度の成功を収めましたか?

7
「言語Aは言語Bで書かれている」とはどういう意味ですか?
言語Aは言語Bで書かれているという言葉をよく耳にします。たとえば、PHPはCで書かれ、C#はC ++で書かれています。 誰かがそれが何を意味するのか、それが正しいのかを説明してください。それは、言語で使用されるインタープリターのコンパイラーと関係がありますか? さらに、実装言語の選択の基礎となる要因は何ですか?

2
グアバ単体テストはどのように自動的に生成されましたか?
グアバには、自動生成されるユニットテストケースがあります。 グアバには膨大な数の単体テストがあります。2012年7月現在、guava-testsパッケージには286,000を超える個別のテストケースが含まれています。これらのほとんどは、手書きではなく自動的に生成されますが、特にcom.google.common.collectの場合、グアバのテスト範囲は非常に徹底しています。 それらはどのように生成されましたか?それらを設計および生成するためにどのような技術と技術が使用されましたか?

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