编程心得

一、程序有限性

程序存在一个巨大的缺点,就是其有限性。

程序归根结底预先准备好的东西 —— 某种确定的规则、某种特定情景规则。或者根据确定的规则,生成一些模式化的应对策略,本质上依然有限。

反向思考,思考程序归根结底是思考清楚每种情况,或者给出可以概括的规则。

也正是由于这个特点,数学具有预测性,和计算机的亲密性很高。

二、平衡艺术

很多问题不是非黑即白,而是各有优点,各有缺点。

解决问题的办法是平衡,不是回避。

组合他们,避开他们的缺点,利用他们的优点,因地制宜平衡,是编程里面的艺术。

三、工程性

  1. 工程相似性

具有和建筑学类似的工程性。主要在于解决方案、推进方案、持续的维护、保持开发效率、保持多人共建、保持进度维护等等。

和一个团队,盖楼、装修很类似。

团队充满各个角色需要沟通和同步。

建造项目本身需要丰富的经验和技术,需要优秀的设计。

前期、中期、后期有完整的生命周期。

  1. 解决问题是灵魂

工程性解决问题,可以是优雅的方案,也可以是惯用的方案。

相较于学术假设、推理、论证……这种。

编程的工程性属性更加突出 —— 设计、实践、测试没问题即认为没问题、管用的方案就是好方案。

四、艺术性

1. 自由的设计

和盖楼、机械有相似性,但是盖楼、机械他们不会频繁的推倒已经成熟的方案。

但是编程不一样,编程相对来说推翻自己的成本相对低廉——就是程序员自己的时间和精力。

现实中的实业偏向于保守。

软件工程可以相当激进。

软件的结构,自上向下可以看作是:

用户软件

软件接口

操作系统

内核

每层都通过接口工作。一个成熟稳定的软件主要是接口协议。对于不同层都可以保持兼容。

自己的内部实现和工作模式的可以自由改变。

  • 接口层面上: 可以定义自己的接口,形成自己的语言、工作模型,界面上也可以有自己的交互、设计、表达。

  • 接口内部:可以有自己特殊实现,可以自由的使用各种工作模型,保守的、探索的、先进的等等,完全自由。

2. 自由创作

正是由于这个基础上,解决方案的极大自由。

创作软件也许不是按照施工图纸上一板一眼的进行,可以是涂涂改改,从小到大,从模糊到清晰,可以从上到下,也可以从下到上。

软件从一层一层的commit中逐渐被修正的清晰。

彷佛就是 《黑客与画家》中说的,就像画画,他是涂涂抹抹的一个创作过程。

五、图灵完备的意义 —— 不同语言本质上可以等效替代,也可以彼此抹平差距

意味着可以相互弥补。

在一个图灵完备的内核基础上,可以通过外层的胶水逻辑向上构建,从而弥补核心层的BUG或者功能不足。

理论上任何语言都差不多,也都可以差不多。

现实中的差距只是在使用他的人,和正在给他作贡献的人,和使用他作出影响力大软件的人而已。

比如语言,人们与其说是偏向于某种语言来工作,不如说是依赖于某种语言上的杀手级别软件。

而杀手级别的软件,归根结底是这些软件作者的偏好。

六、程序是时间的函数,一切算法皆是遍历

程序换个角度,不论程序多么复杂,是串行还是并行,它归根结底可以抽象成一个关乎时间T的函数。

程序里面的一切都是一种遍历。

不论多么精妙的算法,处理问题和解决问题上,程序只能遍历。

只是一种傻傻的遍历,还是聪明的遍历的区别而已。

傻的遍历,就是N重循环。

聪明的遍历:

  1. 带笔记本的遍历
  2. 不重复的遍历
  3. 根据一些规则可以提前去掉不必要的遍历
  4. 可以利用目标算出一些数值,有选择的遍历 ……

无非是根据问题特征减少一些遍历。

但是想要解决问题,归根结底就是遍历。

所以程序、算法不是万能的。 他只能解决,能被计算所描述,并且可以在有限步骤下被计算出的问题。 (图灵停机问题就是为了证明这个)

我特别想关联的一个点是: 如果看过网上一个黏菌实验的科普视频。将的是把食物按照东京重点城市分布,然后撒上黏菌,最后黏菌在食物之间联络的路线和今天东京的主要干路的结构一样。

也许你以为黏菌有智能。会寻找到路线。

其实无非是黏菌释放了大量的孢子,覆盖了培养皿的空间,那些有食物联络的孢子都或活下来了,而远的都死掉了。而其中留存下来的就是最短的路线。

这样就完成了寻路。

你会发现,生命发现“真理”的过程,也就是一种遍历,也就是去全部试错罢了。

对于“不可知”只能去探索(遍历)。

这和DFS、BFS寻路算法也没有本质区别。只能通过 探索去对抗未知。

写道此我更惊叹于计算机的神奇。图灵、冯·诺伊曼 计算机的缔造者们真的是神奇。

Mark24

Everything can Mix.