在计算机科学界中有这么一个原则,任何问题都可以通过添加一层抽象层来解决。随着时间的推移,我们距离底层的实现越来越远,越来越不知道底层究竟运行的是什么。
GitHub最近在技术预览中推出了 Copilot (代码领航员)。Copilot是一款基于AI的根据上下文自动生成代码的编程助手,它的目的旨在简化软件开发的过程。
每当有简化和自动化的工具产生时,总是会被提到的一个问题就是:”还需要开发人员么?“。而每次的答案都是”是“。计算机领域每次增加一层都会降低进入的门槛从而吸引更多的人进入这一领域。而新增加的这一层也会带来新的技术方案、实现方案和更复杂的系统,由此也会产生新的机会。
本文也通过简单的梳理抽象层叠加的简史,从何推演一下Copilot带来的影响。
# 历史
一个典型的案例就是图灵机。他是为了破解“恩尼格码”密码机而生的,他背后的理念现在普遍被认为是现代编程语言的基础。
自图灵机开始,计算机使用了处理器,能够使用随机寻址的方式获取指令,并对指令进行一般化的处理。这些指令就是机器码来进行描述的,人类很难阅读和编写。这就是更高级更抽象的编程语言出现的原因。
我们可以这么理解编程语言,它就是可以转换为机器码,同时有方便人类阅读和编写的一条规范。
# 编程语言的演变
编程语言从较低的抽象级别向较高抽象级别演变的过程,每次通常都是为常用的操作添加自动化或其它的辅助。这些抽象有各种各样的形式,从内存的垃圾回收到各种类库或语法的升级。
这些演变降低了技术实现的复杂性,从而让开发人员后时间和精力创建更复杂的软件。从而相同的工作时间,开发人员可以为客户提供更多的功能。由于这个特性随着编程语言的演变,编程边的越来越容易。甚至出现了试用自然语言进行编程的语言 (Gherkin)[https://www.jianshu.com/p/43cb0e79f075] 使用这类语言几乎无需计算机相关的专业知识。
但是这并不意味着抽象级别低的语言就没有用武之地。相反的,即便这些语言更晦涩难懂编写的代码也更冗长,在某些特定的场景,如内存管理、视频处理他们可以更高效和灵活。
机器学习的出现就可以解放大量基于数据的劳动,原来需要手工或者编写代码来完成的繁琐冗长的工作,通过机器学习可以轻松的完成。使用机器学习技术,只需要少量的代码就能实现很复杂的数据处理工作。甚至有一些自动化的项目,你只需要提供数据,他就可以给你相应结果,连输入少量的指令都不需要了。
然而对底层的了解,依然是非常重要的。否则当碰到问题时,可能会感到手足无措。因为不知道底层的原理,从而没有解决问题的思路。
# 硬件的演化
我们说了代码的演变,同样的过程在硬件上也在进行。一开始,公司都是使用自己的服务器,知道后来可以到IDC机房租用实体服务器。租用实体服务器的成本很高,而且需要自己具有进行软件系统安装和维护的能力。
随着虚拟化技术的发展,现在可以通过阿里云、华为云这样的供应商自用虚拟服务器。这大大的降低了服务器使用的成本,并且降低了对服务器使用的技术门槛。但是还是需要具备一定的服务器知识才能很好的使用这些虚拟服务器。
近些年,Docker技术兴起,容器化技术被大量使用。使用相关的工具可以在虚拟机上快速的部署应用,而无需掌握底层的系统。与机器学习一样,还有一些正在进行的项目,这些项目都有一个共同的目的进一步减少使用容器所需的专用知识和技能。
最重要的是,一个名为“serverless”的新的抽象层正在出现。它可以让你直接在远程容器上直接执行代码,直接跳过了去部署容器的步骤。虽然目前只能用于无状态的操作,但是相关的案例和工具会在这个生态中持续的增长。最终扩展他的能力,降低它的门槛。
# Copilot的发展
Copilot是软件工程发展中一个又有趣的东西,及时目前它还不能很好的用于实际工作。根据官方在常见问题中的说明,它目前大概有50%的几率能够给出正确的结果,所以建议谨慎的对待它生成的代码。
我们可以还一个角度看待 GitHub Copilot,把他看做一种新的编程语言。在这种语言中,你输入文档和方法名,然后它帮你把输入翻译为另一种编程语言的代码。
目前这一代的 Copilot 只能用于方法的生成。但是我们可以想想,随着技术的发展,它可以生成类甚至是包。甚至将来对大部分通用的场景可以生成完美的模块。
即使有一天它能够生成更高一级的组件,它的产出物仍然需要程序员来讲这些产出在更高的一层进行拼装。最终实现特定的业务需求。
# 结论
就以上的信息,GitHub Copilot将为软件开发增加新的一层抽象层,并简化软件的开发是毫无疑问的。就像之前的那些抽象层一样,它具有推动软件开发行业发展的力量。
但是,程序员永远不会缺少机会,因为有了这个新的抽象层,项目的范围将边的更大。作为程序员,每天所做的日常工作可能会发生变化,但是在很长的一段时间之内,软件开发仍然是离不开程序员的。
可以类比习惯管理员这个职位的职能变化,这个职位的能力重心已经从以前维护硬件和操作系统高效稳定运行主键演变为维护服务的高效稳定运行。程序员的能力中心也将发生类似的演变,基于新的工具进行新的能力迁移。
# 后续
这种能力应该是对业务的了解和建模,根据业务进服务能力的设计,根据业务场景、部署场景对各类技术解决方案的取舍。
根据目前软件工程的过程我对这个能力进行一个分析,不局限于狭义的程序员职责。
软件开发阶段 | 原来的能力需求 | 新的能力需求 |
---|---|---|
项目立项 | 解决方案设计 | 了解更多的成熟模块 |
需求调研 | 需求分析 | 无变化 |
架构设计 | 架构设计能力 | 了解更多的成熟架构模块 |
详细设计 | 软件设计 | 模块设计 |
编码实现 | 编程语言、数据结构、算法、设计模式 | 实现选择能力 |