ソフトウェア工学

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

7
Webのコンテンツを保護して、私がそれを最初に作成したことを保証するアルゴリズムパターンはありますか?
数年前、特定のシステムの脆弱性を完全に開示したハッカーがいた(彼が誰であったか覚えていない)が、誰も信用していないことを確認するために、彼は何らかのPGPキーを作成した。 当時私が理解していたのは、彼がそれを発見した人であることを保証するためのキーを作成したが、実際に誰であるかを開示せず、彼が開示を作成した人であることを証明できるメカニズムを作成したことです。 OK。アルゴリズムと暗号化の仕組みを理解しています。しかし、ウェブで公開された特定のコンテンツを保護するためのキーを作成して、それが最初に作成されたものであることを証明する方法をまだ理解していません!言葉だけです! 本当に可能ですか?経験的に証明できるようにするためのプロセスは何ですか?私はそれを正しく理解しましたか、またはおそらくこのケースに関する何かを見逃しましたか? この質問が十分具体的であることを願っています。基本的には、Webで作成したコンテンツ(段落、コード、単語など)を保護する方法であり、与えられたコンテキスト。 私の知る限り、それがどのように可能かはわかりませんが、実用的な方法があれば興味をそそられます。ある?

7
エラーを早期に「キャッチ」するツールとして例外を使用しても大丈夫ですか?
例外を使用して問題を早期に発見します。例えば: public int getAverageAge(Person p1, Person p2){ if(p1 == null || p2 == null) throw new IllegalArgumentException("One or more of input persons is null"). return (p1.getAge() + p2.getAge()) / 2; } 私のプログラムはnullこの関数を決して渡すべきではありません。私はそれをするつもりはありません。しかし、私たち全員が知っているように、プログラミングでは意図しないことが起こります。 この問題が発生した場合に例外をスローすると、プログラムの他の場所でさらに問題が発生する前に、それを見つけて修正することができます。例外はプログラムを停止し、「ここで悪いことが起こったので修正してください」と言っています。これnullがプログラム内を移動する代わりに、他の場所で問題を引き起こします。 さて、あなたは正しいです。この場合、これはただちにすぐにnull発生するNullPointerExceptionため、最良の例ではないかもしれません。 しかし、たとえば次のような方法を検討してください。 public void registerPerson(Person person){ persons.add(person); notifyRegisterObservers(person); // sends the person object to all kinds of …

5
C ++のスタイルガイド[終了]
現在、C ++コードでGoogle C ++スタイルガイドを使用していますが、非常に満足しています。 最近、このガイドは非常に悪いと言われました。Googleが内部で使用していることは知っていましたが、時代遅れであり、非常に悪い習慣を助長しています。そこで、別のコーディングスタイルを使用したいと思います。 どのような優れた、かなり使用されているC ++スタイルガイドがありますか?私はgccとVisual Studioの両方のコードを記述し、多くのC ++ 11機能を使用しています。 Google C ++ Style Guideで非常に気に入ったのは、インデント、空白、および命名規則(特に、すべてのクラス、タイプ-typedef、タイプエイリアス、テンプレートエイリアスを含む-最初の文字が大文字)です。 私は答えが主観的であることを知っており(このサイトでこれがOKであることを願っています)、どんな意見も感謝しますが、最近使用されているガイドは興味があります。

3
動的言語に本当の利点はありますか?[閉まっている]
まず、Javaが私がこれまでに使用した唯一の言語であると言いたいので、この主題に関する私の無知を許してください。 動的に型付けされた言語を使用すると、任意の変数に任意の値を入力できます。したがって、たとえば次の関数(psuedocode)を作成できます。 void makeItBark(dog){ dog.bark(); } そして、どんな値でも内部に渡すことができます。値にbark()メソッドがある限り、コードが実行されます。それ以外の場合は、ランタイム例外または同様の例外がスローされます。(これについて間違っている場合は修正してください)。 一見、これはあなたに柔軟性を与えます。 しかし、私は動的言語でいくつかの読書をしました。人々が言うことは、動的言語でコードを設計または記述するとき、静的に型付けされた言語と同じように、型について考えて考慮することです。 そのため、たとえばmakeItBark()関数を記述するとき、「 'えるもの」のみを受け入れるように意図しますが、これらの種類のものだけを渡すようにする必要があります。唯一の違いは、間違いを犯したときにコンパイラが通知しないことです。 確かに、このアプローチには1つの利点があります。つまり、静的言語では、「この関数はbarえるものをすべて受け入れる」ことを実現するには、明示的なBarkerインターフェイスを実装する必要があります。それでも、これは小さな利点のようです。 何か不足していますか?動的に型付けされた言語を使用することで実際に得られるものは何ですか?

2
Unixリンカーが「ld」と呼ばれるのはなぜですか
ウェブを検索しようとしましたが、答えが見つかりませんでした。「ロード」と関係があるかもしれませんが、それはあまり意味がありません。 明らかに、「ln」はすでに使用されていますが、「d」はどこから来たのでしょうか?
29 history 

3
なぜC ++のブール型は++をサポートしているのに-ではないのですか?
なぜ演算子--はboolには存在しないのに、演算子には存在しないの++ですか? C ++で試しましたが、質問が他の言語に当てはまるかどうかわかりません。私も知りたいです。 私は知っている、私は++ブールで演算子を使用することができます。boolをtrueに等しくします。 bool b = false; b++; // Now b == true. --反対の方法で演算子を使用できないのはなぜですか? bool b = true; b--; // Now b == false; あまり便利ではありませんが、興味があります。

10
Javaのテンプレート「メタプログラミング」は良いアイデアですか?
非常にパフォーマンスに敏感ないくつかの関数(1秒あたり数百万回と呼ばれる)を持つかなり大きなプロジェクトにソースファイルがあります。実際、以前のメンテナーは、1つの関数で条件のチェックに費やす時間を節約するために、それぞれわずかに異なる関数のコピーを12個書くことにしました。 残念ながら、これはコードが維持するPITAであることを意味します。重複するコードをすべて削除し、テンプレートを1つだけ作成したいと思います。ただし、Java言語はテンプレートをサポートしていないため、ジェネリックがこれに適しているかどうかはわかりません。 私の現在の計画は、代わりに関数の12個のコピーを生成するファイル(実際には1回限りのテンプレート拡張機能)を書くことです。もちろん、ファイルをプログラムで生成する必要がある理由については、豊富な説明を提供します。 私の懸念は、これが将来のメンテナーの混乱につながり、変更後にファイルを再生成するのを忘れると厄介なバグを引き起こす可能性があることです。残念ながら、C ++ですべてを書き直すまで、これを修正する方法はありません。 このアプローチの利点は欠点を上回っていますか?代わりに: パフォーマンスに打撃を与え、単一の保守可能な機能を使用します。 関数を12回複製する必要がある理由の説明を追加し、保守の負担を丁寧に負担します。 ジェネリックをテンプレートとして使用することを試みます(それらはおそらくそのようには動作しません)。 単一の関数にコードをパフォーマンスに依存させるという古いメンテナーに大声で叫ぶ。 パフォーマンスと保守性を維持する他の方法は? PSプロジェクトの設計が貧弱であるため、関数のプロファイリングはかなりトリッキーです...しかし、前のメンテナーは、パフォーマンスの低下は許容できないと私に確信させました。これは彼が5%以上を意味すると思いますが、それは私の側の完全な推測です。 おそらく少し詳しく説明する必要があります。12個のコピーは非常によく似たタスクを実行しますが、わずかな違いがあります。違いは関数全体のさまざまな場所にあるため、残念ながら多くの条件文があります。事実上、6つの操作の「モード」と2つの操作の「パラダイム」があります(自分で作成した単語)。関数を使用するには、操作の「モード」と「パラダイム」を指定します。これは決して動的ではありません。コードの各部分は、厳密に1つのモードとパラダイムを使用します。12のモードパラダイムペアはすべて、アプリケーションのどこかで使用されます。これらの関数には、func1〜func12という適切な名前が付けられ、偶数が2番目のパラダイムを表し、奇数が最初のパラダイムを表します。 保守性が目標であれば、これは最悪の設計であることを認識しています。しかし、それは「十分に速い」と思われ、このコードはしばらく変更を必要としませんでした...元の関数が削除されていないことにも注意する価値があります(ただし、私が知る限り、それはデッドコードです) 、したがって、リファクタリングは簡単になります。

6
「インターフェースへのプログラミング」を理解する
「実装ではなくインターフェースへのプログラミング」という用語に頻繁に出くわしましたが、それが何を意味するのか理解していると思います。しかし、私はそれが利点であり、可能な実装であることを確実に理解したいと思っています。 「インターフェースへのプログラミング」とは、可能な場合、具体的な実装を参照するのではなく、クラスのより抽象的なレベル(インターフェース、抽象クラス、またはある種のスーパークラス)を参照する必要があることを意味します。 Javaの一般的な例は、次を使用することです。 List myList = new ArrayList();の代わりにArrayList myList = new ArrayList();。 これに関して2つの質問があります。 このアプローチの主な利点を確実に理解したいと思います。利点は主に柔軟性だと思います。具体的な実装ではなく、より高レベルの参照としてオブジェクトを宣言すると、開発サイクル全体およびコード全体で柔軟性と保守性が向上します。これは正しいです?柔軟性が主な利点ですか? 「インターフェースへのプログラミング」の方法は他にありますか?または、「具体的な実装ではなく、インターフェイスとして変数を宣言する」がこの概念の唯一の実装ですか? 私はJavaコンストラクトInterfaceについて話しているのではありません。オブジェクト指向の原則「実装ではなく、インターフェイスへのプログラミング」について話しています。この原則では、世界の「インターフェース」とは、クラスの任意の「スーパータイプ」を指します。インターフェース、抽象クラス、またはより具体的なサブクラスよりも抽象的で具体的ではない単純なスーパークラスです。

10
一時的なコードはバージョン管理下に置くべきですか?
一時/ローカルコードの例を次に示します。コードベースを操作するために必要ですが、その一部であると有害です: プロジェクトファイル。現在のPCのレイアウトを反映するために、パスを編集する必要がある場合があります。 メイクファイル。たとえば、デバッグ中は最適化をオフにする必要がありますが、CIサーバーはオフにする必要はありません。 汚いいハッキング。たとえばreturn 7、関数に応じて、関数に応じて何かをテストするために、値7で破損する疑いがある場合、または7はまだ実装されていないボタンのコードです。私のブランチの人生。 リポジトリにプッシュしてからプッシュする前に、常にトップにリベースするgitコミットにそれらを保持しようとしましたHEAD~。これは非常に不便であり、svnでは機能しません。スタッシングは私をさらに怖がらせます-「押した後にポップするのを覚えていましたか??」。 コードをバージョン管理から外すと、コミットがアセンブルされるたびに不快なノイズが発生し、金曜日の夕方に誤ってコミットに導入される可能性があります。 このような使い捨てのコードの正解は何でしょうか?

2
これらの古いLispに対する古い批判のうち、今日でもなお当てはまるものはどれですか?
Common LispのA批判 1984年にスタンフォード大学からのロドニー・ブルックスA.とリチャードP.ガブリエルによって書かれた、いくつかの設計上の決定が議論されているのCommon Lispの正規化委員会によって保持しました。議論の大部分は有効なままですが、その時点で利用可能な技術に言及しており、今日は間違っている可能性がある2つの声明があります。 これらの2つのステートメントは次のとおりです。 言語のコストが多すぎると、「優れたコンパイラーなら誰でも世話をすることができる」という警告で却下されました。誰もまだ書かれていません-また、多大な努力なしに-それが期待されるトリックのほんの一部を行うコンパイラ。 私はCommon Lispの初心者であり、見習いでもあるので、著者よりも具体的になることはできません。彼らは、言語のいくつかの側面に大きな一般性と柔軟性が組み込まれているため、優れたコンパイラーの作成が非常に難しいと述べているようです。 COMMON LISPでは、浮動小数点演算の制御が少なすぎます。確かに、浮動小数点を多用するプログラムの正しい動作は実現できますが、パフォーマンスは大きく異なる場合があります。 私が理解している限りでは、Common Lispで効率的な数値コードを書くことは可能ですが、本来よりも難しいと思われます。 これは30年前です。一般的なフリーソフトウェアの実装(CLISP、SBCLなど)の1つに対してCommon Lispプログラムを作成する場合、今日これらのステートメントをどのように考慮する必要がありますか?

15
現代のコンピューティングの時代、「典型的なビジネスアプリ」-なぜパフォーマンスが重要なのですか?[閉まっている]
これは一部の人にとっては奇妙な質問のように思えるかもしれません。 私は趣味のJavaプログラマーです。いくつかのゲーム、音楽を作成するAIプログラム、ペイント用の別のプログラムなどを開発しました。これは、私がプログラミングの経験を持っているが、ビジネスアプリケーションの専門的な開発の経験がないことを伝えるためです。 このサイトでパフォーマンスについて多くの話を聞いています。多くの場合、タスクを実行するためにC#で最も効率的なアルゴリズムとは何か、Pythonが低速でJavaが高速な理由などについて議論されています。 私が理解しようとしているのは、なぜこれが重要なのですか? パフォーマンスが重要な理由がわかるコンピューティングの特定の領域があります:ゲーム、一定の更新ループで毎秒何万もの計算が行われている、OSやVMなどの他のプログラムが依存している低レベルシステム しかし、通常の典型的な高レベルビジネスアプリの場合、なぜパフォーマンスが重要なのでしょうか? 何十年も前に、なぜそれが重要であったのかを理解できます。コンピューターは非常に遅く、メモリもはるかに少なかったため、これらのことについて慎重に考える必要がありました。 しかし、今日、私たちには非常に多くのメモリがあり、コンピューターは非常に高速です:特定のJavaアルゴリズムがO(n ^ 2)であるかどうかは実際に重要ですか?この典型的なビジネスアプリのエンドユーザーに実際に違いをもたらすのでしょうか? 典型的なビジネスアプリでGUIボタンを押すと、背後でO(n ^ 2)アルゴリズムが呼び出されますが、最近のコンピューティングの時代では、実際に非効率を感じていますか? 私の質問は2つに分かれています。 実際、今日の典型的な通常のビジネスプログラムではパフォーマンスは重要ですか? もしそうなら、パフォーマンスと最適化が重要なそのようなアプリケーションの場所の実世界の例を教えてください。

1
Inglishパーサー(Hobbit 1982用)
「Inglish」と呼ばれる信じられないほど堅牢なパーサーを備えたテキストアドベンチャーゲームThe Hobbitについて読むことに魅了されました。 ... Inglishは、「ガンダルフに好奇心の強い地図について尋ねてから、剣を持ってトロールを殺す」などの高度な文を入力することを許可しました。パーサーは複雑で直観的で、代名詞、副詞(「悪意を持ってゴブリンを攻撃する」)、句読点、前置詞を導入し、これまで不可能だった方法でプレイヤーがゲームの世界とやり取りできるようにしました。 Inglishパーサーエンジンとそれを開発したプログラマーの歴史および/または遺産について誰か知っているかどうか疑問に思っています。

1
アジャイル開発者として「SMART」目標を書く方法は?
多くの企業と同様に、私が働いている会社は、SMARTの目標に基づいたパフォーマンスレビューシステムに移行しています。私のチームは、Extreme Programmingのプラクティスを採用した高機能でアジャイルな開発チームです。私たちの大きな利益のために、私たちのアジャイルプラクティスの採用は、直属の管理職の完全なサポートを持っています。 作業を完了するために、私たちのチームは3週間の反復を利用します。即時の反復を超えて、四半期ごとに一般的な計画を立てています。これから数四半期で達成したことは、当四半期で達成することよりもはるかに厄介であることを意味します。私たちのプロジェクトがどこに向かっているのかは確かに一般的な考えを持っていますが、ここでのキーワードは一般的です。 私自身を含む私のチームのプロジェクト計画メンバーへのアプローチを考えると、具体的、測定可能、達成可能、関連性、および時間制限(SMART)の目標を書くことは難しいと感じています。 SoftwareEngineering.seに関する2つの既存の質問は、私たちの懸念のいくつかに対処するのに適しています。 プログラマーにとって良いSMART目標の例は何ですか? SMARTの目標はプログラマにとって有用ですか? ただし、アジャイル開発チームで作業する場合、質問はSMART目標を処理するための詳細よりも一般的な回答を引き出しました。アジャイル開発者として、具体的、測定可能、達成可能、関連性があり、時間制限のある5〜7年間の目標をどのように記述しますか?

3
Redisでメッセージキューを実装する方法は?
キューイングにRedisを使用する理由 私は、Redisがキューイングシステムを実装するための良い候補になることができるという印象を受けています。これまで、MySQLデータベースをポーリングまたはRabbitMQで使用してきました。RabbitMQには多くの問題があります。クライアントライブラリは非常に貧弱でバグが多いため、修正に開発者の時間をかけすぎないように、サーバー管理コンソールにいくつかの問題があります。少なくとも、ミリ秒で把握したり、パフォーマンスを真剣に推進したりすることはないので、システムがキューをインテリジェントにサポートするアーキテクチャを備えている限り、おそらく良好な状態にあります。 さて、それが背景です。基本的に、非常に古典的でシンプルなキューモデルがあります。仕事を生成する複数のプロデューサーと、仕事を消費する複数のコンシューマーがあり、プロデューサーとコンシューマーの両方がインテリジェントにスケーリングできる必要があります。すべてのサブスクライバーに作業を消費さPUBSUBせたくないので、ナイーブが機能しないことがわかります。1人のサブスクライバーに作業を受け取りたいだけです。最初のパスでは、インテリジェントデザインのように見えます。BRPOPLPUSH BRPOPLPUSHを使用できますか? 基本的な設計でBRPOPLPUSHは、1つの作業キューと進行状況キューがあります。コンシューマーが作業を受け取ると、アイテムをアトミックに進行キューにプッシュし、作業を完了するとそれが完了LREMします。これにより、クライアントが死んだ場合の作業のブラックホール化が防止され、監視が非常に楽になります。たとえば、大量のタスクがあるかどうかを通知するだけでなく、消費者がタスクを実行するのに長時間かかる問題があるかどうかを確認できます。 それは保証します 仕事はちょうど1人の消費者に届けられる 作業は進行キューで終了するため、消費者がブラックホールに陥ることはありません 欠点 私が見つけた最高のデザインはPUBSUB、Redisのキューイングに関するほとんどのブログ投稿が焦点を当てているものであるように思われるため、実際には使用していません。だから、私は明白な何かを見逃しているように感じます。PUBSUBタスクを2回消費せずに使用する唯一の方法は、作業が到着したという通知をプッシュするだけで、消費者はそれをブロックしないようにできRPOPLPUSHます。 一度に複数のワークアイテムを要求することはできません。これはパフォーマンスの問題のようです。私たちの状況にとっては大きなものではありませんが、この操作は高スループットまたはこの状況のた​​めに設計されたものではないことを明確に示しています 要するに、私は愚かな何かを見逃していますか? node.jsタグも追加します。これは、私が主に扱っている言語だからです。Nodeは、シングルスレッドでノンブロッキングな性質を考えると、実装のいくつかの単純化を提供するかもしれませんが、さらに、node-redisライブラリとソリューションを使用しています。

5
これは、アルゴリズムの「Big O」表記を識別するための適切な「ルール」ですか?
Big O Notationと、アルゴリズムの記述方法に基づいてBig O Notationを計算する方法についてもっと学びました。アルゴリズムのビッグO表記を計算するための興味深い「ルール」セットに出会い、正しい軌道に乗っているかどうかを確認したいと思いました。 ビッグO表記:N function(n) { For(var a = 0; i <= n; i++) { // It's N because it's just a single loop // Do stuff } } ビッグO表記:N 2 function(n, b) { For(var a = 0; a <= n; a++) { For(var c = 0; i …
29 algorithms  big-o 

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