ソフトウェア工学

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

23
なぜGitはそんなに誇大宣伝されたのですか?…他の人はそうではありませんか?[閉まっている]
近年、Gitをめぐる誇大宣伝が大いに盛り上がりました。誰もがGitについて知っていますが、代替案については誰も知りません。 Mercurialのような他のものは見過ごされているようです。どちらも2005年にリリースされ、同様の機能を提供します。さらに、Mercurialは一般に使いやすく、より直感的で、長い間UIが優れていると考えられています。したがって、これは、特に分散バージョン管理が初めての人にとって、人気のある代替手段であると想定できます。しかし、かなり成功したGitとは異なり、ほとんどの人には知られていないようです。 この投稿のポイントは、この現象をよりよく理解しようとすることです。 どうしてGitはケーキのすべての部分を手に入れたのですか?彼らはどういうわけかより良いマーケティングを使用しましたか?それは、そのコミュニティがもっと... ahem ...「verbose」だからでしょうか?「Linus」の名前のせいですか?それはそのオタク的なイメージのためですか? あなたの意見は何ですか?

8
再帰またはwhileループ
私はいくつかの開発面接の実践、特に面接で尋ねられた技術的な質問とテストについて読んでいて、ジャンルのことわざに何度かつまずいてきました。「問題はwhileループで解決しました。 「再帰」または「誰でも100行のwhileループでこれを解決できますが、5行の再帰関数でそれを実行できますか?」等 私の質問は、再帰はif / while / for構造より一般的に良いですか? 私はいつも、再帰は優先されるべきではないと考えてきました。なぜなら、それはヒープよりもはるかに小さいスタックメモリに制限されているためです間違っている...

9
多重継承が嫌われる「本当の」理由はありますか?
私は常に、言語で複数の継承をサポートするというアイデアが好きでした。ほとんどの場合、意図的に無視されますが、想定される「置換」はインターフェースです。インターフェースは、多重継承が行うものと同じ基盤をすべてカバーするものではなく、この制限により、定型コードが増える場合があります。 私がこれまでに聞いた唯一の基本的な理由は、基本クラスのダイヤモンドの問題です。私はそれを受け入れることができません。私にとっては、「まあ、それを台無しにすることは可能だから、それは自動的に悪い考えだ」というようなひどい結果になります。ただし、プログラミング言語で何かを台無しにすることができます、と私は何を意味します。少なくとももっと徹底的な説明がなければ、私はこれを真剣に受け止めることはできません。 この問題を知っているだけで、戦いの90%になります。さらに、私は何年か前に「エンベロープ」アルゴリズムまたはそのようなものを含む汎用的な回避策について聞いたことがあると思います(これは鐘を鳴らしますか?)。 ダイヤモンドの問題に関して、私が考えることができる唯一の潜在的に本物の問題は、サードパーティのライブラリを使用しようとしており、そのライブラリ内の2つの一見無関係なクラスが共通の基本クラスを持っていることを見ることができない場合ですが、ドキュメンテーション、単純な言語機能では、たとえば、実際にコンパイルする前に、ダイヤモンドを作成する意図を明確に宣言する必要があります。このような機能を使用すると、ダイヤモンドの作成は意図的、無謀、またはこの落とし穴に気付かないためです。 すべてが言われているように...あらゆるあり、実際のほとんどの人は多重継承を憎む理由は、またはそれが良いよりも害の原因とヒステリーのすべてのちょうど束でありますか?ここにないものがありますか?ありがとうございました。 例 車はWheeledVehicleを拡張し、KIASpectraはCarとElectronicを拡張し、KIASpectraはラジオを含みます。KIASpectraにElectronicが含まれないのはなぜですか? それは電子だからです。継承と構成は、常にis-a関係とhas-a関係でなければなりません。 それは電子だからです。配線、回路基板、スイッチなどがあります。 それは電子だからです。冬にバッテリーが切れると、すべてのホイールが突然なくなったのと同じくらいのトラブルに見舞われます。 インターフェースを使用しないのはなぜですか?たとえば、#3を考えてみましょう。私はこれを何度も何度も書きたくないし、これを行うために奇妙なプロキシヘルパークラスを本当に作りたくない: private void runOrDont() { if (this.battery) { if (this.battery.working && this.switchedOn) { this.run(); return; } } this.dontRun(); } (その実装が良いか悪いかについては触れていません。)WheeledVehicleの何にも関連せず、Electronicに関連するこれらの機能のいくつかがどのように存在するか想像できます。 そこには解釈の余地があるので、その例に落ち着くかどうかはわかりませんでした。また、VehicleとFlyingObjectを拡張するPlaneや、AnimalとFlyingObjectを拡張するBirdの観点、またはより純粋な例の観点から考えることもできます。

11
誰もがマスターで作業しているときにgitの痛みを最小限に抑えるにはどうすればよいですか?
約10人のドキュメントチームが最近SVNからGitに移行しました。SVNでは、誰もがマスターに取り組んでいました。これは私がずっと嫌っていたモデルですが、その変化をもたらすことはできませんでした。Gitへの移行の一環として、それを修正することに同意しましたが、まだそれを行うことはできません(任意のブランチからのビルドを許可するビルドの変更を待機しています)。一方、誰もがマスターに取り組んでいます。はい、私はこれがひどいことを知っています、信じてください。 SVNを使用していたときよりも多くのしゃっくりが見られますが、その一部はGitの2段階モデル​​(ローカルおよびリモート)に起因しています。コミットすることはできてもプッシュできない場合や、保留中のローカル変更と競合してプルする場合があります。昨日、誰かがマージを間違えて最近の変更をなんとかしました-マージが間違っていました。(彼は彼が何をしたかを正確に伝えることができませんでした。彼はGUIを使用しているため、シェルの履歴を調べることはできません。) 最も熟練したGitユーザーとして(読みます:以前に使用しましたが、非常に複雑なものではありません)、私はポリシーを設定し、ツールを教え、混乱をクリーンアップします。ブランチでの開発に切り替えることができるようになるまで、ツールを使用して、共有されたアクティブなマスターのエラーが発生しにくいようにする方法にどのような変更を加えることができますか? チームはWindowsでTortoise Gitを使用しています。以前Tortoise SVNを使用していたため、Tortoise Gitを使用しています。(私は個人的にCygwinの下のコマンドラインをいくつかの操作に使用していますが、チームはGUIが必要であることを明確にしました。これを使用します。) Tortoise Gitには「Commit&Push」という単一の操作があり、常にそれを行うように指示しました。しかし、それはアトミックではありません-コミット(結局ローカル)はうまく機能するが、プッシュは(競合やネットワークの問題などのために)うまくいかないことがあります。その場合、あいまいなエラーが発生します。私は、彼らが持っている場合のBitbucketはコミットログをチェックするためにそれらを言ったいかなる彼らがプッシュする、それが表示されない場合、コミット最近の疑問をして。(そして、それが問題である場合は競合を解決するか、何をすべきかわからない場合は助けを求めます。) チームはすでに「早期かつ頻繁にプルする」という良い習慣を持っています。しかし、プルは競合を引き起こす可能性があるようですが、これは新しいと思いますか?新しくない場合は、SVNよりはるかに頻繁です。Gitがプルする方法(マージではなくリベース)を変更できると聞いたことがありますが、そこでのトレードオフ(または環境でそれを行う方法)について十分に理解していません。 サーバーはBitBucketです(Githubではありません)。私はリポジトリを完全に管理できますが、より一般的にはサーバー上で管理しません。いずれも変更できません。 ソースファイルはXMLです。グラフィックファイルもあります。これは、マージできないことを誰もが知っていますが、衝突はほとんどありません。マージの競合は、グラフィックではなくXMLファイルから発生します。 Gitの使用にどのような変更を加えると、チームで共有マスターがよりスムーズになり、レビュー済みのテスト検証済みのプルリクエストで機能ブランチを使用できるようになりますか?
123 git  bitbucket 

30
ADD / ADHDを使用したプログラミング[終了]
ADDと診断しました。穏やかだが、私の仕事に影響を与えるのに十分: 気が散りやすいです 一度に1つのプロジェクトに集中できない Webにはまって 怠慢 等 補償するためにどのような戦略を使用していますか? 一つの説明 私は本当の ADD を持っています。私は子供の頃に診断され、一生ずっとそれと格闘してきました。私は、メディアの過負荷によって引き起こされる人為的な ADD について話しているのではありません。 更新 この説明ADD / ADHDを読みました。特に、ADDersをプログラミングしている私たちにとっては素晴らしい説明です。 私はツールボックスのようなもので、 私が必要とするすべてのツール がボックスに優しくきれいに置かれ、 それらを使用する準備ができています。 ツールボックスは半透明な ので、そこに表示されます。 ツールボックスのキーはその内部でロックされています。

14
メソッドの理想的な長さは何ですか?[閉まっている]
オブジェクト指向プログラミングでは、メソッドの最大長に関する厳密なルールはもちろんありませんが、これらの2つの引用符は相反するものであることに気付いたので、ご意見をお聞かせください。 でクリーンコード:アジャイルソフトウェアクラフトマンシップのハンドブックは、ロバート・マーティン氏は述べています: 関数の最初のルールは、関数は小さくなければならないということです。関数の2番目の規則は、関数はそれよりも小さくなければならないということです。関数の長さは100行であってはなりません。関数の長さが20行になることはほとんどありません。 そして、彼はKent Beckから見たJavaコードから例を示します。 彼のプログラムのすべての機能は、わずか2、3、または4行でした。それぞれが透過的に明らかでした。それぞれが物語を語った。そして、それぞれがあなたを説得力のある順序で次へと導きました。それはあなたの関数がどれほど短いかです! これは素晴らしいように聞こえますが、一方で、Code Completeでは、Steve McConnellが非常に異なることを言っています。 ルーチンは、100〜200行まで有機的に成長できるようにする必要があります。数十年の証拠によると、このような長さのルーチンは、より短いルーチンよりもエラーが発生しにくいと言われています。 そして彼は、65行以上のルーチンを開発する方が安価であるという研究への言及を提供します。 この問題について意見が分かれていますが、機能的なベストプラクティスはありますか?

5
同じid属性を持つ2つのHTML要素:どれほど悪いのでしょうか?
Googleマップのソースコードを参照するだけです。ヘッダーには、id = "search"の2つのdivがあり、一方にはもう一方が含まれ、jstrack = "1"属性もあります。次のようにそれらを分離するフォームがあります: <div id="search" jstrack="1"> <form action="/maps" id="...rest isn't important"> ... <div id="search">... これはグーグルなので、間違いではないと思います。 それでは、このルールに違反することは本当にどれほど悪いことなのでしょうか?CSSとDOMの選択に注意している限り、クラスのようなIDを再利用してみませんか?誰かがこれを意図的に行っていますか?

14
自動でC ++コードを理解しにくくしますか?
私はハーブサッターによるカンファレンスを見て、そこで彼はすべてのC ++プログラマーの使用を奨励していますauto。 C#コードvarを広く使用されていたコードを読む必要があり、コードを理解するのは非常に困難varでした。時間の経過ごとに右側の戻り値の型を確認する必要がありました。しばらくして変数の型を忘れてしまったので、時々複数回! コンパイラーは型を知っているので、型を書く必要はありませんが、コンパイラーではなくプログラマー向けにコードを書くことは広く受け入れられています。 私はそれがより簡単に書くことも知っています: auto x = GetX(); より: someWeirdTemplate<someOtherVeryLongNameType, ...>::someOtherLongType x = GetX(); ただし、これは1回しか記述されず、GetX()戻り値の型が何回あるかを理解するために何度もチェックされますx。 これは私に不思議に思いましたauto—C ++コードを理解するのを難しくしますか?
122 c++  c++11 


7
単体テストで何をテストする必要がありますか?
私は大学を卒業したばかりで、来週どこかで大学を始めています。単体テストを見てきましたが、あまり使用しませんでした。誰もがそれらについて話すので、私はいくつかのことをすべきだと思いました。 問題は、何をテストすべきかわからないことです。一般的なケースをテストする必要がありますか?エッジケース?機能が適切にカバーされていることを知るにはどうすればよいですか? 特定のケースで機能が機能することをテストで証明することはできますが、機能が機能することを証明することはまったく役に立たないという恐ろしい気持ちが常にあります。

14
オープンソースプロジェクトのすべての行を少し異なる方法で書き直し、クローズドソースプロジェクトで使用することは可能ですか?
iPhoneプロジェクトでの使用を検討しているGPLまたはLGPLのコードがいくつかあります。 そのコード(JavaScript)を取得し、iPhoneで使用するために別の言語に書き換えた場合、それは法的問題になりますか? 理論的には、起こったプロセスは、プロジェクトの各行を経て、それが何をしているかを学んだ後、新しい言語でアイデアを再実装したことです。 私には、これは何かを実装する方法を学ぶようなもので、元のライセンスとは別に再実装するように思えます。したがって、アルゴリズムをコピーしただけで、おそらく元のプロジェクト以外のどこかから学んだはずです。 ライセンスは特定の実装またはアルゴリズムもカバーしていますか? 編集----- このトピックが良い会話を生み出すのを見て本当にうれしいです。プロジェクトをもう少し支援するために、関連するコードは何らかのオーディオ分析を行います。私はこのタスクに着手する準備ができていましたが、学習したり実装したりするのは簡単ではないと思います(私はFFTアルゴリズムを実装できるレベルにあり、これを超えて行くつもりでした)LOCが低いスクリプトなので、ストレートポートを作成するのが難しいとは思いませんでした。 私は、ポートをリリースしてアプリケーションで使用するというアイデアが本当に好きです。私はそれに関して何の問題も見ていません、そしてそれはコミュニティに何かを返すための素晴らしい方法でしょう。 私は道徳的な問題を議論したくないという行を追加するつもりでしたが、それが少し議論を引き起こしたように思われるので、私は非常にうれしかったです。 学ぶためにオープンソースコードを使用することについて、まだ少し奇妙に感じます。これは、オープンソースプロジェクトから学んだものをクローズドソースプロジェクトで使用することは許可されないということですか?そして、ライセンスの違反とみなされないようにするには、実装がどれくらい後または異なる必要がありますか?マーキー! 編集2 -------- フォローアップの質問

15
「ソフトウェア開発者」と「ソフトウェアコンサルタント」の違いは何ですか?コンサルタントを作るものは何ですか?
私は自分自身が「ソフトウェアコンサルタント」であると主張する多くの人を見てきました。これらのコンサルタントは、通常のソフトウェア開発者が行うことを行い、コードを記述し、タスクを推定し、バグを修正し、会議などに出席します。それでは、ソフトウェア開発者は「コンサルタント」とどう違うのですか? 主な質問に加えて、ソフトウェア開発者がどのようにコンサルタントになることができるか知りたいですか?コンサルタント向けの具体的なガイドラインはありますか?彼らは認定を蓄積し、研究論文を書く必要がありますか?ソフトウェアコンサルタントと管理コンサルタントを混同しないでください。私が見たソフトウェアコンサルタントはマネージャーではありません。
122 terminology 

30
プログラミングの方法がまだわかりませんか?
さまざまなプログラミング言語、Java、Python、Cなどの本をたくさん読みました。言語の基本をすべて理解し、知っています。また、アルゴリズムとデータ構造を理解しています。(たとえば、2年間のコンピューターサイエンスクラスに相当) しかし、私はまだ有用な何かをするプログラムを書く方法を理解できません。 プログラミングの本はすべて、言語の書き方を示していますが、使用方法は示していません!プログラミングの例はすべて、ライブラリやシンプルなゲームのカードカタログを作成したり、アルゴリズムを使用したりするなど、非常に基本的なものです。実際に役立つ何かを行う複雑なプログラムを開発する方法は示しません。 SourceForgeでオープンソースプログラムを見てきましたが、私にはあまり意味がありません。各プログラムには数百のファイルがあり、数千行のコードがあります。しかし、これを行う方法を学ぶにはどうすればよいですか?Amazonで購入できる本には、これらのプログラムを作成するためのツールを提供するものは何もありません。 Javaの概要、Pythonのプログラミング、Cプログラミング言語などを読んでから、実際にXプログラムのアイデアを思いついたと言えるようになるにはどうすればいいですか。これは私がそれを開発しようとしていますか? 本やクラスで学ぶよりも、プログラムの作成に深く関わっているようです。何かがあるように感じます。 どうすれば正しい軌道に乗せられますか?
122 untagged 


6
ソケットとポートの違い
誰かがポートとソケットの違いをはっきりと説明してください。ポートはアプリケーションプロセスのネットワークへのドアとして機能し、アプリケーションプロセスは指定されたポート番号へのソケット接続を使用してネットワーク通信を処理することを知っていますが、単一のポート番号でリッスンする複数のプロセスがある場合、私は見つけていますソケットとポートの違いと、それらがどのように組み合わされるかを理解することは困難です。

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