ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

用ChatGPT练编程:从提问到决策,把AI变成你的私人教练

用ChatGPT练编程:从提问到决策,把AI变成你的私人教练 我见过太多人把ChatGPT用成了“超级答题机”复制需求回车拿到一坨代码粘贴进编辑器跑不通就重新生成一遍跑通了就以为“任务完成”。但这种用法有个致命问题——你练到的是复制粘贴不是编程。编程能力的核心是建立心理模型数据怎么流动、调用顺序怎样、异步边界在哪、异常路径如何兜底。而AI直接给你最终答案这些模型就被架空了。说得难听点你在健身房请了个教练结果所有杠铃都是教练替你举。你看着杠铃一次次起来觉得自己练了肌肉其实一点没长。这篇文章我想把两种用法掰开揉碎讲清楚一种是让ChatGPT替你干活另一种是让ChatGPT逼你思考。我自己踩了半年坑才彻底想明白这件事。如果你也想借助ChatGPT真正提升编程水平而不是只收获一堆跑完就忘的片段下面这些内容应该对你有用。1. 认知关ChatGPT是放大器不是外挂先说结论ChatGPT在编程学习中的价值取决于你有没有把它放在“反馈回路”里。放在回路之外它是个外挂用完就丢放在回路之内它是个放大器把你原有的思考过程成倍放大。1.1 “代写模式”为什么越用越菜自动补全时代就有过类似争论IDE帮你补全方法名会不会让人变蠢事实证明不会因为补全的粒度很小你仍然在持续做决策——这个名字合不合适参数传什么返回值的类型是否符合预期。但ChatGPT不一样它直接生成整个函数体、整个模块甚至整个项目骨架。你在一次操作里跳过了几十个关键决策点函数要不要拆、参数怎么设计、错误在哪一层处理、性能瓶颈怎么考虑。这些决策点是编程技能的真正载体而代写模式把它们全部绕开了。我一个朋友就是活例子。他每天用ChatGPT刷 LeetCode 风格的小项目三个月后跟我说“我怎么感觉写代码越来越虚”。我让他不打开任何对话窗口徒手写一个简单的登录接口他对着空文件发了二十分钟呆。不是不会写是不知道从哪里开始想。这就是因为过去的三个月里每次“开始想”的动作都被AI跳过了。人的大脑是很懒的既然有人替你想它就不想了久而久之那条神经通路就萎缩了。1.2 从“要答案”切换到“要决策点”正确的用法是主动把决策点要回来。我的习惯是给ChatGPT加一条限制“不要替我选只把选项和代价列出来最终决定我来做。”举个例子。你让它实现“读取一个配置文件并解析”它多半会直接给你用json.load或toml.load的完整代码。但更值钱的问法是这段功能涉及哪几个设计决策比如“文件不存在怎么办”“格式错误要不要抛出”“配置项有没有默认值”“解析结果要不要缓存”。请把决策点列成选项清单分别说明开销和风险先不要给我写代码。你会发现当AI把决策点摆在你面前时你不得不开始思考我的场景到底需不需要容错用户改了配置要不要热加载这些问题一旦进入你的脑子你就在编程了而不是在看AI编程。这一招也直接治“拿到代码就粘贴”的手痒。因为AI给你的不是可以立刻运行的成品而是你需要回答的一张问卷。你答完问卷代码自然就在你脑子里成形了再让AI帮你校验细节就好。1.3 给自己定一个“学习型使用KPI”很多朋友问我怎么评估自己有没有在进步。我的建议很简单设一个硬指标——每周至少一次完全不看ChatGPT的历史对话徒手重写本周用AI辅助做过的某个功能。重写得出来说明这东西变成了你的重写不出来说明它只是AI的。另外还可以给自己定一个输出比例你与ChatGPT的对话中至少有一半的回合是你自己在复述、解释、总结而不是光看它输出。如果你发现自己连续三轮只是回复“嗯嗯”“继续”“再给个版本”那基本可以断定你在划水。这个KPI听起来笨拙但它会倒逼你改变提问方式因为你得保证自己有话说就得分段消化、边问边想。2. 提示词三板斧把AI从“答案机器”变成“私人教练”很多人问提示词到底怎么写。我的体验是不需要记什么花哨的模板真正高频、高价值的其实就三招追问式、费曼式、评审式。2.1 追问式提示词让它先问你而不是先答你这个模式适合用来“啃”一个新概念比如你刚接触异步编程、装饰器、闭包。别说“请解释一下什么是装饰器”而是发这样一段话“我是一个会写普通Python、但对装饰器没有概念的学习者。请先不要直接解释。给我出一道体验题让我先写一个最简单的函数然后引导我观察如果我想在调用它之前自动打日志能有哪些笨办法等我回答完再逐步揭示装饰器的思路。”这种问法最大的好处是逼你先动用自己的已有知识去推测答案。认知科学里管这叫“预激活”你先猜过一遍再看到正确答案时记忆锚点完全不一样。我实测过很多次用追问式学一个概念比直接读十篇教程都记得牢。当然这么问会比较耗时间而且一开始会很不适应因为你得自己组织语言、写猜测、甚至写错误代码。但请相信我这段“难受”的思考恰恰是你编程水平增长的地方。2.2 费曼式提示词用类比讲原理再用题目验收费曼学习法的核心是“如果你不能简单地把它讲明白你就是没懂”。ChatGPT特别适合陪练这件事。我常用的提示词是“请用大白话和生活中的类比解释[概念]不要堆术语。讲完以后给我出一道三道题的小测验我在回复里作答你来批改。如果我答错不要直接讲答案继续用Socratic方式提问引导我修正。”这个方法治一种常见病看了半天文档觉得“懂了”但AI一问就露馅。比如它问你“事件循环和普通函数栈的区别如果用餐厅叫号来类比你会怎么解释”你要能当场编出来才算真的理解。对话式批改比看教程后的课后题好使多了因为它会根据你的错误顺着往下挖挖到你思维的裂缝为止。2.3 评审式提示词让AI做Code Review而不是做代笔这招最适合提升代码质量。很多人的习惯是“我写不好让AI帮我写”我建议反过来“我写得不好让AI告诉我哪里不好。”具体操作是把你写好的代码发给ChatGPT然后说“请用一位资深工程师做Code Review的口吻按‘严重问题—一般问题—风格问题’三个等级列出问题清单。每条问题说清楚三件事为什么是问题、在什么场景下会暴雷、最低成本的修法方向。先不要直接给我修改后的完整代码。”这个过程会很难受因为AI会毫不留情地指出你的边界条件漏了、命名一塌糊涂、异常处理全裸奔。但这种难受就是成长。你收到“修改后的代码”很爽学到的是AI的风格你收到“问题清单”很烦学到的是判断力。判断力是带得走的风格是带不走的。一个小提示评审式提示词不需要把它当作万能金句拿来即用。你可以换着说法比如“假如你是团队里最挑剔的代码评审人你会怎么喷这段代码”“请从性能和可读性两个维度分别打分并说明扣分项”。关键是每次都让它先给诊断后给处方。3. 实例拆解用ChatGPT彻底吃透一段异步代码光讲方法论不过瘾我拿一个真实学习场景完整拆一遍。去年我刚开始系统补异步编程普通Python写得很溜但一碰到async/await就发怵。我选了下面这段脚本当突破口import asyncio async def fetch_data(url): print(f开始请求: {url}) await asyncio.sleep(1) return f返回结果: {url} async def main(): tasks [fetch_data(fhttps://api.example.com/item/{i}) for i in range(5)] results await asyncio.gather(*tasks) print(\n.join(results)) asyncio.run(main())代码很短但里面塞满了我不懂的东西协程到底什么时候开始执行await asyncio.sleep(1)是在等还是让出gather和直接 for 循环调用有什么区别3.1 第一轮让AI当“翻译”逐行讲人话我发的第一条提示词是“这段代码我每一行的单词都认识但整体不明白。请逐行用大白话解释不要用术语堆术语。尤其讲清楚一个async函数被调用时到底是立刻执行还是返回一个协程对象‘挂起’是什么意思”AI给出的解释里“事件循环”“挂起”“协程对象”“任务”这些概念都带出来了。但我不满足接着追问了一个更生活化的问题“你刚才说事件循环它和普通函数栈的区别到底是什么用餐厅服务员的类比讲一遍。”AI的类比大致是普通函数栈相当于一个服务员按顺序一桌一桌服务菜不齐他也要干等事件循环则是那个负责人只负责把订单丢给后厨然后就跑去服务下一桌等后厨喊“某桌好了”再回来上菜。这个类比一下子帮我把“await是让出控制权”这个抽象概念落地了。听完之后我又自己复述了一遍原来await asyncio.sleep(1)不是白白等一秒而是告诉事件循环“这一秒我没事干你先去忙别的”。3.2 第二轮请它模拟执行轨迹第一轮只是纸上谈兵第二轮我让AI把执行轨迹写出来“请从事件循环的角度模拟这段代码从启动到结束的详细执行顺序。每一步都要说清楚当前在哪个协程里tasks里有多少个任务在等待谁被挂起谁恢复了。用文字步骤列出来不要画图。”AI输出了一个我以为很简单、实际信息量巨大的轨迹main()执行到列表推导式时5个fetch_data(...)并不会真的发请求它们只是创建了5个协程对象直到asyncio.gather把它们包成任务事件循环才开始调度调度后5个请求依次打出“开始请求”然后集体在await asyncio.sleep(1)处挂起一秒后它们依次恢复把返回值塞进 results 列表。整个过程事件循环在5个任务之间来回切换而不是老老实实等第一个完成再跑第二个。这个小练习直接颠覆了我之前的错误印象——我一直以为async函数调用时会先跑一段没想到在gather之前它们根本不会执行任何代码。这个错误认知如果不是让AI模拟轨迹我可能一直带着它写代码到时候排错能排一天。3.3 第三轮改代码与异常追问前两轮是理解别人的代码第三轮得自己动手。我给自己加了个变体需求如果其中一个URL会抛异常gather默认行为是什么我想让失败的请求不影响其他任务应该怎么办我先自己猜然后把方案发给AI校验。AI提示可以用return_exceptionsTrue并解释了默认模式下异常会直接抛出导致其他任务结果丢失的原理。它不是直接把改好的代码甩给我而是让我先试着把参数加上再解释为什么加了参数就不会抛。这一步其实是在训练我“遇到并发任务第一反应考虑异常传播边界”的意识。这三轮对话加起来不到半小时但比我看三篇异步编程教程都有用。因为我在每个环节都被逼着做了输出输出类比、输出执行轨迹的理解、输出修改方案。如果你也想复现这个过程建议拿一段你自己最没把握的读不懂代码重复上述三轮效果比我替你想好一百倍。额外让AI给你出5道判断题检验一下更容易发现自己是不是真的踩实了。4. 从找Bug到审代码调试能力如何被ChatGPT撑大很多人误以为调试能力只能靠“死磕”练出来。其实死磕练的是耐心而方法论可以靠AI快速补齐。ChatGPT在调试场景中最好的用法是帮你翻译报错、梳理排查优先级而不是替你改完。4.1 报错提问模板给足上下文不给模糊问题我见过太多人一报错就问“这个报错怎么回事”然后把一串代码丢过去。ChatGPT不是算命先生它看不到你的运行环境、变量值、你尝试过的步骤。有效的报错提问模板是这样的“下面是我的代码片段和使用Python 3.12 某2.0.1库的运行时报错。我已经尝试过方案A和方法B都没解决。请按可能性从高到低列出排查方向每一条给出判断方法和快速验证手段。先不要直接给我改好后的代码。”关键点在于“我已经尝试过A和B”。这句话会强迫你自己先做过初步排查而排查本身就是调试能力的一部分。AI的价值在于把你的排查方向列表变宽而不是替你做最基础的那一步。实际用下来AI在报错领域最有用的输出往往是“请你检查这几个容易被忽略的前提条件”比如编码问题、依赖版本冲突、路径分隔符差异。这些方向往往是你百度不到的因为搜索引擎里全是千篇一律的答案而AI可以结合你的上下文去猜。4.2 橡皮鸭调试的反向用法传统橡皮鸭调试法是“把代码讲给一只鸭子听”讲着讲着自己就发现Bug了。ChatGPT让这只鸭子变成了“挑剔的会插嘴的鸭子”。我常用一个反向用法“我把这段函数的设计意图逐段讲给你听你在听到逻辑可疑处随时打断我质问我‘这里有漏洞’或‘这个假设不成立’。每一段你都要确认我的表述是否和代码实际行为一致。”这个方法强在逼你组织语言。当你想把代码“说”清楚时你不得不面对自己写代码时的模糊地带。比如你嘴上说“这里拿到用户输入后做校验”但代码里根本没有校验AI一质疑你就发现自己的意图和实现脱节了。这个过程非常像结对编程中的“边说边查”但成本低得多而且它不会因为尴尬而跳过质疑。4.3 别把配置型报错当成代码问题编程学习里最消耗意志力的事情之一是带着“我要用AI学编程”的新鲜劲儿结果一开局就被工具本身的配置问题卡了一整天。我见过不少新手朋友在客户端里看到一个“配置文件某字段有问题导致会话无法继续”的提示然后一脸懵地反复打开新对话一遍遍问AI“这是为什么”。其实AI根本帮不了你——问题出在本地工具的配置上比如配置文件里把某个模型标识写成了一个当前客户端不认识的名字或者版本对不上。我的处理原则是任何报错先把报错信息里提到的文件名、字段名、版本号抄下来打开那个文件用肉眼核对一遍再考虑要不要问AI。工具层面的配置问题正确解法是查官方文档、改配置、重启进程而不是把它当作编程问题反复和AI纠缠。保护好你的学习注意力比修复这些工具错误本身重要得多。5. 跨领域速成用ChatGPT入门一门新语言或新框架不少人在博客后台留言问我我是搞PLC的最近想试试触摸屏编程我主要写C语言想入门一下ROS2编程我一直用Matlab想学OpenCV。这些跨度极大的提问其实都有一个共同痛点——不知道怎么迈出第一步。5.1 先画学习地图让AI把未知拆成已知面对一个陌生领域最可怕的不是学不会而是“不知道自己不知道什么”。大部分人的第一反应是去搜教程搜出来的目录又长又泛看完更焦虑。我现在的流程是先让ChatGPT帮我画一张“学习地图”“我想从零入门[某框架/某语言]。请不要给我完整教程先回答我三个问题第一这个框架的核心抽象是什么最少必须理解哪三个概念第二哪些我目前已有的技能可以迁移过来第三如果只做一个迷你项目就能跑通全流程这个项目应该是什么最后根据以上内容给我一条3周路线每天1小时的那种。”以ROS2为例AI大概率会告诉你核心抽象是节点、话题和服务迁移技能是C/Python基础、回调函数概念迷你项目可以是“两个节点一个发布字符串一个订阅字符串”。这条路线看起来稀松平常但它能把你从“面对一个庞大生态不知从何下手”的状态里拉出来。哪怕AI给的术语表不够精确也比你自己在搜索引擎里大海捞针强十倍。5.2 项目制学习让AI出题你来实现AI验收学新框架最忌讳的是一口气读完官方文档再动手。我常用的策略是反过来让AI给我出一个小项目题我读文档读到能交作业为止。“我现在刚开始学[某框架]给我设计一个小作业要求只用这个框架的核心功能不要涉及周边生态。作业要包含可验收的测试标准比如‘程序启动后能在日志中看到什么’‘输入某个文件后输出什么’。不要直接给我代码。”我之前用这套流程学过一个轻量级自动化工具AI给我布置的作业是“写一个脚本读取目录下所有txt统计词频把结果写到新文件并且用命令行参数控制输入输出路径”。听起来很简单但真轮到自己写时才发现连“怎么组织入口函数”“异常要不要管”都得思考。AI验收时的反馈又会逼着我回到文档里查API签名、查参数默认值。这套“AI出题—我编码—AI验收”的循环比任何网课都更贴近真实开发的节奏。5.3 新语言语法是不是问题用AI学新语言的语法我有个特别顺手的方法把它当成“语法对照翻译器”。比如我会直接问“我在Java里习惯写 [某段代码]在Python里对应的惯用写法是什么不要给我一个平庸的直译我想知道Python社区推荐的写法并解释两种语言设计哲学上的差异。”这种问题带来的收获远超语法对照表因为你顺便理解了设计哲学。比如Java程序员问“Python里为什么用缩进表示作用域”AI会从代码整洁、强制规范的角度解释而Python程序员问“Go里为什么没有类只有结构体”AI会从组合优先于继承的角度展开。这类对话能让你在跨语言时少带偏见进步更快。6. 那些AI编程绕不开的坑幻觉、过时与依赖惯性最后必须讲点败兴的东西。ChatGPT确实很强但不代表它没有坑有些坑是每个用AI编程的人迟早都会踩的。6.1 幻觉它真的会一本正经地骗你AI在生成代码时最危险的行为是给你一个看起来非常合理、实际上根本不存在的库函数或API签名。尤其是某些小众库、新版本API、老版本遗留写法它完全可能凭记忆“编”一个出来还一本正经地配上参数说明。我上过当也见过别人上大当——把AI生成的代码往生产环境里丢结果编译过了但运行行为完全不对查了半天才发现是调用了不存在的特性。应对幻觉的唯一方法是交叉验证。拿到AI给的代码或API用法先去官方文档、项目仓库或者本地环境跑一个最小示例确认一遍。我的习惯是要求AI在每次给出代码前先列出依赖清单和版本假设比如“这段代码基于某库2.x需要Python3.10”然后再针对清单逐项核对。6.2 过时API别拿旧知识写新代码ChatGPT的知识有截止日期而且它对“最新版本”的把握并不稳定。你问它某个框架的当前推荐写法它可能给你一套两三年前的方案旧方案在旧版本上没毛病但新版本里已经被废弃或替换。我的处理方式是不问“最新版怎么做”而是带上具体版本号去问“我正在用X框架的3.x版本想实现Y功能官方推荐方案是什么请顺带告诉我哪些旧写法在这个版本里已经不推荐了。”这样AI给出的答案即使不够“新”也会更符合你的实际环境。更重要的是你要把官方文档当作最终裁判AI的意见只能当参考。6.3 依赖惯性警惕“离开AI就不会写”这是最让我警觉的坑。连续用AI编码几周后你可能会发现自己写代码时总想“先问一下AI的意见”哪怕只是一段早就烂熟于心的for循环。这就是依赖惯性在形成。我的戒断方法是“先自己写完再让AI点评”。任何需求第一版代码绝不打开ChatGPT不管写得多么粗糙、漏洞多少先靠自己完成一个可运行的版本然后才允许AI介入做评审和优化。这样做有两个好处一是编程的思考过程保住了二是AI评审时你听得懂它在说什么。如果先问AI你大概率会逐渐失去对“自己写的代码”的理解能力。每周我还会专门设一天“无AI日”——至少一个功能完全不用AI辅助课堂作业、日常练习都可以。不夸张地说这一天写的代码比其余六天的学习收获加起来都多。6.4 给ChatGPT编程学习一个准确定位说到底ChatGPT更像我工具箱里的一块磨刀石不是一把切菜刀。切菜的是我磨刀石负责让刀更快。你心里越清楚自己要磨哪一面刀刃——是理解异步原理、是提升调试路径、是补齐语言盲区它的作用就越大你越没方向它给你再多代码也只是一个自动生成的文件夹关掉就没了。我见过最成功的AI辅助学习方式是把每一次对话当成“一次聚焦的结对编程课”先明确自己要练什么再让AI引导思考、批改输出、给出反馈最后自己独立重写一遍。这个循环里每一步的主角都是你而非AI。最后分享一个小技巧也是我到现在还在用的我会把自己和ChatGPT高质量的对话记录按照主题存档比如“异步编程启发式对话”“某框架API踩坑复盘”。过两三个月再翻出来看往往能发现当时的理解已经跟不上现在的水平了——这种感觉比AI给你一个100%正确的答案更让人上瘾。
返回列表