代码kata的缺点


41

代码kata是一个概念,旨在通过多次尝试在每次迭代中改进代码的小问题来磨练程序员的技能。这个名称源于武术kata的类比,其中形式(aka kata)是一种反复进行的练习,可导致改进。

从我对这个问题最后一个问题的反应中,我想知道这种方法的缺点是什么?


+1以抵消应用的无效-1。就像我对Code kata的疑问一样,这似乎是一个有效的问题,但无法指出原因。
mattnz'3

9
直到今天,我仍然不知道这是什么。现在我只是检查了一下,恕我直言,这只是每个理智的程序员所做的事情的奇特名称,并且在开发时会自动学习:练习。因此,对我而言,缺点是:它只需要花费额外的时间,否则就可以使用。
stijn 2012年

11
嗯......很显然,代码卡塔的一个主要缺点似乎是,人们不理解什么代码卡塔是:-)批评代码卡塔
约尔格W¯¯米塔格

19
@JörgWMittag-这是因为“ kata”一词是一个不好的类比,因为它暗示了在现实世界中几乎没有实际意义的僵化形式的实践。在编程或商业场合中使用诸如“黑带”或“ kata”之类的武术词语会让我感到讨厌。
jfrankcarr 2012年

Answers:


22

原则上,我看不到代码kata中的缺点。您尝试使用不同的方法和不同的语言多次完成同一任务。但

  1. 很难将其引入工作场所。通常希望您精通或有一定生产力。我并不是说这没有用(花一些时间来提高新员工的技能,而不是花钱支付他将来会写的不太好的代码),但这仍然很困难。
  2. 您必须切实尝试在某种意义上进行改进。以相同的方式编写相同的代码一千次不会使您有所进步(相反,它会使您变得乏味)。您必须了解以前的错误,出现的错误或未按预期解决的问题。这是最重要的部分。这是一种自学的形式,因此您必须学习。

1
我接受了这个答案,因为它确实直接解决了这个问题(而不是“ kata”术语),并着眼于代码kata实践的潜在问题。这并不是说其他​​答案不是好答案-实际上,我很乐意接受不止一个答案!
Sardathrion 2012年

43

我认为编程kata就像武术kata一样,主要是关于形式而不是功能。它可能会教您编写精美的代码,但不会教您解决编写代码所要解决的问题。我认为,作为程序员的一种更好的改进方法是解决那些需要实际解决问题的难题,并致力于大型项目,这些项目将以代码kata永远不会教您的方式教会您精心构造的代码的价值。

顺便说一句,我认为像“代码kata”和“软件工艺”这样的术语更多地是关于使我们的职业浪漫化,而不是描述任何新颖或有用的东西。


4
将该句子设为+2。
Erik Dietrich 2012年

6
虽然我同意解决问题是提高程序员水平的一种好方法,但是学习编写精美的代码也是值得的。我希望我目前维护的一些原始代码开发人员花了一些时间和精力来编写优雅的代码,而不是为了使事情正常工作而进行复制和粘贴。
Mike Partridge'3

1
麦克的评论为+3。通常,花在维护代码上的时间要比最初编写它们所花的时间多得多。您希望在有人建造您的房屋时会应用手工艺,因为您将在其中居住很长时间。当某人构建软件时,应该应用相同的方法,但是在很多时候却不是。
Kaleb Brasee 2012年

@KaptajnKold:您是从您的经历谈起吗?我很想听听某位通过CodeKata尝试提高自己的技能而失败的人的评论。
dzieciou 2012年

2
@dzieciou:我在练空手道已有几年的武术kata经验。尽管我相信可以从kata中学到一些有用的战斗方面的知识,但我也相信这最终并不是一种非常有效的训练方法。他们应该像他们所说的那样训练。那就是您的目标是成为一名更好的战士。有些人发现练习kata本身就是一种快乐的追求。没有错。最终,其中一些变得非常好。在kata。
KaptajnKold

20

代码kata只需要时间。

作为全职的开发人员和父亲,我不想让计算成为业余爱好。

而且我不认为老板会付钱给我开发与当前项目无关的应用程序。


10
有没有一种不需要时间的学习?除非您有幸每次都能进行新项目。
2012年

38
如果您没有花费最少的空闲时间来定期提高编程技能,那么您的职业生涯将面临极大的危险。
Ladislav Mrnka'3

7
为此+1。尽管我绝对喜欢编程,并且我能够从自己喜欢做的​​事情中赚钱,但是我看不到在工作之外进行更多编程的意义。我还有很多其他爱好(例如DJ,制作音乐,举重,绘画和街舞),我看不出要花更多的时间去做每周40个小时的事情是有意义的。
安德里亚斯·约翰逊

7
@mouviciel:这就是问题所在:如果项目需要,您的老板愿意为您的专业发展付出代价,但您应该愿意提高与当前项目无关的技能,也许与当前项目无关平台。那就是建立您的职业/社会保障的基础。
Ladislav Mrnka'3

6
@LadislavMrnka-我同意你的看法。但是,代码kata不能解决该问题。
mouviciel 2012年

13

作为拳击手,我不得不不同意kata背后的原理。它太死板了,无法实际使用。总之,您必须了解如何在自由流动的环境中应用所学的原理。

这并不是说不应该学习和改进该技术。练习手提袋可以使您像使用kata一样使用拳打和摸索如何扔袋。但这并不那么严格。您正在同时练习许多事情,在袋子中四处移动,从稳定的平台上投掷,瞄准,呼吸,这样的例子还在继续。

最重要的是,一切都将以实际使用的方式一起学习。如果您可以编写有史以来最漂亮的for循环,但不了解如何将其放入程序中,那么它有什么用呢?

我想说的是,如果您想练习,最好做的事情是建立自己的工具或使用自己使用的工具。它需要锻炼您的所有技能,最后您可能会有一些有用的东西。


发现。首先,我也是一名拳击手/程序员:)。
保罗·桑瓦尔德

1
代码选项卡与严格的重复无关。他们更多地是要解决问题,然后再努力改进解决方案,直到满意为止。摘自Kata One:“此kata的目标是实践一种宽松的实验建模风格。寻找尽​​可能多的不同方式来处理这些问题。考虑每种情况的各种权衡。哪种技术最适合探索这些模型?记录它们?您如何验证模型是否合理?”
Mike Partridge 2012年

4
我同意“ kata”一词并不完美,但不要因为名字而忘记他们的观点。而且,它们也不是所有单词问题;摘自Kata Two:“以您选择的语言和技术实施二进制搜索例程(使用下面的说明)。明天,使用完全不同的技术再次实现它。第二天重复相同的操作,直到您有五个完全唯一的(例如,一种解决方案可能是传统的迭代方法,一种可能是递归方法,一种可能是使用函数样式传递数组切片,等等)。”
Mike Partridge 2012年

3
@MikePartridge可以说明我的观点。kata会涉及一种二进制搜索方法,这种方法每天都会得到改进,例如使用更少的行,或者从头开始编写它所花费的时间更少。如何定义概念对于定义它很重要。他本来可以称之为实践编程,这就是文章的目的,而不会带来错误的负担。作者有责任选择能正确定义其思想的词语和概念,而不是抱怨听众由于选择了隐喻而拉扯了错误的联想。
Spencer Rathbun 2012年

3
@MikePartridge以我为例,我相信所有程序员一直都在学习/改进,或者应该一直在学习/改进。因此,代码kata是一种有助于实现此目标的技术,我的回答是,如我所见,该技术并不值得。我完全同意这个目标,但这不是问题。
Spencer Rathbun 2012年

11

从我的角度来看,主要缺点是它会非常无聊。程序员似乎也对开发有用或很棒的软件很感兴趣。代码kata方法似乎与此相反。


2
卡塔斯教你新东西。这与程序员的目标相反吗?这也解决了一个难题,不是大多数优秀程序员都认为“无聊”的东西。实际上,这是黑客攻击的核心。
Konrad Rudolph'3

4
@KonradRudolph我以为重复是卡塔的心脏?因此,您将解决一次问题(也许是新颖而令人兴奋的问题),但是您将一次又一次地继续解决相同的问题。我几乎没有看过Katas,所以我可能是错的。
凯文D

@Kevin我同意这听起来很愚蠢(除非您专门尝试找到解决问题的其他方法)。我从来没有做过“ katas”,只是普通的编程难题。
Konrad Rudolph'3

如何一遍又一遍地“教你新东西”做同样的事情?

很明显,您没有回答问题中提供的链接。
Mike Partridge 2012年

8

卡塔(Kata)意味着您应该追求的目标恰好相反

一种由一系列武术特定动作组成的运动,用于训练并旨在展示技巧

武术中使用的Kata(起源:1950–55; <日语:形状,图案)一词,您的问题是关于记忆记忆的死记硬背,触摸打字

在最初的《空手道小子》中,给汽车打蜡,给地板打磨,给篱笆粉刷都是被教导的卡塔斯语,完全脱离了上下文,在这种情况下,没有任何解释只是为了提供肌肉记忆。直到有老师进场并给这些空洞的活动提供上下文,它们才有意义。

我认为同样的事情在这里适用,没有指导者将事情放到上下文中去做,以解决多种语言中的错误并不比一种更好。如果没有导师告诉您改进的地方,那是浪费时间。

这与通过学习语言或平台的习语和语义的新变化来创造性地解决问题的方式恰好相反。

如果您想System.out.println()尽可能轻松地键入文字,那么练习那将是一种Kata。

如果你想提高在解决一个问题的不同实现,以减少时间和/或空间的要求或申请更多的惯用原则,即ISN 没有的东西,卡塔会帮助你。

业已存在一个公认的术语,即在已经努力争取小幅的增量改进和可疑的完美收益之后,一遍又一遍地重新实现同一事物,它被称为镀金

当应用于相同的语言/运行时/平台时,它们应使用的术语是“ 重构”。并且在将工作程序移至其他语言/运行时/平台时进行移植。选择Kata可能是错误的选择,因为它听起来既时髦又酷又神秘,却没有完全理解其语义。

大多数开发人员(尤其是初级开发人员)每天要做的事情是,只需很少的计划,经验或指导,就可以解决各种难题。

只有学者才能反复研究相同的练习,只是为了寻求一种特定的解决方案。在开发人员方面取得成功的技能在于适应能力,而不是重复能力。

谁说没有聪明的人不需要下班后学习,而是可以在工作中的8小时内学到所有需要了解的知识,有时甚至还需要更多知识?


如果您正在实践的是重新设计和改进设计-重复设计过程,该术语不适用怎么办?你能提出一个更好的选择吗?
Bill K

重新设计和改进现有系统的术语是重构(代码重构是“用于重构现有代码主体,改变其内部结构而不改变其外部行为的纪律技术”)。他们之所以选择Kata,是因为它听起来很酷而且很神秘,却没有理解语义。

重构这个术语与熟练重组的完全不同。任何人都可以重构代码,但这并不意味着他们可以很好地进行重构,也不能在识别良好重构机会方面得到实践。尽管“实践重构”是它的统称,但它并未传达出Kata的奉献精神,因此,我认为Kata可能是一个更好的选择,尽管我对存在一个更好的短语的理论持开放态度。
Bill K

1
实际上,“ 镀金 ”是指“ ...其他或更抛光的特征”。尽管事实如此,但您描述的内容似乎更像是过早优化
约书亚·德雷克

5

我同意隐喻“ kata”可能不是最好的。进行空手道搏斗是为了进行特定的,不连续的运动,直到可以完美,清晰,自动地执行它为止。这不能很好地转化为需要批判性思维和创造力的活动。(这将更好地转化为输入)。

也就是说,名称失败不是活动失败。练习某人想要变得更好的东西可能会有什么弊端?从机会成本的角度来看,我想可以说花时间做为一种缺点,但实际上,这是一项投资。因此,花在实践软件开发技巧上的时间是对软件开发人员而言,因为花在股票或债券上的钱是对长期的储蓄者/投资者而言。这不是“回扣”,而是赌注。


3

通过尝试困难而力所不能及的事情,您会变得更好;挑战自己。像武术形式一样,一遍又一遍地执行相同的“代码kata”不会这样做。我认为这会停滞您的能力,而不是帮助您提高技能。

第一次将其用作练习方法,但有一定局限性。我告诉人们改用Euler项目。更多问题,更具挑战性。


一遍又一遍地编写相同的程序既有用又有趣,例如,如果您每次使用不同的算法和/或使用不同的语言来编写它。但是可能不是kata。
9000

2
阅读问题中提供的链接;这个想法并非如您从名字中假设的那样无意识地重复。
Mike Partridge 2012年

@ 9000实际上,这正是我理解Code Katas的方式。在学习新语言或尝试新方法解决已解决的问题时经常使用。
约书亚·德雷克

3

对我而言,该技术的主要缺点是它对您的时间的利用不足。

此练习的学习价值也值得怀疑:当您过度完成某件事以使其更好时,专家的反馈至关重要。没有高质量的反馈,您也会学到一些东西,但是有机会很好地学习错​​误的东西。

不要误会我的意思,练习仍然是变得擅长编程的唯一方法,而kata无疑是一种练习。但是,解决编码竞赛问题,编写自己的“有趣的项目”,学习新的编程语言等也是如此。最终,您需要选择最舒适的技术,并确保在使用过程中获得明确的指导。


您是如何找到指导的?我在同一个问题上挣扎。
CodeYogi '12

1

我相信,如果没有某种形式的Kata,您将永远不是一个出色的编码人员。卡塔(Kata)是实践,这实际上是什么意思。举个例子:一名运动员说:“我会出现并跑100米短跑,用螺丝练习”。这听起来像是制胜法宝吗?难道曾经做过这样?

我建议人们阅读Bob叔叔的“ The Clean Coder ”,他深入探讨了编程领域的这个(和其他)专业知识主题。

哦,有人提出不能做卡塔和养家的论点只是借口。从经验上讲:孩子们在某个时候入睡...


3
编码!=跑100米破折号,除非有一天是100米穿过茂密的雷区,第二天是从地雷充满的稻田,第二天是在狙击手猛烈的烈火下,第二天是充满毒蛇的沼泽,请参见模式...卡塔(Kata)在语义上是错误的术语。

2
-1即使在带薪时间上也可以在工作中进行培训(不确定为什么人们会忘记这一点)。并非所有事物都是纯粹的工作或纯粹的学习。
joshin4colours 2012年

@JarrodRoberson您刚才描述的场景是士兵的日常工作。因此,您选择了一个相当糟糕的类比。坦白说,我应该为那些完成9-5工作然后回家并停止学习的人们感到高兴,因为这给了我竞争优势。
ThaDon 2012年

3
曾经问过马丁·福勒(Martin Fowler),要花钱培训您的员工:“您是否害怕培训他们会辞职?” ,他的回答是:“不,如果我不训练他们,他们会留下来的!” 。并非每个雇主都将培训视为支出,好雇主将其视为投资!

大多数开发人员(尤其是初级开发人员)每天要做的事情是,只需很少的计划,经验或指导,就可以解决各种难题。我认为这是一个相当准确的类比。只有学者才能反复研究相同的练习,只是为了寻求一种特定的解决方案。在开发人员方面取得成功的技能在于适应能力,而不是重复能力。谁说没有聪明的人不需要下班后学习,他们可以在8小时内学习所有需要的知识和更多信息。

1

在武术背景下,只做katas是没有用的。如前所述,katas是动作的舞蹈编排,可以教你形式。您知道这些动作,但不知道如何应用它们。您不知道它们在哪些情况下有用。如果您真的想对它们做一些有用的事情,则需要一个应用程序,即Bunkai

在软件环境中,代码kata是算法,工具,设计模式或任何其他技术。知道它是好的,但是您需要应用它来理解它。您需要在不同的上下文中使用它来真正掌握它。文凯将是一种特殊的情况,其中该kata或kata的一部分很有用。

我没有发现该方法有什么问题,这就是如何掌握一切的方法:学习,实践,添加细节,练习,添加其他细节,练习等。


-1

编程是一门艺术,就像绘画或音乐一样。当某人成为金钱的音乐家或艺术家时,您可以说,没有灵感,这种表演并不值得您花时间。如果您热衷于艺术,那么任何事情都不会阻止您练习和不断完善它-每天都在完善一种技术,并注意到大多数人永远看不到的细微差别。

人们总是乐于当酒吧音乐家和室内画家,但他们是完全不同的才能。我想大多数房屋画家会嘲笑实践的想法,但是我敢打赌,从事研究和实践技术的画家-本质上将他们的工作视为艺术会做得明显更好,即使在像平凡的房子上画漆一样。

有些人会意识到一些做法的价值。如果您可以评估并且正在寻找可以制作艺术的人(精简,简单,可理解的代码),而不仅仅是解决方案,那么这本身就是有价值的。

ps。我并不是在称呼自己具有艺术性或其他任何东西-我不对抽象问题进行Kata评估,但我认识到了价值所在,并且确实尝试了一些重构我的生产代码。


尤其是训练有素的音乐家会被理论上的完善所否定,这 对于软件开发事业是极其危险的。音乐具有表达的元素,编程软件没有这个。您可能会争辩说Apple产品具有这种表达方式,但这就是设计表达方式,从不直接看到或感知代码。音乐和艺术是软件开发的不良类比。而且,您对蓝领工人表现出明显的偏见,因为您认为他们对他们的工作不感到自豪,也不看质量。

不要将培训与实践相结合。过度训练与过度训练有很大不同,如果您认为交付时间和代码稳定性看不到代码的表达水平,那么我真的不知道我们是否有共同的讨论基础。
Bill K

不管我怎么想,我知道只要应用程序大多数时候都能正常工作,大多数客户就不会认可并关心精心编写的代码以及精心编写的代码。就像大多数人从不关心VHS的声音和视频质量,高度压缩的互联网视频或盒式磁带,以及如今高度压缩的mp3一样,消除了所有细微差别,而没有任何抱怨。过度训练比过度训练更糟糕,过度训练会使人们在软件行业中忽略“足够好”并且痛苦不堪。

编程是一门手艺,而不是一门艺术。两者都有工艺和美学水平,但是自然界中艺术不是职业,软件开发是职业。从长远看,比软件艺术家赚钱的人更多。软件不是主观的,也不是仅仅出于自身的存在而存在,绘画和音乐的存在常常是为了取悦创作者,而不是因为您上面对售罄的定义暗示了差异。作为上过艺术大学的人,我可以告诉你,编程是一种职业技能,与创作艺术品无关。

如果您不认为制作精良的软件比工匠制作的软件交付速度更快,价格更低廉且仅好于普通工匠,那么您就不会认为它做得正确。并不是很不可能,有多少人看过大师级艺术家,音乐家或与职业体育选手一起玩/对抗,他们并不普遍,在我们的行业中很难识别,但是人才的差异是相同的结果是这样。一位艺术家可以在速度和质量上胜过5位工匠,但很少有人幸运地看到它,因此他们不相信它的存在。
Bill K
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.