ソフトウェア工学

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

4
認証にサードパーティ(つまり、Google、Facebook、Twitter)を使用するRESTful Webサービスをどのように設計すればよいですか?
私の仕事のために、私たちが持っているいくつかのウェブサイトを動かすために使用する素敵なRESTfulウェブサービスがあります。基本的に、Webサービスを使用すると、サポートチケットを作成および操作でき、Webサイトがフロントエンドを担当します。Webサービスリクエストでは、認証ヘッダーを使用します。このヘッダーを使用して、呼び出しごとにユーザーとパスワードを検証します。 今年は、Webサイト上のユーザーがGoogle、Twitter、Facebook(おそらく他のユーザー)経由でログインできるように、ログインオプションを拡張することを検討しています。ただし、Webサービスがサードパーティの認証プロバイダーを使用して、ユーザーが本人であることを確認できるように、これをどのように設計するかについて多くの問題を抱えています。これを行うためのベストプラクティスはありますか? 現在、Webサイトでユーザー自身の認証を処理してから、現在のセッションをWebサービスバックエンドに登録する新しいsetSessionId呼び出しを使用することを考えています。Webサービスへの追加の各リクエストは、そのセッションIDを渡し、検証します。これらは大丈夫のように見えますが、私はこれを考えていないという私の頭の後ろの感覚を持っています、そして私のすべてのフォーラムの閲覧とoauthとopenidの仕様を読んでいるだけでもっと混乱させられます。これに取り組む方法のヒントはありますか?

6
TDDとバージョン管理
現在、TDDについて学び、個人プロジェクトでTDDを実践しようとしています。また、これらのプロジェクトの多くでバージョン管理を広範囲に使用しました。私は、特にコミットを小さく保つという格言に関しては、典型的なワークフローにおけるこれら2つのツールの相互作用に興味があります。ここに思い浮かぶいくつかの例があります: 新しいプロジェクトを開始し、まだ存在しないクラスを作成する簡単なテストを作成します。テストがコンパイルされない場合でも、クラスを作成する前にテストをコミットする必要がありますか?または、コミットする前にテストをコンパイルするために必要な最小限のコードをスタブアウトする必要がありますか? バグを見つけ、テストを作成して再作成します。失敗したテストをコミットするか、バグ修正を実装してからコミットする必要がありますか? これらは、すぐに思い浮かぶ2つの例です。回答に追加の例を提供してください。 編集: 両方の例で、テストを書いた直後にテストをパスするコードを書くと仮定しました。別の状況も発生する可能性があります。私は、コミットせずに数時間TDDを使用してプロジェクトに取り組んでいます。最終的にコミットするとき、作業を小さなチャンクに分割します。(Gitは、1つのファイルの一部の変更のみをコミットしたい場合でも、これを比較的簡単にします。) これは、私の質問は、いつコミットするかということと同じくらいコミットすることに関することを意味します。

10
API設計:具体的アプローチと抽象的アプローチ-ベストプラクティス?
システム間で(ビジネスレベルで)APIについて議論するとき、チームには2つの異なる視点があります。一般的な抽象アプローチを好む人もいれば、そうでない人もいます。 例:単純な「個人検索」APIの設計。具体的なバージョンは searchPerson(String name, boolean soundEx, String firstName, boolean soundEx, String dateOfBirth) 具体的なバージョンを支持する人々は言う: APIは自己文書化されています わかりやすい 検証は簡単です(コンパイラーまたはWebサービスとして:スキーマ検証) キッス 私たちのチームの他のグループは、「これは単なる検索条件のリストです」と言うでしょう。 searchPerson(List<SearchCriteria> criteria) と SearchCritera { String parameter, String value, Map<String, String> options } おそらくいくつかの列挙型の「パラメータ」を作成します。 支持者は言う: API(の宣言)を変更することなく、実装は変更できます。たとえば、基準やオプションを追加します。展開時にそのような変更を同期しなくても。 具体的なバリアントでもドキュメントが必要です スキーマ検証は過大評価されており、多くの場合、さらに検証する必要があります。スキーマはすべてのケースを処理できません 別のシステムと同様のAPIが既にあります-再利用 反論は 有効なパラメーターと有効なパラメーターの組み合わせに関する多くのドキュメント 他のチームにとって理解するのがより難しいので、より多くのコミュニケーション努力 ベストプラクティスはありますか?文献?

7
いつ仕事を止めて道具を作るべきですか?
ソフトウェアエンジニアとして、私たちは常に生産性を高める効果的なツールを手に入れたいと思っています。そして、日々の作業では、既存のツールに満足できないことがよくあり、退屈な作業を自動化するための、より優れたGDBスクリプト設定、Vimスクリプト、およびPythonスクリプトなどのより良い方法が必要です。 ただし、ツールを作成するには時間とエネルギーも必要になるため、実際にはトレードオフになります。すぐに生産性が向上するわけではありません。したがって、仕事をやめ、将来の痛みを和らげるためのツールを作成する時かどうかをどのように判断しますか?

2
Chris Okasakiの1996年の論文と1999年の本、Purely Functional Data Structuresの内容の違いは何ですか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 4年前に閉鎖されました。 純粋に機能的なデータ構造を読みたい。私は簡単に論文(PDFとして無料で入手可能)を見つけましたが、書籍も入手できることを確認します。ですから、これらの2つの出版物の違いがあれば、それが何かを知りたいと思います。


8
バグを再現する責任
私は別のプログラマーが作成したライブラリーを使用してプログラムを開発しています(彼は同じ会社で働いています)。最近、ライブラリのリークを発見しました。これは、数時間実行した後、特定のネットワーク条件下で発生します。このリークを発生させる条件の説明を記載したバグを提出しました。その開発者は、「これは十分ではありません」、「バグを再現するのは彼の責任ではありません」と答え、このバグを再現するためにユニットテストを作成する必要があります。 彼は正しいですか? この状況でできることは何ですか?ユニットテストの作成は、ネットワークのランダムなタイミングに依存するため不可能です。

7
ソフトウェアの再利用はプロセスの再現性を妨げますか
問題としてのコードの再利用 私が考えていたこの質問ソフトウェア・デリバリーに、私は問題に戻って来るまま再現性および/または再現。プロジェクトを繰り返さないと、プロジェクトのビルドに使用したプロセスを改善することが難しくなるためです。エンジニアリングでは、高品質のプロジェクトを作成するために、設計と建設に関連するプロセスを絶えず改善する必要があります。 ソフトウェアは、そのデジタル形式のために再利用に大きく依存できます。モジュールを書き換える代わりに、もう一度呼び出すか、他のシステムにコピーします。いくつかの例は、認証/ログインまたはおそらくロギング機能です。これらのカテゴリには多くのよく知られた例があります。そして、従来の知恵は、あなた自身のものを転がす代わりに存在するものを再利用することです。 他の分野とのいくつかの比較 建設 対照的に、物理システム(建物、橋)の建設は、再利用できるほど近くはありません。家の設計図を何度も再利用して同じ家のコピーを作成できることは事実ですが、そのたびに建設を実行する必要があります。アナログの世界では、カットアンドペーストはそのようには機能しません。橋の設計図は、サイトの条件が異なるため、住宅よりも再利用性が低くなります。 マスタービルダーは、その地域で数十、数百、または数千のものを設計および/または構築したことで知られる専門家です。たとえば、世界的に有名な建築家およびデザイナーであるフランク・ロイド・ライトdesigned more than 1,000 structures and completed 532 works。「ちょうど」5つの言語(Turbo Pascal、Delphi、J ++、C#、Typescript)を設計したAnders Hejlsbergとは対照的です。ドメインが異なるため、多くの点で不公平な比較です。しかし、大まかに言って、2人の非常に知的な人からの定量化可能な作品は大きく異なります。 武道 武道家は、動きの習得は数千の繰り返しからのみ来ると言うでしょう。これらの繰り返しのかなりの部分が投入された後、多くの武道家は、以前は複雑な型または形であると認識されていたことが単純になったことに驚いています。それらの学生のインストラクターは、動きがより流動的で意図的であり、動きが経済的であることにも気付くでしょう。同様に、経験豊富な武道家は、経験の少ない学生よりも複雑なカタをより速く拾うことができます。繰り返しの経験から、より迅速に学習できるフレームワークまたはプロセスが得られました。 木工 木工労働者も同様の変化を経験します。趣味の木材職人は、多くの引き出しを必要とする最初のプロジェクトを常に参照しています。彼らがプロジェクトを完了すると、彼らは組立ラインが生み出す効率性に新たな評価を得ることができます。木材を最大限に活用するために、シートストックに引き出し部品をレイアウトする方法をよりよく理解するなど、他の利点もあります。愛好家と比較して、プロの木材労働者は、以前に何度も作ったアイテムをより迅速に設計、開始、および構築することができます。彼らはまた、他の誰かの設計に内在する問題を自分の仕事でその間違いを犯したことを見る能力を得ます。 それで、ソフトウェアの再利用はソフトウェア開発者がより熟練するのを妨げますか? 多くの点で、ソフトウェアの設計と構築は常に新しいものです。モジュール、ライブラリ、またはシステムを再利用できる場合は、再利用できるため、過去の作業を繰り返すことはありません。ゼロから全体を書き換える前に、既存のシステムを優先的に拡張します。しかし、繰り返しにより、設計と構造の効率を見つけることができます。スポーツや身体活動を実践したことがある人なら誰でも、繰り返しが良い開業医になるための鍵であることを教えてくれます。 私の質問:ソフトウェアの再利用能力は、プロジェクトを繰り返すことから生じる必要なプロセスの改善と効率を妨げますか?

7
ビルドがほとんど常に壊れているときに効率を維持する方法
私は同じソースコードを共有し、継続的に統合されている中規模のチームで働いていますが、私たち全員が同じブランチで作業しなければならないため、ビルドはほとんど常に壊れています。 また、壊れたビルドを軽減するために最近導入されたルールもあります。これは、ビルド中は誰もチェックインできないことを示しています。 そうは言っても、1日の間に誰もがチェックインできる10〜15分のウィンドウを持っています。 チームが成長するにつれて、チェックインの機会の窓はさらに小さくなります。そのため、開発者は変更をローカルに蓄積する必要があり、その結果、変更セットが大きくなり、変更が何も破壊しないことを保証するのがさらに難しくなります。悪循環を見ることができます。 このような環境で私が効果的に仕事を続けられるようにするために何をお勧めできますか。また、私はマネージャーではなく開発者であり、プロセスや他の人の行動をあまり変更できないことに注意してください。

4
APIを作成するとき、小さな関数と多くの呼び出し、またはいくつかの呼び出しと大きな関数に固執する必要がありますか?
私が管理しているRailsプラットフォームがあります。その上に構築された多くの異なるWebアプリケーションがあります。ただし、現在、クライアントは、ユーザーがサイトにアクセスできるようにするためにAPIを要求していますが、自動化されたタスクの一部を利用しています。 このプラットフォームは、保険アプリケーションを構築するために使用され、オンラインでの購入を可能にし、保険契約に関連するドキュメントをダウンロードする方法を提供します。 APIを構築するときの私の質問は次のとおりです。 私は多くのことをしなければならない場合は、のようなvalidate、作成user、user profileおよびpolicy、ほとんど同時に。4つの別々のAPI呼び出しを行い、クライアントに4つの呼び出しをビルドさせる必要があります。または、多くのパラメータを除いて、クライアントを検証し、これらの3つすべてを同時に作成し、クライアントの物事を単純化する1つの呼び出しが必要ですか? この場合、クライアントは必要な情報をすべて同時に取得するため、アプリケーションに自然なフローがあり、一時停止してプラットフォームにAPI呼び出しを行うことができないようです。 以前は多くのAPIを使用してクライアント側にいたことがありますが、私の直感は、クライアントにとってできるだけ単純にし、1回だけ呼び出しを行うことです。ただしfunctions、これによりAPI がかなり大きくなり、私もどちらのファンでもありません。 私はこれに取り組むことをどのように提案しますか? 注として、私はクライアント側で複雑なAPIを実装する能力にあまり自信がありません。

4
このXOR値スワップアルゴリズムはまだ使用中または有用ですか
私が最初に働き始めたとき、メインフレームのアセンブラープログラマーは、以下の従来のアルゴリズムを使用せずに値にスワップする方法を示しました。 a = 0xBABE b = 0xFADE temp = a a = b b = temp 彼らが2つの値を交換するのに使用したもの-ビットから大きなバッファまで-は: a = 0xBABE b = 0xFADE a = a XOR b b = b XOR a a = a XOR b 今 b == 0xBABE a == 0xFADE 3番目の一時保持スペースを必要とせずに2つのオブジェクトの内容を交換しました。 私の質問は次のとおりです。このXORスワップアルゴリズムはまだ使用されており、どこに適用できるのでしょうか。
25 algorithms 


4
なぜgitは競合せずに隣接する行をマージしないのですか?
私は最近、gitで2つのブランチをマージするときに、2つの隣接する行に変更がある場合、gitがこれを競合と宣言することを学びました。たとえば、ファイルtest.txtに次のコンテンツがある場合: Line 1: A Line 2: B Line 3: C Line 4: D ブランチでmasterはこれを Line 1: A Line 2: B1 Line 3: C Line 4: D ブランチでtestingはこれを Line 1: A Line 2: B Line 3: C1 Line 4: D その後、マージしようとするとtestingにmaster、Gitはマージ競合を宣言します。私の素朴な期待は、マージが競合せずに発生し、これをもたらすことでした: Line 1: A Line 2: B1 Line 3: C1 Line …
25 git  merging 

7
HTML5、ネイティブおよびハイブリッドモバイルアプリのアプローチの長所と短所は何ですか?
モバイルアプリケーションを開発したい。最近、Telerik Forumの記事を読みました。この記事では、3種類のモバイルアプリケーションを比較していますが、どちらを選択すればよいかわかりません。以下は、さまざまなモバイルデザインの選択の長所と短所を説明する画像です。 これらの設計の選択を決定するために、図にリストされている各アーキテクチャの選択の長所と短所をよりよく理解したいと思います。各アーキテクチャアプローチの長所と短所は何ですか?

1
Clojureデスクトップアプリの出荷は現実的ですか?
現在、デスクトップJavaアプリケーションを出荷しています。これは単純な古いJava 5 Java / Swingアプリであり、これまでのところすべてがうまく機能しました。一部のユーザーは、Java 6を使用しないOS Xバージョン/コンピューターを使用していたため、Java 5がターゲットになりました(この制限をすぐに解除し、新しいJavaに切り替えて、Java 5で動かなくなったユーザーを単に放棄する可能性があります)。 私はClojureにすぐに慣れていますが、まだClojure-to-JavaおよびJava-to-Clojureの多くを実際に実行していないため、Javaアプリケーションの代わりにClojureデスクトップアプリケーションを出荷するのが現実的かどうか疑問に思いました? 私が出荷しているアプリケーションは現在、すべての.jarで約12 MBであるため、Clojureを追加してもそれほど大きな問題にはなりません。 私の計画は、ClojureがJava APIを呼び出すようにすることです。私のアプリケーションはすでにいくつかの独立したjarに分割されています。 ClojureをJavaから正しく呼び出すことがClojureからJavaコードを呼び出すよりも難しいことを理解しているので、基本的にすべてのUIを書き換えます(UIの一部、Swingコンポーネントと自作のBufferedImagesの混合は、上昇のためにとにかく書き換える必要があります)網膜ディスプレイの)、およびClojureからのすべての「配線」を行います。 それが私が直面している問題です。Clojureデスクトップアプリを出荷するのは現実的ですか?(確かにそれほど普及しているようには見えませんが、プレーンなJavaデスクトップアプリを出荷することはそれほど一般的ではなく、私はとにかくやっています) 技術的には、何をする必要がありますか?(Javaアプリの出荷と比較して)

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