2019-AI技术带给软件开发的6种转变

随着人工智能技术的不断发展将会颠覆我们传统的软件制作,软件开发智能化不在是个趋势而是必然性的体现

AI正在逐渐的改变所有业务功能,软件开发也不例外。机器学习技术不仅可以用于加速传统的软件开发生命周期(SDLC),也为技术创新提供了一种全新的范例。

传统上,开发计算机程序要求我们事先准确指定系统要做的事情,然后手工设计技术的所有功能。以明确的方式编码许多任务。然而随着时代的发展需求的不断提高,有许多任务和决定太复杂,无法以严格的,基于规则的方式教给计算机。即使是像识别互联网上的照片或视频是否属于猫这样看似简单的活动,也是传统软件开发无法实现的。鉴于猫照片可以采取的巨大排列,没有任何工程师团队可以列举所有能够可靠地识别猫的规则以及可能出现在媒体中的所有其他可能的对象。


机器学习从根本上改变了软件开发模式

进入人工智能技术,如机器学习和深度学习。在这些方法中,软件开发人员不会为如何制定决策和采取行动提供计算机规则。相反,他们会策划并准备特定领域的数据,这些数据被输入到学习算法中,这些算法经过迭代训练并不断改进。机器学习模型可以从数据中推断出哪些特征和模式是重要的,而无需人类明确地编码这些知识。ML模型的输出甚至可以给人类带来惊喜,并突出我们自己没有想到的观点或细节。

因此,人工智能对计算机编程的最深刻影响是揭示人类如何感知,定义和执行软件开发。

现任特斯拉人工智能总监的OpenAI研究科学家安德烈·卡尔帕西(Andrej Karpathy)表示,“未来很大一部分程序员不会维护复杂的软件存储库,编写错综复杂的程序或分析他们的运行时间。他们将会收集,清理,操作,标记,分析和可视化为神经网络提供数据的数据。“Karpathy用一种高度可引用的见解来描述海洋变化:”神经网络不仅仅是另一种分类器,它们代表了我们如何从根本上转变的开始编写软件。它们是软件2.0 。 “

他将Software 1.0的“经典堆栈”描述为计算机的明确指令,由程序员使用Python或C ++等语言编写。传统的软件开发生命周期通常从需求定义(即技术规范)开始,然后转向设计和开发。一旦构建了可行的原型,就会进行QA测试。最后,一旦产品通过集合,它将被部署到生产中并且必须持续维护。敏捷流程可以使这个周期变得更快,因为工程师将选择较小的功能集来专注于2-4周的冲刺,而不是试图一次性构建整个软件。无论是敏捷还是瀑布,这个过程基本上是相同的。

随着时间的推移,这些系统变得异常复杂,需要多个依赖关系和集成以及层功能和接口层。所有这些组件必须由人工手动管理和更新,从而导致不一致和无法解决的错误。

相比之下,机器学习模型推断出数据中的重要特征和模式。用Karpathy的话来说,软件2.0是以“神经网络权重”的形式编写的代码,不是由人类编写的,而是通过机器学习方法,如反向传播和随机梯度下降。更新模型需要使用新数据重新训练算法,这将改变模型的行为和执行方式。

虽然机器学习开发有其自身的调试和维护挑战,但Karpathy强调了这样一个事实,即软件2.0已经变得非常可行和有价值,因为“很大一部分现实问题具有收集数据更容易的特性”(或者更一般地说,确定一个理想的行为,而不是明确地编写程序。“从软件2.0中受益最多的领域包括计算机视觉,语音识别,机器翻译,游戏,机器人和数据库。


Karpathy还引用了新范式的好处:

  • 更加同质化,更易于管理
  • 可以轻松烘焙成硬件
  • 持续运行时间和内存使用
  • 高度的便携性
  • 高度的敏捷性和可集成性
  • 更容易为未来的开发人员学习
  • 比某些功能/垂直(即图像/视频,声音/语音和文本)中最好的人类编码器更好
  • 然而,专业人士并非没有缺点。许多机器学习方法的关键局限性是我们人类无法完全理解这些复杂系统的工作原理,导致它们在我们看来是“黑匣子”。由于缺乏理解和控制而产生的另一个挑战是由于算法偏差和偏执机器人等有缺陷的模型而产生的意外和令人尴尬的后果。

传统软件从ML技术中获得提升

然而,传统的软件开发并没有消失。培养高性能机器学习模型只是产品化AI技术的一个步骤。正如一篇受欢迎的谷歌论文所断言的那样,只有一小部分真实世界的机器学习系统由机器学习代码组成。

数据管理,前端产品接口和安全性等关键组件仍需要由常规软件处理。但是,使用传统SDLC开发的技术仍然可以通过以下方式受益于机器学习方法:
  • 快速原型制作:将业务需求转变为技术产品通常需要数月甚至数年的计划,但机器学习通过使技术领域较少的专家能够使用自然语言或可视化界面开发技术来缩短此过程。
  • 智能编程助手:开发人员将大部分时间用于阅读文档和调试代码。智能编程助手可以通过提供即时支持和建议(例如相关文档,最佳实践和代码示例)来缩短这一时间。此类助手的示例包括Kite for Python和Codota for Java。
  • 自动分析和错误处理:编程助手还可以从过去的经验中学习,以识别常见错误并在开发阶段自动标记它们。一旦部署了技术,机器学习也可用于分析系统日志,以快速甚至主动地标记错误。将来,还可以使软件在没有人为干预的情况下动态地改变以响应错误。
  • 自动代码重构:清洁代码对团队协作和长期维护至关重要。随着企业升级技术,大规模的重构是不可避免的,往往这个过程是痛苦的。机器学习可用于分析代码并自动优化代码以实现可解释性和性能。
  • 精确估计:众所周知,软件开发的过程中对于时间的把握相当的重要。然而可靠的估算需要深入的专业知识,对环境的理解以及对实施团队的熟悉程度。机器学习可以训练过去项目的数据 - 例如用户故事,特征定义,估计和实际情况 - 以更准确地预测工作量和预算。
  • 战略决策:花费大量时间来讨论哪些产品和功能要优先考虑哪些以及哪些要削减。针对过去的开发项目和业务因素培训的AI解决方案可以评估现有应用程序的性能,并帮助业务负责人和工程团队确定最大化影响并最大限度降低风险的工作。

根据Forrester Research关于AI对软件开发影响的报告,将AI应用于软件开发中的主要作用总结为在于自动化测试和错误检测工具。

实际上,我们已经看到AutoML解决方案的巨大增长,这些解决方案旨在实现机器学习模型培训流程的自动化,减少数据科学家和工程师的工作量,并使领域专家能够培训生产质量模型。

诸如H2O.ai的无人驾驶AIGoogle Cloud的AutoMLAmazon Sagemaker等解决方案可自动化或简化关键组件,例如数据准备,模型搜索和调整以及模型部署和扩展。


总结:随着人工智能技术的不断发展将会颠覆我们传统的软件制作,软件开发智能化不在是个趋势而是必然性的体现,探码科技作为新时代的软件技术商将利用更多新技术赋予软件制造更多智能化的可能!