前言
探讨了如何利用 ChatGPT 等AI工具帮助初级开发者成长为资深开发者,强调了提升编码技能、理解和应用 AI 工具的重要性。今日前端早读课文章由 @Matteo Baccan 分享,@飘飘翻译。
译文从这开始~~

ChatGPT 和其他 AI 工具已成为开发人员不可或缺的工具,但它们的真正潜力远不止于回答提示。这些工具如何帮助初级开发人员成长为高级开发人员?答案在于提示工程、理解大型语言模型的能力以及有效地利用它们。
ChatGPT 是如何工作的
ChatGPT 是一种会话式 AI,它处理自然语言以生成回复。它应用训练好的规则,而不能独立推理。这意味着优质的输入会产生优质的输出,而质量差的输入则会导致糟糕的结果。此外,其训练数据限制了它的知识范围,使其仅限于特定的时间段,因此对于新出现或小众的话题,它并不可靠。
有效利用 ChatGPT
1、理解代码
大型语言模型能够分析不熟悉的代码,这使得开发人员 —— 尤其是初级开发人员 —— 更容易理解和修改代码。例如,让 ChatGPT 解释一个函数通常会得到清晰的分解说明。
2、代码的建议
像 GitHub Copilot 这样的工具在代码上下文理解方面表现出色,能够分析你的编辑器和代码库,从而提供相关的建议。这些工具在针对性方面超越了通用的大语言模型。
3、编写测试
测试创建是一项需要时间才能掌握的关键技能。大型语言模型(LLMs)能够生成初始测试用例,节省时间并确保更好的代码覆盖率。
4、提高安全
ChatGPT 能够识别潜在的漏洞并提出改进建议,例如添加参数验证或空值检查。
5、重构代码
来自大型语言模型的重构建议能够提高代码的可读性和可维护性。虽然这些重构建议并不总是针对性能进行优化,但它们通常能提供更清晰的结构。
6、生成模版代码
启动新项目或新功能时,通常会涉及一些重复性任务。ChatGPT 可以根据你的需求生成样模版代码,从而减少设置时间。
7、添加注释
大型语言模型(LLMs)能够自动为你的代码添加详细的注释,使其更易于理解和维护,特别是对于那些没有文档记录或遗留的系统而言。
8、代码评审
像 ChatGPT 代码审查者这样的 GitHub Actions 可以自动审查拉取请求,提供可操作的见解并提高贡献的质量。
9、文档编制与翻译
LLM 驱动的工具简化了文档编写,甚至能自动翻译,让团队间的协作变得无缝衔接。
大型语言模型并非为解决问题或猜谜语而设计
大型语言模型(LLMs)是为回答问题、撰写文章和生成代码而构建的,而不是为解决难题或谜题。如果你向 LLM 提出一个未解决的问题,它将无法解决。然而,如果你提供一个已解决的问题,该模型能够解释或重现解决方案。
看着有人给 ChatGPT 出一道谜语,然后对它没能解开感到惊讶,这就好比让一个 5 岁的孩子去解决量子物理学的问题 —— 这样的测试忽视了该工具的设计和能力。这并不能证明模型有缺陷,反而凸显了用户对其使用方法的误解。
知识局限性
大型语言模型的知识是有限的,仅限于其训练数据集中的内容。如果你询问的数据集未涵盖的主题,该模型无法给出准确的答案。
这种限制何时变得明显?
当询问有关在模型训练阶段尚不存在或新出现的产品、技术或事件时。
虽然诸如实时网络查询和持续训练之类的缓解措施正在出现,但这些只是部分解决方案。模型仍可能就近期发展生成质量低劣或捏造的回复。
对于新发布的产品、技术或近期发生的事件,不要指望从 ChatGPT 那里得到可靠的答案。
成果提升之处
一些模型,比如 GitHub Copilot,通过利用额外的上下文信息超越了仅依赖提示的大型语言模型,例如分析光标周围的代码、打开的文件以及关联的 GitHub 仓库。这种更广泛的上下文使得 Copilot 能够提供更准确和相关的建议。
上下文代码提示
给定以下代码:
public static final int UNO = 1;
public static final int DUE = 2;
// Other static variables
public static void main(String[] args) {
// Find a match for the parameter in the static values
}
这个含糊不清的评论用 ChatGPT 是无法得出有用的结果的。然而,Copilot 能够推断出其目的并给出完整的实现建议:
int parametro = Integer.parseInt(args[0]);
switch (parametro) {
case UNO:
System.out.println("UNO");
break;
case DUE:
System.out.println("DUE");
break;
// Other cases
default:
System.out.println("No match");
}
尽管逻辑很简单,但关键在于 Copilot 能够在输入极少的情况下生成符合上下文的解决方案。
【图书】零基础开发AI Agent:手把手教你用扣子做智能体
代码理解与上下文关联
分析不熟悉的代码可能会让人望而却步,尤其是对于初级开发人员或者在自己不熟悉的领域探索时。大型语言模型通过解释代码的作用和工作原理来提供帮助。
例如,给定以下函数:
public static boolean matchesURI(URI uri1, URI uri2) {
String scheme = uri1.getScheme();
if (scheme.equalsIgnoreCase(uri2.getScheme())) {
if (uri1.
getHost().equalsIgnoreCase(uri2.getHost())) {
int thisPort = HttpClient.normalizePort(scheme, uri1.getPort());
int thatPort = HttpClient.normalizePort(scheme, uri2.getPort());
if (thisPort == thatPort) {
return uri2.getPath().startsWith(uri1.getPath());
}
}
}
return false;
}
当被要求描述其功能时,一个大型语言模型可能会这样回答:
这段简洁的解释有助于开发人员理解复杂或文档不完善的代码。
测试的创建
编写测试可能颇具挑战性,尤其是对于初级开发人员而言。大型语言模型(LLM)能够为一个函数生成测试用例,为全面的测试提供基础。例如:
@Test
public void testMatchingURIs() {
URI uri1 = new URI("http://example.com/path");
URI uri2 = new URI("http://example.com/path/subpath");
assertTrue(URIMatcher.matchesURI(uri1, uri2));
}
@Test
public void testNonMatchingScheme() {
URI uri1 = new URI("http://example.com/path");
URI uri2 = new URI("https://example.com/path");
assertFalse(URIMatcher.matchesURI(uri1, uri2));
}
为清晰而重构
大型语言模型还可以帮助重构代码,以提高其可读性和可维护性:
原始代码:
if (uri1.getHost().equalsIgnoreCase(uri2.getHost())) {
if (port1 == port2) {
if (path2.startsWith(path1)) {
return true;
}
}
}
return false;
重构:
if (!uri1.getHost().equalsIgnoreCase(uri2.getHost())) return false;
if (port1 != port2) return false;
return path2.startsWith(path1);
尽管逻辑保持不变,但重构后的版本更易于阅读和调试。
编写有效的提示语
有效使用大型语言模型的关键在于精心设计清晰准确的提示。但这到底意味着什么呢?编写一个好的提示需要明确告知模型你的期望以及你想要的结果。
以下是一些基本但至关重要的准则:
表达要清晰简洁。
要具体。
包含上下文和必要的细节。
明确输入和输出的预期。
当应用于编程时,这些原则看似简单明了,但为软件项目制定清晰、具体且简洁的指令颇具挑战性,这需要具备最佳实践的经验。项目越复杂,就越难将其提炼成一个定义明确的指令。
现实世界的挑战
你是否曾遇到过项目需求随时间变化、表述不清或缺少必要细节的情况?或者在没有完全理解客户期望的情况下编写代码?在这种情况下,让语言模型准确交付客户想要的东西几乎是不可能的。
什么样的提示才算好提示?
一个过于庞大且细节过多的提示是不切实际的,但太短或太模糊的提示也无法得到预期的结果。解决办法是精心设计这样的提示:
一个清晰且明确的提示
编写一个 C#
函数来计算给定数字的阶乘。
此提示规定:
这样的提示能让模型生成准确且有效的回复。
环境问题
大型语言模型依靠上下文来提高结果质量。例如,输入其他程序员常遇到的问题,能增加获得良好解决方案的几率。然而,对于高度特定或小众的问题,即便提供了足够的细节,模型也可能难以应对。
在这种情况下,像 GitHub Copilot 这样能够分析周围代码并提供量身定制建议的工具可能会更合适。
注释的代码
你有多少次编写代码时没有添加注释?或者不得不为别人的代码添加注释,但却难以理解?
大型语言模型可以通过从类似这样的通用提示开始来帮助生成评论:
在以下代码中添加注释:
例如,给定以下代码:
private String readFile(String fileName) {
BufferedReader br;
try {
br = new BufferedReader(new FileReader(fileName));
final StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
br.close();
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
一个大型语言模型(LLM)可能会生成以下详细注释:
/**
* Reads the content of a file and returns it as a string.
* @param fileName The name of the file to read.
* @return The file content as a string, or an empty string if an error occurs.
*/
private String readFile(String fileName) {
BufferedReader br;
try {
// Initialize a BufferedReader to read the file.
br = new BufferedReader(new FileReader(fileName));
// Create a StringBuilder to construct the file content.
final StringBuilder sb = new StringBuilder();
// Read the first line of the file.
String line =
br.readLine();
// Continue reading until there are no more lines.
while (line != null) {
// Add the current line to the StringBuilder.
sb.append(line);
// Add a system-specific line separator.
sb.append(System.lineSeparator());
// Read the next line.
line = br.readLine();
}
// Close the BufferedReader.
br.close();
// Return the file content as a string.
return sb.toString();
} catch (IOException e) {
// Handle any I/O errors.
e.printStackTrace();
}
// Return an empty string if an error occurs.
return "";
}
这个过程将无结构、未记录的代码转变为更清晰、更易于维护的代码。即使对于简单的示例,大型语言模型也能在提高代码可读性和帮助开发人员管理不熟悉的代码库方面发挥重要作用。
【早阅】Figma MCP Server:专为 AI 编码工具设计的服务器
翻译
程序员可能会面临的最令人烦恼的任务之一就是将项目文档翻译成另一种语言。这是一项枯燥的工作,需要投入时间和精力,但这是为了让那些不懂我们语言的人也能理解项目所必需的。
几年来,我一直以 Markdown 格式生成我所需的所有材料。Markdown 是一种轻量级的写作格式,它能让你轻松快速地创建文档,而无需过多担心格式问题。
这种方法让我能够更快地编写文档,并且可以使用像 Marp 这样的工具快速从中提取幻灯片。此外,它还非常容易追踪不同文档版本之间的差异,查看随着时间的推移发生了哪些变化。
几个月前,我发现自己需要将一个项目的文档翻译成英语。手动操作的话,就是把文本复制粘贴到语言模型中然后再复制回来,这既繁琐又耗时,还特别耗费精力。
我正准备自己编写一个程序,这时我发现 GitHub 上有扩展程序可以使用简单的操作来自动翻译文档。我指的是 GTP-Translate:https://github.com/3ru/gpt-translate 。
我确信还有其他类似的扩展程序,但这个扩展程序与我管理的项目生命周期完美融合,并且有助于加快文档翻译流程。
通过一个简单的议题,你可以激活 GTP 翻译操作,并指定要翻译的 Markdown 文档以及目标语言。结果会是一个包含翻译后文档的拉取请求,可供审核和批准。
结论
在使用大型语言模型(LLM)时,重要的是要明白它并非能解决所有问题的魔法棒。相反,它是一种工具,能够帮助加快工作进度并提升代码质量。期望仅通过编写提示就能神奇地将你的想法转化为完美定制的代码是不切实际的。
同样,认为单个 AI 工具能够解决所有问题也是一种误解,至少目前是这样。
对于程序员来说,接触大型语言模型(LLM)的最佳方式是了解其局限性,并识别出能够成功运用它的场景。开始在脑海中对这些场景进行分类,并将每个场景与能够有效运用的技术或工具联系起来。
同样,将整个项目浓缩在一个提示中也是不可想象的。将项目分解成各个部分,并让模型分别处理这些单独的组件,这样能取得更佳、更精准的结果,这种方法要有效得多。
即使在模型无法生成代码的情况下,它也有可能进行文档编写、注释、翻译或执行许多其他任务,从而加快我们的工作进度。
我们尚未达到这些工具能够完全自动化的程度,但懂得如何使用它们的程序员能够取得出色成果,并提升工作质量。
【第3457期】揭秘!如何将动效描述自动转化为动效代码
提升自身素质意味着要变得更高效,逐渐摆脱 “新手” 的标签,戴上资深程序员那顶沉甸甸且已被磨得发亮的帽子。
关于本文
译者:@飘飘
作者:@Matteo Baccan
原文:https://www.codemotion.com/magazine/ai-ml/from-junior-to-senior-developer-with-chatgpt/

这期前端早读课
对你有帮助,帮” 赞 “一下,
期待下一期,帮” 在看” 一下 。