从《庖丁解牛》谈谈学习编程

时间:2022-10-24 18:01:50

从《庖丁解牛》谈谈学习编程

原文链接: http://zh.5long.me/2014/paodingjieniu/

本文谢绝转载,如需转载需征得作者本人同意,谢谢。

前一段时间读了《庄子》中的《庖丁解牛》,不说有多少感悟,联系到我们学习软件开发的一些方法技术,记录在此,一来巩固自己所学的知识,二来与大家分享一些个人体会。若有人能从中获益,那也是功德一件;若不得获益,茶余饭后,闲聊一下,也未尝不可。《庖丁解牛》语出《庄子·养生篇》,原文如下:


庖丁为文惠君解牛,手之所触,肩之所倚,足之所履,膝之所踦,砉然向然,奏刀騞然,莫不中音。合于《桑林》之舞,乃中《经首》之会。

文惠君曰:"嘻,善哉!技盖至此乎?"

庖丁释刀对曰:"臣之所好者,道也,进乎技矣。始臣之解牛之时,所见无非牛者。三年之后,未尝见全牛也。方今之时,臣以神遇而不以目视,官知止而神欲行。依乎天理,批大郤,导大窾,因其固然,技经肯綮之未尝,而况大軱乎!良庖岁更刀,割也;族庖月更刀,折也。今臣之刀十九年矣,所解数千牛矣,而刀刃若新发于硎。彼节者有间,而刀刃者无厚;以无厚入有间,恢恢乎其于游刃必有余地矣,是以十九年而刀刃若新发于硎。虽然,每至于族,吾见其难为,怵然为戒,视为止,行为迟。动刀甚微,謋然已解,如土委地。提刀而立,为之四顾,为之踌躇满志,善刀而藏之。"

文惠君曰:"善哉!吾闻庖丁之言,得养生焉。"


《庖丁解牛》是我比较喜欢的一篇古文,从文中可以看出古人所拥有的智慧。牛的结构无疑是很复杂的,而庖丁解牛,却能刀刀到位,游刃有余,十九年解数千头牛,所用之刀没有丝毫损耗。连文惠君也称奇。庖丁解释说,他所追求的是道,已经超过了技术层面了。何为道?道是没法用语言来表达的(道可道,非常道)。但在此处可以认为是牛的结构的自然规律,以及解牛的技术原理。牛的结构非常复杂,但都是由最基本的组织所构成,庖丁掌握了这个原理,抽象出了牛的基本结构,把整个牛的架构分析得非常清晰,正如庖丁所说"未尝见全牛"。在掌握了牛的架构后,再结合解牛的原理,"依乎天理,批大郤,导大窾,因其固然",再把所有的基本动作同化到自身,使这些技术动作成为先天的自然反应,从而做到"以神遇而不以目视,官知止而神欲行"。

文惠君听了庖丁的解释后,明白的养生的道理。可见古人的悟性还是挺高的。鄙人不才,姑且只能联想到学习软件开发的一些方法。

有道无术,术尚可求,有术无道,止于术。《数学之美》的作者吴军也说过,技术分为术和道两种,具体的做事方法是术,做事的原理和原则是道。良庖、族庖解牛采用割和折的方法都属于术,而庖丁解牛的指导原则是道。学习软件开发也是如此,使用某种开发语言,使用某种开发平台,使用某种架构或技术,这些都是术和工具。

那么什么属于道?以我不完全的认识道就是数据结构、算法、计算机和操作系统的基本原理、对代码的感觉、计算机语言的基本原理,编程的基本方法、对技术的敏感。

数据结构和算法:我不敢说算法没用,因为我对算法了解并不深入,用算法解决的问题也不多。但目前也正在实现一些算法来做一个项目(我主要是实现算法,不是设计算法)。我也不敢说算法没用,因为到目前为止,我还没用算法解决较大的问题,像搜索引擎、人工智能、机器学习、机器视觉似乎离我还很远。

计算机和操作系统的原理:我们做软件一般都是运行在某种操作系统和某种平台上。如果我们对自己生活的环境不了解,那我们将会遇到很多麻烦。程序也一样,在一个自己不了解的环境上运行程序,我们将会遇到很多奇怪的问题。懂得了这些原理,写的程序也将更强壮和高效。还能更容易理解各种架构,现在很多框架(如云计算的框架)也是基于这些基础的设施来搭建的,理解了基础原理,对于这些架构不但能知其然,还能知其所以然。

对代码的感觉:《代码大全》一书所说,编程既非完全的艺术也非完全的科学。它是介于二者之间的"工艺/craft"。编程至多也就是艺术与科学相互融合的一个工程学科。不管是艺术、科学、手艺,或是工程,编程需要大量的个人判断,需要对程序细微问题的警告作出反应。《黑客与画家》把程序员与艺术家等同。正如艺术家对艺术的感觉,程序员对代码也要有感觉,把对代码的感觉发展成先天的自然反应。

计算机语言的基本原理:关于计算机语言好坏的争论估计永远也不会停止。语言只是工具,用的顺手,就是好工具。不同的语言也确实有各自的特性,使用什么语言也确实会影响一个程序员的思维。《代码大全》告诉我们,要深入一门语言去编程,不浮于表面。不要将编程思路局限于语言所能自动支持的范围。杰出的程序员会考虑他们要干什么,然后才是怎样用手头的工具去实现。当我们接触到很多语言后,我们会发现,抛开某些语言的特性,不同语言的大部分都是相通的。这也很好理解,不管是什么语言,最终都要转换成二进制代码去执行。关于学习什么语言,个人推荐:

  • 学好C语言
  • 学一种当前自己项目需要使用的语言, 如C++/JAVA/C#/Objective-C等
  • 学一种脚本语言,如Python/shell等

编程的基本方法:编程的基本方法就如解牛的一些基本操作,如数据结构的选择,代码的逻辑,代码的组织,常用的设计模式等。这些技术需要通过大量的代码训练来获得。把一个大的程序分解了,也就这有这些基本的东西所组成。掌握了编程的基本方法,通过一定的训练,也能开发大的项目。

对技术的敏感:程序员接触的技术一般都是比较前沿的,当使用一种新的技术时应该要能很快就了解它,并把它加入自己的工具箱。写个几个软件后就会有这样的体会,在开始做一个软件的时候,我们对所要使用到的技术、框架、组件等并不完全了解,随着在开发的过程中不断看文档、试验、提问,对这些技术也慢慢的越来越熟悉。技术本身就有这样的特点,没有哪一个算法、哪一个模型能毕其功于一役。程序员需要在开发的进程中不断发现新的方法,评估技术,确定方案。有时还会推到重来。

最上乘的武功修行方法往往也是最简单的,就如少林寺的易筋经,其修炼方法是扎马步,但也需要沉心静气、长年累月的修行才能发挥它的威力。不积跬步,无以至千里。不积小流,无以成江海。掌握编程之道,加上技术层面的练习,就能像庖丁一样,游刃必有余,几十年后,自己的技术依旧没有过时。