通过 ChatGPT 生成设计和原型代码,可以帮助团队快速启动项目,验证想法,提高效率。原文: ChatGPT and Software Architecture
Surfing Croyde Bay @Unsplash
OpenAI 的 ChatGPT 现在越来越火,出现了各种有趣用例。
从许多方面来看,ChatGPT 都可以看作是 AI 赋能的架构师白板,除了画画线条和框框,还可以有许多用途。我在本文中将演示如何基于 ChatGPT 启动软件架构流程。
就像在白板上画画一样,过程会有点混乱,各种因素相互作用会导致不得不通过不断修改来找到最佳答案。本文旨在演示成功使用 ChatGPT 的一些提问技巧,这些技巧产生了真正有价值的结果。
需要注意,ChatGPT 仍在学习中,所以不要对一致性有太大期望,多次问同样的问题可能会得到不同的结果。
设置 ChatGPT 帐户很简单,可以按照官方文档完成: https://openai.com/blog/chatgpt/
用户故事
我们从要求 ChatGPT 写用户故事开始。
写一个用户故事,测量员登录到系统,输入地理空间坐标、建筑、建筑类型和特征信息,这是他们一天中要进行的许多调查中的一个
如你所见,这是个特定行业的用户故事。ChatGPT 拥有庞大的知识库,需要通过实验来了解 ChatGPT 的知识深度,即它知道些什么?
第一个问题的关键是要对关键细节非常明确,以获得最佳结果。这样,ChatGPT 可以响应一组体面的结果,如下所示:
如果获得的结果与上述类似,那就意味着 ChatGPT 已经找到了线索,并将根据进一步提出的问题进行构建。要记住的关键是,以下所有结果都将基于这个初始上下文,因此值得花时间定义第一个交互。
现在可以做些非常了不起的事情,构建数据库!
构建数据库
在 markdown 中以表格格式详细生成数据模型
ChatGPT 是这样回应的:
不止如此,我们继续…
生成 SQL
CREATE TABLE Surveyors ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL, PRIMARY KEY (id) ); CREATE TABLE Buildings ( id INT NOT NULL AUTO_INCREMENT, type_id INT NOT NULL, coordinates VARCHAR(255) NOT NULL, notes TEXT, surveyor_id INT NOT NULL, PRIMARY KEY (id), FOREIGN KEY (type_id) REFERENCES BuildingTypes(id), FOREIGN KEY (surveyor_id) REFERENCES Surveyors(id) ); CREATE TABLE BuildingTypes ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(255) NOT NULL, PRIMARY KEY (id) );
复制代码
ChatGPT 输出了完全可用的 SQL,可以顺利创建 SQL 数据库。不止如此……
创建类图
<script src="https://cdn.jsdelivr.net/npm/mermaid@8.6.0/dist/mermaid.min.js"></script> <script>mermaid.initialize({startOnLoad:true});</script> <div class="mermaid"> classDiagram class Surveyors { +id: int +name: string +email: string +password: string } class Buildings { +id: int +type_id: int +coordinates: string +notes: string +surveyor_id: int } class BuildingTypes { +id: int +type: string } Surveyors --> Buildings Buildings --> BuildingTypes </div>
复制代码
ChatGPT 生成的类图如下所示…
ChatGPT 真是让人惊喜:
ChatGPT 没法显示图表,但可以生成能够创建图表的 Mermaid 代码。ChatGPT 非常熟悉 Mermaid 脚本,可以生成这种脚本语言支持的图表。
由此可见,ChatGPT 已经学会了编码,可以继续要求 ChatGPT 编写 JavaScript、CSS 和 HTML,通过简单的请求将原型组合在一起。ChatGPT 经过训练,可以用许多流行的编程语言生成代码。
如果有足够的时间,每个有经验的人都可以做到,只不过速度要慢一些。但这不是生产代码,要使代码达到生产质量和可用性水平,还需要做更多工作。不过 ChatGPT 已经很让人惊艳了。
我们尝试用 ChatGPT 来提高代码质量:
生成遵循 C#实践原则的类设计,包含错误处理和数据库访问层
ChatGPT 的响应:
public class Surveyor { private readonly string _name; private readonly string _email; private readonly List<ISurvey> _surveys; private readonly IDatabaseAccess _databaseAccess; public Surveyor(string name, string email, IDatabaseAccess databaseAccess) { _name = name; _email = email; _databaseAccess = databaseAccess; _surveys = new List<ISurvey>(); } public void AddSurvey(ISurvey survey) { try { _surveys.Add(survey); _databaseAccess.SaveSurvey(survey); } catch (Exception ex) { // Log the error } } public void RemoveSurvey(ISurvey survey) { try { _surveys.Remove(survey); _databaseAccess.DeleteSurvey(survey); } catch (Exception ex) { // Log the error } } public List<ISurvey> GetSurveys() { try { return _databaseAccess.GetSurveys(); } catch (Exception ex) { // Log the error return new List<ISurvey>(); } } } public interface IDatabaseAccess { void SaveSurvey(ISurvey survey); void DeleteSurvey(ISurvey survey); List<ISurvey> GetSurveys(); } public class DatabaseAccess : IDatabaseAccess { public void SaveSurvey(ISurvey survey) { // Implementation for saving the survey to a database } public void DeleteSurvey(ISurvey survey) { // Implementation for deleting the survey from the database } public List<ISurvey> GetSurveys() { // Implementation for retrieving a list of surveys from the database } } public interface ISurvey { decimal Latitude { get; set; } decimal Longitude { get; set; } string BuildingType { get; set; } Dictionary<string, string> BuildingCharacteristics { get; set; } } public class Survey : ISurvey { public decimal Latitude { get; set; } public decimal Longitude { get; set; } public string BuildingType { get; set; } public Dictionary<string, string> BuildingCharacteristics { get; set; } public Survey(decimal latitude, decimal longitude, string buildingType, Dictionary<string, string> buildingCharacteristics) { Latitude = latitude; Longitude = longitude; BuildingType = buildingType; BuildingCharacteristics = buildingCharacteristics; } }
复制代码
作为一组脚手架类,非常不错了。
接下来让 ChatGPT 为 RESP API 创建 Swagger,ChatGPT 再次返回了足以启动开发的不错成果。
结论
ChatGPT 功能广泛,可以帮助启动开发,但还无法实现比较深度的工作。每个回合都必须靠人来激发 ChatGPT 完成任务,缺乏主动性,需要有人发起并推动接下来的步骤。
不过可以开发一组标准问题,促使 ChatGPT 提供好的结果,也许足以帮助团队以多种方式开始开发。
你好,我是俞凡,在 Motorola 做过研发,现在在 Mavenir 做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI 等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。微信公众号:DeepNoMind