读张越的《如何学编程?》
什么是编程?
现代计算机的起点是莱布尼茨的一个梦想,将理性还原为计算,用强大的机器执行这些计算。//让我想起来一句话“这不是情怀,不是素养,而是冷冰冰的计算”
这需要两个前提,一切都可以计算,可以执行一切计算的机器。
为了达到这个目的,17世纪以来的数学家和哲学家就围绕上面两个问题展开了自己的研究。数学领域人类发明出来了一套统一符号来处理代数表达式,并不断尝试用符号来表征全世界所有的概念和事物。//事实证明这样做的结果是,符号比较混乱,不能统一起来。常常是一个x代表的好几个意思。
像笛卡尔,飞马通过论证讲集合通过某种方式转换成了代数,那个时代的顶尖数学叫尝试做下面的事情:1将全世界的只是归纳起来,2针对上述的全集用一套符号体系进行表征,3用莱布尼茨所述的“推理演算“对这些符号进行运算。
在那个伟大的时代产生了大量的优秀人才和成果,希尔伯特、康托尔、哥德尔等人都作出了重大的贡献。其中布尔在《思维的法则》中证明了逻辑问题可以演变为数学问题,从而奠定了现代编程语言的运算逻辑。而现代编程学语言的概念就源自佛雷格在《该你那文字》所描述的:所有演绎推理都可以归纳在一个逻辑体系内。
这段时间,哲学家也为编程语言和计算机的产生做出了重大贡献:维特根斯坦在《逻辑哲学论》中为现代编程语言的面向对象思想奠定了件事的基础:
”“对象包含了事物的全部状态的可能性,......,这种固定不变的模式有对象组成。
在数学家和哲学家讲一切均可计算的梦想逐渐实现的时候,图灵描述了一种通用的计算机模型,图灵机由此诞生。冯诺依曼等人用电子管实现了这种模型,”可以执行计算的机器“发明出来了
直到今天,现代编程语言依然沿着当年的套路发展,而硬件形态不管变化多大,图灵机的基本原理和梦诺依曼体系始终没有本质变化。
因此简单说,现代编程语言(更准确的说法是,一种”图灵完备“编程语言),应该能够完整的描述某一个现实领域的问题,并通过运算规则,操作计算设备获得分析过程和结果。
所谓学习编程,就是学习使用一种特定的语言,来描述现实世界的一个问题,再将这个问题用过计算机的运算,给出分析和解答。
进入程序的思维逻辑
编程难是因为没有具备”编程思维“。变成四位,需要用一种新的语言形式来描述世界。
那个著名的笑话:
老婆给当程序员的老公打电话:”下班顺路买一斤豹子带回来,如果看到卖西瓜的,买一个。“
当晚,程序员老公手捧着一个豹子进了家门......老婆怒道:”你怎么就买了一个豹子?!“
老公答曰:”因为看到了卖西瓜的。“
这个笑话充分表达了程序思维和生活思维的不同,这里的差异在于:
人类常用表达方式和逻辑习惯是不吻合的,很多信息存在模棱两可的描述中,而编程语言是完备和精确的,机器的代码一个符号都不能错。
第二,”图灵机“的思维模式是一种机械的,线性逻辑。它符合机械流程。而人类的逻辑,本质上是一个非线性的反馈系统,所以思维决策模型上的差异导致编程的逻辑过程必然与人脑思维过程不同。
因此,学习编程需要让自己养成线性思维,或者说是理性的反馈系统。//其实大自然的很多事情都不是线性的,更多是非线性的,我要注意的是这两种思维之间的转换。
只有这样才能从所学知识中举一反三,建立自己的只是系统。因此学习时,经常画流程图,和时间顺序图,是一个号的习惯,用图表将自己的思维表达清楚能有助于用机械逻辑来表述自然思维。另一个方式是写伪代码。
了解你所写的代码
只有了解你所写的代码,你才能渐变成一个专家级程序员。
比如随便最简单的移行代码:
var a = 1;
如果你只是一个普通的程序员,你应该知道这行代码解决了什么问题,但如果你是专家级程序员,你应该知道:
1系统是如何执行这行代买的?
2系统因为执行了这行大妈,发生了那些改变?
要做到这两点,你需要对一下内容有比较深刻的理解:
1深刻掌握你所使用的编程语言;
2了解和掌握你的程序所运行的操作系统;
3在某些情况下,需要了解硬件的一些特性和限制,以及操作系统在这些硬件上的影响。
因为你写的代码,作用与一台图灵机(可以执行计算的机器),中间需要有操作系统,可能还有你所使用的编程语言所使用的运行时(如:Java Runtime)。
如果你立志成为一名优秀的程序员,你需要从一行程序出发,一步步的追踪到硬件的执行。这时候,你会发现很多隐藏在程序之下的东西。
优雅的控制机器
很多不懂程序的人,都会发现一个现象:凡是会写代码的,都会修电脑,修手机,修一切的电子产品......
写程序与修电脑之间有什么必然联系吗?
真的有联系。修手机的能力,来源于对手机的理解和对手机的控制力。这种控制力,包括输入输出的各种设备(摄像头,传感器,蓝牙),包括操作系统,包括工具类的应用软件。
一个程序员希望自己的代码能够在一台设备上运行良好。他确实要关注以上这些东西,一个程序是否可以合理的使用外设,是否在操作系统中兼容性良好,是否与驻留软件不冲突,都是一个程序员需要考虑的问题。
因此,一个合格的程序员,确实要习惯性的稻谷自己的手机、自己的电脑。
一个幸福的事实是,现在的可穿戴设备和只能加剧设备的逐步普及,更多的传统设备配备了操作系统,成了可编程的涉笔。
比如,一个程序员懂得Android开发,口可以使用程序控制电视定时播放,智能手表表针的显示样式,空调的出风温度,手机和门禁链接,在汽车中年中控台上部署一个程序和手机共享音乐等等
长靴长信,吐故纳新
技术日新月异,永无止境。
所有高阶程序员呢,具备的一个基本能力和素质,就是不断的尝试新鲜事物,不断阅读新的项目代码。也会主动改进之前做过的项目,哪怕他们当前运行良好。
每一个新技术的掌握,都建立在对现有技术的充分理解智商,因此,学好当下,恰恰是掌握未来的最佳方式。
以用带学
设立一个学习的目标,比如学习JS可以建一个自己的博客。
有一个明确的目标,就会有明确的学习路径,解决问题时,就不容易发散。更有助于提升效率,衡量学习效果。