ソフトウェア工学

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

11
C / C ++という用語の使用をやめるべきですか?
CとC ++は異なる言語であることは理解していますが、C ++を学習していたとき、CはC ++のサブセットであるか、C ++はクラスを持つCであると常に言われました。そして、C ++ x0、C ++ 11(または一般的な現代のC ++ 11/14/17)が登場するまで、それは非常に真実でした。実際(特に組み込みシステムで作業している場合)、C ++で記述されたコードを見つける可能性が非常に高くなりますが、多くの部分は完全に純粋なC言語で記述されています。ここにいくつかの質問があります: C / C ++という用語の使用をやめるべきですか? #1の答えが「はい」の場合、CとC ++を組み合わせて使用​​するプログラムをどのように呼び出すのでしょうか? それらの両方が「異なる」言語であることを考えると、C ++コンパイラがC言語で書かれたコードのサポートをやがて停止する可能性があります(現代のc ++はポインタ、動的メモリ処理などの基本的なもののためにCの考え方とは異なるため) 現在、互換性を維持するためにC / C ++の標準を作成している人々の間でコラボレーションはありますか #4が「はい」の場合、このようなコラボレーションは近い将来、現代のc ++(11/14/17)の登場で終わる可能性があります 私はすでに同様の質問があることを知っていますが、多くの人々がこれらの質問を共有していると確信していますので、特に近い将来のC ++の傾向に関係する点については良い答えを得ることに非常に興味があります。
140 c++  c  terminology  c++11 

10
CV /履歴書にStack Overflowプロファイルリンクを配置しますか?[閉まっている]
新しい仕事に応募する場合、履歴書にStack Overflowプロファイルリンクを配置しますか? これは、あなたが開発コミュニティのアクティブなメンバーであることを雇用者に示し、またあなたの知識+あなたがあなたのアイデアをどれだけうまく伝えているかについての洞察を提供します。 しかし、それは私にとって少しギミックを感じるでしょうか?

6
単一の参照を持つプライベートメソッドは悪いスタイルですか?
通常、プライベートメソッドを使用して、クラス内の複数の場所で再利用される機能をカプセル化します。しかし、私は時々、それぞれが独自のプライベートメソッドの小さなステップに分割できる大きなパブリックメソッドを持っています。これにより、パブリックメソッドが短くなりますが、メソッドを読み取る人に別のプライベートメソッドにジャンプさせると読みやすさが損なわれるのではないかと心配しています。 これに関してコンセンサスはありますか?長いパブリックメソッドを使用する方が良いでしょうか、それとも各ピースが再利用できない場合でも、それらを小さなピースに分割する方が良いでしょうか?

11
ユニットテストが多すぎるということはありますか?
私は、既存のアプリケーションの単体テストの作成を任されています。最初のファイルを完成させた後、元のコードの419行に対して717行のテストコードがあります。 コードカバレッジを増やすと、この比率は管理不能になりますか? 単体テストの私の理解は、クラス内の各メソッドをテストして、すべてのメソッドが期待どおりに機能することを確認することでした。しかし、プルリクエストで、技術リーダーは、より高いレベルのテストに焦点を当てる必要があると指摘しました。彼は、各機能を徹底的にテストするのではなく、問題のクラスで最も一般的に使用される4〜5つのユースケースをテストすることを提案しました。 技術リーダーのコメントを信頼しています。彼は私よりも多くの経験があり、ソフトウェアの設計に関しては本能が優れています。しかし、このような曖昧な標準のテストを複数のチームがどのように書くのでしょうか。つまり、どのようにして仲間を知り、「最も一般的なユースケース」について同じ考えを共有しますか? 私にとって、100%の単体テストのカバー率は高い目標ですが、50%にしか達していない場合でも、その50%の100%がカバーされていることがわかります。それ以外の場合、各ファイルの一部のテストを作成すると、多くのチートの余地が残ります。
139 unit-testing  tdd 

8
どうやってバイクシェッドをやめさせるのですか(些細なことに焦点を当てる)?
私は他のチームに新しいコードベースを教えることを任されてきましたが、私は問題に直面し続けています。私が実際に人々と一緒にコードを調べに行くときはいつでも、全体の運動が自転車脱落(些細な問題に不均衡な重みを与える組織のメンバー)運動に移るまで、それほど遠くはありません。彼らはコードベースを知らないが、それを改善するのを助ける必要があると思うので、彼らは理解できることに集中します: Why is that named that? (その名前が付けられた理由を説明するのに2分、新しい名前を議論する10分以上) Why is that an abstract base class rather than an interface? (説明するのに2分、この決定の相対的なメリットを議論する10分以上) ...等々。今、誤解しないでください-良い名前といい、一貫性のある設計が重要であるが、我々は、コードが実際にどのような議論に取得することはありませんし、システムが何らかの意味のある方法で設計されていたりする方法。私は、これらの接線から人々を引き離すために審判会議をいくつか行ってきましたが、彼らはいなくなりました-彼らのペットの些細さが修正されたときのコードがどうなる/はずであることに気を取られ、彼らはより大きな姿を見逃しています。 そのため、後で(またはコードベースの別の部分で)再試行します。人々は、バイクシェッド効果を克服するのに十分な知識を持っていなかったため、繰り返します。 私はいくつかは、他のものよりを助ける...短いすぐに引数を切断、死にそれを主張し、それらをさせる、小さなグループ、大きなグループ、コード、ホワイトボード、Visioの図、テキストの巨大な壁を試してみたが、何も働きません。地獄、私はチームの他の人に説明してもらおうとさえしました。 それでは、他のプログラマーを教育して、些細なことに固執するのをやめ、設計に有意義に貢献できるようにするにはどうすればよいでしょうか?

15
Java、Javascript、C#などのメモリ管理言語が「new」キーワードを保持しているのはなぜですか?
newJava、Javascript、C#などの言語のキーワードは、クラスの新しいインスタンスを作成します。 この構文は、C ++から継承されているようです。C++ newは、ヒープ上のクラスの新しいインスタンスを割り当て、新しいインスタンスへのポインターを返すために特に使用されます。C ++では、これがオブジェクトを構築する唯一の方法ではありません。new- を使用せずにスタック上にオブジェクトを作成することもできます。実際、この方法のオブジェクトの作成方法はC ++でより一般的です。 だから、C ++のバックグラウンドから来て、newJava、Javascript、C#のような言語のキーワードは、私にとって自然で明白なように思えました。それから、newキーワードのないPythonを学び始めました。Pythonでは、次のように、コンストラクターを呼び出すだけでインスタンスが構築されます。 f = Foo() 最初は、Pythonが持つ理由がないことに気付くまで、これは少しnew戸惑いました。すべてがオブジェクトであるため、さまざまなコンストラクタ構文を明確にする必要はありません。 しかし、それから私は考えました-Javaの本当のポイントは何newですか?なんで言うのObject o = new Object();?どうしてObject o = Object();?C ++ではnew、ヒープへの割り当てとスタックへの割り当てを区別する必要があるため、間違いなくが必要ですが、Javaではすべてのオブジェクトがヒープ上に構築されますnew。Javascriptについても同じ質問をすることができます。私があまり馴染みのないC#では、newオブジェクト型と値型を区別するという点で何らかの目的があると思いますが、よくわかりません。 とにかく、C ++の後に来た多くの言語は単にnewキーワードを「継承」しているように思えます-本当にそれを必要としません。それはほとんど痕跡のキーワードのようなものです。なんらかの理由でそれを必要としているようには見えませんが、まだあります。 質問:これについて正しいですか?あるいはnew、Java、Javascript、C#などのC ++にインスパイアされたメモリ管理言語である必要があり、Pythonではなくてはならない説得力のある理由がありますか?

14
単体テストを行わないのはいつが適切ですか?
私は小さな会社でソロ開発者として働いています。私は実際に会社で唯一の開発者です。定期的に書いて保守しているいくつかの(比較的)大規模なプロジェクトがあり、それらをサポートするテストはありません。新しいプロジェクトを始めるとき、TDDアプローチを試してみるべきかどうかとよく疑問に思います。それは良いアイデアのように聞こえますが、私は正直に関係する余分な仕事を正当化することはできません。 私は自分のデザインを前向きに考えようと努力しています。いつか別の開発者がコードを保守するか、少なくともトラブルシューティングを行う必要があることは確かです。できる限りシンプルなものにし、把握するのが難しいものをコメントして文書化します。そして実際、これらのプロジェクトはそれほど大きくも複雑でもないので、まともな開発者は理解するのに苦労するでしょう。 私が見たテストの例の多くは、コードのすべての面をカバーする詳細にまで及びます。私が唯一の開発者であり、プロジェクト全体のコードに非常に近いので、手動で書き込みをテストするパターンに従う方がはるかに効率的です。また、要件や機能は頻繁に変更されるため、テストを維持するとプロジェクトにかなりの量のドラッグが追加されます。そうでなければビジネスニーズの解決に費やすことができる時間。 そのため、毎回同じ結論に達します。投資収益率が低すぎます。 私は時折、雇用日に基づいて誰かが会社にいた年数を計算するなど、アルゴリズムを正しく記述したことを確認するために、いくつかのテストを設定しました。しかし、コードカバレッジの観点からは、コードの約1%をカバーしています。 私の状況では、ユニットテストを定期的に行う方法をまだ見つけることができますか、それともそのオーバーヘッドを回避することを正当化できますか? 更新: 除外した私の状況に関するいくつかのこと:私のプロジェクトはすべてWebアプリケーションです。すべてのコードをカバーするには、自動化されたUIテストを使用する必要がありますが、それは手動テストよりも大きなメリットが見られない領域です。
138 unit-testing  tdd 

7
検索はどのようにRESTfulインターフェースに適合しますか?
RESTfulインターフェースを設計する場合、要求タイプのセマンティクスは設計に不可欠であると見なされます。 GET-コレクションの一覧表示または要素の取得 PUT-コレクションまたは要素を置き換えます POST-コレクションまたは要素を作成する DELETE -まあ、ERM、コレクションや要素を削除 ただし、これは「検索」の概念をカバーしていないようです。 たとえば、求人検索サイトをサポートする一連のWebサービスの設計では、次の要件があります。 個々の求人広告を取得する GETへdomain/Job/{id}/ 求人広告を作成 POSTへdomain/Job/ 求人広告の更新 PUT todomain/Job/ 求人広告の削除 DELETEへdomain/Job/ 「Get All Jobs」も簡単です。 GETへdomain/Jobs/ しかし、仕事の「検索」はこの構造にどのように分類されますか? あなたは可能性があり、それは「リストコレクション」のバリエーションの主張として実装します。 GETへdomain/Jobs/ ただし、検索は複雑になる可能性があり、長いGET文字列を生成する検索を作成することは完全に可能です。つまり、ここでSOの質問を参照すると、約2000文字よりも長いGET文字列の使用に問題があります。 例として、ファセット検索があります-「ジョブ」の例を続けます。 「テクノロジー」、「役職」、「規律」、およびフリーテキストキーワード、就業年齢、場所、給与などのファセットでの検索を許可できます。 流動的なユーザーインターフェイスと多数のテクノロジと役職により、検索に多数のファセットの選択肢を含めることが可能です。 この例をジョブではなくCVに微調整すると、さらに多くのファセットがもたらされ、100個のファセットが選択された検索、または50文字の長さ(たとえば役職、大学名、雇用者名)。 そのような状況では、検索データが正しく送信されるようにするために、PUTまたはPOSTを移動することが望ましい場合があります。例えば: POSTへdomain/Jobs/ しかし意味的には、これはコレクションを作成するための命令です。 これを検索の作成として表現することもできます。 POSTへdomain/Jobs/Search/ または(以下のburninggrammaで示唆されているように) POSTへdomain/JobSearch/ 意味的には理にかなっているように思えるかもしれませんが、実際には何も作成しておらず、データを要求しています。 したがって、セマンティック上はGETですが、GETは必要なものをサポートすることを保証されていません。 ですから、質問は-可能な限りRESTfulなデザインを忠実に保ちながら、HTTPの制限内に収まるようにしながら、検索に最適なデザインは何ですか?

25
人々が働かないのは「普通」ですか?
大学を卒業した後、私は一年ほど前にジュニアプログラマーとして雇われました。私は他のすべてのプログラマーよりもはるかに速いことにすぐに気付きました。これは、「一般に」時間を無駄にしないためです。しかし、他の大部分の人々は、天井を見つめ、YouTube、Facebook、およびランダムなWebサイトを閲覧し、一般的に1日で私が通常1時間で行う作業を楽しんでいるようです。彼らが集中すれば、彼らも1時間でその仕事をすることができると100%確信しています。 私はすぐに上級開発者に昇進し、最近ではチームリーダーに昇進しました。今では、これらの人々の多くを新しい雇用者に置き換えています(まだまだ数人)。状況は今ではより受け入れられるようになりましたが、それでもずっと良くなると思います。 しかし、誰もがこれが「正常」であるように振舞うように見えることに気づかずにはいられません。私の上司は皆、これについて心配しておらず、彼らもあまり役に立たないようです。私はいつも彼らを見つけるのに非常に苦労します。彼らは予定よりはるかに遅く到着し、早く出発します。明らかに彼らは私の上にいるので、この場合に私ができることは何もありませんが、これはすべての企業の「規範」ですか、それとも私は単に非常に悪いものになりましたか? また、私は数年後に「彼らのようになる」でしょうか?
137 productivity 

2
Pythonファイルの命名規則?
PEP-8 https://www.python.org/dev/peps/pep-0008/#package-and-module-namesのこの部分を見ました これがモジュール/クラス/パッケージのファイル名を参照しているかどうかはわかりません。 それぞれの例が1つある場合、ファイル名はすべて小文字にし、必要に応じてアンダースコアを使用する必要がありますか?または、他の何か?

10
深いプログラミング知識の開発について
時折、私は実証し、簡単にジョンスキートとエリックリペットの同類によって回答されているスタックオーバーフロー上のエッジケースや他のすごみについての質問を参照して、言語とその多くの複雑さの深い知識を この1のように: foreachループを使用するには、繰り返し処理するコレクションがIEnumerableまたはを実装する必要があると考えるかもしれませんIEnumerable<T>。しかし、結局のところ、それは実際には要件ではありません。必要なのは、コレクションの型が、パブリックメソッドが呼び出されていなければならないということでGetEnumerator、それが呼ばれるパブリックプロパティのゲッター持ついくつかのタイプを返す必要がありCurrent、パブリックメソッドMoveNextを返しますbool。コンパイラがこれらの要件をすべて満たしていると判断できる場合、これらのメソッドを使用するためのコードが生成されます。それらの要件が満たされていない場合にのみ、オブジェクトがIEnumerableまたはを実装しているかどうかを確認しますIEnumerable<T>。 それは知っておくべきクールなものです。エリックがこれを知っている理由を理解できます。彼はコンパイラチームに所属しているので、知っておく必要があります。しかし、インサイダーではないそのような深い知識を実証する人はどうでしょうか? 単なる人間(C#コンパイラチームに所属していない人)は、このようなことをどのようにして見つけるのでしょうか? 具体的には、これらの人々が体系的にそのような知識を根絶し、それを探求し、それを内面化するために使用する方法がありますか?
136 code-quality 

13
デザインパターンは眉をひそめていますか?
私は20年間ビジネスに携わっているシニア開発者の1人と話し合いました。彼は、彼が書いているブログでオンタリオ州でよく知られています。 奇妙なことは、彼が私に言ったことです。彼は、教科書から書かれており、現実の世界を説明していないため、作業するのが悪夢のようなコードがあると言いました。UI /データベース/データレイヤーに新しいフィールドを追加するには、2〜3時間かかりますが、彼のコードでは30分かかります。 もう1つのことは、ほとんどのプログラマーが設計パターンを理解しておらず、保守の観点からは良くないため、設計パターンを避けることです。 また、カナダのほとんどのWeb開発者は、データモデルを分離せずに、データレイヤークラスから継承することを好むという考えもあります。「モデルをデータ層から分離することは業界標準ではないでしょうか?」彼は時々言ったが、ここのほとんどの人はそれがあまりにも多くの仕事であるのでそれをしないことを好む。 ベストプラクティスを使用してコーディングしない理由は、メンテナンスの悪夢であり、従業員のほとんどがそれを理解していないためです(自分自身を除く)。時間。 Stack Overflowは、人々が業界標準に従うことを主に奨励していることを考えると、このような意見を聞くのはとても奇妙です。数日のうちに新しいフィールドや機能を絶えず排除せざるを得ないという問題は、十分に柔軟な固体パターンを推測することができないということですか?これは私がこれから理解していることの要点のようです。 これらの声明をどう思いますか?

10
ガベージコレクションを強制するのはいつですか?
だから私は、C#ガベージコレクターを強制的に実行することについての質問を読んでいた。ほとんどすべての回答が同じである。残念ながら、そのようなケースについて詳しく説明している人はいません。 ガベージコレクションを強制するのは、実際にはどのようなシナリオで良いまたは合理的なアイデアであるかを教えてもらえますか? 私はC#固有のケースではなく、ガベージコレクターを備えたすべてのプログラミング言語を求めています。Javaのようなすべての言語でGCを強制することはできませんが、できると仮定しましょう。

17
戻り値が存在しない関数/メソッドからNULLまたは空の値を返す方が良いですか?
ここで推奨事項を探しています。戻り値が存在しないか判断できない場合に、メソッドからNULLまたは空の値を返す方が良いかどうかに苦労しています。 例として、次の2つの方法を使用します。 string ReverseString(string stringToReverse) // takes a string and reverses it. Person FindPerson(int personID) // finds a Person with a matching personID. ではReverseString()、戻り値の型が文字列であるため、呼び出し側はそれを期待しているため、空の文字列を返します。また、この方法では、呼び出し元はNULLが返されたかどうかを確認する必要がありません。 でFindPerson()、NULLを返す方が適切なようです。NULLまたは空のPersonオブジェクト(new Person())が返されるかどうかに関係なく、呼び出し側は、何かを行う前に(呼び出しなどUpdateName())PersonオブジェクトがNULLまたは空であるかどうかを確認する必要があります。ここでNULLを返すだけで、呼び出し側はNULLをチェックするだけでよいのはなぜですか。 他の誰かがこれに苦労していますか?どんな助けや洞察も大歓迎です。

8
C ++はDよりも優れているのでしょうか?
私は最近Dを学んでおり、言語にある程度精通し始めています。私はそれが提供するものを知っています、私はまだすべてを使う方法を知りません、そして、Dイディオムなどについて多くを知りません、しかし、私は学んでいます。 私はDが好きです。これは素晴らしい言語であり、ある意味ではCの大規模な更新であり、うまく機能しています。どの機能も「ボルトオン」されているようには見えませんが、実際には非常によく考え抜かれ、適切に設計されています。 DはC ++であるべきだとよく耳にします(不必要な火炎戦争を避けるために、誰もが自分で決定するのが正しいかどうかは疑問です)。また、いくつかのC ++プログラマーから、C ++よりもはるかにDを楽しんでいると聞きました。 私自身はCを知っていますが、C ++を知っているとは言えません。C ++が言語として Dよりも優れている何かがあると思う場合、C ++とDの両方を知っている人から聞きたいです(通常の「サードパーティライブラリが多い」または「リソースが多い」または「 DよりもC ++を必要とするジョブが多い」)。 Dは、C ++が抱えていた多くの問題を修正するために、非常に熟練したC ++プログラマー(Walter BrightとAndrei Alexandrescu、Dコミュニティの助けを借りて)によって設計されましたが、実際には結局良くならない何かがありましたか?彼が逃した何か?あなたがより良い解決策ではなかったと思うものはありますか? また、私はD 1.0ではなくD 2.0について話していることに注意してください。

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