有人想学程序设计我想跟他说这个时代编程没用软件已经快被淘汰了。但是忽然想到一点理由。大语言模型在编程领域的能力迅速提高所写出的程序质量也迅速提高。从某种意义上来看中大型项目中大语言模型的编程能力已经超越了人类。在我们这个时代人们必定会质疑是否应该继续学习编程技术。如果编程对于我们来说是一种工作的需要那么我认为几乎没有必要学习除非我们有需要制作非常大型的项目其规模大到大语言模型无法处理。对于工作者来说在最短的时间内写出合格的代码是工作的目标。那么在这种情况下学习编程是一种浪费资源、精力与时间的行为。然而在我看来编程是具有另外一种力量的。编程蕴含着有用的思想。当然这个说法不够准确更准确的说法是程序设计蕴含着有用的思想。下面的4个例子也许能支持我的观点。1我们知道在程序设计中程序员总是倾向于一些逻辑封装成一个模块。这种做法能够极大的提高程序设计的灵活性代码复用性。我认为这就是一种思想的体现。我们可以通过一个例子来体会这种思想。比如一个程序包含着大量的数学运算然后程序设计者观察到其中存在着大量的步骤需要将一个数平方然后再传递给下一个模块。同时程序设计者观察到这些平方操作在未来可能会变成立方操作甚至是4次方等等。那么他有可能会将这个平方操作封装成一个函数。然后再把这个函数嵌入到原来使用平方操作的地方。这样做当然会引入几个好处。当以后需要修改平方操作为其他操作时只需要将函数修改即可。如果未来需要将平方操作改为其他更复杂的数学运算那么只需要保证输入与输出不改变则函数体可以任意调整。提高了程序的灵活性。这里面隐含了什么思想呢对相似本质的敏感。程序员必须要能够敏锐地注意到平方操作在程序中频繁出现非常独立不受影响。远见。程序员。必须要预见到未来这个平方操作可能会被其他操作所取代。在我看来这两种思想非常重要。对相似本质事物的敏感能让我们从纷繁的现象中注意到事物的本质。在编程中养成的远见则有利于我们在工作的过程中不仅注意到某个操作的当下的使用方式和用途还会注意到其未来可能发生的变化于是习惯于做好准备。2另外一个例子是程序员在调试程序的过程中如果发生了错误那么他们通常会使用一种断点测试法。他们会让程序在某一个点停下来然后从内存中抽取一些变量进行观察检查这些变量的值是否符合预期。如果一个程序包含大量的过程那么程序员通常会将这些过程分成两半先检查其中一半的。如果这一半的输出符合预期那么说明错误很可能隐藏在另一半。对于另一半则又将其分为两半再执行相同的检查。这也隐含一种有力量的思想。我把它称之为分治思想。拥有这种思想的人在面对复杂的困难时可能更倾向于将复杂的事物分成小的部分然后逐个解决。他们能够缩小问题的规模并在解决了问题之后又能回到原来问题的视野而不被局部困难所困扰。这也是一种弹性的视野。3我想提出的第3种思想隐含在下面的过程中。这特别体现在一些非常复杂的过程。我们设想有以下的场景。在两个设备之间需要通信。然而最底层的芯片上的接口只能够支持一次发送一个比特信息量的最小单位。而通常需要发送的数据包含上百万个比特。如果程序员要直接使用芯片上的接口对这些数据进行发送那么工作量显然是巨大的。因为通常实际情况下要处理数据流量不能过大发出去的数据要检查是否正确收到等等问题。他们需要处理每一个比特。程序员通常不会这么做。他们会使用分层的办法。首先写一个第1层程序模块这个模块非常简单但是能控制芯片连续发送10个比特并检查是否正确发送。然后在这个第1层模块的基础上编写另一个模块这个第2层模块能够一次性调用上面的模块10次发送10个组每个组包含10个比特并且保证这10个组是按顺序发送的。然后在第2层模块的基础上编写第3层模块这个模块能够将要发送的数据分割成一个一个的组然后传输给第2层的模块。同时它能够控制发出去的组不会造成太大的数据流量以便防止网络塞车。我们看到第2层模块对于第1层模块做了什么事并不关心他只知道第1层模块可以把10个比特都发出去。第2层模块只用关心怎么样把数据按顺序传出去就行了。第3层模块对于第2层模块做了什么并不关心他只知道第2层模块可以将10个组发出去。第3个模块需要知道如何控制数据流量不要过大就行了。从上面的例子可以看出这也蕴含这一种非常有力量的思想。这种思想把一个非常复杂的过程分成1层1层的。每一层都只需要关心他们所需要关心的工作然后不同的层连接起来就能够完成非常复杂的工作。而不用担心每一层的工作过于复杂。4当然程序设计中还有非常多的有力量的思想。比如封装的思想。将一些数据和这些数据对应的操作装在一起变成一个包然后让这个包自己管理自己的数据。这类似于社会中将不同的事务分成不同的部门。每一个部门只需要知道如何使用他们的合法权力处理他们要处理的人和事即可。而领导者只需要站在高的位置控制这些部门就能够完成非常复杂的协作。当然并不是只有程序设计才能训练这些思想。然后呢一个熟练的程序员一定会在不断的练习中不知不觉的强化上面的思想。不管这些思想是否真的有用我都认为经历这些思想的洗礼是一种美妙的过程。这些程序设计的思想让我们以不同的眼光看待事物让我们以不同的视角注意问题。所以我认为作为一个学生虽然人工智能已经完成了从自然语言向代码的翻译就像人工智能完成了从中文到英文的翻译一样但是学习程序设计和学习英文都是一样有必要的。因为在学习这些的过程中我们的思想会受到影响而这是一个美丽的过程。
人工智能时代如何对待编程
有人想学程序设计我想跟他说这个时代编程没用软件已经快被淘汰了。但是忽然想到一点理由。大语言模型在编程领域的能力迅速提高所写出的程序质量也迅速提高。从某种意义上来看中大型项目中大语言模型的编程能力已经超越了人类。在我们这个时代人们必定会质疑是否应该继续学习编程技术。如果编程对于我们来说是一种工作的需要那么我认为几乎没有必要学习除非我们有需要制作非常大型的项目其规模大到大语言模型无法处理。对于工作者来说在最短的时间内写出合格的代码是工作的目标。那么在这种情况下学习编程是一种浪费资源、精力与时间的行为。然而在我看来编程是具有另外一种力量的。编程蕴含着有用的思想。当然这个说法不够准确更准确的说法是程序设计蕴含着有用的思想。下面的4个例子也许能支持我的观点。1我们知道在程序设计中程序员总是倾向于一些逻辑封装成一个模块。这种做法能够极大的提高程序设计的灵活性代码复用性。我认为这就是一种思想的体现。我们可以通过一个例子来体会这种思想。比如一个程序包含着大量的数学运算然后程序设计者观察到其中存在着大量的步骤需要将一个数平方然后再传递给下一个模块。同时程序设计者观察到这些平方操作在未来可能会变成立方操作甚至是4次方等等。那么他有可能会将这个平方操作封装成一个函数。然后再把这个函数嵌入到原来使用平方操作的地方。这样做当然会引入几个好处。当以后需要修改平方操作为其他操作时只需要将函数修改即可。如果未来需要将平方操作改为其他更复杂的数学运算那么只需要保证输入与输出不改变则函数体可以任意调整。提高了程序的灵活性。这里面隐含了什么思想呢对相似本质的敏感。程序员必须要能够敏锐地注意到平方操作在程序中频繁出现非常独立不受影响。远见。程序员。必须要预见到未来这个平方操作可能会被其他操作所取代。在我看来这两种思想非常重要。对相似本质事物的敏感能让我们从纷繁的现象中注意到事物的本质。在编程中养成的远见则有利于我们在工作的过程中不仅注意到某个操作的当下的使用方式和用途还会注意到其未来可能发生的变化于是习惯于做好准备。2另外一个例子是程序员在调试程序的过程中如果发生了错误那么他们通常会使用一种断点测试法。他们会让程序在某一个点停下来然后从内存中抽取一些变量进行观察检查这些变量的值是否符合预期。如果一个程序包含大量的过程那么程序员通常会将这些过程分成两半先检查其中一半的。如果这一半的输出符合预期那么说明错误很可能隐藏在另一半。对于另一半则又将其分为两半再执行相同的检查。这也隐含一种有力量的思想。我把它称之为分治思想。拥有这种思想的人在面对复杂的困难时可能更倾向于将复杂的事物分成小的部分然后逐个解决。他们能够缩小问题的规模并在解决了问题之后又能回到原来问题的视野而不被局部困难所困扰。这也是一种弹性的视野。3我想提出的第3种思想隐含在下面的过程中。这特别体现在一些非常复杂的过程。我们设想有以下的场景。在两个设备之间需要通信。然而最底层的芯片上的接口只能够支持一次发送一个比特信息量的最小单位。而通常需要发送的数据包含上百万个比特。如果程序员要直接使用芯片上的接口对这些数据进行发送那么工作量显然是巨大的。因为通常实际情况下要处理数据流量不能过大发出去的数据要检查是否正确收到等等问题。他们需要处理每一个比特。程序员通常不会这么做。他们会使用分层的办法。首先写一个第1层程序模块这个模块非常简单但是能控制芯片连续发送10个比特并检查是否正确发送。然后在这个第1层模块的基础上编写另一个模块这个第2层模块能够一次性调用上面的模块10次发送10个组每个组包含10个比特并且保证这10个组是按顺序发送的。然后在第2层模块的基础上编写第3层模块这个模块能够将要发送的数据分割成一个一个的组然后传输给第2层的模块。同时它能够控制发出去的组不会造成太大的数据流量以便防止网络塞车。我们看到第2层模块对于第1层模块做了什么事并不关心他只知道第1层模块可以把10个比特都发出去。第2层模块只用关心怎么样把数据按顺序传出去就行了。第3层模块对于第2层模块做了什么并不关心他只知道第2层模块可以将10个组发出去。第3个模块需要知道如何控制数据流量不要过大就行了。从上面的例子可以看出这也蕴含这一种非常有力量的思想。这种思想把一个非常复杂的过程分成1层1层的。每一层都只需要关心他们所需要关心的工作然后不同的层连接起来就能够完成非常复杂的工作。而不用担心每一层的工作过于复杂。4当然程序设计中还有非常多的有力量的思想。比如封装的思想。将一些数据和这些数据对应的操作装在一起变成一个包然后让这个包自己管理自己的数据。这类似于社会中将不同的事务分成不同的部门。每一个部门只需要知道如何使用他们的合法权力处理他们要处理的人和事即可。而领导者只需要站在高的位置控制这些部门就能够完成非常复杂的协作。当然并不是只有程序设计才能训练这些思想。然后呢一个熟练的程序员一定会在不断的练习中不知不觉的强化上面的思想。不管这些思想是否真的有用我都认为经历这些思想的洗礼是一种美妙的过程。这些程序设计的思想让我们以不同的眼光看待事物让我们以不同的视角注意问题。所以我认为作为一个学生虽然人工智能已经完成了从自然语言向代码的翻译就像人工智能完成了从中文到英文的翻译一样但是学习程序设计和学习英文都是一样有必要的。因为在学习这些的过程中我们的思想会受到影响而这是一个美丽的过程。