コード型の欠点


41

コード型は、各反復でコードを改善しようと何度も小さな問題を行うことにより、プログラマーのスキルを磨くことを提案する概念です。名前は、フォーム(別名カタ)が何度も繰り返し改善されていく練習である、武道カタの類推に由来しています。

トピックに関する最後の質問に対する反応から、このアプローチの欠点は何か知りたいですか?


適用される非生産的な-1に対抗するために+1。Code kataについての私の疑問があるように、有効な質問のように思えますが、理由を特定することはできません。
マッテンツ

9
今日まで、私はこのカタの事が何であるかを知りませんでした。今私はそれをチェックしましたが、それは単なる正気なプログラマーが開発中に自動的に学習し、練習することの単なる空想的な名前です。したがって、私にとっての欠点は、それ以外の場合に使用できる余分な時間がかかることです。
stijn

11
うーん...どうやら、コードカタの一つの主要な欠点は、人々は、コードカタが:-)何であるかを理解せずに、コードカタを批判しているということらしい
イェルクWミッタークを

19
@JörgWMittag-「カタ」という用語は、現実世界の状況ではほとんど実用的な意味のない剛体の形式の実践を意味するため、悪い類推であるためです。「ブラックベルト」や「カタ」などの格闘技の言葉をプログラミングやビジネスの状況に適用することは、私をいらいらさせます。
jfrankcarr

回答:


22

原則として、コード型には欠点はありません。異なるアプローチと異なる言語で、同じタスクを何度も達成しようとします。しかし

  1. 職場で導入するのはかなり難しいです。通常、熟練または合理的な生産性が期待されます。私はそれが役に立たないと言っているわけではありません(新しい雇用のスキルを向上させるために時間を費やす方が、彼が来るべき時間に書くあまり良くないコードにお金を払うよりも良いです)が、それでもなお難しいです。
  2. 何らかの意味で改善を試みる必要があります。同じコードを同じ方法で1000回書いても、あなたは改善されません(むしろ、あなたを退屈させます)。以前のエラー、何がうまくいかなかったか、予想通りにうまくいかなかったことを理解する必要があります。これが最も重要な部分です。これは自己学習の一種ですので、勉強する必要あります。

1
この答えは、「カタ」という用語ではなく直接質問に対処し、コードカタの実践の潜在的な問題に焦点を当てているため、受け入れました。これは、他の答えが良いものではないと言うことではありません-実際、私は複数の答えを受け入れたいです!
サルダスリオン

43

格闘技のカタのように、プログラミングのカタは、主に機能よりも形に関するものだと思います。エレガントなコードを書くことを教えてくれるかもしれませんが、コードを書いている問題を解決することは教えません。プログラマーとして改善するためのより良い方法は、実際の問題解決を必要とするパズルを解決し、コードカタでは決して教えられない方法で適切にファクタリングされたコードの価値を教えてくれる大規模なプロジェクトに取り組むことだと思います。

余談ですが、「コードカタ」や「ソフトウェアクラフツマンシップ」などの用語は、新しいものや有用なものを記述することよりも、私たちの職業をロマンチックにすることの方が多いと思います。


4
その文に対して+2にします。
エリックディートリッヒ

6
問題を解決することはプログラマーとして改善する良い方法であることに同意しますが、エレガントなコードを書くことを学ぶことも価値のある追求です。私が現在維持しているコードの元の開発者の一部が、物事を機能させるためにコピーして貼り付けるのではなく、エレガントなコードを書くことに時間と労力を費やしたことを願っています。
マイクパートリッジ

1
+3マイクのコメント。一般に、コードを最初に記述するよりもはるかに多くの時間がコードの維持に費やされます。誰かがあなたの家を建てるとき、あなたは長い間住んでいるので、職人技が適用されると期待するでしょう。誰かがソフトウェアを構築するときにも同じことが当てはまりますが、ほとんどの場合そうではありません。
カレブブラゼー

@KaptajnKold:あなたの経験から話していますか?CodeKataでスキルを向上させようとして失敗した人からのコメントをお待ちしています。
dzieciou

2
@dzieciou:私は数年間空手を練習してきた格闘技の経験があります。そして、私はカタから学ぶことができる戦闘のいくつかの有用な側面があると信じていますが、私はそれが最終的に非常に効率的な訓練方法ではないと信じています。彼らが言うように戦うときに訓練する必要があります。それはあなたの目的がより良い戦闘機になることである場合です。カタを練習すること自体が楽しいことだと感じる人もいます。それには何の問題もありません。最終的にそれらのいくつかは非常に良くなります。カタで。
KaptajnKold

20

コード型は時間がかかります。

フルタイムの開発者であり父親である私は、コンピューティングを趣味にしたくありません。

そして、上司が私の現在のプロジェクトとは無関係のアプリケーションを開発するために私にお金を払うとは思いません。


10
時間をかけない学習はありますか?毎回グリーンフィールドプロジェクトに取り組むことができる幸運でない限り。
デン

38
定期的にプログラミングスキルを向上させるために、少なくとも少しの空き時間を費やさないと、プロとしてのキャリアは大きな危険にさらされます。
ラディスラフMrnka

7
これに+1。私はプログラミングが大好きで、好きなことでお金を稼ぐことができますが、仕事以外でもっとプログラミングをすることには意味がありません。私は他にもたくさんの趣味(DJing、音楽制作、重量挙げ、ドローイング、ストリートダンスなど)があるので、すでに40時間/週していることにもっと時間を費やすことには意味がありません。
アンドレアスヨハンソン

7
@mouviciel:それはまさに問題です。プロジェクトで必要な場合、上司はあなたの専門能力開発にお金を払ってもかまいませんが、あなたの現在のプロジェクトに関係しないスキルを改善する必要があります。プラットフォームで。それがあなたのキャリア/社会保障を構築するものです。
ラディスラフMrnka

6
@LadislavMrnka-あなたに同意します。それにもかかわらず、コードカタはその問題に対する答えではありません。
mouviciel

13

ボクサーとして、私はカタの背後にある原則に反対する必要があります。硬すぎて実際には役立ちません。リングでは、自由に流れる環境で学んだ原則を適用する方法を理解する必要があります。

これは、技術の学習と改善を行うべきではないということではありません。バッグで練習すると、パンチを使用して、カタと同じように投げる方法を感じることができます。しかし、それほど厳格ではありません。あなたは同時に多くのことを練習し、バッグを動き回り、安定したプラットフォームから投げ、照準を合わせ、呼吸し、リストが続きます。

最も重要なことは、すべてが実際に使用される方法で一緒に学習されることです。これまでで最も美しいforループを記述できても、それをプログラムに組み込む方法を理解できない場合、それは何が良いでしょうか?

あなたが練習をしたいなら、より良いことは自分でツールを構築するか、使用するツールに取り組むことだと思います。それはあなたのすべてのスキルを行使する必要があり、最終的には何か有用なものがあるかもしれません。


にスポット。fwiw、私はボクサー/プログラマーでもあります:)。
ポールサンワルド

1
コードカタは厳密な繰り返しに関するものではありません。問題を解決するために働き、満足するまでソリューションを改善するために働きます。Kata Oneから:「このカタの目標は、より緩やかなスタイルの実験的モデリングを実践することです。可能な限り多くの異なる方法で問題を処理してください。それぞれのさまざまなトレードオフを考慮してください。それらを記録しますか?モデルが妥当であるとどのように検証できますか?」
マイクパートリッジ

4
「カタ」という用語は不完全であることに同意しますが、名前のために彼らの主張を見失ってはいけません。また、すべての単語の問題ではありません。Kata Twoから:「選択した言語と手法で(以下の仕様を使用して)バイナリ検索ルーチンを実装します。明日、まったく異なる手法を使用して、それを再度実装します。バイナリチョップの実装です(たとえば、1つのソリューションは、従来の反復アプローチ、再帰的、配列スライスを渡す機能的なスタイルなどを使用します)。」
マイクパートリッジ

3
@MikePartridgeそれは私のポイントを例示しています。カタには、たとえば、行数を減らしたり、ゼロから書き込むのにかかる時間を短縮したりするなど、毎日改善されるバイナリ検索の1つの方法が含まれます。概念を定義するには、概念の記述方法が重要です。誤った荷物を持ち込むことなく、プログラミングの練習と呼ばれたかもしれません。責任は著者が自分の考えを正しく定義する言葉と概念を選ぶことであり、彼の聴衆が彼の比phorの選択のために誤った連想を引いていることを不平を言うことはありません。
スペンサーラスブン

3
@MikePartridge私の場合、すべてのプログラマーは常に学習/改善している、またはそうあるべきだと思います。したがって、コードカタはこの目標を達成するための技術であり、私の答えは、私が見たように、その技術は価値がないというものでした。私は目標に完全に同意しますが、それは問題ではありませんでした。
スペンサーラスブン

11

私の観点からの主な欠点は、それが恐ろしく退屈であることです。また、プログラマーは、何か役に立つことやクールなことをするソフトウェアの開発に成功しているようです。コードカタアプローチは、その反対のように思われます。


2
カタスはあなたに新しいものを教えます。プログラマーが目指していることの反対に、どうしてそれができるのでしょうか?それはパズルを解くことでもあり、優れたプログラマーの大多数が「退屈」と考えるものではありません。実際、これはハッキングの核心です。
コンラッドルドルフ

4
@KonradRudolph繰り返しがカタの中心だと思った?そのため、問題を一度解決すると(おそらく新しくてエキサイティング)、その後同じ問題を何度も解決し続けることになります。カタスをかろうじて見たので、間違っているかもしれません。
ケビンD

@Kevinこれはばかげていることに同意します(特に問題を解決するさまざまな方法を見つけようとしない限り)。私は「型」をそのようにしたことは一度もありません。ただの一般的なプログラミングパズルです。
コンラッドルドルフ

「新しいことを教える」と同じことを何度も繰り返していますか?

質問で提供されているリンクを読んでいなかったことは、回答で明らかです。
マイクパートリッジ

8

カタは、あなたが努力するべきものの正反対を意味します。

トレーニングで使用され、技術のスキルを示すために設計された、武道の特定の動きのシーケンスで構成されるエクササイズ

カタ(起源:1950–55; <日本語:形状、パターン)という用語は、武道で使用されており、あなたの質問は、タッチタイピングのような筋肉記憶の暗記についてです。

オリジナルの空手キッドでは、車のワックスを掛け、床をサンディングし、フェンスをペイントしましたが、これらはすべて文脈から外れており、この場合は筋肉の記憶を提供するだけの説明なしで教えられたカタスでした。彼らが何を意味するのかは、先生がやってきてこれらの虚ろな活動のコンテキストを教えてからだ。

私は、同じことがで物事を置くためにメンターなしに、ここでは適用されないと思うコンテキストを再実行し、問題解決の間違った複数の言語では良い単一のものよりもです。メンターがいなければ、どこを改善すればいいのかは時間の無駄です。

言語やプラットフォームのイディオムやセマンティクスの新しいバリエーションを学ぶことで問題を創造的に解決することとは正反対です。

System.out.println()できるだけ楽に入力できるようにしたい場合は、カタを練習します。

あなたは問題の解決策を改善したい場合は違う、実装時および/またはスペースの要件を軽減するために以上の慣用的な原則を適用、そのISN ないカタはであなたを助けることを何か。

同じことを何度も何度も実装し直したという業界用語は、少しずつ改善され、完全性の疑わしい利点を求めてすでに採用されています。これはゴールドメッキと呼ばれます。

同じ言語/ランタイム/プラットフォームに適用される場合、使用すべき用語はリファクタリングです。そして、動作中のプログラムを別の言語/ランタイム/プラットフォームに移動する際の移植カタは、セマンティクスを完全に理解することなく、ヒップでクールで神秘的に聞こえるので、おそらく誤って選択されたでしょう。

ほとんどの開発者、特にジュニア開発者が毎日しなければならないことは、計画、経験、またはガイダンスをほとんど必要とせずに、さまざまな困難な問題を解決することです。

特定の解決策に磨きをかけるためだけに、同じ練習を繰り返し行うのは学者だけです。開発者としてのキャリアを成功させるスキルは、反復ではなく適応にあります。

仕事の後に勉強する必要のない頭の良い人はいないと言い、仕事で8時間で知る必要のあることすべてを学ぶことができますか?


あなたが実践しているのが、デザインの再設計と改善、つまりデザインプロセスの繰り返しであるとしたら、この用語は当てはまりませんか?もっと良いものを思いつくことができますか?
ビルK

既存のシステムを再設計および改善するための用語はリファクタリングです(コードのリファクタリングは、「既存のコード本体を再構築し、外部動作を変更せずに内部構造を変更するための規律ある技法」)。彼らは、セマンティクスを理解せずにクールで神秘的に聞こえるので、カタを選びました。

リファクタリングという用語は、リファクタリングが得意であるという実践とは非常に異なる用語です。誰でもコードをリファクタリングできますが、それは彼らがそれをうまくやるか、または良いリファクタリングの機会を認識するように実践されていることを意味するものではありません。「Practicing Refactoring」はその下降語ですが、Kataの献身を伝えていないので、Kataが少し良い選択かもしれないと思いますが、まだもっと良いフレーズがあるという理論は受け入れています。
ビルK

1
実際、メッキとは「...追加またはより洗練された機能」を指します。あなたが説明することは、事実の後ではありますが、時期尚早の最適化に似ています。
ジョシュアドレイク

5

比phor「カタ」は最高ではないかもしれないことに同意します。空手のカタは、完全に、鮮明に、そして自動的に実行できるようになるまで、特定の個別の動きを練習する目的で実行されます。これは、批判的思考と創造性が必要な活動にうまく変換されません。(たとえば、タイピングに変換するとよいでしょう)。

つまり、名前の失敗はアクティビティの失敗ではありません。誰かが良くなりたいと思っていることを実践することにはどんな潜在的な欠点があるのでしょうか?機会費用の観点からすると、それを行うのにかかる時間が欠点であると言えるかもしれませんが、実際には投資です。したがって、ソフトウェア開発の技術を実践するのに費やした時間は、株式や債券に費やされたお金が長期の貯蓄者/投資家に支払われるため、ソフトウェア開発者に費やされます。それは「欠点」ではなく、テーブルステークスです。


3

あなたは困難で、あなたの能力の範囲を超えたものを試すことで良くなります。自分に挑戦。武道のように、同じ「コード型」を何度も実行しても、それは行われません。スキルを向上させるのではなく、能力を停滞させると思います。

初めて練習の方法として使用できますが、制限されています。代わりにオイラープロジェクトを使用するように人々に伝えます。より多くの問題とより挑戦的な。


同じプログラムを何度も何度も書くことは有用で興味深い場合があります。たとえば、毎回異なるアルゴリズムを使用したり、異なる言語で使用したりする場合です。しかし、おそらくカタではありません。
9000

2
質問に記載されているリンクを読んでください。あなたが名前から推測するように考えは考えが心のない繰り返しではありません。
マイクパートリッジ

@ 9000実際、それがまさにコードカタスを理解する方法です。多くの場合、新しい言語を学習するとき、またはすでに解決された問題に新しいアプローチを試みるときに使用されます。
ジョシュアドレイク

3

私にとって、このテクニックの主な欠点は、あなたの時間を最適に使用していないことです。

この演習の学習価値にも疑問があります。それを上手くやり直すために何度もやり直すときは、専門家のフィードバックが不可欠です。質の高いフィードバックがなければ、何かを学ぶこともできますが、間違ったことを非常によく学ぶ可能性があります。

誤解しないでください、プログラミングはプログラミングが上手になるための唯一の方法であり、カタは間違いなく練習の一形態です。しかし、コーディングの競合問題の解決、独自の「楽しいプロジェクト」の作成、新しいプログラミング言語の学習なども同様です。最終的には、最も快適な手法を選択し、その過程で明確なガイダンスがあることを確認する必要があります。


どのようにしてガイダンスを見つけましたか?私は同じ問題に苦しんでいます。
CodeYogi

1

何らかの形のカタがなければ、あなたは素晴らしいコーダーになることは決してないと信じています。カタは練習です、それは文字通りそれが意味することです。これを例に挙げてみましょう。アスリートは、「100メートルのダッシュを見せて走らせるだけです、ねじ練習」と言います。それは勝利戦略のように聞こえますか?それはこの方法行われたことがありますか?

ボブおじさんの「The Clean Coder」を読むことをお勧めします。彼は、プログラミングの分野におけるプロフェッショナリズムのこの(および他の)トピックについて深く掘り下げています。

ああ、あなたはカタをして家族を育てることができないという主張は、単に言い訳です。経験から言えば、子供はある時点で眠りにつく...


3
コーディング!= 100メートルのダッシュを走らせます。ただし、その100メートルがある日は重く茂った地雷原を通り、翌日は地雷で埋められた田んぼを通り、翌日は重いスナイパーの火の下で毒蛇で満たされた沼地を通ります。 ...カタは意味的に間違った用語です

2
-1有料の時間であっても、仕事でトレーニングを行うことができます(人々がこれを忘れているように見える理由はわかりません)。すべてが純粋な仕事でも純粋な学習でもありません。
-joshin4colours

@JarrodRobersonあなたが今描いたシナリオは、兵士が日常的に行うことです。それで、あなたはかなり悪い類推を選びました。率直に言って、私は9-5の仕事をして、家に帰って学習をやめ、競争力を与えてくれる人たちにとって幸せでなければなりません。
タドン

3
マーティン・ファウラーはかつて、従業員のトレーニングにお金を使うことについて尋ねられました。、そして彼の応答は「いいえ、私は彼らを訓練しなければ彼らは留まるのではないかと恐れています!」。すべての雇用主がトレーニングを費用と見なすわけではなく、優秀な従業員はそれを投資と見なします!

ほとんどの開発者、特に若い開発者が毎日しなければならないことは、ほとんどの計画、経験、またはガイダンスなしでさまざまな困難な問題を解決することです。かなり正確なアナロジーだと思います。特定の解決策に磨きをかけるためだけに、同じ練習を繰り返し行うのは学者だけです。開発者としてのキャリアを成功させるスキルは、反復ではなく適応にあります。仕事の後勉強する必要のない賢い人はいないと言い、8時間で必要なものすべてを学ぶことができます。

1

武道の文脈でカタだけを行うのは無意味です。前に述べたように、カタは、あなたに形を教える動きの振り付けです。あなたは動きを知っていますが、それらを適用する方法を知りません。どのような状況で役立つかわかりません。本当に便利なことをしたい場合は、アプリケーションが必要です。これがBunkaiです。

ソフトウェアのコンテキストでは、コードカタは、アルゴリズム、ツール、デザインパターン、またはその他のテクノロジになります。それを知ることは良いことですが、それを理解するには適用する必要があります。実際にマスターするには、さまざまなコンテキストで使用する必要があります。文海は、そのカタまたはカタの一部が役立つ具体的な状況です。

私はその方法論に何の問題もないと思います。これは何かを習得する方法です。何かを学び、それを練習し、詳細を追加し、練習し、別の詳細を追加し、練習します。


-1

プログラミングは、絵画や音楽のような芸術です。誰かがあなたが言うことができるお金のためにミュージシャンやアーティストになったとき、インスピレーションはありません、パフォーマンスはあなたの時間の価値が本当にありません。あなたが芸術に興味があるなら、何もあなたがそれを実践し、絶えず洗練することを止めることはできません。

バーミュージシャンや家の画家であることを幸せにする人々の余地は常にありますが、彼らは全く異なるクラスの才能です。ほとんどの家の画家は練習のアイデアを笑うと思いますが、私は研究と技術を実践した画家に違いありません-芸術としての仕事を本質的に認識することは、あなたの家を描くような平凡なものでさえ、著しく良い仕事をするでしょう。

一部の人々は、一部の習慣の練習の価値を認識するでしょう。評価する立場にあり、単なるソリューションではなく、アート(リーン、シンプル、理解可能なコード)を作成できる人を探している場合、それだけで価値があります。

追伸 私は自分自身を驚くほど芸術的であるとか何かとは呼んでいません。抽象的な問題についてはカタをしませんが、その価値を認識しており、生産コードをかなりリファクタリングしようとしています。


特に、過度に訓練されたミュージシャンは、理論的完全性によって否定的に先入観を抱く可能性があり、これは ソフトウェア開発のキャリアにとって非常に危険です。音楽には表現の要素があり、プログラミングソフトウェアにはこれがありません。Apple製品にはこの表現があると主張することもできますが、それはデザイン表現であり、コードが直接見られたり認識されたりすることはありません。音楽とアートは、ソフトウェア開発の悪い例えです。そして、あなたは彼らが彼らの仕事に誇りを持っていないか、品質に価値があるとは思わないという点で、ブルーカラー労働者に対する著しい偏見を示しています。

トレーニングと練習を混ぜないでください。過度にトレーニングされていることは、過度に実践されていることとは非常に異なります。コードの表現レベルが配信時間とコードの安定性に見られると思わない場合、議論の共通の基盤があるかどうかはわかりません。
ビルK

私が思うに関係なく、ほとんどの顧客は、慎重に作成されたコードと、アプリケーションの種類がほとんどの場合機能する限り、どれだけエレガントであるかを認識せず、気にしません。大多数の人々がVHSの音質とビデオ品質、高圧縮されたインターネットビデオまたはカセットテープ、そして今では苦情なしにそのニュアンスをすべて除去する高圧縮されたmp3に関心を持つことはありません。過度に訓練されていると、過度に実践されているよりも悪化しており、過度に訓練されていると、ソフトウェア業界で「十分」で悲惨なことを無視します。

プログラミングは芸術ではなく工芸です。両者には職人技と美学のレベルがありますが、芸術は本質的に職業ではありません。ソフトウェア開発は職業です。長い目で見ると、アーティストよりも多くの人がソフトウェアを書くお金を稼いでいます。上記の売り切れの定義が差別化を意味するように、ソフトウェアは主観的なものではなく、その存在のためだけに存在するわけではありません。美術大学に通った人として、私はあなたに言うことができます、プログラミングは職業工芸であり、芸術作品の作成とは何の関係もありません。

うまく作られたソフトウェアが、職人によって作られたソフトウェアよりも速く、安価で、単に優れていると思わないのなら、あなたはそれが正しく行われたのを見たことがない。マスターアーティスト、ミュージシャンを見たり、プロスポーツ選手と対戦したり、プロスポーツ選手と対戦したりした人の数はそれほど多くありません。結果もそうです。1人のアーティストは5人の職人のスピードと品質を上回ることができますが、幸運な人はそれを見たことがないので、それが存在するとは信じていません。
ビルK
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.