ソフトウェア工学

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


16
プロジェクトはほぼ完了しましたが、手続き型のスパゲッティコードです。書き直しますか、それとも出荷しようとしますか?[閉まっている]
私は初心者のWeb開発者です(1年の経験)。 卒業してから数週間後、私は所有者があまり技術者ではない会社のためにWebアプリケーションを構築する仕事を提供されました。彼は、アイデアの盗難、サービス会社が請求する高い開発コストを避け、長期的にプロジェクトを維持するために若い人をオンボードで信頼できるようにするために私を雇いました)。 当時の私は生意気で、コンピューターサイエンスの学位を取得していたので、私は何でも構築できると考えて申し出を受け入れました。 私はショットを呼んでいました。いくつかの調査の後、私はPHPに落ち着き、オブジェクトなしの単純なPHPから始めました。2か月後、すべてが面倒になり、進歩するのは困難でした。Webアプリケーションは巨大です。そこで、私の生活を楽にするMVCフレームワークをチェックアウトすることにしました。そこで私は、PHPコミュニティのクールな子供、Laravelに出会いました。私はそれを愛し、学びやすく、すぐにコーディングを始めました。私のコードはよりきれいで、より組織的に見えました。とてもよかったです。 しかし、やはりWebアプリケーションは巨大でした。会社は最初のバージョンを提供するように私にプレッシャーをかけていました。 Laravelは一緒に仕事をするのが面白かったので、そもそもこの業界を選んだ理由を思い出しました。 だから私は夜に小さなプロジェクトに取り組み始め、方法論とベストプラクティスについて読みました。私はOOPに戻り、オブジェクト指向の設計と分析に移り、ボブおじさんの本Clean Codeを読みました。 これは私が本当に何も知らなかったことに気づきました。ソフトウェアを正しく構築する方法を知りませんでした。しかし、この時点では手遅れであり、今ではほぼ完了です。私のコードはまったくクリーンではなく、スパゲッティコード、バグを修正するための本当に苦痛、すべてのロジックはコントローラーにあり、オブジェクト指向のデザインはほとんどありません。 私は、プロジェクト全体を書き直さなければならないと固執している。しかし、私はそれを行うことはできません...彼らはそれがいつ完了するのかを尋ね続けます。 このコードがサーバーに展開されることは想像できません。さらに、コードの効率性とWebアプリケーションのパフォーマンスについてはまだ何も知りません。 一方では、会社は製品を待っていて、もう待つことができません。一方、実際のコードでこれ以上進むことはできません。仕上げて、まとめて展開することはできましたが、神は、人々がそれを使い始めたときに何が起こるかを知っています。 書き直しますか、それとも出荷しようとしますか、それとも見逃した別のオプションがありますか?

17
優れたプログラマーに関するトーバルズの引用[終了]
偶然、Linus Torvaldsによる次の引用につまずいた。 「悪いプログラマはコードを心配します。良いプログラマはデータ構造とその関係を心配します。」 私は過去数日間それについて考えてきましたが、私はまだ混乱しています(おそらく良い兆候ではありません)、したがって、私は次のことを議論したかったです: これの可能な解釈/意味がありますか? それから何を適用/学習できますか?

7
Springフレームワークは何をしますか?使用すべきですか?なぜですか?
そのため、私はJavaで新しいプロジェクトを開始し、Springの使用を検討しています。なぜ春を検討するのですか?多くの人が私にSpringを使うべきだと言っているからです!真剣に、私は人々にSpringが何であるか、それが何であるかを説明するように試みたときはいつでも、彼らは私にまっすぐな答えを与えることはできません。SpringSourceサイトでイントロを確認しましたが、それらは非常に複雑であるか、本当にチュートリアルに焦点を当てています。いずれも、私がそれを使用する理由、またはそれが私の生活を楽にする方法について良いアイデアを与えてくれません。時々、人々は「依存性注入」という用語をまき散らしますが、これは私をさらに混乱させるだけです。なぜなら、その用語の意味が違うと思うからです。 とにかく、私の背景とアプリについて少し説明します。 しばらくJavaで開発しており、バックエンドWeb開発を行っています。はい、私は大量の単体テストを行っています。これを容易にするために、私は通常、(少なくとも)2つのバージョンのメソッドを作成します。1つはインスタンス変数を使用し、もう1つはメソッドに渡される変数のみを使用します。インスタンス変数を使用する方は、もう一方を呼び出して、インスタンス変数を提供します。単体テストの時間になると、Mockitoを使用してオブジェクトをモックアップし、インスタンス変数を使用しないメソッドを呼び出します。これは私が常に「依存性注入」であると理解してきたことです。 私のアプリは、CSの観点からは非常にシンプルです。小規模なプロジェクト、1〜2人の開発者。主にCRUDタイプの操作で、大量の検索がスローされます。基本的には、一連のRESTful Webサービスに加えて、Webフロントエンド、そして最終的には一部のモバイルクライアントです。フロントエンドをストレートHTML / CSS / JS / JQueryで行うことを考えているので、JSPを使用する予定はありません。HibernateをORMとして使用し、Jerseyを使用してWebサービスを実装します。 私はすでにコーディングを始めており、デモを手に入れたいと思っています。したがって、明らかに時間が重要です。Springには学習曲線がかなりあることを理解していますが、それに加えて、多くのXML構成が必要なように見えますが、通常はペストのように避けるようにしています。しかし、それが私の生活を楽にすることができ、そして(特に)それが開発とテストをより速くすることができるなら、私は弾丸を噛んで春を学ぼうと思っています。 だからお願い。私を教育してください。Springを使用する必要がありますか?なぜですか?

16
複雑なコードを説明するコメントの何が問題になっていますか?
多くの人が「コメントは「なぜ」ではなく「なぜ」を説明すべきだ」と主張しています。他の人は「コードは自己文書化されるべきである」と言い、コメントは少ないはずです。ロバートC.マーティンは、(コメントは言い換えると)しばしば「コメントは不適切に書かれたコードに対して謝罪する」と主張しています。 私の質問は次のとおりです。 複雑なアルゴリズムや、複雑で複雑なコードを説明的なコメントで説明することの何が問題になっていますか? この方法では、他の開発者(自分を含む)がアルゴリズム全体を1行ずつ読んでその動作を理解する代わりに、簡単な英語で書いたわかりやすい説明コメントを読むことができます。 英語は、人間が簡単に理解できるように「設計」されています。ただし、Java、Ruby、またはPerlは、人間の可読性とコンピューターの可読性のバランスを取るように設計されているため、テキストの人間の可読性が損なわれます。人間は、同じ意味のコードを理解するよりもはるかに速く英語を理解できます(操作が簡単でない限り)。 だから、部分的に人間が読めるプログラミング言語で書かれた複雑なコードを書いた後、フレンドリーで理解しやすい英語でコードの操作を説明する記述的で簡潔なコメントを追加してみませんか? 「コードを理解するのは難しくない」、「機能を小さくする」、「わかりやすい名前を使用する」、「スパゲッティコードを書かない」と言う人もいます。 しかし、それだけでは十分ではないことはわかっています。これらは単なるガイドラインであり、重要かつ有用なものですが、一部のアルゴリズムが複雑であるという事実は変わりません。したがって、それらを行ごとに読むと理解するのは困難です。 複雑なアルゴリズムを一般的な操作についてのコメントの数行で説明するのは本当に悪いですか?複雑なコードをコメントで説明することの何が問題になっていますか?

30
Stack Overflowでの高い評価は、良い仕事を得るのに役立ちますか?
では、ポスト、ジョエル・スポルスキは5桁のスタックオーバーフローの評判はあなたが$ 100K +を払って仕事を獲得するために助けることができると述べました。それはどれくらい本当ですか? Stack Exchangeサイトでの評判のおかげで、高給の仕事を得た成功を共有したい人はいますか? リクルーターが自分のStack Overflowの評判が印象的だと気付いたので、ある人がGoogleからインタビューのオファーを受けたということをどこかで読みました。似たような話をしている人はいますか?


15
Tanenbaum-Torvaldsの議論でTanenbaumが間違っていたのはなぜですか?
私は最近、OSクラスでTanenbaum-Torvaldsの討論会から読書を割り当てられました。討論では、タネンバウムはいくつかの予測を行います。 マイクロカーネルは未来です x86が消滅し、RISCアーキテクチャが市場を支配する (それから5年後)誰もが無料のGNU OSを実行します 議論が起こったとき、私は1歳だったので、歴史的な直観に欠けています。これらの予測がパンアウトされないのはなぜですか?タネンバウムの観点からは、彼らは将来のかなり合理的な予測であるように思えます。何が起こったので、彼らは合格しなかったのですか

14
コードエディタは、インデントを使用せずに、コードのネストレベルを効果的に示唆できますか?[閉まっている]
同じXMLテキストに2つの表示オプションを提供するXMLテキストエディターを作成しました。1つはインデント(仮想)、もう1つは左揃えです。左寄せビューの動機は、XMLコンテキストの自動化された副作用であるインデントの干渉なしに、ユーザーがプレーンテキストまたはXPathコードのインデントに使用している空白文字を「見る」のを支援することです。 私は、ユーザーを支援する左寄せモードの視覚的な手がかりを(エディターの編集不可部分で)提供したいと思いますが、あまり複雑になりません。 接続線だけを使用してみましたが、それは忙しすぎるようでした。私がこれまでに思いついた最高のものは、下のエディターのモックアップされたスクリーンショットに示されていますが、私はより良い/より簡単な代替手段を探しています(コードをあまり必要としません)。 [編集] ヒートマップのアイデア(@jimpから)を取得すると、これと3つの選択肢が得られます-a、b、cというラベルが付けられています。 次のセクションでは、受け入れられた回答を提案として説明し、他の多くの回答やコメントからアイデアを集めます。この質問は現在コミュニティwikiであるため、お気軽に更新してください。 NestView インデントを使用せずにネストされたコードの可読性を向上させる視覚的な方法を提供するこのアイデアの名前。 等高線 NestView内の異なる影付きの線の名前 上の画像は、XMLスニペットを視覚化するために使用されるNestViewを示しています。この図ではXMLを使用していますが、この図ではネストを使用する他のコード構文も使用できます。 概要: 等高線は、ネストレベルを伝えるために(ヒートマップのように)シェーディングされています 等高線は、ネストレベルが開いているか閉じているかを示すために角度が付けられています。 等高線は、ネストレベルの開始点を対応する終了点にリンクします。 等高線の幅を組み合わせることで、ヒートマップに加えて、ネストレベルの視覚的な印象が得られます。 NestViewの幅は手動でサイズ変更できますが、コードが変更されても変更しないでください。これを維持するために、輪郭線を圧縮または切り捨てることができます。 空白行は、テキストをより消化しやすい塊に分割するためにコードを使用する場合があります。このような行は、NestViewで特別な動作をトリガーする可能性があります。たとえば、ヒートマップをリセットしたり、背景色の等高線を使用したり、あるいはその両方を行うことができます。 現在選択されているコードに関連付けられている1つ以上の等高線を強調表示できます。選択したコードレベルに関連付けられた等高線が最も強調されますが、ネストされたグループを強調表示するのに役立つ他の等高線も「点灯」できます。 さまざまな動作(コードの折り畳みやコードの選択など)を、等高線のクリック/ダブルクリックに関連付けることができます。 等高線の異なる部分(リーディングエッジ、ミドルエッジ、またはトレーリングエッジ)には、異なる動的な動作が関連付けられている場合があります。 等高線上のマウスホバーイベントでツールチップを表示できます。 NestViewは、コードが編集されると継続的に更新されます。ネスティングのバランスが取れていない場合、ネスティングレベルが終了する場所を想定できますが、関連する一時的な等高線は警告として何らかの方法で強調表示する必要があります。 等高線のドラッグアンドドロップ動作をサポートできます。動作は、ドラッグされる等高線の部分によって異なる場合があります。 エラーや状態の変更のための行番号付けや色の強調表示など、一般的に左マージンにある機能は、NestViewにオーバーレイする可能性があります。 追加機能 この提案はさまざまな追加の問題に対処します。多くは元の質問の範囲外ですが、有用な副作用です。 ネストされた領域の開始と終了を視覚的にリンクする 等高線は、ネストされた各レベルの開始点と終了点を接続します 現在選択されている行のコンテキストを強調表示する コードが選択されると、NestViewの関連するネストレベルを強調表示できます。 同じネストレベルでコード領域を区別する XMLの場合、異なる名前空間に異なる色相を使用できます。プログラミング言語(c#など)は、同様の方法で使用できる名前付き領域をサポートします。 ネスト領域内の領域を異なる視覚ブロックに分割する 読みやすくするために、コードに余分な行が挿入されることがよくあります。このような空のラインは、NestViewの等高線の彩度レベルをリセットするために使用できます。 複数列のコードビュー インデントなしのコードは、ワードラップまたは水平スクロールが必要になる可能性が低いため、複数列ビューの使用をより効果的にします。このビューでは、コードが1つの列の下部に到達すると、次の列に流れます。 視覚的な補助を提供するだけではありません 概要で提案されているように、NestView は、TreeViewコントロールに期待されるものとほぼ一致する幅広い編集および選択機能を提供できます。主な違いは、一般的なTreeViewノードには、エキスパンダーとノードアイコンの2つの部分があることです。NestViewの輪郭線には、オープナー(傾斜)、コネクタ(垂直)、およびクローズ(傾斜)の3つの部分があります。 インデントについて NestViewは、インデントされていないコードを補完しますが、従来のインデントされたコードビューを置き換えることはほとんどありません。 NestViewを採用するソリューションは、空白文字を含むコードテキスト自体に影響を与えることなく、インデントされたコードビューとインデントされていないコードビューをシームレスに切り替える方法を提供する可能性があります。インデントビューのテクニックの1つは「仮想フォーマット」です。タブまたはスペース文字の代わりに動的な左マージンが使用されます。NestViewを動的にレンダリングするために使用される同じネストレベルのデータは、より従来型のインデントビューにも使用できます。 印刷 インデントは、印刷されたコードを読みやすくするために重要です。ここでは、タブ/スペース文字と動的な左マージンがないため、テキストは右マージンで折り返されても、インデントされたビューの整合性が維持されます。行番号は、コードがワードラップされる場所とインデントの正確な位置を示す視覚的なマーカーとして使用できます。 画面の不動産:フラット対インデント NestViewが貴重な画面の不動産を使用するかどうかの質問に対処します。 等高線は、コードエディターの文字幅と同じ幅でうまく機能します。したがって、12文字幅のNestView幅は、等高線が切り捨て/圧縮される前に12レベルのネストに対応できます。 インデントビューが各ネストレベルに3文字幅を使用する場合、ネストが4レベルのネストに達するまでスペースが節約されます。このネストレベルの後、フラットビューには、各ネストレベルで増加するスペース節約の利点があります。 注:コードには4文字幅以上のインデントが推奨されることがよくありますが、XMLは多くの場合それよりも少なく管理されます。また、仮想フォーマットでは、配置の問題のリスクがないため、使用するインデントを少なくすることができます …

2
パッケージ名は単数形ですか複数形ですか?
多くの場合、特にライブラリでは、パッケージには単一の概念に基づいて編成されたクラスが含まれます。例: XML、SQL、ユーザー、設定、デシベル。私たちは皆、これらのパッケージが単数形で正しいとかなり自然に感じると思います。 com.myproject。xml .Element com.myproject。sql .Connection com.myproject。ユーザー .User com.myproject。ユーザー .UserFactory ただし、タスク、ルール、ハンドラー、モデルなど、単一のタイプの実装のコレクションを実際に含むパッケージがある場合、これは望ましいですか? com.myproject。タスク .TakeOutGarbageTask com.myproject。タスク .DoTheDishesTask com.myproject。タスク .PaintTheHouseTask または com.myproject。task .TakeOutGarbageTask com.myproject。タスク .DoTheDishesTask com.myproject。task .PaintTheHouseTask

6
Gitリポジトリ内の単一または複数のプロジェクトを選択しますか?
gitほとんどのプロジェクトをモジュール化した環境では、リポジトリごとに1つのプロジェクト、またはリポジトリ設計の問題ごとに複数のプロジェクトに直面しています。モジュール化されたプロジェクトを考えてみましょう。 myProject/ +-- gui +-- core +-- api +-- implA +-- implB 現在、リポジトリごとに1つのプロジェクトがあります。それは自由を与えます release 個々のコンポーネント tag 個々のコンポーネント しかしbranch、多くの場合、分岐にapiはの同等の分岐が必要coreであり、おそらく他のコンポーネントも必要であるため、コンポーネントにとっても面倒です。 releaseコンポーネントを個別にしたい場合でも、リポジトリ設計ごとに複数のプロジェクトを利用することで、同様の柔軟性を得ることができます。 どのような経験があり、これらの問題にどのように/なぜ対処しましたか?

14
新しい開発者はブランチのマージについていくことができません
私は新しい開発者です-これが私の最初のプログラミング職です。 私の問題はこれです:私たちは使用しますgit-私はブランチからブランチを切り取り、develop割り当てられたマイナータスクの作業を開始します。私は経験が浅いので、とても遅いです。ブランチをdevelop他のブランチにマージする準備が整うまでに、多くの変更を行って競合を解決するのは圧倒的です(実際、作業を破棄してタスクをやり直すのは簡単なようですが、もちろん持続可能なソリューションではありません) )。 どうすればこれを克服できますか?「コーディングが上手」以外の方法を使用できますか?私は来週、これを上司に報告するつもりです。

9
なぜ人々はPython 3の使用をためらうのですか?
Python 3は2008年12月にリリースされました。それから多くの時間が経過しましたが、今日でも多くの開発者はPython 3の使用をためらっています。 もちろん、Python 3にはPython 2との非互換性があり、一部の人々は後方互換性に依存する必要があります。しかし、Python 3は、ほとんどのプロジェクトがPython 3に切り替えたり開始したりするのに十分な長さではありませんか? 競合する2つのバージョンがあると、多くの欠点があります。学習者の混乱など、2つのブランチを維持する必要があります。では、なぜPython 3に切り替えることについてPythonコミュニティ全体でそんなにためらいがありますか?

25
新しいチームリーダー-怒りの元同僚との対処方法[終了]
私は、今後のプロジェクトのチームリーダーになると言われています。私はこれまでにチームを率いたことはありませんが、責任は通常予想されるものです。プロジェクトを完了するのに8〜9か月かけて、他の3〜4人の開発者がドアを回します。 私の問題はこれです。間違いなくこのプロジェクトに取り組む開発者の一人が問題になるでしょう。彼は私よりも多くの経験があり、過去に何度か私をバカと呼んでいて、彼は自然のリーダーだからこの仕事をしたと言ってきました。彼はすべての新しいプロジェクトでリーダーシップの地位に昇進することを期待しており(これは今までに起こりませんでした)、実際のチームリーダーはそのような幻想にさらされていなかったにもかかわらず、私は彼に報告することを一度言ったことがあります。さらに、私は彼が非常に専門的でないことを観察し、他の人から聞いた(クライアントサイトで仕事以外のビデオを見る-ヘッドフォンなし、専門外の服装、遅刻、不適切なジョークなど)彼と同僚として働いている間、私の仕事や洞察を何度も称賛するために。私の現在のチームリーダーは、品質が良くなかったので、彼がプロジェクトを去ると、この男のコードの1/2を捨てたと言った。続けられた。 私が恐れているのは、この男が積極的に私に反対することです。彼は劣等だと考える人に報告することにresします。特に私は彼の前にこの機会を与えられているからです。私は過去にこの種の人格を仲間として、またはこのようなマネージャーに報告することさえできました。私に報告しているこの種のキャラクターに対処する必要はありません。 私の質問は、これに効果的かつ専門的に対処するためにどのような戦略を使用できますか?特に今、それが問題になる前に、手に負えなくなる前にそれを断ち切る方法はありますか。同様の経験を持っている人は、どのようにそれを処理しましたか?
221 team-leader 

9
多くの例外メッセージに有用な詳細が含まれていないのはなぜですか?
例外メッセージが有用な詳細を含むべきであるという合意のある量があるようです。 システムコンポーネントからの多くの一般的な例外に有用な詳細が含まれていないのはなぜですか? いくつかの例: .NETのListインデックスアクセスがArgumentOutOfRangeExceptionないではない私にしようと、無効でした指標値を教え、またそれは私の許容範囲を教えてくれありません。 基本的に、MSVC C ++標準ライブラリからのすべての例外メッセージはまったく役に立たない(上記と同じように)。 .NETのOracleの例外。「言い換えると」「テーブルまたはビューが見つかりません」と表示されますが、どちらも表示されません。 したがって、私には、ほとんどの場合、例外メッセージには有用な詳細が含まれていないようです。私の期待はずれていますか?私はこれに気付くような間違った例外を使用していますか?または、私の印象が間違っているかもしれません:例外の大部分は実際に有用な詳細を提供しますか?
220 c#  c++  exceptions 

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