ソフトウェア工学

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

8
CがC ++で不十分な言語の「バインディング」を提供するのはなぜですか?
私は最近、C ++を介してCを使用するタイミングを疑問に思っていました。幸いなことに、誰かがすでに私にそれを打ち負かし、しばらくかかりましたが、私はその質問に対するすべての答えとコメントを消化することができました。 ただし、その投稿の1つの項目は、検証や説明のような例なしで、何度も何度も対処されます。 「Cコードは、ライブラリに複数の言語バインディングが必要な場合に適しています」 それは言い換えです。複数の人がC ++で(いくつかのextern機能を介して)複数の言語バインディングが可能であることを指摘していることに注意する必要がありますが、それでも、その記事全体を読むと、Cが移植性/言語バインディングに理想的であることは明らかです。私の質問は:なぜですか? Cでライブラリを記述すると他の言語でのバインディングや移植性が向上する理由を具体的に説明してください。

8
受信パラメータの変更はアンチパターンですか?[閉まっている]
私はJavaでプログラミングしており、常にコンバーターを次のように作成しています。 public OtherObject MyObject2OtherObject(MyObject mo){ ... Do the conversion return otherObject; } 新しい職場でのパターンは次のとおりです。 public void MyObject2OtherObject(MyObject mo, OtherObject oo){ ... Do the conversion } 私にとっては、着信パラメータを変更しないことに慣れていたので、少し臭いです。この着信パラメータの変更はアンチパターンですか、それとも大丈夫ですか?重大な欠点がありますか?

8
クライアント側のコーディング:悪意のある使用を防ぐ方法
過去数年にわたって、クライアントサイド(ブラウザ)アプリケーションのトレンドは本当に始まっています。 私の最新のプロジェクトでは、時代とともに動き、クライアント側のアプリケーションを作成することにしました。 このアプリケーションの一部には、トランザクション電子メールのユーザーへの送信が含まれます(たとえば、サインアップの検証、パスワードのリセット電子メールなど)。サードパーティのAPIを使用してメールを送信しています。 通常、サーバーでアプリケーションを実行します。サーバー上のコードからサードパーティAPIを呼び出します。 クライアント側のアプリケーションを実行すると、ユーザーのブラウザでこれを行う必要があります。サードパーティAPIは、これを実現するために必要なJavaScriptファイルを提供します。 私が見ることができる最初の明白な問題は、APIキーを使用する必要があることです。これは通常、サーバーに安全に保存されますが、このキーをクライアントブラウザーに提供する必要があります。 私がこの問題を回避できると仮定すると、次の問題は、技術に精通したユーザーがブラウザでJavaScript開発者ツールをロードし、アプリケーションで設定したルールを遵守するのではなく、好きなように電子メールAPIを使用することを停止することです。 私の一般的な質問は-クライアント側アプリケーションの悪意のある使用をどのように防ぐことができるのでしょうか?

1
サードパーティのライブラリライセンス「ペーパーワーク」を整理するためのベストプラクティスは何ですか?
私は小さなオープンソースプロジェクトを開発しています。このアプリケーションは、Apache、MIT、BSD、LGPL、CDDLなどのさまざまなライセンスでリリースされた多くのサードパーティライブラリを使用します。 これらの各ライセンスには、独自の「事務処理」要件があります。たとえば、Apacheライセンスv2.0には次のように記載されています。 作品にその配布の一部として「NOTICE」テキストファイルが含まれている場合、配布する派生作品には、そのようなNOTICEファイルに含まれる帰属通知の読み取り可能なコピーを含める必要があります。 MITライセンスには著作権表示が含まれており、次のように記載されています。 上記の著作権表示およびこの許可通知は、ソフトウェアのすべてのコピーまたは大部分に含まれるものとします。 BSDライセンスには著作権表示も含まれており、次のように記載されています。 バイナリ形式での再配布では、上記の著作権表示、この条件リスト、および以下の免責事項を、配布物とともに提供されるドキュメントおよび/またはその他の資料に複製する必要があります。 LGPL v.3によると: (あなたは)ライブラリが使用されていること、およびライブラリとその使用が本ライセンスの対象であることを、結合著作物の各コピーとともに目立つように通知する必要があります。 LGPLおよびCDDLライセンスでは、ソースコードをライブラリのバイナリ形式とともに提供する必要があるため、ソースコードの入手方法に関する情報はどこかで提供する必要があります。 このすべてのデータを整理するためのベストプラクティスは何ですか?テキストファイルを作成し、すべてのNOTICEファイル、MITおよびBSDライセンスなどのコンテンツをそのファイルにコピーする必要がありますか?...または、ライブラリごとに個別のディレクトリを作成し、ライブラリに関連するすべてのデータをそのディレクトリに配置する必要がありますか?… または、他の何か? 公開されたプロジェクトでこの「ペーパーワーク」の例を見るのも面白いでしょう。 更新: 私が読んでいるあなたは、すべてのソースファイルとライセンス通知を含める必要がありますか?、しかしそれは私の問題に対処しません。私の質問は、プロジェクトで使用されているサードパーティのライブラリに関するものであり、その質問はプロジェクト独自のソースコードのヘッダーに関するものです。

12
コードドキュメントを自動生成する論理的な理由はありますか?[閉まっている]
自動ドキュメント生成はさまざまなツールで実行できますが、GhostDocはその中でも最も優れたツールの1つです。ただし、定義上、生成されるものはすべて冗長です。それは方法など、クラス、および出力の英語の名前を見てとるかもしれないより冗長にそれらを説明します。最良の場合、読者が頭の中ですでにできることを行います(ここからの例): /// <summary> /// Initializes a new instance of the <see cref="Person"/> class. /// </summary> public Person() ... 最悪の場合、名前の意味をヒューリスティックに把握しようとする試みで実際に誤解を招く奇妙なドキュメントを生成することになります。 /// <summary> /// Riches the text selection changed. /// </summary> /// <param name="richTextBox">The rich text box.</param> private void RichTextSelection_Changed(System.Windows.Controls.RichTextBox richTextBox) ... GhostDocに対する態度は「何らかの形式的なXMLドキュメントを持っている方が本質的に良い」と思われますが、そのドキュメントが100%冗長なのはなぜですか?せいぜい大量のスペースを無駄にしているだけではありませんか? 私の職場では、すべてを文書化する必要があり、ほとんどの場合、GhostDocの自動生成ドキュメントを使用します。あなたはこれを行いますか?実際にドキュメントを自分で書くつもりがない場合は、単にコードをドキュメント化しないままにしておかない合理的な理由はありますか?

3
RESTful APIの末尾のスラッシュ
私はRESTful APIの末尾のスラッシュをどうするかについて議論していました。 犬と呼ばれるリソースと、個々の犬用の下位リソースがあるとします。したがって、次のことができます。 GET/PUT/POST/DELETE http://example.com/dogs GET/PUT/POST/DELETE http://example.com/dogs/{id} しかし、次の特別な場合はどうしますか: GET/PUT/POST/DELETE http://example.com/dogs/ 私の個人的な見解では、これはid =で個々のdogリソースにリクエストを送信するということnullです。この場合、APIは404を返すはずです。 他の人は、リクエストがdogsリソースにアクセスしている、つまり末尾のスラッシュが無視されると言います。 誰もが決定的な答えを知っていますか?
60 api  rest  http 

5
データ分析のためのR vs Python [非公開]
私は約1年間プログラミングをしており、データ分析と機械学習に本当に興味があります。私はいくつかのオンラインコースに参加しており、いくつかの本を読んでいます。 私がしていることはすべてRまたはPythonのいずれかを使用しており、1つの言語に集中すべきか(そうであればどの言語に集中すべきか)、または両方を続けるべきかについての提案を探しています。彼らはお互いを補完しますか? -私は学校でC#を使用しているが、自習を通じてPythonに精通していることに言及する必要があります。

9
言語に論理演算子としての含意が含まれないのはなぜですか?
奇妙な質問かもしれませんが、なぜ多くの言語(Java、C、C ++、Python Haskell-最後のユーザー定義演算子はそれを追加するのは簡単ですが)で論理演算子としての意味がないのですか?論理的含意を書くと(特にアサートまたはアサートのような式で)否定するか、またはORを使用して否定する方がはるかに明確です。 encrypt(buf, key, mode, iv = null) { assert (mode != ECB --> iv != null); assert (mode == ECB || iv != null); assert (implies(mode != ECB, iv != null)); // User-defined function }

7
C ++でビットフラグにスコープ付き列挙型を使用する
enum X : int(C#)と、またはenum class X : int(C ++ 11)の隠れた内部フィールド有するタイプであるintことは、任意の値を保持することができます。さらに、いくつかの定義済み定数がX列挙型で定義されています。列挙型を整数値にキャストしたり、その逆を行うことができます。これは、C#とC ++ 11の両方に当てはまります。 C#では、列挙型は個々の値を保持するためだけでなく、Microsoftの推奨に従って、フラグのビットごとの組み合わせを保持するためにも使用されます。このような列挙型は(通常、必ずしもそうではありませんが)[Flags]属性で装飾されています。開発者の生活を楽にするために、ビット単位の演算子(OR、ANDなど)がオーバーロードされているため、次のようなことが簡単にできます(C#)。 void M(NumericType flags); M(NumericType.Sign | NumericType.ZeroPadding); 私は経験豊富なC#開発者ですが、C ++をプログラミングしてから数日しか経っていないため、C ++の規約については知りません。C#で使用したのとまったく同じ方法でC ++ 11列挙型を使用する予定です。C ++ 11では、スコープ付き列挙型のビット演算子はオーバーロードされないため、それらをオーバーロードしたかったのです。 これは議論を呼び起こし、意見は3つの選択肢の間で異なるようです: C#と同様に、ビット型を保持するために列挙型の変数が使用されます。 void M(NumericType flags); // With operator overloading: M(NumericType::Sign | NumericType::ZeroPadding); // Without operator overloading: M(static_cast<NumericType>(static_cast<int>(NumericType::Sign) | static_cast<int>(NumericType::ZeroPadding))); しかし、これはC ++ 11のスコープ付き列挙型の厳密に型指定された列挙型の哲学に反するでしょう。 列挙型のビットごとの組み合わせを保存する場合は、プレーン整数を使用します。 void …

12
インスタンスを複数のレイヤーに渡すのは悪い習慣ですか?
私のプログラム設計では、オブジェクトインスタンスをいくつかのクラスに渡さなければならないことがよくあります。たとえば、オーディオファイルを読み込んでプレーヤーに渡すコントローラーがあり、プレーヤーがそれをplayerRunnableに渡し、playerRunnableが別の場所などに再び渡す場合、見た目は悪くなりますが、それを避ける方法を知ってください。それともこれをしても大丈夫ですか? 編集:後でファイルを読み込むことができるため、プレーヤーの例が最適ではないかもしれませんが、それ以外の場合は動作しません。

11
プログラマーのパフォーマンスが低いかどうかを見分ける方法は?[閉まっている]
私は5人以上の開発者を持つチームリーダーです。私には開発者がいます(彼をAと呼びましょう)。彼は優れたプログラマーで、きれいでわかりやすいコードを書いています。しかし、彼は管理するのがいくぶん困難であり、時々彼は本当に成績が悪いのかどうか疑問に思います。 弊社では、開発者が使用するバグトラッカーで作業の進捗状況を示すことを要求しています。プログラマを監視するためだけでなく、関係者に進捗状況を知らせておくためです。問題は、Aはタスクの進行状況が完了したとき(最初に作業を行ってから3週間後)にのみ更新するため、開発週の途中で何が起こっているのか不思議に思う人を残します。彼は繰り返し調査しても習慣を変えませんでした。(大丈夫、開発者は事務処理が嫌いです、私もそうです) 最近2〜3か月、彼はさまざまなイベントのために非常に頻繁に休暇を取ります。病気であるか、多くの個人的なイベントに出席する必要があります。 各月のスプリントまたはロードマップを定義します。また、スプリントの最初に、各開発者がスプリントで行う必要のある作業量について説明し、開発者は各タスクに必要な時間を設定することができます。彼は通常、それらすべてを完了することはできません。(大丈夫です。開発者は自分のせいではなく、定期的に締め切りを逃しています)。 私はシンガポールに拠点を置いています。それが重要かどうかわかりません。ええ、アジア人はtic黙であることが知られていますが、それは重要ですか? 上記のイベントの1つまたは2つだけが発生した場合、Aのパフォーマンスが低下しているとは感じませんが、それらはすべて一緒に発生します。だから私は、Aのパフォーマンスが低いと感じています。 これは、プログラマーとしての私の長年の経験に基づいた感覚です。しかし、私は間違っている可能性があります。 プログラマの仕事を測定することは、2つのタスクがすべて同じというわけではなく、プログラマの会社へのコミットメントを測定する標準的な目的がないため、測定が難しいことで有名です。プログラマーが自分の仕事をしているのか、怠けているのかを見分けるのは、まったく不可能です。あなたができることは、それらを信頼することだけです。ええ、信頼性と自律性を与えることは、プログラマーが仕事をするための最善の方法です。多くの場合-しかし、彼らがあなたの信頼を濫用している場合、あなたは知っていますか? 結果: 彼のパフォーマンスに対する私の認識について、私は彼とまっすぐ話しました。彼が自分の最高のレベルで演技していないと感じたことを示唆したとき、彼はinした。彼はこれが完全に不公平な気持ちだと感じました。それから私はこれが私の気持ちだと答え、私の気持ちが正しいかどうかわからなかった。彼はこれのどれも持たず、すぐに議論を終了しました。 彼が去る前に、彼は非常に冷たい口調で「会社にもっと多くを与えようとするだろう」と言った。私は彼の反応に驚いた。何らかの形で彼を怒らせたと確信しています。しかし、それが彼にとってとても率直であるために私がするべき正しいことであったかどうかはあまりわかりません。 私の質問は次のとおりです。プログラマーのパフォーマンスが低いかどうかはどうすればわかりますか?これについて、私よりもよく知っている経験豊富なチームリーダーがいますか? 追加のメモ: 私はマイクロ管理が嫌いです。したがって、ソフトウェアプロセスに必要なものはすべてスプリント(タスクに優先順位が付けられて割り当てられ、月末に行われた作業量のレビュー)です。開発者は、日々の作業に合わせてタスクを更新する必要があります。 スタンドアップミーティングなどはありません。主に私たちには自宅で仕事をする自由があり、誰もがこの自由を大事にしているからです。 締め切りを設定するのは私ですが、開発者が各タスクの見積もりを提供し、見積もりに基づいて、特定のスプリントに入るタスクを決定します。スプリントの終わりにタスクを完了できない場合は、次のタスクにプッシュします。したがって、理論的には、スプリント全体で1つまたは2つのタスクしか実行できず、残りの99タスクを次のスプリントにプッシュできますが、これを正当化する限り、彼は毎日の作業進捗の更新の形で問題ありません

9
開発者もテスターとして行動する必要がありますか?[閉まっている]
私たちは3人の開発者、1人のデザイナー、スクラムマスター、およびプロダクトオーナーのスクラムチームです。ただし、チームには公式のテスターはいません。私たちに常にある問題は、アプリケーションをテストし、それらのテストに合格してバグを削除することが、PBI(製品バックログアイテム)が完了したと見なす基準の1つとして定義されていることです。 しかし問題は、アプリケーション(実装された3人の開発者と1人の設計者)がどれだけアプリケーションをテストしようとしても、いくつかのバグが見られず、利害関係者へのプレゼンテーション(マーフィーの法則)を台無しにすることです。 改善策として、新しいテスターを雇うことをお勧めします。仕事をしている人はテストであり、テストのみです。公式のプロテスター。 ただし、問題は、スクラムマスターと利害関係者が開発者(または設計者)もテスターである必要があると考えていることです。 彼らは正しいですか?開発者(デザイナーも)もテスターに​​すべきですか?
60 testing  scrum 

11
抽象化(LINQなど)の使用がなぜタブーなのですか?[閉まっている]
私は独立した請負業者なので、新しいギグのために年に3〜4回インタビューしています。私は今、そのサイクルの真っin中にあり、インタビューがうまくいったように感じたにもかかわらず、機会を求めて断られました。今年も同じことが何度か起こりました。 今、私は完璧な人ではなく、すべての組織に適しているとは思っていません。とはいえ、バッティング平均は通常よりも低いので、最後の面接者に建設的なフィードバックを丁寧に尋ねると、彼は配達しました! インタビュアーによると、主なことは、低レベルの有機的に成長したアルゴリズムではなく、抽象化(LINQなど)の使用に過度に傾いているように見えたということです。 表面的には、これは理にかなっています-実際、これらのインタビューでもLINQについて口説き、インタビュアーが.NETであってもLINQについてあまり知らなかったため、他の拒否も理にかなっていますみんな)。 だから今、この質問が残っています:「巨人の肩の上に立つ」ことになっていて、私たちが利用できる抽象化(LINQのような)を使用することになっているなら、なぜそれをタブーと考える人がいるのでしょうか?追加のコストなしで同じ目標を達成する場合、「既製」のコードをプルすることは意味がありませんか? LINQは、それがあってもことを私には思われるで抽象化、単純にすべての抽象化で同じ 1は、まったく同じ目的を達成するために書くでしょうアルゴリズム。カスタムアプローチの方が優れているかどうかを確認できるのはパフォーマンステストだけですが、LINQのようなものが要件を満たしていた場合、そもそも独自のクラスを作成する必要はありません。 ここでLINQに注目するつもりはありません。私は、JAVAの世界には匹敵するものがあると確信しています。なぜ、一部の人々が抽象化を使用するという考えに非常に不快になり、彼ら自身が書いていないのかを知りたいのです。 更新 Euphoricが指摘したように、Javaの世界にはLINQに匹敵するものはありません。 したがって、.NETスタックで開発している場合、常にそれを使用してみてはどうでしょうか。人々がそれが何をするのかを完全に理解していない可能性はありますか?

16
if / returnのベストプラクティス
私はif声明を持っているときに戻るより良い方法と考えられるものを知りたいです。 例1: public bool MyFunction() { // Get some string for this example string myString = GetString(); if (myString == null) { return false; } else { myString = "Name " + myString; // Do something more here... return true; } } 例2: public bool MyFunction() { // Get some …

18
他の人のコードの作業[終了]
コーディングの経験はほとんどありません。作業を始めた後は、ほとんどの場合、他の人のコードに取り組み、既存の機能に新しい機能を追加するか、既存の機能を変更します。実際のコードを書いた人は、私の会社ではもう機能しません。私は彼のコードを理解し、自分の仕事をするのに苦労しています。コードを変更しようとするたびに、何らかの形で作業機能を台無しにしています。他の人のコードを操作する際に注意すべきことは何ですか?

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