ソフトウェア工学

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

12
APIキーなどの秘密情報をソース管理から守るための戦略は?
私は、ユーザーがTwitter、GoogleなどのOAuth資格情報を使用してログインできるようにするWebサイトに取り組んでいます。これを行うには、これらのさまざまなプロバイダーに登録し、所有している極秘APIキーを取得する必要がありますさまざまな身体部分からの誓約で保護する。キーがギャンクされると、パーツがヤンクされます。 APIキーは実行時に認証要求を実行するために使用されるため、ソースと共に移動する必要があります。私の場合、キーはアプリケーション内の構成ファイルまたはコード内に存在する必要があります。単一のマシンからビルドして公開する場合、それは問題ではありません。ただし、ソース管理をミックスに組み込むと、事態はさらに複雑になります。 私は安っぽい野郎なので、クラウド内のTFSやGitHubなどの無料のソース管理サービスを使用することを好みます。これにより、若干の難問が残ります。 APIキーがコード内にあり、コードが公開リポジトリで利用可能な場合、どうすれば体を傷つけずに保持できますか? これを処理する方法はいくつか考えられますが、満足できるものはありません。 コードからすべての個人情報を削除し、展開後に編集することができます。これは実装するのが非常に苦痛であり(多くの方法を詳しく説明しません)、オプションではありません。 暗号化できました。しかし、私はそれを解読しなければならないので、ソースを持っている人は誰でもそれを行う方法を見つけ出すことができました。無意味。 私は個人的なソース管理にお金を払うことができました。LOL j / kはお金を使いますか?お願いします。 言語機能を使用して、機密情報をソースの他の部分から分離し、ソース管理から保護することができます。これは私が今やっていることですが、誤ってシークレットファイルをチェックインすると簡単に失敗する可能性があります。 開発、デバッグ、展開を通じてスムーズに動作し、同様に確実に動作するプライベートを世界と共有しないことを保証する方法を本当に探しています(snapchatを除く)。これは完全に非現実的です。 それでは、現実的に何ができますか? 技術的な詳細:VS2012、C#4.5、ソース管理はTFサービスまたはGitHubのいずれかになります。現在、部分クラスを使用して、ソース管理に追加されない別の.csファイルで機密キーを分割します。GitHubには、.gitignoreを使用して部分的なクラスファイルがチェックインされないようにすることができるという利点があると思いますが、以前はそれを台無しにしました。「ああ、よくある問題、これがあなたのやり方です」を望んでいますが、私は「それができる限り吸わない」ために解決する必要があるかもしれません:/

29
「オープンソースであり、パッチを提出する」ことに対する標準的なレトルトは何ですか?[閉まっている]
製品、特にオープンソースの機能を提案することの危険性は、「なぜそうしないのか」という応答が得られることです。 それは有効であり、自分で変更を加えることができるのは素晴らしいことです。しかし、プログラマーが他のプログラマーであっても、プログラマーがユーザーの声に耳を傾けると、製品が改善されることがよくあることを実際に知っています。そして、これらの変更を行う効率的な方法には、アイデアを取り上げて実装するプロジェクトに既に取り組んでいる人が含まれます。 ソフトウェア開発の問題を指す一般的な用語がいくつかあります。例:バイクシェッド。「はい、私は世界中のあらゆるものを変更できることを知っています-クローズドソースです。採用され、そのコードを書くことができます。しかし、この場合、私はただ実際にその変更を簡単に行うのにすでに適している別のコーダーに役立つかもしれない、または単に一般的な可能性を議論する観察。 [ps(数日後)-「パッチを提出する」というのは、ひどいユーモアでよく言われ、適切な機知に富んだ対応を求めていることを指摘すべきでした。]
215 open-source 

17
早すぎる最適化は本当にすべての悪の根源ですか?
私の同僚は今日、と呼ばれるクラスをコミットしましたThreadLocalFormat。これは基本的にJava Formatクラスのインスタンスをスレッドローカルに移動します。これらはスレッドセーフではなく、作成するには「比較的高価」です。簡単なテストを作成し、1秒間に200,000個のインスタンスを作成できると計算し、その数を作成するように彼に尋ねました。彼は優れたプログラマーであり、チームの全員が高度なスキルを持っているため、結果のコードを理解するのに問題はありませんが、実際に必要のない場所を最適化する場合でした。彼は私のリクエストに応じてコードをバックアウトしました。どう思いますか?これは「時期尚早な最適化」のケースですか?それは実際にどれほど悪いですか?

6
ES6で「let」と「const」をどれくらい使用する必要がありますか?
最近、io.js用のES6コードをたくさん書いています。学ぶべきコードはそれほど多くないので、自分の慣習を定義しながら進めているように感じます。 私の質問はどのような場合に使用する程度であるconst対let。 私はこのルールを適用しています:可能であれば、を使用しますconst。let値を変更する必要があることがわかっている場合にのみ使用してください。(後で値を変更する必要があることが判明しconstたlet場合は、いつでも戻ってa に変更できます。) この規則の主な理由は、一貫して簡単に適用できることです。灰色の領域はありません。 問題は、このルールを適用すると、実際には宣言の95%がになるということですconst。そして、これは私には奇妙に見えます。私は使用していますletのようなもののためにiではforループ、または時折(実際の生活の中で多くを起動しない)の累積フィボナッチ合計のようなもののために。これには驚きました。これまでのES5コードの「変数」の95%は、変化しない値に対するものでした。しかしconst、コード全体を見ると、どうも間違っているように感じます。 だから私の質問は次のとおりconstです。これだけ使用しても大丈夫ですか?私は本当に次のようなことをすべきconst foo = function () {...};ですか? またはconst、モジュールの最上部にリテラルをハードコーディングしているような状況、つまりフルキャップで行うような状況のために予約する必要がありますconst MARGIN_WIDTH = 410;か?
214 javascript  es6 

5
非常に基本的なコンパイラの書き方
gccコードをコンパイルしたような高度なコンパイラは、コードが記述された言語(C、C ++など)に従って機械可読ファイルにコンパイルします。実際、それらは対応する言語のライブラリと機能に従って各コードの意味を解釈します。私が間違っている場合は修正してください。 非常に基本的なコンパイラ(おそらくCで)を記述して静的ファイル(テキストファイルのHello Worldなど)をコンパイルすることにより、コンパイラをよりよく理解したいと思います。私はいくつかのチュートリアルと本を試しましたが、それらはすべて実用的なケースです。対応する言語に関連付けられた意味を持つ動的コードのコンパイルを扱います。 静的テキストを機械可読ファイルに変換する基本的なコンパイラーを作成するにはどうすればよいですか? 次のステップは、変数をコンパイラーに導入することです。言語の一部の機能のみをコンパイルするコンパイラを作成したいと想像してください。 実用的なチュートリアルとリソースをご紹介いただければ幸いです:-)
214 c  compiler  compilation  gcc 

18
何千ものIF…THEN…ELSEルールをどのように管理できますか?
私はアプリケーションを構築することを検討しています。そのアプリケーションのコアは、数千のif ... then ... elseステートメントで構成されます。このアプリケーションの目的は、あらゆる風景で牛がどのように動き回るかを予測できるようにすることです。彼らは太陽、風、食物源、突然の出来事などの影響を受けます。 このようなアプリケーションはどのように管理できますか?数百のIFステートメントの後、プログラムがどのように反応するかは予測不可能であり、特定の反応につながることをデバッグすると、毎回IFステートメントツリー全体を走査する必要があることを意味すると思います。 ルールエンジンについて少し読みましたが、この複雑さをどのように回避できるかわかりません。

9
テストを書くのに実際のコードと同じくらいの時間を費やすのは普通ですか?
テストは、テストしている実際のコードよりもはるかに複雑で記述しにくいと感じています。テストしているコードよりもテストの作成に多くの時間を費やすことは珍しくありません。 それは正常ですか、何か間違っていますか? 質問「単体テストまたはテスト駆動開発は価値がありますか?」、「システム自体の実装よりも機能テストの実装に多くの時間を費やしていますが、これは正常ですか?」と彼らの答えは、テストに値するかどうかについての詳細です(「テストを完全に省略する必要がありますか?」)。テストは重要だと確信していますが、実際のコードよりもテストに多くの時間を費やすのが普通なのか、それとも私だけなのか疑問に思っています。 受け取った質問の意見、回答、賛成票の数から判断すると、ウェブサイト上の他の質問では扱われていない正当な懸念があると推測できます。

15
なぜプライベート変数が必要なのですか?
クラスにプライベート変数が必要なのはなぜですか? 私が読んだプログラミングに関するすべての本は、これはプライベート変数であると述べています。 これらの説明の言葉遣いは、私たちが本当に自分の職業に信頼の危機を抱えているように思えました。他のプログラマがコードを台無しにしようとしているように、説明は常に聞こえました。しかし、プライベート変数を持たない多くのプログラミング言語があります。 プライベート変数は何を防ぎますか? 特定のプロパティをプライベートにするかどうかをどのように決定しますか?デフォルトですべてのフィールドがプライベートである必要がある場合、クラスにパブリックデータメンバーがあるのはなぜですか? どのような状況で変数を公開する必要がありますか?


16
上司から、小さな関数の作成をやめて、同じループですべてを実行するように頼まれました
Clean Codeという本を読みましたRobert C. Martinによる。この本では、小さな関数の作成、名前の慎重な選択など、コードをクリーンアップするための多くの方法を見てきました。しかし、今日、上司はこの本を読んだ後のコードの書き方が好きではありませんでした。 彼の議論は 小さな関数を書くと、コードが何をしているのかを見るために各小さな関数に移動しなければならないので苦痛です。 メインループが300行を超える場合でも、すべてをメインの大きなループに入れると、読みやすくなります。 コードを複製する必要がある場合にのみ、小さな関数を作成してください。 コメントの名前を使用して関数を記述しないでください。上記のコメントを使用して複雑なコード行(3〜4行)を入力してください。同様に、失敗したコードを直接変更できます これは私が読んだすべてのものに反しています。通常、どのようにコードを記述しますか?1つの大きなループ、小さな関数はありませんか? 私が使用する言語は主にJavascriptです。明確に名前が付けられた小さな関数をすべて削除し、すべてを大きなループに入れたので、今は本当に読みにくいです。しかし、上司はこの方法が好きです。 一例は次のとおりです。 // The way I would write it if (isApplicationInProduction(headers)) { phoneNumber = headers.resourceId; } else { phoneNumber = DEV_PHONE_NUMBER; } function isApplicationInProduction(headers) { return _.has(headers, 'resourceId'); } // The way he would write it // Take the right …

16
ソフトウェアの複雑さを管理するためにオブジェクト指向言語が本当に必要ですか?
これは非常に非技術的でソフトな質問になりますが、これが適切なプラットフォームかどうかはわかりません。しかし、私はCSの始まりの学生なので、皆さんがそれを許容することを願っています。 最初の学期では、JavaやUMLを介して、カプセル化、データ隠蔽、モジュール性、継承などのOOPの概念を紹介しました。(Javaは私の最初のプログラミング言語です) 私の理解では、OOPはソフトウェアの複雑さを管理する方法です。しかし、その原則は新しいものやユニークなものではなく、ある意味ではすべてのエンジニアリング分野に共通しています。 たとえば、車は非常に複雑な構造であり、その複雑さは、明確に定義された動作とインターフェイスを備えたモジュール化されカプセル化されたコンポーネントの階層によって管理されます。 しかし、新しいプログラミングパラダイムを導入した理由はわかりません。複雑さを管理するために使用されるすべての原則は、手続き型プログラミング言語によって実現できると思います。たとえば、モジュール性のために、プログラムを、コードが別々のファイルに含まれる明確に定義されたタスクを実行する多くの小さなプログラムに分割することができます。これらのプログラムは、明確に定義された入力と出力を介して互いに対話します。カプセル化を実現するために、ファイルを保護(暗号化?)することができます。コードを再利用するために、新しいプログラムで必要になったときにいつでもこれらのファイルを呼び出すことができます。これは、OOPが何であるかをすべてキャプチャしないのですか、それとも非常に明白な何かを見逃していますか? OOPが複雑さを管理しているという証拠を求めていません。私の意見では確かにそうです。しかし、モジュール性、カプセル化、データ隠蔽などの複雑さを管理するために使用されるすべての原則は、手続き型言語によって非常に簡単に実装できると思います。それでは、複雑さを管理せずに管理できるのに、なぜ本当にOOPなのでしょうか?

10
コールチェーンのいくつかのレベルでのみ使用される(パラメータを渡す)パターンの名前はありますか?
私はいくつかのレガシーコードでグローバル変数を使用する代替案を見つけようとしていました。しかし、この質問は技術的な選択肢に関するものではなく、私は主に用語について心配しています。 明らかな解決策は、グローバルを使用する代わりに関数にパラメーターを渡すことです。このレガシーコードベースでは、値が最終的に使用されるポイントと最初にパラメーターを受け取る関数の間で、長い呼び出しチェーン内のすべての関数を変更する必要があることを意味します。 higherlevel(newParam)->level1(newParam)->level2(newParam)->level3(newParam) どこnewParam私の例では、グローバル変数以前だったが、それは代わりに、以前にハードコード値だったかもしれません。ポイントは、newParamの値がで取得されhigherlevel()、で「移動」する必要があることlevel3()です。 値を変更せずに「渡す」多くの関数にパラメータを追加する必要があるこのような状況/パターンの名前があるかどうか疑問に思っていました。 うまくいけば、適切な用語を使用することで、再設計のソリューションに関するリソースをさらに見つけ、同僚にこの状況を説明できるようになります。

10
設計パターンにこれほど多くのクラスが必要なのはなぜですか?
私はシニアのジュニア開発者であり、彼らの思考や推論を理解することに苦労しています。 私はドメイン駆動設計(DDD)を読んでいますが、なぜこれほど多くのクラスを作成する必要があるのか​​理解できません。ソフトウェアを設計するその方法に従えば、最大で2つのファイルと3〜4の関数で置き換えることができる20〜30のクラスになります。はい、これは面倒な場合がありますが、ずっと保守しやすく読みやすいです。 ある種のEntityTransformationServiceImpl機能を確認したいときはいつでも、多くのクラス、インターフェース、それらの関数呼び出し、コンストラクター、それらの作成などに従う必要があります。 簡単な数学: 60行のダミーコードと10クラスX 10(このようなロジックはまったく異なるとしましょう)= 600行の乱雑なコードと100クラス+ラップして管理するためのその他のコード。依存性注入を追加することを忘れないでください。 乱雑なコードの600行を読み取る= 1日 100クラス= 1週間 誰もが簡単にメンテナンスできると言っていますが、何のためですか?新しい機能を追加するたびに、ファクトリ、エンティティ、サービス、および値を持つ5つのクラスを追加します。この種のコードの移動は、乱雑なコードよりもずっと遅いように感じます。 たとえば、1か月で50KのLOC乱雑なコードを記述する場合、DDDには多くのレビューと変更が必要です(どちらの場合もテストは気にしません)。1つ追加するだけで1週間以上かかる場合があります。 1年で多くの乱雑なコードを作成し、何度も書き換えることもできますが、DDDスタイルでは、乱雑なコードと競合するための十分な機能がまだありません。 説明してください。このDDDスタイルと多くのパターンが必要なのはなぜですか? UPD 1:たくさんの素晴らしい回答を受け取りました。どこかにコメントを追加したり、リストを読むためのリンクを使って回答を編集してください(DDD、デザインパターン、UML、コード完了、リファクタリング、実用的) ..非常に多くの優れた書籍)、もちろんシーケンスを使用して、理解を開始し、一部の皆さんと同じようにシニアになることもできます。

9
集計と構成
OOPの構成は理解していますが、Aggregationが何であるかを明確に把握することはできません。誰か説明できますか?

6
Haskell型システムをこれほどまでに尊敬する理由は何ですか(たとえば、Java)。
私はHaskellを学び始めています。私は非常に新しいので、基本的な構成を理解するために、オンラインブックを数冊読んでいます。 よく知っている「ミーム」の1つは、「コンパイルすれば機能します*」というもの全体です。これは型システムの強さに関係していると思います。 この点で、Haskellが他の静的に型付けされた言語より正確に優れている理由を理解しようとしています。 別の言い方をすれば、Javaでは、ArrayList<String>()実際にあるべきものを含めるために、埋めるような凶悪なことを行うことができると思い ますArrayList<Animal>()。ここでは凶悪な事はあなたがいることであるstring含まれているelephant, giraffeなどと、誰かが中に入れた場合Mercedes-あなたのコンパイラは、あなたを助けにはなりません。 私は場合はやったんArrayList<Animal>()私は私のプログラムは、それが車についてです、動物については本当にないことにした場合、時間内にいくつかの後の時点で、その後、私は、たとえば、生産機能に変更することができますArrayList<Animal>生成することをArrayList<Vehicle>、私のIDEがどこでも私に教えてくださいコンパイルの中断です。 私の推測では、これは人々が強力な型システムによって意味するものですが、Haskellの方が優れている理由は私には明らかではありません。別の言い方をすれば、良いJavaまたは悪いJavaを書くことができます。Haskellでも同じことができると思います(つまり、実際にファーストクラスのデータ型であるはずの文字列/ intに詰め込みます)。 重要/基本的なものが不足していると思われます。 私のやり方の間違いを見せていただければ幸いです!

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