题外话:原先我给自己公众号的定位是每个月努力写0~3篇,10月写了0篇,11月写了0篇,总算也艰难完成了既定目标。我们程序员,当然都是从0开始计数的,有些人(其实没有人。。。)非要抬杠,说0不算数,不算数的在我们这儿叫NULL,写SQL一定要记得,不是=NULL而是IS NULL、IS NOT NULL。

=====正题=====

当然,我相信每个网工也会说:为什么我认为所有搞IT的都应该懂网络;每个养猪的也会说:为什么我认为每个吃猪肉的都应该懂猪是怎么吃了睡睡了吃出来的。但是真再不学编程,潘石屹都要来抢我们的饭碗了。

在IT行业,懂不懂编程的差别就跟文科生和理科生的差别一样,懂编程,他/她的思路就跟别人不一样。

一个事情做了几十年,突然有人告诉你做错了,这个太常见了。由于目前科技的限制,人类寿命的限制,记忆的不确定和衰退,大脑无法被Export/Import,

所以只有文档才是可以被永久保留并分享的。书籍和科研论文推动了科技大厦越建越高。

而代码也是文档,漂亮的代码是不需要注释的,因为他本身就是易懂的。代码的出现绝对可以媲美造纸术的发明,开源的开放共享让知识传播的成本一下子降低下来,ICT行业这几十年的飞速发展都是因为规模使得成本下降的原因。

有件事情,可能你全手工做下来只要一个小时,但是你为了编程去实现他,花了4个小时,运行1分钟出结果。有没有价值?是不是浪费时间?

当然有价值,编程实现完,可重复,有文档留下,可被审计,可review,可验证,带状态恢复。

什么是状态恢复?就是你手工做半个小时以后发现错误了,你没有像玩游戏那样遇到大Boss之前存盘恢复的机制。

万一有下次,别人还要花一个小时,但是你只要1分钟,而且由于成本低,你会更愿意去做这种事情。

你可以懂很小众的Excel编程,也可以懂Python,还可以用文言文编程。噫吁嚱!文言文亦能编程!此诚年度最骚语言也

总之你要有一些编程思想。你要知道协议,接口,服务,分层。懂Library 库,Toolkit 工具箱,Framework 框架,Boilerplate 模板,Scaffolding 脚手架。知道代码和数据的关系。知道面向对象三大基本特征:封装、继承、多态。知道面向对象的不足。

你要理解函数的高内聚,低耦合。你要知道强类型、弱类型。你要实践防御性编程,异常捕捉try/catch,容错,缓存。还要Git协作。你要懂重构,设计模式,知道常用算法,递归,回溯,暴力枚举。

你还要了解墨菲定律、布鲁克定律、霍夫施塔特定律、康威定律、波斯托定律、帕累托法则、彼得法则、基尔霍夫法则、莱纳斯定律、摩尔定律、沃斯定律、九九法则、克努特优化法则、诺维格定律。Famous laws of Software development

而且基本上只要懂一个语言就好了,因为现在很多编程语言思想都是相通的。每个夜晚,沿着马来西亚的潮汐河流,成千上万只萤火虫聚集在红树林中,同步闪烁;上万亿个电子在超导体中步调一致地前进,使电流在零电阻的状态下流过;几十年的老夫妻面容相像,心灵相倾,习惯趋同;交往密切的闺蜜生理期趋向一致;几百个不同起步的节拍器在共振的作用下趋于同步。

编程语言也是这样子的,你会看到不同语言都会实现map/reduce、await/async,所有语言都会有类似C90、PEP、JEPs、JSRs等等。

而这一切扩展到非编程领域也是这样的。软件工程行业一直以来以建筑行业来比对,模仿现代建筑业的成熟的模式,包括可预测性、成本控制、模块化、施工规范等等。一旦你将编程思想扩展到生活中的其他领域,或者你在生活中归纳总结在编程语言里的映射,你就会豁然贯通。我们遇到一个未知的领域,都习惯于尽快在经验里面收集匹配,把未知的变成已知,把已知的归纳到模式,这就是Metaphors(隐喻)。

比如“照镜子、正衣冠、洗洗澡、治治病”,用编程来解释,就是“Best Practice、Static Analysis or Linting、Test、Bug Fixes”。