ソフトウェア工学

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

4
マイクロサービスは相互に通信する必要がありますか?
Micro-Servicesを使用してアプリケーションを設計していますが、複数のサービスからデータを収集するために使用する最適なメカニズムがわかりません。 私は2つのオプションがあると信じています: サービスが直接対話できるようにする「サービス間」通信メカニズムを統合します。API Gatewayは、統合された応答をAPI Gatewayに返す前に、個々のサービスを呼び出してから、他のサービスを呼び出してデータを収集します。その後、APIは呼び出し元に応答を返します。(これは、serviceBへの呼び出しがserviceAからの応答を必要とする場合、同期呼び出しである必要があります。IEは、個人とアドレスサービスを分離します。) API Gatewayで各サービスを直接呼び出し、応答を返す前にAPI内のデータを統合します。 サービスが相互に通信するとカップリングが導入されるため、2番目のオプションに傾いています。この場合、モノリシックアプリケーションを設計することもできます。ただし、このオプションを使用すると頭から離れて考えることができる重大な欠点がいくつかあります。 APIに複数のサービスへの複数の呼び出しを実行させると、特にそれらの呼び出しの一部がブロックしている場合に、APIサーバーの負荷が増加します。 このメソッドは、APIがアプリケーションが実行しようとしていることを「認識」する必要があることを意味します(IEロジックをAPIにプログラミングして、サービスの呼び出しを処理し、データを統合する必要があります)。マイクロサービスの愚かな「エンドポイント」として機能します。 この問題に対する標準的なアプローチが何であるか、そして私が見逃している別の3番目のオプションがあるかどうかを知りたいですか?

5
LispでLispインタープリターを勉強することがなぜそんなに重要なのですか?
私は、特にlispで書かれたLispインタープリターを研究することを志望するプログラマーに求める新しいプログラマーのための多くのCSカリキュラムと学習提案を見てきました。これらのサイトはすべて、「その知的な啓示」、「すべての真面目なプログラマーが持つべき啓発体験」、「ハードウェアとソフトウェアの関係を示す」、その他の曖昧な声明、特にこの記事からこの評判の高いハウツー。 私の質問の一般的な感情は、Lispが上記の目標をどのように達成し、なぜLispを達成するのかということです。他の言語はなぜですか? Schemeでスキームインタプリタの記述を終えたばかりなので(SICP http://mitpress.mit.edu/sicp/から取得)、現在スキームでPythonインタプリタを記述しており、この伝説的なエピファニーを得るのに苦労しているため、これを求めています。それは前者から具体的に来ることになっています。プログラムの仕組みを理解するために、スキームインタープリターで活用できる2つの言語間の特定の技術的な詳細を探しています。 すなわち: 解釈する言語で書かれた通訳者の研究が強調されているのはなぜですか?元の言語と構築された言語をまっすぐに保つのは単に素晴らしい精神的な運動ですか、それともその性質でしか解決できない特定の問題がありますか?元の言語? Lispインタプリタは、将来のソフトウェア設計のために優れたアーキテクチャの概念をどのように実証しますか? この演習をC ++やJavaなどの別の言語で行った場合、何が恋しいですか? 何が最も使用され、この運動からテイクアウトや「精神的なツールが」?** ** このエクササイズから、他のどのツールよりも頭の中で解析ツールを設計するスキルが得られていることに気付いたので、答えを選択しました。スキームに適した異なる解析方法を見つけたいと思います。 Pythonインタープリターよりもインタープリター。

4
一部の並べ替え方法が1、10、2、3…で並べ替えられるのはなぜですか?
多くの数値ソート方法が、予想される1、2、3、10ではなく、1、10、2、3 ...でソートされるように見えることに気づきました。最初の方法が必要であり、ユーザーとして、実際にそれを見るたびにイライラします。最初のスタイルと2番目のスタイルの合法的な使用例はありますか?もしそうなら、彼らは何ですか?そうでない場合、最初のソートスタイルはどのようにして生まれましたか?各ソート方法の正式名称は何ですか?
30 sorting 

5
ネストされたクラスを使用するタイミングと理由
オブジェクト指向プログラミングを使用すると、クラス(ネストされたクラス)内にクラスを作成することができますが、4年のコーディング経験でネストしたクラスを作成したことはありません。 ネストされたクラスは何に適していますか? クラスは、ネストされている場合、プライベートとしてマークでき、そのクラスのすべてのプライベートメンバーに包含クラスからアクセスできることを知っています。変数を含むクラス自体に変数をプライベートとして置くことができます。 では、なぜネストされたクラスを作成するのでしょうか? ネストされたクラスはどのシナリオで使用する必要がありますか、または他の手法よりも使用法の点でより強力ですか?

7
未処理の例外を処理する方法は?(アプリケーションを終了するか、生き続けるか)
デスクトップアプリケーションで未処理の例外が発生した場合のベストプラクティスは何ですか? ユーザーがサポートに連絡できるように、ユーザーにメッセージを表示しようと考えていました。ユーザーにアプリケーションを再起動することをお勧めしますが、強制することはしません。ここで説明しているものと同様:ux.stackexchange.com-予期しないアプリケーションエラーを処理する最良の方法は何ですか? プロジェクトは.NET WPFアプリケーションであるため、説明されている提案は次のようになります(これは簡略化された例です。ユーザーが[詳細の表示]をクリックして、エラーを簡単に報告してください): public partial class App : Application { public App() { DispatcherUnhandledException += OnDispatcherUnhandledException; } private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) { LogError(e.Exception); MessageBoxResult result = MessageBox.Show( $"Please help us fix it and contact support@example.com. Exception details: {e.Exception}" + "We recommend to restart the application. " + …


5
数値範囲を保存する最も効率的な方法は何ですか?
この質問は、範囲を格納するために必要なビット数に関するものです。または、別の言い方をすれば、指定されたビット数に対して、保存できる最大範囲とその方法は何ですか? 0〜255の範囲内のサブ範囲を保存することを想像してください。 たとえば、45-74。 上記の例を2つの符号なしバイトとして保存できますが、そこには情報の冗長性が必要だと思います。2番目の値が最初の値よりも大きいことがわかっているため、最初の値が大きい場合は2番目の値に必要なビットが少なくなり、2番目の値が大きい場合は1番目の値に必要なビットが少なくなります。 どんな圧縮技術でも限界的な結果を生むと思うので、「1バイトに保存できる最大範囲はどれくらいですか?」と尋ねる方が良い質問かもしれません。これは、2つの数値を別々に保存することで達成可能な値よりも大きくする必要があります。 この種のことを行うための標準的なアルゴリズムはありますか?

2
Voyagerミッションのコード開発プロセス?
Voyager 1は2012年8月に星間空間に到達し、現存する最も遠い人工物です。1977年に双子の宇宙船Voyager 2の直後に打ち上げられたVoyager 1は、木星系と土星系を探索し、新月、活火山、外部太陽系に関する豊富なデータを発見しました。 Voyager 1および2は、176年に1回しか発生しない希少な惑星配列を利用するように設計されており、歴史上最もよく旅行された宇宙船のままです。両方の宇宙船には、ゴールデンレコードと呼ばれる一種のタイムカプセルが搭載されています。これは、私たちの世界の物語を地球外生物に描写するために選択された音と画像を含む12インチの金メッキ銅ディスクです。 私は、この任務のためにソフトウェアを構築していた人々の大部分が現在退職していると思いますが、過去35年間でプログラミング、プログラミング言語はこれまでに進歩しました。 35年後、ボイジャーは星間空間に到達しました。何行のコードがあり、どの言語で書かれていますか?このミッションの背後にある開発プロセスは何でしたか(それはまだアクティブです)。 それで、このミッションでのコードのより大きな計画は何でしたか、そしてどの言語でコードベースが書かれていますか?

3
Kotlinに静的キーワードがないのはなぜですか?
Kotlinは主にJavaのドロップイン置換として知られていますが、よく知られているJava構成要素であるstaticキーワードを取り除きます。代わりに、そのクラスレベルの機能は、主にコンパニオンオブジェクトによって提供されます。 コンパニオンオブジェクトがより良い代替を提供する静的メソッドとフィールドの何が問題になっていますか?私は理論的根拠について混乱しており、ドキュメンテーションで説明を見つけることができませんでした。

4
Amazonのような会社は、データベースレイヤーへのアクセスのボトルネックをどのように回避しますか?
Amazon(または他の大規模なeコマースWebアプリケーション)のような大規模なオンラインストアを運営しており、倉庫内の物理的なアイテムの量が限られている会社を想像すると、どのように最適化できますか?単一のボトルネック?もちろん、レプリケーションを備えた多数のデータベースと、負荷を個別に処理している多くのサーバーが必要です。ただし、複数のユーザーが別々のサーバーでサービスを提供しており、両方が同じアイテムをカートに追加しようとする場合、残りのアイテムは1つだけであるため、そのアイテムの数量には「真実の源」が必要です。これは、少なくとも、単一のアイテムの製品情報にアクセスするすべてのユーザーが、同じデータベースにシリアルでクエリを実行する必要があるという意味ではないでしょうか? 分散コンピューティングを使用して大規模なストアを運営し、インベントリ情報を含む単一のDBに大きなボトルネックを作成しない方法を理解したいと思います。


3
メソッドがTDDで再設計されてプライベートになった場合、メソッドのテストはどうなりますか?
他のキャラクターやそのようなものを攻撃するキャラクターでロールゲームの開発を始めたとしましょう。 TDDを適用して、Character.receiveAttack(Int)メソッド内のロジックをテストするテストケースを作成します。このようなもの: @Test fun healthIsReducedWhenCharacterIsAttacked() { val c = Character(100) //arg is the health c.receiveAttack(50) //arg is the suffered attack damage assertThat(c.health, is(50)); } メソッドをテストreceiveAttackする10のメソッドがあるとします。次に、メソッドCharacter.attack(Character)(メソッドを呼び出すreceiveAttack)を追加し、TDDサイクルでテストした後、決定するCharacter.receiveAttack(Int)必要がありますprivate。 以前の10個のテストケースはどうなりますか?それらを削除する必要がありますか?メソッドを保持する必要publicがあります(そうは思わない)。 この質問は、プライベートメソッドをテストする方法ではなく、TDDを適用する際の再設計後にそれらを処理する方法に関するものです。

6
スクラムは、要件が変わらないプロジェクトに追加のオーバーヘッドを作成しますか?
Gunther Verheyenのスクラム-ポケットガイドを読んでいます。 Standish Groupによる2011年のChaosレポートは転換点を示しています。従来のプロジェクトとアジャイル手法を使用したプロジェクトを比較するために、広範な研究が行われました。このレポートは、ソフトウェアを期限内に、予算内で、すべての約束された範囲で提供しなければならないという古い期待に反して、ソフトウェア開発へのアジャイルアプローチがはるかに高い歩留まりをもたらすことを示しています。このレポートは、アジャイルプロジェクトが3倍成功し、従来のプロジェクトと比較して失敗したアジャイルプロジェクトが3倍少ないことを示しています。 ですから、一部のプロジェクト(要件が変わらない医療/軍事など)では、アジャイル(および特にスクラム)がすべての会議などでオーバーヘッドであり、より論理的であると言う同僚との議論がありますたとえば、ウォーターフォールを使用します。 私の見方では、このようなプロジェクトにスクラムを採用する必要があります。これにより、プロセスがより透明になり、チームの生産性が向上するからです。また、1か月間のスプリントのために8時間をスプリントプランニングに費やす必要がないため、スクラムイベントが必要なければ、それほど時間はかからないと思います。全員が同じページにいることを確認して作業を開始するためだけに、5分間を節約できます。 では、スクラムは、要件が変わらないプロジェクトに追加のオーバーヘッドを作成しますか?

11
いくつの設計パターンと抽象化レベルが必要ですか?[閉まっている]
ソフトウェアに抽象化が多すぎて設計パターンが多すぎる、またはその逆を言うには、どうすればもっと多くの抽象化が必要かを知ることができますか? 私が協力している開発者は、これらの点に関して異なる方法でプログラミングしています。 いくつかの小さな機能をすべて抽象化し、可能な限りデザインパターンを使用し、いかなるコストでも冗長性を回避します。 私を含む他の人は、より実用的であることを試み、すべての設計パターンに完全に適合するわけではありませんが、適用される抽象化が少ないため、理解がはるかに速いコードを記述します。 これはトレードオフであることを知っています。プロジェクトに十分な抽象化が行われていることをどのように確認できますか? 例、Memcacheを使用して汎用キャッシングレイヤーを作成する場合。私たちは本当に必要ですかMemcache、MemcacheAdapter、MemcacheInterface、AbstractCache、CacheFactory、CacheConnector、...またはこれは、保守が容易とまだ良いコードは、これらのクラスの半分しか使用している場合ですか? Twitterでこれを見つけました: (https://twitter.com/rawkode/status/875318003306565633)

7
C ++プログラムはすべての例外をキャッチし、例外が過去のmain()でバブリングするのを防ぎますか?
私はかつて、C ++プログラムが最終的にすべての例外をキャッチする必要があるとアドバイスされました。当時与えられた理由は、本質的に、例外がmain()奇妙なゾンビ状態に入る以外にバブルするプログラムです。これは数年前に話されましたが、振り返ってみると、観察された現象は、問題のプロジェクトからの非常に大きなコアダンプの長期にわたる生成によるものだと思います。 当時、これは奇妙だが説得力があるように思われた。C ++がすべての例外をキャッチしていないことをプログラマに「罰」するのはまったく無意味でしたが、私の前の証拠がこれを裏付けているようです。問題のプロジェクトでは、キャッチされていない例外をスローしたプログラムは奇妙なゾンビ状態に入ったように見えます-または、私が原因だと思うように、不要なコアダンプの中でのプロセスを停止するのは異常に困難です。 (なぜこれが当時より明白ではなかったのか疑問に思う人のために:プロジェクトは複数のプロセスから複数のファイルに大量の出力を生成し、あらゆる種類のaborted (core dumped)メッセージを事実上不明瞭にしました。プログラムの問題は通常、長期間のプログラムによって長時間にわたって多くのイベントから蓄積された状態に依存するのではなく、短期間のプログラムへの初期入力に依存していませんでした(< 1時間)したがって、デバッグビルドまたはデバッガーからの同じ入力でプログラムを再実行するだけで、より詳細な情報を取得することがより実用的でした。) 現在、例外を残すことを防ぐためだけに例外をキャッチすることの大きな利点または欠点があるかどうかはわかりませんmain()。 例外が過去に発生することを許可することで考えられる小さな利点main()は、結果がstd::exception::what()端末に出力されることです(少なくともLinuxでgccコンパイルされたプログラムの場合)。一方、これは代わりに、すべての例外をキャッチすることによって達成することは簡単ですから派生std::exceptionし、その結果を印刷std::exception::what()し、それが由来していない例外からのメッセージ印刷することが望ましいならstd::exception、それはその後、しなければならない出発前にキャッチされmain()、印刷するためにはメッセージ。 過去に例外が発生することを許可することで考えられるささいな欠点main()は、不要なコアダンプが生成される可能性があることです。大量のメモリを使用するプロセスの場合、これは非常に厄介であり、プログラムからコアダンプ動作を制御するにはOS固有の関数呼び出しが必要です。一方、コアダンプと終了が必要な場合は、代わりにを呼び出すstd::abort()ことでいつでも達成でき、コアダンプなしの終了はを呼び出すことでいつでも達成できますstd::exit()。 逸話的に、what(): ...クラッシュ時に広く配布されているプログラムによって出力されるデフォルトのメッセージを見たことはありません。 C ++例外が過去にバブルアップすることを許可または拒否する強力な議論は、もしあれば、何main()ですか? 編集:このサイトには、一般的な例外処理に関する質問がたくさんあります。私の質問は、特に処理できないC ++の例外に関するものでmain()、エラーメッセージが出力される可能性はありますが、すぐにエラーが表示されることがあります。
29 c++  exceptions 

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