ソフトウェア工学

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

3
例外の仕様が悪いのはなぜですか?
約10年以上前の学校に戻って、彼らは例外指定子の使用を教えていました。私のバックグラウンドは彼らの1人であるため、強制されない限り頑固にC ++を避けるトーバルディッシュCプログラマーなので、私は散発的にC ++になってしまい、私が教えられたので例外指定子を使用しています。 ただし、C ++プログラマの大半は、例外指定子に眉をひそめているようです。これらのようなさまざまなC ++の達人からの議論と議論を読みました。私の知る限り、それは次の3つに要約されます。 例外指定子は、残りの言語と矛盾する型システムを使用します(「シャドウ型システム」)。 例外指定子を持つ関数が、指定したもの以外の何かをスローする場合、プログラムは悪い、予期しない方法で終了します。 例外指定子は、今後のC ++標準で削除される予定です。 ここで何かが足りないのですか、それともすべての理由ですか? 私自身の意見: 1)に関して:それで何。C ++はおそらく、構文的にはこれまでに作成された中で最も一貫性のないプログラミング言語です。マクロ、goto / labels、undefined- / unspecified- / implementation-defined動作の大群(hoard?)、不十分に定義された整数型、すべての暗黙的な型昇格規則、friend、autoなどの特別な場合のキーワードがあります。 、登録、明示...など。おそらく、C / C ++のすべての奇妙さについての厚手の本をいくつか書くことができます。それでは、なぜ人々はこの特定の矛盾に反応するのでしょうか。これは、言語の他の多くのより危険な機能と比較して、小さな欠陥です。 2)に関して:それは私自身の責任ではありませんか?C ++で致命的なバグを作成できる方法は他にもたくさんありますが、なぜこの特定のケースはさらに悪いのでしょうか?throw(int)Crash_t を記述してからスローする代わりに、関数がintへのポインターを返し、ワイルドで明示的な型キャストを行い、Crash_tへのポインターを返すと主張することもできます。C / C ++の精神は、ほとんどの責任をプログラマに任せることでした。 では、利点はどうですか?最も明白なのは、関数が指定したもの以外の型を明示的にスローしようとすると、コンパイラーがエラーを出すことです。これに関しては標準が明確だと思います(?)。バグが発生するのは、関数が他の関数を呼び出し、その関数が間違った型をスローした場合のみです。 決定論的な組み込みCプログラムの世界から来た私は、関数が私に投げかけるものを正確に知ることを最も確実に好むでしょう。それをサポートする言語に何かがあれば、それを使用してみませんか?選択肢は次のようです: void func() throw(Egg_t); そして void func(); // This function throws an Egg_t 呼び出し元が2番目のケースでtry-catchを実装することを無視/忘れる可能性は大きいと思いますが、1番目のケースではそうではありません。 私が理解しているように、これら2つの形式のいずれかが突然別の種類の例外をスローすることにした場合、プログラムはクラッシュします。最初のケースでは、別の例外をスローすることが許可されていないため、2番目のケースでは、SpanishInquisition_tをスローすることを誰も期待していないため、その式は本来あるべき場所にキャッチされません。 後者の場合、プログラムの最高レベルで最後の手段としてcatch(...)を使用することは、プログラムクラッシュよりも優れているようには見えません。「ねえ、あなたのプログラムのどこかで、奇妙な未処理の例外がスローされました。 。 "。例外がスローされた場所から遠く離れると、プログラムを回復できません。できることは、プログラムを終了することだけです。 また、ユーザーの観点からは、OSから「プログラムが終了しました。アドレス0x12345のBlablabla」という悪意のあるメッセージボックス、またはプログラムから「未処理の例外:myclass」という悪意のあるメッセージボックスを受け取ったとしても、それほど気にすることはありませんでした。 …

5
正規表現を使用すべきではない場合 [閉まっている]
正規表現はプログラマーの武器の強力なツールですが、最良の選択ではない場合や、まったく有害な場合もあります。 簡単な例#1は、regexpでHTMLを解析することです -多数のバグへの既知の道。おそらく、これも一般的な解析に起因します。 しかし、正規表現のための他の明らかに禁止された領域はありますか? ps: " あなたが尋ねている質問は主観的であり、閉じられそうです。 "-したがって、私は正規表現の使用が問題を引き起こすことが知られている例に興味があることを強調したいと思います。


1
scriptタグを使用してJavaScriptファイルを含める最良の方法は何ですか?
通常、次のようにscriptタグを使用してJavaScriptファイルを含めます。 <script type="text/javascript" src="somefile.js"></script> 言語属性を使用している人もいます。 最近では、多くの人がtype属性を省略しています。JavaScriptがデフォルトのスクリプト言語である場合は、type属性も省略する必要があると感じ始めました。type属性を省略してもいいでしょうか?問題は発生しますか?
50 javascript 

14
ORMフレームワークをよく知っている場合、SQLは重要ですか?[閉まっている]
私はSQLに真剣な経験はなく、LINQの代わりにSQLを書くことさえ嫌いです。ORMには十分満足しています。 雇用主とセクターの観点から、SQLを知ることは重要ですか?習得する必要がありますか?ORMフレームワークよりも純粋なSQLを好む企業は、プログラミングの世界で「恐竜」ですか?

13
*コード所有者*システム:それは効率的な方法ですか?[閉まっている]
チームに新しい開発者がいます。アジャイル方法論は、私たちの会社で使用されています。しかし、開発者には別の経験があります。コードの特定の部分を特定の開発者に割り当てる必要があると考えています。したがって、1人の開発者がプロ​​グラムプロシージャまたはモジュールを作成した場合、プロシージャ/モジュールのすべての変更は自分だけが行うのが正常であると見なされます。 プラス面では、おそらく提案されたアプローチでは、各開発者がコードの自分の部分をよく知っており、修正を迅速に行うため、共通の開発時間を節約できます。欠点は、開発者がシステムを完全に知らないことです。 このアプローチは、中規模システム(ソーシャルネットワークサイトの開発)でうまく機能すると思いますか?

2
オープンソースプロジェクトを開始するためのチェックリスト[終了]
オープンソースプロジェクトを開始することは、単に公開リポジトリにソースコードを投げて、それで満足することではありません。技術的な(ユーザー以外の)ドキュメント、貢献方法などの情報が必要です。 重要なことを行うためのチェックリストを作成する場合、それに何を含めますか?

16
変更ごとのバージョン管理とバグ追跡のオーバーヘッドが多すぎますか?
私はCVS-crazyとBugzilla-nutsのある場所で働いています。 各リリースには非常に多くのブランチがあるため、それらをカウントすることはできません。誰もが絶えず自動マージされています。 この仕事には流動性がありません。すべてがロックステップを感じます。簡単なことでも25ステップかかります。工場の生産ラインにいるようなものではありません。毎日自分で工場を立ち上げるようなものです。 状況の例: 単一のバグを修正するには、最初にクリーンで新しい仮想マシンを入手します。次に、Bugzillaレポートで説明されている別のブランチに基づいて、その単一のバグ修正用のブランチを作成します。マシンにブランチをインストールし、セットアップします。バグを修正します。私はそれをチェックインし、他の人がテストするためにマシンとマシンを残します。次に、バグ管理ソフトウェアにアクセスして、自分が何をしたかを説明し、すべての手順でテストケースを作成する必要があります。最終的に他の誰かがそれをリリースとマージします。 どんなに小さなバグであっても、これらすべてのことをしなければなりません。時々、人々は複数のバグの作業を結合しますが、私が言ったように、これはほとんど不可能であるほど多くのブランチがあります。 他の仕事では、バグを修正するだけです。私が持っていたすべてのジョブがそれを使用していますが、私はかろうじてさえ、SCMを使用して覚えている:他のすべての仕事で、彼らは何とかそれを守っているからです邪魔になりません。 プロセスが邪魔をして、それ自体で終わりになるポイントはありますか?それもエンジニアリングですか?

11
「アジャイル」チームに対して、作成するソフトウェアを計画する必要があることをどのように説明しますか?
今週仕事で私はまたもや心を動かされました。標準的なアジャイル、TDD、共有所有権、カード上のいくつかのユーザーストーリーを超えて何も計画しないアドホックな開発方法論を経て、実際には何もせずにサードパーティの統合広告の吐き気の技術性を口頭でかみ砕きます思考またはデューデリジェンスと、すべての製品コードを過去数か月の間に誰かの頭に浮かぶ最初のテストにアーキテクチャ的に結合することで、リリースサイクルの終わりに到達し、開発中の外部から見える主な機能を見ることは遅すぎます使用、バギー、迷路的に複雑になり、完全に柔軟性がなくなります。 このプロセス中に「スパイク」が行われましたが、文書化されることはなく、単一のアーキテクチャ設計は作成されませんでした(FSがなかったので、何を開発しているのかわからない場合、どのように計画または調査できますか?)-プロジェクトはペアからペアに渡され、それぞれが一度に1人のユーザーストーリーのみに焦点を当て、結果は避けられませんでした。 これを解決するために、私はレーダーから飛び出し、(恐ろしい)滝に行き、計画し、コード化し、基本的にペアを交換せず、単体テストではなく、単体テストではなく堅牢なアーキテクチャと仕様に焦点を当てましたすべてがピン留めされると、後で表示されます。コードは今でははるかに優れており、実際には完全に使用可能で、柔軟で高速です。特定の人々はこれを行うことに本当にreallyしているようで、アジャイルの神聖なプロセスに反するので、私の努力を妨害するために(おそらく無意識に)邪魔をしています。 それでは、開発者として、自分の作業を計画することは「非アジャイル」ではないことをチームにどのように説明し、アジャイルプロセスに計画をどのように適合させるのでしょうか。(私はIPMについて話しているのではなく、問題に座って、問題に取り組む人なら誰でも何ができるかを十分に詳細に解決する方法を示すエンドツーエンドの設計をスケッチすることについて話している使用するアーキテクチャとパターン、および新しいコードを既存のコードに統合する場所)
50 agile  planning 

11
なぜLispはもっと普及していないのですか?[閉まっている]
私はSICPビデオでSchemeを学び始めています。次にCommon Lispに移りたいと思います。 この言語は非常に興味深いようであり、ほとんどの人々はそれについて本を書いており、比類のない表現力を持っていると主張しています。CLにはまともな標準ライブラリがあるようです。 なぜLispはもっと普及していないのですか?それが本当にそんなに強力であるならば、人々はそれを全面的に使用するべきですが、代わりに、例えば、Lisp求人広告を見つけることはほとんど不可能です。 しばらくしてからは大きな問題ではないので、括弧だけではないことを願っています。

9
どこで時間を見つけますか?[閉まっている]
新しいスキル、テクニック、言語機能などに遅れを取っていることに気づき、そうする時間が足りないと感じています。仕事、職業、個人、家族の義務の間に、新しい技術や私がしたい、またはする必要のある読書に集中するために、あちこちで何時間か迷いを見つけることができて幸運です。関連するローカルユーザーグループに登録しますが、それらにアクセスするのが難しい場合もありますか? コミュニティに、いつ、どこで、いつあなたのスキルを磨くか、新しいスキルを学ぶことに集中する時間を見つけますか?時間を予定していますか?平日または週末に寝るのをやめますか?不眠症?他に何か? 編集回答して時間を割いてアドバイスを提供してくれた皆さんに感謝します。私が知っていたり考えたりしたこともあれば、新しい光を当てるまで選択肢として考えなかったものもありました。 編集2:多くの素晴らしいものの中からどの答えを受け入れるかを見つけようとして、私は@Paddyslackerのものに行きました。なぜなら、それは私のような現在の状況に最も適していると思うからですエリシャ@Martinまたは@ dash-tom-bang。

14
なぜ関数型プログラミングに対する現在の熱意があるのですか?[閉まっている]
最近、Scala、Clojure、およびF#に関して、関数型プログラミング言語について多くの熱意を聞いています。私は最近、FPパラダイムを学ぶためにHaskellの勉強を始めました。 私はそれが大好きです、それは本当に楽しく、私の数学の背景に合います。 しかし、それは本当に重要でしょうか?明らかに、それは新しいアイデアではありません。 私の質問は次のとおりです。 最近のFP熱意に貢献したものは何ですか?オブジェクト指向に飽き飽きしているだけなのか、それともFPを以前よりも必要にするために何か変更されたのか これはFPの未来を示していますか?または、これはオブジェクト指向データベースのような流行ですか? 言い換えれば、誰が私がこれがどこから来てどこへ行くのかを理解するのを助けることができますか?

10
卒業予想と現実[終了]
私たちが勉強したいものを選択し、私たちのキャリアと人生をどうするかを選択するとき、私たちは皆、それがどのようになるかについていくつかの期待を持っています。ほぼ10年間業界に携わってきた今、私は(コンピューターサイエンスを勉強していた頃の)プログラミングワーキングライフがどのようなものになるのか、実際にどうなるのかについて少し考えてきました。あります。 私の2つの最大のショック(または、期待を裏切る)は、ソフトウェアに関わるメンテナンス作業の量が非常に多いことと、プロフェッショナリズムの全体的な欠如です。 メンテナンス:uniでは、ソフトウェア作業の大半は既存のシステムのメンテナンスであると言われました。だから私は抽象的にこれを期待することを知っていた。しかし、これがどれほど圧倒的であるかを正確に想像することはできませんでした。おそらくそれは私が精神的にmentalめたものであり、私はもっと多くのクールな新しいものをゼロから構築することを望んでいました。しかし、実際には、ほとんどのジョブは、圧倒的にメンテナンス、バグ修正、およびサポート指向です。 プロフェッショナリズムの欠如:大学では、商用ソフトウェアの仕事は非常にプロセス指向であり、厳密に設計されているという印象が常にありました。ISOプロセスのイメージ、一連の技術文書、すべての機能とバグが厳密に文書化され、一般的にプロフェッショナルな環境がありました。ほとんどのソフトウェア企業が、学期規模の大規模なプロジェクトに取り組んでいる学生チームと同じように運営されていることに気づいたのは、大きな衝撃でした。そして、私は小さなアジャイルハックショップと中規模の企業の両方で働いてきました。私はそれが常にあからさまな「非専門的」だとは言いませんが、ソフトウェア産業は(全体として)私が期待していた強力なエンジニアリングの規律とはかけ離れているように感じます。 他の誰かがこれに似た経験をしましたか?私たちの職業がどのようになるかについてのあなたの期待が現実と異なっていた方法は何ですか?

26
問題解決能力を向上させるにはどうすればよいですか?
誰もが同じことを言います:「本当のプログラマーは本当の問題を処理する方法を知っています。」しかし、彼らはこの能力をどこでどのように学んだかを忘れています。それは学校で教えられていません。 複雑なプログラミングの問題に取り組む能力を向上させるにはどうすればよいですか?どの戦略が効果的ですか?アルゴリズムや設計パターンなど、私が注目すべき特定の領域はありますか?

11
C ++には「未定義の動作」(UB)があり、C#やJavaなどの他の言語にはないのはなぜですか?
このStack Overflowの投稿には、C / C ++言語仕様が「未定義の動作」であると宣言している状況のかなり包括的なリストがリストされています。ただし、C#やJavaなどの他の現代言語に「未定義の動作」という概念がない理由を理解したいと思います。つまり、コンパイラの設計者は、考えられるすべてのシナリオ(C#およびJava)を制御できるかどうか(CおよびC ++)を制御できますか?

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