私は最近、自分自身を「主にC/C++プログラマー」と呼んでいる他の3人と一緒に、新しい高性能C++プロジェクト(ファイナンス)に割り当てられました。つまり、私たち全員もJavaやその他のものは、私たち全員が同等の経験(8〜10年)を持ち、他のプロジェクト(C/C++ではない)の作成に協力して成功しています。
私たちの「マザープログラミングタン」については、プロジェクトが適切に提供されるだけでなく、チームやオフィスの全般的な健康にもリスクがあるという考え方が異なることに気づきました。具体的には:
それらは、電気工学/自動化/ポリテクニックタイプの背景から来ているため、その理由は、ハードウェアの動作、バイトの動き方、プロセッサの動作、命令のキャッシュ、一般に下位層のすべてに密接に関連しています。彼らは組み込みプログラミング、ARMプログラミングを行いました(私はそれらが何であるかほとんど知りません)。私はすぐに、彼らの実践的な経験がC++ではなくほとんどCであることがわかりました。彼らはOOPではなく、手続き的に考えます。
一方、私は再利用可能なモジュール式ソフトウェアを作成するために、カプセル化、低結合/高凝集などの原則を適用するように、より抽象的な方法で考えるように自分自身を訓練しました。私の専門はC++プログラミング言語で、高速で再利用可能な汎用コードの両方を手に入れるのに役立つ言語構造にアクセントがあります。デザインパターン、イディオム、コンセプトだと思います。 9年間のソフトウェア開発を通じて、私は一貫して、ソフトウェアシステムの保守性の悪さがチームの最大の負担であることを目の当たりにしました。私は寛大に私のコードを文書化し、注意深いインターフェースを書きます。高速で再利用可能な製品を入手する方法として、テンプレートメタプログラミングを採用しています。新しいC++ 11標準機能を採用しています。
再利用性と疎結合を見ると、「複雑さ」が見えます。彼らは「すべてをそこに見たい」と思っています。インターフェースメソッドの一部のバッファクラスではなく、char*
を確認したいと考えています。ある時点で、「実装が複雑に見えても、インターフェースがどれほど単純であるかは気にしません」とさえ言った。問題は、モノリシックスタイルのシステムから再利用可能なシステムへの移行を実際に試みていることです。ライブラリを作成しています。それでも、Cスタイルの構造体がテンプレート化されたメソッド、typedef、およびc-torで汚染されていることを望んでいません。また、static_assert(std :: is_pod <...>)も見たくありません。彼らはmemcpyとポインタを愛し、一般的に参照から離れています。彼らはtypedefがどういうわけか悪いと思う傾向があります。
私は本当に彼らにそれが何であるかについての抽象化を見せるようにしようとしました。それはそれが操作するデータと一緒のコードです。必要に応じて、ライブラリーは、ユーザーがそれをより大きな製品にプラグインできるように、いくつかのインターフェースを定義する必要があります。彼らはこれらのインターフェイスを私のコードの方法と見なす傾向があります彼らのコードは私が望むように動作/見せる必要があり、彼らが自分のやり方で行うことを許可しません、しかし実際に彼らにできる特定の機能を伝えることなく取得しません。
間違いなく、私はパフォーマンスに関して無知ではありません。キャッシュライン、分岐予測、メソッド仮想化のオーバーヘッド、ヒープ割り当て、ハッシュルックアップについて知っています。アルゴリズムの複雑さ(ここではそれほど重要ではありませんが)、データ構造、インライン化、およびRVOなどのその他のコンパイラーの最適化が得意です。最新のコンパイラーを使用すると、再利用可能なレイヤー化されたOOP C++製品は、注意深く記述して最適化すると、Cのみのモノリシック製品のパフォーマンスの10%以内に収まると考えています。
私は正直に言って、私たちの考えでお互いを補完し合うと信じていました。
あなたの考えは何ですか?私たちがこの仕事をする必要があるので、厳しすぎないでください。
わかりました。まだ誰も行っていないので、ここで説明します。
私の経験はおそらく多少似ています。私は1年ほど前にソフトウェア部門から職場の組み込みソフトウェア部門に異動しましたが、あなたがここで表現している感情の響きは間違いなく聞きました。
ここにあなたがここにリストしたものに沿って私が行ったいくつかの観察があります。これらは、さまざまなグループの視点を表しています。
私の持ち帰り?多くの場合、組み込み/ EEのバックグラウンドは、アーキテクト(特に大規模なシステム)の能力が低下し、ソフトウェアのバックグラウンドは、重要ではない事柄にとげとげしがちで、測定や理論よりも理論上のパフォーマンスの向上に重点を置く傾向があります。それを改善します。あなたのマイレージは異なる場合があります。
チームビルディングの観点からは、相互の視点を尊重することの尊重が重要であることがわかりました。それは私の目標であり、かなりの方法でなくなっていると思います。
C++の使用法の観点から、いくつかの、おそらく苦痛な提案をしたいと思います。これらすべてを、私がソフトウェアと組み込みソフトウェアのアプローチで異なることに気付いたものの観点から見てください。スタイルに関する単なる炎に値する論説としてではありません。
もちろん、あなたは2人のプログラマーを部屋に入れ、3つの意見を得ます。気付いた。しかし、組み込みソフトウェアとソフトウェアの境界では、これらは私が気付いたことです。お役に立てば幸いです。 (ただし念のため、耐熱スーツを先制しました。)
そして最後にもう一つ。相互の尊敬と賞賛を築く方向に沿って、彼らに途中で会って、おそらく テンプレートベースのレジスタアクセス のようなものを見て、このようなものについて友好的な議論を始めることは害がないかもしれません。