ソフトウェア工学

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

6
メソッド抽出と基礎となる仮定
大きなメソッド(またはプロシージャ、または関数—この質問は OOPに固有のものではありませんが、私は99%の時間でOOP言語で作業しているため、私が最も使いやすい用語です) 、結果に不満を感じることがよくあります。これらの小さなメソッドについては、大きなメソッドの単なるコードブロックである場合よりも推論するのが難しくなります。なぜなら、それらを抽出すると、呼び出し元のコンテキストに由来する多くの基本的な前提が失われるためです。 後で、このコードを見て個々のメソッドを見ると、それらがどこから呼び出されているかすぐにはわかりません。ファイル内のどこからでも呼び出すことができる通常のプライベートメソッドと考えています。たとえば、初期化メソッド(コンストラクターなど)を一連の小さなメソッドに分割することを想像してください:メソッド自体のコンテキストでは、オブジェクトの状態がまだ無効であることを明確に知っていますが、通常のプライベートメソッドでは、おそらくはすでに初期化されており、有効な状態です。 これについて私が見た唯一の解決策は、whereHaskell の句です。これにより、「親」関数でのみ使用される小さな関数を定義できます。基本的には次のようになります。 len x y = sqrt $ (sq x) + (sq y) where sq a = a * a しかし、私が使用する他の言語にはこのようなものはありません。最も近いのは、ローカルスコープでラムダを定義することです。 だから、私の質問は-あなたはこれに遭遇しますか、そしてあなたはこれが問題であることを見ますか?そうした場合、特にJava / C#/ C ++などの「メインストリーム」OOP言語では、通常どのように解決しますか? 重複についての編集:他の人が気づいたように、分割方法を議論する質問とワンライナーである小さな質問が既にあります。私はそれらを読みましたが、呼び出し元のコンテキスト(上記の例では、オブジェクトが初期化されている)から派生する可能性のある基本的な前提の問題については説明していません。それが私の質問のポイントであり、それが私の質問が異なる理由です。 更新:この質問と議論を下で行った場合、特にこの問題に関するJohn Carmackの記事をお楽しみください。 実行されている実際のコードを認識することに加えて、インライン関数には、他の場所から関数を呼び出せないという利点もあります。それはばかげているように聞こえますが、それにはポイントがあります。コードベースが長年の使用で成長するにつれて、ショートカットを使用して、実行する必要があると思われる作業のみを実行する関数を呼び出す機会が多くなります。PartialUpdateA()およびPartialUpdateB()を呼び出すFullUpdate()関数があるかもしれませんが、特定のケースでは、PartialUpdateB()を実行するだけでよいことに気付く(または考える)可能性があり、他を避けることで効率的です作業。これには多くのバグがたくさんあります。ほとんどのバグは、実行状態があなたが思っているとおりではないという結果です。

3
サーバー側とクライアント側とハイブリッドでWebアプリを構築していますか?[閉まっている]
現在、Webアプリケーションを構築する方法は複数あります。 1.サーバー側のみ これは、Ruby on Rails、Django、Express、PlayなどのWebフレームワークによってサーバー上のページをレンダリングする古典的なアプローチです。フレームワークなど 典型的なワークフロー:選択したフレームワークでサーバー上にすべてのビジネスロジック、モデル、およびビューテンプレートを構築します。 2.クライアント側+ REST API 比較的前に、Webコミュニティ全体が、Angular、Backbone、Ember、およびその他の数十のJavaScript MV *フレームワークでクライアント側アプリケーションの構築を開始しました。そして今、React.jsもパーティーに参加しています。 更新:誤解はありません。クライアント側のみが意味することは、懸念事項を完全に分離することです。REST APIサーバーと、そのサーバーと通信するクライアント側アプリケーションがあります。ユースケースにもよりますが、認証またはデータ永続化のためにバックエンドに接続しない真のクライアント側のみのアプリケーションは決してないでしょう。 典型的なワークフロー:Angular vs Backbone vs Ember vs Xを決める時間を費やします。次に、クライアントでルート、モデル、ビュー、コントローラーを構築します。完了したら、サーバー上でモデル、コントローラー、ルートを構築します。ある意味では、2倍の量の仕事をしています。 3.ハイブリッド このアプローチの使用についてはあまり知りませんが、推測する場合は、サーバーでビュー(MVCフレームワークのビュー)をレンダリングします。その結果、SEOサポートに加えて、ページの読み込みが高速化されます。 上のハイブリッドフロントairbnbのありrendrおそらくバックボーンを組み合わせて、一緒に表現しています。 Eric Florenzoが今日彼のブログに投稿しました:React:最後に、素晴らしいサーバー/クライアントWebスタック。 Webアプリケーションを構築する方法の量は圧倒的です。そして、ウェブ開発を学んでいる人にとって、これは問題になる可能性があります。次のアプリケーションを構築するために、どのアプローチを使用するかをどのように決定しますか?

6
基本型(intなど)をクラスとして実装する場合の注意点は何ですか?
オブジェクト指向プログラミング言語を設計し、implentingすると、いくつかの点で1が基本型(のような実装の選択をする必要がありint、float、doubleクラスまたは何か他のものとして、または同等の)。明らかに、Cファミリーの言語はそれらをクラスとして定義しない傾向があります(Javaには特別なプリミティブ型があり、C#はそれらを不変の構造体として実装します)。 基本型が(統一された階層を持つ型システムで)クラスとして実装される場合、非常に重要な利点を考えることができます。これらの型は、ルート型の適切なLiskovサブタイプになります。したがって、ボクシング/アンボクシング(明示的または暗黙的)、ラッパータイプ、特別な分散ルール、特別な動作などで言語を複雑にすることは避けます。 もちろん、言語デザイナーがその方法を決定する理由を部分的に理解することができます:クラスインスタンスは、空間のオーバーヘッドを持っている傾向がある(インスタンスのメモリレイアウトにvtableまたはその他のメタデータが含まれている可能性があるため) have(言語がそれらの継承を許可しない場合) 基本型がクラスではないことが多いのは、空間効率(および特に大きな配列での空間的局所性の向上)だけですか? 私は一般的に答えがイエスであると仮定しましたが、コンパイラにはエスケープ分析アルゴリズムがあり、インスタンス(基本タイプだけでなく任意のインスタンス)が厳密に証明されたときに空間的オーバーヘッドを(選択的に)省略できるかどうかを推測できます地元。 上記は間違っていますか、それとも私が見逃しているものがありますか?

13
プログラミング言語が同期/非同期の問題を自動的に管理しないのはなぜですか?
私はこれについて多くのリソースを見つけていません:非同期のコードを同期的な方法で書くことができるのか、それとも良い考えかと思っていました。 たとえば、データベースに保存されているユーザーの数を取得するJavaScriptコードを次に示します(非同期操作)。 getNbOfUsers(function (nbOfUsers) { console.log(nbOfUsers) }); 次のようなものを書くことができたらうれしいです: const nbOfUsers = getNbOfUsers(); console.log(getNbOfUsers); そのため、コンパイラは自動的に応答を待機してから実行しconsole.logます。結果を他の場所で使用する前に、非同期操作が完了するまで常に待機します。コールバックpromise、async / awaitなどを使用することはあまりなく、操作の結果がすぐに利用可能かどうかを心配する必要はありません。 nbOfUserstry / catch、またはSwift言語のようなオプションのようなものを使用して、エラーを管理できます(整数またはエラーを取得しましたか?)。 出来ますか?それはひどいアイデア/ユートピアかもしれません...私は知りません。

3
LESSのようなネスト可能なスタイルシート言語を使用するよりもBEMが優れているのは何ですか?
私の同僚は、彼が手がけているプロジェクトでCSS のBEM(Block Element Modifier)メソッドを強く推し進めており、何年も書いてきたLESS CSSよりも優れているものを理解できません。 彼は「より高いパフォーマンス」を主張していますが、このコードショップで作成する種類のWebアプリにとって、パフォーマンスがどのように重要になるか想像できません。ここでは、TwitterやFacebookを作成していません。最も使用頻度の高いアプリが1か月に10000件以上ヒットし、ほとんどのアプリが1000件を大幅に下回っている場合、私は非常に驚きます。 彼は「読みやすさ」と「再利用」を主張していますが、私の意見では、LESSはすでにそれをはるかに上回っています。そして、BEMはこれらの非常に長いクラス名に特化した数十の余分な文字でマークアップをひどく壊し、読みやすさを根本的に低下させると感じています。 彼は「ネストされたCSSはアンチパターンである」と主張しています。「アンチパターン」とはどういう意味ですか?また、ネストされたCSSが悪いのはなぜですか? 彼は「誰もがBEMを使用する方向に動いているので、私たちもそうすべきだ」と主張しています。私のカウンターは「誰もが橋から飛び降りていたら、あなたはフォローしますか?」です。しかし、彼はまだこれについて完全に頑固です。 誰かがBEMをLESSより良くする理由を詳細に説明してもらえますか?私の同僚は完全に私を説得することに失敗しているが、私は選択肢に従うかどうかはわからない。私は、BEMを不承不承に受け入れるよりも、むしろむしろBEMに感謝することができます。
27 css  less 

7
タイプセーフな構造体ポインターではなく、パブリックAPIでのキャストを必要とする不透明な「ハンドル」を使用する理由
現在公開APIが次のようになっているライブラリを評価しています。 libengine.h /* Handle, used for all APIs */ typedef size_t enh; /* Create new engine instance; result returned in handle */ int en_open(int mode, enh *handle); /* Start an engine */ int en_start(enh handle); /* Add a new hook to the engine; hook handle returned in h2 */ int …

5
このタイプのパーサーの名前、または存在しない理由
従来のパーサーは入力全体を消費し、単一の解析ツリーを生成します。私は、連続ストリームを消費して解析フォレストを生成するものを探しています[ 編集:この用語の使用が型破りな理由に関するコメントの議論を参照してください ]。私の腸は、私がそのようなパーサーを最初に必要とする(または必要だと思う)ことはできないと言っていますが、私は何ヶ月も何度も検索しました。 私はXYの問題に陥る可能性があることを認識しています。私の最終的な目的は、テキストストリームを解析し、そのほとんどを無視し、認識されたセクションから解析ツリーのストリームを生成することです。 したがって、私の質問は条件付きです:これらの特性を持つパーサーのクラスが存在する場合、それは何と呼ばれますか? もしそうでなければ、なぜですか? 代替手段は何ですか?おそらく、私は従来のパーサーに私が望むことをさせる方法をいくつか逃しています。
27 parsing 

2
ASM.jsとは何ですか?また、それはすべての人にとって何を意味しますか?
ASM.jsと呼ばれるこのプロジェクトについて不平を聞き始めています。現在、彼らのウェブサイトはひどく混乱しています。以下は、Webでの調査でわかったことです。 これは、高度に最適化できるJavaScriptのサブセットです。言語のより動的な部分を避けるためだと思います。 ASM.jsにコンパイルされたコードのパフォーマンスは、Cの約半分の速度で実行されます(光ではありません)。 その意図は、コンパイラーがターゲット言語ASM.jsを作成することです。 FirefoxはASM.js最適化が組み込まれた状態で出荷されます。 MozillaとUnrealのチームが移植されたウェブにアンリアル・エンジンをそれにしてのビルドでランニングのFirefox、ネイティブに近いスピードで。 これが実際に何であるか、または有用性または究極の目的に関する具体的な情報はウェブ上にないようです。それ以外の場合はサーバー側のコードベースをコンパイルし、ブラウザにネイティブに近い速度で実行させることができますか?開発者にとっての影響は何ですか?

2
JavaでStackOverflowErrorをキャッチしても大丈夫ですか?
以前はそうではないと思っていましたが、昨日はそうしなければなりませんでした。Akka(JVMのアクターシステム実装)を使用して非同期ジョブを処理するアプリケーションです。アクターの1人がPDF操作を実行しますが、ライブラリーにはバグがあるため、たまに死にStackOverflowErrorます。 2番目の側面は、JVMの致命的なエラー(StackOverflowErrorなど)がキャッチされた場合、Akkaがアクターシステム全体をシャットダウンするように構成されていることです。 3番目の側面は、このアクターシステムがWebアプリ内に埋め込まれている(WTFのような、レガシー、理由のため)ため、アクターシステムがシャットダウンされても、Webアプリはそうではありません。最終的な効果はStackOverflowError、ジョブ処理アプリケーションで空のWebアプリになることです。 迅速な修正として、StackOverflowErrorアクターシステムのスレッドプールが破棄されないように、スローされているものをキャッチする必要がありました。これは、特にこのようなコンテキストでそのようなエラーをキャッチしてもいいかもしれないと思うようになりましたか?任意のタスクを処理するスレッドプールがある場合 とは異なり、アプリケーションが一貫性のない状態のままOutOfMemoryErrorになることを想像することはできませんStackOverflowError。スタックはこのようなエラーの後にクリアされるため、計算は正常に続行できます。しかし、おそらく重要なものが欠けています。 また、最初にエラーを修正するのはすべてです(実際、数日前にこのアプリでSOEを修正済みです)ある種の状況が発生する可能性があります。 をキャッチするのStackOverflowErrorではなく、JVMプロセスを再起動して、そのジョブを失敗としてマークし、ビジネスを続行する方がよいのはなぜですか? 国営企業を捕まえない理由はありますか?「ベストプラクティス」を除きます。これは、何も言えないあいまいな用語です。

2
プログラマーはコンピューターの購入時にどのような仕様を求めるべきですか?または、どのコンピューターを購入する必要がありますか?[閉まっている]
プログラミング用に特別に設計された新しいコンピューターを入手したいです。 学習経験のために自分で構築したいのですが、同様に作られたものを喜んで購入します。 基本的に、プログラミング専用の非常に多くのファイルをダウンロードしたので、a)私のコンピューターは容量に近く、b)私の4歳のコンピューターは非常に遅いです。 具体的には、データベース(Oracle / PostGreSQL、Mongo、Hadoop)とjavaに興味がありますが、可能なすべての言語の学習が大好きです。

4
CPUレジスタとは何ですか?
この質問は、しばらくの間私を悩ませており、今日、私はそれをグーグルにするだろうと考えました。私はそれについていくつかのことを読んだことがありますが、それは私がいつもプロセッサーキャッシュと呼んでいたものと非常に似ているように見えました。 2つの間に違いはありますか、または私はそれらが同じだと思うときに正しいですか?レジスタは、実際に動作するためにCPU内にある必要がありますか? ウィキペディアによると、レジスタは、RAMに送り返される前にメモリにすばやくアクセスして変更できるCPU内の場所です。私はこれを間違って理解しましたか、またはキャッシュとレジスタは実際に同じですか?

5
不変オブジェクトのインターフェイスを宣言しないでください
不変オブジェクトのインターフェイスを宣言しないでください [編集] 問題のオブジェクトがデータ転送オブジェクト(DTO)またはプレーンオールドデータ(POD)を表す場合 それは合理的なガイドラインですか? これまで、不変の(データを変更できない)シールクラスのインターフェイスを作成することがよくありました。私は、不変性を気にするところにはインターフェースを使用しないように注意しました。 残念ながら、インターフェイスはコードに浸透し始めます(心配しているのは私のコードだけではありません)。インターフェースを渡された後、渡されるものが不変であると本当に想定したいコードにそれを渡したいと思うでしょう。 この問題のため、不変オブジェクトのインターフェイスを宣言しないことを検討しています。 これは単体テストに関して悪影響があるかもしれませんが、それ以外に、これは合理的なガイドラインに思えますか? または、私が見ている「拡散インターフェース」の問題を回避するために使用すべき別のパターンがありますか? (私はこれらの不変オブジェクトをいくつかの理由で使用しています:主にスレッドセーフのために、私は多くのマルチスレッドコードを書いていますが、それはまた、メソッドに渡されるオブジェクトの防御的なコピーの作成を避けることができるためです。コードは何かが不変であることを知っている多くの場合-インターフェイスを渡された場合はそうではありません。実際、インターフェイスを介して参照されるオブジェクトの防御コピーを作成することさえできません。クローン操作またはそれをシリアル化する方法...) [編集] オブジェクトを不変にしたいという私の理由により多くのコンテキストを提供するには、Eric Lippertの次のブログ投稿を参照してください。 http://blogs.msdn.com/b/ericlippert/archive/tags/immutability/ また、ここでは、マルチスレッドジョブキューで操作/受け渡しされるアイテムなど、いくつかの低レベルの概念で作業していることを指摘する必要があります。これらは本質的にDTOです。 また、Joshua Bloch は、著書Effective Javaで不変オブジェクトの使用を推奨しています。 ファローアップ フィードバックをありがとう、すべて。先に進み、このガイドラインをDTOとその同類に使用することにしました。これまでのところ順調に機能していますが、1週間しか経っていません...それでも、見栄えは良いです。 これに関連する他の問題がいくつかあります。特に私が「ディープまたはシャロー不変性」と呼んでいるもの(ディープアンドシャロークローンから盗んだ命名法)-しかし、それはまた別の質問です。
27 c#  immutability 

7
面接プロセス中に与えられた過剰なプログラミングの割り当てを心配する必要がありますか?[閉まっている]
私は最近、会社に電話インタビューをしました。その電話インタビューの後、短いプログラミングの課題を完了するように言われました(小さなプログラムです。3時間以上かかることはありません)。割り当てを完了してコードを提出するように直接指示されているだけです。希望する言語を使用する完全な自由が与えられ、コードの入れ方を正確に教えられませんでした。 すぐにGithubに投げてテストスイートを作成し、Travis-CI(公開Githubリポジトリの無料の継続的統合)を使用してテストスイートを実行し、CMakeを使用してTravis-CIのLinuxメイクファイルをビルドすることを計画しました。そうすれば、Git、CMake、Travis-CIの使用方法、およびテストの作成方法を理解していることを実証できるだけでなく、Travis-CIページに簡単にリンクして、テストの出力を確認することもできます。インタビュアーにとっては少し便利になると思いました。 私はそれらの技術をよく知っているので、割り当てに時間を本質的に追加しません。 しかし、比較的単純なタスクでこれをすべて実行すると、見た目が悪くなるのではないかと少し心配しています。私にとってこれ以上の時間は追加されませんが、単純であるべきことに時間をかけすぎていると彼らに思わせたくありません。

7
関数型プログラミングは、「システムをモジュールに分解する際に使用される基準について」(データの隠蔽)から得られる利点を無視しますか?
「システムをモジュールに分解する際に使用する基準について」という古典的な記事がありますが、これは初めて読んだばかりです。それは私にとって完全に理にかなっており、おそらくOOPのベースとなった記事の1つです。その結論: これらの例により、フローチャートに基づいてシステムのモジュールへの分解を開始することはほとんど常に間違っていることを実証しようとしました。...各モジュールは、そのような決定を他のモジュールから隠すように設計されています 私の無学で経験の浅い意見では、関数型プログラミングはこの記事の正反対のアドバイスを取ります。私の理解では、関数型プログラミングはデータフローを慣用的にします。データは関数から関数に渡され、各関数はデータを密接に認識し、途中で「変更」します。そして、データの隠蔽が過大評価されているか、不必要であるか、または何かについて話しているリッチヒッキーのトークを見たことがあると思いますが、確かに思い出せません。 まず、私の評価が正しいかどうか知りたいです。FPパラダイムとこの記事は哲学的に同意しませんか? 彼らが同意しないと仮定すると、FPはデータ隠蔽の欠如をどのように「補償」しますか?おそらく、データ隠蔽を犠牲にしてX、Y、およびZを獲得する可能性があります。X、Y、およびZがデータ隠蔽よりも有益である理由を知りたいのです。 または、両者が同意しないと仮定すると、FPはデータの非表示が悪いと感じるかもしれません。もしそうなら、なぜデータ隠蔽が悪いと思うのですか? 彼らが同意すると仮定して、FPがデータ隠蔽の実装とは何かを知りたいです。OOPでこれを見るのは明らかです。privateクラス外の誰もアクセスできないフィールドを持つことができます。FPの場合、これについての明らかな類推はありません。 質問すべき他の質問もあると思いますが、質問すべきかはわかりません。それらにも自由に答えてください。 更新 このNeal Fordの講演には、非常に関連性の高いスライドが含まれています。ここにスクリーンショットを埋め込みます。

8
スクラムマスターとしての開発マネージャーのマイナス面は何ですか?
チームマネージャーがスクラムマスターであってはならないということは一般的に認められていますが、その理由を理解するのに苦労しています。コンテキストでは、私はスクラムチームに4人の開発者がいるアプリケーション開発マネージャーです。私はスクラムマスターのバックグラウンドを持ち、組織にスクラムを導入しました。私はチームをゼロから構築し、私がやることはすべてチームを促進することであり、彼らが決定を下すことを明確にしました。チームとして私たちは非常にオープンです-彼らは私たちが取得し始めていた「報告」の感覚を排除するために、しばらくスタンドアップで私を黙らせさえしました。一般的に、オープン性の欠如は、スクラムマスターとしてのマネージャーに対する最大の議論ですが、適切に処理されれば、適切な文化で簡単に克服できます。 経験豊富なスクラムコーチから、これは危険な状況であり、「物事がうまくいかない場合」のリスクがあると警告されています。私の考えでは、2つの役職は対立しません。どちらの役割においても、チームと個人の目標は同じです。スクラムは、チーム内の競合を解決します。これは、従来はマネージャーの役​​割でした。スプリントの自己管理の性質により、マネージャーが従来行っていた作業の割り当てがなくなります。 開発者マネージャーが個人のニーズを満たしていること、キャリアの目標、職場などを確認しているので、ピックアップするのは本当に残っていると思います。これの多くは、チームに直接関係しています。または、とにかくスクラムマスターとしての私の役割に関連しています。 大規模な組織では、これが管理不可能で別の役割になることを理解していますが、小規模な組織では、別のスクラムマスターまたは開発マネージャーを正当化することはできません。 スクラムマスターとしての開発マネージャーの落とし穴について教えてください。上で挙げた点と既に克服した点を除きます。
27 scrum  teamwork  team  roles 

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