ソフトウェア工学

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

4
キーと値のペアに使用するJSON構造は何ですか?
キーと値のペアに適したJSON形式は何ですか?その理由は何ですか? [{"key1": "value1"}, {"key2": "value2"}] または: [{"Name": "key1", "Value": "value1"}, {"Name": "key2", "Value": "value2"}] または: {"key1": "value1", "key2": "value2"} 最初のバリアントは、よりコンパクトで、より「意味的に意味のある」ようです。2番目のバリアントは、より均等に構造化されているように見えるため、処理に役立ちます。3番目の亜種はさらに意味がありそうです。 キーと値のペアは、他のアイテムに任意のデータを添付するために使用されます。データをJSONとしてシリアル化して、システムを介してデータをラウンドチップする必要があります。
23 json 

5
メモリ破損のデバッグ
まず最初に、これは絶対的な答えのある完璧なQ&Aスタイルの質問ではないことを理解していますが、それを改善するための表現は考えられません。これに対する絶対的な解決策はないと思います。これが、Stack Overflowではなくここに投稿する理由の1つです。 先月、私はかなり古いサーバーコード(mmorpg)をより近代的で拡張/修正しやすいものに書き換えました。私はネットワーク部分から始め、サードパーティのライブラリ(libevent)を実装して、自分のものを処理しました。すべてのリファクタリングとコードの変更により、どこかでメモリ破損が発生し、どこで発生するかを見つけるのに苦労しています。 原始的なボットを実装して負荷をシミュレートしても、クラッシュが発生しない場合でも、開発/テスト環境で確実に再現することはできません(何らかの原因で発生したlibeventの問題を修正しました) 私はこれまで試しました: 地獄を破壊する-ものがクラッシュするまで無効な書き込みはありません(実稼働では1日以上かかる場合があります。1時間かかる場合があります)。これは本当に私を困惑させます。チャンス?(アドレス範囲を「広げる」方法はありますか?) コード分​​析ツール、すなわちコベリティとcppcheck。彼らはいくつかの..を指摘しましたが、コードの厄介さとエッジケースは深刻なものではありませんでした。 (undodbを介して)gdbでクラッシュするまでプロセスを記録し、逆方向に作業します。この/ sounds /は実行可能であるはずですが、オートコンプリート機能を使用してgdbをクラッシュさせるか、可能性のあるブランチが多すぎるために失われる内部libevent構造になります(1つの破損が原因でに)。ポインターが元々どの場所に/どこに割り当てられていたのかを見ることができれば、ブランチの問題のほとんどを解消できると思います。ただし、undodbを使用してvalgrindを実行することはできません。通常のgdbレコードは、使用できないほど遅くなります(valgrindと組み合わせても機能する場合)。 コードレビュー!自分で(完全に)そして何人かの友人に私のコードを見てもらうことで、それが十分に徹底的だったとは思いませんが。コードレビュー/デバッグを行うために開発者を雇うことを考えていましたが、多額の資金を投入する余裕はありません。彼が問題を見つけられなかったり、資格を持っている人がいなければ、お金はありません。 また、注意する必要があります。通常、一貫したバックトレースが取得されます。クラッシュが発生する場所はいくつかありますが、大部分は何らかの理由でソケットクラスが破損することに関連しています。ソケットではない何かを指している無効なポインタか、ソケットクラス自体が(部分的に)意味不明なもので上書きされています。よく使用される部品の1つであるため、クラッシュが最も多いと思われますが、使用されるのは最初に破損したメモリです。 全体として、この問題はほぼ2か月間(忙しく、趣味のプロジェクトが多い)忙しく、不機嫌なIRLになり、あきらめることを考えるほどイライラしています。私は問題を見つけるために他に何をすべきかについて考えることができません。 見逃した便利なテクニックはありますか?どのように対処しますか?(これについてはあまり情報がないため、それほど一般的ではありません..または私は本当に盲目ですか?) 編集: 重要な場合の仕様: gcc 4.7を介したc ++(11)の使用(debian wheezyが提供するバージョン) コードベースは約15万行です david.pfx投稿への応答で編集:(応答が遅くなって申し訳ありません) パターンを探すために、クラッシュの注意深い記録を保持していますか? はい、私はまだ周りの最近のクラッシュのダンプを持っています いくつかの場所は本当に似ていますか?どのように? さて、最新バージョン(コードを追加/削除したり、関連する構造を変更するたびに変更されるようです)では、常にアイテムタイマーメソッドでキャッチされます。基本的に、アイテムには期限が切れる特定の時間があり、更新された情報をクライアントに送信します。無効なソケットポインタは、主にそれに関連するPlayerクラス(私の知る限り有効)にあります。また、クリーンアップフェーズで、明示的に破棄されていないすべての静的クラスを(__run_exit_handlersバックトレースで)破棄する通常のシャットダウンの後、クラッシュの負荷が発生しています。ほとんどの場合std::map、1つのクラスが関与しますが、それが最初に現れるのは単なる推測です。 破損したデータはどのように見えますか?ゼロ?アスキー?パターン? まだパターンが見つかりませんでした。破損がどこから始まったのかわからないので、わかりにくいです。 ヒープ関連ですか? それは完全にヒープ関連です(gccのスタックガードを有効にしましたが、何もキャッチしませんでした)。 破損は後に発生しfree()ますか? 少し詳しく説明する必要があります。すでに解放されたオブジェクトのポインターが横になっているということですか?オブジェクトが破棄されると、すべての参照をnullに設定するので、どこかで見逃さない限り、いいえ。valgrindには表示されますが、表示されませんでした。 ネットワークトラフィック(バッファサイズ、リカバリサイクル)に特有のものはありますか? ネットワークトラフィックは生データで構成されます。したがって、char配列、(u)intX_tまたはより複雑なもののための(パディングを削除するための)パックされた構造体には、各パケットに、予想されるサイズに対して検証されるidおよびパケットサイズ自体で構成されるヘッダーがあります。サイズは10〜60バイトで、最大の(内部「起動」パケット、起動時に1回起動される)サイズは数Mbです。 多くの生産が主張します。損傷が伝播する前に、早期かつ予想どおりにクラッシュします。 私はかつてstd::map破損に関連したクラッシュを経験しました。各エンティティには「ビュー」のマップがあり、それを見ることができる各エンティティはその中にあります。前後に200バイトのバッファーを追加し、0x33で埋め、各アクセスの前にチェックしました。腐敗は魔法のように消え去りました。私は何かを動かして、他の何かを腐敗させたに違いありません。 戦略的なロギング。これにより、直前に何が起こっていたかを正確に把握できます。回答に近づいたら、ログに追加してください。 それは機能します。 必死になって、状態を保存して自動再起動できますか?私はそれを行う生産ソフトウェアのいくつかの部分を考えることができます。 やややる。このソフトウェアは、メインの「キャッシュ」プロセスと、すべてのものを取得して保存するためにすべてキャッシュにアクセスする他のワーカープロセスで構成されています。そのため、クラッシュごとに大きな進歩を失うことはありません。それでもすべてのユーザーが切断されるなど、間違いなく解決策ではありません。 並行性:スレッド化、競合状態など 「非同期」クエリを実行するmysqlスレッドがありますが、これはすべてそのままで、すべてのロックを備えた関数を介してデータベースクラスと情報を共有するだけです。 割り込み 30秒間のサイクルを完了しなかった場合に停止するロックを防ぐための割り込みタイマーがありますが、そのコードは安全なはずです: if (!tics) { abort(); } else …
23 c++  debugging  memory 


6
乱数ジェネレーターはどのように機能しますか?
この質問は、Software Engineering Stack Exchangeで回答できるため、Stack Overflowから移行されました。 8年前に移行され ました。 私はちょうどphp rand()関数について熟考し、それをどのようにリメイクできるかを考えていたところ、完全にばかげて思いつきました。 乱数ジェネレーターはどのように機能しますか?
23 random  numbers 

3
QAチームはGitflow分岐モデルのどこでテストを行う必要がありますか
私たちは、同じgitリポジトリで複数のプロジェクトに取り組んでいる大きなチーム(10〜12人の開発者と4人のqa)です。そのスプリングブートベースのバックエンドWebサービス。優れたgit分岐および展開戦略を探しています。また、機能が期待どおりに機能することを保証するqaチームもあります(ある程度のバグはありません)。 いくつかの記事を読んだ後、Gitflowモデルは私たちにとってうまく機能するだろうと感じました。ここに私の質問が来ます。 QAチームはどこで機能をテストする必要がありますか? 彼らが機能ブランチでテストすれば、彼らはバグを発生させ、開発者はそれを修正し、それがQAテストに合格したら、開発のためにマージします。また、QAは開発ブランチで整数化テストを再度行います。 すべての機能をマージして(ユニットテストと開発者による基本的なテストの後)ブランチを開発し、そこからqaテストを行います。修正とテストもすべて開発中に行われます。 他の人にとってどのアプローチがうまくいったのか知りたいです。
23 testing  git  branching  qa  gitflow 


5
Bob Martinの「Clean Architecture」は、すべてのアーキテクチャの経験則ですか、それともオプションの1つですか?
ボブ・マーティンおじさんのビデオ「きれいな建築の原則」のビデオのコンセプトが本当に気に入りました。しかし、このパターンは、その中心にある抽象ファクトリーパターンとビルダーパターンの組み合わせのようなものだと思います。 これは優れたプログラムを作成する1つの方法ですが、唯一の方法ではありません。 Railsとreactjsは、この種のクリーンなアーキテクチャを促進しない2つのフレームワークです。Railsは、ビジネスロジックがモデル(FatModelsおよびSkinnyControllers)内にあることを期待し、コンポーネント内で反応します。どちらのアプローチも、ビジネスロジックとフレームワークコードを密接に結合します。 私は3つの方法のいずれにおいても間違ったことを見つけません。いずれかを選択するのは判断の呼び出しです。 しかし、ビデオでは、クリーンなアーキテクチャにはビジネスロジックとフレームワークの明確な境界があるべきだと彼は示唆しています。フレームワークは、(ウェブ、アンドロイドなど)プラグインする必要があることをプラグインにでビジネスロジックへ。彼はビデオのレールをわずかにモックしています。 それでは、Bob Martinによる「クリーンアーキテクチャ」はすべてのアーキテクチャの経験則ですか、それともオプションの1つにすぎませんか。

19
開発のための海賊版/クラッキングソフトウェアの使用[終了]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、おそらく再開できると思われる場合は、ヘルプセンターをご覧ください。 8年前に閉鎖されました。 ロックされています。この質問とその回答はロックされています。なぜなら、質問はトピックから外れていますが、歴史的に重要だからです。現在、新しい回答やインタラクションを受け入れていません。 免責事項:私は、海賊版ソフトウェアの使用を決して容認しません。 開発目的での海賊版ソフトウェアの使用を目撃したことはありますか?会社がソフトウェアを購入するのに十分なお金を持っていなかったのに、無料の代替手段がなかったのかもしれません。購入する前に何か試してみたいと思った会社で、その製品の試用ライセンスがなかったかもしれません。どんな状況でも、海賊版/クラッキングされたソフトウェアの使用が認められている会社で働いたことはありますか?これを行うと、結果がありましたか?
22 security  ethics 

1
パブリックリポジトリのセキュリティの脆弱性に対処するPRを処理するためのベストプラクティスは何ですか?
パブリックリポジトリを備えたオープンソースプロジェクトは、安全に報告されているがまだ公開されていないセキュリティ脆弱性に対処するプルリクエスト(PR)を最適に処理する必要がありますか? 私は数百人の貢献者によるオープンソースプロジェクトに関与しています。定期的に予定されている月次リリースの一環として、セキュリティ通知と脆弱性を年に数回公開しています。パッチを適用したバージョンを公開するまで、脆弱性に関する情報は公開しません。プロジェクト管理システム(JIRA)でセキュリティの問題を安全に管理できます。しかし、セキュリティの脆弱性がGitHubに提出されるときに修正するPRを隠すための良いプロセスがありません。私たちは、人々がリリースされる前にこれらの修正を見つけて、ゼロデイエクスプロイトを作成できることを心配しています。 メインリポジトリをフォークするプライベートリポジトリの使用を検討しましたが、現在のレビューとQAワークフローの多くはPRで行われます。ワークフローをセキュリティチームのみのプライベートリポジトリに移動した場合、修正が公開されている場合、tarballを生成してsourceforgeで公開するのにかかる時間までウィンドウが短くなり、大幅に改善されます。また、PRを公開ベータ版にマージすることを避ける必要があるかもしれません。 その方向に進む前に、オープンリポジトリを使用したオープンソースプロジェクトでリリース前のセキュリティバグ修正パッチを処理するためのベストプラクティスを教えてください。GitHubとは異なるプラットフォームを使用することで問題に対処できる場合は、GitLabへの移行を評価していることに言及する必要があります。

11
一部のテーブルのデータベースにセカンダリ主キーを作成する
いくつかのテーブルに、「second_primary_key」を追加します。これは、uuidまたはランダムな長いキーになります。一部のテーブルでは整数をWebアプリケーションに公開したくないため、必要です。つまり、「/ invoices」ページには、請求書のリストと「/ invoices /:id」へのリンクがあります。ここで、:idは整数です。ユーザーにシステム内の請求書の数を知らせたくないので、「/ invoices / 123」の代わりに「second_primary_key」を使用して、URLが「/ invoices / N_8Zk241vNa」になるようにします。 同じことが、実際のIDを非表示にする他のテーブルにも当てはまります。 これは一般的な慣習ですか?これを実装する最良の方法は何ですか? 結局のところ、この手法は何と呼ばれていますか?

5
マイクロサービス:結果整合性の処理
ユーザーのパスワードを更新する機能があるとします。 [パスワードの更新]ボタンをクリックすると、他の3つのサービスがサブスクライブされているトピックにUpdatePasswordEventが送信されます。 ユーザーのパスワードを実際に更新するサービス ユーザーのパスワード履歴を更新するサービス パスワードが変更されたことをユーザーに通知する電子メールを送信するサービス。 結果整合性について私が理解したことから、これらのすべてのサービス(消費者)は同時にイベントを受け取り、それらを個別に処理します。これは、良いシナリオでは、データの整合性につながります。 ただし、サービスがイベントの処理に失敗した場合はどうなりますか?たとえば、突然の切断、データベースエラーなど。これらのトランザクションエラーを処理するための適切なパターン/プラクティスは何ですか? イベントの処理に失敗した場合、RollbackEventがトピック内に作成され、「ロールバックサービス」がジョブを実行してデータを元に戻すRollbackTopicを作成することを考えていました

6
最短時間のレビューのためにコードを文書化するにはどうすればよいですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 去年閉鎖されました。 数か月後にコードの読み取りと閲覧を最小限に抑えるようにコードを文書化したい。 さまざまな種類のドキュメントがあることを知っています(ソースコードと外部、シーケンス図など)。 コードを効率的に文書化する方法を知りたいので、数か月後にコードを確認したいとき、コードの読み取りとコードフローの理解に費やす時間が少なくなります。

6
科学ソフトウェアの継続的統合
私はソフトウェアエンジニアではありません。私は地球科学の分野で博士課程の学生です。 ほぼ2年前、科学ソフトウェアのプログラミングを開始しました。継続的インテグレーション(CI)を使用したことはありません。主に、最初はそれが存在することを知らず、このソフトウェアに取り組んでいるのは私だけだったからです。 現在、ソフトウェアのベースが実行されているため、他の人がそれに興味を持ち始め、ソフトウェアに貢献したいと考えています。計画では、他の大学の他の人がコアソフトウェアへの追加を実装しています。(バグが発生する可能性があります)。さらに、ソフトウェアは非常に複雑になり、テストがますます難しくなりました。また、作業を継続する予定です。 この2つの理由により、私はCIの使用についてますます考えています。私はソフトウェアエンジニアの教育を受けたことがなく、CIについて聞いたことがありません(私たちは科学者であり、プログラマーではありません)。 私はいくつかのアドバイスを得たい質問がいくつかあります: まず、ソフトウェアの動作の簡単な説明: ソフトウェアは、必要なすべての設定を含む1つの.xmlファイルによって制御されます。入力引数として.xmlファイルへのパスを渡すだけでソフトウェアを起動すると、実行され、結果を含むいくつかのファイルが作成されます。1回の実行に最大30秒かかります。 科学的なソフトウェアです。ほとんどすべての関数には複数の入力パラメーターがあり、そのタイプはほとんどが非常に複雑なクラスです。これらのクラスのインスタンスを作成するために使用される大きなカタログを持つ複数の.txtファイルがあります。 では、私の質問に行きましょう。 ユニットテスト、統合テスト、エンドツーエンドテスト?:私のソフトウェアは現在、約30.000行のコードで、数百の関数と〜80クラスです。すでに実装されている数百の関数の単体テストの作成を開始するのは、ちょっと奇妙に感じます。だから私は単にいくつかのテストケースを作成することを考えました。10〜20個の異なる.xmlファイルを準備し、ソフトウェアを実行します。これがエンドツーエンドテストと呼ばれるものだと思いますか?私は頻繁にこれを行うべきではないことを読みましたが、すでに動作するソフトウェアをお持ちの場合、それはスタートとして大丈夫ですか?または、すでに動作しているソフトウェアにCIを追加しようとするのは、単純な馬鹿げたアイデアでしょうか。 関数パラメーターを作成するのが難しい場合、単体テストをどのように作成しますか? 私は機能を持っていると仮定double fun(vector<Class_A> a, vector<Class_B>)し、通常、私はタイプのオブジェクトを作成するために複数のテキストファイル内の最初の読み取りに必要があるだろうClass_AとしClass_B。Class_A create_dummy_object()テキストファイルを読み取らずにダミー関数を作成することを考えました。また、何らかのシリアル化の実装についても考えました。(クラスオブジェクトは複数のテキストファイルにのみ依存するため、クラスオブジェクトの作成をテストする予定はありません) 結果が大きく変動する場合のテストの書き方 私のソフトウェアは、大きなモンテカルロシミュレーションを利用し、繰り返し動作します。通常、1000回の反復があり、反復ごとに、モンテカルロシミュレーションに基づいてオブジェクトのインスタンスを500〜20.000個作成しています。1つの反復の1つの結果のみが少し異なる場合、今後の反復全体が完全に異なります。この状況にどのように対処しますか?最終結果は非常に変動するので、これはエンドツーエンドのテストに対する大きなポイントだと思いますか? CIに関するその他のアドバイスは大歓迎です。

8
アジャイル-何が間違っているのでしょうか?
私はアジャイルチームの開発者であり、スクラムを使用しようとしています。 そこで、状況を説明するために仮想問題をここに入れます。 面倒で保守性の悪いJQueryコードを使用した非常に古いアプリがあります。また、Reactを使用したアプリの一部もあり、それらの部分は更新/保守がはるかに簡単です。それに加えて、会社の目標は、Reactでクライアントシングルページアプリを作成することです。そのため、JQueryを使用すると、さらに離れることができます。 計画を立てるときは、常に開発時間の観点から簡単な解決策を探します。たとえば、新しいダイアログなどを作成する場合は、以前のJQueryを使用します。後で整理してReactに変換しますが、それはめったに起こりません。 ユーザーストーリーから、必要なことの要件を取得します(IMOはよくできていますが、スリムですが、何をしているのか、なぜそれをしているのかを説明しています)。 新しい機能の要件は非常にスリムな場合があるため、たとえば、要件が「大量のコンテンツをロードするダイアログを作成する」と言っているが、ロード機能を実装するように言っていない場合、ほとんどの場合、実装しません、それは私たちがスプリントの目標を妥協する可能性があるという理由で、私たち全員がそれが顧客にとってより良いことを知っているにもかかわらずです(私は個人的にはそうはしないと信じていますが)。 その結果、私たちのコードベースは非常に保守性の悪い大きな混乱であり、新しい機能は非常に小さく、フルスプリントを費やすことがあります(良いコードベースで1日で達成できるもの)主にこの開発のため戦略、ただ速く行き、最小限のことをしてください。 この場合、何が間違っていますか?先週書いたばかりの悪いコードを書いたりコードを書き直したりしないように、より完全な方法で解決策に取り組むべきでしょうか?それとも、すべてのコードが書き直されていることを確認するだけでそれを続けるべきでしょうか?この問題に対するアジャイルなアプローチは何でしょうか?
22 agile  scrum 

8
原始的な強迫観念がコード臭ではないのはいつですか?
私は最近、原始的な強迫観念をコードの匂いとして説明する記事をたくさん読みました。 原始的な強迫観念を回避することには2つの利点があります。 ドメインモデルをより明確にします。たとえば、郵便番号を含む文字列ではなく郵便番号についてビジネスアナリストと話すことができます。 すべての検証は、アプリケーション全体ではなく1か所で行われます。 いつコードの匂いがするかを説明する記事がたくさんあります。たとえば、次のような投稿コードのプリミティブな強迫観念を取り除くことの利点を見ることができます。 public class Address { public ZipCode ZipCode { get; set; } } ZipCodeのコンストラクタは次のとおりです。 public ZipCode(string value) { // Perform regex matching to verify XXXXX or XXXXX-XXXX format _value = value; } 郵便番号が使用されるすべての場所にその検証ロジックを置くDRY原則を破ることになります。 ただし、次のオブジェクトについてはどうですか: 生年月日:気づきよりも大きく、今日の日付よりも小さいことを確認します。 給与:ゼロ以上であることを確認します。 DateOfBirthオブジェクトとSalaryオブジェクトを作成しますか?利点は、ドメインモデルを説明するときにそれらについて話すことができることです。ただし、これは多くの検証がないため、オーバーエンジニアリングの場合です。いつ、いつ原始的な強迫観念を取り除くべきでないかを説明するルールはありますか、可能であれば常にそれを行うべきですか? クラスの代わりに型エイリアスを作成できると思います。これは上記のポイント1に役立ちます。

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