小Python 之旅

第 0 节 编程本色

2021-02-21  本文已影响0人  伯乐讲堂

“每个人都应该学习编程,因为它教会你如何思考。” —— 史蒂夫・乔布斯

“我认为刚入门的程序员犯的最大错误是:他们关注学习语法而不是学习如何解决问题。” —— V. Anton Spraul

1. 编程的本质

编程的真正挑战不是学习一种语言的语法,而是学习创造性地解决问题,从而构建美妙的应用。HackerRank 是国外一家知名的招聘平台,面向求职者提供了编程练习、面试准备等一系列服务。在《2018 Developer Skills Report》报告中调查了 39441 名开发者,调查表明:

我们将要讨论的第一个经典问题是一位需要过河的农夫所面临的难题。读者以前可能已经遇到过类似性质的问题。 1595431219736.png

2. 解决问题的策略

博主给出的第一个问题是一位需要过河的农夫所面临的难题。博客以前可能已经遇到过类似性质的问题。

<p style="text-align:center;font-weight:bold;">怎样过河</p>

一位农夫带着一只狐狸、一只鹅和一袋玉米过河。农夫有一条划艇,只能容纳他自己加上其中一件物品。遗憾的是,狐狸和鹅都饥肠辘辘。狐狸和鹅不能单独待在一起,因为狐狸会吃了鹅。同样,也不能单独把鹅和那袋玉米放在一起,因为鹅会吃了玉米。农夫怎样才能把所有东西都送过河呢?

如果博客以前从来没有遇到过这样的问题,可以花几分钟的时间认真研究一下怎样解决这个问题。如果以前曾经遇到过这样的问题,也可以回忆一下它的解决方案,看看自己有没有办法独立解决。

1595465377238.png

经验和教训

用更形式化的方式重新陈述问题是一种非常出色的技巧,可以让我们拥有对问题更好的洞察力。许多程序员设法与其他程序员一起讨论问题,并不仅仅因为对方可能已经有了答案,而是因为清晰地陈述问题常常会激发有用的新思路。重新陈述问题就相当于与其他程序员讨论问题,只不过现在是一人分饰两角。

更深远的意义在于,认识到思考问题很可能与思考解决方案具有相同的工作效率,甚至更胜一筹。在许多情况下,通往解决方案的正确道路本身就是解决方案。

3. 编程次本质

在西方,在电子计算机诞生之前,计算机这个角色是由(女)人来扮演的。大多数计算都是由人类女性手工完成的,这些女人被称之为「computers」。

43.png

在中国,在电子计算机诞生之前,计算机这个角色是由算盘来扮演的。迄今已有2600多年的历史,是中国古代的一项重要发明。在阿拉伯数字出现前,算盘是世界广为使用的计算工具。

45.jpg

在之后是真空管。这些真空管有一个有趣的特性:用三个针脚可以控制真空管两端节点的电流。这使得真空管在处理模拟信号方面是可行的,真空管可以控制机器和传输模拟信号。

44.jpg

数学家已经意识到,如果能够使用布尔运算,理论上就可以创建执行这些运算的机器。

然后,人们使用这种理论构建了一些机械式计算机,但是由于机械计算机的速度太慢而且成本高昂,所以没有真正的应用。

在这之后,人们意识到,真空管可以当做门,来执行布尔运算。电子计算机变得可行,而这样就开始了电脑的时代。

46.png

现在,电子门的工作方式是由开关驱动。假设你在一个电路中连接一堆门,你当然也可以添加一些门,于是乎你得到一个加法器。每个加法器有一堆开关代表着将要添加的第一个数字,另一对开关代表着要添加第二个数字。打开某些开关,并关闭其他开关以输入两个数字,输出将显示两个数字的总和[1]。

原始 CPU 就是许多这样的电路的集合。

每个电路需要一些二进制的输入,通过二进制指令代码来选择要激活的电路。在早期,人们通过切换开关来操作。

因此,早期的计算机通过翻转开关进行编程

请注意,此时计算机已开始编程,但没有出现编程语言。

顺便说一下,在操作那些开关的人都是被称为「computer」的女人。所以,这些女人都是最最最最早的程序员。

接下来是固态晶体管,其提供与真空管相同的功能,但它们更小,更便宜并且持续更长时间。所以电脑变得越来越便宜,越来越广泛。

由于操作员(程序员)不得不坐在终端前,打开闭合开关,非常不方便,所以后来又发明出了穿孔打卡的方式,能够更简单方便地切换开关。

47.png

所以,打孔的卡上面有很多排线,每条线都有可以打的孔。这些线和开关相互匹配。

现在开始,不在天天操作那些乏味的开关了,改为程序员们去打孔了。

每一条线都代表着不同的指令。有个机器,可以连接到计算机读取这些指令。

就这样,我们可以在打孔卡上面写程序啦。这减少了相当多的工作,写一个卡片能使用相当久,也避免了重复造轮子。

因此,当程序员开始在卡片上写这些程序时,人们开始构建程序库(libraries)。随着时间的推移,大部分的程序渐渐的有了一些规则手册来指导编写。虽然比之前手动开关方便了太多,但还是很繁琐。

这时候,天才格雷斯·霍珀(Grace Hopper)姐姐,想出了一个很棒的点子。

48.png

她的想法是革命性的飞跃。

她最大的贡献是发明了世界上第一个编译器 (Compiler),名字叫做 A-0。当时是没有任何组合语言及程序语言存在的,所有的程序设计人员都要把程序翻译成机器码,01101010110 这样的形式,在纸上打孔,再送到机器里去读。

Grace 产生了一种想法,她想设计一种程序,让人可以用类似英文的语法,把想做的事写下来,然后用这个程序把英文翻译成机器的语法,交给机器去执行。这个想法就是今日的 Compiler (编译器)。

A-0 的原理是:编译程序把穿孔卡加载到计算机中。然后编写的程序将被送入计算机。计算机会吐出另一组包含机器代码的卡片。第二组卡片将被装入计算机,计算机就可以执行这段新的程序了。

再说个趣事,知道为什么叫做「编译」么?正常来说,应该叫做翻译吧?正常来说,compiling 这个词意味着有序的放置收藏,例如编译音乐集。但是编译和二进制代码有什么关系呢?

因为啊,Grace 姐姐把它描述为收集子程序的机器代码,逻辑上类似于你编译音乐收藏。

编程语言因为编译器而迎来了曙光。虽然只是科技史上的一小步,但是真的是革命性的,改变了人类对于编程的思考方式。它创造了抽象的思维方式。这意味着他们可以在更高的层次上思考。这改变了人们对如何编写程序的想法。

A-0 编译器是大量编程语言的开始,大多数现代编程语言都可以追溯到 A-0。

这是编程语言的始祖。

4. 问题驱动

4.1 数学问题

4.2 生活问题

上一篇下一篇

猜你喜欢

热点阅读