ソフトウェア工学

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

1
Webアプリケーションのプログラマは、サイトを公開する前にどのような技術的詳細を考慮する必要がありますか?
サイトを公開する前に、Webアプリケーションの技術的な詳細を実装するプログラマーはどのようなことを考慮する必要がありますか?場合ジェフアトウッドは忘れることができHttpOnlyのクッキー、サイトマップ、および クロスサイトリクエストフォージェリ 同じサイト内のすべてを、私は同様に重要な何の事を忘れてされるだろうか? 他の誰かがサイトの実際のデザインとコンテンツを作成しているような、Web開発者の観点からこれについて考えています。したがって、ユーザビリティとコンテンツはプラットフォームよりも重要かもしれませんが、プログラマーはそのことについてほとんど語りません。心配する必要があるのは、プラットフォームの実装が安定しており、パフォーマンスが高く、安全であり、他のビジネス目標を満たしていることです(コストがかかりすぎず、構築に時間がかかりすぎ、Googleと同様にランク付けされるなど)コンテンツサポート)。 これは、かなり信頼できる環境でイントラネットタイプのアプリケーションの作業を行った開発者の観点から考えてみてください。そして、彼の最初のショットを持ち、大きな悪いワールドワイドウェブ全体で人気のあるサイトを公開しようとしています。 また、あいまいな「Web標準」の応答よりも具体的なものを探しています。特に、あなたがプロのWeb開発者であることを既に指定している場合は、HTML、JavaScript、およびCSS over HTTPがほとんど与えられます。それを超えて、どの標準ですか?どのような状況で、なぜですか? 標準の仕様へのリンクを提供します。

11
一意性と速度に最適なハッシュアルゴリズムはどれですか?
一意性と速度に最適なハッシュアルゴリズムはどれですか?例(良い)にはハッシュ辞書が含まれます。 私はSHA-256などのようなものがあることを知っていますが、これらのアルゴリズムは安全であるように設計されています。これは通常、一意性の低いアルゴリズムよりも遅いことを意味します。衝突を避けるために、高速でありながらかなりユニークなハッシュアルゴリズムを設計したいと考えています。
1388 algorithms  hashing 

9
「ワンリターンのみ」という概念はどこから来たのですか?
「同じメソッドに複数のreturnステートメントを入れないでください」と言うプログラマーとよく話します。理由を教えてもらうと、「コーディング標準がそう言っている」または「わかりにくい」だけです。単一のreturnステートメントでソリューションを表示すると、コードが見苦しくなります。例えば: if (condition) return 42; else return 97; 「これは見苦しいです。ローカル変数を使用する必要があります!」 int result; if (condition) result = 42; else result = 97; return result; この50%のコードの肥大化により、プログラムが理解しやすくなりますか?個人的には、簡単に防ぐことができた別の変数によって状態空間が増加したため、私はそれが難しいと感じています。 もちろん、通常は次のように書きます。 return (condition) ? 42 : 97; しかし、多くのプログラマーは条件演算子を避け、長い形式を好みます。 この「一回限りの帰り」という概念はどこから来たのでしょうか?このコンベンションが生まれた歴史的な理由はありますか?

30
コンピューターサイエンスの学位を取得していますが、プログラミングの方法がわからないと感じています
私はコンピューターサイエンスの学位を取得していますが、Stack OverflowのようなWebサイトやGoogleのような検索エンジンを見て、そのようなものをどこから書き始めてもわからないのです。ある夏、私はiPhone開発者として働く機会がありましたが、ボンネットの下で起こっているメカニズムをほとんど理解せずに、他の人が書いたライブラリをほとんど接着しているように感じました。 アルゴリズムを研究することで知識を向上させようとしていますが、それは長くて苦しいプロセスです。私はアルゴリズムが難しいと感じており、この本の内容を習得するまでに10年が経過するのを学んでいます。私の現在の状況を考えると、私は仕事を探すために1ヶ月を費やしましたが、私のスキル(C、Python、Objective-C)は比較的浅く、C#、Java、およびWeb開発がはるかに高いローカル市場ではあまり望ましくありません需要がある。それはCとPythonの機会が存在しないと言っているわけではありませんが、彼らは私が持っていない3年以上の経験を要求する傾向があります。私のGPAは問題ありません(3.0)が、IBMのような大企業に適用したり、大学院に戻ったりするには十分ではありません。 基本的にはコンピューターサイエンスの学位を取得していますが、プログラミングの方法を学んだとは感じません。会社に入社してフルタイムでプログラミングすることで、自分のスキルを磨き、自分よりも経験豊富な人たちから学ぶ機会が得られると思いましたが、仕事を見つけるのに苦労しており、本当にイライラし始めています。 私は自分のネットをより広くキャストし、自分が育った都市の向こう側を見るつもりですが、同様の状況の他の人たちは何をしようとしましたか?私は一生懸命働いてきましたが、自分で出かけて自分のアプリを書く自信がありません。(つまり、iPhoneアプリ市場でインディー開発者になります。)何も起こらなければ、より人気のあるスキルのアップグレードと学習を検討するか、ITのようなわずかに関連する何かを試してみる必要がありますが、切り取るようなものです。
1050 education 

30
プログラミングスキルを向上させるために行った最も効果的なことは何ですか?
プログラマーとしてのキャリアと人生を振り返ると、プログラミングスキルを向上させるさまざまな方法がありました。コードを読む、コードを書く、本を読む、ポッドキャストを聴く、スクリーンキャストを見るなどです。 私の質問は、あなたがプログラミングスキルを向上させた最も効果的なことは何ですか?改善したい他の人に何をお勧めしますか? 私はここでさまざまな答えを期待しており、「1つのサイズですべてに適合する」答えはありません。

28
私の上司は、すべてのバグレポートに「責任者」フィールドを追加することにしました。どうすれば悪い考えだと彼に納得させることができますか?
最新の「WTF」の動きの1つで、上司はバグ追跡テンプレートに「Person To Blame」フィールドを追加すると、説明責任が増えると判断しました(ただし、機能/ストーリーにバグを結び付ける方法は既にあります)。これは士気を下げ、指さしを高め、バグが前代未聞になったとして報告された機能の欠落/誤解を説明しないだろうという私の主張。 私が使用できるこの実践に対する他の強力な議論は何ですか?このトピックについて、チームやボスと共有できる文章はありますか?

17
見積もりを求められた場合の対応方法
プログラマとして、私たちは常に「どれくらいかかるか」と尋ねられていますか? そして、ご存知のように、状況はほとんど常に次のようなものです。 要件は不明です。すべての影響を詳細に分析した人はいません。 この新機能はおそらく、コード内で行ったいくつかの仮定を破り、リファクタリングする必要のあるすべてのことをすぐに考え始めるでしょう。 過去の課題から他にやることがあり、その他の作業を考慮に入れた見積もりを考え出す必要があります。 「完了」の定義はおそらく不明です。いつ実行されるのでしょうか。コーディングを終えたときのように「完了」、または「ユーザーが使用中」のように「完了」 あなたがこれらすべてのことをどれほど意識していても、「プログラマーのプライド」によって、本来考えていたよりも短い時間が与えられたり受け入れられたりすることがあります。締め切りと経営陣の期待のプレッシャーを感じるときは特に。 これらの多くは、組織的または文化的な問題であり、単純で簡単に解決することはできませんが、実際には、見積もりを求められており、合理的な答えを期待しています。それはあなたの仕事の一部です。単純に言うことはできません:私は知りません。 その結果、私はいつも私が後で達成できないことに気づくと見積もりを出すことになります。それは何度も起こりました、そして、私はいつもそれが再び起こらないことを常に約束します。しかし、そうです。 見積もりを決定して配信するためのあなたの個人的なプロセスは何ですか?どんなテクニックが便利だと思いましたか?


1
「utf8 = true」よりも「utf8 =✓」の使用の方が望ましいですか?
最近、クエリパラメータ「utf8 =✓」を含むURIをいくつか見ました。私の最初の印象(「うーん、かっこいい」と思った後)は、これを使用して壊れた文字エンコードを検出できるということでした。 それで、これは文字エンコーディングの潜在的な問題を解決するより良い方法ですか、それとも単にハックを楽しんでいる開発者ですか?

13
それで、シングルトンは悪いのでしょうか?
最近、シングルトンの使用(および過剰使用)に関する問題について多くの議論がありました。私も私のキャリアの早い段階でそれらの人々の一人でした。現在、問題が何であるかを見ることができますが、良い選択肢を見つけることができない場合がまだ多くあります。反シングルトンの議論の多くは実際にそれを提供しません。 ここに私が関わった最近の主要なプロジェクトの実例があります: アプリケーションは、頻繁に更新されないサーバー状態からの大量のデータを使用する多くの個別の画面とコンポーネントを持つシッククライアントでした。このデータは基本的にシングルトンの「マネージャー」オブジェクト、つまり恐ろしい「グローバル状態」にキャッシュされていました。データの保存と同期を維持するアプリ内のこの場所を1つにして、サーバーからさまざまなサポートデータを繰り返し要求することなく、開いた新しい画面で必要なもののほとんどを照会できるようにするというアイデアでした。サーバーへの絶え間ないリクエストは帯域幅を使いすぎます-そして私は週に数千ドルの追加のインターネット請求書を話しているので、それは受け入れられませんでした。 基本的にこの種のグローバルデータマネージャーキャッシュオブジェクトを持つ以外に、ここで適切と思われる他のアプローチはありますか?もちろん、このオブジェクトは「シングルトン」である必要はありませんが、概念的には「シングルトン」であることが理にかなっています。ここできれいな代替品は何ですか?

2
Mars Curiosity Roverのソフトウェアは何に組み込まれていますか?
火星好奇心の探査車が正常に上陸した、とプロモーションビデオ「恐怖の7分」の一つは、コード50万行あることについてが自慢します。それは複雑な問題であり、間違いありません。しかし、それは多くのコードであり、確かにその背後にはかなり大きなプログラミング努力がありました。このプロジェクトについて誰か知っていますか?ある種の埋め込みCであるとしか想像できません。

6
FacebookのReactとWebコンポーネント(ポリマー)の長所と短所
今後のWebコンポーネント仕様に対するFacebookのReactの主な利点は何ですか(逆もまた同様です)(または、リンゴ同士の比較はGoogleのPolymerライブラリとなるでしょう)。 このJSConf EUトークとReactホームページによると、Reactの主な利点は次のとおりです。 コンポーネントモデルを使用したデカップリングと凝集度の向上 抽象化、構成、表現力 仮想DOMと合成イベント(基本的に、DOMとそのイベントシステムを完全に再実装したことを意味します) IE 8で最新のHTML5イベントを有効にします サーバー側のレンダリング テスタビリティ SVG、VML、およびへのバインド <canvas> この仮想DOMの概念(明らかに)を除き、ほとんどすべてのことはWebコンポーネントを介してネイティブにブラウザーに統合されています。仮想DOMと合成イベントが古いブラウザをサポートするために今日どのように有益であるかを見ることができますが、ネイティブブラウザのコードの大部分を捨てて、長期的に足を踏み入れるようなものではありませんか?最新のブラウザに関する限り、それはホイールの不必要なオーバーヘッド/再発明の多くではありませんか? ここに、Webコンポーネントが面倒を見てくれるReactが欠けていると思うものをいくつか紹介します。私が間違っている場合は修正してください。 ネイティブブラウザサポート(「より高速であることが保証されている」を参照) スクリプト言語でスクリプトを記述し、スタイル言語でスタイルを記述し、マークアップ言語でマークアップを記述します。 Shadow DOMを使用したスタイルのカプセル化 代わりにReactにはこれがあり、JavaScriptでCSSを記述する必要があります。可愛くない。 双方向バインディング
521 javascript  html 

30
IT業界では、他の業界と同様に、大規模で障害のないプロジェクトを迅速に提供できないのはなぜですか?
National GeographicのMegaStructuresシリーズを見て、大規模なプロジェクトがどれほど高速に完了するかを知りました。準備作業(設計、仕様など)が紙の上で行われると、巨大なプロジェクトの実現自体はわずか数年、時には数ヶ月かかります。 たとえば、エアバスA380は 「2000年12月19日に正式に打ち上げられました」、「2005年3月上旬に」、航空機はすでにテストされています。同じことは、巨大な石油タンカー、高層ビルなどにも当てはまります。 これをソフトウェア業界の遅れと比較すると、ほとんどのITプロジェクトがなぜこんなに遅いのか、より正確には、なぜ同じ規模で同じ規模で、十分な人数の人がいるほど速くて障害がないのか疑問に思わずにはいられません。 エアバスA380などのプロジェクトは、両方を提示します。 予期せぬ主なリスク:これは最初に製造された航空機ではありませんが、技術の限界を押し広げており、小さな旅客機でうまく機能したものは、物理的な制約のために大きな旅客機では機能しません。同様に、たとえばボーイング747が完成した1969年には利用できなかったため、まだ使用されていない新しい技術が使用されています。 一般的な人的資源と管理に関連するリスク:プロジェクトの途中で辞める人々、休暇中に人に連絡することができない、通常の人為的ミスなど これらのリスクにより、人々はまだこれらの大型旅客機のようなプロジェクトを非常に短い期間で達成しており、配達の遅延にもかかわらず、それらのプロジェクトは依然として非常に成功しており、高品質です。 ソフトウェア開発に関しては、プロジェクトは旅客機ほど大きく複雑ではなく(技術的にも管理の面でも)、現実世界からの予期しないリスクがわずかに少なくなっています。 それでも、ほとんどのITプロジェクトは遅くて遅く、プロジェクトにさらに開発者を追加することは解決策ではありません(10人の開発者から2000人のチームに行くと、プロジェクトをより速く提供できる場合があります。計画し、それをまったく完了しないリスクを高めます)。 まだ配信されているものには多くのバグが含まれていることが多く、連続したサービスパックと定期的な更新が必要です(元の製品のバグにパッチを当てて航空機がcrash落するのを防ぐために、週に2回すべてのAirbus A380に「更新プログラムをインストール」することを想定してください)。 そのような違いはどのように説明できますか?それは、ソフトウェア開発業界が若すぎて、大規模でほぼ完璧な製品を非常に高速に提供するために、単一のプロジェクトで数千人を管理できないという事実だけに起因するのでしょうか?

19
20万行のスパゲッティコードを継承しました。
これが一般的な質問ではないことを願っています。経験豊富なアドバイスを本当に活用できました。 私は、過去10〜20年にわたって広大なコードベースを一緒に使用してきたかなり小さな科学者の店で、唯一の「SWエンジニア」として新たに採用されました。(実質的に廃止された言語で書かれました:G2 -Pascal with graphicsを考えてください)。プログラム自体は、複雑な化学処理プラントの物理モデルです。それを書いたチームは信じられないほど深いドメイン知識を持っていますが、プログラミングの基礎に関する正式なトレーニングはほとんど、またはまったくありません。彼らは最近、存在しない構成管理の結果についていくつかの難しい教訓を学びました。また、コード自体に文書化されていない「スラッジ」が大量に蓄積されているため、メンテナンス作業が大幅に妨げられています。私はあなたに状況の「政治」をspareしまない(常にある 政治!)、しかし言うことで十分ですが、先の道に必要なものについて意見のコンセンサスはありません。 彼らは、現代のソフトウェア開発の原則のいくつかをチームに提示し始めるように私に頼みました。彼らは、コーディング規約、ライフサイクル管理、高レベルの設計パターン、およびソース管理に関する業界標準の実践と戦略のいくつかを紹介してほしいと思っています。率直に言って、それはかなり困難な作業であり、どこから始めればよいのかわかりません。 最初は、The Pragmatic Programmer、またはFowler's Refactoring( "Code Smells"など)の中心概念のいくつかでそれらを指導したいと思っています。また、多くのアジャイル手法を紹介したいと思っています。しかし、最終的には、効果的にするために、5〜7の基本的な基礎に磨きをかける必要があると思います。言い換えれば、彼らが現実的に実装を開始できる最も重要な原則または慣行は何であり、それは彼らに最も「大金」を与えるでしょう。 それが私の質問です:スパゲッティをまっすぐにするのに役立つ(そして将来的にそれを防ぐために)最も効果的な戦略のリストに何を含めますか?

21
何が間違っているかについての知識の増加による遅い問題解決の克服[完了]
これはしばらくの間私を悩ませてきました、そして、私は本当に他の専門家の入力に感謝します。 短いバックグラウンド:1988年に両親が私の最初のコンピューターを買ったときにプログラミングを始めました(14歳のとき、私は今39歳です)。1997年にようやくプロのプログラマーになる前に、私は他の2、3の経歴をたどりました。私は今でも自分の選択に満足しており、プログラミングが大好きで、自分の仕事が得意だと考えています。 最近、経験を積むほど、プロジェクトまたはプロジェクトの特定のタスクを完了するのに時間がかかることに気付きました。私はまだ老いません。ただ、物事がうまくいかない可能性のあるさまざまな方法を見てきました。そして、私が知っていて覚えている潜在的な落とし穴と落とし穴はますます増えています。 些細な例:以前は「大丈夫、ここにファイルを書く」だけでした。今、私は権限、ロック、同時実行、アトミック操作、インダイレクション/フレームワーク、異なるファイルシステム、ディレクトリ内のファイル数、予測可能な一時ファイル名、PRNGのランダム性の質、あらゆる中の電力不足を心配しています操作、私がやっていることのための理解可能なAPI、適切なドキュメントなどなど 要するに、問題は「これをどのように行うか」から「それを行うための最良/最も安全な方法」に移りました。 その結果、初心者よりもプロジェクトを完了するのに時間がかかります。私のバージョンは堅実で、作成方法を知っているのと同じくらい侵入できないかもしれませんが、時間がかかります。 上記の「ファイルの作成」の例は単なる例でした。実際のタスクは明らかに複雑ですが、このような一般的な質問にはあまり適していません。私がこれでどこへ行くのか理解してほしい。効率的なアルゴリズムを考え出すのに何の問題もありません。数学が大好きです。複雑なテーマを楽しんでいます。集中力に問題はありません。私は経験に問題があり、その結果エラー(内因性または外因性)を恐れていると思います。 私は1日2時間近く、新しい開発、新しい技術、言語、プラットフォーム、セキュリティの脆弱性などを読んでいます。難題は、知識を増やせば増やすほど、プロジェクトの完了が遅くなることです。 これにどう対処しますか?
450 experience  effort 

Licensed under cc by-sa 3.0 with attribution required.