ソフトウェア工学

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

15
コンピュータープログラミングの技術-読むか読むか [閉まっている]
プログラミングに関する本はたくさんありますが、コードコンプリートはほとんどの人の「必読のプログラミング本」のリストの一番上にあるようですが、Donald KnuthによるThe Art of Computer Programmingはどうですか?私は忙しい人で、仕事と若い家族の間にはたくさんの自由時間がありません。そのため、私はそれをどのように使うかについて慎重でなければなりません。 私は不思議に思っています-ここで誰かが「TAOCP」を読んでいますか?もしそうなら、読む時間を作る価値がありますか、他の本やペットプロジェクトのようなより多くのサイドプログラミングやオープンソースへの貢献は、専門能力開発の観点から私の時間のより良い使用でしょうか? 免責事項-「Knuth is my homeboy」Tシャツを着ている人は、誤解しないでください-読みたいのですが、優先リストの一番上にあるべきなのか、他の何かが最初に来る必要がある場合。
63 books 

29
コンピューターサイエンスの学位がプロのプログラマーにとって重要なのはなぜですか?[閉まっている]
私はコンピューターサイエンスの学位を取得しています。ドアを開けて仕事を得るのに最適です。C#.NETプログラミング(この分野で最も人気のあるプラットフォームと言語であり、世界全体で最も人気のあるOSを引き継ぐ米国全体ではないにしても、私が仕事をしている分野)の専門分野で私を助ける限り、ほとんど役に立ちません。なぜあなたはそれがあなたのプロとしてのキャリアのプログラマーとして役立つと思いますか(一部のインタビュアーを感動させるためにプリムアルゴリズムへの噴出以外)。 今日の世界適応において、開発者は、素早い頭脳、強力なコミュニケーション、オブジェクト指向、および基本的な設計スキルにより、顧客が受け入れるソフトウェアを作成できます。これらのスキルは、csプログラムでのみ使用されます。私の考えでは、Wroxによる500ページのC#本を読むと、4年間のcomp sci math blasterコースよりもはるかに使いやすいスキルセットが得られます。多くは同意しません。それでは、なぜコンピューターサイエンスの学位が重要なのでしょうか?

19
ひどい見積もりに対処する
私が取り組んだ最近のプロジェクトは、建築家によってひどく過小評価されていることが証明されました。推定値は少なくとも500%外れていました。 残念ながら、見積もりが顧客とサインオフされた後、私はプロジェクトに参加しました。シニア開発者として、私はすぐに機能および技術仕様に気付きました。いくつかの大きなギャップと不確実性が含まれていました。 その結果、私はビジネスおよび技術ディレクターと緊急事態会議を呼び出して彼らに現実を知らせることを強いられたと感じました。何よりもまず、開発者として、私はこれが非常にストレスの多い困難な状況であることに気付きました。「ビジネス」は、ITが無能であり、メッセンジャーであると非難し、私はいくつかの「弾丸」を受け取りました。 顧客はアカウントをキャンセルすると脅しましたが、現在までプロジェクトは未完成であり、私はそれとは直接関係していません。 建築家は社会的にはナイスガイでしたが、このエピソードに基づいて、単に無能であるか、彼の推定に影響を与える大きな販売/ビジネスのプレッシャーがありました。 それでは、プログラマーとして、この種の状況についてのあなたの経験はどのようなもので、どのように対処することを勧めますか?

30
有名大学に行く必要がありますか?[閉まっている]
アメリカで間もなく卒業する高校の先輩として、私は数ヶ月のうちに厳しい決断に直面するでしょう。どの大学に行くべきですか?コーネル、スタンフォード、またはカーネギーメロン(もちろん私が入学すると仮定)に行って、巨額の借金を引き受けながら、有名なコンピューターサイエンスの学位、インターンシップ、教授とのつながりを得る価値があるでしょうか。または、ニューヨークのおそらく最高の州立大学であるビンガムトンに行って、数千ドル以上の借金から自分を救いながら、かなりまともな教育を受けたほうがいいのでしょうか。はい、私は以前にこのような質問がされたことを知っています(つまり、こことここ)が、特定の状況に合った答えが見つからないので、我慢してください。 上記の2つのリンクされた質問を詳しく読みましたが、知りたいことには答えていません。 はい、有名な大学に行くことで、この分野の素晴らしい教授やリーダーとつながる可能性があることを理解していますが、平均して、それは経済的にどのように翻訳されますか?つまり、良好な接続は、10億ドル以上の借金を簡単に取り除くことができるほどうまくいくのでしょうか。 そして、カーネギーメロンで5年の修士号を取得できるという事実は、方程式にどのように関係していますか?すぐに高い学位を取得することで、大学を卒業したばかりで給料の良い仕事に就くことができますか?同等の学位を取得するために大学院に行く必要がないことは、もちろん、大きな財政的救済になりますが、それを早めに取得することで、より大きな価値を与えるでしょうか? そして、私が考えていたものよりもあまり知られていないSUNY Binghamtonに行くと(経験を共有したい卒業生がいるなら、私はそれを大いに感謝します)、私はドアを閉めるでしょう短期的な経済的利益を長期的な利益で相殺できる可能性がありますか?基本的に、短期的な利益は潜在的な長期的な損失によって圧倒されますか? これらの質問への答えはすべて私の最終的な大学の決定につながります(再び、私はこれらの学校に行くことを許可します)ので、分野の熟練した知識のある人々に尋ねることが正しい選択をするのに役立つことを願っています(そのようなことがあれば事)。 また、注意してください:私はかなり奇妙な状況にあり、たくさんのローンを出さずに大学にお金を払うことはできませんが、財政援助(おそらく連邦政府またはその他)をほとんどまたはまったく受け取らないでしょう。私はこれについて詳しく説明したくありません(そのため、額面どおりに考えてください)が、これが主に質問をする理由です。 どうもありがとう!私にとっては大きな出来事です。 編集:すばらしい回答をありがとうございました!考え抜かれ、よく書かれているので、それらすべてについてコメントを書く時間があればいいのに。うまくいけば、学校から帰宅して今夜遅くに仕事ができるようになります... 編集2: すごい!こんなに短い時間でこんなにも多くの有益な反応を得たことに信じられないほどです!これらの多くに適切に座って対応する時間はありませんでしたが、努力に感謝します。明日もそうします。投稿したすべての人に感謝します! 編集3: 興味のある人のために、私はCMU、コーネル、ビンガムトンに入り、ビンガムトンに決めました。CMUとコーネルは私に財政援助を一切与えませんでしたが、州立学校であるビンガムトンは部屋と食事を含めて年間20,000ドル以下でした。私が入学許可書を受け取ったとき、決定は困難でしたが、ビンガムトンを訪問し、それが学校の素晴らしさを実感した後(米国の州立学校はひどく過小評価されています。それはひどい問題です。ビンガムトンは、私が応募した多くの私立学校よりもさらに選択的であり、本質的に多くを意味するのではなく、単なる指標として)、私は見逃すことができませんでした。その上、私はひどい雨の日に訪れましたが、それでも感銘を受けました。;) 実際の財務分析を行ったところ、CMUやコーネルに必要な年間60,000ドルを返済することはできず、ビンガムトンの選択がさらに快適になったことがわかりました。 この質問は私の場合に固有のものですが、これが私の立場にいる他の誰かに役立つことを願っています。 編集4:最近、同様の立場にある学生がこの質問に出くわしていることに気づきました。短い更新をしたいと思いました。私はここビンガムトンで信じられないほど幸せであり、もし私が再び大学のプロセスを経なければならなかったら、私は他の学校を選ばなかっただろう。ほとんどの学生はどこに行っても幸せになる傾向があると思いますが、私にとってビンガムトンは素晴らしい経験でした。 生徒に伝えたいのは、名前と評判に注意を払わずに学校を判断するのは難しいことです。カーネギーメロンはコンピューターサイエンスを勉強する上で悪い学校だとは思われませんが、学校を無視しないでください。あなたはそれらを聞いたことがありません!実用的な選択をすることを恐れないでください。私はビンガムトンが世界的に有名な大学ではないことを知っていますが、私が見たものから、私たちのカリキュラムはより厳格であり、私が聞いた多くのトップスクールよりも優れた基礎を築きます。私たちは、学生のインターンシップ、仕事、研究の機会を得ることに多くの焦点を当てており、マイクロソフト、ブルームバーグ、IBM、ロッキード・マーティンなどの企業と非常に強いつながりを持っています。私達'学校-私たちは有名ではないかもしれませんが、ここに来れば、あなたはあなたのキャリアのための優れた基盤を手に入れ、ほぼ確実にインターンシップや仕事を得るでしょう。プラス、私たちは学生がうまく彼らの教授を知ってもらうことができることを十分に小さくしている私たちは、彼らが研究を行うに興味があるなら、確かに役立ちます、(私は彼らの教授とファーストネームの基礎となっているいくつかの友人の持っている)たくさんのをビンガムトンで。 私がビンガムトンを選んだとき、私はこれを知りませんでした、そしてそれはあなたがそこに行けばあなたが学校について学ぶことができるそれらの1つです-このような詳細はパンフレットや雑誌で強調されず、経験。ですから、私が言いたいのは、聞いたことがあるかどうかだけで学校を選ぶのではなく、州立学校を検討することです。ビンガムトンのようなより良いものは、非常に良い選択です。 もちろん、やる気があり、スキルがあり、一生懸命働いている場合、そして成功するために自分自身をプッシュする場合、どこにいても気づくので、どこに行くかは重要ではありません。私はインターンシップと仕事の機会でとても幸運になりました。私の経験は間違いなくひどいものでした。
63 education 

4
矢印の目的は何ですか?
私はHaskellを使って関数型プログラミングを学んでいますが、なぜそれらが必要なのかを最初に理解して概念をつかもうとしています。 関数型プログラミング言語における矢印の目標を知りたいです。彼らはどのような問題を解決しますか?http://en.wikibooks.org/wiki/Haskell/Understanding_arrowsおよびhttp://www.cse.chalmers.se/~rjmh/afp-arrows.pdfを確認しました。私が理解しているのは、それらが計算用のグラフを記述するために使用され、より簡単なポイントフリースタイルのコーディングを可能にすることです。 この記事では、一般に、ポイントフリースタイルの方が理解しやすく、書きやすいと想定しています。これは非常に主観的なようです。別の記事(http://en.wikibooks.org/wiki/Haskell/StephensArrowTutorial#Hangman:_Main_program)では、絞首刑執行人のゲームが実装されていますが、この実装が矢印によってどのように自然になるかはわかりません。 コンセプトを説明する論文はたくさんありましたが、その動機については何も見つかりませんでした。 私は何が欠けていますか?

10
プライベート関数/メソッドが多すぎるようなものはありますか?
よく文書化されたコードの重要性を理解しています。しかし、自己文書化コードの重要性も理解しています。特定の機能を視覚的に読みやすくするほど、ソフトウェアのメンテナンス中にすばやく移動できます。 とはいえ、私は大きな機能を他の小さな機能に分離するのが好きです。しかし、1つのパブリックメソッドを提供するためだけに、クラスが5つまで持つことができるようになります。ここで、5つのプライベートメソッドに5つのパブリックメソッドを掛けると、それらのパブリックメソッドによって1回だけ呼び出される可能性のある、25の隠しメソッドを取得できます。 確かに、これらのパブリックメソッドは読みやすくなりましたが、機能が多すぎるのは悪い習慣だと思わざるを得ません。 [編集] 人々は、なぜ機能が多すぎるのが悪い習慣だと思うのかと私に尋ねてきました。 簡単な答え:それは直感です。 私の信念は、少しの間、ソフトウェアエンジニアリングの経験に支えられていません。「ライターのブロック」を与えたのは、プログラマーにとってだけの不確実性です。 過去には、私は個人的なプロジェクトのみをプログラミングしてきました。チームベースのプロジェクトに移ったのはつい最近のことです。ここで、他の人がコードを読んで理解できるようにします。 何が読みやすさを改善するのか分かりませんでした。一方では、1つの大きな関数を、わかりやすい名前を持つ他の小さな関数に分離することを考えていました。しかし、それは単に冗長であると言っている私の側面がありました。 それで、正しい道を選ぶために自分自身を啓発するように私はこれを求めています。 [編集] 以下は、私がどのように2つのバージョンが含ま可能性が私の問題を解決します。最初のものは、コードの大きな塊を分離しないことでそれを解決します。2番目は別のことを行います。 最初のバージョン: public static int Main() { // Displays the menu. Console.WriteLine("Pick your option"); Console.Writeline("[1] Input and display a polynomial"); Console.WriteLine("[2] Add two polynomials"); Console.WriteLine("[3] Subtract two polynomials"); Console.WriteLine("[4] Differentiate two polynomials"); Console.WriteLine("[0] Quit"); } 2番目のバージョン: public static int …

19
コンパイラはどうしてそんなに信頼できるのでしょうか?
コンパイラは、その正確性が与えられているかのように日常的に使用しますが、コンパイラもプログラムであり、潜在的にバグを含む可能性があります。私はいつもこの絶対的な堅牢性について疑問に思っていました。コンパイラ自体のバグに遭遇したことはありますか?コンパイラ自体に問題があることをどのように認識しましたか? ...そして、どのようにしてコンパイラを非常に信頼できるものにしますか?


4
スレッドプールとは何ですか?
スレッドプールをどのように実装しますか?私はウィキペディアで「スレッドプール」について読んでいますが、この質問を解決するためにどうすればよいかわかりません(スレッドプールが単純な用語で何であるかよくわからなかったため)。 スレッドプールとは何か、そしてこの質問にどのように答えるのか、誰かが私に簡単な英語で説明できますか?

11
プログラムを複数のクラスに分割するのが良いのはなぜですか?[閉まっている]
私はまだ高校生(10年生)で、学校で実際のコンピューターコースをまだ受講していません。これまでにやったことはすべて本を通してです。これらの本は、継承などの概念を教えてくれましたが、プログラムを複数のクラスに分割するとどのように役立ちますか?本は私に決して言わなかった。 主に最近のプロジェクトのためにこれを求めています。これはアーケードビデオゲームで、一部の人が言っているようにFlashゲームのようなものです(Flashゲームとは何なのかはわかりませんが)。事は、それはただ一つのクラスです。1つのクラスで完全に正常に動作します(ただし、時折ラグが発生します)。だから、私はそれを複数のクラスに分割することがどのように役立つかを尋ねています。 このプロジェクトはJavaで行われ、記録のために私がプロジェクトに取り組んでいるのは私だけです。

7
テスト容易性を設計する際に静的ユーティリティクラスを処理する方法
TDDを使用して開発されたほとんどの部分で、テスト可能なシステムを設計しようとしています。現在、次の問題を解決しようとしています。 さまざまな場所で、ImageIOやURLEncoder(標準Java APIの両方)などの静的ヘルパーメソッド、および大部分が静的メソッド(Apache Commonsライブラリなど)で構成されるその他のさまざまなライブラリを使用する必要があります。しかし、このような静的ヘルパークラスを使用するメソッドをテストすることは非常に困難です。 この問題を解決するためのアイデアがいくつかあります。 静的クラス(PowerMockなど)をモックできるモックフレームワークを使用します。これは最も簡単な解決策かもしれませんが、どういうわけかあきらめたように感じます。 これらのすべての静的ユーティリティの周りにインスタンス化可能なラッパークラスを作成して、それらを使用するクラスに注入できるようにします。これは比較的クリーンなソリューションのように聞こえますが、これらのラッパークラスを大量に作成することになると思います。 これらの静的ヘルパークラスへのすべての呼び出しをオーバーライド可能な関数に抽出し、実際にテストするクラスのサブクラスをテストします。 しかし、TDDを行う際に多くの人が直面しなければならない問題であるに違いないと私は考え続けます。したがって、この問題の解決策はすでに存在しているはずです。 これらの静的ヘルパーを使用するクラスをテスト可能に保つための最良の戦略は何ですか?

16
例外をサポートしない言語でゼロ除算を処理する方法は?
私は、いくつかのビジネス要件を解決するために新しいプログラミング言語を開発していますが、この言語は初心者ユーザーを対象としています。そのため、言語には例外処理のサポートがなく、追加しても例外を使用するとは思われません。 私は除算演算子を実装しなければならないポイントに達しましたが、ゼロ除算エラーを最適に処理する方法を疑問に思っていますか? このケースを処理する方法は3つしかありません。 エラーを無視し0て、結果として生成します。可能であれば警告を記録します。 NaN数値の可能な値として追加しNaNますが、言語の他の領域の値を処理する方法についての質問が発生します。 プログラムの実行を終了し、重大なエラーが発生したことをユーザーに報告します。 オプション#1が唯一の妥当な解決策のようです。オプション#3は、この言語を使用してロジックを夜間のcronとして実行するため、実用的ではありません。 ゼロ除算エラーを処理するための私の代替手段は何ですか?また、オプション#1を使用する場合のリスクは何ですか?

7
単体テストの代わりに受け入れテストと統合テストを使用するだけで十分ですか?
この質問の簡単な紹介。私は現在TDDと最近BDDを1年以上使用しています。私は、モックなどの手法を使用して、テストをより効率的に記述します。最近、私は自分のために小さなお金管理プログラムを書くための個人的なプロジェクトを始めました。レガシーコードがなかったため、TDDから始めるのに最適なプロジェクトでした。残念ながら、TDDの喜びはあまり経験しませんでした。それは私の楽しみを台無しにし、プロジェクトをあきらめました。 なにが問題だったの?さて、TDDのようなアプローチを使用して、テスト/要件がプログラムの設計を進化させました。問題は、テストの作成/リファクタリングに関して、開発時間の半分以上がかかっていたことです。したがって、リファクタリングして多くのテストに書き込む必要があるため、最終的にはこれ以上機能を実装したくありませんでした。 職場では、レガシーコードがたくさんあります。ここでは、統合テストと受け入れテストを増やし、単体テストを減らしていきます。ほとんどのバグは受け入れテストと統合テストによって検出されるため、これは悪いアプローチではないようです。 私の考えは、最終的には単体テストよりも多くの統合テストと受け入れテストを書くことができるということでした。バグを検出するために言ったように、単体テストは統合/受け入れテストよりも優れていません。単体テストも設計に適しています。私はそれらの多くを書いていたので、私のクラスは常にテストしやすいように設計されています。さらに、テスト/要件が設計をガイドできるようにするアプローチは、ほとんどの場合、より良い設計につながります。単体テストの最後の利点は、高速であることです。ユニットテストとほぼ同じ速度で実行できることを知るために、十分な統合テストを作成しました。 ウェブを調べた後、私の考えによく似たアイデアがあちこちであることがわかりました。この考えをどう思いますか? 編集 質問には、デザインは良かったが、次の要件のために大規模なリファクタリングが必要な例の1つに答えました。 最初は、特定のコマンドを実行するためのいくつかの要件がありました。拡張可能なコマンドパーサーを作成しました。これは、ある種のコマンドプロンプトからコマンドを解析し、モデル上で正しいものを呼び出しました。結果は、ビューモデルクラスで表されました。 ここには何も問題はありませんでした。すべてのクラスは互いに独立しており、新しいコマンドを簡単に追加し、新しいデータを表示できました。 次の要件は、すべてのコマンドに独自のビュー表現(コマンドの結果の何らかのプレビュー)が必要であることです。新しい要件に対してより良い設計を実現するために、プログラムを再設計しました。 これは、すべてのコマンドに独自のビューモデルがあり、したがって独自のプレビューがあるためです。 問題は、コマンドパーサーがコマンドのトークンベースの解析を使用するように変更され、コマンドを実行する機能が削除されたことです。すべてのコマンドには独自のビューモデルがあり、データビューモデルは、表示する必要があるデータを知っている現在のコマンドビューモデルのみを知っています。 この時点で私が知りたかったのは、新しいデザインが既存の要件を満たさなかった場合のみです。受け入れテストを変更する必要はありませんでした。ほぼすべての単体テストをリファクタリングまたは削除する必要がありましたが、これは膨大な作業の山でした。 ここで見せたかったのは、開発中によく発生する一般的な状況です。古いデザインでも新しいデザインでも問題はありませんでした。要件に応じて自然に変更されただけでした。私がどう理解したか、これはTDDの利点の1つであり、デザインが進化します。 結論 すべての答えと議論をありがとう。この議論の要約として、次のプロジェクトでテストするアプローチを考えました。 まず、いつものように何かを実装する前に、すべてのテストを作成します。 要件については、最初にプログラム全体をテストする受け入れテストをいくつか作成します。次に、要件を実装する必要があるコンポーネントの統合テストをいくつか作成します。この要件を実装するために別のコンポーネントと密接に連携するコンポーネントがある場合、両方のコンポーネントが一緒にテストされる統合テストも作成します。最後になりましたが、アルゴリズムまたは他のクラスを高い順列(シリアライザーなど)で記述する必要がある場合は、この特定のクラスの単体テストを記述します。他のすべてのクラスはテストされませんが、単体テストが行​​われます。 バグについては、プロセスを簡素化できます。通常、バグは1つまたは2つのコンポーネントによって引き起こされます。この場合、バグをテストするコンポーネントの統合テストを1つ作成します。アルゴリズムに関連する場合は、ユニットテストのみを記述します。バグが発生したコンポーネントを簡単に検出できない場合、受け入れテストを作成してバグを特定します。これは例外です。

15
クライアント側のJavascriptからデータベースに直接移動しない理由はありますか?
重複の可能性: Web「サーバーレス」アプリケーションの作成 そこで、Stack Exchangeクローンを構築し、CouchDBのようなものをバックエンドストアとして使用することにしたとしましょう。組み込みの認証とデータベースレベルの承認を使用する場合、クライアント側のJavaScriptが公開されているCouchDBサーバーに直接書き込むことを許可しない理由はありますか?これは基本的にCRUDアプリケーションであり、ビジネスロジックは「投稿者のみが投稿を編集できる」で構成されているため、クライアント側のものとデータベースの間にレイヤーを配置する必要はほとんどありません。CouchDB側で検証を使用して、誰かがガベージデータを入れていないことを確認し、ユーザーが自分の_userデータしか読み取れないようにアクセス許可が適切に設定されていることを確認します。レンダリングは、AngularJSのようなものによってクライアント側で行われます。本質的には、CouchDBサーバーと多数の「静的」ページを用意するだけで十分です。サーバー側の処理は一切必要なく、HTMLページを提供できるものだけが必要です。 データベースを世界中に公開するのは間違っているように見えますが、このシナリオでは、アクセス許可が適切に設定されている限り、その理由を考えることはできません。Web開発者としての私の本能に反しますが、正当な理由は考えられません。それで、なぜこれは悪い考えですか? 編集:同様の議論がここにあるように見えます:Web「サーバーレス」アプリケーションの作成 編集:これまでのところ素晴らしい議論、そして私は皆のフィードバックに感謝します!CouchDBとAngularJSを具体的に呼び出す代わりに、いくつかの一般的な仮定を追加する必要があるように感じます。だからそれを仮定しましょう: データベースは、非表示のストアからユーザーを直接認証できます。 すべてのデータベース通信はSSL経由で行われます データ検証をすることができます(多分?べきではありません)データベースによって処理され 管理機能以外に私たちが気にする唯一の承認は、自分の投稿の編集のみが許可されている人 誰でもすべてのデータを読み取ることができます(パスワードハッシュを含む可能性があるユーザーレコードを除く) 管理機能は、データベース認証によって制限されます 誰も管理者ロールに自分を追加できません データベースは比較的簡単に拡張できます 真のビジネスロジックはほとんどありません。これは基本的なCRUDアプリです

3
プライベートメンバーをヘッダーに配置する必要があるのはなぜですか?
プライベート変数は、クラスのユーザーに複雑さと実装の詳細を隠す方法です。これはかなり良い機能です。しかし、なぜc ++ではクラスのヘッダーに入れる必要があるのか​​理解できません。これには2つの厄介な欠点があります。 ユーザーからのヘッダーを乱雑にします 内部が変更されるたびに、すべてのクライアントライブラリの再コンパイルを強制します この要件の背後に概念的な理由はありますか?コンパイラの作業を簡単にするだけですか?
62 c++  headers 

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