人工智能的出现对于不是程序员的人来说是个巨大的福音,以前他们有心无力的事情现在有了希望。不过,指望拥有了人工智能之后就能在 3 周之内完全掌握编程,仍然是不可能的事。但是,人工智能也会不断进化,所以,对于任何有创意抱负的人来说,这是一个巨大的机会。
上个月,我推出了一门课程,其想法是教大家如何在一个月的时间内用 ChatGPT 辅助编程,做出一个 GPT-4 聊天机器人。
人工智能这个话题现在很热,我关于这方面的文章也写得不错。但我觉得我还有些真正重要的事情要做。因此,我对这门课程抱有很高的期望。但我对后来收获的反应程度完全没有准备。
我们在第一个小时内就收到了少量注册。但在接下来的几天里——注册的人数犹如涓涓细流。注册的学生数先是 5 人,然后增加到 10 人,再到 25 人。
到第 80 名学生时,我们关闭了注册。我们向买不起课程的学生发放了 20 份奖学金,我开始准备教书。我对没人来的恐惧又被另一件事给取代了:有人会喜欢吗?更重要的是,他们真的能学到东西吗?这会有价值吗?
在过去这一个月里,我非常荣幸地看到有将近 100 人开始用人工智能来做开发。有很多令人惊叹的时刻——比如当学生们在一开始的课程中让自己的第一个聊天机器人跑起来的时刻,或者当他们突然理解了一个他们老是听到但不甚了了的人工智能术语的时候,比如“嵌入”( embedding)。这一路上也有一些波折和跌倒——事实证明,人工智能在编程方面仍然不可靠,作为一名讲师,我自己在讲课方法上也还存在可以改进的地方。
不过像这样的课程有一个非常大的好处,那就是如果做得对的话,你跟学生的收获会一样多。这个月对我来说肯定是这样的。能够帮助这么多人开始用人工智能做开发是一件非常令人愉快的事情。
以下就是我学到的一些东西。
我做这门课程的时候的想法是,人工智能就像视频游戏作弊代码,可以提高创造力,可以让技术水平不高的人变成能够突然将自己的想法变为现实的开发者。他们所需要的只是推一把。
我现在更加坚信这一点。我看到参加这门课程的人只具备了一些基本的技术技能,然后马上就可以收获“哇噢时刻”,这些时刻激发了他们的创造力和自主性。在第一堂课上,每个人都做出了一个基本的对话式聊天机器人,就像下面这样:
在课程开始时,我演示了这个机器人,并逐步通过示例代码来解释它是如何工作的。然后我用 ChatGPT 从头开始对机器人进行实时编码,这样学生们就可以看到如何正确输出提示,以得到他们需要的代码。接着我就让他们自己发挥,用 ChatGPT 来编写他们自己的机器人。这么做是有风险的——这个班的学员编程技能水平参差不齐。但对他们当中的相当一部分人来说,这成为了他们的一个重要时刻。大家都对人工智能的编程水平感到震惊,说感觉就像作弊一样。
第一次用人工智能编程的感觉就是这样。这有点像《黑客帝国》里面的那一刻,就是墨菲斯(Morpheus) 把武术技能下载到尼奥(Neo)大脑的那一刻。 尼奥一觉醒来,突然就会功夫了。
通过人工智能让大家开始产生自己是创意主体的那种感觉很棒,因为确实如此。他们突然意识到,如果能够用人工智能来支持自己的工作流,那么他们可以做的事情比他们想象的要多得多。
但这么做还有更深层次的好处:有助于激发理解。
在我看来,编程的问题在于你必须爬上陡峭的山峰才能用这项技能做任何有趣的事情。大家到这儿来学习编程是为了开发应用、网站、视频游戏以及其他有趣的创意内容的。但他们一开始并没有机会学习怎么做这些事情,最初的几个月他们学的是变量、数组、函数和循环。
编程一开始的构建块看起来非常抽象,并且与实际目标脱节,以至于很多学生很快就放弃了。这有点像上吉他课,你想学完之后就可以成为约翰·迈尔(John Mayer)那样的大师,结果去学了才知道,光音阶你就得练半年,之后才能开始学习弹一首歌。
要学的还不只是一般的编程概念。人工智能也有自己的语言。大型语言模型(LLM)、嵌入(embeddings)、向量数据库(vector databases)、注意力……等等等等。
是不是感觉被压得喘不过气来!编程学习会选择那些天生具有抽象能力的人,或者那些有足够的毅力与自我激励能力来走下去的人。
但人工智能让大家可以开发出一个 Day One 项目,做出来的看起来很像他们梦寐以求的应用、网站或游戏。这些项目与大家当初想学习编程的原因密切相关。一旦他们做到了这些,就会有足够的动力去更深入地研究,这样一来,像客户端/服务器交互这样的技术主题似乎学起来就更有吸引力了——因为你可以理解它们为什么重要了。
一旦有了可以参考的实践经验时,一些特定的人工智能词汇也变得更容易理解了,比方说嵌入。我认为有很多人之所以想参加这门课程,就是因为渴望有机会理解人工智能的术语——我感觉当他们对其中的某个概念有了恍然大悟的感觉时,就是这门课程最高光的时刻之一。
所有这一切都会产生一个重要影响:能让更多的人可以把自己视为“技术人员”。
根据美国劳工统计局的数据,美国大约有 132000 名专业程序员。2017 年大约有 100000 名学生主修计算机科学——所以有很大一部分人上过几门计算机科学课程,但最终没有成为专业程序员。
这些人了解一些基本概念,但其实内心并不认为自己是“技术人员”。他们当中有些当了产品经理,他们天天跟工程师一起工作,但自己并不参与代码编写。另外一些人最终到了银行,去折腾复杂的 Excel 公式。还有一些人则完全放弃了编程,最终做了一些完全不一样的事情。
他们都有梦想,而人工智能意味着今天他们实现梦想的能力是一年前的 10 倍。他们只是还没有意识到这一点。
未来,我认为“可以通过使用人工智能而成为开发者的人”的范围会进一步扩大。比方说,知道如何使用 Notion、Squarespace 或 Bubble 等无代码工具的人比了解底层编程概念的人要多得多。突然之间,前者中的这些人也将能够用人工智能开发出有趣的东西。
但这一路上也不全是阳光和彩虹。也会遇到问题。
人工智能还不够好,没法可靠地避免或修复自己的编程错误。在有些方面它的表现非常好,而在其他方面则表现平平。
有一点经验的程序员可以学会填补 ChatGPT 的空白,但技术经验较少的人应付这个则要困难得多。你很容易陷入令人沮丧的困境,也就是提示模型替你做某件事情,结果发现它没能做到,然后你去提示它修复问题,但收效甚微。
我们在这门课程当中肯定也遇到这个问题了,我认为部分原因是我自己对什么属于“基本”的东西这个问题有些忽视了。到目前为止,我做编程已经有约 20 年的时间,所以一开始的时候,我并没有意识到看似很“基本”的任务实际上有多复杂。比方说,我知道我需要向学生解释什么是嵌入,或者为什么 GPT 模型会产生幻觉。但有时候我会把基本术语的解释跳过,比方说 API 密钥或环境变量是什么——没有编程背景的人在听到这些的时候会感到一头雾水,这是可以理解的。
现在回想起来我感到很尴尬,因为我没有意识到需要把这样的概念解释清楚。这导致第一堂课的状态起伏很大。正如我在上面提到的那样,部分学生在让他们的机器人只需要几个提示的情况下就可以工作,而有的学生最终感觉被落在了后面,因为有些过程步骤我没有解释清楚,他们卡在那里了。
在接下来的课程当中,我稍微加强了一点对真正“基本”的内容的介绍,但在上课过程中我一直会遇到这样的时刻。20 年来形成的直觉与知识积累确实影响很大,有和没有这些积累对于“可以通过这些模型实现什么编程任务”会产生很大的不同——如果你没有经验可以依靠,则很容易会迷失方向。
这意味着有效的现代编程教育应该包含以下两个方面:1)教学生编写提示,让模型替他们完成编程任务,以及 2) 教他们理解模型生成的代码。
如果做不到第 2 条,很容易就会迷失方向,尤其是如果你没法使用最新模型的话。
真相很简单,那就是 GPT-4 在编程方面明显优于 GPT-3.5。
GPT-3.5 就像毛毛虫,GPT-4 就像蝴蝶。带有网页浏览功能的 GPT-4 就像你带着可爱的小蝴蝶,然后给它喂了一点生长激素。
这背后的原因很简单。与后续模型相比,GPT 3.5 编写出来的代码更有可能存在 bug,最终把事情搞砸。而 GPT-4 在这些问题上做得更好。但是,它的知识有截止期限(它不知道 2021 年 9 月之后发生的任何事情)意味着如果你用了该日期之后发布的编程库的话,将会遇到困难。比方说,GPT-4 并不知道 GPT-4 的存在。因此,如果你要求它编写使用 GPT-4 API 的机器人代码,它就没法做到。
这会导致有些课比较难上,因为每个学生可以使用的工具集不一样——他们可以使用什么样的工具会显著提高(或削弱)他们的能力水平。
这给课堂制造了一种有与无的氛围,如果你支付得起访问费用,或者你是能够访问支持 web 浏览等新的 alpha 功能的少数幸运儿之一,你的工作效率可能会大大提高。我试过用向学生提供 GPT-4 API 密钥等手段来改善这一点,但并不能完全解决问题。
这一切都凸显了一点:对于能够访问最新技术模型的创新者而言,这个世界是如此的不一样。这也让我对“技术变得更加普及与便利”的未来感到兴奋。
我认为,过了 1 年之后,人人都可以用上质量堪比 GPT-4 的模型,而且这样的模型应该可以访问 web 以及他们正在编写的代码。这样有和无的差别将消失,并会显著扩大能够使用 AI 开发东西的人群范围。
我认为能出现这种情况至关重要。
我可以想象对此持怀疑态度的人在阅读这篇文章时会说类似这样的话:“当然,你可以让大家用人工智能开发点玩具项目,但这不能让他们成为真正的程序员。”
这种态度似曾相似——过去懂 C 语言的经常嘲笑 Python 程序员不是真正的程序员,因为他们都不需要进行内存管理。从某些方面来说,那些 C 语言程序员绝对是正确的。学会管理内存确实能让你成为更好的程序员。但是当今的 Python 程序员真的需要它这项技能吗?可未必。
我认为利用人工智能来帮助你编程这件事也是一样。当你在提示模型帮助你开发东西时,对底层编程概念有深刻理解会产生很大的不同。
但人工智能依然可以成为一种有效的工具,帮助你激励自己实现这种理解。而且,随着模型的改进,你可能不再需要像 20 年前那样,去了解一些基本的实现细节。
我当年学编程的时候,是看了一本书的。我用的是 Sam 的《21 天学通 C++》(Teach Yourself C++ in 21 Days),我告诉你吧——那本书是个彻头彻尾的谎言。
为了学会 C++,我被迫呆在卧室里,一行一行地将书里的说明输入电脑。当某些东西不起作用时,我只能祈祷答案在书里的某个地方能找到。如果找不到,我就得去搜索质量不高的 vBulletin 论坛帖子,希望从解决过类似问题的人那里找到线索。这非常令人沮丧,而且非常耗时。最后,我可能花了 6 个月的时间才完全理解其中的内容。
当年那本 Sam 的书的卖点是我可以在 3 周之内学会编码。这在 20 年前显然是不可能的。时至今日依然不可能。
但是今天用人工智能在 3 周内用代码开发出一些很棒的东西则 100% 是有可能的。对于任何有创意抱负的人来说,这都是一个巨大的机会。