ソフトウェア工学

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

6
必要なメソッドパラメータにassertまたはIllegalArgumentExceptionを使用する方が良いですか?
Javaでは、どちらがより強く推奨されますか?その理由は?どちらのタイプも例外をスローするため、それらの処理に関しては同じです。assert少し短くなりますが、それがどれほど重要かはわかりません。 public void doStuff(Object obj) { assert obj != null; ... } 対 public void doStuff(Object obj) { if (obj == null) { throw new IllegalArgumentException("object was null"); } ... }

9
従来のコードベースでの時間コストの見積もり
最近、非常に古いモノリシックアプリケーションをマイクロサービスベースのアーキテクチャに移行するプロジェクトに取り組み始めました。 レガシコードベースは非常に乱雑(「スパゲッティコード」)であり、見かけ上単純な関数(例:「multiplyValueByTen」と呼ばれる)はしばしば「3つの異なるスキーマにまたがる10個のテーブルを含む数千行の検証コード」として現れます。 今、私の上司は、新しいアーキテクチャで機能Xを作成するのにどれくらいの時間がかかるかを(正しく)尋ねています。しかし、現実的な見積もりを思い付くのは困難です。多くの場合、上記の理由によりタスクを非常に過小評価しており、時間内に終わらないので困惑しています。 賢明なことは、実際にコードに入り、すべてのブランチと他の関数の呼び出しに注意して、時間コストを推定するように見えるかもしれません。しかし、古いコードを文書化することと、実際に新しいバージョンを書き留めることの間には、ごくわずかな違いがあります。 このようなシナリオにどのようにアプローチすればよいですか? レガシーコードのリファクタリングの仕組みを完全に理解していますが、私の質問は「リファクタリング/リライトの方法」ではありません。しかし、「パートXのリファクタリング/リライトにどれくらい時間がかかるか」に対する現実的な答えを与えることについては。

5
UTF-8は、数百万の新しい文字を持つ広大な外国語の包含をサポートできますか?
エイリアンの侵入が発生し、既存のすべてのコンピューターシステムでそれらの言語をサポートすることを余儀なくされた場合、UTF-8は、おそらく大量の文字を許可するように設計されていますか? (もちろん、エイリアンが実際に言語を持っているかどうか、コミュニケーションをするかどうか、またはその方法はわかりませんが、議論のために想像してください。) たとえば、言語が数百万の新しい発見されたグリフ、記号、および/または結合文字で構成されている場合、UTF-8は理論的にこれらの新しいグリフを含むように非破壊的な方法で拡張され、既存のすべてのソフトウェアをサポートできますか? グリフが現在のサイズ制限をはるかに超えており、単一のグリフを表現するためにより多くのバイトを必要とするかどうかにより興味があります。UTF-8を展開できなかった場合、UTF-32に対する単一の利点は単に下位文字のサイズであることを証明していますか?
86 unicode  utf-8 

11
ユニットテストは、シティグループがこの高価な間違いを避けるのに役立ちましたか?
私はこのスナフについて読みました:正当な取引が15年間テストデータと間違えられた後、Citigroupのプログラミングバグには700万ドルの費用がかかります。 システムが1990年代半ばに導入されたとき、プログラムコードは、089から100までの3桁のブランチコードが与えられたトランザクションを除外し、それらのプレフィックスをテスト目的で使用しました。 しかし1998年に、同社は事業を拡大するにつれて英数字のブランチコードの使用を開始しました。その中にはコード10B、10Cなどがあり、システムは除外範囲内にあると見なしたため、SECに送信されたレポートからそれらのトランザクションは削除されました。 (これは、非明示的なデータインジケーターを使用することは...最適ではないことを示していると思いBranch.IsLiveます。セマンティックに明示的なプロパティを設定して使用する方がはるかに良いでしょう。) それはさておき、私の最初の反応は「ユニットテストはここで助けになるだろう」でした...しかし、彼らはどうでしょうか? 最近読んだのは、ほとんどのユニットテストがなぜ無駄なのかということでした。そのため、私の質問は次のとおりです。英数字ブランチコードの導入で失敗したユニットテストはどのようなものでしょうか。

10
アラン・ケイが「インターネットはとてもよくできていたが、ウェブはアマチュアによるものだった」と言ったのはなぜですか?
OK、だから私は言い換えました。完全な引用: インターネットは非常によくできていたため、ほとんどの人は人工的なものではなく、太平洋のような自然資源と考えています。そのような規模のテクノロジーが最後にエラーになったのはいつですか?それに比べて、ウェブは冗談です。ウェブはアマチュアによって行われました。-アラン・ケイ。 私はインターネットとウェブの歴史を理解しようとしていますが、この声明は理解するのが難しいです。インターネットは現在、設計されたものとは非常に異なるものに使用されていることを他の場所で読んだことがあります。 何がインターネットをこれほど良くし、何がウェブをこれほどアマチュアにしているのでしょうか? (もちろん、アラン・ケイは間違いがあり、ここにいる人は誰もいないので、なぜ彼がそれを言ったのか正確に知ることはできませんが、可能な説明は何ですか?) * 元のインタビューも参照してください*。

10
2010-01年にDebianポプコングラフでGit提出者の数が突然増加したのはなぜですか?
GitとMercurialの比較1を読んだほぼすべての記事では、MercurialのコマンドラインUXの方が優れているようです(各コマンドは(sayとは異なりgit checkout)1つのアイデアに限定されています)。 しかし、ある時点でGitは突然非常に人気が高くなり、Debianポプコングラフ(下のグラフ画像を参照)でGitの提出者の数が文字通り爆発しました。 ソース:Debian 2010-01年に起こったことは、物事が突然変化したことです。GitHubは2008年よりも早く設立されたようです。
86 git  history  mercurial 

5
for vs. foreach vs. LINQ
Visual Studioでコードを書くとき、ReSharper(神のご加護を!)はしばしば、古い学校のforループをよりコンパクトなforeach形式に変更することを勧めます。 多くの場合、この変更を受け入れると、ReSharperは一歩前進し、光沢のあるLINQ形式で再度変更することを提案します。 だから、私は疑問に思う:これらの改善には、いくつかの本当の利点がありますか?非常に単純なコード実行では、速度の向上は見られませんが(明らかに)、コードがますます読みにくくなっているのがわかります。
86 c#  linq 

6
JQueryよりも純粋なJavaScriptを使用する利点
Javascriptのみを使用することと、JQueryのみを使用することの利点は何ですか? JavaScriptおよびJQueryコーディングの経験は限られています。HTMLページに各ビットとスニペットを追加しましたが、ほとんどの場合、サーバー側のものを他の言語でコーディングしました。2つのアプローチのいずれかを使用して理論的に同じことを行うことができます(もちろん、同じプロジェクトでそれらを混ぜることもできます)が、最初から常にJQueryを使用し始める傾向があるようですプロジェクトが要求するものは何でもありません。 だから私は単純に疑問に思っています、JQueryのみを使用せず、代わりに単純な古いJavaScriptを使用するだけの時間的な利点はありますか? 「明確な答えはありません」または「永遠に議論できる」と言うことができるので、これは非質問のように見えますが、実際には「あなたはこれを行うことができます」などの時間通りの答えを望んでいます1つのアプローチであり、他のアプローチではできません」。 scrwtpのコメントにあるように、私は単にDOM処理の部分に言及しているわけではありません。私の質問はむしろ:JQueryはライブラリです。Javascriptの場合。他の言語の他のライブラリとは対照的に、このライブラリについて私が奇妙に感じるのは、JQyeryの場合、それを排他的に使用できるように設計されており、Javascriptに直接触れる必要がないことです。これはHibernateとSQLとは対照的です。ライブラリ(またはこの場合はフレームワークですが、類似性はまだ当てはまると思います)が多くの側面を処理しますが、それを使用するときはSQLを使用できます。 、少なくとも一部のフリンジケースでは。しかし、JQueryとJavascriptの場合、JQueryのみを使用してJavascriptで行うことができます(少なくとも、私にはそう思われます)。 Stargazer712のコメントによると:はい、私はあなたに同意します。ここでの質問は、「JavaScriptをどのように使用するかという問題」です。それは私が実際に尋ねることに成功していたことですが、私はいくつかの悪い処方をしました。もう1つの例えは次のとおりです。SpringExpression Language。これはJavaライブラリです。Javaなしで使用することはできません。Javaに基づいており、Javaを使用するために必要なことはすべて実行できます。しかし実際には、このライブラリをJavaプロジェクトに追加してから、Spring ELの式言語を使用してすべてのコードを記述し、コードを事実上Javaに似せないようにします。これを使用する場合の強力な型の強制)。私はJQueryが単なるJSライブラリであることを理解していますが、実際にはSpring ELがJavaで持っているのと同じ効果があるようです。つまり、プロジェクト全体でそのAPIのみを使用し、JavaScriptのAPIを避けることができます。そして、それが良いことなのか、落とし穴などなのかと思っていました。 (そしてはい、みんなの答えを読んだ後、私はそれを理解しています: a。私の質問はやや無意味です b。質問が完全に正確であったとしても、その答えはほぼ「JQueryのみを常に使用することはできません」

2
エッジケース、コーナーケース、ベースケース、境界ケースの違いは何ですか?
私は英語のネイティブスピーカーではありません。私の母国語では、再帰を停止するためにチェックされる条件、および極端な、起こりそうにない、または非常に単純なケースのためにチェックされる条件を指すのに使用されるいくつかの用語を知っています。英語では、「エッジケース」、「コーナーケース」、「境界ケース」、「ベースケース」という用語に遭遇しましたが、違いを理解することはできません。それらの違いの要約を取得したいと思います。 特に、誰かが次のサンプルコードの行に注釈を付けることができればとてもうれしいです。 int transmogrify(int n) { 1. assert(n <= 1000000); 2. if (n < 0) return -1; 3. if (n == 1000000) return PRE_CALC; 4. if (n == 0) return n+1; // For stopping the recursion 5. if (n == 1251) return 3077; return transmogrify(n-1); } 私はそれだと思う: サニティーチェック 入力チェック 境界の場合?エッジケース?コーナーケース? …

12
単体テストを行うには、プロジェクトの大きさはどれくらい必要ですか?[閉まっている]
私のプロジェクトは、単体テストを可能にするほど十分に分離されていると思います。しかし、単体テストを価値のあるものにするために、プロジェクトは、正確に、クラスと機能の面でどれだけ大きくする必要がありますか? 私たちは皆、間違いを犯し、完璧な人はいませんが、小さなプロジェクトのエラーをステップスルーで処理するための自分はまともなプログラマだと思います。または、プロジェクトのサイズに関係なく、単体テストは非常に必要ですか?

21
あなたのコードが混乱していると誰かが言ったら、あなたはどう反応しますか?
私は優れたプログラマーです。私はいつもプログラムが大好きです。そして、私はプログラミングについて多くのことを学び、私をより良いプログラマーにしたいと思っています。私は1年間プログラミングを学び、現在はほぼ2年間プログラマーとして働いています。要するに、私はほぼ3年のプログラミング経験があります。 私たちのチームは5人のプログラマで構成されており、うち4人は新しく、1人は3年以上の経験があります。私たちはもう1年近くプログラムに取り組んでおり、コードをレビューする人は誰もいませんでした。コードのレビューは一度も行ったことがなく、まったく新しいので、きれいなコードがどのようなものかはわかりません。プログラマーは自分で学ぶと思う? 徹底的なテストなしで、プログラムにプログラムを展開しました。現在はタイトであり、コードを変更する前にまず承認とコードレビューが必要です。初めて、誰かが私のコードをレビューし、彼はそれが混乱だと言います。 私はとても悲しくて傷つきます。プログラミングが大好きで、そのようなことを言わせると本当に痛いです。私は本当に自分自身を改善したいです。しかし、私は映画のような天才プログラマーではないようです。もっと良くする方法についてアドバイスをいただけますか?コードを批判する何かを経験したことがありますか?それらのイベントで何をしますか。

6
ステートフルとステートレスの違いは何ですか?
MVCに関する書籍とドキュメントは、ステートフルおよびステートレスの用語を使用することについての山に過ぎません。正直に言うと、私はその考え、本が何を言っているのかをつかむことができません。HTTPがステートレスであり、ASP.NET MVCでMicrosoftがそれに従っていることを伝えるだけでなく、いずれかの状態を理解するための例を示していません。ステートフルなものとステートフルな理由を理解できないため、基本的な知識が不足していますか? ボタンやテキストボックスなどのコントロールについて説明する簡単で短い例は、私が思うに理解を簡単にすることができます。

17
TODOコメントは意味がありますか?[閉まっている]
私はかなり大きなプロジェクトに取り組んでおり、そのためにいくつかの翻訳を行うタスクを受け取りました。翻訳されていないラベルがたくさんあり、コードを掘り下げていたときに、この小さなコードを見つけました //TODO translations これは私がこれらのコメントの意味を自分自身(そして他の人?)に考えさせましたそれを維持するか、新しい機能を追加します。これTODOは長い間失われます。 このコメントを書くことは理にかなっていますか、それとも開発者の焦点に留まるホワイトボード/紙/何かに書かれるべきですか?

7
バイトが8ビットである理由の歴史は何ですか?
8ビットのグループを基本単位として使用することを決定する際に、歴史的な力が働いている場所とトレードオフの関係はどうでしょうか。 かつて、他のワードサイズを使用するマシンがありましたが、今日では、8ビット以外の場合、博物館の作品、組み込みアプリケーション用の専用チップ、およびDSPを調べる必要があります。バイトは、コンピューター設計の初期の混乱と創造性からどのように進化したのですか? ビット数が少ないとコンピューティングを実現するのに十分なデータを処理するのに効果的ではなく、多すぎると高価なハードウェアにつながると想像できます。遊びに他の影響はありましたか?これらの力がなぜ8ビットにバランスをとったのですか? (ちなみに、時間旅行ができたら、「バイト」が8ビットであると宣言された時点に戻り、すべての人に12ビットにするよう説得し、21世紀初頭の装身具で賄いました。)
86 history  hardware  byte  bit 

5
Objective-C開発用のClang警告フラグ
CおよびObjective-Cプログラマーとして、私はコンパイラ警告フラグに少し偏執的です。 私は通常、使用しているコンパイラの警告フラグの完全なリストを見つけて、それをオンにしない本当に正当な理由がない限り、それらのほとんどをオンにします。 私は個人的に、これにより実際にコーディングスキルが向上し、コードの移植性が向上し、いくつかの問題を防ぐことができると考えています。 私の意見では、あなたが経験豊富なプログラマーであっても、毎日の良い学習ツールでもあります。 この質問の主観的な部分については、このトピックについて他の開発者(主にC、Objective-C、C ++)を聞くことに興味があります。 あなたは実際に、物足りなさの警告などのようなものに関心がありますか?はい、またはいいえの場合、なぜですか? Objective-Cについては、最近、GCCではなく、LLVMツールチェーン(Clangを使用)に完全に切り替えました。 私の製品コードでは、通常、この警告フラグを設定します(明示的に、それらの一部が-Wallでカバーされている場合でも): -壁 -Wbad-function-cast -Wcast-align -W変換 -ステートメント後の宣言 -Wdeprecated-implementations -ウェクストラ -Wfloat-equal -Wformat = 2 -Wformat-nonliteral -Wfour-char-constants -Wimplicit-atomic-properties -ミッシングブレース -ミッシング宣言 -欠落フィールド初期化子 -欠落フォーマット属性 -ミッシングノーリターン -ミッシングプロトタイプ -ネストされた外部 -改行-eof -Wold-style-definition -Woverlength-strings -かっこ -ポインターポインター -冗長宣言 -戻り型 -Wsequence-point -Wshadow -Wshorten-64-to-32 -Wsign-compare -署名変換 -Wstrict-prototypes -Wstrict-selector-match -Wswitch -Wswitch-default -Wswitch-enum -Wundeclared-selector -初期化されていない -不明なプラグマ …

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