当我对SO提出一些问题时,我发现自己经常遇到“不要重新发明轮子”或“从不重新发明轮子”这样的表达方式。他们告诉您使用某些框架或现有软件包。我知道这种态度从何而来,因为浪费时间在别人已经解决的事情上是不明智的。还是这样?

作为一名学生,我发现通过使用一些其他人编写的代码来解决我的问题,我无法如愿以偿地学习到很多东西,而且我获得的见识也较少。有时我觉得这句话主要是针对那些面临最后期限的在职程序员,而不是像我这样的学生。

“重新发明轮子”真的不好吗?也许我在想错了吗?也许有一种方法可以避免重新发明轮子,同时又学到很多东西?

评论

如果您让其他人为您举重(除非您正在学习成为经理),否则加入体育馆将不会给您带来太大的好处。

当您要制造车轮时,可以重塑车轮。当您建造房屋时,最好假设车轮制造商知道自己的工作比您做得更好。

您至少需要尝试制造轮子!否则,您不知道为什么要使用预制的。

声明绝对绝不适当。 :)

当您创建极其优化的代码时,可以重新发明轮子。标准库非常有用,但是通常可以创建不太通用但更快的东西。

#1 楼

我认为你说的很对。该站点上的大多数程序员可能都是专业人员,他们的目标几乎是尽可能快地创建高质量的软件。重新发明轮子在两个方面都无法实现这个目标。


重新编写存在的代码是浪费了精力,浪费在系统的独特部分上,使项目花费的时间比原来更长。必要。
任何代码的第一个版本都更有可能存在错误/无法预见的问题。大多数库和可重用组件都经过了多次测试和修补。如果您重新发明一种哈希算法或尝试创建自己的RDBMS(除非这是项目),那么最终结果将是次等。

学术环境的目标是学习,而不是按预算交付软件。重新发明轮子以了解辐条或车轴的工作方式是实现该目标的好方法。这就是为什么当很少有工作的程序员有需要这样做的时候,许多编程课程都包含一个有关构建编译器的类的原因。

评论


我同意理解事物是如何工作的想法,尽管我也希望编程学校在课程中花一些时间来学习如何使用第三方库以及为什么要这样做。我不断发现专业能力的程序员和开发人员无法做到这一点,并最终重新发明了轮子。

–说话
2012年4月11日下午6:11

关于编译器的要点

– Chani
2012年4月11日在9:17

我认为学习不要重塑方向盘更为重要。您可以做很多事情,而不涉及创建已经创建的东西。

–托马斯·博尼尼(Thomas Bonini)
2012年4月11日15:50

@Krelp当一个学生时,概念是最重要的部分。许多教授使用代码示例来实现桥梁理论和应用。这些是计划重塑图书馆的程序类型,但目的是确保学生理解教材。

–杰蒂
2012年4月11日在16:09

作为学生,您需要重新发明轮子,以了解其运行速度的快慢,但是作为专业人士,您需要使用商业轮子,以便尽可能快地运行。不幸的是,事实证明,SO主要是面向专业人士的网站,而不是面向学生的网站(他们是否暂时禁止[家庭作业]?)

– Tacroy
2012年4月11日17:40在

#2 楼

答案很大程度上取决于上下文。如果您想通过尝试实现哈希表来更深入地了解数据结构,那么“重新发明轮子”是您最好的选择。如果您正在学习如何编写编译器并需要一个符号表,那么实现自己的哈希映射而不是重用标准库中的哈希映射将完全浪费时间。

#3 楼

作为一名学生,我希望您通过首先复制一两个轮子开始学习编程知识,然后学习修改轮子以了解它们的工作原理并了解所有限制,从而开始进行编程教育。以后,您甚至可以自己创建一个全新的轮子,以查看是否可以改进设计,或向课程主管显示您对所涉及概念的理解。

作为一名工作专业人员,我会希望您了解使用哪个轮子来解决任何给定的问题,以及如果仅能部分解决您的问题,什么时候可以修改现有的轮子。如果您在任何地方都找不到车轮,那么也许您已经找到了市场利基,或者您还没有进行足够的探索,那么您将需要有足够的经验,以了解何时适合创建自己的全新车轮

何时重新发明解决方案是一个复杂的问题,需要时间和经验来学习何时最好创建一个已经存在的东西的全新版本以前做过。当您仅进行了短时间的开发时,最好仅使用现有的解决方案,并请您的指导者提出建议。当您的项目期限紧迫且不确定性很大时,使用现有的方法可以节省大量时间,并且始终是您的第一选择。即使适当,您也可以稍后重构,以使用其他解决方案,即使这意味着最终会重新发明轮子。

#4 楼

作为老师或程序设计者,我一直在与问题的另一面作斗争:我何时要求学生重新发明轮子?

采取这些简单的情况:我们正在研究排序算法,因此我开始编写程序来对一些数据进行排序的任务;

对于这两种功能,有无数现成的库和功能可用;但是我希望学生避免使用它们,并开发自己的排序算法或日历版本。安排约会。这可能需要排序,日历等等。这次适用“不要重新发明轮子”:我不想让学生为解决问题而苦苦挣扎,而是组装现有的功能以获得结果。

我的困难是,要问多少您可以重新创建现有产品,这确实可以帮助您学习,并且具有众所周知的困难问题,这些问题可以帮助您练习游艇,以及在现实世界中应该给您带来多少帮助,

为了更直接地回答您的问题,有两个建议:


如果老师告诉您“不要重新发明轮子”,他们会之所以这么说,是因为他们以这种方式设计了问题。也许他们想让您尝试一个库,与其他人的算法实现斗争,而不是自己编写算法-那里也有学习,并且重新创建很有趣,但是没有抓住重点。
如果您进行了太多的练习,可以使用库调用而不是开发算法,而可以向老师提出这些活动之间的平衡问题-突出显示您从未被要求编写自己的算法,例如排序和合并。沟通永远不会失败。


#5 楼

练习我怀疑任何人编写的前1000行代码是否非常独特。

扩展工具集使用框架,当您了解框架在做什么时(从您自己可以自己做起),它会带来更多好处。所以您知道如何应用它。 />了解“车轮”使用结构不良,磨损的车轮或不合适的车轮,不是盲目地遵守这一经验法则的借口。您可能会缺少时间,资金,专业知识,所以您只需对其进行修补并完成旅程。

绝对没有什么。

评论


+特别是对于最后一点。

–迈克·邓拉维(Mike Dunlavey)
2012年4月11日在12:10

就创造性错误而言,任何人编写的前1000行代码往往都是非常独特的。

–leftaround关于
2012年4月11日在20:32

@leftaroundabout-我想我应该将该语句限制为可以编译的代码行。

– JeffO
2012年12月12日上午1:45

#6 楼

学生没有钱预算来完成作业,但是有适当的日期要考虑。

作为一个直到最近才是学生的人,我认为重塑车轮的合适数量取决于您上的课正在做作业。您不想为Web开发和设计类编写自己的套接字库(如果您可以做到并按时上交任务,那么上课那么容易吗?),但是您会丢失如果这是网络课程的一项任务,那是非常重要的。当然,教授在创建作业时通常会考虑这些因素,因此您通常会从事与班级相关的工作,但有时,知道自己不应该写的内容也很重要。

也就是说,一旦您离开学校,就很难找到时间来构建已经存在的东西。趁上学时把握一切机会。

如果您在SO上获得了“使用库X /框架Y”,请在问题前加上“我自己写X来学习它的更多信息”。

评论


在您的问题前添加“我正在自己写X,以了解更多信息”。这个。 +1。

– boisvert
18/12/31在17:25

#7 楼

如果您的项目没有规定的截止日期,IMO,最好重新发明轮子。如果您没有工作,或者只是想学习编程,而不是为了赚钱编程,那么使用快捷方式并不会使您成为更好的程序员,而仅仅是使您的项目更快地完成工作,这有什么意义呢?尽管这是事实,但是了解如何使用库,框架和其他人的代码绝对是一项很好的技能。

评论


这是Code Katas概念背后的思想,一遍又一遍地重写代码以改进和学习它。我想说即使在工作中反复重写代码也是件好事,并且如果必须的话,能够实现许多模式甚至更好。

– Bill K
2012年4月12日在7:43

#8 楼

在现实生活中,轮子被一遍又一遍地重新发明。如果我们寻找原因,那么当我们需要重新发明编程轮子时,我们可能会发现一些见识。

自苏美尔时代以来,许多事情发生了变化:


用于制造车轮的材料:从石头,木材,金属,碳,... />需要车轮的物体的尺寸-用于医疗器械和用于赚取褐煤的车轮的纳米尺寸,尺寸为100m
生产环境-手工制作或工业生产
车轮的精度是必需的
车轮周围的正确位置。也许有一个完美的轮毂适合您的工作,但它可能已申请专利。
轮毂的光泽和抛光效果。凯迪拉克可能比大众高尔夫更值得推荐。
婴儿车的最佳轮子取决于许多参数:婴儿车的尺寸和重量(加上婴儿/婴儿),气候条件,石油或天然橡胶的资源价格,制造轮子的机械和手工艺人,均可生产。简短地说:世界经济学。

如何转化为软件世界?好吧,


可能有一个Web服务器,但不幸的是它是用PHP编写的。您可能希望使用流利的语言
排序算法可能会扩大10个元素的大小,但不能扩展到1T元素
您可能需要一个自己生成的解决方案通过第二个程序
精度通常是软件领域中的一个数字问题,如果算法对列表进行了排序,则该排序是排序的-多数不是排序的。但是除了性能,代码大小,内存使用或其他限制外,可能会发生
我想专利不需要进一步的解释。
外观是重新发明某些东西的不变原因-思考dropDownList(ComboBox) 。
全球经济形势可能会影响您的软件轮:它是云轮,开源轮,浏览器轮还是App轮?
当然,最著名的原因是制造自己的轮子:您喜欢学习。


#9 楼

我是一个刚刚受过教育的学生。
在学校里,我们正在学习asp.net和C#,那两年的学历使我们从没有尝试过自己制作电子邮件系统,登录系统或CMS。一切都只是拖拉,然后将控制放到设计视图中。

我们开始招募了102名学生,其中23名完成了。 4个人有工作。原因是:这4个人(包括我在内)在我们真正开始接受教育之前就知道如何编程。

其余的人迷路了。因为我们从来没有“重新发明轮子”。我们从不知道代码实际上是如何工作的。使用用户管理构建完整的登录系统非常简单-但是,受我教育的学生不知道该怎么做。因为他们不知道登录系统实际上是如何工作的。

我感到很难过,在某个时候实际上浪费了2年,什么也没学。 -我希望世界各地的老师说:是的,我们知道有代码存在的框架,您可以在现实生活中使用它们。但是在这种教育下,您将学习如何进行编程。 />
许多编程教育都非常短暂,因此在那段时间内需要涵盖很多内容。我认为最好将清单减少一半,并在编程上花费更多时间。如果人们知道如何构造普通的“车轮”,他们可以“发明一种新型的车轮”。人们只要有一点知识就不会愚蠢,但是您不能要求一个对汽车一无所知的人来制造汽车。但是,问一个懂得如何制造自行车的人会容易得多。实际制造汽车。

#10 楼

这实际上取决于您在做什么。如果您想了解车轮,最好自己动手改造车轮。但是,如果您想了解汽车,那么重新设计车轮或内燃机通常会浪费很多精力。

因此,例如,当您有兴趣了解全文搜索索引的工作方式时,尝试自己动手做是一个好主意。如果您要构建用于文档管理的应用程序,则最好重用现有的库,因为您的大部分工作是同时获得正确的应用程序体系结构和用户体验。

#11 楼

是的,告诉学生不要重新发明轮子是适当的。但是需要对学生的意义有一个清晰的了解:写下与作业密切相关的内容。这并不意味着如果要编写一个冒泡排序,就是从Wikipedia复制它,也不意味着要使用array.sort或等效项(如果您的框架或语言提供了它)。但是,在您介绍了各种排序算法之后,编写了自己的Bubblesort和quicksort,不要为每个新任务重写它,使用内置排序或您编写的内容,不要再做同样的事情。

重新发明轮子不会浪费时间,这既适用于学生,也适用于专业人士,区别在于目标是什么。学生应该学习,所以没有加深理解的事情就是浪费时间-写了一个泡泡后,您知道它会做什么,您知道为什么不想大范围使用它,一次又一次地重写它是浪费时间。您不会在第二十五次改写中学习任何新知识。

对于学生来说,这并不意味着不要写别人写的东西,这意味着不要重做已经掌握的东西。 -可以把时间花在您尚未掌握的东西上。

评论


除非第二十五次改写是您正在学习的某种编程语言的惯例。

–leftaround关于
2012年4月11日在20:35

#12 楼

许多想法和努力都花在了一个轮子上。建议是“不要重新发明轮子”,但您可以继续进行轮子的反向工程,并了解为什么某些事情会以这种方式完成。此后,您可以尝试以自己的方式实现方向盘,这可能会导致三个逻辑上的任何一个。 >您可以对其进行优化并使其更佳
您可以将其拧紧并学习如何不去做。

对我来说,学生不应该重新发明轮子,而应该对其进行反向工程并了解其中的含义。

#13 楼

我要说的是,这取决于您是否正在重塑轮子的工作方式,还是在完成其他任务的过程中重塑轮子。当然,每个学生都有一些轮子需要自己至少实施一次。您必须了解一些基本数据结构和算法的工作方式,才能了解它们将如何影响代码的性能或选择在各种情况下使用的代码。

堆栈,堆,链表,树木等绝对值得及时投入实施一次;然后再使用框架提供的功能。每个使用jQuery插件的人都应该至少编写一个,但是您不必编写将要使用的每种不同类型的插件。我想说这是有用的,但不是必须的,编写一个小型的进程调度程序或微型OS,这样您就可以了解计算机幕后的情况。不过,您确实需要了解流程,线程等的工作方式。

一旦您具有良好的工作知识,回头去实现新的结构/算法也很重要(也很有趣)。给他们一种感觉。除非是您的工作或您真的很擅长,否则我会坚持使用代码中的现有代码。

#14 楼

答案取决于您是否要学习还是要创造。

如果要学习,与使用现有的轮子(库功能)相比,“重塑轮子”可以为您提供更多的见识和更好的理解。

但是,如果要创建复杂的产品,那么“重新发明轮子”可能是一项耗时的实践,并且对产品的创建几乎没有帮助。

,如果灵魂目标是要有足够的时间和精力来学习,那么“重新发明轮子”是最好的选择,因为它有助于自定义每个功能。

#15 楼

嗯,这有两个方面。

首先,如果您想学习,从头开始做一些事情,或者使用不必要的低级接口可能会很有用。但是,仍然有必要确定正在学习的内容:如果您想了解HTTP协议,则无需自己进行套接字编程。仅重新发明您正在学习的内容,并且只有这样才能真正地探索和理解它们。

-专业程序员最重要的技能之一就是选择,学习和使用预备知识。现有软件。这也是您还需要学习的东西。关于SO的很大一部分问题似乎来自于无法阅读文档的人。

最后,编程基于坚实的理论基础。您将需要同时使用实践练习和阅读来学习理论。

评论


我同意。这就是为什么一直在创建这么多新的现有软件框架和库的原因:)

– gbjbaanb
2012年4月13日在13:42

#16 楼

我也遇到过同样的情况。这是因为行业和学术界对感知的差异。

如果您不“重新发明轮子”,那么您绝对无法在学校学习任何东西或理解某些东西是如何工作的。

而在一个行业中,目标是花费最少的时间和精力来推出产品。而且你不能抱怨。

#17 楼

Hacker Jargon Lexikon对重新发明轮子有很好的评价:


设计或实现与现有的一个或一部分等同的工具,其含义是这样做是愚蠢的或浪费时间。
这通常是有效的批评。另一方面,汽车
不使用木质压路机,必须正确地重新发明某些车轮。第三方面,人们在重新发明车轮时,确实想出了带有偏心轮的梯形的道德象征。


很好地重塑了轮子,但请确保在使用之前或之后查看其他解决方案。

#18 楼

答案-答:重新发明轮子。它加深了您对数据结构和算法的理解,使您编写好东西的可能性更大。我确信当Guido van Rossum开始使用Python时,人们告诉他不要重新发明轮子。已经有很多语言了。当已经有Yahoo!时,为什么还要编写google! c呢?全部学习。成为巨人。不要让小人们来限制你。
答案B:如果教练告诉你该怎么做,就给他他想要的东西,或者甚至多一点,即使这看起来很傻。如果您还想疯狂地制定一个令人惊讶的解决方案,并给他一个链接,请继续。不过,首先,请满足给定的要求,以便他感到高兴。

#19 楼

如果您是学生,因此没有规定的项目截止日期,最好“重新发明轮子”。如果您现在只是为了学习编程而不是为了赚钱而编程,那为什么要选择对您没有帮助的捷径呢?为什么不这样做呢?但是,当您真正成为一名程序员之后,如果您不知道如何使用框架或库,人们就会感到怀疑。

评论


我不知道你上哪所学校,但是我去哪儿,交作业的最后期限很平常。

–用户
2012年4月11日7:37

#20 楼

按照作业/问题/考试的要求去做。

几年前,我是C编程类的TA。考试题为“编写程序以复制文件”。几个学生问同样的问题-他们可以生成一个进程并运行OS cp命令吗?

我们问他们的是“程序将复制文件吗?”

考试题要求他们编写代码来复制文件。如果答案没有复制文件的C代码(例如,打开输入,打开输出,读取/写入字节的循环,关闭输入,关闭输出),则说明它没有复制文件。

如果老师说使用框架或库(例如,图形类可能告诉您使用3D库),请使用他们告诉您的内容。不要发明自己的或使用其他人。任何不同的情况都会使老师更难为您的作业评分。

在求职面试中,流行框架的知识将帮助您回答问题。创建自己的项目进行学习。祝你学习顺利。

评论


是的,但是如果他们生成cp,他们的程序实际上会复制该文件。

–马辛
2012年4月13日13:20在