2026年11月08日 欢迎访问 读到
首页 / 小说书库 / AI辅助编程实战 / 正文
点评
第9章 调试、测试和部署

本章探讨软件开发中那些常被忽视但至关重要的方面——调试、测试和部署。本章将提供全面的指南,从识别不同的软件缺陷到撰写清晰易懂的文档,再到确保代码按预期执行。此外,本章还将详细讨论如何高效地合并代码更改、保障软件的安全稳定运行、倾听用户的反馈,甚至如何在发布软件时制造影响力。

在编写代码的过程中,据调查,开发者会花费35%~50%的时间进行代码的调试。调试不仅耗费了开发者宝贵的时间,还占据了软件项目预算的很大一部分。

代码错误主要分为两大类。第一类是语法错误,这类错误通常发生在代码没有遵循特定编程语言的规则时,例如for循环的末尾遗漏冒号。现代IDE(如VS Code)能够检测并修复许多语法错误。

第二类是逻辑错误,这类错误发生在代码的逻辑出现偏差时,它们往往比语法错误更难发现和修复。假设你创建了一个程序,旨在根据年龄从列表中过滤掉成年人用户。问题是,这个程序并没有排除所有18岁及以上的用户,而是错误地排除了18岁以下的用户,最终得到一个全是成年人用户的列表,这是典型的逻辑错误,代码正在做与你的初衷完全相反的事情。要弄清楚代码为何标记18岁以下的人群,而不是18岁及以上的人群,并不是一件容易的事情。解决方案包括从调整年龄条件判断到彻底重构逻辑,这都有可能。

通常传统的调试方法足以解决代码错误,AI辅助编程工具在调试过程中并不是首选。VS Code等IDE提供了强大的调试功能,可以帮助开发者设置断点、检查变量的值,甚至逐行执行代码以观察程序的运行情况。在处理大型程序时,这些功能尤其宝贵。

然而,有些代码错误可能会出乎意料地复杂。现代软件就像复杂的拼图,由许多层和部分组成,它们必须协同工作。有时,代码错误可能是软件的不同部分以我们意想不到的方式交互造成的,找出问题根源是一个真正的挑战。此外,文档的缺乏也会增加调试的难度。如果程序没有附带清晰的说明或解释,那么想要理解程序的工作原理以及查找和修复错误将变得更加困难。程序通常依赖外部库或服务,如果这些外部依赖出现问题,也会给程序带来棘手的错误。

当遇到上述问题时,可以求助AI。AI可以帮助你破译难以理解或冗长的错误信息,比如堆栈跟踪信息,即程序崩溃时执行操作的快照。同时,AI还可以提供框架和库之间交互的详细信息。

如果遇到难以理解的错误信息,可以将错误信息复制并粘贴到提示中,并附加如下内容。

提示:这段错误信息是什么意思?{错误信息}

如果代码中存在逻辑错误,导致程序没有实现预期的功能,则可以将代码复制并粘贴到提示中,并附加如下内容。

提示:程序允许用户上传照片并在图库中显示。但是,当执行该程序时,照片并没有出现。这段程序有什么问题?{代码}

如果ChatGPT发现了问题,它通常会提出解决方案。如果它没有提出解决方案,你可以在提示中加入指令,请求它提供解决方案。

文档是保持项目和团队凝聚在一起的黏合剂。然而,文档常常被排在次要的位置。没有文档的代码在工作时就像在没有地图的迷宫中徘徊,尤其对于新手或任何试图理解项目的人,这是一次痛苦的经历。

良好的文档能够帮助我们避免不必要的猜测和误解,确保每个人都能站在同一条起跑线上。根据Stack Overflow的一项调查,68%的开发者每周都会遇到由文档引起的知识障碍。此外,GitHub在其2021年的报告中指出,通过文档共享信息可以使团队的工作效率提升55%。

文档不仅能让开发者的工作更轻松,而且可以使开发流程顺利进行。文档就像一张地图,指引你前进的方向和需要注意的事项。没有了文档,开发者就容易盲目行事,这可能导致代价高昂的错误。

ChatGPT支持创建如下类型的文档。

·用户手册。

·README文件。

·API文档。

·常见问题解答。

·故障诊断指南。

在创建有效的文档时,考虑以下因素至关重要。

了解文档的目标受众

思考一下文档的目标受众。他们是寻找快速入门指南的新手,还是需要API文档和代码片段等细节的资深技术人员?了解读者的需求是让文档的内容达到要求的关键。

保持简洁

避免使用难以理解的行话或技术术语。请保持言简意赅。如果普通人看不明白,文档可能就需要写得更清楚一些。

按计划行事

让文档看起来有条理。使用统一的风格、标题、字体等,一致性是关键,就像一首歌需要有好的节奏才能保持流畅。

展示而不只是讲述

实际的操作演示能加速人们对内容的理解。因此,请列举现实生活中的例子或场景。如果文档是面向开发者的,代码示例就更加宝贵了。对于其他人,截图或分步演示可能更有帮助。

一图胜千言

有时,使用图表、截图甚至视频来表达观点胜过千言万语,尤其是在处理复杂的问题时。

原因与方法同样重要

不仅要列出步骤,还要告诉读者为什么这样做。

综合考虑上述所有因素后,可以使用类似下面的提示来请求AI工具编写文档。

提示:请你就如何向非技术人员解释Git版本控制的概念提出建议。尽量简单明了,避免使用专业术语。另外,请使用直观的图或表来解释版本控制的重要性。

ChatGPT拥有强大的语言翻译能力,你可以将其运用于文档或任何其他内容。

微软为企业版文档开发了GitHub Copilot for Docs,它不是一款普通的文档挖掘工具。例如,它的搜索结果和回复基于用户的编程背景和经验。它还会根据GitHub代码仓库的最新情况进行更新。它甚至还能添加私人文档。本质上,它是一个高度复杂的知识库,可以极大地促进编程工作。

代码审查可以视为代码在被提交到代码库并创建拉取请求之前的一次试运行。这一过程旨在确保一切按预期工作,功能得到实现,并且在执行过程中不会出现故障。

代码审查的目的不只是寻找代码中的不规范之处和小错误;它还是一个团队成员聚集在一起交流意见、相互学习、共同提高的过程。在代码审查中,你可以发现不同的问题解决方法,这有助于你更好地理解整个项目。

同时,代码审查有助于执行组织的编码风格和标准,它在安全检查方面也扮演着重要角色。我们需要认识到,自动化工具可能无法捕捉到所有的安全隐患,有些隐蔽的安全风险需要人工审查才能发现。

ChatGPT也可以成为代码审查过程的一个重要部分。例如,你可以使用以下提示来请求执行代码审查。

提示:为下面的代码写一份代码审查报告。重点关注代码的可维护性、潜在的安全问题和性能缺陷。{代码}

即使我们故意给ChatGPT一个质量很差的函数,它的审查和评论也做得很好。它提出了许多改进建议,比如建议不要在函数中硬编码数据库连接。它还指出了在SQL查询中直接使用用户ID的问题:因为缺乏用户输入验证,所以存在SQL注入的风险。此外,它还发现了SQL语句结构可能导致的性能问题。

单元测试可以看作对代码的一小部分(比如几个函数或方法)进行的小型评估。开发者通常会利用一些高效的工具来进行单元测试,例如Java的JUnit、.NET的NUnit或Python的pytest。这些工具不仅帮助开发者编写和执行测试,而且提供测试结果反馈。它们通常还能与开发者正在使用的其他软件工具集成。

单元测试极大地减少了令人烦恼的错误,使后期的调整和问题修复变得更加容易,从而提高软件质量。每个单元测试都专注于一个具体的点,如果出现问题,开发者可以清楚地知道从何处着手。单元测试通常是自动化的,这意味着它们可以快速且频繁地执行,这对于保持软件的顺畅运行和最新状态至关重要。

由于单元测试专注于代码的一小部分,因此它们不会过于复杂且易于编写。此外,单元测试就像软件的使用指南,其他开发者可以通过查看单元测试来理解软件某些部分的工作流程。如果代码发生了变化,单元测试可以确保之前正常工作的部分没有被错误地修改。

假设你创建了一个计算小费的程序,代码如下。

def tip_calculator(bill_amount, tip_percentage):

    tip_amount = bill_amount * (tip_percentage / 100)

    total_amount = bill_amount + tip_amount

    return total_amount

bill_amount = float(input("Enter the bill amount: "))

tip_percentage = float(input("Enter the tip percentage (e.g., 20 for 20%): "))

total_amount = tip_calculator(bill_amount, tip_percentage)

print(f"Total amount including tip: {total_amount:.2f}")

这个程序包含一个函数,用于计算账单的总金额(包括小费),参数有两个——bill_amount(账单金额)和tip_percentage(小费百分比)。该函数将返回总金额total_amount。

对于上述代码,单元测试可以检查各种情况。单元测试可以验证该函数能否正确计算一系列输入的总金额(包括小费)。这一点至关重要,因为即使是很小的错误也可能导致较大的差异。单元测试可以覆盖典型的用例,比如标准账单金额和小费百分比,以及边缘情况,如账单金额为零或负值,或小费百分比异常高。单元测试还有助于确保该函数能够妥善处理非数值或空值等异常输入。

以下是一个提示范例。

提示:请为该程序提供单元测试建议,以正确计算总金额,并检查典型情况和边缘情况,如账单金额为零或负值,以及小费百分比异常高。还要检查无效输入。对于单元测试,可以使用控制台日志。

图9-1展示了ChatGPT为单元测试生成的代码。

图9-1 ChatGPT为单元测试生成的代码

如果想采用更有条理、更全面的方法,比如使用测试框架,则可以进一步请求ChatGPT提供帮助。

提示:使用测试框架创建单元测试。

ChatGPT建议使用unittest。它展示了如何设置和开发单元测试,并演示了如何执行单元测试。

或者,如果你已经有一个包含单元测试的文件,则可以评估该文件中的单元测试。以下是一个提示范例。

提示:下面是一个程序的单元测试文件,<解释其作用或指向的代码>。还有其他测试吗?这个单元测试文件还缺少什么?

虽然ChatGPT或AI辅助编程工具可以帮助开发者创建单元测试,但它们并非完美无缺。对于更高级的使用案例或更庞大的代码库,结果可能会有偏差。

David Lee,一位公司创始人、高级工程师兼AWS认证的解决方案架构师,给出了以下建议:

但是,在处理涉及真实数据库交互和Docker的测试时,情况就会发生很大变化。这将成为ChatGPT在某种程度上无法理解的另一个复杂层次,你可能需要先手动编写几个测试,尤其在数据库连接部分,这有助于让ChatGPT学会如何编写其他测试。

拉取请求(PR)在编程世界中就好比一张金色入场券,尤其当你与其他开发者合作时。你会将代码打包,推送到像GitHub或GitLab这样的平台上,随后提交一个PR。这不仅将发出一个“请添加我的代码”的请求,还意味着鼓励你的队友审查你的工作,给予认可或提出建议,帮助你的代码更上一层楼。PR确保了代码在被合并到项目的其他部分时,能够以最佳状态呈现。此外,PR还是追踪谁在何时做了何种更改的有效工具,对于大型项目,这一点尤其宝贵。

撰写一份清晰可靠的PR描述至关重要。你需要阐明代码发生了哪些变化、为何变化以及如何变化。首先概述要解决的问题,然后详细说明提交的代码是如何解决这些问题的。别忘了补充一些细节,例如哪些文件被修改或新增了哪些文件,以及进行了哪些测试。如果对某些具体问题不确定或需要他人的意见,也可以在PR描述中提出。

有效的PR描述是代码审查者的福音。它能够加快审查流程,确保所有相关人员都能迅速理解PR。此外,一份详尽的PR描述也是未来的重要信息资源。

ChatGPT可以成为我们撰写PR描述的得力助手。起草初稿时,只须告诉ChatGPT你所做的工作,它就能帮你梳理思路,抓住重点。如果你已经有了草稿,ChatGPT将检查其清晰度和语法,并提出改进建议。ChatGPT还能帮你找到撰写PR描述的最佳方法,比如先从摘要开始,再逐步深入细节。如果需要简化技术细节,ChatGPT则能让团队中的每个人都更容易理解PR。

以下是一些提示范例。

提示:我在应用程序中添加了一个新的搜索功能,旨在根据用户输入的内容过滤搜索结果。你能帮忙编写PR描述吗?

提示:我解决了当用户在文本字段中输入特殊字符时应用程序崩溃的问题。我应该如何在PR中对此进行描述?

提示:我重构了身份验证模块以提升代码的性能和可读性。在PR描述中应该包含哪些内容?

提示:我更新了用户界面,使导航更直观,并添加了新图标。你能帮我起草PR描述吗?

提示:在PR描述中表达这些内容的好方法是什么?

提示:我为付款处理模块添加了新的单元测试。你能协助我撰写一份突出变更的PR描述吗?

提示:我解决了由于主分支最近发生更改而引起的合并冲突。对此我应该在PR描述中如何提及?

微软在Copilot中添加了一个支持创建PR描述的功能,名为Generated Commit Message。要使用此功能,你需要确保你的Copilot与GitHub上的仓库建立了连接,然后只需要单击界面左侧面板中的Sparkle按钮即可,如图9-2所示。

图9-2 Copilot可以为加载到项目中的存储库创建PR描述

随后,Copilot就能写出有用的PR描述。

最后,许多初创公司正在基于LLM技术创建自己的拉取请求系统。其中What The Diff公司的联合创始人兼首席执行官Sebastian Schlein表示:

What The Diff主要有两个功能:其一,以通俗易懂的语言总结拉取请求,让代码审核人员更容易理解PR中的变更;其二,编写完全非技术性的摘要,并发送给其他利益相关者,例如没有GitHub访问权限的产品经理,这样可以让他们轻松了解拉取请求中的变更是否符合要求。

你一直坚持不懈地开发软件,终于迎来了软件正式发布的辉煌时刻。这是一个激动人心的时刻。你将目睹真正的用户如何使用你的软件,他们会告诉你哪些功能令人称赞,哪些地方需要改进,甚至还会提出许多宝贵的意见。对于开发者,用户的反馈无疑是一笔宝贵的财富。

如果你从事软件销售业务,软件的发布无疑是你期待已久的时刻,因为这意味着收益即将源源不断地涌入。

在部署软件的过程中,我们屏息凝神,期待着最佳结果的到来。其中总伴随着一种忐忑不安,担心某些环节可能不尽如人意。

在测试环境中表现完美的软件,一旦进入现实世界,面对不同的硬件配置、不稳定的网络环境或有问题的设置,就有可能变得不稳定。

安全性也是至关重要的。一旦软件上线,你就必须保持警觉,确保将恶意攻击者拒之门外,并严格遵守隐私法规。

此外,软件必须具备足够的韧性,以应对大量用户的访问。无论用户数量如何或业务规模多大,软件都必须保持快速和稳定。

整个CI/CD流程中的每个环节都是为了确保软件部署过程的流畅和自动化,从而减少错误。虽然听起来很理想,但实际上让软件运行得既快速又稳定,确实需要付出一定的努力。

在软件部署和发布方面,ChatGPT也能提供帮助,以下是一些提示范例。

提示:你能指导我创建一份供我的团队遵循的部署清单吗?

提示:关于使用Docker进行部署,有哪些优秀的入门学习资源?

提示:你能否提供Web应用程序中零宕机部署的最佳实践?

提示:我在部署软件的过程中遇到“服务器超时”错误。造成这种情况的常见原因和解决方案有哪些?

提示:你能帮我编写一个Bash脚本来自动部署Python Web应用程序吗?

提示:在生产环境中部署应用程序之前,我应该检查哪些基本配置?

提示:如何规划云环境下部署失败的回滚策略?

提示:在部署金融应用程序的过程中,应该考虑采用哪些安全措施?

提示:如何优化已部署的Node.js应用程序的性能?

虽然ChatGPT并不完美,但它在复杂的DevOps领域确实能给我们提供帮助。以下是Private Market Labs联合创始人兼首席产品官Titus Capilnean的一些见解:

云日志的处理确实有些复杂,尤其是对非开发工程师的我来说。但鉴于我们定期在AWS和Google Cloud上运行进程,我们必须学会处理它们。

有一次,我必须根据大规模函数部署的输出为SQS+Lambda进程设置追踪。函数原本会在日志中打印状态,我计划使用这些打印的状态生成该进程的报告,在我们的案例中,也就是交易的活跃性。我请求ChatGPT提供一个AWS CloudWatch查询脚本,并将其调整到只需要在每个进程运行结束时执行即可获得结果。如果想要通过详细阅读文档来完成这项任务,可能需要5~6小时,所以我选择了ChatGPT的方案,并节省了大量时间。

同样,我必须在Google Cloud中设置一些警报。我与ChatGPT合作创建了一个查询,排除了一些实际上我们并不负责,也不面向用户的系统级错误。ChatGPT不仅节省了我数小时的阅读和工作时间,还给我提供了为整个团队建立有用的警报系统所需的自定义指标。

用户反馈是确保软件成功的关键因素。当用户看到他们的意见受到重视并据此改进软件时,他们更有可能成为忠实用户,并对你的产品抱有积极态度。明智的做法是在问题初期就积极解决,而不是等到用户普遍不满时,才去处理。

尽管经过了全面的测试,但软件在现实世界中仍然可能暴露出一些隐蔽的错误。用户就像细心的侦探,他们能够发现那些可能被忽视的问题。

用户常常会以你意想不到的方式使用软件,他们的创新思维可能会激发你开发新功能的灵感,甚至催生出一款全新的软件产品。

提升客户服务的工具箱中包含Zendesk、Freshdesk、Drift和Salesforce等工具。这些工具可以方便你处理各种事务,无论是在实时与客户交流的即时聊天工具中,还是在收集用户反馈的表单中。自动工单系统可以跟踪客户问题,确保没有遗漏。同时,不要忘记客户关系管理系统,它可以将所有客户互动集中在一个地方。这些工具在提供高效、快速响应的客户服务方面发挥着重要作用。

在此基础上,生成式AI无疑能够带来额外的价值。它特别擅长处理非结构化数据,例如用户反馈。

假设你有一个包含大量电子邮件、即时消息和联系表单信息的文件,你可以使用以下提示来访问ChatGPT。

提示:识别共同的主题和类别,如可用性、性能、功能、错误和客户服务。同时对该文件进行情感分析,帮助确定哪些错误需要首先修复,或哪些功能值得考虑添加。基于这些信息,创建一份包含图表的报告。

ChatGPT还可以帮助我们起草回复。如果你正在处理用户反馈,它可以帮助你撰写更有效的回复——通过创建常见问题的回复模板。这样,在与用户或客户聊天时,你就能始终保持准确和专业。

也可以使用ChatGPT起草更具个性化的回复。复制并粘贴用户的电子邮件,然后使用如下提示。

提示:给用户写一封回复邮件,语气要平和、善解人意。确保回复友好,并在不使事态升级的情况下缓解用户的担忧。{电子邮件}

在某些情况下,你可以创建自己的基于LLM的应用程序来处理用户反馈。比如,Warp公司的一名开发者花了不到一周的时间就创建了Warp,这还是在他将一半时间投入其他工作的情况下。Warp是使用OpenAI API构建的。

Warp的产品经理Noah Zweben说:“这个应用程序带来了巨大的改变。以前,对收到的用户反馈进行分类和排序是一项艰巨的工作。生成式AI能够非常出色地完成这项工作。”

在ChatGPT成为万众瞩目的焦点之前,生成式AI就已经在营销等关键领域发挥显著作用了。Jasper公司便是其中的先驱之一。该公司的业务增长速度惊人。实事求是地说,生成式AI在迅速创作吸引人的创意内容方面确实有独到之处。

发布软件并不需要Jasper,ChatGPT就够了。你可以使用ChatGPT制定一些强有力的营销策略。参考以下提示范例。

提示:你创建了一个应用程序,旨在帮助用户规划健康膳食。它可以根据用户的饮食习惯、健康目标和营养需求制订个性化的膳食计划。它还可以生成购物清单、提供食谱建议并跟踪营养摄入情况。请为该应用程序制订营销计划。公司目前处于初创阶段,营销预算有限。

ChatGPT首先建议确定目标受众。它推荐的主力用户群体包括“注重健康的人群、健身爱好者、有特殊饮食需求的用户(如无麸质饮食者、素食者)、忙碌的职场人士等”。接着,ChatGPT介绍了多种营销策略,如利用社交媒体、内容营销、社区参与、电子邮件营销和建立合作伙伴关系等。

以下是其他一些有用的ChatGPT提示范例。

提示:撰写一封针对健身教练和健康顾问的有说服力的销售邮件,推广我们的健康规划应用程序。

提示:为一个新的健康规划应用程序构思一个易于记忆且能够传达健康理念的名称。

提示:编写Facebook和Instagram广告文案,宣传我们的健康规划应用程序,突出它的易用性和个性化功能。

提示:制定一个模板,请求健康规划应用程序的早期用户提供推荐信,以便在营销材料中使用。

提示:为健康规划应用程序的虚拟发布活动制作一份邀请函,详细说明议程和特邀嘉宾。

本章如同一部幕后纪录片,揭示了软件开发中不太引人注目的事情。诚然,开发新软件的过程充满激情与挑战,但正是调试、测试和文档编写这些日常却关键的环节,最终决定了软件的成败。本章深入探讨了ChatGPT等AI工具如何助力这些幕后工作,让它们变得更加高效。

尽管AI并非万能,但AI在处理海量数据、提供专业建议、撰写文档、发现潜在问题以及加速整个开发流程方面表现出色。有了AI的辅助,开发者得以将精力集中在那些最具挑战性的问题上。从错误修复到产品发布的每个环节,通过运用生成式AI和智能化策略,开发团队将能够打造出更优质的软件,真正满足用户的实际需求,同时大幅缩短开发周期。

目录
加书签
详情
加书架
打赏
投票
自动滚动
设置
夜间

评论 0条

加载中...

设置

阅读主题
正文字体
字体大小
18
页面宽度
滚动速度
5
语音朗读
翻页模式
💎

余额不足

您的水晶或能量余额不足,请充值后再试。

立即前往充值

🎫 投月票

1 张月票 = 1.00 水晶。感谢支持!

🎁 打赏作品

打赏将直接扣除水晶余额,鼓励作者创作。