ソフトウェア工学

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

6
Javaチェック例外の回避策
ラムダとデフォルトのメソッドインターフェースに関する新しいJava 8の機能に感謝します。それでも、私はまだチェックされた例外に飽きています。たとえば、オブジェクトのすべての表示フィールドを一覧表示するだけの場合は、単に次のように記述します。 Arrays.asList(p.getClass().getFields()).forEach( f -> System.out.println(f.get(p)) ); ただし、getメソッドはConsumerインターフェイスコントラクトに同意しないチェック例外をスローする可能性があるため、その例外をキャッチして次のコードを記述する必要があります。 Arrays.asList(p.getClass().getFields()).forEach( f -> { try { System.out.println(f.get(p)); } catch (IllegalArgumentException | IllegalAccessException ex) { throw new RuntimeException(ex); } } ); ただし、ほとんどの場合、例外をaとしてスローし、RuntimeExceptionコンパイルエラーなしで例外をプログラムに処理させるかどうかを許可します。 それで、私はチェックされた例外の迷惑のための私の物議を醸す回避策についてあなたの意見を持ちたいです。そのために、次のように補助インターフェイスConsumerCheckException<T>とユーティリティ関数rethrow(Dovalのコメントの推測に応じて更新)を作成しました。 @FunctionalInterface public interface ConsumerCheckException<T>{ void accept(T elem) throws Exception; } public class Wrappers { public static <T> Consumer<T> rethrow(ConsumerCheckException<T> c) …

9
(ウォーターフォール)クライアントにアジャイル開発を販売する方法
私たちの開発ショップはもっとアジャイルなプロジェクトを本当にやりたいと思っていますが、クライアントを乗せるのに問題があります。多くのクライアントは、予算と期限を望んでいます。競合他社がウォーターフォールベースの固定期限と固定価格を考え出すとき、アジャイルプロジェクトでクライアントを売るのは難しいです。固定数が悪いことはわかっていますが、クライアントはそれを知りません。そのため、価格や期限を修正することはできませんが、競合他社は修正できるため、クライアントにとって見栄えが悪くなります。 それでは、アジャイル開発手法を使用するプロジェクト、またはそのような手法を使用して開発された製品を販売チームに成功させるにはどうすればよいでしょうか?私が見つけたすべての情報は、プロジェクト管理と開発者に焦点を当てているようです。
49 agile 

1
Goに「新しい」機能があるのはなぜですか?
なぜnewGoに参加したのか、まだ戸惑っています。 構造体をインスタンス化したいときは、 t := Thing{} すると、新しいインスタンスへのポインタを取得できます t := &Thing{} しかし、この可能性もあります: t := new(Thing) この最後のものは、他の言語とは少し違うようです。&Thing{}と同じくらい明確で簡潔でnew(Thing)あり、他の場所でよく使用する構成体のみを使用します。また、&Thing{3}またはに 変更する可能性があるため、より拡張可能です&Thing{Feets:7}。 私の意見では、補助キーワード1を使用するとコストがかかり、言語がより複雑になり、知っておくべきことが追加されます。そして、構造体のインスタンス化の背後にあるものを、新規参入者に隠すかもしれません。 また、もう1つ予約語を作成します。 それでは、背後にある理由はnew何ですか?それは時々便利ですか?それを使うべきですか? 1:はい、文法レベルではキーワードではないことを知っています。シャドウできますが、合理的な開発者にとって予約語であるという事実は変わりません。
49 go 

12
WCFとWeb APIの技術的な議論を管理するにはどうすればよいですか?
私は現在15人の開発者から成るチームを管理していますが、WCFとWeb APIの使用について議論している2つの完全に反対のチームに分かれる技術を選択する段階で立ち往生しています。 Web APIの使用をサポートするチームAは、次の理由を提示します。 Web APIは、サービスを記述するための単なる最新の方法です(ウィキペディア) WCFはHTTPのオーバーヘッドです。TCP、Net Pipes、およびその他のプロトコルのソリューションです [DataContract]&[DataMember]およびそれらの属性のため、WCFモデルはPOCOではありません SOAPはJSONほど読みやすくて便利ではありません SOAPは、JSON(HTTPを介したトランスポート)と比較してネットワークのオーバーヘッドです メソッドのオーバーロードなし WCFの使用をサポートするチームBは次のように述べています。 WCFは複数のプロトコルをサポートします(構成を介して) WCFは分散トランザクションをサポートします WCFには多くの良い例と成功事例があります(Web APIはまだ若いです) デュプレックスは双方向通信に最適です この議論は継続しており、今何をすべきかわかりません。個人的には、正しい使用場所にのみツールを使用すべきだと思います。言い換えれば、HTTP経由でサービスを公開したいが、TCPとDuplexの場合はWCFを使用する場合は、Web APIを使用した方がよいでしょう。 インターネットを検索しても、確実な結果を得ることができません。WCFをサポートするための多くの投稿がありますが、それどころか、人々がそれについて不満を持っていることもわかります。この質問の性質は議論の余地があるように聞こえるかもしれませんが、決定するにはいくつかの良いヒントが必要です。偶然テクノロジーを選択すると、後悔する可能性があります。目を開いて選びたい。 私たちの使用は主にWebのためであり、HTTP経由でサービスを公開します。場合によっては(たとえば5〜10%)、分散トランザクションが必要になる場合があります。 私は今どうすればいい?この議論を建設的な方法で管理するにはどうすればよいですか?
49 wcf  decisions  web-api 

4
GithubとHerokuを使用する場合、機密データはどのように処理されますか?
私はまだGitの動作に慣れていません(Linus以外の誰かが;)かどうか疑問に思っています)。 Herokuを使用してアプリケーションをホストする場合、Gitリポジトリでコードをチェックする必要があります。オープンソースプロジェクトで作業している場合、このリポジトリをGithubまたは他のGitホストで共有する可能性が高くなります。 パブリックリポジトリで確認すべきでないものもあります。データベースパスワード、APIキー、証明書など。ただし、これらをコードをHerokuにプッシュするために使用するため、Gitリポジトリの一部である必要があります。 このユースケースの使用方法 注:HerokuまたはPHPFogはサーバー変数を使用してこの問題を回避できることを知っています。私の質問は、コードの一部を「隠す」方法についてです。
49 git  github  heroku 

7
forループでセミコロンとコンマが交換されるのはなぜですか?
多くの言語(CからJavaScriptまでの幅広いリスト): ,引数をコンマで区切る(例func(a, b, c)) セミコロンで;区切られた順次命令(例instruction1; instruction2; instruction3)。 したがって、同じ言語のforループでこのマッピングが逆になっているのはなぜですか: for ( init1, init2; condition; inc1, inc2 ) { instruction1; instruction2; } 代わりに(私にとってより自然に見えるもの) for ( init1; init2, condition, inc1; inc2 ) { instruction1; instruction2; } ? 確かに、for(通常は)関数ではなく、引数(すなわちinit、condition、increment)より、関数の引数のような一連の命令よりも動作します。 それは歴史的な理由/慣習によるものですか、それともループの交換,と;ループの良い根拠がありますか?

10
「適切な」プログラミングはもはや重要ではありませんか?
暇なときにAndroidゲームを作成しています。libgdxライブラリを使用しているので、かなり面倒な作業が行われます。 開発中に、いくつかの手順で不注意にデータ型を選択しました。連想配列に近いものが欲しかったため、ハッシュテーブルを使用しました。人間が読めるキー値。同様のことを達成する他の場所では、ベクトルを使用します。libgdxにはvector2およびvector3クラスがありますが、それらを使用したことはありません。 奇妙な問題に遭遇し、Stack Overflowでヘルプを検索すると、特定のデータ型が技術的に「適切」である場合に、特定のデータ型を使用する質問を多くの人がリーミングしています。ArrayListを使用するのと同様、定義済みの境界を必要としないため、新しい既知の境界でint []を再定義します。または、次のような些細なことでも: for(int i = 0; i < items.length; i ++) { // do something } 私はそれがすべての反復でitem.lengthを評価することを知っています。ただし、アイテムが15〜20個を超えることはありません。したがって、繰り返しごとにitems.lengthを評価する場合は注意が必要ですか? いくつかのテストを実行して、先ほど説明した方法と適切な方法を使用してアプリがどのように動作するかを確認し、チュートリアルに従って、コミュニティから提案された正確なデータ型を使用しました。結果:同じこと。平均45 fps。電話とgalaxyタブですべてのアプリを開きました。変わりはない。 だから私はあなたへの私の質問はこれだと思う:それは適切であることがもはや重要ではないときにしきい値はありますか?「仕事をやり遂げる限り、私は気にしませんか?」と言っても大丈夫ですか?

6
(優先度など)のgithubの問題を管理する方法は?[閉まっている]
私はgithubが初めてで、問題の管理方法に関するアドバイスを探しています。私は優先順位やその他の順序付けオプションを持っていることに慣れていますが、どれも存在しないことがわかります。 他の人はバグ/機能のライフサイクル中にどのように問題を管理しますか? 前もって感謝します。

9
LinuxでのC ++およびC開発用のIDEの比較:KDevelop、Eclipse、NetBeans、CodeBlocks、およびAnjuta [非公開]
LinuxでのフルスケールIDEの経験に注目したいと思います。 私は個人的に主に仕事をしていますがvim、他のプログラマは本当のIDEを見たいと思っています。だから私は、次のコンテキストで、異なるIDEとそれらの間の比較についてのあなたの個人的な意見を聞きたいです。 C ++および多分C開発(Java、Pythonおよび他のものではない) サーバー側のプログラミング(GUI開発は不要) 「クロスプラットフォーム」開発ではなく、Linuxで作業しています。 意見が必要です: どのくらい安定していますか?IDEがクラッシュした場合、必要ありません。 使いやすい。 デバッグに強力です。 さまざまなビルドシステムとの統合 巨大なプロジェクト(数十万行のコードのプロジェクト)に対するスケーラビリティ 私はかつてKDevelopで働いていましたが、非常に素晴らしいIDEであり、KDevelop 4は大きな進歩を遂げているようです。また、多くの人がむしろNetbeansとEclipseを使用しているようです。
49 c++  ide  linux 

9
「教えてはいけない」が良いオブジェクト指向とみなされる方法の説明
このブログ投稿は、いくつかの賛成票とともにHacker Newsに投稿されました。C ++から来るこれらの例のほとんどは、私が教えてきたものに反するようです。 例#2など: 悪い: def check_for_overheating(system_monitor) if system_monitor.temperature > 100 system_monitor.sound_alarms end end 良い対: system_monitor.check_for_overheating class SystemMonitor def check_for_overheating if temperature > 100 sound_alarms end end end C ++でのアドバイスは、カプセル化を増やすため、メンバー関数ではなくフリー関数を好むことです。これらは両方とも意味的に同一なので、なぜより多くの状態にアクセスできる選択肢を好むのでしょうか? 例4: 悪い: def street_name(user) if user.address user.address.street_name else 'No street name on file' end end 良い対: def street_name(user) user.address.street_name end …

11
自動テストの欠点は何ですか?
このサイトには、自動テストから得られる利点に関する多くの情報を提供する多くの質問があります。しかし、私はコインの反対側を表すものを見ませんでした:欠点は何ですか?人生のすべてはトレードオフであり、特効薬はありませんので、自動テストを行わない正当な理由が必ずあるはずです。彼らは何ですか? ここに私が思いついたいくつかがあります: 特定の機能に対して初期開発者の時間がさらに必要です チームメンバーの高いスキルレベルが必要 ツールのニーズを増やす(テストランナー、フレームワークなど) 失敗したテストが発生した場合に必要な複雑な分析-このテストは私の変更により廃止されたのですか、それとも間違いを犯したと言っているのですか? 編集 私は自動化されたテストの巨大な支持者であると言っておくべきであり、私はそれをすることを納得させるつもりはありません。欠点が何なのかを理解したいと思っているので、会社に行って主張するとき、次の想像上の銀の弾丸を投げているようには見えません。 また、上記の私の例に異議を唱える人を探していないことを明確にしています。私は、いくつかの不利な点(すべてにトレードオフがある)がなければならないことを真実と考えており、それらが何であるかを理解したいと思います。

21
未完成度以上の長年の経験?[閉まっている]
現在、私は就職年であり、素晴らしいソフトウェア開発会社で働いています。大学を通じてこの段階に到達し、十分な学業経験と年間の配置を取得し、学位を取得する必要なくフルタイムのプログラミングの仕事を得ようと常に考えていました。大学の環境全体が本当に好きではなかったので、私は早い段階からこれを決めました。私は大学でとても不幸でしたし、今は自分のプレースメントの年にいるのでとても幸せです、私は戻って行くことができるかどうか本当に知りません。 私の質問は、就職年度の後に他の仕事に応募し、学位を取得しなかったことで罰せられない場合、企業は私を引き継ぐと思いますか? 一日の終わりに自分の人生を振り返り、「神、どうしてもう1年だけ自分が好きな仕事をするのに不幸だったのに」と考えたくないと思いますが、プログラミングの仕事がなくても最終的に学位を取得できるので、何よりも心配しています。

13
以前に別の会社用にコーディングしたプログラムを再作成/オープンソースすることは合法ですか?
以前の仕事で、タスクを自動化するための汎用ダッシュボードを作成しましたが、それは非常に有用であることが判明しました-もちろん、以前の雇用者はそこで働いている間に書いたすべてのコードを所有しています。私はもうそこにいませんが、メモリからそのダッシュボードを再作成し、コードをオープンソースにすることは合法ですか?再作成する場合、かなりのメモリがあり、通常のコーディングスタイルと命名規則に従う傾向があるため、コード(おそらく2k〜3k行)は元のコードとほとんど同じです。 編集:もう少し背景-これは、グローバル企業内の小さなチーム(<10)によって内部的にのみ使用されるかなり汎用的なソフトウェアです。「会社」は、このシステムを認識していません。なぜなら、私は自分自身のイニシアチブでそれを作成しているからです。python / django上に構築されています。そして、ほぼ同一ということは、たとえば、djangoモデルは同じ名前/フィールドを持ち、ビューは同じオブジェクトセットを返すために同様のクエリを使用するということです。

15
1スプリントよりも時間がかかるリファクタリングを処理するにはどうすればよいですか?
私は50万行を超えるコードであるコードベースを使用しています。リファクタリングが非常に必要です。通常の2週間のスプリントよりも時間がかかるリファクタリング作業が特定されています。このサイトの他の回答で提案したように、これらを小さなタスクに分割することはできません。製品は反復の最後に動作する必要があり、部分的なリファクタリングは、アイテム間の依存関係が恐ろしいため、システムを使用できない状態のままにします。それでは、このハードルにアプローチする最良の方法は何でしょうか?繰り返しますが、それを小さな断片に分割することはオプションではなく、すでに行われています。 更新:人々はなぜこれが2週間のスプリントに収まらないのかの説明が必要なようです。コードを書くだけでなく、スプリントに関与します。私たちには、テストなしのコードはないというポリシーがあります。そのポリシーは常に存在するとは限らず、コードベースの大部分にはそれらがありません。また、統合テストの一部はまだ手動テストです。問題は、リファクタリング自体が非常に大きいということではありません。小さな変更がシステムの多くの部分に影響を与えるという事実があり、それらの部分が依然として正しく動作することを保証する必要があります。 毎月のホットフィックスがあるため、スプリントを延期または延長することはできません。したがって、スプリントを超えて拡張されるこの変更は、修正プログラムに追加される他の作業を停止できません。 リファクタリングと再設計:開発プロセスが2週間のサイクルでこのリファクタリングを処理するのに十分な効率がないため、再設計に名前を変更する必要はありません。将来的には、プロセスが改善されれば、2週間のサイクル内でまったく同じタスクを達成できると信じています。ここで問題になっているコードは、長い間変更する必要がなく、非常に安定しています。現在、会社の方向性が変化に適応しやすくなっているため、コードベースのこの部分が他の部分と同じように適応できるようにしたいと考えています。リファクタリングが必要です。ここでの回答に基づいて、通常のスプリントの時間枠でこのリファクタリングを機能させるために必要な足場が不足していることが明らかになりつつあります。 回答: これらの問題領域と欠落しているテストを特定する方法についてさらに学習できるように、Corbin Marchが初めて提案したブランチとマージのアプローチを実行します。前進するためには、Buhbが提案したテストに欠けている領域を特定するアプローチを採用し、それらを最初に実装してからリファクタリングを行う必要があります。ここで多くの人がリファクタリングの場合は常にそうすべきだと言っているように、通常の2週間のスプリントサイクルを維持することができます。

10
署名したくないNDAの法的問題[非公開]
私は現在の雇用主から署名したくないという秘密保持契約(NDA)を受けています。それは信じられないほどオープンエンドであり、3週間前に署名した最初の雇用契約の条件だったはずだと感じています。 このドキュメントには、「を含むがこれらに限定されない」および「直接的または間接的に」という形で非常に多くの定義が含まれています。 また、それは次のように述べています: 契約違反は会社に取り返しのつかない損害を与えることに同意します(違反は会社に損害を与える可能性があるが、必ずしも取り返しのつかない損害にはならないことに同意します)。 文書が将来修正される場合、その条項に違反するという修正条項への署名を拒否します。 会社の雇用下で私が開発するものはすべてその財産です(仕事とは別に、自分の時間に自分が開発したものが自分のものであるかどうかを無視しています)。 会社での雇用が終了した後、ソフトウェアの完成を支援するためにそこで職務を継続する必要があります。職務に直接または間接的に関連する職務を、就職後1年間は実行できません。会社は終了します(1年間ソフトウェアを設計することは許可されませんか?)。 会社が契約違反に対して私を起訴することを決定した場合、私は自分自身を守ることを同意せず、文書のすべての条件は、同意なしに私が働いている会社を購入する会社に転送されます。 要するに、彼らは生涯にわたって私を法的に所有し、彼らが適当と思われる何らかの理由で絶対に私を破壊することができました。 契約への署名から身を守るために使用できる法的議論はありますか?たとえば、NDAが私の最初の雇用契約の一部ではなかったという事実、または文書が意図的に抽象的であいまいであり、彼らが好きなように空白を埋めることができるという事実ですか? 同社は、公開されているSCMを採用し、オープンソースソフトウェアを大いに取り入れているサイトでソースコード全体をホストしています。これは、法的に「企業秘密」または「機密情報「非常にスリムなので、NDAに署名する必要があるのはなぜですか?私は、そこにいる従業員の多くが実際に署名する前にNDAを理解するのに時間をかけたとは考えていません。 この契約の条件は、ソフトウェアエンジニアリングコミュニティの間で一般的ですか?

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