作为一名初学者,我应该更喜欢使用第3方库来构建自己的库吗?


12

作为Python的初级程序员,在跳到包含所需功能的高级第三方库之前,先构建并了解我自己的库是个好主意吗?

对于这种方法,某些项目(例如Django之类的Web框架)可能太大。但是其他项目(例如Web Crawlers,图形库,HTML解析器)似乎是可行的。

我担心过早依赖第三方库会阻碍我的成长。

注意:这个问题这个问题似乎更侧重于经验丰富的程序员,他们可能更注重重用的效率,而不是学习的好处。我认为我的问题是针对初学者的。


5
“只不过是库集成商而不是程序员”:客户希望您提高工作效率。能够评估和集成现有库是提高生产力的一项重要技能。如果没有满足您需求的可用库...否则,请着重解决应用程序要解决的业务问题
Hamish Smith,

2
您在“库集成商”和“程序员”之间做了什么区分。在过去的30年中,即使制作嵌入式芯片级设备控制器,我也从未没有过库。您能解释一下这种区别吗?
S.Lott

措辞不佳。已编辑。
MikeRand 2011年

我宁愿雇用图书馆集成商。为什么要集中精力于如何集中精力于功能?看到几十辆严重改造过的自行车后,我不禁想到再见一辆。图书馆的设计是艰苦的工作,也是一种平衡的行为。一个不擅长图书馆设计的典型软件商店没有正确的技能,资源和耐心来正确地完成它。当心重写。最好使用经过他人测试的代码,而不是从头开始。IMO只有在存在真空的情况下才能发明。
Job

Answers:


12

这始终是一个权衡。

作为一名初学者,在考虑重用代码与重塑方形齿轮时,您应该问自己两个问题:

  1. 我会通过从头开始编写所有内容,还是专注于问题域并抛弃对我感兴趣的问题不重要的复杂性,来了解我想解决的问题的更多信息吗?
  2. 对我来说,解决眼前的问题更重要,还是理解一些基本概念更重要?

如果您不必完成项目,那么可以将精力集中在其他人已经解决的复杂问题上,因为您会学到一些东西。但是在“完成”之前,您可能会继续进行其他操作,这可能与您无关紧要。当您进入一个看起来很简单的复杂域时,其他项目将开始显得光鲜亮丽,直到您开始尝试自己解决它为止。

不要痴迷于放弃控制权,因为您会屈从于他人的思维方式。更多地专注于您要完成的工作。

如果您的目标是因为要了解解析器的工作原理而编写HTML解析器,请继续尝试。如果您的目标是编写HTML解析器是因为您想清理用户输入或转换HTML的一些随机位,则您可能专注于错误的事情,因为您可能对解析的应用更感兴趣,而不是对解析本身感兴趣。如果您因为不想花时间去理解别人的库而想编写HTML解析器,那可能是在浪费时间,因为至少在这种情况下,我保证别人会花更多的时间来弄清楚如何可以比您有效地解决此问题。在非常琐碎的情况下,您可以不重用代码来节省时间,而在复杂的情况下,除非您使用的库很烂或者您无法阅读文档和代码示例,

另一方面,我想说的是值得编写自己的图形库,因为您将更加专注于可转移的基本算法和数据结构,即使最终使用它们,它们也可以应用于其他领域。解决这些问题时,其他人的图书馆。


思考问题的绝佳框架。非常感激。
MikeRand 2011年

8

大多数入门程序员都大大低估了问题的复杂性。这导致了许多不愉快的情况,但我仅关注一种情况:他们因为“ for肿”或“过于复杂”而忽略了许多第三方库。然后,他们尝试编写自己的代码来完成相同的工作,并且完全搞砸了,因为他们没有预料到必须处理的所有内容。

进行网络爬网和解析HTML。您似乎对这些任务有一种很随意的态度-这使我相信,除了很小的规模外,您从未尝试过执行这些任务。这只是真正的Web爬网程序需要处理的潜在问题的简短且不全面的列表:

  • HTML格式错误。
  • 多种字符编码(整个世界都无法在ASCII上运行)。
  • 由JavaScript生成或修改的链接。
  • 链接到千兆字节的二进制文件。
  • 错误的mime类型。
  • 在爬网会话期间崩溃。
  • 焦油坑。
  • SEO顾问。
  • 微软。

6

我担心尽早依赖第三方库会阻碍我的成长,使我成为图书馆集成商而不是程序员。

错了

早期依赖第三方图书馆将教好图书馆如何运作。

过早的发展总是浪费时间。在没有仔细研究(即使用)现有库的情况下编写自己的库注定要在整个职业生涯中重新发明轮子,这很糟糕。

我花了许多可计费的时间清理这些混乱。


不确定我是否完全同意。。有时3rd Party库编写得不好,实际上可以教坏习惯。如果基本算法很容易理解,那么重新发明轮子可能是一个好主意,然后将它们与其他库进行比较,以查看您的库与其他库的集成程度如何。无论哪种情况,显然某种形式的指导都是非常有益的:)
Demian Brecht

话虽如此,研究现有的API 还是有好处的:)
Demian Brecht

2
@Demian Brecht:“有时第3方库编写得很差,实际上可以教坏习惯。”虽然这是事实,但大多数开源项目都受到用户社区的严格审查,坏主意无法承受人群的智慧。此外,“写得不好”是n00b无法有效做出的判断。
S.Lott

@美国洛特:说得好(RE:的n00b):)我猜你只是要小心哪些你看看第三方库,一些具有非常小的(如果有的话)社区。例如,在github上随意查找项目可能会导致您走错路。
Demian Brecht

2
@Demian Brecht:在看到各种库之前,您无法做出任何判断。无法“预过滤”库以供n00b使用。全部都是图书馆,没有图书馆。
S.Lott

4

这句话是第一句话,对我来说在逻辑上是有问题的:

作为Python的初级程序员,在跳到包含所需功能的高级第三方库之前,先构建并了解我自己的库是个好主意吗?

您如何相信自己可以像初学者一样有效地编写高级 (按您的说法功能库,使其与现有库一样正确,功能完整并经过测试?

这甚至都没有提到您会花费大量时间来重新发明一个初学者不了解的车轮,如果幸运的话,您会意识到自己已经头顶脑袋,必须学习,反正退出图书馆。

以HTML解析为例,您提到这是可行的,没有比初学者Beautiful Soup更好的工作了。简单明了的你会失败。您认为可行的事情没有考虑到巨大的复杂性问题,您没有足够详细地了解问题域以了解复杂性,因此注定要失败。

我的观点是了解别人做了什么,并且已经为您解决了您的问题,直到您找不到解决您问题的方法为止。


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.