避免成为“理论家”程序员


28

我在SO的几篇文章中找到了这篇文章。我发现自己属于第六原型。“理论家”。

它将“理论家”定义为:

理论家知道有关编程的所有知识。他或她可以花4个小时来讲解一门晦涩的编程语言的历史,或者提供证明您编写的代码的效果不是十分理想,并且可能还要花费三纳秒才能运行。问题是,理论家对软件开发一无所知。当理论学家编写代码时,它是如此“优雅”,以至于凡人都无法理解。他或她最喜欢的技术是递归,并且每个代码块都经过了最大程度的调整,以牺牲及时性和可读性为代价。

理论家也容易分心。一个简单的任务需要一个小时才能完成,因此理论家需要三个月的时间,因为他们认为现有工具还不够用,因此他们必须构建新工具来构建新库,以构建符合其高标准的全新系统。如果您可以让Theoretician成为您最好的球员之一,则可以让他或她在项目本身的范围内发挥作用,而不必花时间在“终极排序算法”上。

即使在做一个简单的项目时,我也总是会因试图从头开始过度设计所有东西而感到困惑(这也许可以解释为什么我浪费了大约两年的时间来尝试从头开始构建一个操作系统。但是即使我看到了,最终毫无意义)。

有什么可以帮助我避免这样做的?并坚持使用KISS原则吗?

谢谢


3
好吧,您已经知道趋势是一个好的开始!
Michael K

13
我不喜欢这篇文章如何重新定义“理论家”和“优雅”等词语,以表示“不好”。
Rein Henrichs

2
一旦您意识到最富智力挑战的任务是编写一个尽可能简单易读的真正复杂的大脑扭曲代码,那么您将克服其余的相关问题。
SK-logic

15
真正的优雅在于简约。如果其他人无法理解代码,那么它可能不如您想象的那么优雅。
Berin Loritsch 2011年

1
“如果您将两个Code Cowboys放在同一个项目中,那肯定会失败,因为他们践踏彼此的变化并互相射击。” — —这是出色的:)
P Shved

Answers:


21

我本人是一名天生的理论家,我可以告诉您,在敏捷商店工作将迅速而果断地治愈所有这些趋势。特别是,具有配对编程(理想情况下经常旋转),测试驱动的开发,定时装箱和有限制的冲刺的eXtreme编程操作会立即为所有同事公开您的工作,并要求您开放并进行协作每分钟。与理论家式的工作蓬勃发展的孤立办公室环境中的单独任务相比,这是一个巨大的转变。这需要完全的诚实和完全的正直,因为每个人都在积极不断地依赖其他人。

我仍然珍视自己的肚脐,但我必须在家中或在极少数情况下可以从事不属于主线开发的附带项目的情况下,尽情享受。


是! 让另一位程序员来对抗理论倾向非常有效。
Michael K

我一直在尝试将敏捷概念应用为一个单独的程序员,并且效果很好。
鲍勃·墨菲

10
  1. 为您应该开发的目标设定目标。

  2. 将这些目标缩小到可以在不久的将来实现的目标。

  3. 然后专注于那些目标,消除所有其他考虑。没有背景。没有历史。没有扩展名。没有一般性或抽象性。

  4. 然后将它们进一步缩小到最小,您可以做到的。不好。不灵活。无法维护。完全可以接受。

  5. 然后优先处理达到您可以做到的最低要求的绝对最小值。关键是要选择一个星期左右的日期并朝该日期建立。如果您一周之内不能送货。狭窄。焦点。修剪。降低。

  6. 然后消除绒毛。你只有一个星期。继续切割。

  7. 然后集中精力于将尽早完成的简化实施。理想情况下,不到一周,因此您有时间编写文档。


我曾与理论家合作。我认为“额外”是避免实际做可能被标记为失败的事情的借口。

做-失败-很难。谈论做某事比做某事容易。大量研究和思考是一种避免做错事然后在得知用户撒谎后进行重新处理的方法。

只需将代码放在它们前面。他们会将代码称为失败。它发生了。但是在失败的过程中,您将了解真正的要求。您将了解到他们说谎。


2
让我只说一句,而不是-1(这对于回答问题的人来说在道德上是有问题的):(a)“很难吗?” 过去,我花了许多通宵工作的辛苦工作来完成我的肚脐项目,其中一些(虽然实际上并非全部)确实使我工作的组织受益。理论家不是(或至少不是全部)懒惰的人。(b)“没有一般性或抽象性?” 真?您主张在软件设计中不要抽象吗?这似乎很严厉。(c)“无法维护?” 真???
Jollymorphic 2011年

@Jollymorphic:我什么时候说懒?我在“做”和“思考做”之间做出了微妙的区分,这可能涉及有限值的编码。您暗示“理论家”是个坏习惯。我提倡“一点都不抽象”,以此来打破习惯。我提倡“不可维持”作为打破习惯的一种方式。您实际要做的是您的问题。进行过多思考的大多数人继续进行大量思考以及间接和抽象,即使明确指示不这样做。这是一个习惯。通过实际采取措施来打破它,以打破它。
S.Lott

1
是的,我认为“努力”并不意味着“努力是艰辛的,而理论家们却懒得去做”,而是“做起来在心理上是困难的”-不断地努力(努力!)更安全,更舒适。而不是真正钉住并完成它。
Carson63000 2011年

6

我不确定这是一件坏事。显然,您需要提高工作效率,否则您将不会做自己的工作,但是对领域感兴趣,成为本领域的学生,可以这么说并不是一件坏事。

我会发挥您的优势,寻找机会,以您的风格和偏好为优势。

为了确保在继续学习用Erlang编写MVC框架(或其他有趣的东西)时保持生产力,您也许应该将更深奥的工作安排在一天一小时的时间上。在一天的剩余时间里,只需专注于艰苦的工作即可完成工作。当您看到有趣的东西时,会分散您的书签或做笔记但继续前进,然后在分配的时间段中返回。

我个人有很多看起来很有趣的URL,也有很多图书馆的书。最后,我可能会使用其中10%的URL,最后我可能会阅读50%的书籍,但我仍然可以完成日常工作。


5

我自己遇到了这个问题。两种技术有所帮助:

  1. 使用Pomodoro技术或其他一些时间管理技术来设置一系列非常短期的目标。当您必须弄清楚接下来25分钟内可以完成的工作时,它可以让您专注于有用的工作。
  2. 测试驱动的开发。如果必须在编写任何代码之前编写具体的测试,则可以最大程度地减少白日梦。(没有方法可以对“优雅”进行测试。)工作正常后,可能花费的时间比重构它要多,但是至少您将在编写真实的代码而不是虚构的理想。

不要过分殴打自己。让理论家专注并做有益的工作要比让那些不在乎的人扩大视野要容易得多。


4

避免使用stackoverflow.com。不要误会我的意思-我是忠实拥护者-但是SO和其他面向编程的论坛绝对善良的敌人。一段时间后,您可能会开始觉得成千上万的聪明人正看着您的肩膀,您写的东西还不够好。只是使某些东西起作用,并尝试使其易于理解。如果需要改进,您可以随时重新访问。

另外,避免使用您链接过的文章。您真的相信程序员有十种吗?还是您认识的人完全适合所描述的类别之一?此类文章之所以具有一定吸引力,是因为它们包含了一点点真相-您可以在某些刻板印象中看到自己和/或您的一些同事。但是,这些类别所占的水量与占星术迹象一样多。下次您在会议后混音器中尝试以下操作:“嗨,我是Code Cowboy!您是什么类型?”

这并不是说您的问题是不正确的-如果您过分思考,最好学习如何避免这种趋势。但是,不要让这个旁言不讳地告诉您如何对自己进行“枪杀”。


2

有一个简单的指南,如果将其完全拆开,则会完整说明如何避免这种情况。

做可能可行的最简单的事情。

-肯特·贝克


或正如爱因斯坦所说:“使一切尽可能简单,但不要简单。”
伊恩

问题在于,对于理论家来说,“简单”具有许多不同的含义。使用monads在Haskell中重写OS内核可能会使理论家成为“简单性”的终极目标。
克里斯托弗·约翰逊

1

我认为,除了编写理论性的API或框架外,一种使自己步履维艰的方法是迫使自己从头到尾编写实际的应用程序。尝试在某个事物周围放置一个时间框,并尝试在该时间内“完成”它。编写框架需要对设计模式和体系结构有很好的了解,但是我发现,在固定的时间内编写完整的应用程序与编写超精巧的设计框架需要不同的技能。

如果您想完成一个应用程序,那么在某个时候,您必须扎扎实实地完成它。这可能需要牺牲设计,或者由于某种约束而被迫以您不满意的方式实现功能。我有点像你-倾向于写和重写一百万遍,但是如果我面对必须在一定时间内完成的任务,我会发现我选择了自己的战斗方式,只能挑剔最重要的事情。


1

简单:

  1. 务实

实用主义是理论家的反面(在编程领域的信息/知识方面具有优势)。

如本答案所述,应用KISS,DRY,SOC和其他思维方式,意味着要务实。

您还可以通过阅读本书来学习务实:

http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X/ref=sr_1_1?ie=UTF8&qid=1302893763&sr=8-1

不要忘记,理论和实践可以一起工作,而不是一个人。没有大量的练习,您的知识就是虚无。没有大量知识,您将无法快速改善自己的练习。

所以,多练习。并学到很多东西。但是不要让一个人克服另一个。

在您的项目中,设置截止日期。坚持下去。然后,务实地考虑在该截止日期之前完成项目的方式。(真的是读本书)然后开始编码,开始阅读您需要了解的知识,从阅读转向编码并限制阅读时间。


0

Hrm ...也许尝试在需要您在时间表下编写应用程序的业务中找到工作。我要为自己说,至少在工作中,我可能离成为理论家的距离还很远。进行这类工作有其时间和地点,对于发展自己很重要。但是,尽管我很欣赏这种能力,但在商业世界中却没有任何位置,尤其是在我工作的地方。一个快节奏的开发环境,您有时要在几周内编写应用程序,而客户昨天要它们!我一直被出色的开发人员所蒙福,花时间让每个人作为一个团队来工作。

我的一个人尽力而为,但是像你一样,即使代码运行良好,他也总是不得不从代码中挤出最后一点,甚至到他开始编写本质上就是与环境提供的相同。一切都非常酷,但是当我们不得不按时取出东西时,这样的时间浪费了。通常,这些方面的项目会为团队提供支持,最终他开始感受到来自其他方面的压力,并逐渐壮大。我建议与其他一些必须将产品推出的优秀开发人员一起在团队环境中工作。总是有以后的时间来重构和重做或编写有史以来最强大的MergeSort。但有时您必须将产品推到可行的地步,然后将其发布给客户。


0

按照通常的含义,成为“理论家”没有什么错。拥有背景知识并能够理解最新的CS研究是一种很好的能力,因为它是一个优秀而新颖的想法的金矿。

在帖子的后半部分,这里的“真正问题”更加明显。知道具体的项目目标,并朝着这个目标而不是其他目标努力。在这种情况下,这实际上只是一个自律问题。有关此内容的更多信息,请参见S. Lott的答案。


0

将您的精力从编程甚至完成工作转移到交付工作软件上。它确定了您的优先事项。

如何实现这一点是另一个故事。最好的方法是构思一个项目,并通过所有步骤将其投入生产。之后,您将拥有与以前不同的心态。


0

感谢这篇文章。这使我的工作更加值得。我对作为软件开发人员的信息体系结构的教育感到同样的感觉。我常常发现自己在“改变的地方”而不是“改变的地方”挣扎。有太多的关系,周围有太多聪明的和通用的东西,要弄清楚它们是如何工作需要很长时间。

因此,我开始提出问题,甚至开始提出更多问题,直到我了解这是如何构建的。让我告诉你-它有效。对火灾的质疑越多,保持原始架构的重要性就越小,最后回到基础

if (weWantToMakeChangesToCodeLaterOnAndProbablyBySomeOtherProgrammer)
{
    Console.Writeline("We need to keep the code readable and simple enough ");
    Console.Wrietline("to make it easy for him/her to understand it!");
}

0

要求老板找一位导师,然后按照导师的话做。

困难的部分是保持专注,并认识到“嘿,让我们重写操作系统”对完成您已经完成的任务将不会有实质性的好处(这就是项目经理不会这样做的原因)。

还要让指导者编码之前检查您的所有设计,并在编码之后检查实际的代码。这将帮助您将注意力集中在需要完成的事情上。


0

我同样倾向于过度设计事物,需要自律和组织才能克服。当为其他人编码时,这是我的方法:

  1. 启动离散任务时,请花几分钟时间考虑功能,质量,交付日期等方面的实际需求
  2. 花一些时间计划如何做,将其分解为子任务,子任务等,并牢记代码客户的目标。
  3. 估计每个项目的时间,总计未知的时间最多为50%。如果一件物品要花费四个多小时,请将其分解一些。(如果我正在做大学项目,我会使用电子表格,但作为有多个客户的顾问,我会使用称为Redmine的问题跟踪系统。)
  4. 最重要的是:只做我想出的项目

当然,事情发生了。有时我发现我需要做更多的事情-所以我从第一名开始。有时,我发现一项任务所需的时间比我想象的要长得多-从第一名开始。有时我事先知道我的设计以后会需要更多细节-因此我计划重新评估子任务,从#1开始。

我做的越多,我就越了解它。自律是一种随着锻炼而增强的精神肌肉,而且我在估计事情需要多长时间和进行技术权衡方面也有所改进。我记得帕顿将军的一句话是有益的:“现在猛烈执行的好的计划比下周执行的完美计划要好。”

作为一个单独的开发人员,我的工作流程将其与敏捷的各个方面(包括看板)结合在一起。有时我会切线,但是我尝试将偏差限制为每周几个小时,并且效果很好。

如果您打算在私营企业工作,那么控制“理论家”的冲动非常重要。我认识的最杰出的程序员住在硅谷,但已经多年没有工作了,因为他以提供完美代码而闻名,为时已晚。

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.