当我开始编程和从事项目工作时,我很惊讶有些人在创建软件时编写的代码很少。 深信您编写的代码越少越好。 我很难多次讨论这个话题。 对我来说,自己编写所有内容是最好的方法。


原因之一是我想了解每个实现细节,也想学习如何解决这类问题。
当我“外包”这些实现时,我感觉失去了对代码的控制。
当然,自己做任何事情也有很多弊端。
但是,我大学里很多经验丰富的同学,后来我的同事告诉我,不要重蹈覆辙。 为了解决最微小的问题,他们中的一些人使用了无数个库。 对我来说,这感觉就像是用大锤砸开坚果一样。
如果您要问自己标题是哪里来的:大学的一位同学的工作方式使我想起了建造乐高玩具的一些方法。 我不想惹玩具公司而把名字改成砖头。 LBD也已经是“设计学习”的缩写,而BBD是免费的缩写🤓 。
几年后,一些经验,我的看法有所改变。 但是,我仍然认为,我在编码职业生涯初期所拥有的基本信念和想法并不完全是错误的。
在本文中,我想重新讨论该主题,并将其最新的经验和周围人的意见反馈给它。
当然,如果不使用框架和库,当今构建复杂的解决方案是不可行的。 您很可能不想编写自己的测试框架或实现自己的解决方案来处理HTTP请求。
特定领域所需的代码可能已经被该领域的专家实施。
其他一些优点是:
- 该库可能已被许多开发人员事先使用和批准, 例如JUnit,它是Java应用程序广泛使用的测试框架。
- 大多数错误和边缘情况已被排序
- 好的图书馆得到维护和改进
- 创建应用程序并不需要每个领域的专家都可以, 例如NumPy,它是使用Python进行基础科学计算的软件包,其中包括数学数据类型和函数。
与自己编写所有内容相比,使用库还可以提高开发速度。 无论如何,大多数编程语言已经附带了许多标准功能。 没有很多理由不应该将发达的库用于特定目的或商业项目。
使用开放源代码库甚至可以带来好处,您可以实际了解实现甚至做出贡献。
最后,使用框架可以减少大量的复杂性,并使加入已经熟悉该框架的其他开发人员更加容易。 此外,它可以为您节省大量时间,并为您的公司节省大量资金。
无论如何,在这些情况下,学习和理解正在使用的模块是一个重要因素。 仅仅组合现有的组件并不能使您成为更好的开发人员(当然,人们对成为一名优秀开发人员的理解不同,并且可以肯定地讨论😉)。 不知道代码的行为方式可能会冒风险并导致错误,或者代码可能会显示意外的副作用。
谨慎使用框架并了解每个依赖项带来的潜在问题至关重要。 接下来,我将解决两个最大的风险:
风险1-您过于依赖(这是一种承诺)
2016年,由于法律问题,删除了一个17行的NPM软件包。 该软件包用于对文本进行右对齐,并且依赖于其中一些流行的框架。结果,成千上万的应用程序被破坏了。 好吧……您明白了!
整个故事可以在这里找到:https://arstechnica.com/information-technology/2016/03/rage-quit-coder-unpublished-17-lines-of-javascript-and-broke-the-internet/
风险2-安全
银行尤其要非常小心,并且在使用其软件中的外部代码方面有很多限制。 图书馆可能会引入安全问题的风险(无论是错误还是有意的)都太危险了,以至于轻描淡写地将它们包括在内。
除了提到的风险外,库和框架可能会影响您的软件设计,因为它们可能会强加特定的体系结构。
许多人或公司正在通过使用现有的想法来解决问题,并对其进行迭代或修改以适合他们的需求。
所谓的“类比推理”是根据先前的假设和他人的经验来解决问题。 因此,实际的解决方案是对成功实践和测试过的实践进行修改或组合。
软件公司在这种方式上差别不大。 他们想要快速有效的解决方案,并将风险降至最低。
当然,从安全的业务角度来看,这是完全合理的,但是可以想象每个人都在继续使用现有的组件和功能。
信息技术的创新将放慢速度,并局限于可能不是最佳解决方案的现有组件。 真正的创新是很少见的,因为组件仅在不断发展,而其核心实现却从未改变。
当然,您可能会争辩说,使用现有组件可以让您有更多的时间在此同时开发新事物,但是在大多数情况下,项目进度非常紧张,除非有没有其他东西,否则就不会花很多时间进行创新可以代替使用。


还有另一种方式-第一原理思考。
把事情煮成最基本的真理。 我们确定的事实是正确的,然后从那里进行推理–伊隆·马斯克(Elon Musk)
第一个原则思考实际上意味着您没有做出假设。 您仅根据已证明的事实为问题创建解决方案。
例如:
伊隆·马斯克(Elon Musk)是我们这个时代最具创新精神的人之一,他使用这种思维来解决问题。
https://medium.com/the-mission/elon-musks-3-step-first-principles-thinking-how-to-think-and-solve-difficult-problems-like-a-ba1e73a9f6c0
借助SpaceX,他仅根据物理定律来开发火箭,而不是改善现有技术水平。 他不想相信飞往太空的成本如此之高。 他以重复使用火箭和助推器的创新思想,设法将飞往太空的成本降低了一百倍以上。 https://jamesclear.com/first-principles
在软件开发的历史中也有一些例子:随着Java及其面向对象编程(OOP)的兴起,功能性编程的重要性正在下降。
但是在最近几年中,计算机转移到了多核系统,并且随着这种变化,它们增加了并行执行的数量。 函数式编程之所以卷土重来的原因之一是,如果正确使用它,与OOP相比,副作用的危险较小。
好吧,这些例子表明,有时需要“重新发明轮子”才能有效解决一些问题并产生更大的影响。 (也不太可能有人会记住在Node-JS库的第42次迭代中工作的“那个人”🤓)
一个非常不同(但很重要)的点是库可能带给软件项目的开销。 您很可能不会使用库的每一行或其功能,从而增加了应用程序的大小。 例如,当您在移动设备上安装或更新应用程序时,始终会下载整个应用程序及其所有编译库。 您可能没有无限的蜂窝数据,也不想以这种方式使用所有数据。 此外,Apple甚至对AppStore都有限制。 如果应用程式大小超过150MB,则只有在连接WiFi时才能下载。
结论
如您所见,没有明确的对与错。 使用库具有许多优点,但同时也带来了风险和其他折衷。 我希望本文能阐明硬币的两面。
如今,编写没有现有组件的软件对于中等规模的公司来说是不可行的。 对于已经可以使用的常见问题有很好的解决方案。 请记住,考虑依赖于所用库的可维护性和组件至关重要。 另外,请注意,错误可能不会在不久的将来(或根本不会)得到修复。 最后但并非最不重要的一点是,每个库都可能包含恶意代码,并带来开销。
最后,您需要自己决定实际要开发多少,以及由外部组件(如果可以选择)来组成软件。