河套 IT TALK——TALK 10:编程的技术|艺术|术术 中篇:编程的思想、艺术和哲学

河套 IT TALK——TALK 10:编程的技术|艺术|术术 中篇:编程的思想、艺术和哲学

前期回顾

上篇里,骨灰级程序员梁峻墅给大家介绍了他的心路历程,以及他对程序员文化和武林文化的理解。本篇将继续请大神和我们一起聊一聊编程的艺术和哲学。

编程的思想境界和层次

上篇的段子讲完了,现在进入正题:编程的终极奥义到底是什么?

我理解只有思想恒久远,代码才能永流传。因为编程就是把人类的语言给转换成计算机能执行的机器语言,本质就是一种翻译工作,但翻译的水平也是有高有低的。

像电影《Sucker Punch》是一部非常有创意的内涵思想片,还能融合梦幻、魔幻、科幻、暗黑、伦理、动作、微色情、小萝莉、暴力美学等多种元素做到雅俗共赏,不同层次的人都能从这部影片中获得不同的乐趣。

但这部电影在华语区的票房惨淡,就是由于译名问题,该片的价值被严重低估。台湾翻译为《杀客同萌》,基本做到了意音具备,就是神还差点。但看看大陆翻译为《美少女特攻队》是几个意思,让人以为是二次元动画片。再看看香港的翻译《专扁衰仔》,你就知道没文化有多可怕,扎克·施奈德估计直接哭晕在厕所里。翻译的思想高度不同,对作品的理解深度不同,翻译的质量是天壤之别。而对于像编程如此缜密的翻译工作,那更是需要蕴含深刻的思想才能做得更好。

既然谈到思想,就要谈到思想的境界。

我理解编程的境界有四层,借用孙子兵法,分别是:下兵伐城中兵伐谋上兵伐心不战而屈人之兵为超然。  

第一层:下兵伐城

很多程序员,一接到编程需求,就立刻启动开发环境,开始编程敲代码了。这就是没什么想法,先干起来再说,编到哪儿算哪儿。面向交付编程,只为完成功能,头痛医头,脚痛医脚。一路攻城略地,好不威风,但这只能算初级水平。

第二层:中兵伐谋

拿到需求之后,不着急动手,先开始思考,开始谋划,应该走什么技术路线,结合哪些已经做过的代码,还应使用哪些技术手段来快速、轻松地完成这个需求。这个层面的程序员已经开始不靠纯技术硬扛需求,而是开始艺术性地解决问题。大家拼的不是能不能解决问题,而是看谁解决问题的成本最低。像中医那样,并不直接治病,而是阴阳调和,打通经脉,调动自身免疫系统,四两拨千斤,这已经开始有中国式智慧的味道了。这种人经常在计算机旁边呆坐半天,即使表面上在和你说话,但其实脑子里在伐谋呢,所以经常表达古怪,被认为是书呆子。

第三层:上兵伐心

这种人已经能看到文人的清风傲骨,在更高的战略层面思考解决问题的时空成本,包括但不限于时间成本、分析成本、设计成本、编码成本、调试成本、部署成本、维护成本、用户的使用成本、资源的调配成本、社会的综合人文成本等等,得到结果后会产生一个灵魂拷问:“为什么要解决这个问题?能不能不解决?”带有原罪的需求都挺不过这个终极审判。比如很多需求,只是貌似合理,但实际上是伪需求,顶尖的高手能够抽丝剥茧,发现需求的逻辑矛盾和漏洞,并能综合运用各种手段,甚至包括非技术手段来及时纠偏。比如做MIS系统的时候,客户方的办公自动化系统需求很简单,就是把现有的管理规章制度全部用计算机程序实现一遍。这个需求貌似天真无邪,但实际上它忽视了人机之间的差异和特点。比如对人工作业,为达到作业合规的要求,管理规章制度中就要有反作弊措施,各个相关部门还都要有作业数据备份,以便将来发现问题倒查时可以对口供。但对IT系统,用户都有登录ID,作业都有事务ID,交互都有会话ID,存储都是一体化的,根本不需要那些画蛇添足的步骤。顶级的程序员就会庖丁解牛般地优化管理流程,引导需求合理化,节省了大量的研发资源、应用资源和社会资源。可能只需要修改管理规章制度的几十个字,就能少写几万行代码,bug能少几百个,部署维护能少几个月,用户每天能少点击数千次鼠标。通过少编程,甚至不编程就能解决问题,才是最牛逼的境界。

第四层:不战而屈人之兵

终于来到最最牛逼的境界——不战而屈人之兵。前面三层境界,也就是在满足需求、预测需求、引领需求上做文章,毕竟都是咱们这个世界可以理解的事。而最高境界已经跳出三界之外,不在五行之中,已经无法理解了。

看个场景先:小白最近代码输出太少,说机器频繁死机,耽误了工作。大牛对着机器,上去就是一脚,从此再不死机了…天理何在?小白不服啊,碰上死机的机器也来一脚,结果当天就去财务领工资了…天理难容!虽然都是人,但差别就这么大,找谁说理去。

再看段对话:

  • 小白:“哥,我做的那个模块总是有bug,调试两三天了,一直找不到原因,您有空帮我看看呗。”
  • 大牛:“走”
  • 来到现场。
  • 小白:“您看这…”
  • 大牛:“别急,从头开始把错误给我演示一遍”
  • 小白:“好嘞”
  • 一个小时过去了…
  • 小白:“我call,怎么不出来了呢?大哥,我发誓我找你之前还复现过一次错误”
  • 大牛:“没事,我已经习惯了,等再出错,保留现场,call我”

然后就没有然后了,因为再没出过错!

大牛只要头皮更出众,那就bug去无踪,所有的大牛都有这样的体验。我理解大牛都是有超自然的气场,常年抓bug,戾气太重,bug都吓跑了!不管你们信不信,我反正是信了。这就是最高境界,什么都不用干,坐在那儿喘气就能解决问题……

编程的技术

说完前面那些思想和层次,现在咱们来谈点真正有用的编程技术。

编程有着悠久的历史,大约在137亿年前,奇点大爆炸,咱们人类不幸处在这个由时间和空间组成的万恶世界,空间可以理解为除时间之外的一切,时空之间不断相互转换,对称规则让整个世界动态守恒。闲的蛋疼的意识们企图把这个混沌的世界按自己的想法有序化,世界则按规则自动产生了无序与之平衡。

说这么累的意思就是,程序员编程的一生都要与bug为伍,不要害怕它,也不要想着完全消灭它,而是想办法与它和谐共处,人bug合一。

第一就是尽量减少bug产生的机率。毕竟人少了才好相处,人太多了则很难伺候。谈过女朋友的,应该都有体会。你每敲一次键盘,都有可能产生bug。所以,每次敲代码时,应该多想想自己的祖国、各族人民的福祉,董存瑞、刘胡兰等民族英雄的期许,还有自己父母的厚望,这次键击是不是真的对的起他们!都说头上三尺有神灵,但咱们程序员头上三座大山全是虎视眈眈的bug,你稍不留神,它们就会顺着键盘潜入到你的代码里,且按且珍惜。

第二,让bug举步维艰,无处遁形。败兵先战而后求胜,胜兵先胜而后求战。经常打败仗的人总是先打再说,然后企图侥幸取胜;而常胜将军都是先不断创造胜利的条件,已经胜券在握了才开战!编程的基本技术就是要编写低bug代码,一切为了debug,所有的代码都要为调试做好准备。说这些战术级技巧的理论只会隔靴搔痒,后面会结合具体的代码讲解,大家才会更有感觉,点到为止先。

编程的艺术

其实任何一门技术,上升到一定层次后,都会变成一门艺术。编程也是如此。

我们在这个时空世界里,都有自己的当前态和目标态,但无论哪种态都有自己的时空坐标,代码就是企图让这两个态的坐标重叠,而实现重叠的路径是无穷无尽的,但一定至少有一个最佳实现路径。代码的艺术,就是实现这个路径的策略,在空间与时间之间做权衡,要么时间换空间,要么空间换时间,变换到下一个态,不断重复这个过程,直到到达目标态。换成人话就是:所有的代码客观上只有特点,主观上的优点和缺点其实都是程序员意淫出来的,优点都是用缺点换来的,缺点都是优点导致的,优点和缺点实际上是一回事,只是意淫角度不同而已。

比如,总有人说UNIX/Linux比Windows更安全,而这根本不是技术的问题,而是艺术的问题。UNIX/Linux是个悲观型操作系统,假设用户都是坏人,系统默认什么都不能干,除非明确指出这个用户能干什么;而Windows是个乐观型操作系统,假设用户都是好人,系统默认什么都能干,除非明确指出这个用户不能干什么。所以在默认情况下,UNIX/Linux适合做机机交互,典型应用于服务器,而Windows适合做人机交互,典型应用于个人计算机。但这些特性都可以通过配置安全选项,把Windows操作系统变的比Linux/Unix操作系统还安全,也可以把Linux/Unix操作系统变的比Windows操作系统还不安全。这都是艺术的事,与技术无关,但比技术还重要。

代码的艺术性范围很广,包括但不限于默认值、参数、接口等具体设计,这些都可以在后面的代码讲解中让大家好好爽一把。

编程的术术

艺术是技术的抽象,术术则是艺术的再抽象,这部分内容我将尽量说人话。

我理解程序员在编程的时候,要意识到这些代码是面向开发者的,面向你的同行,是给他们看的。代码在举手投足之间,要透露出一种优雅的美,人见人爱,花见花开,车见车爆胎的那种。

举个例子:在做一个功能时,发现微软提供的系统API在某些特定条件下,返回值错误。怎么办?

基层小鬼:匹夫之勇,自己重新实现一遍该API的功能,结果是除了测试路径能覆盖的条件外,其他条件下全是bug。

中层干部:骚人墨客,给微软报告这个bug,等待官方临时解决方案,合规但官僚。

高级货:清风仙骨,给微软报告这个bug,但顺手写下解决方案。前置侦测代码,检测此API是否已修复这个问题,如果已修复则正常执行,否则执行纠偏代码。这样无论是现在还是以后,这段代码都可以稳定正确地运行!万花丛中过,片叶不沾身,这就是优雅。

终极杀手:不讲武德。还记得前面说的那个靠喘气就能解决问题的主吗?他会怎么解决?他就不解决!对,你没看错。他选的技术路线都是用5到10年前的API,坑都已经被小白鼠们填平了,他压根儿就碰不上这种破事。最优雅的美就是你看不出他哪儿美,但他就在那儿闲看庭前花开花落,漫看天外云卷云舒。

 未完待续……