编码者到架构师:人工智能、领域特定语言和软件工程的转变
人工智能在软件工程中的作用
近年来人工智能的爆炸性进化引发了各领域的讨论,其中一个热门话题是人工智能可能取代软件工程师的潜力。这个想法在许多人中间广为流传,创造了一个人工智能接管开发者角色的愿景。
从个人角度来看,我相信在人工智能的影响下,手动编写代码的必要性以及每行代码的成本将大幅减少。我对人工智能的发展充满信心,它将会带来能够生成代码的人工智能助手,而不是取代工程师,而是辅助他们。已经有像Copilot这样的工具被广泛使用,当然有一些限制,比如这些工具无法为你生成整个项目/解决方案,但不断的改进是不可阻挡的。
然而,编写代码本身并没有持有重要的意义;它只是解决现实世界业务或社会问题的工具。真正的价值在于工程师如何运用这些工具来解决问题。软件工程师不应仅仅成为打字员,而应成为问题解决者。通过阅读文章和听取各种演讲,我相信软件工程师不会被人工智能所取代。有很多原因使得这种替代是不切实际的。相反,他们将被迫发展并担任架构师等角色,否则可能会面临市场价值的降低。
工程师将利用高阶工具(人工智能助手)来解决问题,利用这些工具的新方式。在软件工程这个不断发展变化的领域中,出现了各种可能性,我将只涉及软件工程持续演进中的一个潜在路径。
建筑思维的出现
虽然人工智能不断进步,但仍需要一位工程师对其进行指导以生成解决方案,并描述解决问题的方法。人工智能面临的挑战在于“理解”工程师的要求。提供的任务或解决问题的方法越精确,生成的结果就越准确。这个原则是每种沟通的基础。
看起来需要一种特定的方法与人工智能进行沟通,最简单的解决方案是使用特定的语言/指令和沟通方法。人工智能已经能够根据常见描述生成大量的代码,所以代码生成本身并不是一个重大问题,而且预计代码质量将得到改善,并且看起来会有更多专门用于代码生成而不仅仅是通用人工智能的解决方案。
在不久的将来,人工智能面临的挑战将是实施复杂的架构解决方案,按照工程师的要求确切地解决问题,并实施高层次接口。软件工程师将需要更多地与高层抽象、接口、通信模式和关系进行工作。朝着成为架构师的发展将是至关重要的,因为这些技能将变得更有价值。
DSL作为一种通信桥梁
有了应用架构的想法,甚至在一些模式中,要向AI助手准确解释应该实现什么是具有挑战性的。这就是领域特定语言(Domain-Specific Language,简称DSL)[1-3]发挥作用的地方。DSL是一种相对较旧的发明,在软件工程中被广泛使用。最受欢迎的DSL包括:
- 网页:HTML
- 建模: UML
- 数据管理:SQL
- 等等
为了能够有效地与软件工程领域的人工智能助手协作,有必要创建一种新的领域特定语言(DSL),使得人工智能能够更好地理解工程师的需求并生成更精确的解决方案。我相信专用的人工智能助手将被训练以理解这种DSL,工程师们将使用这种高级架构语言来描述解决方案,而不是进行低级编码工作。当然,最初的解决方案需要工程师进行审核和一些修正,但随着时间的推移,它们将变得更加智能。
关于这样一个DSL可能是什么样子,重要的是要注意,我的重点主要在于服务器端解决方案。以下只是一些关于它可能是什么样子的初步设想。
# DSL for Server Application Architecture
# Define a Backend Module
Module:
Name: BackendModule
Type: BusinessLogic
Components: [Service: UserService, Database: UserDB, API: AuthAPI]
# Define a Database Module
Module:
Name: DatabaseModule
Type: DataStorage
Components: [Database: UserDB]
# Define an Authentication Layer
Layer:
Name: AuthLayer
Components: [API: AuthAPI]
# Define Relationships
Relationship:
From: BackendModule
To: DatabaseModule
Type: DependsOn
Relationship:
From: BackendModule
To: AuthLayer
Type: Contains
非常简单的定义和组件关系描述,当然,如何描述接口、协议和其他很多部分是遗漏的。不过,正如我之前提到的,这只是一篇简化且有限的示例文章。根据这种方法,我们将生成DSL规范,然后将其输入ChatGPT进行训练。
让我们来玩ChatGPT吧
让我们尝试使用简单架构生成一个应用程序:一个管理用户并提供身份验证API的Web服务器,使用例如MongoDB进行持久化存储。服务器将实现分层架构:路由器/控制器/用例/服务/模型。
所描述的规范将会如下所示:
# DSL for Web Server Architecture
Application:
Name: ExampleAppWebServer
Type: WebServer
Technology: NodeJS
Config:
AuthEnabled: true
Port: 3000
DatabaseClient:
Technology: MongoDB
Config:
ConnectionString: mongodb://localhost:27017/userdb
Routes:
Endpoints:
- /api/users
POST:
requestBody:
content:
type: object
required:
email: string
name: string
password: string
response:
content:
type: object
properties:
email: string
name: string
_id: string
GET:
response:
content:
type: object
properties:
email: string
name: string
_id: string
- /api/users/:id
DELETE:
response:
content:
type: object
properties:
email: string
name: string
_id: string
- /api/login
POST:
requestBody:
content:
type: object
required:
email: string
password: string
response:
content:
type: object
properties:
email: string
name: string
token: jsonwebtoken
Controllers:
Components:
- UsersController
- LoginController
UseCases:
Components:
- GetUsersUseCase
- SaveUserUseCase
- DeleteUserUseCase
- LoginUseCase
Models:
Components:
- UserModel
在创建此DSL描述时,我采用了YAML格式,混合了OpenAPI方法来描述接口。我将此描述与以下命令一起发送给ChatGPT:
使用规范生成工作项目。确保所有组件都已实施。
根据该规范生成的项目可在此处访问(https://github.com/yzhbankov/ai-generated-solution),您可以通过使用上述规范来尝试它。
同时,我还制作了一个关于这个过程的视频。
第一次使用ChatGPT生成一个项目时,我非常惊讶,因为它轻松地生成了一个完整的项目,包括一个Web服务器。我请求了几次重新生成,并对手头的任务进行了澄清。令人惊讶的是,每次重新生成只需要几秒钟,就能得到一个功能完善的解决方案。唯一需要调整的是在usecases中修正一个导入语句的小修改。在上面的视频中,您可以看到在我清理了聊天上下文之后进行的最后一次尝试之一。
这是一个很好的例子,充分说明了即使是一个非专门化的AI助手也可以根据一个不熟悉的DSL生成解决方案。AI展示出的解决方案水平令人称奇;它可以有效地处理以前从未遇到过的DSL。这引发了有关专门化AI能力的有趣可能性,其潜力不难想象。
结论
回到文章开头提出的观点,可以明显地看到,代码每行的成本预计将与软件工程师角色的转变相对应。预计从仅仅是编码人员转变为承担架构师角色(如果不希望失去价值)。这种转变的显著特点是某些专业领域的独家性逐渐减弱,就像最近在网页布局设计中所见(仅关注HTML和CSS)。
虽然软件工程正处于重大演进的边缘,强调它不会被人工智能取代是至关重要的。相反,这种转变将见证新的DSL的出现。尽管技术进步,但对细致实施检查的需求将持续存在,测试角色可能会增加。此外,预计将推出新的人工智能助手和工具,为软件开发领域的持续演进作出贡献。
目前有许多未解答的问题,一些超出我当前知识范围的方面,以及我无法想象如何解决的挑战。然而,我相信我们将会目睹许多令人兴奋的发展和创新。
链接
- 请前往以下链接查看关于领域特定语言的详细信息: https://learn.microsoft.com/zh-cn/visualstudio/modeling/about-domain-specific-languages?view=vs-2022
- https://translate.google.com/translate?sl=en&tl=zh-CN&u=https://www.jetbrains.com/mps/concepts/domain-specific-languages/
- https://zh.wikipedia.org/wiki/%E4%B8%93%E7%94%A8%E8%AF%AD%E8%A8%80