ソフトウェア工学

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

7
ライブラリを使用せずにタスクを実行できる場合、ライブラリを使用する必要がありますか?[閉まっている]
私は、オープンソースのJavaScriptプラグインを使用してタスクを遂行できる状況にあります。しかし、それを使用しようとしたとき、私はすでにやったことの多くを再設計する必要があることに気づきました。きれいなコードで同じタスクを達成できるのに対し、自分で作成でき、これまでに行ったことを変更する必要はありません。 とにかく、このような状況ではライブラリを選択する必要がありますか(コードの品質を向上させるためなど)。

9
高価なプログラマーに対してどのように主張するのですか?
当社では、モバイルUIの開発など、一見複雑ではないように思われる多くのことを行う必要があります。 経験豊富なプログラマーは初心者の4倍の費用がかかるとしましょう。 どちらも基本的には、一見単純なことを同じ時間で完了することができます。 違いは、経験豊富なプログラマーはバグが少なく、コードはより安定していることなどです。初心者プログラマーは他の全員(PM、クライアントなど)の多くの時間を無駄にします。しかし、彼らはかなり安いです。 反論は、HTMLでテーブルを作成するのに経験と初心者が同じ時間かかることです。したがって、経験豊富なプログラマーを雇うことは贅沢です。初心者プログラマーも同様に達成できます。 私たちの分野で経験のあるプログラマーと新しいプログラマーの違いは4倍になる可能性があるので、より多くの優れたプログラマーに投資する必要がありますか。

6
ブロック内の追加行とクリーンコード内の追加パラメーター
コンテキスト できれいなコード、35ページ、それは言います これは、ifステートメント、elseステートメント、whileステートメントなど内のブロックが1行の長さであることを意味します。おそらくその行は関数呼び出しであるべきです。これにより、囲んでいる関数が小さく保たれるだけでなく、ブロック内で呼び出される関数にわかりやすい名前を付けることができるため、ドキュメントの価値も高まります。 私は完全に同意します、それはとても理にかなっています。 後で40ページで、関数の引数について説明します 関数の理想的な引数の数はゼロ(niladic)です。次に1つ(単項)、2つ(2項)が続きます。可能な場合は、3つの引数(3項)を避ける必要があります。3つ以上(ポリアディック)には非常に特別な正当化が必要です。引数は難しいです。彼らは多くの概念的な力を取ります。 私は完全に同意します、それはとても理にかなっています。 問題 しかし、しばしば私は別のリストからリストを作成していることに気づき、2つの悪の1つと一緒に暮らさなければなりません。 ブロック内で2つの行を使用します。1つは物を作成するため、もう1つは結果に追加するためです。 public List<Flurp> CreateFlurps(List<BadaBoom> badaBooms) { List<Flurp> flurps = new List<Flurp>(); foreach (BadaBoom badaBoom in badaBooms) { Flurp flurp = CreateFlurp(badaBoom); flurps.Add(flurp); } return flurps; } または、事物が追加されるリストの関数に引数を追加し、「1つの引数が悪化する」ようにします。 public List<Flurp> CreateFlurps(List<BadaBoom> badaBooms) { List<Flurp> flurps = new List<Flurp>(); foreach (BadaBoom badaBoom in …
33 clean-code  solid 

5
例外の契約を作成および実施するにはどうすればよいですか?
私はチームのリーダーに、bool isSuccessfulまたはenumをエラーコードとともに返す代わりに、C ++で例外を使用できるように説得しようとしています。しかし、私は彼のこの批判に対抗することはできません。 このライブラリを検討してください。 class OpenFileException() : public std::runtime_error { } void B(); void C(); /** Does blah and blah. */ void B() { // The developer of B() either forgot to handle C()'s exception or // chooses not to handle it and let it go up the stack. C(); …
33 c++  exceptions 

4
スクラム-スプリント中に忙しいチームメンバーは何ですか
そのため、スクラムスプリントは、特定の機能セットを実装する必要がある固定期間です。そして、スクラムチームは、これらの機能を提供することに全力を注いでいる人々で構成されており、その大部分は通常、開発者とテスターです。 これらのルールを確立した後、スプリント全体でこれらすべての人々を忙しく保つ方法を疑問に思うかもしれません。スプリントの開始時にはまだテストするものはありません。また、スプリントの終了時には、通常、開発/修正するものがまったくないか、ほとんど残っていません。 これを処理する2つのアプローチを見てきましたが、どちらも問題を適切に解決していないようです。 1)チームメンバーに、タスクがなくなったときの対処方法を決定させます。 短所: 彼らがすることを徹底的に計画していない場合(すなわち、主要なリファクタリング、新しいテストフレームワークへの切り替え)、彼らの仕事は役に立たないか、途中で立ち往生するかもしれません 一方、そのような作業の計画には多くの時間がかかる可能性があり、クライアントは即座に価値をもたらさないものにチームが時間を浪費するのを見ることに失望するかもしれません 通常、このようなタスクは完全に見積もることができないため、未熟な労働者がスクラムボードや他の場所に反映されることなく、YouTubeの猫を見ることに時間を費やすことは非常に簡単です。 2)スプリント内に開発専用のスペースを確保し、スプリントの終了後にテストを開始します(開発者が次のスプリントから機能の作業を開始するとき) 短所: 現在のスプリント用の機能を開発している間、開発者は前のスプリントからバグを修正することに気を取られ、現在のスプリント中に行われると推定された量の作業を実行できない可能性があります 2つのスクラムボードが必要です。1つは現在のスプリント機能用で、もう1つは以前のスプリントバグ用です。 だから私の質問は、スプリント中に開発者とテスターの間で作業を適切に分散して、誰も作業で過負荷になったり、いつでもタスクなしで終わることがないようにする方法ですか?上記のアプローチを改善する方法はありますか?または、より良いアプローチがありますか?
33 agile  scrum  sprint 

6
開発者のラップトップに重要なデータベースを保存するための適切なセキュリティ対策は何ですか?
いくつかの指定があります。 開発者は、マシンに本番データベースのレプリカが必要です。 開発者は、App.configファイルで上記データベースへのパスワードを持っています。 このデータベースのデータが危険にさらされるのは望ましくありません。 いくつかの推奨される解決策とその欠点: フルディスク暗号化。これはすべての問題を解決しますが、ラップトップのパフォーマンスを低下させ、私たちは新興企業なので、パワーホースにお金をかけないでください。 暗号化されたハードディスクを使用してVMを作成し、その上にデータベースを保存します。これはうまく機能しますが、Web.Configにパスワードがあるため、あまり役に立ちません。 ソリューション番号2 +開発者が何かを実行するたびにデータベースパスワードを入力する必要がある。これはすべての問題を解決しますが、1分に数回アプリケーションを起動することがある開発者にとっては非常に面倒です。また、同じデータベースに接続する複数のアプリケーションがあり、パスワード画面の実装はそれぞれ異なる必要があります。 だから、私の問題は、そのような問題の一般的な解決策があるか、または上記の解決策のいずれかを実行可能にする方法に関する提案がありますか?

8
Javaがif(5){…} if Cのような数値条件を厳密に許可しないのはなぜですか?
次の2つの小さなプログラムがあります。 C #include <stdio.h> int main() { if (5) { printf("true\n"); } else { printf("false\n"); } return 0; } Java class type_system { public static void main(String args[]) { if (5) { System.out.println("true"); } else { System.out.println("false"); } } } エラーメッセージを報告します。 type_system.java:4: error: incompatible types: int cannot be converted to …
33 java  c  type-systems 

5
多くのデータ構造に挿入するよりも、削除を実装するのが通常はるかに難しいのはなぜですか?
多くの(ほとんどの)データ構造の挿入よりも、削除の実装が通常はるかに難しい特定の理由を考えることができますか? 簡単な例:リンクリスト。挿入はささいなことですが、削除にはいくつかの特殊なケースがあり、それが非常に難しくなります。AVLやRed-blackなどの自己バランス型バイナリ検索ツリーは、痛みを伴う削除の実装の典型的な例です。 私はそれがほとんどの人々が考える方法に関係していると言いたい:私たちが物事を建設的に定義することはより簡単であり、それはうまく挿入を容易に導く。

5
パラメーターを介して、または戻り値によってC構造体を初期化する必要がありますか?[閉まっている]
私が働いている会社は、次のような初期化関数を使用して、すべてのデータ構造を初期化しています。 //the structure typedef struct{ int a,b,c; } Foo; //the initialize function InitializeFoo(Foo* const foo){ foo->a = x; //derived here based on other data foo->b = y; //derived here based on other data foo->c = z; //derived here based on other data } //initializing the structure Foo foo; InitializeFoo(&foo); 私はこのような構造体を初期化しようとするいくつかのプッシュバックを得ました: …

1
raw、weak_ptr、unique_ptr、shared_ptrなど…賢明な選択方法は?
C ++には多くのポインタがありますが、C ++プログラミング(具体的にはQt Frameworkを使用)で5年ほど前に正直に言うと、古い生のポインタのみを使用します。 SomeKindOfObject *someKindOfObject = new SomeKindOfObject(); 私は他にも多くの「スマート」ポインターがあることを知っています。 // shared pointer: shared_ptr<SomeKindofObject> Object; // unique pointer: unique_ptr<SomeKindofObject> Object; // weak pointer: weak_ptr<SomeKindofObject> Object; しかし、私はそれらをどうするか、生のポインタの比較で彼らが私に何を提供できるのかについて少しも考えていません。 たとえば、次のクラスヘッダーがあります。 #ifndef LIBRARY #define LIBRARY class LIBRARY { public: // Permanent list that will be updated from time to time where // each items …

9
QAスタッフは、表示できないキャッシュロジックをどのようにテストできますか?
Webアプリケーションにキャッシングレイヤーを実装しましたが、キャッシングはユーザーに対して透過的であるため、QAがどのようにテストするのか疑問に思っています。 私が持っているアイデアの1つは、キャッシュに入力するコードを呼び出すメソッドにログを記録し、オブジェクトがキャッシュからプルされたときと、データベースからの再作成が必要なときを記録し、テスターがログを表示して、たとえば、特定のオブジェクトは、すべてのページビューではなく、10分ごとにデータベースからリロードされます。 しかし、この状況に対してより良い実践を提案できる人はいますか?
33 testing  caching 

6
イベント駆動型アーキテクチャで初期状態を処理する方法は?
でイベント駆動型アーキテクチャイベントがシステムを介して送信されたときに各コンポーネントにのみ作用します。 ブレーキペダルとブレーキライトを備えた架空の車を想像してください。 ブレーキライトターンにそれが受信したときbrake_onのイベントを、そしてオフそれが受信したときbrake_offのイベント。 ブレーキペダルは、送信brake_onのそれが押下されたイベント、およびbrake_offの、それが解放されるイベントを。 これは、ブレーキペダルが既に踏み込まれた状態で車の電源が入る状況になるまで、すべてうまくいきます。ブレーキライトはbrake_onイベントを受け取ったことがないため、消灯したままになります。これは明らかに望ましくない状況です。デフォルトでブレーキライトをオンにすると、状況が逆転するだけです。 この「初期状態の問題」を解決するために何ができますか? 編集:すべての応答をありがとう。私の質問は実際の車に関するものではありませんでした。車では、状態を継続的に送信することでこの問題を解決しました。したがって、そのドメインにスタートアップの問題はありません。私のソフトウェアドメインでは、そのソリューションは多くの不必要なCPUサイクルを使用します。 編集2:@gbjbaanbの答えに加えて、私は次のようなシステムに行きます: 架空のブレーキペダルは、初期化後、その状態でイベントを送信し、 仮想ブレーキライトは、初期化後、ブレーキペダルからの状態イベントを要求するイベントを送信します。 このソリューションでは、コンポーネント間の依存関係、競合状態、失効するメッセージキュー、および「マスター」コンポーネントはありません。


1
なぜキューとしてのデータベースがそんなに悪いのか?[閉まっている]
私はこの記事を読んだばかりで、混乱しています。 1つのwebappと1つの別個のアプリケーションが「ワーカー」として動作し、両方が同じデータベースを共有しているとしましょう。 ああ、私は「共有」と言いました。しかし、この記事は何について警告していますか?: 第4に、アプリケーション(またはサービス)間でデータベースを共有することは悪いことです。そこに無定形の共有状態を置くのはあまりにも魅力的であり、それを知る前に、巨大に結合したモンスターができます。 =>反対。別個のアプリケーションが依然として同じユニットの一部である場合があります。したがって、この場合、「カップリングの問題」という概念は意味がありません。 続けましょう:webappはクライアントHTTPリクエストを処理し、いつでもいくつかの集約(DDD用語)を更新して、対応するドメインイベントを生成します。 ワーカーの目標は、必要なジョブを処理することにより、これらのドメインイベントを処理することです。 ポイントは: イベントデータをワーカーに渡す方法 読んだ記事が推進する最初の解決策は、優れたメッセージ指向ミドルウェアであるRabbitMQを使用することです。 ワークフローは簡単です: Web dynoがイベントを生成するときはいつでも、RabbitMQを介してイベントを発行し、ワーカーにフィードします。 欠点は、潜在的な送信エラーやハードウェアの問題に対処せずに、集約更新のコミットとイベントの発行の間の即時の一貫性を保証するものがないことです。それは別の主な問題です。 例:集約の更新が成功せずにイベントが発行された可能性があり、その結果、ドメインモデルの誤った表現を表すイベントが発生しました。 グローバルXA(2フェーズコミット)が存在すると主張できますが、すべてのデータベースまたはミドルウェアに適合するソリューションではありません。 それでは、この即時の一貫性を確保するための優れたソリューションは何でしょうか?: IMO、集計更新と同じローカルトランザクションでデータベースにイベントを保存します。 シンプルな非同期スケジューラが作成され、データベースから現在の未公開イベントをクエリし、それらをRabbitMQに送信します。RabbitMQはワーカーにデータを入力します。 しかし、なぜwebapp側で余分なスケジューラーが必要なのか、そしてところで:この場合RabbitMQが必要なのはなぜですか? このソリューションでは、特にデータベースが共有されているため、RabbitMQは不要である可能性があります。 実際、どのような場合でも、即時一貫性にはデータベースからのポーリングが含まれることがわかりました。 したがって、なぜワーカーはこのポーリングに直接責任を負わないのでしょうか? したがって、なぜWeb上の多くの記事が、データベース指向のキューイングを批判しているのに、メッセージ指向のミドルウェアを宣伝しているのか疑問に思います。 記事の抜粋: シンプルで、仕事に適したツールを使用します。このシナリオは、メッセージングシステムを求めています。上記のすべての問題を解決します。これ以上のポーリング、効率的なメッセージ配信、完了したメッセージをキューからクリアする必要、共有状態はありません。 そして、即時の一貫性は無視されますか? 要約すると、データベースが共有されているかどうかにかかわらず、ケースが何であれ、データベースポーリングが必要なようです。 いくつかの重要な概念を見逃しましたか? ありがとう

10
その練習から来たときに、新しい場所でコードレビューなしに対処する方法は?
私の新しい会社のチームにはコードレビュープロセスがありません。 私はコードレビューが必須の文化である企業から来ているので、誰かにレビューしてもらうことなくコードをコミットすることに不安を感じています。 私は、コードレビューは潜在的な問題を早期に発見するため、コードレビューは品質を改善し時間を節約する方法であると固く信じています(ペアプログラミングについては話していないことに注意してください)。 コードレビューが時間の無駄ではなく時間の節約になることをどのように示すことができますか? 単体テストがある場合、コードレビューをスキップできますか?

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