ソフトウェア工学

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

6
「自動ビルド」とはどういう意味ですか?
プロジェクトに継続的インテグレーションを追加しようとしています。 ウィキペディアによると、CIの主要な部分の1つは自動ビルドです。ただし、CIとビルド自動化の記事が一致していないように見えるため、正確に何を意味するのかについて混乱しています。 特定の混乱点:「自動ビルド」とは次のコンテキストで何を意味するか PythonやPerlなどのインタープリター言語を使用するプロジェクトですか? エンドユーザーのマシンのソースからビルドしますか? ユーザーのマシンにローカルなRDBMS内のデータベースなど、単純にプリコンパイルおよび配布できない依存関係を持つアプリケーションですか?

7
完全なプログラムを構築していますか?
本を読んだり、ビデオを見たり、チュートリアルを確認したりするのはとても簡単です。メモを取って実際に教材を学習するのは少し難しいかもしれませんが、それでもまともな頭脳とかなりの関心を持っている人なら誰でも簡単です(もちろん、楽しいです)。 問題は、完全なプログラムやWebサイトを作成する準備が本当に整っていないことです。あなたがそれらの10代(高校生のみ、真の(大学レベル)のコンピューターサイエンスまたはプログラミングコースはなく、現実世界の経験がない)で、Grouponを使用するとします。あるいは、マーク・ザッカーバーグでさえ、彼は天才であり、彼は非常に有能なプログラマーだったに違いありません... 必ずしもプログラミングが初めてというわけではないが、実際のアプリケーションや実際のプログラマーをプログラミングするのが初めての人は、それを開発することをどのようにお勧めしますか?「開発プロセス」とは何ですか-特にシングルプログラマ(または2〜3代の若者)にとってはどうですか? また、Web開発に関する限り、そのプロセスはどのようなものですか?FacebookやGrouponのようなものは、フレームワーク(CodeIgniterやPHPのZendなど)で書かれていましたか?または、独自のフレームワークを開発していますか?素晴らしいアイデアを思いつく方法を尋ねているのではなく、効果的な方法で素晴らしいアイデアを実装する方法を尋ねていますか?誰にもアドバイスがありますか? 私は、CとC ++の両方(主にCプログラミング言語とC ++プログラミング言語)に関する本をいくつか読んで、AP Computer Scienceを受講しました(JavaとOOPに関する追加の本をいくつか読みました)。また、PHP(およびCodeIgniter)およびPythonに関するチュートリアルをいくつか読んでいます。しかし、私はまだ高校生で、技術的には数か月間インターンシップで働くのに十分な年齢ではありません。

9
選択した言語でクライアント側のブラウザコードをコーディングできるようになりますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 6年前に閉鎖されました。 正直言って、クライアント側のコードをJavaScriptで書くのは嫌です。控えめに言っても、私はこの言語のファンではありません。 ブラウザーが中間の仮想マシン(CILやJVMなど)ではなくプログラミング言語をサポートしているのは馬鹿げているように思えます。後者の場合、プログラマーは、1つの固定されたプリセット言語ではなく、選択した言語(ある程度)で書くことができます。この言語は、CIL / JVM /何でも変更するだけで、すべての主要なブラウザをアップグレードする必要があるため、より急速に進化する可能性があります。古いブラウザエクスペリエンスに影響を与えずに言語機能を追加できます。 中間言語がもたらす多大な労力の節約はよく知られています。JavaScript以外、特に既に設計、開発、最適化された仮想マシンでブラウザの「スクリプト」を促進するイニシアチブはありますか?勢いはありますか?

4
静的型付け機能コードの単体テスト
haskell、scala、ocaml、nemerle、f#、またはhaXeで記述された静的に型付けされた機能コードを単体テストするのが理にかなっています(最後は本当に興味のあることですが、より大きなコミュニティの知識を活用してください)。 私の理解から: 単体テストの1つの側面は、仕様を実行可能な形式にすることです。ただし、形式化された仕様を言語セマンティクスに直接マップする宣言スタイルを使用する場合、実際に仕様を実行可能な形式で別の方法で表現することもできますか? 単体テストのより明白な側面は、静的分析では明らかにできないエラーを追跡することです。型安全機能コードは、静的アナライザーが理解するものに非常に近いコードを作成するための優れたツールであることを考えると、多くの安全性を静的分析にシフトできるように思われます。ただし、コードxでy(両方とも座標)の代わりに使用するような単純なミスはカバーできません。OTOHこのような間違いは、テストコードの作成中にも発生する可能性があるため、努力する価値があるかどうかはわかりません。 ユニットテストでは冗長性が導入されます。つまり、要件が変更された場合、それらを実装するコードとこのコードをカバーするテストの両方を変更する必要があります。もちろん、このオーバーヘッドはほぼ一定であるため、実際には問題ではないと主張することができます。実際、Rubyのような言語では実際には利点と比較されませんが、静的に型指定された関数型プログラミングが地上ユニットテストの多くを対象としていることを考えると、ペナルティなしで単純に削減できる一定のオーバーヘッドのように感じます。 このことから、このプログラミングスタイルでは単体テストはやや時代遅れであると推測します。もちろん、そのような主張は宗教的な戦争につながる可能性があるため、簡単な質問に要約します。 このようなプログラミングスタイルを使用する場合、単体テストをどの程度使用し、その理由は何ですか(コードでどの程度の品質を得たいと考えていますか)。または、逆に、静的アナライザーでカバーされているため、ユニットテストのカバレッジを必要とせずに、静的に型指定された機能コードのユニットを修飾できる基準はありますか?

2
キャッチオールまたは基本例外クラスで例外を記録する方が賢明ですか?
私はかなり大きなWebアプリをリファクタリングしています。主な問題の1つは、一貫性のないエラー処理であり、私は賢明な戦略を考え出そうとしています。set_error_handlerを介して、基本的にErrorExceptionsの PHPエラーを変換するカスタムエラーハンドラーと、Exceptionから直接継承するカスタムベース例外クラスを作成しました。 実稼働環境では、set_exception_handlerを介して汎用の例外catch-allを使用しており、例外ログ*をミックスに追加しようとしています。私のジレンマは、基本例外クラスまたはキャッチオールで実際のロギングを行う場所です。 私はそれをキャッチオールに記録するいくつかの理由を考えました: 基本例外クラスの適切な子に変換する必要があるコードには、かなりの数の例外があります。それが起こるまで、すべての例外がログに記録されるわけではありません。 キャッチオールでそれを行う方が自然な感じがします。ベース例外クラスはそれ以上のことをすべきではありません。(それは単一の責任原則のことかもしれませんが、見当違いの感覚かもしれません) 基本例外クラスにログインする1つの理由: 現在、キャッチオールは本番環境でのみ使用されています。他の環境(開発、テスト)で導入するのは簡単ですが、エラーは環境ごとに処理が異なるため、本番環境では404/503エラーページに変換されるため、いくつかの調整が必要になります。 例外をログに記録する場所について、受け入れられるプラクティスはありますか? *ロギングには最初はテキストファイルへの書き込みが含まれますが、特定の種類の例外のメールを送信するように進化する場合があります。 @unholysamplerの答えに促されたいくつかの説明: 私は2 * 10 ^ 6のslocコードベースに直面しており、多くのサードパーティのものを制御できません。また、PHPの前日例外を制御するコードの一部もあります。また、最近のくだらないコードもいくつかあります。私たちは、思考をやめ、ハッキングされなければならなかった激しいプレッシャーから長期間回復しています。 すべての矛盾に対処し、適切なエラー処理アプローチを導入するために積極的にリファクタリングを行っていますが、それには時間がかかります。エラーが適切に処理されるようになるまで、どうすればいいのか興味があります。おそらく、ある時点で賢明な例外戦略について別の質問をするでしょう。 ロギングの背後にある主な動機は、本番環境で何か悪いことが起こったときに電話でメールを受け取ることです。データダンプが巨大になるかどうかは気にしません。データダンプが大きくなると、古いジョブを時々削除するcronジョブが必要になります。

2
Scalaを試す前にJavaを知る必要がありますか
Scalaの学習に興味があります。私はそれについて多くのことを読んでいますが、多くの人々はそれを高く評価しています 私の質問は、Scalaで物事がどのように機能するかを理解/評価するためにJavaを知る必要があるということですか?最初にJavaでスタブを実行してからScalaを試す方が良いでしょうか、それともJavaのバックラウンドをまったく使用せずにScalaを起動できますか?
15 java  scala 

4
Conwayの「Game of Life」がコードリトリートに使用されるのはなぜですか?
Code Retreatは、ソフトウェア開発の基礎に焦点を当てた終日トレーニングイベントです。「グローバルな」コードリトリート日が近づいています。私はそれを楽しみにしています。とは言うものの、私は以前に1つに行ったことがあり、膨大な量の混乱があったと言わざるを得ません...それは問題ありません。 私がまだ理解していないことの1つは、「ゲームオブライフ」がTDDにとって良い問題である理由と、TDDの良い点と悪い点がどのように感じられるかということです。 これはかなり開かれた質問であることに気づきますので、気軽にコメントしてください。
15 tdd 

10
誰が新しいプログラマーを訓練すべきですか?ジュニアまたはシニアのプログラマーですか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 4年前に閉鎖されました。 私のチームでは、ほとんどの上級プログラマーに真新しいジュニアプログラマーを訓練/指導することをしばしば要求します。ただし、これらの同じ上級プログラマーは、実際の重要な作業の大部分を実行しているプログラマーです。 私は上司に、高い適性を示している若いプログラマーに新しいプログラマーを彼らの翼の下に連れて行くのは理にかなっていると主張しようとしました。まず、上級開発者がより重要なイニシアチブに取り組むことができるようにします(メンタリングは重要ではありません)。次に、ジュニアプログラマーは、そのような責任を求められ、教えることで何かを学ぶことができるという彼らの仕事に少しの誇りを与えます。最後に、上級開発者は後輩よりも多くの費用がかかるため、会社のお金を節約できます。 これが明らかに時間の始まりからこのチームで働いている方法なので、私のボスは説得できませんでした。何らかのトレーニング/メンタリングが必須であるという決定がなされたと仮定すると、誰かが私にいくつかのより良い議論を提供したり、私が間違っている理由を教えてもらえますか?あなたのチームは何をしていますか? **年功序列は必ずしも能力を示すものではないので、「シニアプログラマー」、つまり「トッププログラマー」を意味するものとみなすことができます。

2
構造タイピングの(不)利点
私はちょうどダニエル・シュピーワクによるこの講演を見ました。そこで彼は、Scalaのans Javaの名目上の型付けと比較した構造型付けの利点について話しています。この違いの1つの例は、次のJavaコードです public interface Foo { public int length(); } public interface Bar { public int length(); } Foo f = ...; Bar b = f; もちろんその間タイプの互換性ため、コンパイルされないだろうFooとは、Bar名前によって決定されます。 一方、構造型システムでは、両方の型が等しいか互換性があると宣言できるため、とりわけ、チェックされたアヒルの型付けが可能になります。 今、私は構造型システムの利点のほとんどを理解していると思いますが、次のような例から型安全性を無効にしないのではないかと思います class Foo { class Bar { /* ... */ } def takeBar(b: Bar) = { /* ... */ } def getBar: …

8
一括操作を実装する必要がある場合、ORMフレームワークを放棄する必要がありますか?
一般的な状況は次のとおりです。 ORMフレームワークを使用するアプリケーションに一括操作を実装する必要があります。 最初のパスの後、重大なパフォーマンスの問題に気づきました。 ここに私の質問があります: この状況では、生のSQLを含むソリューションを好むべきでしょうか? または、ORMフレームワークを使用した一括操作に一般的に関連する問題を軽減するのに役立つ、よく知られた設計パターンはありますか? 編集: アプリケーション全体からORMフレームワークを削除する必要があるかどうかは尋ねません。 私は尋ねています:アプリケーションのこの小さなスライスのためにORMフレームワークを放棄する必要がありますか?
15 orm  heuristics 

8
動的(サーバー側で生成された)CSSを使用しないのはなぜですか?
サーバー側で生成されるHTMLは簡単であるため(AJAXよりも前に動的なWebページを作成する唯一の方法でした)、サーバー側で生成されるCSSはそうではありません。実際、私はそれを見たことがない。CSSコンパイラはありますが、静的として使用できるCSSファイルを生成します。 技術的には、特別なライブラリは不要です。HTML スタイルタグは、静的CSSファイルの代わりにPHP(/ ASP / whatever)テンプレートスクリプトを参照し、スクリプトはCSS コンテンツタイプヘッダーを送信する必要があります-それだけです。 キャッシュに問題がありますか?そうは思いません。スクリプトは、no-cacheなどのヘッダーを送信する必要があります。デザイナーにとって問題ですか?いいえ、CSSテンプレートを編集する必要があります(HTMLテンプレートを編集するため)。 なぜ動的CSSジェネレーターを使用しないのですか?または、もしあれば、私に知らせてください。

5
RAD環境でリリース品質を改善する簡単な方法
ここに少しの背景があります-私たちは、大規模な非ソフトウェア会社の内部ソフトウェア開発を担当するRAD開発者の小さなチーム(5人)です。「内部ソフトウェア」は、MSSQLサーバーをバックエンドとして使用するデスクトップ.N​​ETアプリケーションと、バックグラウンドで実行されるPythonスクリプトからMS Word文書やテンプレートに至るまでさまざまです-技術の動物園。 チーム全体は、ユーザーから要件を取得し、コードを作成し、テストし、運用環境に展開できるすべてのアロンダで構成されています。本番環境のソフトウェアは、別のチームによって管理されていますが、通常、何か問題が発生した場合は簡単に介入できます。 これまでのところはすべて良さそうですが、問題があります-RADチームであるため、頻繁にリリースする必要があり、1つまたは2つのアプリケーションの新しいバージョンをリリースせずに1日を過ごすことはできません(または、スクリプト、更新されたWordドキュメント、C ++コンソールアプリなど)を本番環境に追加します。開発テストを行い、エンドユーザーがUAT環境でソフトウェアを実行できるようにすることで、エンドユーザーも関与させます... ...しかし、バグはとにかく生産に忍び込んでいます。ユーザーはこれらのバグと時折の不安定性が本当に欲しいものをすぐに手に入れるために支払う価格であることを理解していますが、同時に考えさせられました-おそらく開発やリリースのプラクティスを改善して安定性を改善できるかもしれません新しい機能を追加するときに導入するバグの数を減らします。 良いこと-そもそもプロセスがあまりないので、改善を開始しやすいはずです。悪いこと-実装する時間とリソースがあまりない小さなRADチームであること大きなことですが、次のイニシアチブについて検討しており、フィードバック、ヒント、ヒント、提案を歓迎します。 現在、一部のアプリケーションは、ユーザー受け入れテストをバイパスして、開発者テストの直後に本番環境にリリースされています。その慣行は中止されるべきであり、小さな変更でさえエンドユーザーがテストする必要があります。各アプリケーションには、エンドユーザーから選択された専用のベータテスターがあります。ベータテスターが新しいリリースを承認した場合のみ、テストから実稼働環境に昇格されます。 コードレビューは実施しませんが、変更セットをチェックインする前にコードレビューを開始します。また、「ロールアウトレビュー」についても考えていました。基本的に、開発者の1人がソフトウェアロールアウト(バイナリのコピー、設定の更新、データベースへの新しいテーブルの追加など)を行う他のウォッチと一緒に隣に座っている必要があります-通常は5〜10分かかるため、「ロールアウトレビュー」の時間はあまりかかりません。 新しいリリースが、本番環境から撤退し、適切な以前のバージョンに置き換えられるほどバグが多いことが証明されている場合に、ロールバック時間を短縮する方法。すべてのリリースの履歴を(バイナリとして)保存して、1つのバージョンに簡単に戻せるようにします。また、「新しくリリースされたバイナリを以前のバージョンのバイナリで上書きする」のは簡単ですが、エラーが発生しやすい手動プロセスです。また、「ロールバックが失敗し、システムがバグの代わりに使用不能になる場合はどうするか」を時々要求します。 ここでアイデアを使い果たしました。これらについてのフィードバックを受け取りたいと思います。簡単なリリース/開発プロセスの改善アドバイスを共有できれば、それは素晴らしいことです。

2
多くの小さなスクリプト、1つのリポジトリ、または複数ですか?
同僚と私は、複数の意見を持っている問題に遭遇しました。 現在、すべてのcronジョブを保持しているgitリポジトリがあります。約20のcronがあり、それらはすべて小さなpythonスクリプトであり、いくつかのアクティビティに不可欠であるという事実を除き、実際には関連していません。すべてのスクリプトの要件fabric.pyを展開するrequirements.txtファイルと管理するファイルを使用しています。 私たちの問題は、基本的に、これらのスクリプトをすべて1つのgitリポジトリに保持するのか、それとも独自のリポジトリに分離する必要があるのか​​、ということです。それらを1つのリポジトリに保持することで、1つのサーバーに簡単に展開できます。すべてのスクリプトに1つのcronファイルを使用できます。 ただし、20個のcronジョブは論理的に関連していないため、これは間違っていると感じています。さらに、requirements.txtすべてのスクリプトに1つのファイルを使用する場合、特定のスクリプトの依存関係を把握するのは困難であり、それらはすべて同じバージョンのパッケージを使用する必要があります。 すべてのスクリプトを独自のリポジトリに分離することもできますが、これにより20の異なるリポジトリが作成され、それらを覚えて処理する必要があります。これらのスクリプトのほとんどはそれほど大きくなく、その解決策は行き過ぎているようです。 関連する質問は、すべてのcronジョブに1つの大きなcrontabファイルを使用しますか、それとも個別のファイルを使用しますか?それぞれが独自のものを持っている場合、あるcrontabのインストールは他の19の上書きをどのように回避しますか?これはまた、20種類のcronファイルを追跡する必要があるため、苦痛のように思えます。 要するに、私たちの主な質問と問題は、それらをすべて1つのリポジトリとして密接にバンドルしたままにするのか、それとも独自のrequirements.txtとfabfile.pyを使用して独自のリポジトリに分けるのですか?私たちは、おそらくいくつかの本当に簡単な解決策も検討しているように感じます。この問題に対処する簡単な方法はありますか?


1
GroovyはTennentの通信原理に従っていますか?
Tennent's Correspondence Principleの興味深い議論と、Neal Gafterの簡単な説明を以下に示します。 原則では、式またはステートメントは、クロージャーにラップされてすぐに呼び出されたときに、クロージャーにラップされる前と同じ意味を持つ必要があります。クロージャでコードをラップするときのセマンティクスの変更は、おそらく言語の欠陥です。 Groovy言語はこの原則に従っていますか?

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