在 Copilot 辅助下的编程像是一个试错(trial-and-error)的过程:即在一种不确定性中得到 Copilot 的反馈,然后再人工判断、检验代码提示是否符合期望,是否完全正确。这种“随机”的、反馈迭代的工作方式与传统代码编辑器如 Emacs 中的代码补全有很大的不同。相对于 Copilot 能够根据上下文的语义生成代码片段——而且有时候这些片段的确正中下怀,但这种效果是无法提前预期的——Emacs 的代码补全就仅局限于具体的单词、变量名、关键字、路径名等。这些其实都是非常细节的编程要素,所以 Emacs 的代码补全只能顾及细节的孤立要素,而没有“局部”和“全局”视角。而且即便是补全这些细节要素,Emacs 往往给出的也并非唯一答案。但是它能够提供的多个选项构成的是一个确定的集合,通过不断地按下快捷键 M-/ ,则可以在这些候选中切换。这种确定性恰恰是 Copilot 辅助编程所不具备的。

Copilot 的不确定性带来的最大问题是虽然我们已经明确知道想要的结果,但依旧不得不耐着性子采用试错的方式去检查和挑错,这实际上是一个费神、隐忍的过程。而如果采用传统编程方式,则无须上述反馈-修正的迭代,一下子就能写出正确的代码,实现心想的效果。所以,对于初学者,也许可以在 Copilot 的引导下逐步逼近正确答案,但代价则是放松了对自己熟记和掌握语法的要求与训练强度,有可能使培养良好编程习惯和素养的过程更为漫长。对于有一定经验与良好训练的开发者来说,其自身已经是一个指哪打哪、心到手到的神枪手,使用传统代码编辑器时的那种酣畅淋漓的快捷与准确是 Copilot 无法替代的。若以数学计算来类比,Copilot 辅助编程像是逐步逼近真实解的数值算法,而传统编程方式则是高效、精确的解析解了。