我的意思是,确实有一些有用的库可以解决您遇到的问题,并且不知道如何解决这些问题,或者不了解所使用的编程语言。例如,Boost for C ++或JQuery for JavaScript或Spring for Java ...他们可以在几秒钟内解决问题,并且您实际上并不关心它们的处理方式(尽管它们是使用与您所编程的语言相同的语言编写的)...所以我想知道我是不是一个人独自使用了libs而没有有能力从头开始为我的问题编写解决方案,还是标准做法?
我的意思是,确实有一些有用的库可以解决您遇到的问题,并且不知道如何解决这些问题,或者不了解所使用的编程语言。例如,Boost for C ++或JQuery for JavaScript或Spring for Java ...他们可以在几秒钟内解决问题,并且您实际上并不关心它们的处理方式(尽管它们是使用与您所编程的语言相同的语言编写的)...所以我想知道我是不是一个人独自使用了libs而没有有能力从头开始为我的问题编写解决方案,还是标准做法?
Answers:
是否可以不亲自了解如何解决问题并改为使用库呢?
一般来说,不,不是。
库可以为您省去如何解决问题,调试解决方案并进行维护的艰巨工作。但是,如果要使用它,最好确保您了解它的工作原理-为什么该解决方案可以真正解决问题。如果您是机械师,则不必知道如何发明汽车,发动机和制造汽车发动机的机器人-但您最好了解这些零件的工作原理,它们的全部功能以及它们的工作方式。适合在一起!
这就是为什么您会看到很多人变得非常专业的原因-很多时候,他们只会学习如何使用一种语言,一种平台,一种框架和一组库。
话虽如此,您将只有太多的时间可以学习。有时您必须采取捷径-采取捷径,但知道它们是捷径。如果您有时间的话,也许您只对图书馆有足够的了解,就知道可以解决这个问题。或者,也许您只弄清楚您实际需要调用的两个函数,而仅足以正确进行调用。这是一条捷径,需要付出一定的代价-通常是稍后,当有人(可能是年龄较大,经验更多的人)必须修复代码时。
一旦computerworld.com.au问Bjarne Stroustrup: “您对有前途的程序员有什么建议吗?”
他回答“了解计算机科学的基础:算法,机器架构,数据结构等。不要盲目地在应用程序之间复制技术。知道您在做什么,它起作用了,以及为什么起作用。不要以为您知道五年后的行业状况或您将要做什么,因此收集一些综合和有用的技能,尝试编写更好,更有原则的代码,努力使“编程”更多的是一项专业活动,少一些低级的“黑客”活动(编程也是一种技巧,而不仅仅是一种技巧)从该领域的经典著作和更好的高级教科书中学习;不要对容易理解的“如何做”感到满意指南和在线文档-很浅。”
希望它可以澄清您对什么要求的疑问真正的程序员,而且任何人要成为一个程序员都是必需的。
是的-我们都做到了!
例如,让我们举一个我在一些与Mac相关的图形代码中修复的非常简单的错误。有关该错误的代码涉及几个步骤:
那里发生了很多事情!这里有几件事:
您了解所有这些事情如何实际实现的所有细节吗?我肯定不会!我怀疑地球上有很多人在干-甚至没有。所以我不用担心。
但是好奇是一件好事,并且至少要了解一些有关您使用的库和工具的知识。当我刚开始编程时,我知道编译器和操作系统不可能是魔术,但对于我来说,他们肯定是那样。通过对这些事情的好奇心,我学到了很多东西,到目前为止,他的事业很棒。
这些库可为常见问题提供解决方案。您需要确定他们是否解决了您要解决的特定问题。他们不能代替不知道如何解决问题的人。例如,假设您的应用程序需要一个哈希表,那么您应该有足够的知识来了解哈希表正在解决什么问题。您应该能够评估您正在使用的库的性能,以确定它是否可以在您的应用程序中运行。我相信使用库来覆盖不足的技术知识不是正确的用例。使用库的决定应围绕是否使用库来加速开发并提供经过测试的可靠解决方案进行。使用库的决定不应围绕程序员无法解决给定问题的问题。
重要的是要了解自己的领域和过程的一部分。
例如,假设您正在使用图像处理库。您是否真的需要全面了解高斯模糊,变换和色彩空间?不。但是您确实需要首先知道为什么要使用该库。或框架的排序功能。您是否需要知道使用的实际排序算法?在大多数情况下,不会。但是您确实需要知道为什么需要对数据进行排序。
另一方面,如果您正在编写编译器,那么您将更好地了解编译器的工作原理,因为这就是您在该过程中的角色。
jQuery之类的某些框架将很多抽象化。您是否需要知道它们的工作原理?不会。但是,在您编写代码时,对库的工作有一个深刻的基本了解将对您非常有益,因为您将更好地理解为何以这种方式构造框架,并能够充分利用框架的潜力。
根据我的经验:由于您无法消除对库的依赖,因此您和您的团队应该对解决问题有足够的了解。
作为程序员,我们的时间很少,因此我们必须选择优先级最高的程序。必须尽快,温和地解决问题。仅因为这个原因,“学习所有有用的东西”多少有些多余。
我要在此处添加的内容是“依赖项”。作为一个社区,我们都依赖他人。我们站在Giants上来构建我们的应用程序:Java,.NET,API ... 并且我们相信Giants的工作;因为它适用于很多人。如果您对框架或API有疑问,很可能其他人在某个地方遇到了它,并且有解决方案/解决方法。
唯一的问题是:巨人队可能在某个限制条件下崩溃了。例如,某些操作系统不支持闪存,没有它,我们无法做很多事情。这种可能性大于零,但是在这种情况下,我们几乎无能为力。只有在这些情况下,有关“幕后的秘密”的知识才被证明是有用的,因为它指出了问题的根源所在,并且可能会产生很大的解决方法。但我不确定我们投入的时间是否值得。
为了应对这种可能性,我认为有一个解决方案:因为大多数程序员都可以轻松地掌握库的“表面工作”,而且只有有时候我们确实需要一位非常了解的人:让团队分开来做。试图组成一个团队,每个人都精通涉及的1,2个有用的库/工具/“技能集”:一个人对jQuery有良好的经验,一个人专门研究数据库,...这将有助于最大程度地降低风险。
另一个观点是安全性。当您使用不了解确切内部工作原理的库时,便会假设实际发生的情况。每个失败的假设都可能为恶意攻击者打开攻击载体。
致电Quicksort时,您应该注意最坏的情况。否则,攻击者可能会注入最坏情况的数据并执行DoS。
当调用压缩库时,您应该意识到,当某些数据压缩到更少的字节时,那么必须有数据“压缩”到比原始字节更多的数据。因此,当您假设输出缓冲区仅压缩(压缩到较少的字节数)时仅需要输入数据的大小时,就会发生缓冲区溢出等待发生。
您应该对要做的事情了解足够的基础知识,以便能够证明您的假设是正确的。否则,该库应明确注意这一点,例如,在提供的输出缓冲区不够大时引发异常。
只要您确定所使用的一切都可以,就可以不了解它。一旦您被lib中的bug咬伤,便有时间查看其工作原理,工作原理以及为什么无效。当然,即使您不必这样做,也总是会欢迎并鼓励您深入了解内部。
编程中的困难之一是克服诱惑,自己解决所有问题。
金田
只要您了解库或框架正在尝试做什么的基本要点,就可以了。至于内部零件,那没有。采取务实的态度。它可以正常工作,可以满足我的要求。
关键是不要陷入一堆小细节而已经实施了该死的想法。
我想,重点是,您不会一无所知。认真地说,您几乎没有时间研究所有内容,因为这会使您偏离创建自己想法的主要目标。也许一点一点,您可以在周末安排一些空闲时间来阅读有关该主题的一章左右。
但是,除非您有很多空闲时间,否则请不要尝试解决所有问题。编程语言的原因是使我们无法执行汇编代码,汇编语言的原因是使我们无法执行1和0。我认为您不需要了解其背后机制的每一个细节,而只需了解其一般要点。像垃圾收集器一样,我知道它会处理我的指针/内存,我不在乎它使用了什么神奇的整洁算法,我只是知道它可以工作(满足我的需要),并且它不会做任何其他事情。也许是它的缺点,但是。当然,除非您是必须要处理的领域。那你无论如何都不会问这个问题,因为这是你工作的一部分。