“永远不要重新发明轮子”这个短语适合学生吗?


115

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

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

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


51
如果您让其他人为您减轻重量,那么加入体育馆将不会给您带来太大的好处(除非您正在学习成为经理)。
查尔斯·格兰特

82
当您要制造车轮时,可以重塑车轮。当您建造房屋时,最好假设车轮制造商知道他们做得比您更好。
zzzzBov 2012年

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

59
这是从来没有适当的陈述绝对的。:)
CVn 2012年

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

Answers:


126

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

  1. 重写现有的代码浪费了精力,可能会用在系统的独特部分上,从而使项目花费的时间超过了必要的时间。
  2. 任何代码的第一个版本更可能存在错误/无法预料的问题。大多数库和可重用组件都经过了多次测试和修补。如果您重新发明一种哈希算法或尝试创建自己的RDBMS(除非这是项目的意思),那么您得到的结果往往会很差。

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


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

3
有关编译器的要点
Chani 2012年

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

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

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

19

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


17

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

但是,作为一名专业工作人员,我希望您已经了解了使用哪个轮子来解决任何给定的问题,以及如果仅能部分解决您的问题,则何时修改现有轮子可能合适。如果你不能找到一个轮子在任何地方,那么也许你已经确定了市场地位,或者你还没有探索远远不够的,你将需要足够的经验知道,当它是适当的创建一个全新的你拥有。

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


12

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

考虑以下简单情况:我们正在研究排序算法,我设置任务来编写一个对一些数据进行排序的程序;或使用日期功能,而我要求一个日历。

对于这两者,都有无数现成的库和功能可用;但我希望学生避免使用它们,并开发自己的排序算法或日历版本。

现在再来看另一个:我设置了一个任务来编写一个简单的应用程序,例如安排约会。这可能需要排序,日历等等。这次适用“不要重新发明轮子”:我不想让学生为解决问题而苦苦挣扎,而是组装现有的功能以获得结果。

我的困难是,有多少要求您重新创建现有的东西,这确实使您学习,并且具有众所周知的问题(我可以用来使您练习游艇)中遇到的难题,以及我应该放置多少?您在现实世界中没有重新发明轮子吗?

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

  • 如果老师告诉您“不要重蹈覆辙”,他们之所以会这样说是因为他们以这种方式设计了问题。也许他们想让您尝试一个库,与其他人的算法实现斗争,而不是编写自己的算法-那里也有学习,并且重新创建很有趣,但是没有抓住重点。
  • 如果组装库调用的练习过多,而不是开发算法,则可以与老师一起提出这些活动之间的平衡问题-强调您从未被要求编写自己的算法(例如,排序和合并)。沟通永远不会出错。

6

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

扩展您的工具集使用框架,当您了解框架在做什么时(它可以自己完成),会带来更多好处,因此您知道如何应用它。

了解“车轮”使用结构不良且磨损的车轮或不合适的车轮,不是盲目地遵守这一经验法则的借口。您可能会缺少时间,资金,专业知识,因此您只需对其进行修补并完成旅程。

绝对值很少


1
+特别是对于最后一点。
Mike Dunlavey

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

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

3

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

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

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

如果您获得了“使用库X /框架Y”的信息,请在问题前添加“我自己编写X,以了解更多信息”。


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

2

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


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

2

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

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

  • 用于制造车轮的材料:从石头,木材,金属,碳,...
  • 需要轮子的物体的大小-用于医疗器械的纳米大小和用于赚取褐煤的轮子的大小,100m
  • 生产环境-手工制作或工业生产
  • 所需的车轮精度
  • 正确的方向盘。可能有一个适合您工作的完美轮子,但可能已申请了专利。
  • 为您的车轮增光添彩。凯迪拉克可能应该配大众高尔夫以外的其他轮胎。
  • 婴儿推车的最佳轮子取决于许多参数:婴儿推车的大小和重量(加上婴儿/婴儿),气候条件,石油或天然橡胶的资源价格,制造轮子的机器和手工艺人可用。简短地说:世界经济学。

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

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

2

我是一个新受教育的学生。在学校里,我们花了两年的时间在“学习” asp.net和C#,我们从未尝试过创建自己的电子邮件系统,登录系统或CMS。 。

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

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

我感到难过,在某个时候实际上浪费了2年,什么也没学。-我希望世界各地的老师说:是的,我们知道有代码存在的框架,您可以在现实生活中使用它们。但是在这种教育下,您将学习如何进行编程。

许多编程教育都很短,因此在那段时间里,教育需要涵盖很多内容。我认为将清单减少一半,并花更多时间进行编程会更好。如果人们知道如何制造普通的“车轮”,他们可以“发明一种新型的车轮”。人们只要有一点知识就不会愚蠢,但是您不能要求一个对汽车一无所知的人来制造汽车。但是,问一个懂得如何制造自行车的人会容易得多。实际制造汽车。


1

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

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


1

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

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

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


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

1

许多想法和努力都花在了一个轮子上。建议是“不要重新发明轮子”,但是您可以继续进行轮子的反向工程,并了解为什么某些事情会以完成的方式进行。之后,您可以尝试以自己的方式实施转轮,这可能会导致三个逻辑上的任何一个。

  1. 你们要么明白为什么事情就是这样。
  2. 您可能会对其进行优化并使其更好
  3. 您可能会搞砸,并学习如何不做那件事。

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


1

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

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

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


1

答案取决于您希望学习还是创造。

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

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

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


1

好吧,这有两个方面。

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

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

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


我同意。这就是为什么有这么多的创建预先存在的软件框架和库所有的时间:)
gbjbaanb

0

我也遇到过同样的情况。这是因为行业和学术界的看法不同。

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

而在行业中,目标是以最少的时间和精力来推出产品。

就个人而言,我喜欢钻研兔子,我讨厌行业哲学,但这就是业务的开展方式,您不能抱怨。


0

黑客行话Lexikon有一个很好的注释重新发明轮子

设计或实现与现有一个或一部分现有工具等效的工具,这意味着这样做很愚蠢或浪费时间。这通常是有效的批评。另一方面,汽车不使用木质压路机,必须正确地改造某些类型的车轮,然后才能正确使用它们。第三,重塑车轮的人们确实想出了带有偏心轴的梯形的道德等同概念。

因此,最好重新设计轮子,但请确保在使用之前或之后查看其他解决方案。


0

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


-1

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


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

-2

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

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

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

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

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

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


是的,但是如果他们产生了cp他们的程序,实际上会复制该文件。
Marcin 2012年
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.