ソフトウェア工学

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

17
なぜグローバル国家はそれほど悪なのか?
これを始める前に、抽象化と依存性注入の概念をよく知っていると言っておきましょう。ここで目を開ける必要はありません。 まあ、私たちのほとんどは、「グローバル変数を使用しないでください」、または「シングルトンはグローバルであるため悪です」と本当に理解せずに何度も言います。しかし、不吉なグローバルな状態で本当に悪いのは何ですか? たとえば、システムフォルダパスやアプリケーション全体のデータベース資格情報など、アプリケーションのグローバル構成が必要だとしましょう。 その場合、これらの設定を何らかのグローバルスペースで提供する以外に良い解決策はありません。これは、アプリケーション全体で一般的に利用できます。 私はために悪いことを知っている虐待それを、しかし、世界的なスペースが本当にあるTHAT悪?もしそうなら、どんな良い選択肢がありますか?

30
ビジネスアナリストとプロジェクトマネージャーがプログラマーよりも高い給料を受け取るのはなぜですか?[閉まっている]
プログラミングは、ドキュメントを作成したり、ガントチャートを作成したり、プログラマに進捗状況を尋ねたりするよりもはるかに難しいことを認めなければなりません。プログラミングが一般に難しいことを知っている私たちにとって、素朴な人にとって、ビジネスアナリストやプロジェクトマネージャーがプログラマーよりも高い給料を得るのはなぜですか?ほとんどの場合でもプログラマーが家に帰るのが遅いのに、仕事を高給の仕事にしているのは何ですか? 更新 私の無知をすみません、応答のいくつかから、BAとPMが通常プログラマーの混乱の原因であるので、BAとPMがより高い給料を得る理由のようです。しかし、結局のところ、混乱を解決し、一生懸命働くために手を汚すのはプログラマーです。そのため、まだ意味がありません。

14
バックエンドをAPIとして作成する必要がありますか?
今日、MVCアプリケーションについて熱く議論しました。MVC(ASP.NET)で記述されたWebサイトがあり、通常はビューで何かを実行するパターンに従います->コントローラーを押す->コントローラーがモデルを構築します(データを取得するマネージャーを呼び出し、モデルを構築しますコントローラのメソッド自体)->モデルが表示されます->すすぎと繰り返し。 彼は、私たちのコードが密結合しすぎていると言った。たとえば、デスクトップアプリケーションも必要な場合、既存のコードを使用することはできません。 彼が言った解決策とベストプラクティスは、APIを構築し、APIの上にWebサイトを構築し、デスクトップアプリケーション、モバイルアプリなどを構築することは非常に簡単です。 これは、さまざまな理由で私にとって悪い考えのようです。 とにかく、このプラクティスを議論するかもしれないグーグルで何も見つけられないようです。誰もが長所、短所、なぜそうすべきか、なぜそうすべきではないか、さらに読むべきかについての情報を持っていますか? 悪い考えだと思ういくつかの理由: バックエンドをAPIから実行するにはあまりにも抽象的です。あなたはそれをあまりにも柔軟にしようとしているので、それは管理不能な混乱になります。 MVCに組み込まれているものはすべて、役割や認証など、役に立たないようです。たとえば、[Authorize]属性とセキュリティ。独自にロールする必要があります。 すべてのAPI呼び出しにはセキュリティ情報が添付されている必要があり、トークンシステムなどを開発する必要があります。 プログラムが実行する機能ごとに、完全なAPI呼び出しを記述する必要があります。実装するほとんどすべてのメソッドは、APIから実行する必要があります。すべてのユーザーのGet / Update / Deleteに加えて、ユーザー名の更新、グループへのユーザーの追加など、他の各操作のバリアントがあり、それぞれが個別のAPIコールになります。 APIに関しては、インターフェイスや抽象クラスなどのあらゆる種類のツールが失われます。WCFのようなものには、インターフェイスに対する非常に乏しいサポートがあります。 ユーザーを作成するメソッド、または何らかのタスクを実行するメソッドがあります。50人のユーザーを作成する場合は、50回呼び出すだけです。このメソッドをAPIとして実行することを決定すると、ローカルWebサーバーは名前付きパイプに接続でき、問題はありません-デスクトップクライアントもヒットできますが、突然、ユーザーの一括作成にはインターネット上でAPIを50回ハンマーする必要があります。良くない。したがって、バルクメソッドを作成する必要がありますが、実際にはデスクトップクライアント用に作成するだけです。この方法では、a)統合するものに基づいてAPIを変更する必要があり、直接統合することはできません。b)余分な関数を作成するためにより多くの作業を行う必要があります。 ヤグニ。たとえば、1つのWebアプリケーションと1つのWindowsアプリケーションなど、まったく同じように機能する2つのアプリケーションを作成することを特に計画しているのでなければ、膨大な量の開発作業が必要になります。 エンドツーエンドでステップスルーできない場合、デバッグははるかに困難になります。 多くのやり取りを必要とする独立した操作がたくさんあります。たとえば、いくつかのコードは現在のユーザーを取得し、ユーザーが管理者ロールにあることを確認し、ユーザーが属する会社を取得し、他のメンバーのリストを取得し、それらをすべて送信しますEメール。そのためには、多くのAPI呼び出しが必要になるか、必要な特定のタスクに特注のメソッドを記述する必要があります。特注のメソッドの唯一の利点は速度ですが、欠点は柔軟性に欠けることです。 おそらく、これらの理由のいくつかが私の頭上にあります。 2つの同一のアプリケーションが本当に必要な場合を除き、私には好感が持てますが、それだけの価値はありません。このように構築されたASP.NETアプリケーションを見たことがありません。2つの個別のアプリケーション(APIとコード)を記述し、両方をバージョン管理する必要があります(ユーザーページに新しいフィールドが追加された場合、 dは、APIと消費コードを同時に更新して悪影響を与えないようにするか、堅牢性を維持するために多くの追加作業を行う必要があります)。 編集:いくつかの素晴らしい反応、本当にこれが今何を意味するのか良いアイデアを得るために始めています。それでは、私の質問を拡張するために、このAPI構造に従うようにMVCアプリをどのように構成しますか? たとえば、ユーザーに関する情報を表示するWebサイトがあります。MVCには、次のものがあります。 ビュー-UserViewModelコントローラーを表示する(CS)HTMLページ-GetUser()を呼び出し、GetUserメソッドを持つビューマネージャークラス(APIの一種)に渡すUserViewModelを作成します。 コントローラーはGetUser()を実行しますが、デスクトップアプリも必要です。これは、GetUserが何らかのAPIを介して公開される必要があることを意味します。TCP接続、WCF、またはおそらくRemotingが必要になる場合があります。永続的な接続が不安定なため、RESTfulなモバイルアプリも必要です。 それでは、GetUser()メソッドがあり、コードが実行するWCF Webサービスごとに、各APIを作成しますreturn new UserManager().GetUser()か?そして、同じことを行うMVC 4 Web APIメソッド?MVCコントローラーメソッドでGetUserを直接呼び出し続けていますか? または、3つすべて(Web API RESTサービス)で機能するソリューションを選択し、その上にすべてを構築して、3つすべてのアプリがAPI呼び出し(ローカルコンピューターに対してmvc呼び出し)を行うようにします。 そして、これは単なる理論上の完璧なシナリオですか?特に、RESTfulな方法で操作を行えるように開発する必要がある場合、この方法で開発する際に大きなオーバーヘッドが発生することがあります。これのいくつかは返信で取り上げられていると思います。 編集2:より多くのものを読んだ後、私はそれを説明するかもしれないと思うコメントを下に入れました。この質問は、私が考えるちょっとしたトリックの質問です。APIとしてバックエンドを書くと、すべて(mvcアプリ、デスクトップアプリ、モバイルアプリ)が何かを行うために呼び出す単一のWebサービスがあるべきだと思って混乱しました。 私が思いついた結論は、ビジネスロジックレイヤーが正しく分離されていることを確認することです。コードを見て、すでにこれを行っています。コントローラーはGetUser()マネージャーを呼び出し、それからビューモデルを作成してビューでレンダリングします。実際、ビジネスロジック層は APIです。ただし、デスクトップアプリから呼び出したい場合は、WCFサービスのようなものを記述して、呼び出しを容易にする必要があります。GetUser()コードを含むWCFメソッドを呼び出すだけでもreturn MyBusinessLayer.GetUser()十分です。したがって、APIはビジネスロジックであり、WCF / Web APIなどは、外部アプリケーションに呼び出しを許可するためのほんの一握りのコードです。 そのため、必要なものに応じてビジネスロジックレイヤーをさまざまなAPIでラップする必要があり、他のアプリで実行したい操作ごとにAPIメソッドを記述する必要があるというオーバーヘッドがあります。認証を行う方法を整理しますが、ほとんどの部分で同じです。ビジネスロジックを別のプロジェクト(クラスライブラリ)に固定すれば、おそらく問題はありません! この解釈が正しいことを願っています。それが生成したすべての議論/コメントをありがとう。

8
Gitの「ステージ」とはどういう意味ですか?
アクションに使用される単語の意味を見つけることができなかったため、gitを理解するのは難しいと感じています。辞書で「ステージ」の意味を確認しましたが、ソース管理の概念に関連する意味はありませんでした。 gitのコンテキストで「ステージ」とはどういう意味ですか?

5
GitHubのフォークされたリポジトリを永久に保持する必要がありますか?
だから私は他の誰かのリポジトリをフォークし、いくつかの変更を行い、プルリクエストを送信し、私の変更がそれを製品に加えました。すばらしいです! しかし...フォークされたリポジトリをどうすればよいですか?リポジトリを保持する理由はありますか、それとも削除してください。私は追加の貢献をするつもりはありませんが、気が変わったらいつでもそれを再分岐できると思います。 バックアップを保持することはあまり気にしません。リンクの切断、コミットメッセージの消失などが心配です。
314 github 

4
ソビエト連邦の宇宙計画で使用されたソフトウェアプログラミング言語は何ですか?
私はソビエトの宇宙プログラムに興味を持ち、1988年頃のブラン宇宙船のソフトウェアがPrologで書かれていることを発見することに興味がありました。 初期のミッション、特に1970年代初頭のMars PrOP-Mローバーミッションでどの言語が使用されていたのかを知っている人はいますか? 編集 Buran Prologの私のソースは、1990年5月のCIAサイトからの機密解除されたドキュメントです。OCRバージョンが見つかりませんでした。0449: オープンソースの文献によると、ソビエト連邦はフランスで開発されたPrologとして知られるプログラミング言語を使用して、ブラン車用のオンボードシステムソフトウェアを開発しました...

16
x + = yのようなショートカットが良い習慣と見なされるのはなぜですか?
これらが実際に何と呼ばれているのか分かりませんが、私は常にそれらを見ています。Pythonの実装は次のようなものです。 x += 5の略記法としてx = x + 5。 しかし、なぜこれが良い習慣と見なされるのでしょうか?Python、C、Rなどについて読んだほぼすべての書籍やプログラミングチュートリアルで、この問題に出くわしました。スペースを含む3つのキーストロークを節約できるので便利です。しかし、私がコードを読んでいるとき、彼らはいつも私をつまずかせるように見えます、そして少なくとも私の心には、それをそれ以上ではなく、読みにくくします。 これらが至る所で使用されている明確で明白な理由がありませんか?

19
関数から早く戻るか、ifステートメントを使用する必要がありますか?[閉まっている]
私はよくこの種の関数を両方の形式で記述しましたが、ある形式が別の形式よりも好まれるのか、そしてその理由は疑問でした。 public void SomeFunction(bool someCondition) { if (someCondition) { // Do Something } } または public void SomeFunction(bool someCondition) { if (!someCondition) return; // Do Something } それはコーディング中の私の脳の働きであるため、私は通常最初のものでコーディングしますが、エラー処理をすぐに処理し、読みやすいので2番目のものを好むと思います

30
優れたプログラマであるかどうかを知る方法はありますか?
ほとんどの人がそうであるように、私は自分の分野で自分が平均より少し上にいると考えています。私は良い報酬を得て、昇進を得ました、そして、私は良い参照を得るか、または仕事を得ることで本当の問題を経験したことがありません。 しかし、私が一緒に仕事をした最悪のプログラマーの多くは、彼らが最高のプログラマーだと思っていることに気付くのに十分な時間を過ごしました。他の悪いプログラマーに囲まれている悪いプログラマーは、最も自己欺lude的なようです。 私は確かに完璧ではありません。私は間違いを犯します。締め切りに間に合わない。しかし、私は「他の優秀なプログラマー」と同じくらいの数の骨頭の動きをしていると思います。問題は、「他の優秀なプログラマー」を「私のような人」と定義することです。 だから、プログラマが何らかの合理的な自己評価を行う方法はあるのだろうか?自分の仕事が上手か下手かをどうやって知るのですか? または、善と悪のような用語の定義があまりにも不明確な場合、プログラマーは自分の長所と短所を正直に特定し、前者を活用して後者の改善に取り組むにはどうすればよいでしょうか?
301 evaluation 

10
私はSubversionオタクです。Mercurial、Git、またはその他のDVCSを検討する必要があるのですか?
分散バージョン管理システム(DVCS)の利点を理解しようとしています。 Subversion Re-educationとMartin Fowlerによるこの記事は非常に有用であることがわかりました。 Mercurialおよびその他のDVCSは、変更セットとローカルコミットを使用してコードを処理する新しい方法を促進します。それは地獄と他のコラボレーションの問題をマージすることを防ぎます 私は継続的な統合を実践しているので、これに影響されることはありません。プライベートブランチで単独で作業することは、実験しない限りオプションではありません。メジャーバージョンごとにブランチを使用し、トランクからマージされたバグを修正します。 Mercurialを使用すると、副官を持つことができます これはLinuxのような非常に大規模なプロジェクトに役立つ可能性があることは理解していますが、小規模で高度に協力的なチーム(5〜7人)には価値がありません。 Mercurialはより高速で、ディスクスペースが少なくて済み、完全なローカルコピーにより、ログと差分の操作がより高速になります。 私が取り組んでいる非常に大規模なプロジェクトであっても、SVNの速度やスペースの問題に気づかなかったので、私もこれには関心がありません。 元SVNオタクからの個人的な経験や意見を求めています。特に、変更セットの概念と、測定した全体的なパフォーマンスの向上に関して。 更新(1月12日):今、試してみる価値があると確信しています。 更新(6月12日):Mercurialにキスし、気に入った。彼の桜の地元のコミットメントの味。試しにMercurialにキスしました。SVNサーバーがそれを気にしないことを願っています。それはとても間違っていた。とてもいい感じがしました。今夜恋しているわけじゃない。 最終更新(7月29日):Eric Controlの次の例であるVersion Control by Exampleをレビューする特権がありました。彼は私を納得させました。Mercurialに行きます。

20
SVNはGitよりも優れていますか?[閉まっている]
プログラマーツールをめぐる議論の大半は、個人的な選択(ユーザーによる)またはデザイン重視、つまり特定のユースケースに応じたデザインの最適化(ツールビルダーによる)に留まることは間違いありません。テキストエディターはおそらく最も有名な例です-職場ではWindowsで動作し、自宅ではMacでHaskellでコードを作成するコーダー、クロスプラットフォームおよびコンパイラー統合を重視するため、TextMateではなくEmacsを選択します。 新しく導入された技術が、現存するオプションよりも明らかに優れていることはあまりありません。 これは実際、バージョン管理システム(VCS)、特に集中型 VCS(CVSおよびSVN)対分散 VCS(GitおよびMercurial)の場合ですか? SVNを約5年間使用しましたが、現在、SVNは私が働いている場所で使用されています。3年弱前、すべての個人プロジェクトでGit(およびGitHub)に切り替えました。 Subversionに対するGitの多くの利点(および集中型VCS上の分散の利点の大部分を抽象化する)を考えることはできますが、1つの逆の例、つまり関連するタスクと通常のプログラマーで生じるいくつかのタスクを考えることはできませんワークフロー)そのSubversionはGitよりも優れています。 だけではないGitが優れていること、など-私はこのことから描いた結論は、私がどのようなデータを持っていないということです 私の推測では、そのような反例が存在するため、この質問です。

14
誰もがGitを集中的に使用するのはなぜですか?
私は過去2つの会社でGitをバージョン管理に使用しました。私が聞いたところでは、企業の約90%が他のバージョン管理システムよりもGitを使用しているようです。 Gitの最大のセールスポイントの1つは、Gitが分散化されていることです。つまり、すべてのリポジトリが同等です。中央リポジトリ/真実の源はありません。これはLinus Torvaldsが擁護した機能でした。 しかし、すべての企業がSVNやCVSを使用するのと同じように、Gitを集中的に使用しているようです。サーバー(通常はGitHub)には、常に中央リポジトリがあり、人々はそこからプルし、プッシュします。Gitを本来の目的である分散化された方法で使用している人、つまり他の同僚のリポジトリを適切に押したり引いたりしている人を見たことはありません(確かに限られた経験)。 私の質問は: Gitの分散ワークフローを実際に使用しないのはなぜですか? 分散した方法で機能する能力は、最新のバージョン管理にとっても重要ですか? 編集 私は元の質問で正しい口調に出会えなかったことに気付きました。分散バージョン管理システム(DVCS)が明らかに優れているのに、なぜ誰もが中央集権的に機能するのかと私が尋ねているように聞こえました。実際には、私が言いたいことは、DVCSには何のメリットもありません。しかし、実世界は私の見解に同意しているように見えますが、私はしばしば人々がその優位性を説くのを聞きます。

16
Grokking Java culture-なぜそんなに重いのですか?何のために最適化されますか?[閉まっている]
私はよくPythonでコーディングしていました。今、仕事上の理由で、私はJavaでコーディングしています。私がやるプロジェクトはかなり小さく、おそらくPythonのほうがうまくいくかもしれませんが、Javaを使用する正当な非エンジニアリングの理由があります(詳細は説明できません)。 Java構文は問題ありません。それは単なる別の言語です。しかし、構文とは別に、Javaには文化、一連の開発メソッド、および「正しい」と見なされるプラクティスがあります。そして今のところ、私はその文化を「グロック」することに完全に失敗しています。だから私は本当に正しい方向に説明やポインタをいただければ幸いです。 最小限の完全な例は、私が始めたStack Overflowの質問にあります:https : //stackoverflow.com/questions/43619566/returning-a-result-with-several-values-the-java-way/43620339 タスクがあります-(単一の文字列から)解析し、3つの値のセットを処理します。Pythonでは1行(タプル)、PascalまたはCでは5行のレコード/構造体です。 答えによると、構造体に相当するものはJava構文で利用可能であり、トリプルは広く使用されているApacheライブラリで利用可能です。しかし、それを行う「正しい」方法は、ゲッターとセッター。完全な例を提供してくれた人はとても親切でした。それは47行のコードでした(これらの行の一部は空白でした)。 巨大な開発コミュニティは「間違った」ものではないことを理解しています。これは私の理解の問題です。 Pythonのプラクティスは、読みやすさ(その哲学では保守性につながります)とその後の開発速度を最適化します。Cプラクティスは、リソース使用量に対して最適化されます。Javaプラクティスは何のために最適化されますか?私の最善の推測はスケーラビリティです(すべてが数百万のLOCプロジェクトに対応できる状態でなければなりません)が、それは非常に弱い推測です。

30
すべての企業が開発者に最高のハードウェアを購入しないのはなぜですか?
私は何かが欠けているに違いない。 私の地域でプログラマーを雇うコストは、1時間あたり50ドルから100ドルです。トップエンドのマシンはわずか3,000ドルなので、3年ごとに本当に優れたコンピューターを購入するコストは1時間あたり0.50ドルになります。($ 3000 /(150週間* 40時間)) あなたが行う必要があるトップエンドのマシンを?いいえ、ここでの3000ドルは、私が期待する金額ではなく、おそらく費やすことができる最大額を表しています。それは、おおむね、トップエンドのiMacまたはMacBook(17インチ)のコストです。 したがって、安価なコンピューターを購入することで3年ごとに2000ドルを節約でき、平均的な開発者が60ドルを稼いでいるとします。(これらは、私がBeanカウンターに提供できる最も慈善的な数字です。1000ドルまたは750ドルしか節約しない場合、それは私のケースを強化するだけです)。(一気にではありませんが、私のマシンはそれ以上のコストがかかると確信しています。)3年間で125時間の損失は合計で$ 7500の損失になります。1日1分間の損失(750ドル)は、1250ドルの純利益をもたらします。 これは「ペニーワイズでパウンドバカ」のケースですか、それとも質問を単純化しすぎていますか?ソフトウェア開発者が優れたハードウェアを使用する必要があるという普遍的な合意がないのはなぜですか(「エンタープライズ」でも)。 編集:私は私の友人がうらやましくなるような高速なパフォーマンスを叫びたいという願望やSSDについて話しているのではないことを明確にする必要があります。通常のワークロードを処理するにはRAMが少なすぎるマシンについて話しているため、フリーズ、リブート、通常の月曜日に約20分で典型的なアプリケーションを起動して開くことができます(誇張なし)。(週末以外はシャットダウンしません。) 私は実際にすぐに新しいマシンを手に入れる予定であり、それはいくらか物事を改善するでしょう。(ここでは2011年に2GBから3GBのRAMに移行します。)しかし、新しいマシンは現在の標準では平凡であるため、廃止日までに受け入れられなくなることも予想できます。 待つ!回答またはコメントする前に: 3000ドルは重要ではありません。必要なマシンのコストがそれよりも低い場合、それが購入されるべきであるより多くの理由です。 私は、より頻繁なアップグレードを求めていません。同じスケジュールでちょうど良いハードウェア。したがって、インストールなどの隠れたコストはありません。 最新のハードウェアと非常に優れたハードウェアの違いについては議論しないでください。最悪の場合、3年前に作られた最高のマシンの1つであるマシンのように、私は非常に優れたハードウェアを求めてロビー活動を行っています。 $ 50-$ 100 /時間は、人件費の見積もりであり、給与ではありません。あなたが請負業者として働いている場合、費用と利益を含む請負業者が使用する請求レート、雇用者社会課になります。寄付、雇用主、ヘルスケアの寄付など。この数字は、非現実的であることがわかっている場合を除き、コメントしないでください。 新しいコンテンツを提供していることを確認してください。別の回答を提供する前に、すべての回答を読んでください。

25
いつBIGが答えを書き直しますか?
Big Rewritesに関する質問を読んでください。私は自分で答えたいと思っていた質問を思い出しました。 Struts 1.0を使用して古いJavaで書かれた、恐ろしいプロジェクトがあります。テーブルは一貫性のないリレーションシップを持っているか、リレーションシップがまったくないか、プライマリキーまたはフィールドがプライマリキーであることを意図していますが、一意ではありません。どういうわけか、アプリのほとんどは「機能する」だけです。ほとんどのページは再利用(貼り付けられたコードのコピー)およびハードコーディングされています。プロジェクトに携わったことのある人は誰でも、何らかの形でそれを呪いました。 今では、この恐ろしいアプリケーションの全面的な書き換えを上級管理職に提案することを長い間考えていました。私は個人的な時間でゆっくりと試みていますが、それを実現するための専用のリソースが必要だと思います。大きな書き直しに関する記事を読んだ後、私は再考しています。そして、上司に私の書き換えをサポートするように説得したいとき、それは良くありません。(私はかなり小さな会社で働いているので、提案は承認される可能性があります) TL; DRいつ答えが大きく書き換えられ、それをサポートするためにどのような引数を使用できますか?

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