ソフトウェア工学

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

10
コードカバレッジ品質の議論に反論する方法に関するツール/提案
今、私は人々がこの質問を複製したり何度も質問したりすることを考えることができることを知っています。その場合、関連する質問へのリンクと私の質問への回答に感謝します。 私は最近、コードカバレッジについて何人かの人々と意見が分かれています。私は、100%のカバレッジは高品質のテスト、したがって高品質のコードを意味しないという議論に基づいて、チームにコードカバレッジを完全に削除することを希望する人々のグループがいます。 私は、コードカバレッジがテストされていないことを確かに伝えており、それらの領域に集中するのに役立つという議論を売り払うことによって押し戻すことができました。 (上記は、このような他のSO質問で同様の方法で議論されています-/programming/695811/pitfalls-of-code-coverage) これらの人々からの議論は次のとおりです。そして、チームは低品質のテストをすばやく作成することで反応し、重要な品質を追加することなく時間を無駄にします。 私は彼らの視点を理解していますが、より多くのカバレッジ基準を処理するより堅牢なツール/フレームワークを 導入することにより、コードカバレッジのより堅牢なケースを作成する方法を探しています(Functional, Statement,Decision, Branch, Condition, State, LCSAJ, path, jump path, entry/exit, Loop, Parameter Value etc)。 私が探しているのは、このようなコードカバレッジツールとプラクティス/プロセスの組み合わせを提案して、それらに合うようにすることです。 主観的ではあるが、コードカバレッジによりコードの品質とテストの価値をより意識できるようになったため、このような議論に対抗する方法に関するあなたの経験/知識に基づいた付随するコメント/提案も歓迎します。 編集:典型的なコードカバレッジの弱さに対する私の理解に関する混乱を減らすために、ツール(または実行されたコードの行)を参照しているわけではない ことを指摘したいと思いStatement Coverageます(たくさんあります)。実際には、ここでそれが間違っているすべてに関する良い記事があります:http : //www.bullseye.com/statementCoverage.html 複数のカバレッジの基準とレベルにさらに踏み込んで、ステートメントまたはラインカバレッジ以上のものを探していました。 参照:http : //en.wikipedia.org/wiki/Code_coverage#Coverage_criteria アイデアは、ツールが複数の基準に基づいてカバレッジを教えてくれれば、それがテスト品質の合理的な自動評価になるということです。私は決して回線カバレッジが良い評価だと言っているわけではありません。実際、それが私の質問の前提です。 編集: わかりました、多分私はそれを少し劇的に投影しすぎたかもしれませんが、あなたはポイントを得ます。問題は、すべてのチームに共通のプロセス/ポリシーを同種/一貫した方法で設定することです。また、テストの品質をどのように保証するのか、何の対策も講じずに保証時間をどのように割り当てるのかという懸念が一般的です。したがって、適切なプロセスと適切なツールでバックアップすると、無駄なプロセスに時間を費やしていないことを認識しながら、コードの品質を改善できる測定可能な機能が好きです。 編集:これまでのところ私が答えから持っているもの: コードレビューは、テストの品質を確保するためにテストをカバーする必要があります Test First戦略は、事実の後に書かれたテストを回避して、カバレッジを単純に増加させるのに役立ちます% 単純なステートメント/行以外のテスト基準をカバーする代替ツールの探索 カバーされたコード/見つかったバグの数の分析は、カバレッジの重要性を評価し、より良いケースを作るのに役立ちます 最も重要なことは、正しいことを行い、彼らの信念のために戦うというチームのインプットを信頼することです。 対象ブロック/テスト数-議論の余地あり これまで素晴らしい答えをありがとう。本当に感謝しています。このスレッドは、その能力を持つブレインストーミングの時間よりも優れています。

1
EOF(ファイルの終わり)文字をchar型に格納する
EOF値を保持できるようにEOF値を十分に大きくするために、EOFを保持する変数に使用する必要があるデニスリッチーのThe C Programming Language本を読みました。ただし、次のコードは正常に機能します。intchar #include<stdio.h> main() { char c; c=getchar(); while(c!=EOF) { putchar(c); c=getchar(); } } 入力がなくなると、getcharEOFを返します。また、上記のプログラムではc、char型の変数が正常に保持できます。 なぜこれが機能するのですか?上記の本の説明によると、コードは機能しません。
11 c 

2
サブスクリプション、残高、価格プランの変更の処理[終了]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 4年前に閉鎖されました。 序文 私の目的は、サブスクリプションを管理するために、複数のプロジェクト用の再利用可能なコードを作成し(そしてgithubで公開することです)。ストライプと定期請求プロバイダーについては知っていますが、このモジュールが目指しているのはそれではありません。アカウントの残高を計算するためのラッパー/ヘルパー、サブスクリプションを更新するための簡単な通知、および価格計算を処理するための単なるラッパー/ヘルパーでなければなりません。 プロバイダーまたは支払いの可能性が不十分またはまったくサポートされていないか、高額すぎる(マイクロペイメント)ため、繰り返し請求を使用できない国があります。また、定期的な請求を使用したくないが、年末に請求書を手動で支払う/請求書を保存する人もいます。したがって、PayPalの定期的な請求、繰り返しまたは同様のサービスを提案しないでください。 状況 サブスクリプションプランにサブスクライブできるモデルがあるとします(例:)User。このモデルには、現在サブスクライブしているサブスクリプションプランの識別子を格納するフィールドがあります。そのため、計画が変更されるたびに、変更が記録されます。 SubscriptionPlanChanges前述の変更を記録する次のフィールドを持つモデル(など)があります。 subscriberサブスクライブモデルに関連する(Userこの場合) from_plan モデルが変更前に持っていたプラン識別子を定義する to_plan モデルが現在選択しているプラ​​ン識別子を定義する created_at 変更を保存する日時フィールドです valid_until 実際のサブスクリプションが有効になるまで日付を保存します paid_at また、サブスクリプションが支払われたかどうか(およびいつ支払われたか)を定義する日時フィールドです。 もちろん、そのレイアウトは議論可能です。 アカウント残高の質問 ユーザーがサブスクリプションプランを変更する場合、プランフィールドを比較し、価格を取得し、現在のプランvalid_untilとその価格に基づいて新しいプランの控除を計算する必要があります。説明:プランAの1年間をサブスクライブしましたが、6か月後にプランBにアップグレードすると、プランAの6か月の支払額の半分が差し引かれます。 私が不思議に思っているのは、ユーザーが無料プランに切り替える場合など、ユーザーが再度切り替えたい場合に控除できるクレジットを持っていることです。その値を追加のフィールドにキャッシュするか、そのユーザーに関連するすべてのレコードを毎回計算しますか?テーブルのレイアウトについて何か追加/変更しますか? わかりやすさの質問 サブスクリプション期間の終わりが来ると、ユーザーは通知を受け取り、再度支払うことでサブスクリプションを更新する可能性があります。最も簡単な方法は、更新するだけpaid_atでvalid_until、新しいサブスクリプションオプションを使用することです。ただし、支払い/購読履歴など、誰かが必要とする可能性のあるすべてのデータを保存するかどうかはわかりません。 別のオプションは、このための追加レコードを作成するだろうfrom_planとto_plan(したがって、「変化なし」を象徴しない)同じ識別子を持っているし。しかし、それは何らかの形で口座残高の計算を妨げませんか? そのようなサブスクリプションを処理するロジックについて誰かが私を正しい方向に向けることができたら、とても感謝しています。 更新 今では助けてくれてありがとう。私の質問はあまりにも曖昧だったので、抽象化を少なくして、より正確になろうと思います。残念ながら、まだ問題を解決できませんでした。 ケースA Userはを選択できますSubscription Plan A。これは現在SubscriptionPlanChange、それを追跡するために保存されます。たとえば5か月後User、サブスクリプションをにアップグレードしますSubscription Plan B。そのため、彼は新しいサブスクリプションの価格を支払い、未使用の7か月のプランaの価格を差し引きます。 ケースB 3か月後、User彼のに戻りSubscription Plan Aます。彼は支払いをする必要はありませんが、残高を受け取るので、サブスクリプションの終了時に、彼は新しいサブスクリプションのためにその残高を差し引きます。 ケースC Userでは、独立したサブスクリプションプランを持つサブサービスのサブスクリプションプランを選択できます。同じでCase A、Case Bそのサブサービスのサブスクリプションに適用できます。 _Case D_ ユーザーがサブスクリプションの1つをキャンセルします。これにより、彼のバランスが回復します。 私の質問(少なくとも現在)は、主にそのデータを適切に保存する方法に依存しているので、ビジネス分析のためにサブスクリプションの履歴を再現し、残高を計算し、サブスクリプションに基づいて未払いを得ることができます。 また、ユーザーモデル自体などに残高を保存する必要があるかどうか、または保存されていないが保存されたデータ/履歴に基づいていつでも計算できるかどうかもわかりません。 注意すべき点がいくつかありますが、問題が発生することはないと思います。 …

6
ソフトウェアエンジニアリングが正式な職業になるには、何を変える必要がありますか?
他の職業(会計、法律、医学など)とは異なり、ソフトウェアエンジニアリングの職業全体の認定はありません。 専門性と経験の証明を目的とする多くの技術と方法論に固有の認定をよく知っていますが、一般に受け入れられている専門的な基準を設定する(そして法的に評価する権限を持つ)公的なソフトウェアエンジニアリング学会/統治機関はありません。 私はソフトウェアが動的な獣であることを理解しています-それは芸術でもあり科学でもありますが、ソフトウェアエンジニアリングが正式な職業になる可能性があるのか​​と思っています。 これを実現するには何を変更する必要がありますか? (誰かがこのトピックの正式な研究を知っているなら、参考文献を大いに歓迎します) 更新 ソフトウェアエンジニアリングの現在の認定レベルに関して、以下に挙げた多くの良い点に同意します。また、一部の国ではソフトウェアエンジニアリングを職業として扱い、他の国ではそうではないことも非常に興味深いと感じています。 しかし、「正式な職業」という用語を取り巻くシュラウドと、それがソフトウェアエンジニアリングにどのように適用されるかについては、多少のシュラウドがあるようです。ソフトウェアエンジニアリングの重要な問題-そしてそれが本格的な職業ではない主な理由-は、認定ソフトウェアエンジニアである場合、たとえば-エレベーター用に書いたソフトウェアが誤動作して人を殺すためだと思う正式な専門機関の認定やメンバーシップが取り消されることはありません。 確かに、あなたの会社は何百万人も訴えられるかもしれませんし、あなたは個人的にあなたの仕事を失い、悪い評価を得るかもしれませんが、一般的に言えば、あなたは個人的にはその会社に雇用された結果として有限責任のシールドによって保護されています。言い換えれば、私の知る限り、巨大な詰め込みを行った後、取引を公式に禁止する義務がある法的評価/執行はありません(他の正式な専門職やその統治社会とは異なります) 。 私は、ソフトウェアエンジニアリング-現状では-能力主義であり、正式な職業である必要はなく、これは変更すべきでない良いことであるという事実に触れた答えがとても気に入りました。同時に、ミッションクリティカルなソフトウェアのソフトウェアエンジニアとその他の/クリティカルでないソフトウェアの開発者を明確に区別する必要があると思います。 ミッションクリティカルなソフトウェアに取り組んでいる、またはこれまでに取り組んだことのある人に、個人的な責任はありますか?確かに、ソフトウェアエンジニアが費用のかかるミスを犯した場合、正式な影響が必要ですか?

2
Clojureの角括弧と中括弧はまだS式ですか?
私はLispを学び、そこにあるすべてのLispとその違いを調べようとしています。 Schemeの一部の実装では、読みやすくするために角かっこを角かっこと交換可能に使用できることがわかります。 ただし、Clojureでは、ベクトルなどのさまざまなデータ型を表すために角括弧と中括弧が使用されていることがわかります。これらはまだ有効なS式でもありますか、それともアトムと見なされる必要がありますか?これはS式の概念全体を「壊し」、それによってClojureを「不純な」Lispにしませんか?
11 lisp  clojure 

3
プロジェクトがキャンセルされた場合のコードの所有者[クローズ]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 4年前に閉鎖されました。 問題:私はフリーランスのマーケットプレイスに取り組んでおり、クライアントがバックエンドで無限の遅延と多くのバグを抱えて作業することは不可能であるため、クライアントの1人とプロジェクトをキャンセルすることにしました。私は彼に部分的な払い戻しをしたいと思います(私は2か月働いていて、3k行のコードがあるので、彼のバックエンドの問題のためにアプリケーションはまだ動作しませんが)。 質問:私が書いたコードの「所有者」は誰ですか?プロジェクトが開始されたとき、私たちはそれについて同意しませんでした。私のコードを使わないように言ってもいいですか?とにかく、彼は私の禁断を無視できることを理解しています。そう言う正式な「権利」があるかどうかを知りたいだけです。


3
クライアント側のWebアプリケーションに秘密データを安全に保存する
すべてのクライアント側テクノロジー(HTML、CSS、JavaScript / AngularJSなど)になるこのWebアプリケーションがあります。このWebアプリケーションは、データにアクセスして変更するためにREST APIと対話します。現時点では、REST APIが使用する認証システムの種類については未定です。 私の理解では、あらゆる種類のAPI認証システム(APIキー、OAuth 1/2など)には特定のデータが含まれる必要があり、そうしないとアクセスが危険にさらされる可能性があります。APIキーの場合、キー自体は秘密である必要があり、OAuth 2の場合、クライアントのシークレット/アクセストークン/リフレッシュトークンを秘密にする必要があります。OAuth1に含まれる4つのキーのいくつかは秘密にする必要があります。 OAuthの経験が多すぎる1)。サーバーサイドに中間層を配置せずに、純粋なクライアントサイドのWebアプリケーションにこの秘密のものを保存する方法があるかどうか考えていました。 私はこれについて考えようとしてきましたが、それを行う場所は考えられません。誰でもソースを表示したり、コンソールを開いてデータを取得したりできるため、JavaScriptに保存することはできません。localStorageの安全性と、ユーザーがそのデータにアクセス/変更できるかどうかは100%わかりません。ローカルストレージが安全であったとしても、そこにデータを取り込む2つの方法は考えられません。一つの方法は、私が考えることができる最も安全でないものであるjavascriptソースコードにデータを保存することです。残りのapi自体がトークンを提供するOAuth 2のようなものを使用している場合、トークンはプレーンテキストとして返されるため、これらのトークンは(最初のオプションよりも)安全ではありません。コンピューターが行っているリクエストは見ることができます。 クライアント側で完全に実行されているアプリケーションに、サーバー側の中間層を使用せずに、機密データを安全に保存できる方法はありますか?

4
アジャイル開発でユーザーインターフェイスの設計とそれぞれの機能のサポートに対処する方法
アジャイル開発プロセスでは通常、主な焦点はユーザーストーリーにありますが、1つの要件が複数のユーザーストーリーにまたがることもあります。 たとえば、クライアントはフォーラム内のすべてのユーザーの検索ページを要求する場合があり、ユーザーの禁止、ユーザーの削除、パスワードのリセットなど、ユーザーごとに実行できるアクションがいくつかあります。 この機能は、少なくとも4つのユーザーストーリーに分割できます。 ユーザーを検索 ユーザーを禁止 ユーザーを削除 パスワードを再設定する ユーザーインターフェイスデザイナーは、このようなユーザーインターフェイスをどのように実装しますか?彼/彼女は最初のユーザーストーリーに取り組み、それからUIへのより多くの機能を増やし始めるべきですか?ただし、最終的なUIは台無しになると思います! 彼が機能全体(検索+アクション)で作業することに決めた場合、アクションの優先順位が低く、検索機能が実行された後に複数の反復が実装されるとしたらどうでしょうか。

3
バイトコードウィービング対Lispマクロ
私は、関数呼び出しのインターセプト、ロギングコードの挿入などを行うためにバイトコードウィービングを使用するJavaやC#のような言語用に書かれたライブラリについて読んでいます。それらの利用方法をよりよく理解しようとする。マクロについてよく読めば読むほど、マクロがバイトコードウィービングライブラリと同じ種類の機能を提供するように見えます。機能とは、コンパイル時にコードを操作できることを意味します。 私が見ているライブラリの例は、AspectJ、PostSharp、Cecilです。 片方でできること、もう片方ではできないことはありますか?彼らは実際に同じ問題を解決していますか、それともリンゴとオレンジを比較していますか?

4
Webアプリケーションから送信された自動メールを管理する方法
私はWebアプリケーションを設計していますが、自動化された電子メールの送信を管理するためのアーキテクチャをどのように設計するのでしょうか。 現在、この機能をWebアプリに組み込み、ユーザーの入力/操作(新しいユーザーの作成など)に基づいてメールを送信しています。問題は、メールサーバーに直接接続するのに数秒かかることです。アプリケーションの規模を拡大すると、これは将来的に大きなボトルネックになるでしょう。 システムアーキテクチャ内で大量の自動化された電子メールの送信を管理する最良の方法は何ですか? 大量のメールが送信されることはありません(1日最大2000)。メールをすぐに送信する必要はありません。最大10分の遅延が問題ありません。 更新:メッセージキューが回答として提供されましたが、これはどのように設計されますか?これはアプリで処理され、静かな期間に処理されますか、またはキューを管理するだけの新しい「メールアプリ」またはWebサービスを作成する必要がありますか?

2
委任とは何ですか?iOSプログラミングでなぜそれが重要なのですか?
現在、私は自分でiOSプログラミングを教えていますが、頭を包み込むのが本当に難しいと思う概念の1つは委任です。それは何ですか?なぜ、どのように使用されていますか?利点は何ですか?私が読んでいる本のテクニカルライティングは、理解するのを難しくしています。

6
適切な設計で簡単にするには大きすぎる変更は何ですか?
これはかなり曖昧な質問ですが、適切な設計について読んだときに満足のいく方法で答えられたとは思っていませんでした。 一般に、オブジェクト指向プログラミング、抽象化、因数分解などについて学ぶとき、設計の聖杯-そして、あなたが問題の開発技術を使用していると常に主張する理由-は、プログラムを「変更しやすくする」ことです、「維持可能」、「柔軟」、またはそのような生産的な響きの概念を表現するために使用される同義語のいずれか。ivarをプライベートとしてマークし、コードを多くの小さな自己完結型のメソッドに分割し、インターフェイスを一般的な状態に保つことで、プログラムを完全に簡単かつ優雅に変更できるようになります。 比較的小さな変更の場合、これは私にとってはうまくいきました。クラスがパフォーマンスを向上させるために使用する内部データ構造の変更は大きな困難ではありませんでした。また、テキスト入力システムの再設計やゲームプレイ要素のグラフィックのオーバーホールなど、APIに依存しないユーザーインターフェイスエンドの変更もありません。 これらの変更はすべて、本質的に自己完結型のようです。それらのいずれも、外部コードに関する限り、変更されるプログラムのコンポーネントの動作または設計への変更を伴いません。手続き型であろうと大規模な機能であろうと小規模であろうとOOスタイルであろうと、これらはあなたが適度に良いデザインしか持っていなくても簡単に変更できます。 しかし、変更が大きくて毛深いものになったとき、つまりAPIに変更が加えられたときはいつでも、私の貴重な「パターン」はどれも助けになりません。大きな変化は大きなままで、影響を受けるコードは影響を受けたままで、何時間もバグを生み出す作業が私の前にあります。 だから、私の質問はこれです。適切な設計がどの程度大きな変更を促進できると主張していますか?私には未知の、または実装に失敗した、さらにスティッキーなサウンドの修正を本当に単純にする、またはその約束(非常に多くの異なるパラダイムによって行われたと聞いた)は単に素晴らしいアイデアである、いくつかのさらなる設計技術がありますか?ソフトウェア開発の不変の真実から完全に切り離されていますか?ツールベルトに追加できる「変更ツール」はありますか? 具体的には、私がフォーラムに導かれた問題はこれです:私は解釈されたプログラミング言語(Dで実装されていますが、それは関係ありません)の実装に取り​​組んでおり、クロージャの引数は現在の位置ではなく、キーワードベース。これには、匿名関数を呼び出す既存のすべてのコードを変更する必要がありますが、幸いなことに、私は言語の開発の初期段階(2000行未満)であるため、かなり小さいですが、後の段階でこの決定を行った場合は非常に大きくなります。そのような状況では、設計の適切な先見によって、この変更を簡単にすることができたのでしょうか、それとも特定の(ほとんどの)変更が本質的に広範囲に及ぶのでしょうか?これが何らかの形で自分自身の設計スキルの失敗であるかどうかに興味があります-もしそうなら、私は 明確にするために、私はOOPや一般的に使用されている他のパターンのいずれにも決して懐疑的ではありません。ただし、私にとっては、それらの長所は、コードベースの保守ではなく、元の記述にあります。継承を使用すると、繰り返しパターンを適切に抽象化できます。ポリモーフィズムを使用すると、機械が理解する効果(switchステートメントのブランチ)ではなく、人間が理解する機能(クラス)でコードを分離できます。非常に快適な「ボトムアップ」スタイルで記述します。しかし、私は彼らの柔軟性の主張に懐疑的です。

3
順序付け/プロパティを変更できるページ分割された結果をキャッシュするためのベストプラクティスは何ですか?
順序付け/プロパティを変更できるページ分割された検索結果をキャッシュするためのベストプラクティスは何ですか? 私のアプリケーションでは、誰かが最新の20のディスカッションスレッド(10,000のうち)を見たいとします。servletXML、JSONとしてディスカッションスレッドテーブルから最初の20レコードを取得するために、を介してデータベースにリクエストが送信されます。その後、次の20を表示したい場合、結果の次のページに移動し、次のロットを取得するための別の要求を開始します(制限とオフセット= 20など)。 サーバーの負荷とクライアント待機を減らすために、結果の前のページをキャッシュしたいと思います。ただし、2つの質問があります。 結果が表示されるテーブルは、複数の属性(つまり、thread-creation-date、thread-author、last-post-date)で並べ替えることができます。これは、「最初の20件の結果」のような文は、コンテキストなしでは意味をなさないことを意味します(つまり、私たちは何によって注文するのか)。それでは、フロントエンドはどのようにしてバックエンドに既にロードしたものと通信しますか?最初に考えたのは、各結果にIDを使用することでしたが、後続のリクエストでIDをサーバーに送り返す(およびそれらに基づいて結果をフィルタリングする)のは、すべてを盲目的に送り返すのと同じくらい時間がかかります。これどうやってするの? 以前に返された結果(つまり、最新のポスト日付)の属性が変更された場合はどうなりますか?次に、各結果をチェックインして、ページインされてからサーバー側で変更されているかどうかを確認する方法が必要です。これを行うにはどうすればよいですか?

3
パブリッシャー-サブスクライバーとリアクターのパターンの違いは何ですか?
私と非常によく似たパブリッシュ/サブスクライブおよびReactorパターン。彼らはどう違いますか? どちらのパターンでも、メッセージは間接的にサブスクライバーに渡されます(リアクターパターンのリスナー)。 オブザーバーパターンは、他の2つのパターンとも非常に似ていると思います。 これらのパターンの主な違いは何ですか?

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