私の同僚全員がメタプログラミングを理解していなくても、メタプログラミングを使用しても大丈夫ですか?


102

反復的なタスクを避け、より安全に使用できる抽象化を構築するために、多くのメタプログラミングを採用しています。

私は最近、より大きなチームで働いている新しい仕事に移りました。これは私の同僚の何人かを心配します。彼らはそれを理解していないからです。

私は常に言語の可能性をフルに活用しようとしますが、同僚の一部(すべてではない)がそれをリスクとして認識しています(一部はアプローチを歓迎します)。

チームの他の誰も理解できないコードを書くことは問題だと思います。一方、私たちはすべてプロのC ++開発者であり、クラスでCを書くよりも高い標準を目指すべきだと思います。

私の質問は、誰が正しいのか、私は何をすべきですか?

明確化: 言語の可能性を最大限に活用しようとしても、すべての問題にTMPを投げるわけではありません。C ++はツールボックスであり、私にとってC ++の習熟度とは、ボックスのすべてのツールを使用できることと、特定のジョブに適したツールを選択することです。


38
これは最終的に意見に基づいています。個人的には、C ++テンプレートメタプログラミングなど、偶然にチューリング完全になるほど複雑な機能を使用しないことをルールにしています。
キリアンフォス

24
@KilianFothテンプレートは、「偶然」チューリング完全ではありません。それらは常に抽象化の強力なツールであることが意図されていました
Caleth

73
誰も理解できないコードは、より高い標準ではありません。
gburton

37
@Caleth Herb Sutterは偶然それらをチューリング完全と呼びます。確かに、それらは強力な抽象化機能であることを意図していましたが、チューリング完全性が許すような不可解で決定不能な構造を可能にすることを意図しているとは思いません。そして確かに、それらの構文は、そのようなメタプログラミングを必要以上に非透過的にしないように設計されていません。
leftaround

26
偽の二分法。「より高い標準」でプログラミングし、クラスでCを残し、現代のC ++を採用し、const、no()キャスト、ポインター演算なし、値セマンティクス、多くの良さ、見出しなしでテンプレート(STLなど)を使用できます。 ibnto TMP。C-with-classesとTMPの間にデイライトが表示されない場合は、間違っています。
ケイトグレゴリー

回答:


185

メタプログラミングは問題ありません。あなたがやろうとしていることはOKではありません。

私は仕事で常にメタプログラミングを使用しています。これは、より読みやすく保守しやすい方法で多くのことを行うために使用できる強力なツールです。また、プログラミングのスタイルを理解するのが難しいので、キープを獲得する必要があります。1000行のコードを50行に減らすことができるのが好きですが、そのように制限しようとしています。

問題はメタプログラミングではありませんが、これは次のとおりです。

一方、私たちはすべてプロのC ++開発者であり、クラスでCを書くよりも高い標準を目指すべきだと思います。

これはあなたがトラブルに陥る場所です。あなたの意見があります。メタプログラミングが良いという意見を持つのは良いことです。私たち全員がより良いC ++開発者になることを熱望するべきだという意見を持つのは良いことです。

あなたの意見に同意するためにあなたが書いたコードを維持しなければならないあなたの同僚将来の雇用者の両方を強いることは良くありません。それはあなたの上司の仕事です。あなたの上司は、あなたのコードが長期的に維持可能であることを確認することに関心を持つべきです。イデオロギー的な決定ではなく、ビジネス上の決定だと私が信じるので、彼らは(できれば)はるかに多くのビジネス経験を持っています。

メタプログラミングしたいのは問題ありません。他の人にメタプログラミングを教えたいのはいいことです。しかし、メタプログラミングを学ばないことを選択することは他の人にとっても良いことであり、あなたが権力の座につくまでそれは真実であることを理解してください。(そして、業界の秘密として:あなたが最終的にリード開発者になったとき、あなたは権力の地位にいます。あなたは権力の地位にいるわけではありません。

あなたが彼らにメタプログラミングで大丈夫であることを奨励したいのなら、小さなことから始めましょうenable_ifAPIを読みやすくする単一のものから始めます。次に、昼光をコメントアウトします。次に、テンプレートメタ関数が、10個の小さなヘルパーを使用して、10個の大きな反復クラスを1個のクラスに変換する1つのケースを見つけます。一体にコメントしてください。反応を得ます。人々がそれについてどう思うかを見つけてください。彼らはあなたにそれをしないように言ったら大丈夫です。メタプログラミングが徹底的に維持し、同僚全員が(しぶしぶ)仕事に適したツールであることに同意するニッチを見つけます。

短い話として、私は一度、大規模なメタプログラミングを使用して美しいライブラリを作成しました。それはやった正確には他のアプローチは、リモートで近づくことができなかったとき、私たちは一度に必要なもの。実際、私が書いていたアプリケーションの方向を変えました。しかし、それはメタプログラミングでした。会社全体で、他の1人または2人だけがそれを読むことができました。

後で、同僚がこの問題に別の突きをしました。メタプログラミングを活用して必要なことを正確に行う代わりに、リーダーシップと協力して、メタプログラミングが不要であるという問題に課せられていた制約を緩和しました。おそらくより正確には、メタプログラミングはそれほど必要ではありませんでした。彼はそれをメタプログラミングが最もよくするものに限定することができました。

結果として得られるライブラリは、非常に広い市場で使用できるようになりました。これは、新しいコードをはるかに広範な開発者が保守できるという事実のために、確かなことです。私はメタプログラミングの道を開いたことを誇りに思っていますが、より多くの聴衆に届くのは同僚のコードであり、それには十分な理由があります。


72
「メタプログラミング」を他のスタイル、テクニック、テクノロジー、ライブラリに置き換えれば、答えはまだ素晴らしいです!
アンドレイス

4
あなたの上司は、あなたのコードが長期的に維持可能であることを確認することに関心を持つべきです。ほとんどのボスは、コードの保守性が何かさえ知りません。彼らには事実上技術的な知識がないので、政治的な性格を持っている彼らの決定を信用しません。
t3chb0t

4
@ t3chb0t:経験豊富な上司は、カスタマーサービス(バグ修正や新機能)にどれだけのお金を費やすべきか、そしてそのコストを最小限に抑える方法を知っています。保守性は、そのための最も強力なツールです。その上司は技術的な詳細を知らないかもしれませんが、その点で信頼できるチームを構築できるはずです。
ムービシエル

25
@DDrmmr私は、プログラマーが標準を上げるためにメタプログラミングを使用すべきだと信じている人のために調子を整えました。最もスキルの低いチームメンバーがそれを維持できる場所に馬鹿げているとは思わない。それは、チームがそれを維持できる場所まで馬鹿にされるべきであり、おそらくもっと強力で、あなたなしでチームがそれ維持できる場所まで馬鹿にされるべきです。そうでなければ、自分で仕事を書いています。
コートアンモン

15
@Joshua私が見つけたのは、「メンテナンスを必要としないコード」というものは存在しないということです。
コートアンモン

39

何よりもまず、これはチームの問題であり、チームで解決する必要があります。特定の要素と構造を使用してプログラミングするためのチームのバックアップがある場合は、それを行います。そうでなければ、彼らと話し合い、彼らを納得させることができず、「あなたのアプローチ」が明らかに優れている理由を強く主張するなら、あなたはそれを使わないほうが良いでしょう。

C ++でテンプレートメタプログラミングを使用することは常にトレードオフであることに注意してください。確かに、アプリケーションの特定の部分をよりDRYに設計するのに役立つことがあります。

一方、これらの利点は、一定のコストで来る:コードは、多くの場合、より抽象的ななるくらい、難しい読み多くのデバッグが困難と多くの維持が困難になっています。これにより、アプリケーションプログラミングでのメタプログラミングの有用性が疑問視されることがよくあります。そのため、次のSTLを作成しないと仮定して、メタプログラミングを使用したくなるたびに、それらの欠点が本当に価値があるかどうかを自問してください。また、不明な場合は、コードレビュー中にピアレビューアと話し合ってください。


同意しますが、コードに入れる前にQAと話し合います。拒否されるものを作成する意味がありません。
shawnhcorey

8
どうですか:「同意します。しかし...」を「to」に変更すると、意味が完全に変わります。時間を費やす前に、いつもと違うことをQAと話し合う必要があります。あなたは、この議論は時間を費やした後、コードレビューで行われるべきだと述べました。
shawnhcorey

@shawnhcorey:確かに、組織の「QA」がコーディング標準に責任がある場合。しかし、これは典型的な「QA」の役割ではなくIMHOです-私が知っているほとんどの組織では、「QA」という用語はブラックボックス方式で品質保証を行う人々のグループを指し、プログラミング言語のどの要素に責任があるべきではありません使用されるものとされないもの。それらの人々は、そのような詳細について議論するのに十分なプログラミングの資格をほとんど持っていません。
Doc Brown

2
@shawnhcorey:それはまさに私のポイントです。QAの役割は組織によって大きく異なります。多くの組織では、QAの人々はプログラミングのことを考えていないため、おそらくそのようなトピックを議論するのにふさわしい人物ではありません。
Doc Brown

2
@shawnhcorey:一方で、「QAは一般的な用語です」-一方、非常に具体的なQAの役割と責任を念頭に置いて書いていますが、私には少し矛盾しています。
Doc Brown

18

私の一般的な意見:よくあることですが、次の3つの選択肢から選択することができます。

  • 多くの重要なコード構造を手作業で繰り返し入力します。
  • C ++テンプレートメタプログラミングを使用して、コード生成を自動化します。
  • マクロや他のプログラミング言語など、他のコード生成メカニズムを使用して、C ++ソースファイルを生成する

適切に行われたテンプレートメタプログラミングは、3つのオプションの中で最も読みやすく保守しやすいでしょう。これは、私があなたの立場にいたら、私がチームに対して行うであろう議論です。実際のコードを含む例は、彼らを納得させるのに役立ちます。

テンプレートメタプログラミング(TMP)を使用して繰り返しを回避する場合、それを使用して、TMPコード内の複雑さをローカライズする、十分に文書化され、慎重にテストされた抽象化を構築し、正しいクライアントコードを簡単に記述できるようにする必要があります。これは、C ++標準ライブラリの設計です。

あなたが書こうとしているコードのタイプの例を見ることなく、誰が正しいか間違っているかを判断できるとは思いません。


2
また、+コピーを使用する手の;-)でそれを入力する代わりに貼り付けることができます
サンパウロEbermann

4
@PaŭloEbermann:いやいや!
ジョシュア

2
@PaŭloEbermann私がそのアプローチと呼んだのは、「begin-mark-bug、end-mark-bug、copy-bug、copy-bug、copy-bug」です。
ケリーS.フランス

12

ソフトウェア開発者は、動作し、明らかに動作し、テストし、レビューし、デバッグし、変更が必要なときに適応できるコードを書くことを目指します。「クラス付きC」でこれを達成できれば、それで問題ありません。

そして、これらはあなたがあなたのコードを測定すべき標準です。特に:それは明らかに動作しますか、テストできますか、レビューできますか、デバッグできますか?


9

思いやりからの議論:

あなたの仕事は学習に自由な時間を与えますか、あるいは、上司にこれらの言語機能を学習するために数時間を割り当てるよう説得できますか?

そうでない場合、それらを使用すると、基本的に余分な無給の仕事が与えられます。C ++プログラマー言語全体またはそのようなもの知っている必要があると思うかもしれませんが、アカデミックポイントはそれらに課す負担を軽減しません。同僚には、子供、病気の両親、病気の配偶者、または地獄、C ++の学習を必要としない合理的な社会生活があります。あなたの提案のより声高な相手は怠け者かもしれません-または彼らは大まかな時間を徹底的に進んでいるかもしれず、今の生活で余分なたわごとを必要としません。


8

コードは、人間が読むために最初に記述し、コンパイラが解析するためだけに記述する必要があります。

さて、自明ではないTMPについて覚えておくべきことは、そのコードを読むことができる人の数を制限していることです。それは有効なトレードオフになる可能性がありますが、専門家の小さな専門家チームは、より大きなアプリケーションにあります。

本のすべてのトリックを引き出すと、あなたが悪用したすべての弁護士の訴訟を含む言語を理解する必要があるため、他のすべての人にコストを課します。便利な方法でアプリケーションを操作するには、それだけの価値があるかもしれませんが、コストに注意してください。

私にとっては、もう少しタイピング、おそらくいくつかのコードの重複ですが、変更が必要なときに「C with classes plus STL」の前に置くことができることは、私だけが維持できる信じられないほどエレガントなTMPのものよりもはるかに便利です(したがって、永久に維持されます)。また、クラスの人を持つCはたまたま主題の専門家である可能性があり、専門知識は通常、言語弁護士であるよりもはるかに価値があることを忘れないでください。

誰が言ったのか忘れますが、「デバッグは最初から書くのが難しいことを誰もが知っているので、できる限り賢くプログラムするなら、どのようにデバッグしますか?」

たとえ現代のC ++を実際に書くことができたとしても、私は普段は好まないのですが、メンテナンスプログラミングをあまり行う必要がありません。


7

いいえ、すべきではありません。仕様を満たすコードを生成するために雇用されています。このコードは、エゴトリップではなく、保守可能でなければなりません。明日はバスにひかれてしまうかもしれないので、誰かがあなたのコードを手に取り、手でタスクを進めることができなければなりません。ただし、雇用主に新しい技術をプログラミング標準に組み込むよう説得することは有益です。


3
仕様を満たすコードを生成するために雇用されています。はい、でもあなたはそれを忘れてしまいました
t3chb0t

2

コンテキストでこの質問に答える唯一の方法は、特定の問題と、メタプログラミングでそれらを解決した特定の方法を調べることです。ここにコードを投稿しない限り、存在しない問題を「解決」するだけであなたにとって楽しい不必要な合併症にwhetherしたかどうかはわかりません。または、他の方法では利用できないシンプルでエレガントなソリューションを作成するために、言語の全力を使用したかどうか。

後者の場合は、チームと一緒に継続することをお勧めします。スタイルの問題だけでなく、プログラマーのソリューションが最適なアプローチを使用しているか、適切な言語機能を使用しているか、保守可能かつテスト可能かなどについて議論する、意味のあるコードレビューをすべての優れたチームが行う必要があります。午後中。あなたのアプローチを拒否するプログラマは、代替手段(perlによるコード生成、コードの複製など)をレイアウトし、ソリューションと比較して、前述の基準に対してどのように機能するかを示す必要があります。議論の友好的な「反対者」としてのあなたの仕事は、それが仕事を早く終わらせる方法であり、保守が容易であり、テストが簡単であり、コードが実際にハードルを越えて読めることを示すことです。面白い文法を解析します。

ほとんどのプログラマーは怠け者で、エレガントで小さなソリューションを楽しんでいます。あなたのものが1つであれば、特に実証された選択肢が不足している場合、あなたはそれらを納得させる可能性があります。


0

この質問に対する単一の正しい答えはありません。

あなたが最初に自問すべきことは次のとおりだからです。あなたはどのような状況で仕事に就いていますか?実際、仕様をコーディングするためのコードモンキーとして採用されている人もいれば、チームプレイヤーとして採用されている人もいれば、ナレッジワーカーまたはエキスパートとして採用されている人もいます。

本質的にこれは従業員であることを意味するため、唯一の一定の最終結果は、雇用主の観点からそれを見る必要があるということです。同僚をより良くし、高度な技術を習得するように微調整することは、雇用主にとって最も有益な場合もあります。しかし、別の状況では、多くの問題と負債を作成するだけで、関与しているプロジェクトの成功を危険にさらす可能性があります。


-4

問題は、実際にはメタプログラミングが大丈夫かどうかではなく、チームの他の人よりも優れているかどうかということなので、ここで私がそれをどのように見るかについていくつかの議論の余地があります...


私は最近、より大きなチームで働いている新しい仕事に移りました。この[メタプログラミング]は、同僚が理解できないため、一部の同僚を心配しています。

彼らはあなたが彼らより優れていることを心配しています。それは良い。あなたは新しい専門家になるでしょう。あなたは彼らの現状を破壊しました。


私は常に言語の可能性をフルに活用しようとしますが、同僚の一部(すべてではない)がそれをリスクとして認識しています(一部はアプローチを歓迎します)。

確かに、誰も他の誰よりも熟練するのを好まないので、彼らはあなたにとって彼らにとって複雑すぎるテクニックを使うことを止めようとしています。彼らは今それを理解できないか、行こうとしません。


チームの他の誰も理解できないコードを書くことは問題だと思います。

しません。あなたの専門性を示していると思います。


私の質問は、誰が正しいのか、私は何をすべきですか?

あなたが書くことができる最高のコードを書くためにあなたのすべてのスキルを使うべきです、そして、それを理解していない人々を後ろに見ないでください。そうでなければ、あなたは彼らのレベルで立ち往生し、普通のコーダーになります。他人よりも優れていることは良いことであり、他人よりも良くなるように努力することは良いことです。新しいものを使用したり、異なることをしようとしないと、新しい経験を得ることができません。


私は投票されることは知っていますが、これはそれがどのように見えるかです。チームの他の人よりも優れていることは犯罪ではなく、スキルを使用することは犯罪ではありません。誰もがそれを認めることを恐れているというだけです...彼らは非熟練の側にいて、新しい男が突然彼らができないことをすることができるということを嫌うからです。彼らが賢い場合、彼らはあなたに助けとアドバイスを求め、理解できないことについてあなたのコードを批判しません。


編集

この質問については多くの混乱があるようです。コメントが示すように、多くの人々は一般的なコードの読みやすさについてだと考えています。いいえ、ちがいます。一部のチームメンバーが理解できないため、特定の言語機能/構造を禁止または回避すべきかどうかです。

私の答えはノーです。それらは禁止されるべきではありません。何かを禁止したい場合はどうしますか?チームメンバーができることとできないことを調べるために、何らかのアンケートを用意する必要があります-または、すべてのラングアグ機能がどこかで役立つと思うので、学習したくないので、それらを知って使用できることは常により良いコードを作成できれば、より良いコードを作成できます。また、初心者向け、中級向け、または上級向けの機能を定義するためのスケールも必要です。

そのような制限がどれほど愚かであるかを示すために、本当に簡単な例を見てみましょう。あなたはソフトウェアエンジニアとして雇われることになりますが、将来の上司はdo/while、以前にそれらを使用したことのないチームはfor、すべてのループを常に使用しているため、do/whileループを混乱させるため、使用しません。

今、あなたはこれが愚かでクレイジーだと思いませんか?しかし、他の機能も禁止されています。一部の人々はそれらを使用でき、他の人々はそれらを学びたくない。

はるかに少ない労力で同じことを行うことができ、さらに読みやすく堅牢なコードが得られるものがあるとわかっている場合、なぜ悪いコードを生成する必要がありますか?

また、基本的な言語機能だけを使用しても高度な機能を使用しても、どちらの機能を使用しても同等に理解できない保守不能なコードを生成できるため、これはまったく異なるトピックです。


10
この答えは恐ろしいです。メタプログラミングは優位性意味するものではなくその逆も同様です
-polfosol

9
私の経験では、他のチームよりもはるかに高いレベルの専門知識を持っていると強く感じている人は誰でも、実際にDunning-Kruger効果の犠牲になっています。それは、一部の人が他の人よりもそれほど熟練していない、またはこの場合、チームの残りの人が実際に無能ではないということではありません...単なるスタイルポイントのプログラミングではなく、エンジニアリング(長期にわたるチーム効果の会計処理を含む)。
ダニエル・プライデン

3
他の人が読めないコードを書いても、あなたが彼らより優れていることを証明しません。読み取り可能なコードを記述できないことを証明します。
スティグヘメル

3
@StigHemmerは、あなたが質問を理解していないようで、トピックを変更しています。それは読み取り不可能なコードではなく、知識不足のため他の人には理解できないコードに関するものです。
t3chb0t

4
@ t3chb0t私のポイントは、これら2つは同じものだということでした。
スティグヘメル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.