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

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

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

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


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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

从《庖丁解牛》谈谈学习编程相关推荐

  1. 用我的亲身经历来谈谈如何快速学习编程

    老实说,学习编程的确不是件容易的事,需要你有一定文化基础.足够的逻辑思维和持续学习能力.因此,你如果是个不爱思考,无法静下心来打持久战的人,那还是洗洗睡吧.如果以上条件你都具备了,那么恭喜你,你可以考 ...

  2. 想学习编程,该怎么开始,需要多长时间?

    想学习编程,该怎么开始,需要多长时间? 其实学编程也没有啥特别的方法,和我们没基础学驾照差不多. 考A照.B照还是C照,我们先得拎清,它们的用途存在一定差异 .一样的,学编程是学C,Java.Pyth ...

  3. 《刻意练习》:以学习编程为例

    <刻意练习>是一本神奇的魔法书,它用大量的事实案例和数据来证明了刻意练习能给一个人带来的巨大改变.更为难能可贵的是,它不仅仅只是介绍刻意练习的好处,还给读者介绍了刻意练习的方法和注意事项, ...

  4. 如何高效学习编程技术?

    通过这段时间的看书学习和对编程的思考,结合自己的亲身的学习经历,今天想和大家聊一聊如何高效学习编程技术. 我们可以把学习编程技术的人分为下面四种情况. 第一种是既懂方法又努力的,学的又快又好,但大家会 ...

  5. 用十年教会自己编程_什么学习编程实际上教会了我

    用十年教会自己编程 by Zubin 通过Zubin 什么学习编程实际上教会了我 (What learning to code actually taught me) I have to admit ...

  6. 为什么您不需要精通数学就可以学习编程

    by Pau Pavón 通过保罗·帕文(PauPavón) 为什么您不需要精通数学就可以学习编程 (Why you don't need to excel at math to learn how ...

  7. 免费学习编程的10个好工具

    互联网时代的快速发展,很多人都在学习编程技术,小编今天为大家推荐的就是学习编程技术会用到的一些编程工具,免费学习编程的10个好工具!希望能够帮助到正在学习的小伙伴们. 免费学习编程的10个好工具: 1 ...

  8. 学习编程能够从事哪些行业?

    一直在谈如何学习编程,学习Java,C/C++.Python等一些前景良好的东西.可能有些人会问,那我们学编程能从事那些工作呢? 01互联网企业 最直接的工作就是到一个科技企业做程序员,人家码砖头,我 ...

  9. 如果学习编程可以重来

    在过去的几个月里,我一直在学习用Objective-C编写iOS app,最后我开始理清思绪.这比我想象中要难很多,也花了太长时间. 我经常遇到困难.感到沮丧,修复bug比实际写代码要花太多时间.但是 ...

最新文章

  1. Android Studio系列教程三:快捷键
  2. find: paths must precede expression(转)
  3. hdu 4501(三维背包问题)
  4. 分治、贪心、动态规划的简单理解
  5. openal 基础知识4
  6. WinCE电源管理的简单介绍
  7. jquery --- 使用when方法等待2个异步事件结束后执行某一个函数.
  8. java中instanceof使用详细介绍
  9. 新颖的自我介绍_公众场合,如何做一个吸睛的自我介绍?
  10. VS2013过期激活,VS2013激活,vs2013序列号,VS2013密钥,VS013产品密匙
  11. 只需几步教你学会域名的使用方法
  12. 可汗学院公开课——统计学学习:47-61
  13. 相机快门和曝光时间的确定
  14. 原来ChatGPT可以充当这么多角色
  15. 铁道部网站登录难点分析
  16. 成语填空微信小程序,登录接口修复版
  17. java体系的中间件适用于go吗,Go语言经典库使用分析(五)| Negroni 中间件(一)...
  18. Flink任务链Operator Chains
  19. 三国演义告诉我们的60条真理
  20. 315道面试题【1】

热门文章

  1. 拍案叫绝的VBA MID函数用法
  2. 深入浅出mysql基础篇读书笔记
  3. 控制台卸载绿盾加密终端后,重启电脑就蓝屏错误代码0xc0000001,安全模式进不了,不重装系统如何修复?
  4. 7点 讲明白地图切片的概念与原理
  5. Premiere Pro之字幕特效(二十)
  6. BenchmarkSQL测试工具 对 DM 达梦单机数据库进行tpcc测试
  7. MATLAB:增加噪声,同时多次叠加噪声图和原图以及求平均图像(imnoise,imadd函数)
  8. 高清卫星影像数据下载软件
  9. InterSystems开发者工具编程大赛投票时间:为你心目中的最佳App投票吧!
  10. 音频编解码之G726