身处信息时代的漩涡之中,好用的App,似人非人的人工智能每天都与我们明里暗里的打着交道。而驱动这些工具的底层动力就是编程。
其实,既是信息的生产者,也是信息的消费者,更是信息的受益者。从人们开始接触信息开始,就不断的探索能否通过机械化的方式处理信息,直到图灵机的提出,冯诺依曼机的制造完成,人们才真正实现了信息的自动化处理。而这个“自动化”,并不是机器的自动化,而是人赋予的,说白了就是编程。
那么,编程的本质是什么?是让机器自动化的处理信息?笔者作为一个具有16年编程经验的“老程序猿”也曾经试图探索这个问题。要回答一个问题,特别是要回答类似关于“本质”的问题,我觉得需要深入剖析问题本身。
所以,要回答编程的本质是什么,需要先回答“编程是什么?”这个问题。而要回答编程是什么,就要先回答什么是程序?那么,什么是程序?对于学习过编程的人可能会说“程序就是机器可以理解的代码”,这个答案本身没有错,但是我觉得如果你对一个完全没有编程经验的人介绍,他肯定很懵,他会接着问:什么是代码?哈哈,我的回答是:程序就是你做一件事情的详细步骤。就这么简单?是的,这就是程序!
那我去洗澡,先打开热水,然后涂沐浴露,用毛巾,,,,后面不可描述。这个过程也是程序?是的,只是执行这个程序的人是你自己,而我们通常编出来的程序的执行者是机器而已。
那么?编程就是编写做事情的详细步骤了?对的,真聪明!
我前几天教我刚上小学的儿子编程时,我问他:“你可不可以编写一个程序制造一颗原子弹?”他马上回答“可以!”。我又问“为什么?”,他说“因为电脑什么都能做!”作为一个没怎么学习过编程的小学生,他这样回答我觉得没什么问题。他是基于计算机的算力来回答,理论上算力足够,确实可以。但是他没回答到根本上。算力足够,就意味着一定可以实现吗?还记得前面提到的图灵机的产生,那是人们在追求通过机器的方式去模拟人处理、计算数据的产物。意味着,机器只是执行者,解决具体问题还得看人的“步骤”-“程序”。
那么我的回答是“不能”。因为他根本不知道制造原子弹的详细步骤。也就是说,当一个人对于具体问题没有解决方案的时候,是无法通过编程来解决。
这就引申出了另外一个问题:很多人学习编程很久,但是一直不得其法。就连一个冒泡排序哪怕写了两年的代码,都不可能徒手写出来。对递归这种很自然的逻辑表达也是望而生畏。
是他不够聪明吗?不是。是他对编程的本质没有理解。一味的去追求编程的范式,编程语言本身的语法特性,却不去正视编程本身-“编排事情解决方案的步骤”。试想,此时如果有10个人站在你面前,你是否可以通过简单的命令让他们以冒泡的方式从低到高排好队呢?如果不能,那冒泡排序的代码肯定也写不出来?那这个命令怎么说呢?
1、从第一个人开始,和后面一个人比高矮,如果前一个人高,就换到下一个位置,否则不换,一直这样比较,直到最后一个人。这样,第一次下来后,最后一个人肯定是最高的。
2、按照上面的步骤,继续从第一个人开始,和后面的人比高矮,一直换到倒数第二个人。(为什么不到最后一个,因为第一轮下来,最后一个已经是最高的了)。而对于递归,一个很好的例子是我们在一个排好序的队列里找某一个数。比如[1,2,3,4,5,6,7,8,9,10]找出2。这种二分查找的递归表达式怎样的?
1、先取这个数列的中间1/2处,与目标数比较,如果大于目标数就取出前一段,否则就取出后一段。
2、把第一步取出的那一段按照第一步的方式继续取中间的数字,并做比较,直到找到或者结束。通过上面两个例子,是否对编程的本质有一些了解呢?
其实这里提出了另外一个问题?编程能力。我觉得有两个:
一、以编程的视角,回答一个问题。或者说程序化问题的答案。
二、将问题的答案通过程序表达出来。
第一条是硬实力,第二条通过练习可以慢慢获取。
我们每个人每天其实都在编程。你上班的过程是编程,早上6点起床,刷牙,洗脸,吃早餐,然后开车到公司,打卡,然后摸鱼或者工作…….这些其实就是你自己对自己编程,一步接一步,哪个地方临时有问题,你会立马启用与之配套的方案,这就类似程序里的异常捕捉。怎么样?编程是不是很简单?