ソフトウェア工学

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

2
ラムダ計算とプログラミング言語の関係は何ですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 来年はコンピューターサイエンスの最初の1年(大学)を開始し、ほとんどCで書きます(それが問題になる場合)。私は検索を試みましたが、私が見つけるもののほとんどはラムダ計算の知識を前提としています。プログラミングでラムダ計算が単一変数計算よりもはるかに有用であると考えられるのはなぜですか?ラムダ式と関数型プログラムの間に関係はありますか?プログラミング言語の開発に影響を与えたのは、ラムダ計算に関するアロンゾ教会の仕事でしたか? 学校の外の誰もがそれについて騒ぎ続けており、私はそれを学び、それがプログラミングとプログラミング言語の理解に直接関係することを熱望しているにもかかわらず、彼らが何について話しているのか見当がつかない。

2
トランザクションが複数のオブジェクトにまたがらない場合、オブジェクトごとのオプティミスティック同時実行性は直列化可能性を意味しますか?
以下を提供するシステムを考えます: オブジェクトごとのオプティミスティックな同時実行制御/バージョン管理(CAS-Check-and-Setを使用) 単一のオブジェクト以上に及ぶ必要のないトランザクション。 スナップショット分離 このシステムはシリアライズ可能と見なされますか? スナップショット分離から 書き込みスキューの異常では、2つのトランザクション(T1およびT2)が重複するデータセット(値V1およびV2など)を同時に読み取り、互いに素な更新(T1更新V1、T2更新V2など)を同時に行い、最後に同時にコミットします。他方によって実行された更新。システムが直列化可能である場合、T1またはT2のいずれかが「最初に」発生し、もう一方に見える必要があるため、このような異常は不可能です。対照的に、スナップショット分離では、書き込みスキューの異常が許可されます。 具体的な例として、V1とV2が一人のPhilによって保持されている2つの天びんであることを想像してください。銀行は、V1またはV2のいずれかが赤字になることを許可します。ただし、両方の合計がマイナスになることはありません(つまり、V1 + V2≥0)。両方の残高は現在100ドルです。Philは2つのトランザクションを同時に開始します。T1はV1から200ドルを引き出し、T2はV2から200ドルを引き出します。 これに基づいて、書き込みスキューの可能性があることが、スナップショット分離がシリアル化可能でないことを保証するシステムの唯一の理由であると思われます。 ただし、トランザクションが複数のオブジェクトにまたがることを許可しないシステム(上記の例V1およびV2)では、書き込みスキューが発生することは不可能と思われます。 したがって、上記のシステムはシリアライズ可能です。これは正しいです?

3
コンストラクターを構造体に追加する必要がありますか?
メンバメソッドを備えた完全なモジュールにできるクラスではなく、c ++構造体を使用してデータ構造を定義することがよくあります。今、私たちはそれらが両方とも同じであることがわかります(大まかに言って)。 構造体をデータのみのエンティティとして頻繁に使用/処理するという事実は、デフォルトのコンストラクタも追加しないという衝動を引き起こします。しかし、コンストラクターは常に優れており、物事を単純化し、エラーを排除するのに役立ちます。 デフォルトのコンストラクタをデータ構造に追加すると、眉をひそめますか? 他の基準が満たされている場合、デフォルトコンストラクターを実装すると、構造体は非POD(プレーンな古いデータ型)になりますか? 物事を視野に入れるために、簡単な例を考えてみましょうが、実際には構造体ははるかに大きくなります。 struct method { char name[32]; float temperature; int duration; }; メソッドを作成するたびに、値を設定するのを忘れた場合、(控えめに言っても)心配する必要があります。temperatureメソッドを設定してシステムに適用するのを忘れてしまったことを想像してください。このメソッドはランダムに高い値になり、混乱を引き起こします。または、設定するのを忘れたためduration、メソッドが未知の高期間にわたって適用されます。 オブジェクトを保証するコンストラクタを実装するのではなく、毎回オブジェクトを初期化する責任を負うべきなのはなぜですか?

2
「プレゼンテーションロジック」とは何ですか。
私のWebアプリケーションでは、作成および編集用のフォームを提供する必要があります。作成用と編集用のフォームにはわずかな違いがあるので、私の見解ではこのようなことを考えています。 <form> // a lot of htnl goes here @if (editing) { // some more fields shown in edit mode } @if(!editing) { // some stuff shown in create mode } 私はいつもif自分のビューにステートメントを入れないようにしましたが、今回はHTMLの大部分を2つの場所にコピーする以外のオプションは表示しません。これは適切な「プレゼンテーションロジック」であり、他のオプションはありますか?

1
ゲームのテスト戦略
Webベースの教育用ゲームを継承しました。過去1年間、コードの安定化と新しい機能の追加に取り組んできました。ほとんどのロジックはフロントエンドにあるため、バックエンドの単体テストは有用ですが、コードのごく一部をカバーします。 ゲームは複雑になり始めています。各ゲームには2つの異なるモードがあり、モードによってゲームの動作は異なります。ゲームのプレイに影響するさまざまなフラグもあります。 私はもう10年以上アプリケーション開発者であり、これは私を困惑させます。企業の世界では、アルゴリズムは常に同じように機能します。アルゴリズムの単体テストを作成します。値42を期待し、その値を取得しないとエラーになります。 ゲームに関しては、私は迷っています。それらをテストするにはどうすればよいですか?テスターを利用できます。単体テストの作成に時間を費やすことができます。 テスターは...信頼できません。それらは問題を根絶するのに最適ではなく、私はそれらに最善の方向性を与えていません。リリースサイクルごとに膨大な時間を費やしてゲームのあらゆる組み合わせや組み合わせをテストするのではなく、それらをリソースとしてどのように使用すればよいですか? 単体テストは制限されているようです。ほとんどのロジックはjavascript(およびスパゲッティコードを継承)であるため、CucumberやSeleniumなどのフロントエンドスイートを使用して、特定の機能が動作することを確認できます。 それが最善の戦略ですか?ゲーム会社はどのようにゲームをテストしますか? 「複雑なゲームのテスト駆動開発」という質問(サイト上の他の記事も参照)を読みましたが、探しているものには対応していません。テスト方法の具体的な例ではなく、戦略を求めています。

2
Python GILを早期に削除しようとした結果、パフォーマンスが低下しました:なぜですか?
Pythonの作成者であるGuido Van Rossumからのこの投稿は、PythonからGILを削除する初期の試みに言及しています。 これは以前に試されましたが、残念な結果が出ました。そのため、自分で多くの努力をすることに消極的です。1999年にGreg Stein(Mark Hammond?と)がPythonのフォーク(1.5と思う)を作成し、GILを削除して、すべての可変データ構造のきめの細かいロックに置き換えました。彼はまた、私が受け入れたグローバルな可変データ構造に関する多くの依存関係を削除するパッチを提出しました。ただし、ベンチマーク後、最速のロックプリミティブ(当時のWindows)を備えたプラットフォームでも、シングルスレッドの実行がほぼ2倍遅くなることが示されました。つまり、2つのCPUで、もう少し作業ができるGILを備えた単一のCPU上よりも、GILなしで行われます。これだけでは不十分で、グレッグのパッチは忘れ去られました。(パフォーマンスに関するGregの記事を参照してください。) 私は実際の結果について議論することはできませんが、なぜこれが起こったのか本当に疑問に思います。おそらく、CPythonからGILを削除することが非常に難しい主な理由は、参照カウントメモリ管理システムのためです。典型的なPythonプログラムは何千回または何百万回も呼び出しPy_INCREF、Py_DECREFロックをラップする場合の主要な競合ポイントになります。 しかし、アトミックプリミティブを追加すると、シングルスレッドプログラムの速度が低下する理由がわかりません。各Pythonオブジェクトのrefcount変数がアトミックプリミティブになるようにCPythonを変更したと仮定します。そして、参照カウントをインクリメントする必要がある場合、アトミックインクリメント(フェッチアンドアド命令)を行うだけです。これにより、Pythonの参照カウントがスレッドセーフになり、ロック競合が発生しないため、シングルスレッドアプリケーションのパフォーマンスが低下することはありません。 しかし、悲しいかな、私よりも賢い多くの人が試したり失敗したりしているので、明らかに私はここで何かを見逃しています。この問題の見方の何が問題になっていますか?
13 python 

3
依存性注入フレームワークは依存性リスクを引き起こしますか?
依存性注入を使用するように既存のシステムをリファクタリングしており、その作業は順調に進んでいます。 しばらくして、社内ライブラリの多くが、使用しているDIフレームワークに依存するようになったことに気付きました。その結果、プロジェクト全体がこのサードパーティフレームワークに依存するようになりました。 共有ライブラリに依存させることで、すべての依存関係を分離することに皮肉を感じました。 私の最初の反応は、依存関係フレームワークのラッパーライブラリを作成することでした。したがって、必要に応じてこのフレームワークを置き換えることができます。関連する作業を推定した後、結果のAPIは既存のフレームワークに似ているため、置き換えがより困難になることに気付きました。だから私はその考えを捨てました。 私の懸念は、使用しているDIフレームワークが時代遅れになるか、交換する必要があることです。 DIを操作するときに、プロジェクトとDIフレームワーク間の結合を減らす開発パターンがありますか?

6
C配列の長さが0にできないのはなぜですか?
C11標準では、サイズと可変長の両方の配列は「ゼロより大きい値を持つ必要がある」としています。長さ0を許可しない理由は何ですか? 特に可変長配列の場合、時々ゼロのサイズを設定することは完全に理にかなっています。また、静的配列のサイズがマクロまたはビルド構成オプションからのものである場合にも役立ちます。 興味深いことに、GCC(およびclang)は、長さゼロの配列を許可する拡張機能を提供します。Javaでは、長さゼロの配列も使用できます。
13 c  array 

6
依存性注入フレームワークの引数の1つに疑問を投げかける:なぜオブジェクトグラフを作成するのが難しいのですか?
Google Guiceのような依存性注入フレームワークは、その使用(ソース)に次の動機を与えます。 オブジェクトを構築するには、まずその依存関係を構築します。しかし、各依存関係を構築するには、その依存関係などが必要です。したがって、オブジェクトを作成するときは、オブジェクトグラフを作成する必要があります。 手作業でオブジェクトグラフを作成するのは手間がかかり(...)、テストが困難になります。 しかし、私はこの議論を買いません。依存性注入フレームワークがなくても、インスタンス化が簡単で、テストが便利なクラスを作成できます。たとえば、Guiceの動機付けページの例を次のように書き換えることができます。 class BillingService { private final CreditCardProcessor processor; private final TransactionLog transactionLog; // constructor for tests, taking all collaborators as parameters BillingService(CreditCardProcessor processor, TransactionLog transactionLog) { this.processor = processor; this.transactionLog = transactionLog; } // constructor for production, calling the (productive) constructors of the collaborators public BillingService() …

2
データ構造とアルゴリズムの関係は何ですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 5年前に閉鎖されました。 データ構造の優れたオンラインコースを探していましたが、Googleはアルゴリズムコースの結果も返すことがわかりました。 このコースでは、分割統治法、グラフアルゴリズム、実用的なデータ構造(ヒープ、ハッシュテーブル、検索ツリー)、ランダム化アルゴリズムなど、アルゴリズム設計のいくつかの基本原則を学び ます。[ソース] そして このクラスの終わりまでに、グラフやその他の重要なデータ構造用の新しいアルゴリズムを考案し 、これらのアルゴリズムの効率を評価するために必要な重要な概念を理解できます。[ソース] そして このコースでは、計算問題の数学的モデリングについて紹介します。これらの問題を解決するために使用される一般的なアルゴリズム、アルゴリズムパラダイム、およびデータ構造をカバーしています。[ソース] 私の質問は次のとおりです。アルゴリズムとデータ構造は密接にリンクしているので、一緒に理解しなければならないのですか、それとも他のトピックよりも基礎的なトピックですか? 編集:この質問を終了する投票者のために、この質問を改善する理由と方法を教えてください。適切な質問をすることを学ぶことは、教育プロセスの一部です。

6
関数を呼び出すときに関数のパラメーター名がわからない場合の対処
ここにあなたの考えを聞きたいプログラミング/言語の問題があります。 私たちは、ほとんどのプログラマーが従うべき規約を開発しました。これは言語構文の一部ではありませんが、コードを読みやすくするのに役立ちます。もちろん、これらは常に議論の問題ですが、ほとんどのプログラマーが同意すると思う少なくともいくつかのコア概念があります。変数に適切な名前を付け、一般的な名前を付け、極端に長くならないように行を作成し、長い関数、カプセル化などを避けます。 しかし、まだコメントしている人がいないという問題があり、それが最大の問題かもしれません。関数を呼び出すときに引数が匿名になるという問題です。 関数は数学に由来しますが、f(x)には明確な意味があります。これは、関数にはプログラミングで通常行われるより厳密な定義があるためです。数学の純粋な関数は、プログラミングの場合よりもはるかに少ないことができ、はるかに洗練されたツールです。通常、1つの引数(通常は数値)のみを受け取り、常に1つの値(通常は数値)を返します。関数が複数の引数を取る場合、それらはほとんどの場合、関数のドメインの単なる余分な次元です。つまり、1つの引数は他の引数よりも重要ではありません。確かに明示的に順序付けされていますが、それ以外には意味の順序付けはありません。 しかし、プログラミングでは、関数を定義する自由度が高くなります。この場合、それは良いことではないと主張します。一般的な状況では、このように定義された関数があります func DrawRectangleClipped (rectToDraw, fillColor, clippingRect) {} 定義を見ると、関数が正しく記述されていれば、何が何であるかは完全に明確です。関数を呼び出すとき、IDE /エディターで次の引数がどうあるべきかを伝えるインテリセンス/コード補完のマジックを持っているかもしれません。ちょっと待って。実際に通話を作成しているときに必要な場合、ここで不足しているものはありませんか?コードを読んでいる人にはIDEの利点がなく、定義にジャンプしない限り、引数として渡された2つの長方形のどちらが何に使用されるかわかりません。 問題はそれ以上です。引数がローカル変数に由来する場合、変数名のみが表示されるため、2番目の引数が何であるかさえわからない状況があります。たとえば、次のコード行を見てください DrawRectangleClipped(deserializedArray[0], deserializedArray[1], deserializedArray[2]) これはさまざまな言語でさまざまな程度に緩和されますが、厳密に型指定された言語でさえ、変数に適切な名前を付けたとしても、関数に渡すときの変数の型については言及しません。 通常はプログラミングの場合と同様に、この問題には多くの解決策があります。多くはすでに一般的な言語で実装されています。たとえば、C#の名前付きパラメーター。しかし、私が知っているすべてには重大な欠点があります。すべての関数呼び出しですべてのパラメーターに名前を付けると、コードが読みやすくなる可能性はありません。多分、プレーンテキストプログラミングが提供する可能性を超えているように感じます。ほとんどすべての領域でJUSTテキストから移動しましたが、まだ同じコードを使用しています。コードに表示するためにより多くの情報が必要ですか?テキストを追加します。とにかく、これは少し接線になっているので、ここで停止します。 2番目のコードスニペットに答えた1つの回答は、おそらく最初にいくつかの名前付き変数に配列をアンパックしてから使用するでしょうが、変数の名前は多くのことを意味する可能性があり、呼び出される方法は必ずしもあなたがするべき方法を教えてくれません呼び出された関数のコンテキストで解釈されます。ローカルスコープには、leftRectangleとrightRectangleという名前の2つの四角形があります。これは、それらが意味的に表すものであるが、関数に与えられたときに表すものに拡張する必要がないためです。 実際、呼び出された関数のコンテキストで変数に名前が付けられている場合、その関数呼び出しで潜在的に可能な情報よりも少ない情報を導入しており、コードが悪いコードになる場合があります。rectForClippingに格納する四角形を作成するプロシージャと、rectForDrawingを提供する別のプロシージャがある場合、DrawRectangleClippedへの実際の呼び出しは単なるセレモニーです。新しいことは何も意味せず、ネーミングで既に説明しているにもかかわらず、コンピューターがまさにあなたが望むものを正確に知っているように存在する行。これは良いことではありません。 私はこれについて新鮮な視点を聞きたいです。私はこれを問題と考える最初の人ではないと確信していますが、どのように解決しますか?

8
なぜdivを使用する必要があるのですか?
今朝、私はhtmlとhamlを書いていたので、divの使い方がばかげていることに気付きました。なぜdivは暗示されないのですか?これを想像してください: <div class="hero-img"> <img src="http://whatever.com/this.jpg"> </div> これは: <hero-img> <img src="http://whatever.com/this.jpg"> </hero-img> 要素の「divクラス」部分が想定されている場合、HTMLはよりセマンティックで、一致する終了タグで無限に読みやすくなります。 これは、HAMLに似ています。 .content Hello, World! どちらになる: <div class='content'>Hello, World!</div> これがブラウザで動作するために発生しなければならない唯一のことは、ブラウザが既存のhtml要素定義を暗示することなくすべての要素の解釈を開始できること<div class="<element name>">です。 これは完全に後方互換性があります。CSSやjQueryセレクターなどでは、「div.hero-img」が引き続き機能し、要素を選択するために必要な構文になります。 新しいWebコンポーネント仕様については知っていますが、ここで提案されているものよりもかなり複雑です。Webサイトのソースを見て、そのように見えるhtmlを見ることがどれほど楽しいか想像できますか?! では、なぜdivを使用する必要があるのでしょうか? Mozillaのhtml5要素リストを見ると、すべての要素には意味的な意味があり、それから次のように<div>なります。 「特別な意味のない汎用コンテナを表します。」 ..そしてhtml5に追加する任意の要素をリストし<details>ます。 もちろん、暗黙のdivのこの概念がhtml仕様に追加された場合、標準になるには10年かかります。これはWeb時間で100万年です。 だから、私はこれがまだ起こっていない正当な理由があるに違いないと思う。教えてください!
13 html  html5 

3
ガベージコレクションでハッシュテーブルを使用すると、マークアンドスイープの世界的な問題を解決できますか?
mark-sweep-compactガベージコレクションアルゴリズムでは、参照グラフの一貫性が失われ、オブジェクトを指すすべての参照の値を置き換える必要があるため、オブジェクトを再配置する際に世界を停止する必要があります。 しかし、オブジェクトIDがキー、ポインターが値のハッシュテーブルがあり、参照がオブジェクトアドレスの代わりに上記のIDを指す場合、参照の修正には1つの値の変更のみが必要で、一時停止はオブジェクトの場合にのみ必要ですコピー中に書き込みが試行されます... 私の考え方に間違いはありますか?

2
「計算された」値をプロパティまたはメソッドとして公開する必要がありますか?
Webコンテンツ管理システムのコンテンツタイプを表すC#クラスがあります。 Webコンテンツエディターがオブジェクトの表示方法のHTMLテンプレートを入力できるフィールドがあります。基本的に、オブジェクトプロパティ値をHTML文字列に代入するためにhandlebars構文を使用します。 <h1>{{Title}}</h1><p>{{Message}}</p> クラス設計の観点から、フォーマットされたHTML文字列(置換あり)をプロパティまたはメソッドとして公開する必要がありますか? プロパティとしての例: public class Example { private string _template; public string Title { get; set; } public string Message { get; set; } public string Html { get { return this.ToHtml(); } protected set { } } public Example(Content content) { this.Title = content.GetValue("title") as string; this.Message …

9
典型的なインタビューの質問に使用されるスキルは、実際の仕事にどのように適用されますか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 SQLおよびC#アプリ開発ジョブの場合、インタビュアーは通常、純粋なCおよびポインターを使用して、ツリー、グラフ、およびリンクリストのトラバーサルについて質問します。私が仕事に費やした3年間で、実際にやる必要はなかった 指定されたノードの倍数である指定されたノードの右側にある最初のノードへのパスを見つける 例えば これらのスキルは、コンパイラ、ドライバーを作成し、OSカーネルで作業する必要があるジョブで使用される可能性があることがわかります。これら以外に、これらのスキルはどこで使用されますか?
13 interview 

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