ソフトウェア工学

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

15
オープンソースプロジェクトとどのように効果的に競争しますか?
従来のクローズドソース製品と競合する堅固なオープンソースプロジェクトを持つ企業は、打ち負かすことは不可能に思えます。 著者がこのシナリオを説明しているこの記事を読みました。 ネットワーク管理などのソフトウェア市場を2つの製品に分割できるとします。1つは可能な限りのことをすべて行い、100万ドルの費用がかかり、もう1つは10%だけでしたが、無料でオープンでした。 商用ソリューションの値札は多数のユーザーを自動的に除外し、それらの人々はオープンソースに頼らなければなりません。しかし、一部のユーザーは10%の機能に満足し、それを完全に選択します。 たとえば、机の上に元のMacintoshコンピューターがあります。MacWriteと呼ばれるワードプロセッサを実行します。スペルチェックを除き、ワードプロセッサが必要なすべてを実行します。段落の書式設定、フォントの選択、テキストを太字または斜体にしたり、写真やグラフに貼り付けることもできます。「表示されるものは取得するもの」ユーザーインターフェイスにすべて含まれます。 76Kのディスク容量を占有します。「キロバイト」のように「K」です。 それをMicrosoft Wordと比較してください。前回Wordだけをインストールしたときは、MacWriteの何倍も大きい30MB程度だったと思いますが、MacWriteを使用する以上にそれを使用することはありません。私と同じように、多くのユーザーは基本的な機能に満足しています。彼らはすべての添えものを必要としません。 しかし、私のアナロジーに戻ります。当初、営利企業はおそらくオープンソースプロジェクトを無視するでしょう。それは彼らの収入の流れに対する脅威を表していないので、なぜ彼らは新興企業に注意を払う必要があるのでしょうか? しかし、このプロジェクトが健全で持続可能なものである場合、1年程度で商業製品の15〜20%の成果が得られる可能性があります。これにより、彼らのビジネスからさらに数人のユーザーが出血するはずであり、おそらく今、彼らは注意を払い始めています。 おそらく、この注意はプロジェクトに対するマーケティングの形をとるでしょう。彼らは、それが小さすぎるか、真剣に考えるには力不足だと主張するでしょう。そして、短期的にはこれはおそらく機能するでしょう。しかし、彼らがプロジェクトを認めたという単なる事実は興味をそそるでしょう。一部の人々は、それが小さすぎず、力不足でもないと判断し、使用を開始します。 もう1〜2年でプロジェクトは商用製品の機能の最大50%になります。人々は大勢でプロジェクトに参加し始めます。商業会社は今、何かをしなければなりません。彼らは何をしますか?彼らはより多くの機能を追加します。 商用製品はすでに人々が必要とするものの100%をすでに行っていたことを思い出してください。では、どのような機能を追加できますか?不要なもの。ユーザーインターフェイスの外観を変更したり、ネットワーク管理以外の機能を追加したりする場合があります。いずれにせよ、この開発には費用がかかり、それが会社の利益に食い込み始めます。 最後に、健全なコミュニティとこの新しいユーザーの流入により、オープンソースプロジェクトは最終的に商用製品の80%〜90%に近づきます。収益を生み出すすべての手段を使い果たした後、商業会社にはまだ1つの最後の選択肢があります。残りの顧客にネジを付けることです。より多くの請求を行う方法を見つけて、投資から何ができるかを探し出し、最終的に顧客を遠ざけます。 ファーフェッチ?そうは思いません。主な要件は2つだけです。 まず、オープンソースがネットワーク管理などの魅力的な代替手段を提供する市場を見つけます。 第二に、オープンソースプロジェクトの周りに持続可能なコミュニティを構築します。 もっともらしい。クローズドソースの会社だったら、どのように競争しますか?

3
「継承を超える構成」は「ドライ原則」に違反していますか?
たとえば、他のクラスを拡張するクラスがあるとします。 public class LoginPage { public String userId; public String session; public boolean checkSessionValid() { } } およびいくつかのサブクラス: public class HomePage extends LoginPage { } public class EditInfoPage extends LoginPage { } 実際、サブクラスにはオーバーライドするメソッドがありません。また、一般的な方法でHomePageにアクセスしません。つまり、次のようなことはしません。 for (int i = 0; i < loginPages.length; i++) { loginPages[i].doSomething(); } ログインページを再利用したいだけです。ただし、https: //stackoverflow.com/a/53354によると、インターフェイスLoginPageは必要ないため、ここでは構成を優先する必要があります。したがって、ここでは継承を使用しません。 public class HomePage …

5
メソッドを引数名(型ではなく)で区別するだけで十分ですか?
メソッドを引数名(型ではなく)で区別するだけで十分ですか、それとも明示的に名前を付ける方がよいでしょうか? たとえば、T Find<T>(int id)VS T FindById<T>(int id)。 ById引数名だけを保持するのではなく、より明示的に名前を付ける(つまり、追加する)正当な理由はありますか? 私が考えることができる理由の1つは、メソッドのシグネチャが同じであるが、意味が異なる場合です。 FindByFirstName(string name) そして FindByLastName(string name)

5
メソッドを呼び出すことができると定義するよりも、メソッドをオーバーライドできると定義する方が強いコミットメントはありますか?
から:http : //www.artima.com/lejava/articles/designprinciples4.html エーリッヒガンマ:10年経った今でも、それは真実だと思います。継承は、動作を変更するクールな方法です。しかし、サブクラスは、オーバーライドするメソッドが呼び出されるコンテキストについて簡単に推測できるため、脆弱であることがわかっています。私がプラグインするサブクラスコードが呼び出される暗黙的なコンテキストのため、基本クラスとサブクラスの間には密接な結合があります。構成には、より良い特性があります。結合は、いくつかの小さなものをより大きな何かにプラグインするだけで減少し、大きなオブジェクトは小さなオブジェクトをコールバックします。APIの観点から、メソッドをオーバーライドできることを定義することは、メソッドを呼び出すことができることを定義することよりも強力です。 私は彼が何を意味するのか理解していません。誰か説明していただけますか?

7
単純な(自己完結型)関数のテストを保持する必要はありますか?
このことを考慮: public function polynominal($a, $b, $c, $d) { return $a * pow($x, 3) + $b * pow($x, 2) + $c * $x + $d; } 上記の機能に対してさまざまなテストを作成し、自分や他の人に「機能する」ことを証明するとします。 その後、これらのテストを削除して、いつまでも幸せに生きてみませんか?私のポイントは、いくつかの機能が機能することが証明された後、継続的にテストする必要がないことです。私は、これらの機能をまだテストする必要があると述べているカウンターポイントを探しています:...または、はい、これらはテストする必要はありません...

7
命令的なbreakステートメントと他のループチェックの機能的に同等なものは何ですか?
私が以下のロジックを持っているとしましょう。関数型プログラミングでそれを書く方法は? public int doSomeCalc(int[] array) { int answer = 0; if(array!=null) { for(int e: array) { answer += e; if(answer == 10) break; if(answer == 150) answer += 100; } } return answer; } ほとんどのブログ、記事の例では、単純な数学関数「Sum」の単純な例を説明しています。しかし、私は上記のようなJavaで書かれたロジックを持っているので、それをClojureの機能コードに移行したいと思っています。FPで上記を実行できない場合、FPのプロモーションの種類はこれを明示しません。 上記のコードは完全に必須であることを知っています。将来的にFPに移行するという先入観に基づいて書かれたものではありません。

2
無制限の量のパラメーターを取るメソッドが、より少ないパラメーターでオーバーロードを定義することが多いのはなぜですか?
たとえばSystem.IO.Path.Combine、.NET のメソッドには次のオーバーロードがあります。 Combine(params String[]) Combine(String, String) Combine(String, String, String) Combine(String, String, String, String) 最後の3つのポイントは何ですか? 最初のものはそれらをすべてカバーしますが、よく見るとparamsキーワードを使用しています。Combine(String, String).NET 4までの唯一のバージョンであったため、下位互換性の議論はバリアントのみを対象としています。

2
4番目と5番目のプログラミング言語の世代とは何ですか?それらはもっとありますか?[閉まっている]
多くの場合、学校/大学レベルで分類されているため、一般的なプログラミング言語(C#、Java、C ++)はすべて第3世代の言語です(マシンの物理部分からの抽象度が高い)。また、アセンブリ言語は第2世代、機械言語は第1世代言語に分類されます。 最初は、SQLは第4世代言語と見なされるべきだと考えていました。これは、SQLがより抽象的であり、ループの詳細からはるかに離れており、より記述的だからです。 今、第4世代と第5世代の言語があることがわかりましたが、プログラミング言語またはテクノロジを第4世代または第5世代の言語として分類する根拠は何ですか? また、第6世代または第7世代の言語もありますか?

7
わずかな時間で重要な技術的決定を下す方法
私の会社がWPFアプリケーションをLinux / Android / iOSに移植するために使用するツールとプラットフォームについて非常に深刻な決定を下した2日間です。 明らかに、すべての可能なオプションについて読んだり、試用、プロトタイプの作成などについて読むには2日では十分ではないことを先輩に指摘することができます。私はそれを言うことができます。少し助けにはなりません。 2日後に決定が下されます。期間。 片方からはイライラし、もう片方からはこのアプローチには真実があると思います。さもなければ、ベンチワークやサンプルの実行を行う多数のダウンロードされたSDK、フレームワーク、API、ブログ記事などに簡単に埋もれてしまいます。そして、それがすべてのためだったことをプロセスで忘れます。 それでも、間違った決定が会社に多大なコストをかけることを恐れています。それでは、そのような決定を下すための「理想的な」プロセスは何だと思いますか?


8
オブジェクトの機能は、実装するインターフェースによってのみ識別されるべきですか?
C#のis演算子とJavaのinstanceof演算子を使用すると、オブジェクトインスタンスが実装しているインターフェイス(または、より基本的にはその基本クラス)で分岐できます。 インターフェイスが提供する機能に基づいた高レベルの分岐にこの機能を使用することは適切ですか? または、オブジェクトが持つ機能を記述するためのインターフェースを提供するために、基本クラスがブール変数を提供する必要がありますか? 例: if (account is IResetsPassword) ((IResetsPassword)account).ResetPassword(); else Print("Not allowed to reset password with this account type!"); 対 if (account.CanResetPassword) ((IResetsPassword)account).ResetPassword(); else Print("Not allowed to reset password with this account type!"); 機能の識別にインターフェイス実装を使用することには落とし穴がありますか? この例は単なる例でした。もっと一般的なアプリケーションについて考えています。

9
なぜ学校はリストよりも配列を教えるのですか?[閉まっている]
私の学校での最初のプログラミングクラスの割り当てのほとんどでは、配列を使用する必要がありました。私は今フルタイムで働いており、私が取り組んだプロジェクトでアレイを使用したことはありません。既存のプロジェクトでさえ、どこでも配列の使用を見たことはありません。私の意見では、リストは使いやすく標準です。教授が課題でアレイを使用するよう生徒に指示するのはなぜですか?学生が基本を理解するためだけですか? ほとんどの大学がJavaを教えているため、この質問はJavaに固有のものです。

3
SASSがLESSより優れている点はありますか?[閉まっている]
私はこれらのCSSプリプロセッサの研究をしようとしています。 cssプリプロセッサとしてsassを使用するよりもsassを使用する利点はありますか?私が探している要因には、コミュニティの規模、ソフトウェアプロジェクトの成熟度などがあります。 これに関連する別の質問があったことは知っていますが、建設的に書かれて閉じられていませんでした。 更新 ブートストラップがSassを使用するようになったようです
36 css  less 

5
コードレビューで肯定的なコメントをするのは適切ですか、それとも建設的な批判専用ですか?
私は最近多くのコードレビューを行ってきましたが、コードレビューに肯定的および/または面白いコメントを入れることの肯定的および否定的な効果とプロフェッショナリズムに自信がありません。 私たちのチームではコードレビュープラットフォームとしてGithubを使用しているため、コメントは誰でも見ることができます。私は通常、このプラットフォームを使用して、最初から最後までのプロセス全体が見えるようにし、歴史的なものにします。

6
セッション変数を避けるべきですか?
以前はセッション変数に大きく依存していましたが、最近ではクエリ文字列パラメーターなどを使用して、それらの多くが不要であることがわかりました。 私の同僚がセッション変数の使用を拒否しています。これは現実的な目標であり、セッション変数は実用的な理由で避ける必要がありますか?セッション変数を完全に回避できますか(ログインを許可するセッションCookieを除く)、これにより設計が改善されますか? 私の同僚がそれらを使用しない理由は次のとおりです。 セッション変数の型指定されていない性質 セッションのタイムアウトにより状態が失われる セッション変数のグローバルスコープの性質 セッションを失う負荷分散サーバー(.Net固有?) アプリケーションプール/サーバーの再起動 彼らは不要です

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