ソフトウェア工学

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

7
チームはストーリーポイントを推定しており、ビジネスは実際の時間を必要としている
これは珍しいテーマではないと確信しています。ストーリーポイントを使用してユーザーストーリーを推定する大丈夫な仕事をしている2つのスクラムチームがあります(チームメンバーは数年のスクラム経験がありますが、現在のチームの星座はわずか8か月です)。しかし、会社のビジネス部門がユーザーストーリーに関連することは困難です。実際の時間単位(または「ストーリーポイントを時間に変換する式」)が必要なため、いつ準備が整うかを計画できます(「Feature Xが生産中であることを顧客に伝えることができる時期を知る必要があります」 ")。 私と私のスクラムマスターの前任者は、もちろん、「ストーリーポイントと実際の時間の間に明確な関係はない」と「ストーリーポイントはチームがスプリントにどれだけフィットできるかを決定するために使用される」と説明しました。彼らがその答えにどれほど満足しているか推測できることを確認してください。彼らは、カレンダーの時間に、バックログの27番目のユーザーストーリーに到達する時期を知りたがっています。 いずれにせよ、私はいくつかの統計情報をコンパイルされている、と私たちのSP推定値はに変換乱暴に異なる実時間費やした結果(チケットは列「に取り組ん」に費やすどのくらいの時間を追跡し、当社のスクラムボードソフトウェア、によって測定されます)。1-SPユーザーストーリーの場合、もちろん非常に短い期間(ときどき爆発する)への大きなバイアスがありますが、特に2-SPストーリーの場合、それらはいたるところにあります。 「最速」と「最遅」の完了間。3、5、および8 SPストーリーの場合、スプレッドも2倍以上です。 これは、(a)チームが(同様の)複雑さのユーザーストーリーの推定においてはるかに一貫性を保つ必要があること、および(b)チームが時間レポートの精度を向上させる必要があることを示します(つまり、会議中、昼食時、またはフーズボールをプレイしているときに「作業中」)。 私は(a)と(b)の両方を改善する計画がありますが、これらのイニシアチブがもたらすものよりも「具体性」をビジネスが期待しているだけでは不十分だと感じています。 ビジネス側を和らげるいくつかの良い戦略は何ですか?それは私たちがどのように仕事をするかをあまり邪魔しないようにするためです(たとえば、個別の時間追跡の使用を課すことによって現在の「自動」追跡)、同時にストーリーがいつ行われるかについての具体性のある程度の測定値を取得できるようにしますか? (歴史的に、計画中にユーザーストーリーをワークアイテムに分割し、実際の作業時間で個別に推定しましたが、ここで話しているのはバックログのユーザーストーリーで、そのレベルの詳細やブレークはありません-ダウン。) 更新:私のマネージャーは、ストーリーポイントごとの時間のベル曲線分布のようなものがあるという予感がありましたが、私が照合したデータと彼が作成したグラフは、彼の考えを徹底的に否定しました。:-)
15 scrum  estimation 

3
開発者スクリプトを管理する正しい方法は何ですか?
開発者は、作業を支援するスクリプトを作成します。たとえば、特定のパラメーターでMavenを実行したり、開発中に不要になったバックグラウンドタスクを削除したり、特定のサーバーに接続したりします。スクリプトはコアビルドスクリプトではなく、継続的インテグレーションサーバーでも使用されません。 それらを管理する最良の方法は何ですか?それらをディレクトリ(おそらく /scripts)に入れてGitにチェックインするには?いくつかのファイルサーバーでそれらを個別に維持するには? それらをソースコードとして扱うための議論は、それらがソースであり、変更できるということです。それを行わないという議論は、それらが単なる補助ツールであり、すべての開発者が特定のスクリプト(たとえば、一部の開発者がWindowsで作業するLinux固有のスクリプト)を必要としないということです。

6
「コード」をデザイナーから遠ざけますか?
私は友人とかなりの数のプロジェクトを構築していますが、私たちは常に同じ落とし穴に何度も訪れます。PHP、Javascript、その他すべて(CSSとHTMLも知っている)の書き方を知っているので、実際の機能を構築する際にほとんどの作業を行うことができます。しかし、彼はできませんが、私がやっとできること、つまりサイトを設計することはできます。 しかし、毎回、私たちは問題に出くわします。彼はコードの書き方を知らないので、一般に開発がかなり遅くなります。現時点ではこれが私たちのワークフローです: 機能を考え出す 彼は、フロントエンドのデザインを構築します(配置する場所、外観など)。 彼は私に完全なテンプレートを送信します(PinegrowからのHTMLエクスポート) 彼が行った変更を探し、実際のサイトに実装します(数週間前からCakePHPを使用しています)。 何かが意図したとおりに動作しない場合(たとえば、何らかの理由で計画どおりに動作しなかった場合など)、問題を自分の側で修正し、テンプレートを送り返します すすぎ繰り返し 想像できるように、このプロセスは骨の折れるほど遅く、非効率的です。私の質問は、このプロセスをよりスムーズに進めるにはどうすればよいですか?Reactを使用し、RESTfulを使用する必要があること、およびそうでないことについて多くのことを見てきましたが、CakePHPを使用したいと考えています。いくつかの人々はそれについていくつかの有用なリソースに私を導くことができますか?私はこれをしばらく探していましたが、これに対するまともな解決策には至りませんでした。 基本的に、私のパートナーができることは、サイトの設計だけです。彼はDocker(私は常にDockerを使用しています)、PHP、Javascript、その他ほとんど何も使用できません(彼はCSSを知っていますが、ほとんどWYSIWYGエディターで動作します)興味がない(だから私はそれを尊重している)。私はそれが非常に重要なことだと思うので、ここの誰かが私を助けてくれることを願っています(そしておそらく他の人はこの質問で後で来ます)。
15 design  cakephp 

3
REST APIのバージョン管理。各APIには独自のバージョンがあります
URLのREST APIのバージョンを指定することは非常に一般的です。具体的には、パスの先頭、つまり次のようなものです。 POST /api/v1/accounts GET /api/v1/accounts/details ただし、バージョンが各APIに関連付けられているデザインは見ていません。つまり、各APIのバージョンを個別に管理します。すなわち: POST /api/accounts/v2 GET /api/accounts/details/v3 このアプローチを使用すると、破壊的な変更が必要なときに特定のAPIのAPIバージョンをインクリメントします。API全体のバージョンをインクリメントする必要はありません。 一般的なスタイルの代わりにこのスタイルを使用することの欠点は何ですか?

9
単体テストを使用して列挙型の値をテストする必要がありますか?
値のみの列挙型(Javaで実行できるメソッドはない)があり、この列挙型がシステムのビジネス定義の一部である場合、単体テストを作成する必要がありますか? 単純で冗長に見えるかもしれませんが、ユニット/統合/ ui / etcに関係なく、ビジネス仕様に関係するものをテストで明示的に作成する必要があると思います。テストするか、テスト方法として言語の型システムを使用します。列挙型(Javaなど)に必要な値は、ビジネスの観点から、型システムを使用してテストできないため、そのための単体テストが必要だと思います。 この質問は類似していない、この1、それは私と同じ問題に対処していないので。その質問にはビジネス機能(savePeople)があり、その人は内部実装(forEach)について問い合わせています。そこには、言語コンストラクト(forEach)をカプセル化する中間ビジネスレイヤー(人を救う機能)があります。ここで、言語構造(enum)は、ビジネスの観点から動作を指定するために使用されるものです。 この場合、実装の詳細は、データの「真の性質」、つまり値のセット(数学的な意味で)と一致します。ほぼ間違いなく不変のセットを使用できますが、同じ値がまだ存在しているはずです。配列を使用する場合は、ビジネスロジックをテストするために同じことを行う必要があります。ここでの難問は、言語構成がデータの性質と非常によく一致するという事実であると思います。自分自身を正しく説明したかどうかわかりません

1
ほとんどのAPI Gatewayソリューションで「集計」がサポートされないのはなぜですか?
API Gatewayについて読むと、毎回出てくるものの1つは、API Gatewayが複数のエンドポイントからの結果を集約する場所であるということです。それは本当にいいですね。ただし、AWS API Gateway、Kongo、Netflix Zuulなどの多くの一般的なAPI Gatewayソリューションは、このような機能をサポートしていません。ハックするか、カスタムフィルターを自分で実装する必要があります。 集約は悪い習慣と見なされていますか?複数のエンドポイントから結果を返す方法

1
Javaロガー:静的ブロックの初期化または変数宣言での初期化
現在、私のプロジェクトでは次の方法でロガーを使用しています。 private static final Logger LOGGER; static{ LOGGER = logger.getLogger(); } 静的ブロックを使用してロガー変数を初期化するためのコードレビューを受けました。宣言文自体でロガー変数を初期化するように言われました。 private static final Logger LOGGER = Logger.getLogger(); 静的ブロックで初期化しないと、どのような違いが生じるかを把握しようとしています。これが実践かどうか知りたい。
15 java 

1
Protobuf 3がメッセージのすべてのフィールドをオプションにしたのはなぜですか?
protobufの構文3は、すべてのフィールドをオプションにし、キーワードrequiredを削除し、optional以前のproto2構文から削除しました。開発者からのコメントを読むと、前方/後方バイナリ互換性を強化するために行われたようです。 しかし、私にとっては、パッケージ名をバージョン管理するだけで強制できます。たとえばcom.example.messages.v1、クライアントが理解できるデシリアライザーを実装できるようにします。同時に、ソフトウェアエンジニアリングの観点から有用なタイプとして指定されている一部の契約を削除します。たとえば、私が持っている場合 message Location { double latitude = 1; double longitude = 2; } proto3ではLocation、必須フィールドの1つを提供しないことにより、完全に有効な半バックアップを作成できます。 クライアント間でデータを交換するためのスキーマベースのシリアル化形式を作成する場合、これは大きな欠点ではありませんか?すべての必須フィールドに有効な値があることを確認するために、各クライアントに追加の検証コードを移動するのは悪くありませんか?

5
正式なコードレビューを実施する際に役立つ考え方
当社のチームは最近、各チェックインに対してコードレビューの実施を開始しました。 チームのリーダーとして、私はあまりにも多くの提案を提供し、開発者をいらいらさせ、チームの出力を減らし、コードを手放すというバランスを見つけようとしています。 有用なアプローチを示唆する、よく知られた情報源からの証拠、研究、またはガイダンスはありますか?

5
古いコードを更新して新しい言語構成を使用する必要がありますか、それとも古い構成を使用する必要がありますか?
プログラミング言語が機能で成長する前に、ずっと前に書かれたまだ機能しているコードでいくつかの拡張を行いたいです。理論的には、プロジェクト全体が最新バージョンの言語を使用しています。ただし、この特定のモジュール(および実際には他の多くのモジュール)は、まだ古い方言で書かれています。 したほうがいい: 触れる必要のないコードの部分には触れませんが、パッチの記述を容易にするが、モジュール内の他の場所の類似の状況では使用されない新しい言語機能を使用してパッチを記述しますか?(これは私が直感的に選択するソリューションです。) 数年が経過したという事実を無視し、パッチの作成中にコードの残りの部分で使用されるスタイルを反映して、何年も前に同じタスクを実行しているかのように効果的に動作しますか?(このソリューションは直感的にばかげていると思いますが、「良いコード」について話す誰もが大騒ぎするので、すべてのコストで一貫性を保つことになります。おそらくこれが私がすべきことです。) モジュール全体を更新して、新しい言語構成と規則を使用しますか?(おそらくこれが最善の解決策ですが、別のタスクに費やすことができる多くの時間とエネルギーが必要になる場合があります。)

5
if条件付きでのset.add()のブール戻り値?
セットクラスのadd演算子は、ブール値を返します。ブール値は、追加する要素がまだ存在しない場合はtrue、そうでない場合はfalseです。書いています if (set.add(entry)) { //do some more stuff } きれいなコードを書くという点で良いスタイルと考えられていますか?あなたは一度に2つのことをするので、私は疑問に思っています。1)要素を追加し、2)要素が存在したかどうかを確認します。

6
単一の実行可能ファイルを開発するときに、異なるC ++コンパイラと言語バージョンを使用する
当社は、衛星通信用の大きくて非常に複雑なソースコードを購入します。 これはC ++でコーディングされており、C ++でもコードに追加をコーディングし、購入したコードとコードを単一の実行可能ユニットにリンクします。 購入したコードの開発に使用したのと同じコンパイラーおよび同じコンパイラーのバージョンを使用する必要がありますか? 購入したコードと同じバージョンのC ++を使用する必要がありますか?それは2014を使用していない場合、我々は_might_それのいくつかの機能を使用したいのですが、異なるバージョンを混合しながらいくつかの問題があるかもしれないではない場合。 理論上はもちろん、特に言語バージョンは重要ではありませんが、コンパイラのバージョンが異なると異なるオブジェクトコードが生成され、タイミングの違いなどが発生する可能性が考えられます。 何に注意する必要がありますか?
15 c++ 

5
多数の構造化構成/プロパティファイルを処理するためのベストプラクティス
多数のサーバーがあるシステムを想像してください。それぞれに多くの設定があります: サーバーに固有のもの 地域固有のいくつか それらすべてに共通するもの このグループのサーバーは読み取り専用であるように、カスタムグループを作成できます 等 私が念頭に置いている現在のプラクティスは、オーバーライド機能を持つ単純なプロパティ構造です。 例の目的でGoogleサーバーを使用してみましょう。それぞれにロードする設定のリストがあります。 たとえば、ロンドンのサーバーには次のものがあります。 rootsettings.properties、europesettings.properties、londonsettings.properties、searchengine.properties、など 各ファイルに一連のプロパティが含まれており、読み込みシーケンスを使用するとプロパティをオーバーライドできます。 たとえば、次のようにrootsettings.properties持っていることがありaccessible=false、デフォルトとして、しかしでオーバーライドされるsearchengine.propertiesとaccessible=true 私がこの構造で抱えている問題は、制御不能になるのが非常に簡単なことです。構造化されていないため、任意のレベルで任意のプロパティを定義でき、多くのアイテムが廃止される可能性があります。 さらに、ネットワークの成長に伴い、非常に多くのサーバーに影響を与えるため、中間レベルの変更は不可能になります。 最後に重要なことですが、個々のインスタンスにはそれぞれ1つの特別なプロパティが必要になる場合があります。つまり、ツリーは最終的に各サーバーの構成になり、最適なソリューションではなくなります。 より良い構成管理アーキテクチャの提案/アイデアがあれば、私は大歓迎です。

1
RESTful APIとi18n:応答を設計する方法は?
主に単一のクライアントのニーズを満たすことを目的としたRESTful APIを設計しています。非常に特殊な状況のため、このクライアントはできるだけ少ないリクエストを作成する必要があります。 APIは、リクエストのAccept-Languageヘッダーを介してi18nを処理します。これは、利用可能なすべてのロケールで単一のエンドポイントへの要求の応答をクライアントが保存する必要がある1つの機能を除き、クライアントが行う必要があるすべてのことに対して機能します。 クライアントが単一のリクエストでこれらすべての情報を取得できるように、一貫性のある適切に構造化されたRESTful API設計を壊さずに、何らかの方法でAPIを設計できますか? これまで検討してきたオプション: Accept-Languageヘッダーに複数のロケールを含めることを許可し、応答で要求されたすべてのロケールのローカライズバージョンを追加します。各ロケールはキーとしてISO 639-1言語コードで識別されます。 そのエンドポイントに「?all_languages = true」パラメーターのようなものを作成し、そのパラメーターが存在する場合、応答で使用可能なすべてのロケールのローカライズバージョンを返します。 (上記のいずれも機能しない場合)ローカライズされたすべてのバージョンをクライアントから取得するために複数のリクエストを作成します。 どれが最良の選択肢ですか?
15 rest  api  api-design  http 

4
Javaでnullチェックを行わずに値を取得する
多くの場合、データ階層から値をフェッチするときにNullPointerExceptionsを回避するためにnullチェックを行います。NullPointerExceptionsはエラーを起こしやすく、多くの定型文を必要とします。 オブジェクトを取得するときにnullチェックをスキップできる非常に単純なルーチンを作成しました... public final class NoNPE { public static <T> T get(NoNPEInterface<T> in) { try { return in.get(); } catch (NullPointerException e) { return null; } } public interface NoNPEInterface<T> { T get(); } } 私はこのように少し使います... Room room = NoNPE.get(() -> country.getTown().getHouses().get(0).getLivingRoom()); 上記の結果、すべての親レベルをnullチェックする必要なく、Roomオブジェクトまたはnullが取得されました。 上記についてどう思いますか?問題のあるパターンを作成していますか?あなたの意見ではこれを行うより良い方法はありますか?
15 java  null 

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