ソフトウェア工学

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

3
シナリオとユースケースの違い
シナリオはユースケースよりも詳細な全体像ですか、それともどのくらいの違いがありますか?私はシナリオという言葉を好むところにレポートを書きますが、私のトレーニングではユースケースという言葉を使用しました(OOPに関するコースで)。 OOPではないSMVでプログラミングしています。IIUC SMVは、ハードウェアのモデルチェックに特化したドメイン固有の言語です。実際のコードは私のgithubにあります。

2
技術的な負債/技術のアップグレードは、機能(ポイントを与える)または雑用(ポイントを与えない)としてスケジュールする必要がありますか?
Pivotal Trackerの技術的負債のユーザーストーリーに対して、私たちは何をすべきですか?これらを特徴(ポイントを与える)または雑用(ポイントを与えず、速度を下げる)と見なす必要がありますか? 私は雑用と見なされるべきものを混乱しています: コードの重複-複数の場所に同じコードを配置した場合、それはコードの習慣としては非常に悪いことであり、チームの開発者はソフトウェアを保守可能にするためにより多くの検討を行い、リファクタリングを行い、コードレビューに時間を費やす必要があることを示しています。これにはすべて、成熟度、時間、コードレベルの経験が必要になるため、提供するポイント数を少なくして、コードの品質が損なわれないようにすることをお勧めします。したがって、そのようなミスは罰せられるべきであり、雑用にポイントを与えないことによって速度を下げる必要があります。 テクノロジーのアップグレード-JS、HTTP2、React、MVCまたはその他の新しい/より優れたテクノロジーのモジュール化への移行のように。これらの手順により、コードのパフォーマンスとメンテナンスが改善されます。しかし、これは雑用か機能か?これがテクノロジーの世界のあり方であり、新しいテクノロジーが時々やって来て、それに移行する必要があると思います。したがって、そのような作業に対してチームの速度にペナルティを課すことには意味がありません。提案? レガシーコードの複製/サブスタンダードコード-長い間使用されていないコードや、新しいチームが結成されたがコードベースが少し古い場合、この問題に直面します。チームはこのセクションをコーディングしていないので、なぜそれらの負債を作成したことがないので、なぜそのような技術的負債を選ぶことによって彼らの速度にペナルティが課せられるべきであるとチームは言います。 ビジネスの緊急性が原因の標準以下のコード-競合他社/ターゲット/ビジネス/ユーザーのプレッシャーが原因で、開発者は機能をすぐにライブでプッシュしなければならない場合があります。そのような悪いコードのクリーンアップも雑用(ポイントを与えない)と見なす必要がありますか?今回の開発チームに問題はないので、なぜ彼らの速度を下げなければならないのですか? 上記のすべてのタイプの雑用は、賢明に行えば、将来的にチームの速度を向上させるはずです。しかし、チームの速度を維持しながらバランスを保ち、チームが悪い決定を下すことで技術的なミスを罰する必要があるでしょうか。 質問は次のようなものです。 技術的な負債は機能または雑用(またはバグ)としてスケジュールする必要がありますか?が、4つのポイントすべてを網羅する説得力のある回答が見つからなかったため、別の方法で再投稿しています。

1
C ++のイテレータカテゴリは、UTF-8イテレータアダプタの作成を禁止していますか?
私はUTF-8イテレーターアダプターに取り組んでいます。つまり、イテレータをaに、charまたはunsigned charシーケンスをイテレータからシーケンスに変換するアダプタを意味しchar32_tます。ここでの私の仕事は、オンラインで見つけたこのイテレータに触発されました。 ただし、独自の実装を開始するときに標準を調べたところ、C ++がイテレータに課す要件に準拠しながら、このようなアダプタを実装することはできないようです。 たとえば、InputIterator要件を満たすUTF-8イテレータを作成できますか?はい。ただし、指定されたイテレータ自体がInputIteratorではない場合に限ります。どうして? InputIteratorは、同じイテレータを複数回逆参照する機能を必要とするためです。それらがすべて等しい場合、そのイテレータの複数のコピーを逆参照することもできます。 もちろん、UTF-8イテレーターアダプターを逆参照するには、基本イテレーターの逆参照と、場合によっては増分を行う必要があります。そして、そのイテレーターがInputIteratorである場合、元の値をインクリメントした後に戻すことはできません。また、コピーが機能する必要があるという事実char32_tは、以前にデコードされた値を表すをローカルに保存できないことを意味します。あなたはこれを行うことができたでしょう: auto it = ... auto it2 = it; //Copies an empty `char32_t`. *it; //Accesses base iterator, storing `it.ch`. *it; //Doesn't access the base iterator; simply returns `it.ch`. *it2; //Cannot access `it.ch`, so must access base iterator. わかりました。InputIteratorsは使用できません。しかし、ForwardIteratorはどうでしょうか?UTF-8文字シーケンスでForwardIteratorを適応できるForwardIteratorアダプターを作成することは可能ですか? またはを生成するに*itは操作が必要なため、これも問題です。InputIteratorsはに変換可能である何かを吐き出すことができますが、[forward.iterators] /1.3実際の参照を提供するために必要とされます。value_type&const value_type&value_typeForwardIterator Xが可変イテレータである場合、referenceはへの参照Tです。Xが定数イテレータの場合、referenceはへの参照ですconst T ここでの唯一の手段は、そのようなすべてのイテレータがを持ち運ぶchar32_tことです。これは、その参照用のストレージを提供するためだけに存在します。その場合でも、イテレータインスタンスがインクリメントされ、逆参照されるたびに、その値を更新する必要があります。これは古い参照を事実上無効にし、標準はそれを明示的に許可していません(無効化はイテレータが破棄された場合、またはコンテナがそうした場合にのみ発生します)。 …
8 c++  c++11  unicode  utf-8 

8
単一の責任の原則違反ですか?
私は最近、以下のクラスに関して別の開発者との議論に入りました: public class GroupBillingPayment { public void Save(IGroupBillingPayment model) { if (model == null || UserInfo.UserID == 0) { throw new Exception("GroupBillingPayment object or Current User Id is NULL , Please Contact Administrator."); } Data.GroupBillingPayment groupBillingPayment = RepositoryManager.GroupBillingPaymentRepository.GetById(model.GroupBillingPaymentID); Mapper.Map(model, groupBillingPayment); ServiceManager.GroupBilling.IsBillAlreadyCancelled(groupBillingPayment.GroupBillingID, THROW_ERROR); groupBillingPayment.UpdatedBy = UserInfo.UserID; groupBillingPayment.UpdatedOn = DateTime.Now; RepositoryManager.GroupBillingPaymentRepository.Update(groupBillingPayment, false); …

1
スクリプトをページごとに1つのバンドルにバンドルするのが良い方法ですか、それとも複数のバンドルを使用する方が良いですか?
私が取り組んでいるWebアプリケーションには、3種類のスクリプトがあります(スタイルシートにも同じことが当てはまります)。 すべての単一ページで必要なもの(jqueryなど) すべてではなくいくつかのページで必要なもの(たとえば、ユーザーがアップロードした画像を表示するページで使用されるライトボックスライブラリ) 単一のページで必要なもの(たとえば、そのページの機能に固有の何か) 各ページには、必要なすべてのスクリプトをまとめた独自のバンドルが必要ですか?または、各タイプのスクリプトを独自のバンドルにする必要があります(つまり、ページが3つのバンドルをロードする可能性があります-EssentialScripts.js、mediaLibraries.js、およびpageSpecificScripts.js)?または私が知らないより良いアプローチはありますか? これらのスクリプトをバンドルするためのベストプラクティスは何ですか?また、さまざまなアプローチにはどのような利点/欠点がありますか? (これがどの程度関連性があるかはわかりませんが、私が取り組んでいるプロジェクトはASP.NET MVCバンドルを使用しています。また、より簡単にするために、サードパーティのCDNからのファイルはないと仮定しましょう。それらはすべて同じ場所から読み込まれ、クライアントは他のサイトにアクセスする必要はありません。)

3
トークンによる認証
私はjwt.ioと認証に比較的慣れていないため、次のようにJWT.ioを使用しています。 サーバ側 ユーザーがログインしたら、userid内部に埋め込まれたトークンを生成し、メッセージ本文でユーザーに返します クライアントサイドブラウザー/ JSトークンをlocalStorageに保存し、後続の各リクエストで、トークンをヘッダーに渡します。 Authorization: Basic someEncryptedValue 私も使用しました X-Auth-Token: someEncryptedValue これをクッキーに入れてもいいですか? 次に、サーバー側で、トークンをシークレットに対して検証し、有効期限を確認し、トークンからIDを取得して、リクエストを処理します。 このワークフローはすべて正しいですか?

3
ORMはツリーのようなDB構造にとって悪いツールですか?
この質問は意見に基づくものとして締めくくられるかもしれませんが、今必要なのは議論によって裏付けられたいくつかの意見です。 PostgresとEcto(Elixir)を永続化レイヤーとして使用してアプリケーションを構築しています。それ自体を参照するエンティティがあるため、それを使用してツリーのような構造を構築できます。Ectoでこれをやろうとすればするほど、いらいらします。 ORMは、多くの関連付けを持つ複雑なDB構造を作成するための単なる悪いツールですか?ORMがリレーショナルデータに適用しようとするオブジェクト指向の方法は、ここでは悪いアプローチのようです。オブジェクトは分離されています。それらが他のオブジェクトと相互作用する場合、それらは(想定されている)メッセージを送信します。彼らの内面の詳細は隠されたままである必要があります。リレーショナルデータは、開いた透明なグラフを形成します。これら二つの世界は私と完全に両立しないようです。 しかし、ORMは非常に一般的で人気があります。Webアプリケーションの大部分はORMでうまく機能する分離されたエンティティで動作しますか、それはなぜですか?ORMフレームワークを使用して平均的に複雑なERDモデルを実装する場合は、簡潔なコードまたはパフォーマンスを犠牲にする必要があるように思われます。

8
デバイスドライバーが必要になるのはいつですか、いつポートに直接読み書きしても問題ありませんか?
デバイスドライバーが必要な場合や、OSが提供するシリアル/パラレル/ USBなどを介してポートコントローラーと直接通信するだけで問題ない場合は、理解に苦労しています。運転者。 たとえば、例1:OpenBCIを見てみましょう。これは、EEG + EKG( "brainwave")の読み取り値を読み取ることができるオープンソースのハードウェアBCIです。OpenBCIヘッドセットは、マシンに接続されたUSBドライブにRF信号を送信し、独自のソフトウェアを記述して、そのポートに着信するデータを読み取ることができます。したがって、自分の脳波を読み取って、アプリ層で脳波データを解釈することができます。かなりクール。「ストリーミング」脳波データを読み取るには、シリアルポートから読み取るだけでなく(OSが提供するシリアルドライバーを使用)、OpenBCI仕様に従ってデータを解釈する必要があります。したがって、スタックは次のようになります。 しかし、ここには、OpenBCIヘッドセットに固有の「デバイスドライバー」はありません。データのバイトを読み取るために必要なシリアルドライバーだけで、アプリ内からこれらのバイトの意味を解釈する必要があります。したがって、たとえば、Javaアプリで脳波データを解釈したい場合は、JSerialCommを使用してローカルCOMポート(またはローカルシステム上のUSBが何であれ)からデータを読み取ることができます。その後、上記の仕様に従ってデータを調査するのは私のアプリ次第です。 さて、例2:このような Logitech USBウェブカメラ。ここでは、Webカメラのデバイスドライバーをマシンにインストールして使用できるようにする必要があります。なぜだろう。このWebカメラのピン配置が愚かで単純だったとしましょう(ちょっと " 信じます! "ボタンを押します)。 PIN # Meaning =================== 1 Power 2 Ground 3 Send data (if 1 then the camera will start "streaming" its video data over data pins) 4 Data pin 1 5 Data pin 2 これはOpenBCIと同様にUSBデバイスです。では、なぜUSB /シリアルポートに直接読み書きする(これもおそらくJSerialCommなどを使用する)だけのアプリ(どの言語でも)を作成できないのでしょうか。私はアプリがウェブカメラの映像データの取得を開始したい場合は、私はシリアルポートにバイトを送信する(再び JSerialCommなどを経由して)回しピン#3高/後ピン4と5からのビデオデータを読み始める上、およびこと。 OpenBCIがデバイスドライバーを持たない、または必要としないのに対し、Webカメラ(またはプリンター、マウス、キーボードなどの他の標準USBデバイス)が備えている理由が理解できないと思います。前もって感謝します!
8 drivers  usb 

4
非常に複雑なソフトウェアのコードベースを管理するにはどうすればよいですか?
私は、さまざまなオブジェクト指向プログラミング言語を使用して、自分自身と他の人のためのプログラムを作成することがよくあります。その場合、通常は比較的小さくなります(最大で数千行)。しかし最近、私は完全なゲームエンジンなど、より大きなプロジェクトを作成しようとしています。そうするとき、私はしばしば複雑さという障害にぶつかるように見えます。 私の小さなプロジェクトでは、プログラムのすべての部分がどのように機能するかについてのメンタルマップを覚えることは簡単です。これにより、変更がプログラムの残りの部分にどのように影響するかを十分に認識し、バグを非常に効果的に回避できるだけでなく、新機能がコードベースにどのように適合するかを正確に確認できます。しかし、より大きなプロジェクトを作成しようとすると、非常に面倒なコードと多数の意図しないバグにつながる、優れたメンタルマップを維持することが不可能であることがわかりました。 この「メンタルマップ」の問題に加えて、自分のコードを他の部分から切り離しておくことは難しいと思います。たとえば、マルチプレーヤーゲームにプレーヤーの動きの物理を処理するクラスとネットワークを処理するクラスがある場合、これらのクラスの1つが他のクラスに依存してプレーヤーの動きのデータをネットワークシステムに取得する方法はありませんネットワーク経由で送信します。このカップリングは、優れたメンタルマップを妨げる複雑さの重要な原因です。 最後に、他のクラスを調整する1つ以上の「マネージャー」クラスを考え出すことがよくあります。たとえば、ゲームでは、クラスがメインのティックループを処理し、ネットワーククラスとプレーヤークラスの更新メソッドを呼び出します。これは、各クラスは他とは独立して単体テスト可能で使用可能でなければならないという私の研究での発見の哲学に反しています。そのようなマネージャークラスは、その目的によってプロジェクトの他のほとんどのクラスに依存しているためです。さらに、プログラムの残りのマネージャークラスオーケストレーションは、メンタルマッピング不可能な複雑さの重要な原因です。 まとめると、これにより、かなりのサイズの高品質のバグのないソフトウェアを作成できなくなります。この問題を効果的に処理するために、プロの開発者は何をしますか?私は特にJavaとC ++のOOP回答ターゲットに興味がありますが、この種のアドバイスはおそらく非常に一般的です。 ノート: 私はUMLダイアグラムを使用してみましたが、それは最初の問題に役立つようであり、それでも(たとえば)最初に初期化されるものに関するメソッド呼び出しの順序付けではなく、クラス構造に関する場合に限られます。

6
戦闘(認識)オーバーエンジニアリングvs流れに乗る[終了]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 3年前休業。 私のデザインとは異なるアプローチを持つチームに参加しました。私はYAGNIのデザインへのアプローチを信じています。たとえば、メソッド(インターフェース、クラス)が使用されていない場合は、削除する必要があります。それでおしまい。 私のチームの人々はモジュール式のアプリを構築しており、モジュールの1つは「フレームワーク」として認識されています。アプリはこのフレームワークの唯一のユーザーであり、現時点でクライアントを増やす計画はありません。ただし、このフレームワークのコードの一部は、あたかも後で使用されるかのように作成および保守され、一貫性と完全性はYAGNIよりも優れています。抽象化が必要になることのない場所に抽象化があるなど。 私はいくつかのことを議論しようとしましたが、仮に仮に説得するにしても、それぞれのポイントにはかなりの時間がかかります。 「フローに沿って」、個人的な問題なしに追加のコードを書くことができます。それは、後に維持するために、最も可能性の高いより多くの時間をコードに今私に多くの時間がかかる、となりますが、余分にも時間がかかり、圧力を加える何かをしないように、それぞれの議論を。 問題は、異なる意見の場合、より大きな不利益、不要であるが「適切な」コード、または定数の引数と壊れたチームのダイナミクスは何をするのでしょうか?

2
GitHub Flowはマスターにマージする前に本番環境にデプロイします:2番目の機能が最初の機能をオーバーライドしませんか?
GitHubフローを理解するために、ここで見られるように、コードレビューの後、機能は最初に本番環境にデプロイされ、次にマスターにマージされます。 最初の機能と同じコミットから分岐した2番目の機能があり、それも本番に直接デプロイされている場合、本番には最初の機能が含まれなくなります。 learngitbranching.js.orgで作成 c2がデプロイされたら、c2またはc4とマージする前にc3をどのようにデプロイできますか? GitHub Flowはこの問題をどのように処理しますか? 明白な解決策は、本番環境にデプロイする前に、機能をマスターにリベースする必要があることです。ただし、これは人為的なミスが発生しやすくなります。リベースを忘れた場合、プロダクションには機能がありません。 特にGitHub Flowの使用経験のある方からの回答をお願いします。どのようにこの問題を抱えていませんか?
8 git 

3
スクラム/アジャイルで、検証/ルールエンジンを段階的に提供する方法は?
有効にするために100のルールをカバーする必要がある検証エンジンがあるとします。 また、チームは反復ごとに約10のルールしか配信できないと仮定します。 ルールエンジンにコアルールの90がまだ不足している場合、最初の反復の終わりまでに「リリース可能な製品の増分」を行うにはどうすればよいでしょうか。 たとえば、すべてのルールが実装されていないという事実に基づいて常に起動する一時的な失敗/警告を追加しますか? コンテキストの編集:私は、大規模なモノリスを複製して置き換えることを目的とした、多くのレガシーユースケースを持つ複雑なビジネスプロセス用のミドルウェアを開発しています。100%カバレッジなしでライブ配信するのは困難です。サービスを要求する運用で表示されるトリッキーなユースケースを決定または制限する機能が限られているためです。
8 agile  scrum 

2
統合テストですが、どれくらいですか?
私のチーム内での最近の議論は私を不思議に思いました。基本的なトピックは、機能/統合テストでいくら、何をカバーするかということです(確かに、それらは同じではありませんが、例は重要ではないのでダミーです)。 次のような「コントローラ」クラスがあるとします。 public class SomeController { @Autowired Validator val; @Autowired DataAccess da; @Autowired SomeTransformer tr; @Autowired Calculator calc; public boolean doCheck(Input input) { if (val.validate(input)) { return false; } List<Stuff> stuffs = da.loadStuffs(input); if (stuffs.isEmpty()) { return false; } BusinessStuff businessStuff = tr.transform(stuffs); if (null == businessStuff) { return false; …

1
大きな(数ギガバイト)ファイルのアップロードを処理するオプション
DjangoアプリケーションとS3で非常に大きなファイルのアップロード機能をどのように実装しますか? 写真家としての副業で、問題のあるイベントの元の画像と処理された画像を含むマルチギガバイトのアーカイブ(zip、tar)ファイルを共有する必要があるクライアントがいくつかいます。これまでは、これにGoogleドライブを使用してきました。GDにファイルをアップロードし、ローカルストレージドライブにファイルを取得して保存していました。アップロードされたファイルはMacのGoogleドライブクライアントを介してコンピューターにミラーリングされるため、GDフォルダーを時々クリーンアップします。私のMacには256GBのオンボードドライブしかないので、スペースは非常に貴重です。 1つのクライアントで、過去4か月間に2つのハードドライブ障害が発生しました。過去10年間、私が彼らに雇われていたのはゼロでした。彼らはより良いソリューションを望んでおり、私はすでに開発者です。 ここでの問題は、ブラウザに12ギガバイトを超えるアーカイブファイルのキューイングとサーバーへの転送を任せることをお勧めします。このファイルは、S3に移動する前に属性のスキャンを行います。 これには2つのオプションがあります。 ブラウザでファイルアップロードフォームを使用して、マルチパートファイルをサーバーにアップロードします。完了すると、ファイルはローカルのCeleryタスクによってチェックおよび処理され、S3バケットにアップロードされます。 ローカルファイル処理のCeleryタスクの実行をトリガーするDjango管理コマンドを実装し、Paramikoを使用してローカルPythonスクリプトを使用してファイルをアップロードし、アップロードが完了したときに管理コマンドの実行をトリガーします。 個人的には、私はオプション2に傾いていますが、可能であれば他のアイデアを求めています。

2
単一の認証ポイントの実装
単一の認証ポイントに接続された一連のWebアプリを構築しています。基本的に、ユーザーはサイトにアクセスしようとしますが、認証されていない場合、中央の認証システムのログインページにリダイレクトされます。ログインに成功すると、アプリにリダイレクトされます。それ以降、他のアプリにアクセスすると、自動的にサインオンされます。 さらにいくつかの詳細:1)アプリはすべて同じドメインで実行されるため、ドメインCookieを使用できるので、物事が簡単になります。2)ユーザーは一部のアプリへのアクセスを許可され、他のアプリへのアクセスは許可されない可能性があるため、考慮に入れる必要があります。3)ユーザーは、各アプリに固有の権限を取得できる必要があります。 私は何かを実装しましたが、100%満足していません。現在、これは私が持っているものです。1)Webアプリは、セッション(アプリに固有)の存在と、集中認証システムから送信されたJWTトークンであるCookieをチェックします。2)Cookieが存在しない場合、認証システムのログインページにリダイレクトします。3)ユーザーがログインすると、JWTトークンを渡してアプリにリダイレクトされます。4)アプリは、認証システムへのREST API呼び出しを介してトークンを検証します(このREST API呼び出しは別のアクセストークンに依存します)。有効な場合、JWTトークンはCookieとして保存され、セッションはユーザーがログインしました。5)アプリセッションの有効期限が切れた場合は、Cookieが存在するかどうかを確認し、存在する場合はステップ4と同じようにアプリがトークンを確認してセッションを再開します。6)ログアウト時に、システムはCookieを削除するだけです。ユーザーがすべてのアプリからログアウトしていることを確認します。7)トークンの有効期限が切れた場合、アプリは期限切れのトークンを使用して新しいトークンをリクエストします。トークン署名と他のクレームは、新しいトークンを発行する前に検証されます。検証されないのは、有効期限クレームのみです。 明確にするために、アプリに固有のセッションの存在が使用されているため、トークンを確認するためにREST API呼び出しを常に行う必要はありません。しかし、トークンが一度検証された場合、有効なセッションが存在することを示すインジケータとしてそのCookieを使用するだけで安全ですか? よくわからないことの1つは、トークンを使用して他のREST API呼び出しを実行し、アプリ固有のリソースを取得できるため、トークンにはそれが何のアプリであるかを示すものが必要であるということです。しかし、app1のトークンを取得してからapp2にログインすると、app2はapp2によって生成されたCookieに依存します。つまり、2つのトークンが必要なようです。1つはユーザーが認証されたことを示すためにドメインCookieとして保存でき、もう1つは実際にアプリ固有であり、他のアプリのREST API呼び出しに使用できます。特定のリソース。 私はこれを複雑にしていますか、それとも私の考え方は他の人が見ている/行っていることと一致していますか?またはこれを行うよりエレガントな方法はありますか?私はOpen IDのようなものを実装することを考えましたが、私たちのニーズに対してはやり過ぎのようです。プロセスを文書化し、他の開発チームが多くの支援を必要とせずに認証システムにプラグインするアプリを開発できるように、これをできるだけ単純にしたいと思います。

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