ソフトウェア工学

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

5
チームの成長に伴い、アプリケーションアーキテクチャ全体で一貫性を保つ方法
スタートアップの唯一の開発者として、私はアプリケーションのアーキテクチャとフレームワークで多くの決定を下すことができた贅沢がありました。 4年前に早急に買収し、5人でチームを組みました。多くの場合、ワイルドウエストのように感じます。設計上の決定をする人は、彼らを喜ばせます:1つの場所でDB型の整数と列挙、別の場所で文字列、問題のこのフレームワーク、次に同じ問題の別のフレームワークなど。 一貫性を強化するにはどうすればよいですか?それは私にとって重要だと感じていますが、私のチームのメンバーは「うまくいけばうまくいく」方法論に加入しているようです。 私の質問の大部分は、このような標準を期待することは私にとって非現実的ですか?独創性を抑える独裁者として出会うというアイデアに苦労していますが、彼らがやりたいことはスケーラブルではないようです。

10
潜在的にモノリシックなアプリケーションをいくつかの小さなアプリケーションに分割すると、バグを防ぐことができますか?[閉まっている]
これを求める別の方法は次のとおりです。なぜプログラムはモノリシックになる傾向があるのですか? Mayaのようなアニメーションパッケージのようなものを考えています。人々はさまざまなワークフローに使用します。 アニメーション機能とモデリング機能を独自の個別のアプリケーションに分割し、それらの間でファイルをやり取りして個別に開発した場合、それらの保守は容易ではないでしょうか?

2
ヘッダーのみのライブラリはより効率的ですか?
仮定 C ++のヘッダー専用ライブラリの利点の1つは、個別にコンパイルする必要がないことです。 CおよびC ++ inlineでは、関数がヘッダーファイルで定義されている場合にのみ意味があります*。 従来、Cでは、ヘッダーが翻訳単位の最小限のパブリックインターフェイスを表す.c / .hレイアウトが使用されてきました。同様に、.cpp / hpp。 質問 一般に、ヘッダーのみのライブラリは、従来のレイアウトよりもコードおよび実行時間の面で効率的ですか?もしそうなら、これは広範なインライン展開または他の最適化のためですか? *-ヘッダーで関数を定義することで、コンパイラーは翻訳単位のコンパイル中に実装を確認でき、実際にインライン化コードが可能になります
48 c++  c  libraries 

6
クラスをそれ自体のリストのサブクラスとして定義することの欠点は何ですか?
私の最近のプロジェクトでは、次のヘッダーを持つクラスを定義しました。 public class Node extends ArrayList<Node> { ... } しかし、私のCS教授と話し合った後、彼はこのクラスは「記憶にとって恐ろしい」と「悪い練習」の両方になるだろうと述べました。前者は特に真実であり、後者は主観的であるとは思っていません。 この使用法の理由は、インスタンスの動作をカスタム実装または相互作用する複数の同様のオブジェクトの動作のいずれかによって定義できる、任意の深さを持つことができるものとして定義する必要があるオブジェクトのアイデアがあったことです。これにより、物理的な実装が相互作用する多くのサブコンポーネントで構成されるオブジェクトの抽象化が可能になります。¹ 一方で、これがいかに悪い習慣になるかがわかります。何かをそれ自体のリストとして定義するという考えは、単純でも物理的にも実装可能ではありません。 私がなぜ任意の有効な理由があるべきではない、それは私の使用を考慮すると、私のコードでこれを使うには? ¹これをさらに説明する必要がある場合、私は喜んでいるでしょう。この質問を簡潔にしようとしています。

16
forループ内で、可能であればブレーク条件を条件フィールドに移動する必要がありますか?[閉まっている]
時々、次のようなブレークが必要なループが必要です: for(int i=0;i<array.length;i++){ //some other code if(condition){ break; } } 書くことに不快感を覚える if(condition){ break; } 3行のコードを消費するためです。そして、ループは次のように書き換えられることがわかりました。 ↓ for(int i=0;i<array.length && !condition;i++){ //some other code } だから私の質問は、可能であればコードの行を減らすために条件を条件フィールドに移動するのは良い習慣ですか?

4
GitHubで放棄された問題をどうするか?
誰かがGitHubで問題を開いたが、エラーを再現するための詳細な情報が求められ、それが与えられない場合、通常の手順は何ですか?例。 ここで著者は「nav breaks」と述べています。私はそれが修正されたと信じていますが、私たちが同じことについて話していることを確認するために著者からの一言をお願いします。ただし、問題のレポーターが消える場合があります。放棄された問題の有効期限を設定することは良い/一般的な慣行ですか? これらの条件のようなもの: 問題をデバッグできるようにするために、問題に関する質問が発生します。 開発チームからの最後の未回答の質問/コメントから2〜6か月以上が経過しています。 バグはクローズ時に再現できません(何らかの理由で、再現できない可能性があります)。 警告は、それを閉じる2週間前に発行されます。 プロジェクトは通常何をしますか?Googleで何も見つかりませんでした。また、これをどのように文書化しますか?上記のポイントを詳述したREADME.mdの簡単なメモと、閉じられた理由を説明する問題のコメントで十分ですか? 注:バグはまだ関連している(または関連していない)可能性があるため、この質問とは異なりますが、情報が不足しています。

6
パフォーマンスを偽る隠されたAJAXリクエストはどれほど安全ですか?
隠されたAJAXリクエストとは何ですか? ユーザーのアクションがすぐに発生するように見えるように設計された非表示のAJAXリクエストの使用が増加していることに気付きました。このタイプのAJAXリクエストを非ブロッキングと呼びます。これは、ユーザーに発生を認識せずに行われたAJAXリクエストであり、バックグラウンドで実行され、操作はサイレントです(AJAX呼び出しが正常に完了したことを示す詳細はありません)。目標は、操作が実際に終了していないときにすぐに発生したように見えるようにすることです。 ノンブロッキングAJAXリクエストの例を次に示します。 ユーザーがメールのコレクションで[削除]をクリックします。アイテムは受信トレイからすぐに消え、他の操作を続行できます。一方、AJAXリクエストはバックグラウンドでアイテムの削除を処理しています。 ユーザーが新しいレコードのフォームに入力します。保存をクリックします。新しいアイテムがリストにすぐに表示されます。ユーザーは引き続き新しいレコードを追加できます。 明確にするために、AJAX要求をブロックする例を次に示します。 ユーザーがメールのコレクションで[削除]をクリックします。砂時計カーソルが表示されます。AJAX要求が行われ、応答すると砂時計カーソルがオフになります。ユーザーは、操作が完了するまで1秒待つ必要があります。 ユーザーが新しいレコードのフォームに入力します。保存をクリックします。AJAXローダーをアニメーション化すると、フォームが灰色に変わります。「データが保存されました」というメッセージが表示され、新しいレコードがリストに表示されます。 上記の2つのシナリオの違いは、非ブロッキングAJAXセットアップでは動作のフィードバックが提供されないことと、ブロッキングAJAXセットアップでは提供されることです。 隠されたAJAXリクエストのリスク このスタイルのAJAX要求の最大のリスクは、AJAX要求が失敗したときにWebアプリケーションがまったく異なる状態になる可能性があることです。 たとえば、非ブロッキングの例。 ユーザーは多数のメールを選択します。削除ボタンをクリックします。操作はすぐに行われるように見えます(項目はリストから消えます)。次に、ユーザーは[作成]ボタンをクリックして、新しいメールの入力を開始します。この時点で、JavaScriptコードがAJAXリクエストが失敗したことを発見します。スクリプトはエラーメッセージを表示する可能性がありますが、現時点では本当に意味がありません。 または、ブロッキングの例。 ユーザーは多数のメールを選択します。削除ボタンをクリックします。砂時計が見えますが、操作は失敗します。「error。blah blah blah」というエラーメッセージが表示されます。それらは電子メールのリストに戻り、削除したい電子メールが選択されたままです。彼らは再びそれらを削除しようとする可能性があります。 ノンブロッキングAJAXリクエストを実行するための他の技術的リスクもあります。ユーザーはブラウザを閉じ、別のWebサイトに移動し、現在のWebの別の場所に移動して、エラー応答のコンテキストを無意味にすることができます。 それで、なぜそんなに人気が出るのでしょうか? Facebook、Google、Microsoftなど。これらの大規模なドメインはすべて、非ブロッキングAJAXリクエストを使用して、操作が即座に実行されているように見せるようになっています。また、保存ボタンや送信ボタンのないフォームエディタが増えています。フィールドを出るかEnterキーを押すとすぐに。値が保存されます。プロフィールが更新されたというメッセージや保存手順はありません。 AJAXリクエストは確実ではなく、完了するまで成功として扱われるべきではありませんが、多くの主要なWebアプリケーションはそのように動作しています。 ノンブロッキングAJAX呼び出しを使用するこれらのWebサイトは、レスポンシブアプリケーションをシミュレートし、高速に表示されるという犠牲を払って不要なリスクを冒していますか? これは、競争力を維持するために私たち全員が従うべき設計パターンですか?

8
仮想デストラクタを使用しない場合
私は仮想デストラクターについて何度も検索し、ほとんどが仮想デストラクターの目的と、仮想デストラクターが必要な理由に言及していると信じていました。また、ほとんどの場合、デストラクタは仮想である必要があると思います。 質問は次のとおりです。なぜC ++はデフォルトですべてのデストラクタを仮想に設定しないのですか?または他の質問: 仮想デストラクタを使用する必要がないのはいつですか? どの場合、仮想デストラクタを使用すべきではありませんか? 仮想デストラクタを使用しなくても、それを使用する場合のコストはいくらですか?

1
MITライセンスの条件は正確に何を意味していますか?
ライセンス自体を引用するには: 著作権(C)[年] [著作権者] これにより、このソフトウェアおよび関連ドキュメントファイル(「ソフトウェア」)のコピーを取得するすべての人に、使用、コピー、変更、マージの権利を含むがこれらに限定されないソフトウェアを許可する許可が無料で付与されます。ソフトウェアのコピーを発行、配布、サブライセンス、および/または販売し、以下の条件に従って、ソフトウェアの提供先にソフトウェアの提供を許可します。 上記の著作権表示およびこの許可通知は、ソフトウェアのすべてのコピーまたは大部分に含まれるものとします。 太字の部分が何を意味するのか正確にはわかりません。 私はいくつかのライブラリを作成しており、MITライセンスの下でそれをライセンスしているとしましょう。誰かがそのライブラリをフォークし、クローズドソースの商用バージョンを作成することにしました。ライセンスによると、彼はそれを自由に行えるはずです。 しかし、これらの条件の下で彼はさらに何をする必要がありますか?クリエイターとして認めてくれませんか?「上記の著作権表示」は「著作権(C)[...」の部分を指していると思いますが、そのコードの著者としてリストに載っていませんか(技術的にはコードを入力しましたが)。 そして、私が自分のライブラリをライセンスしたのと同じ条件下で、彼のライブラリが実際にライセンスするものに「許可通知」を含めないでしょうか? または、これを間違って解釈していますか?それは著作権と許可通知を含める義務を指しますか?

7
単語が名詞と動詞の両方であるときに変数に名前を付ける方法
以下の一般的なガイダンスで、コーナーケースの問題に遭遇しました。 変数の名詞 関数の動詞 具体的には、単語があいまいな場合があります-動詞または名詞のいずれかです。また、アプリケーションについて説明している場合には、同じ文で両方の方法で使用されます。 私の意図は、数か月後にコードのセクションに戻ったときに、自分自身だけでなく将来の開発者にもプログラムが読めるようにすることです。 例の1つはbatteryです。Aにbatteryはバッテリーchargeがありcharge()ます。 両方を持つことはBattery.Charge、Battery.Charge(value)将来の開発者にとって混乱を招くと思います。 私の現在の解決策は、これらのケース(変数と関数)のいずれかまたは両方に対して異なる単語を選択することです。そのアプローチに関する私の問題は、Batteryオブジェクトの変数と関数がchargeを含む設計の議論と一致しないことBatteryです。 私の質問は、命名規則のこの競合を処理する別の/より良い方法があるかどうかです。 件名に関するいくつかの追加の読書。私の質問の特定に実際に取り組んだものはありません。 意味のある簡潔なメソッド命名ガイドライン 変数の命名規則 https://softwareengineering.stackexchange.com/questions/14169/what-naming-guidelines-do-you-followから選択した回答
48 naming  variables 

8
私のチームには、ソース管理システムの基本的な能力以上のものを期待すべきですか?
私の会社は、約3か月前にSubversionからGitに切り替えました。切り替えの数週間前に事前通知がありました。Git(または他のDVCS)を使用したことがないため、Pro Gitを読んで、自分のリポジトリを回転させて遊んでいるので、切り替えたときに最小限の痛みで作業を続けることができます。今、私はデフォルトで「Git guy」です。 いくつかの例外はありますが、私のチームのほとんどはGitがどのように機能するのかまだわかりません。たとえば、彼らはまだブランチをソースコードの完全なコピーと考えており、レポを複数のフォルダー(ブランチごとに1つ)に複製することさえしています。彼らは通常、Gitを恐ろしいブラックボックスと見なしています。 私たちの日常業務におけるソース管理の基本的な性質を考えると(Gitが提供する途方もない量のパワーは言うまでもありません)、私はそれである程度の習熟度を達成しない開発者は責任があると考えています。 私のチームに、Gitが内部的にどのように機能するか、そして最も基本的なプル/マージ/プッシュ操作を超えてGitを使用する方法について少なくともある程度理解してもらう必要がありますか?それとも、私はただ何もないところから何かを作っているのですか?

3
Node.jsのユニークな点は何ですか?[閉まっている]
最近、Node.jsに対して多くの賞賛が寄せられています。私は、ネットワークアプリケーションにさらされている開発者ではありません。Nodes.jsの私の理解から、その強みは次のとおりです。複数の接続を処理するスレッドが1つしかないため、イベントベースのアーキテクチャを提供します。 ただし、たとえばJavaでは、NIO / AIO(私の知る限りの非ブロッキングAPI)を使用して1つのスレッドのみを作成し、そのスレッドを使用して複数の接続を処理し、データを実装するイベントベースのアーキテクチャを提供できます処理ロジック(コールバックなどを提供することでそれほど難しくないはずです)? JVMはV8よりもさらに成熟したVMであり(より高速に実行されると思います)、イベントベースの処理アーキテクチャは作成するのが難しくないように思えますが、Node.jsがそれほど注目されている理由はわかりません。重要なポイントを見逃しましたか?

14
コードレビューにおける肯定的なフィードバックはどれほど重要ですか?
コードレビュー中にコードの良い部分とそれが良い理由を指摘することは重要ですか?肯定的なフィードバックは、レビュー対象の開発者にとっても、レビューに参加する他の開発者にとっても同様に有用です。 オンラインツールを使用してレビューを行っているため、開発者はコミットしたコードのレビューを開き、他の人は特定の期間(1週間など)にコードをレビューできます。他の人は、コードまたは他のレビューアのコメントにコメントできます。 正のフィードバックと負のフィードバックのバランスをとるべきですか?

9
ウェブサイトが使用しているプログラミング言語を知ることは可能ですか?
たとえばstackexchange.com、サイト所有者やGoogleにウェブサイトの開発に関する情報を尋ねずに、バックエンドで使用されている言語を知ることは可能ですか? ウェブサイトには.extensionバーがありません。たとえば.php、で開発されていることを示すことができますPHPが、拡張子がなければ、それをどのように知ることができますか?

9
単体テストまたはテスト駆動開発は価値がありますか?
仕事中の私のチームはスクラムに移行しており、他のチームは単体テストとユーザー受け入れテストを使用してテスト駆動開発を始めています。私はUATが好きですが、テスト駆動開発または一般にテスト駆動開発の単体テストで販売されていません。 テストを書くことは余分な作業であり、実際のコードを書くときに人々に松葉杖を与えるようで、あまり効果的ではないかもしれません。 ユニットテストがどのように機能し、どのように記述するかを理解していますが、それは本当に良いアイデアであり、努力と時間の価値があると主張することができますか? また、スクラムにとってTDDが特に優れているものはありますか?

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