最近一个星期，我大量使用[GPT和Copilot](/ai-coding.html)来帮助我编写代码，有了一些新的感悟。
虽然我是一个非常喜欢写代码的骨灰级程序员，但真的有问题需要用电脑解决的时候，我还是有些抵触。
主要原因是，电脑是非常苛刻的。
一些看似简单的问题，一旦涉及到细节，就会容易卡很久，导致实际花费的时间是最初估计的数倍。
比如我有50个文件，想根据某种规则重新命名它们，比如交换文件名中两个下划线之间的字符串。
这似乎是一个简单的编程任务，分三步：解析文件名、生成新文件名、调用重命名函数。
但实际上，可能写到一半发现自己对正则表达式匹配函数的参数含义记得不清楚，或者不知道如何设置正则表达式以忽略大小写。
更可能的情况是，正则表达式起来没问题，但一跑就匹配失败，需要调试。
调了几轮以后，5到10分钟能写出来一个能用的程序就算是快的了。
然而手动更改一个文件名可能只需三四秒，在三五十个文件的时候两三分钟就能全部搞定，实际上比编程要快得多。
连我这种喜欢写代码的变态程序员都会有这样的想法，因此我也特别理解那些不是科班程序员的人，比如数据科学家、数据商业分析师等，他们会更喜欢用excel和tableau来解决问题。

但其实把看似一次性的操作变成可以批处理和重复的代码实现，实际上非常有益。
一方面，对于重复性工作，人可能会犯错会粗心，但计算机不会粗心。
一旦搞错一个文件，复查，返工的时间可能就比写代码的时候长了。
另一方面，这带来了另一个好处是自动化。
一旦一个东西被写成了代码，就意味着电脑可以帮助我们完成这项任务。
当大多数零碎的任务可以被自动化的时候，我们可以放心交给电脑的任务的复杂程度就可以像滚雪球一样增长。
但是，包括我在内，很多人为什么不这么做呢？
原因很简单——为什么要花十分钟写程序去做手工一分钟半就能完成的事情呢？
就像段子里说的，一个博士为了自动化检测流水线上没有装肥皂的空盒子，设计了一整套X光成像和机械臂系统。为了复杂而复杂，得不偿失。

幸运的是，最近通过对[AI编程的实验](/ai-comment-oriented-programming.html)，我发现AI似乎能够相当完美地解决这个问题。
对于相对简单的编程任务，AI很有可能一次性快速写出直接可用的代码。
比如在上面文件重命名的例子里，我实际只用了二三十秒通过语音识别向AI描述我的需求并给了一个例子，它就能在三十秒左右写出代码。
然后我再花三十秒将代码粘贴到编辑器并运行，整个任务就轻松完成了。
因此，从这个角度来看，GPT-4和Copilot的出现对我启发颇深。
它们使得编程不再是一种仅在数据量庞大、手工效率低下时不得不采用的备选方案。
相反，AI让编程有潜力成为解决问题的首选方法。
一旦我们可以运用AI的这一能力，广泛使用编程来解决问题，无论是短期还是长期，我们使（压）用（榨）电脑的效率和深度都会变得远远更高。

而且，这不仅适用于程序员。
我所提到的，包括向AI描述需求、复制并运行代码，几乎不需要任何编程基础。
只需进行简单学习，比如如何运行Bash或PowerShell脚本，就能上手。
即使程序出现问题，也可以将错误信息直接粘贴给AI进行修正。
因此，这整个过程不仅适用于有一定电脑基础的非程序员，而且其实对他们更有利。
因为AI降低了入门门槛。等于将比如DS和BA的编程能力提升至与[科班码农](/new-employee-suggestions.html)相同的水平——都是又快又好。
所以，对于简单的问题，编程可以既快速又高效，这种编程民主化（Democratization of Programming），是我感受到的AI可能对整个IT领域产生的第一个深刻影响。

在此之外，另一个深刻的影响是AI可能深远地改变了我们学习编程或者其他IT技能的方式。
以前，要想高效地学习，我们通常需要三样东西：一是教材，提供学习的理论基础；二是老师或助教，提供个性化的答疑；三是实操。
实操对于IT领域来说尤为重要。
如果学了很多理论知识但无法通过代码实现，等于白学。
然而，现在的教育体系不论是在课堂里学习还是通过视频自学，都是从课本开始，由老师引导。
这就带来了两个问题：一是对实操的重视程度不够，很多时候都是纸上谈兵，只会做理论推导和玩具级别的东西，遇到程序报错时缺乏debug的经验；
二是因为学习的时候还没有实操经验，不知道每一个知识点的实际用途，这既缺乏学习的动力，也无法准确把握重点，导致每个知识点都花费相同的时间去学习。
这些问题对于学习，尤其是IT领域的学习，是非常有害的。

但是，我最近通过利用AI以一种全新的方式学习了Swift编程和Python的异步编程，切身感受到了AI对我们传统学习方式的摧枯拉朽式的优势。
更具体地说，当我学习Swift或Python的异步编程时，我并没有先找个课本开始看，或者囫囵吞枣开始上网课看视频。
（走个题，我觉得书籍比视频更有用，因为书可以快速翻阅但视频不行，书籍可以快速搜索，但视频就比较困难。）
相反，我尝试了在AI的辅助下通过实战学习。
针对我特定的需求，我会直接询问AI如何使用Swift或Python来实现。
AI在给我编写代码后，我会对不理解的部分提问，或者对于新的需求和改动，让AI进行调整。
有时候，AI的思路和我的不同，我也会追问并要求它给我解释。

这种学习方式的一个明显好处是非常个性化。
你可以根据自己最关心的问题优先学习相关领域的知识，而不是浪费时间在与当前问题无关的知识上。
这是一种高效的学习方法。
另一方面，AI也是一个极具耐心的助教。虽然它可能在思想深度和创新能力上不如一些现实中的专家，但它有几个优点：
首先，它非常有耐心。即使我们的基础知识较弱，AI也会非常耐心地一步一步指导我们如何配置。特别是在我询问如何编写一个Swift程序来实现苹果推送服务时尤为明显，因为苹果的证书配置非常复杂。但AI会有条理地告诉我们每一行命令行应该如何输入，我们只需复制粘贴即可完成配置；
其次，它提供的答案高度定制化，针对你的问题；
第三，可能由于训练数据的关系，AI对工业界的趋势和原则非常了解。因此，它推荐的方案往往比学校里的研究生助教更符合标准实践，能让你学到很多课本之外的东西。（想想谭浩强版C语言）

所以，在学习的时候，我一方面能够以最高的效率学习到我真正感兴趣、真正需要的东西。
同时，即使我对某个领域不太了解，AI也能以适当的顺序耐心地将知识逐步传授给我。
此外，我所学到的知识还包含了工业界的经验和标准实践。
这就使得以实操为出发点，由AI主导的学习方式显得格外有价值。
我个人认为，无论是通过阅读书籍自学、上网课，还是在学校里跟随老师学习，我都无法在如此短的时间内编写出之前在朋友圈提到的复杂程序。
即便能够编写出来，所写的程序可能也不够地道，甚至可能与工业界的原则相违背，以后还是得返工。

因此，综上所述，我认为至少对于简单的场景，AI可以非常高效且正确地编写程序。
这样的观察可能会从两个方面深远地改变IT领域的格局。
首先，它可以使编程成为解决问题的首选方法，即成为解决问题的"first class citizen"，从而大幅提高使用AI工具的人的正确率和生产力。
其次，它可以作为一种个性化的、高效且深入的学习方案，大幅提高我们的学习效率和效果。
从这两个角度出发，当下的AI也许不会立刻取代程序员这个职业，但它已经开始深远地影响我们的整个IT领域了。

<script async data-uid="49b08a3e73" src="https://yage-ai.kit.com/49b08a3e73/index.js"></script>
