在不知道您创建的程序如何工作的情况下可以生活吗?


16

我的意思是,确实有一些有用的库可以解决您遇到的问题,并且不知道如何解决这些问题,或者不了解所使用的编程语言。例如,Boost for C ++或JQuery for JavaScript或Spring for Java ...他们可以在几秒钟内解决问题,并且您实际上并不关心它们的处理方式(尽管它们是使用与您所编程的语言相同的语言编写的)...所以我想知道我是不是一个人独自使用了libs而没有有能力从头开始为我的问题编写解决方案,还是标准做法?


它们不能解决个人问题,而​​只是解决相关领域中常见问题的解决方案。
Abimaran Kugathasan 2011年

因此,不知道如何解决相关领域的常见问题并说“只使用***(这里是您最喜欢的lib)”就可以解决它,而不会深入他们的实际工作吗?
Kabumbus

1
是否编写过可扩展程序?老实说,没有一个库是100%完美的,并且错误肯定会发生。现在,如果该错误恰好位于您正在使用的许多外部库之一中,并且在开发周期缩短了两年后,您就会遇到问题,您知道什么?这是您正在使用的那些库之一!坦率地说,不,将库用作快速修复(至少不适用于企业级软件等)是没有意义的,因为随着您的发展,它们变得有些限制。
jerluc

5
@jerluc:标准库通常比任何一个组织的代码都有更好的开发和支持。例如,boost的shared_ptr被我所接触的行业中的每个人都视为“必须拥有”,boost提供的其他各种代码段使我从事的项目专注于问题的细节,而不是花时间在一些已经不那么重要的工作上。您可能会遇到一些问题,因此您应该选择所选择的库,但是通常它们是好的。“此处未开发”综合症虽然不好。
TZHX 2011年

@TZHX我想我应该更明确地说,我所说的内容主要适用于库,这些库可能会完成诸如包装可能被视为“样板”代码的事情。通过不编写IO包装器(当此类包装器可用的库时)来信任“发明的轮子”是有道理的,但是信任“某种程度的轮子”(换句话说,就是可以这样做的库)是没有道理的某种黑匣子魔术,可满足您当时需要的功能。
jerluc 2011年

Answers:


22

是否可以不亲自了解如何解决问题并改为使用库呢?

一般来说,不,不是。

库可以为您省去如何解决问题,调试解决方案并进行维护的艰巨工作。但是,如果要使用它,最好确保您了解它的工作原理-为什么该解决方案可以真正解决问题。如果您是机械师,则不必知道如何发明汽车,发动机和制造汽车发动机的机器人-但您最好了解这些零件的工作原理,它们的全部功能以及它们的工作方式。适合在一起!

这就是为什么您会看到很多人变得非常专业的原因-很多时候,他们只会学习如何使用一种语言,一种平台,一种框架和一组库。

话虽如此,您将只有太多的时间可以学习。有时您必须采取捷径-采取捷径,但知道它们是捷径。如果您有时间的话,也许您只对图书馆有足够的了解,就知道可以解决这个问题。或者,也许您只弄清楚您实际需要调用的两个函数,而仅足以正确进行调用。这是一条捷径,需要付出一定的代价-通常是稍后,当有人(可能是年龄较大,经验更多的人)必须修复代码时。


13

一旦computerworld.com.auBjarne Stroustrup: “您对有前途的程序员有什么建议吗?”
他回答“了解计算机科学的基础:算法,机器架构,数据结构等。不要盲目地在应用程序之间复制技术。知道您在做什么,它起作用了,以及为什么起作用。不要以为您知道五年后的行业状况或您将要做什么,因此收集一些综合和有用的技能,尝试编写更好,更有原则的代码,努力使“编程”更多的是一项专业活动,少一些低级的“黑客”活动(编程也是一种技巧,而不仅仅是一种技巧)从该领域的经典著作和更好的高级教科书中学习;不要对容易理解的“如何做”感到满意指南和在线文档-很浅。”
希望它可以澄清您对什么要求的疑问真正的程序员,而且任何人要成为一个程序员都是必需的。


4
+1-我认为重要的是要注意-尽管我100%同意Stroustrup,但是OP不应认为这意味着他应该在自己所做的每一件事上都重新发明轮子。计算机科学教育涉及实现String类和MergeSort及其他算法的主要原因是,这样,当我们使用选择的语言提供的库时,我们将了解幕后的情况。正确处理与良好的理解基础,和一个几乎可以预测什么是图书馆X,Y或Z的引擎盖下足够的图书馆
jmort253

这位需要数十个段落来进行全面分析,论证和解释的人来了,为什么茶的特定品牌和口味引起了他的兴趣,同时完全放弃了最初的问题。但是,我仍然爱他!
2011年

1
坦白说,我对算法,机器架构,数据结构以及许多其他事情了解很多。这并不意味着我了解我们每个第三方库的确切功能,甚至不了解其背后的所有理论。我认为这都是很好的建议,但这并不意味着您必须了解有关应用程序的所有知识。
David Thornley,

12

是的-我们都做到了!

例如,让我们举一个我在一些与Mac相关的图形代码中修复的非常简单的错误。有关该错误的代码涉及几个步骤:

  1. 首先,Objective C方法使用malloc()分配像素缓冲区,并将其附加到其Objective C对象。
  2. 后来发生了一些事情,C例程将消息发送到Objective C对象并检索像素缓冲区。
  3. C例程使用jpeglib压缩像素缓冲区的内容,并通过TCP / IP连接将其发送出去。

那里发生了很多事情!这里有几件事:

  • 一个动态内存分配器,用于实现malloc(),它假定内存在物理上是连续的并且是线性可寻址的。
  • 底层的Darwin内核虚拟内存系统可以将碎片化的物理RAM和磁盘空间(与RAM不同的物理设备)映射到动态内存分配器中,就像它在物理上连续且可线性寻址的RAM一样。
  • 目标C的对象系统
  • Mac OS运行时消息传递系统及其与Objective C对象的交互方式
  • jpeglib库对JPEG有损光栅图像压缩标准的实现,该标准使用离散余弦变换算法
  • 用户空间联网例程,用于发出数据,该数据通过各种TCP和IP协议实现进行调用,而这些实现又调用OS内核。然后,根据您为网络打开的电源,它可能会调用以太网端口驱动程序,Wi-Fi芯片,或更常见的是USB或Firewire驱动程序。

您了解所有这些事情如何实际实现的所有细节吗?我肯定不会!我怀疑地球上有很多人在干-甚至没有。所以我不用担心。

但是好奇是一件好事,并且至少要了解一些有关您使用的库和工具的知识。当我刚开始编程时,我知道编译器和操作系统不可能是魔术,但对于我来说,他们肯定是那样。通过对这些事情的好奇心,我学到了很多东西,到目前为止,他的事业很棒。


1
如果我要理解日常使用的所有代码,则需要了解数据压缩(包括JPEG),几何数据表示(包括<i> The Nurbs Book </ i>中的所有内容),PDF和U3D格式的复杂性,以及多得多。我有关于所有内容的参考,但我永远都不会失望。
David Thornley,

我必须承认,我并不总是总是详细了解我用来编写工作代码的每个构建块,但是当发生这种情况时,我感到不高兴。了解或至少知道如果需要的话,我可以了解基本组件,从而使工作变得更加轻松。我很高兴知道分配器的工作原理,用于压缩JPEG图像的原理,TCP / IP的工作原理,虚拟内存的实现方式,CPU的工作方式等。将所有这些低级细节都抽象了很好,但是无法访问细节真的很糟糕……
Pierre Arnaud

5

我发现我们使用库的主要原因是不要一直“重新发明轮子”,而是抽象出他们打算解决的问题。您可以尝试自己解决问题,但这将花费更长的时间。

但是,我确实认为我们还需要知道或猜测库如何解决问题。这通常记录在库的用户文档中,并且使用开源软件,您可以随时自己查看代码。

同样,我们通常还是通过抽象困难部分来解决问题,那为什么还不行呢?


5

这些库可为常见问题提供解决方案。您需要确定他们是否解决了您要解决的特定问题。他们不能代替不知道如何解决问题的人。例如,假设您的应用程序需要一个哈希表,那么您应该有足够的知识来了解哈希表正在解决什么问题。您应该能够评估您正在使用的库的性能,以确定它是否可以在您的应用程序中运行。我相信使用库来覆盖不足的技术知识不是正确的用例。使用库的决定应围绕是否使用库来加速开发并提供经过测试的可靠解决方案进行。使用库的决定不应围绕程序员无法解决给定问题的问题。


这意味着对于我当前的项目,我必须了解PDF和U3D规范的详细信息。对于某个研究生学校项目,我必须对某些线性编程算法有很多了解(对于我的情况,单纯的方法将是无望的)。如果有必要确切地了解一个库在使用它时在做什么,那么我将一事无成。
David Thornley,

我并不是说您需要了解实施的所有细节。但是应该知道从结果中得到什么。再次以哈希表为例。如果您发现性能不佳,那么如何开始评估原因。我首先要考虑的是钥匙之间的碰撞率。如果您不知道某事是如何工作的,那么您怎么甚至可以开始假想某事没有按照预期方式执行或未按预期方式执行的原因?
Pemdas

5

真的取决于您

您越了解使用的工具,您就越能充分利用它们。

例如,我很少使用jQuery,但是当我不得不知道要从中受益的时候,以及如何使其与Mootools等其他框架共存。

另外,不久以后,我将使用UDK冒险进入gamedev,并且我确信我对它的了解越多,我越会屈从于邪恶的意志,但是我也可以遵循没有脑子的教程。我选择第一个,只需要一点额外的时间和大脑周期,我会得到更好,更轻松的结果


5

重要的是要了解自己的领域和过程的一部分。

例如,假设您正在使用图像处理库。您是否真的需要全面了解高斯模糊,变换和色彩空间?不。但是您确实需要首先知道为什么要使用该库。或框架的排序功能。您是否需要知道使用的实际排序算法?在大多数情况下,不会。但是您确实需要知道为什么需要对数据进行排序。

另一方面,如果您正在编写编译器,那么您将更好地了解编译器的工作原理,因为这就是在该过程中的角色

jQuery之类的某些框架将很多抽象化。您是否需要知道它们的工作原理?不会。但是,在您编写代码时对库的工作有一个深刻的基本了解将对您非常有益,因为您将更好地理解为何以这种方式构造框架,并能够充分利用框架的潜力。


2

根据我的经验:由于您无法消除对库的依赖,因此您和您的团队应该对解决问题有足够的了解。

作为程序员,我们的时间很少,因此我们必须选择优先级最高的程序。必须尽快,温和地解决问题。仅因为这个原因,“学习所有有用的东西”多少有些多余。

我要在此处添加的内容是“依赖项”。作为一个社区,我们都依赖他人。我们站在Giants上来构建我们的应用程序:Java,.NET,API ... 并且我们相信Giants的工作;因为它适用于很多人。如果您对框架或API有疑问,很可能其他人在某个地方遇到了它,并且有解决方案/解决方法。

唯一的问题是:巨人队可能在某个限制条件下崩溃了。例如,某些操作系统不支持闪存,没有它,我们无法做很多事情。这种可能性大于零,但是在这种情况下,我们几乎无能为力。只有在这些情况下,有关“幕后的秘密”的知识才被证明是有用的,因为它指出了问题的根源所在,并且可能会产生很大的解决方法。但我不确定我们投入的时间是否值得。

为了应对这种可能性,我认为有一个解决方案:因为大多数程序员都可以轻松地掌握库的“表面工作”,而且只有有时候我们确实需要一位非常了解的人:让团队分开来做。试图组成一个团队,每个人都精通涉及的1,2个有用的库/工具/“技能集”:一个人对jQuery有良好的经验,一个人专门研究数据库,...这将有助于最大程度地降低风险。


2

另一个观点是安全性。当您使用不了解确切内部工作原理的库时,便会假设实际发生的情况。每个失败的假设都可能为恶意攻击者打开攻击载体。

致电Quicksort时,您应该注意最坏的情况。否则,攻击者可能会注入最坏情况的数据并执行DoS。

当调用压缩库时,您应该意识到,当某些数据压缩到更少的字节时,那么必须有数据“压缩”到比原始字节更多的数据。因此,当您假设输出缓冲区仅压缩(压缩到较少的字节数)时仅需要输入数据的大小时,就会发生缓冲区溢出等待发生。

您应该对要做的事情了解足够的基础知识,以便能够证明您的假设是正确的。否则,该库应明确注意这一点,例如,在提供的输出缓冲区不够大时引发异常。


1
任何内容分配固定大小的缓冲区是等待缓冲区溢出的事件。使用支持动态数组的语言更好,让被调用者管理自己的缓冲区。
梅森·惠勒

1

只要您确定所使用的一切都可以,就可以不了解它。一旦您被lib中的bug咬伤,便有时间查看其工作原理,工作原理以及为什么无效。当然,即使您不必这样做,也总是会欢迎并鼓励您深入了解内部。

编程中的困难之一是克服诱惑,自己解决所有问题。


1

可以,但是很危险。作为一般惯例,人们应该了解自己所开发的东西。


1

金田

只要您了解库或框架正在尝试做什么的基本要点,就可以了。至于内部零件,那没有。采取务实的态度。它可以正常工作,可以满足我的要求。

关键是不要陷入一堆小细节而已经实施了该死的想法。

我想,重点是,您不会一无所知。认真地说,您几乎没有时间研究所有内容,因为这会使您偏离创建自己想法的主要目标。也许一点一点,您可以在周末安排一些空闲时间来阅读有关该主题的一章左右。

但是,除非您有很多空闲时间,否则请不要尝试解决所有问题。编程语言的原因是使我们无法执行汇编代码,汇编语言的原因是使我们无法执行1和0。我认为您不需要了解其背后机制的每一个细节,而只需了解其一般要点。像垃圾收集器一样,我知道它会处理我的指针/内存,我不在乎它使用了什么神奇的整洁算法,我只是知道它可以工作(满足我的需要),并且它不会做任何其他事情。也许是它的缺点,但是。当然,除非您是必须要处理的领域。那你无论如何都不会问这个问题,因为这是你工作的一部分。

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.