笼统地说,机器学习技术不仅可以用于加速传统软件开发生命周期(SDLC),而且还为创造技术提供了一种全新的范例。
传统开发计算机程序的方式需要你事先确切地指定系统要执行哪些操作,然后手动设计所有技术功能。因为在人工智能出现之前,计算机的功能仍然是非常强大的,因此可以用明确的方式来编码许多任务。
然而,有许多任务和决定太过复杂,不能以严格的、基于规则的方式向计算机传达。即使是识别互联网上的照片或视频是不是一个关于猫的照片或者视频,这么一个看似简单的活动,也是传统软件开发所无法企及的。考虑到不同的猫照片可能存在巨大的差异,所以没有一个工程师团队可以列举出所有可以可靠地识别出是猫、而不是其他可能出现在照片或者视频中所有物体的规则。
一方面,机器学习从根本上改变了软件开发的范式。
引入人工智能技术,例如机器学习和深度学习。在这些技术方法中,工程师不会给出关于如何做出决定和采取行动的计算机规则。相反,人工智能策划并准备了特定领域的数据,并将这些数据输入到学习算法中,这些算法经过反复训练不断地改进。机器学习模型可以从数据高端网站设计中推导出哪些特征和模式是重要的,不需要人类明确地编码这些知识。机器学习模型的输出甚至可以给人类带来惊喜,突出我们没有想到的一些观点或者细节。
因此,人工智能对计算机编程最深刻的影响,是解开了人类如何感知、定义和执行软件开发的谜团。作者、科学家和谷歌研究工程师Pete Warden认为,“随着知识在开发人员社区中的扩散,我们还要等上相当长一段时间,但我预测,10年内大多数软件工作将不涉及编程”。
前OpenAI研究科学家、现任特斯拉人工智能总监的Andrej Karpathy表示认同,他说“未来很大一部分程序员不会维护复杂的软件库,编写复杂的程序或分析其运行时间。他们收集、清理、操作、标记、分析和可视化提供给神经网络的数据。”Karpathy用一种非常引人瞩目的见解描述了这种巨大的变化:“神经网络不仅仅是另一个分类器,神经网络还代表了我们如何从根本上改变编写软件的方式,这就是软件2.0。”
他把软件1.0的“经典堆栈”定义为由程序员使用诸如Python或C 等语言编写给计算沈阳做网站机的明确指示。传统的软件开发生命周期通常始于需求定义(即技术规范),然后是设计和开发。一旦建立了可行的原型,就有质保测试。最后,一旦产品通过审核,将被部署到生产中,而且得到持续的维护。敏捷流程可以让这个循环加快速度,因为工程师会选择一个较小的功能集,专门用2-4周的时间冲刺,而不是一次性构建整个软件。然而,无论是敏捷式还是瀑布式,过程本质上都是相同的。
随着时间的推移,这些系统变得非常复杂,需要多个依赖关系和集成,以及层层的功能和接口。所有这些组件必须由人工手动管理和更新,而这会导致不一致和无法解决的错误。
相比之下,机器学习模型可以推断出数据中的重要特征和模式。用Karpathy的话来说,软件2.0是以“神经网络权重”的形式编写代码,不是由人类编写,而是由机器学习方法如反向传播和随机梯度下降编写的。更新模型需要使用新数据重新训练算法,这将改变模型的行为方式和执行方式。
尽管机器学习在开发和维护方面面临挑战,但Karpathy强调了这一事实:软件2.0正在变得高度可行且具有价值,因为“大部分现实世界的问题都具有易于收集数据的特性(或者更一般地说,确定一个理想的行为),而不是明确编程。”从软件2.0中受益最大的领域包括计算机视觉、语音识别、机器翻译、游戏、机器人和数据库。
Karpathy还提到了这种新范式的好处:
更同构,更易于管理
持续的运行时间和内存使用
高度便携性
高度灵活性和可集成性
对于未来的开发人员来说更容易学习
比某些功能/垂直领域(例如图像/视频、声音/语音、文本)中最好的人类编码器还要好。
然而,有得也有时失。很多机器学习方法的关键局限性,是我们人类无法完全理解如此复杂的系统如何工作,导致这种机器学习方法在我们看来就是一些“黑盒子”。由于我们缺乏理解和控制而导致的另一个挑战,是由于有缺陷的模型(例如算法偏差和机器人僵尸)而产生一些意外的、令人尴尬的后果。
另一方面,传统软件从机器学习技术中获益。
传统的软件开发并未就此消失。训练一个高性能的机器学习模型,这只是人工智能技术产品化的一个步骤。正如谷歌的一篇论文所指出,只有一小部分真实世界的机器学习系统是由机器学习代码组成的。
诸如数据管理、前端产品接口和安全等关键组件仍然需要由常规软件来处理。然而,使用传统SDLC开发的技术仍然可以通过以下途径从机器学习方法中受益:
1、快速原型化。将业务需求转化为技术产品通常需要几个月的时间,但机器学习通过让较少的技术专家使用自然语言或可视界面开发技术缩短了这一过程。
2、智能编程助理。开发人员大部分时间都在阅读文档和调试代码。智能编程助手可通过提供即时支持和建议(如相关文档、最佳实践和代码示例)缩短这部分时间,例如Kite for Python和Codota for Java。
3、自动分析和错误处理。编程助理还可以从过去的经验中学习,以发现常见的错误并在开发阶段自动标记这些错误。某项技术一旦被部署,机器学习还可以用于快速分析系统日志,甚至主动标记错误。未来,还可以在不需人工干预的情况下,让软件动态变化以应对各种错误。
4、自动代码重构。对于团队协作和长期维护来说,清除代码至关重要。随着企业逐步升级技术,大规模重构是不可避免的,而且往往是痛苦的过程。机器学习可用于分析代码并自动优化其可解释性和性能表现。
5、精确估算。众所周知,软件开发常常遇到超出预算和超出时间表的问题。可靠的估算需要深厚的专业知识、对背景的了解以及对实施团队的熟悉程度。机器学习可以训练过去的项目数据,如用户故事、特征定义、估算数据和实际数据,更准确地预测工作量和预算。
6、战略决策。我们有相当一部分时间花在讨论哪些产品和功能需要优先考虑,哪些功能需要削减掉。针对以往开发项目和商业因素训练的人工智能解决方案,可以评估现有应用的性能,并帮助业务负责人和工程团队确定如何最大限度地发挥影响以及降低风险。
根据Forrester Research关于人工智能影响软件开发的报告:企业将人工智能大量应用于软件开发的兴趣,主要集中在自动化测试和缺陷检测工具方面。
最后,一个终极问题是,人工智能能否创造人工智能,从而颠覆人类参与技术开发的需要。实际上,我们已经看到AutoML解决方案的大幅增长,这种解决方案旨在实现机器学习模型训练流程各个部分的自动化,以减少数据科学家和工程师的工作量,让领域专家能够训练出生产质量模型。诸如H2O.ai的无人驾驶人工智能,Google Cloud的AutoML和Amazon Sagemaker等解决方案,可自动化或精简关键组件,如数据准备、模型搜索和优化、模型部署和扩展。