ソフトウェア工学

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

30
プログラミングの第一原則をどう思いますか?
私はいつも「これの最初の原則は何ですか?」何かの基本的なこと(プログラミングなど)を学んだ後。IMOという刺激的な質問で、何かの背後にある最も重要な原則、特にプログラミングなどのスキルについて考えるように強制することができます。 それでは、プログラミングの最初の原則は何だと思いますか?少し後で回答します。

3
タイプ別または機能別フォルダー
AngularJSスタイルガイドを使用します。このガイド内にはfolder-by-feature、の代わりにと呼ばれるスタイルがあり、folder-by-type実際には最良のアプローチは何ですか(この例ではJavaの場合) サービス、コントローラー、リポジトリー、もちろんドメインオブジェクトを使用して、ユーザーとペットを取得できるアプリケーションがあるとします。 folder-by -.....スタイルを使用すると、パッケージ構造に2つのオプションがあります。 1.タイプごとのフォルダー com.example ├── domain │ ├── User.java │ └── Pet.java ├── controllers │ ├── UserController.java │ └── PetController.java ├── repositories │ ├── UserRepository.java │ └── PetRepository.java ├── services │ ├── UserService.java │ └── PetService.java │ // and everything else in the project └── MyApplication.java 2.機能ごとのフォルダー com.example …

4
Parser Combinatorを使用する場合 パーサージェネレーターを使用する場合
最近、パーサーの世界を深く掘り下げて、独自のプログラミング言語を作成したいと考えています。 しかし、パーサーを作成するには、パーサージェネレーターとパーサーコンビネーターという2つの異なるアプローチが存在することがわかりました。 興味深いことに、どのケースでどのアプローチが優れているかを説明したリソースを見つけることができませんでした。むしろ、資源(および人)の多くは、私は、他のアプローチを知っているだけで説明していない主題について質問彼らのようなアプローチをアプローチし、他のすべてのに言及していません。 有名なドラゴンブックは字句/スキャンに入ると、(f)LEXに言及しているが、すべてのパーサコンビネータを言及していません。 言語実装パターンは、Javaで構築されたANTLR Parser Generatorに大きく依存しており、Parser Combinatorsについては一切言及していません。 HaskellのParser CombinatorであるParsecのParsec入門チュートリアルでは、Parser Generatorsについてはまったく言及していません。 Boost :: spirit、最も有名なC ++ Parser Combinatorは、Parser Generatorsについてまったく言及していません。 パーサーコンビネーターを発明した可能性のある優れた説明ブログ投稿では、パーサージェネレーターについては一切言及していません。 簡単な概要: パーサージェネレーター パーサージェネレーターは、Extended Backus-Naur形式の方言であるDSLで記述されたファイルを受け取り、それを(コンパイル時に)このDSLで記述された入力言語のパーサーにできるソースコードに変換します。 これは、コンパイルプロセスが2つの別々のステップで実行されることを意味します。興味深いことに、パーサージェネレーター自体もコンパイラーです(そしてそれらの多くは実際に自己ホスト型です)。 パーサーコンビネーター パーサーコンビネーターは、すべてがパラメーターとして入力を受け取るパーサーと呼ばれる単純な関数を記述し、一致する場合、この入力の最初の文字を抜き取ります。パーサーがこの入力から何も解析できなかった場合は、タプルを返します。タプル(result, rest_of_input)はresult空(nilまたはNothing)の場合があります。例はdigitパーサーです。もちろん、他のパーサーは、パーサーを最初の引数(最後の引数は入力文字列のまま)として、それらを結合many1できます。 言うまでもなく、新しいパーサーを作成するために、もちろん(compose)digitとを組み合わせることができmany1ますinteger。 また、choiceパーサーのリストを取得し、それぞれを順に試す、より高レベルのパーサーを作成することもできます。 このようにして、非常に複雑なレクサー/パーサーを構築できます。演算子のオーバーロードをサポートする言語では、ターゲット言語で直接記述されていても、EBNFに非常によく似ています(ターゲット言語のすべての機能を使用できます)。 単純な違い 言語: パーサージェネレーターは、EBNFのようなDSLと、これらのステートメントが一致したときに生成するコードの組み合わせで記述されます。 パーサーコンビネーターは、ターゲット言語で直接記述されています。 字句解析/解析: パーサージェネレーターは、「レクサー」(文字列をタグ付けされたトークンに分割して、処理している値の種類を示す)と「パーサー」(レクサーからトークンの出力リストを取得する)そしてそれらを組み合わせて、抽象構文ツリーを形成しようとします)。 パーサーコンビネーターには、この区別はありません/必要ありません。通常、単純なパーサーは「レクサー」の作業を実行し、より高レベルのパーサーはこれらの単純なパーサーを呼び出して、作成するASTノードの種類を決定します。 質問 しかし、これらの違いを考えると(そしてこれはおそらく完全なものではありません!)、いつどれを使用するかについて知識のある選択をすることはできません。これらの違いの意味/結果が何であるかはわかりません。 パーサージェネレーターを使用すると、問題をより適切に解決できることを示す問題のプロパティは何ですか?Parser Combinatorを使用して問題を解決する方が適切であることを示す問題のプロパティは何ですか?

5
スタブとすべてを公開する単体テストのポイントはありますか?
「適切な」方法でユニットテストを行う場合、つまり、すべてのパブリックコールをスタブ化し、プリセット値またはモックを返す場合、実際には何もテストしていないように感じます。文字通り、コードを見て、パブリックメソッドを通るロジックのフローに基づいて例を作成しています。そして、実装が変更されるたびに、それらのテストを行って変更する必要があります。これは、(中期でも長期でも)何か有用なことを達成しているとは感じません。また、統合テスト(非幸福なパスを含む)も行いますが、テスト時間が長くなることはあまり気にしません。それらで、私は実際に回帰をテストしているように感じます。なぜなら、それらは複数をキャッチしたからです。一方、ユニットテストは、パブリックメソッドの実装が変更されたことを示しています。 単体テストは広大なトピックであり、私はここで何かを理解していないと感じています。単体テストと統合テストの決定的な利点は何ですか(時間のオーバーヘッドを除く)。

7
RESTFul:状態変更アクション
私はRESTfull APIを構築する予定ですが、私の頭の中にいくつかの問題を引き起こしているいくつかのアーキテクチャ上の質問があります。クライアントにバックエンドビジネスロジックを追加することは、ビジネスロジックが急速に変化する可能性があるため、複数のクライアントプラットフォームの更新をリアルタイムで維持するのが難しいため、回避したいオプションです。 リソースとして記事(api / article)があるとしましょう。発行、非公開、アクティブ化、非アクティブ化などのアクションをどのように実装する必要がありますか? 1)api / article / {id} / {action}を使用する必要があります。リモートロケーションへのプッシュや複数のプロパティの変更など、多くのバックエンドロジックがそこで発生する可能性があるためです。おそらくここで最も難しいことは、更新のためにすべての記事データをAPIに送り返す必要があり、マルチユーザーの作業を実装できなかったことです。たとえば、エディターは5秒前のデータを送信し、他のジャーナリストが2秒前に行った修正を上書きすることができます。また、記事を公開している人はコンテンツの更新とはまったく関係がないため、これをクライアントに説明する方法はありません。 2)新しいリソースの作成もオプションapi / article- {action} / idですが、返されるリソースはarticle- {action}ではなく、これが適切かどうかわからない記事になります。また、サーバー側のコード記事クラスでは、両方のリソースで実際の作業を処理していますが、これがRESTfull思考に反するかどうかはわかりません どんな提案も歓迎します。
59 api  rest 

12
これはCのgotoの適切なユースケースですか?
私は「議論、議論、投票、または議論を求める」ことを望んでいないので、これを尋ねることを本当にbutしますが、私はCに不慣れであり、言語で使用される一般的なパターンについてより多くの洞察を得たいと思っています。 私は最近、gotoコマンドに対する嫌悪感を聞いたが、最近、それに対するまともなユースケースも見つけた。 このようなコード: error = function_that_could_fail_1(); if (!error) { error = function_that_could_fail_2(); if (!error) { error = function_that_could_fail_3(); ...to the n-th tab level! } else { // deal with error, clean up, and return error code } } else { // deal with error, clean up, and return error code …

21
「昨日はうまくいきました、誓います!」あなたは何ができますか?[閉まっている]
午前中に到着すると、昨日の夕方に出発したときでもソフトウェアが機能しなくなっていることがわかります。 職業はなんですか?最初に何を確認しますか?怒りを止めて問題に取り組むために何をしますか?あなたは同僚を非難し、彼らに直接行きますか?そのような状況に陥ることを避けるために何ができますか?

11
数値が意味をなさない場合、単体テストでマジックナンバーを使用できますか?
単体テストでは、コードに任意の値をスローして、その機能を確認することがよくあります。たとえば、foo(1, 2, 3)17を返すことになっていることがわかっている場合、次のように記述できます。 assertEqual(foo(1, 2, 3), 17) これらの数値は純粋に任意であり、より広い意味を持ちません(たとえば、境界条件ではありませんが、これらについてもテストします)。私はこれらの数字の良い名前を思い付くのに苦労するだろうし、そのような何かを書くことconst int TWO = 2;は明らかに役に立たない。このようなテストを書いても大丈夫ですか?それとも定数に数値を含める必要がありますか? されているすべてのマジックナンバーは同じを作成しましたか?、文脈から意味が明らかな場合、マジックナンバーはOKであることがわかりましたが、この場合、実際にはナンバーはまったく意味を持ちません。


6
CPUキャッシュメモリが非常に高速なのはなぜですか?
CPUキャッシュメモリをメインメモリよりもはるかに高速にするのはなぜですか?階層型キャッシュシステムにはいくつかの利点があります。キャッシュが小さいほど検索が高速になることは理にかなっています。しかし、それにはもっとあるはずです。
58 memory  caching 

5
akka / erlangでアクターを使用するのが良くないのはいつですか?
私はakkaで毎日7〜8か月働いています。私が始めたとき、私はアプリケーションに取り組んでおり、ほとんどのオブジェクト間で通信するために、アクターは基本的にアクターシステム内のどこででも使用されることに気付きました。だから私は同じことをした-x / y / zの別のアクターをスピンアップする。 これはあまりにも無差別で、必要のないところに複雑さを加えているように思えます-しかし、アクターとプレーンを介した同期、または先物を介した非同期ロジックを使用する必要がある場所についての議論は見つかりません。同僚が似たようなことを言った後、私は自分のスタンスを熟考し始めました。最近、タスクを熟考し、不変の実装で同じ結果を安全に達成できるため、別のアクターの作成を避けたいくつかのケースを実現しました。たとえば、非常に頻繁にアクセスするデータベースまたはファイルから設定値を取得するようなものです結果を待つのが実際のユースケースです。 特に、不変の状態で遊んでいる場合、アクターは複雑さを生み出し、スループットを制限します。たとえば、オブジェクトの純粋な関数は、並行性のレベルを問わず、リスクなしで同時に呼び出すことができます。アクターは一度に1つのメッセージしか処理できません。別の考慮事項は、futureの使用を開始しない限り、結果を待つ必要がある場合にスレッドを保留することですが、非同期メッセージングやスケールを心配する必要がない場合は、アクターを採用するのはやり過ぎかもしれません。 だから私の質問は-俳優を使用するのに悪い時間はありますか?アーランがどのように見えるのか興味があり、他の人の洞察が本当に欲しいです。または、アクターの使用に関するいくつかの原則がある場合。

4
Cで変数にconstキーワードを使用するタイミングと目的は何ですか?
取得中に私のコードはここに見直さ使用しての問題constのキーワードを思い付きました。変数の読み取り専用動作を実装するために使用されることを理解しています。 私は、さまざまな状況が役に立つときに混乱する。 関数のプロトタイプを明確にするために使用すべきですか? コード開発中のセキュリティ対策として使用する必要がありますか? 実行時定数を宣言するために、さまざまな関数のスコープで使用する必要がありますか? それはまったく使用されるべきですか? これらの質問は、私が直面している混乱のほんの一例です。一般的な混乱は ときにする必要がありますconstCプログラミングで使用するキーワード? Cでこのキーワードを使用することで得られるさまざまなタイプの利点は何ですか? constキーワードを使用することの短所はありますか? 私の質問の詳細にあるこれらすべての質問のために、この質問は広すぎるかもしれないと指摘されています。これらの質問は、主な質問に関する混乱を明確にするためだけのものであることを明確にしたかっただけです。 Cで変数にconstキーワードを使用するタイミングと目的は何ですか? 言い換えることもできます const同じ長所と短所を備えたC` でのキーワードの適切な使用。

10
なぜプログラムはクロージャーを使用するのですか?
ここでクロージャーを説明する多くの投稿を読んだ後、私はまだ重要な概念がありません:なぜクロージャーを書くのですか? プログラマーが実行する特定のタスクのうち、クロージャーが最も役立つと思われるものは何ですか? Swiftでのクロージャーの例は、NSUrlのアクセスとリバースジオコーダーの使用です。以下にそのような例を示します。残念ながら、これらのコースは閉鎖を示しています。コードソリューションがクロージャとして記述されている理由は説明されていません。 私の脳を「あぁ、これのためにクロージャを書くべきだ」と言うかもしれない現実世界のプログラミング問題の例は、理論的な議論よりも有益でしょう。このサイトで利用可能な理論的議論の不足はありません。

4
より高い有料の技術的な仕事を持っているということは、あなたはもうコードを書くことができないということですか?[閉まっている]
私は大企業で働いており、技術者はだいたい次のカテゴリに分類されます。 開発者多分、単一の製品の開発とスクラムチームには密接な製品に関連する他のチームで動作します。 建築家の複数のチーム(5-6)のコンサルタントの詳細ですとライブラリに抽象化することができ、チームの努力の間に共通点を認識しようとする(建築家は、しかし、ライブラリコードを書いていません)。このアーキテクトは、経営陣との多くの会議にも出席し、技術的な方向性を設定しようとします。 私の会社では、アーキテクトの役割は、ほとんどの技術者がキャリアの次のステップとして移行することです。 私の質問は次のとおりです。ほとんどの企業は、最高の有給の技術者がコードを書くことからはるかに離れるように働いていますか?これは開発者のキャリアにとって自然な傾向ですか?開発者はそれをすべて手に入れることができますか(コードと方向を設定しますか?)

7
プログラマーがメモリからQuickSort / MergeSortアルゴリズムを実装する方法を知ることはどれほど重要ですか?[閉まっている]
私は自分のノートをレビューしていて、さまざまなソートアルゴリズムの実装に出くわしました。 QuickSortとMergeSortの実装を理解しようとすると、私は生計を立てて自分がやっていることを自分自身と考えているにもかかわらず、写真の記憶もアルゴリズムを実装するための純粋な頭脳もない私のメモに依存しています。私が思い出したのは、これらのアルゴリズムの一部は安定しており、一部は安定していないことです。O(nlog(n))またはO(n ^ 2)の時間がかかるものもあります。他のものよりも多くのメモリを使用するものもあります... 私の立場では、標準のAPIにあるもの以外のソートアルゴリズムを使用する必要がないため、この種の仕事に値しないと感じます。つまり、自分でこの種のものを覚えたり、思いついたりすることが実際に不可欠なプログラミングの地位を持っている人はどれくらいいますか?
58 algorithms 

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