其次,接着我们一路历险般地来到了“高手是怎样练成的”的大殿堂里,这里不光有六级大阶梯,每层上都可以欣赏到他们的有招架式或无招心法哦。在我们心向往之、有如离弦箭般地企图飞扬之际,大师再次谆谆告诫道:“最高境界绝对不是你去编两行代码,或者是几分钟能写几行代码,或者是用什么所谓的可视化工具产生最少的代码这些工作,这都不是真正的高手境界。即使是这样的高手,那也都是无知者的自封。”大师的苦口婆心跃然纸上。
梁先生为我们开列了高手成长的六个阶段。奇文共欣赏,兹列于下:
阶段 |
描述 |
修炼法
|
说明 |
1 |
熟练使用某种语言阶段 |
可通过自学达到 |
表面的,如练武中的套路和架式
|
2 |
精通某种平台接口及语 言自身库函数
|
如可进行真实散打对练 真正地做些实际应用
|
|
3 |
了解某个平台系统的底 层 |
要有个好的学习环境,修炼、积累二、三年能达到。
|
具备初级内功,“手中有剑,心中无剑” 达到后难有境界突破,对大或难的软件无从下手。
|
4 |
直接在平台上的较深层 次的开发
|
修炼法未明确。 (思想转变不过,较难达到。)
|
能达此阶段,即进入了高层次,修炼高级内功,不受语言束缚,即使不会也只需简单熟悉即可手到擒来。如能修改 VxD 或操作系统内核
|
5 |
能全局把握设计一个较 大的系统体系结构, 从内核到外层界面
|
修炼法未明确。
|
“手中无剑,心中有剑” 达到后将不再局限于简单技术问题。能剖析市面上的任何软件,并能按自己的要求进行设计
|
6 |
最高境界,任何问 题即纯粹思路问题, 不是用什么代码就 能表示的
|
修炼法未明确(详情看下文)。
|
“无招胜有招“ “手中无剑,心中也无剑“ 达到对招数架式、散打对练能现学现用,真正的大师级人物。且看 Win32 或 Linux 无差别
|
我们先来看看达到出神入化境界的编程高手所具备的知识面和技能。 一, 某种语言及其自身的库函数 二, 某种平台接口如Win32 API 三, 平台系统底层的了解与开发如修改VxD或操作系统内核 四, 能从全局上把握和设计一个较大的系统体系结构(从内核到外层界面) 五, 最高境界,然后任何问题变成纯粹思路问题如看Win32或Linux无差别 这里虽然放宽了入门语言的条件,只需是“某种语言”就可以了,其实不尽然。既然老早就有前辈为我们设计了简单易学易用的BASIC语言,那我们何苦学C来着,径直从BASIC入手就行了,多简单省事。到修炼到第四阶段时再去摆弄C语言,那还不是“手到擒来”的事!可是仔细一想,如果真如此,在从第三阶段向第四阶段修炼时我们就傻眼了,BASIC能开发(修改)平台系统底层即操作系统内核及其内核驱动么?到那时我们才幡然醒悟:此路不通,还得重新入手。原来,后面是一层层加码限制着的,白高兴一场了。要想过第四关,至少要学会一门系统语言才行,看来也最好遵照“从C语言入手”这个“入门最基本的方法”了,所幸的是,这回我们总算押对宝了,因为后面梁先生虽然说“其实,C语言本身和BASIC没有什么两样。”但人家随即就绝对肯定地说道:“C语言就是入门的正确方法,没有其他。”好险啦,其他的路子一下子全被封堵了,不然又要重新入一回手了。凭着对C++的爱好,本想推荐从C++入手的,因为至少它也是“某种语言”,而且又是一种系统语言,至此也只好作罢了。最后我们终于知道梁先生的“某种语言”的微言大义了。 如此看来,“某种平台”恐怕也要深挖才行了。从梁先生的前言和举的例子,如Win32 API,VxD等来看,以及后面的“Windows”运行机理“等,这个“某种平台”是什么就不言而喻了,倘若不信的话那也几乎就“没有其他”的了。因为,那也总不能是乱打花括号的不规范的“垃圾代码”及“烂程序”Linux罢,也不大会是“厂商做好给自己用”的UNIX罢,至于其他恐怕希望就更渺茫了。最后还罗嗦几句也许是必要的——苦口婆心也曾偷学到一点点的,就是,选择了Win32之类的系统平台,跨过第四阶段也就顺理成章了,理由上面也已经说了,即Linux这些垃圾代码自然入不了高手的正眼的,到那时也就只有一枝独大,自然“Win32或Linux在你眼里是没有什么差别的”。 至此,在梁先生的教导下,我们总算对高手修炼有些“开悟”了。 我本以为过了操作系统内核这一关后该是深入到其下的硬件平台即cpu结构体系了,可是梁先生这里忽然意外地止步不前了,真令人有点措手不及之感,高手的思维也不是常人能猜得着的。何以断定止步不前?因为按照梁先生的逻辑,熟悉了一门语言后其他语言自然就“手到擒来”,同样道理,熟悉了一种操作系统内核的“比较深层次的开发”后其他操作系统自然也就“手到擒来”不在话下了,既然不深入到cpu结构体系了,那么到这里对一个编程高手说基本上是功成圆满了。那为什么还要一个第六阶段呢,因为没有第六阶段你就永远还没有“过龙门”,永远还在第四阶段(第五阶段的奥秘暂且搁下不表)里摸爬滚打,即永远还未超出第四阶段,所以形式上需要一个新的阶段,其实是一个哑(dummy)阶段,其奥妙就如同C语言的字符串尾NULL字符一样——到这里就知道是已经修成正果了,好一个NULL的无极的最高境界! 现在说说第五阶段大概是什么回事了。上面我们知道,其实第六阶段早就该在修炼完第四阶段出现了。之所以羞答答地拖到第六阶段,是为了中间硬插入一个系统体系结构阶段,其实这个插入不插入都大抵一样的,对编程高手来说,这大抵只是在戴着编程高手的皇冠之后再来一顶系统架构师的高帽子而已,戴与不戴其实都无损于编程高手的徽号。因为这大抵只不过是理论而已,“对待软件要有一个全面的分析方法,光说理论是没有用的。如果你没有经过第一、第二、第三、第四这四个阶段,则永远到达不了高境界。因为空中楼阁的理论没有用,而这些必须是一步一步地去做出来”。 这里所谓的“分析方法”似至少应将第一、第二、第三、第四这四个阶段纳入,并且为主要方面;至于第五阶段,似乎就没有这么好的待遇了,盖为后娘所生耳。 至此,我们终于明白些了,原来是,只从C语言入手,熟悉C语言的自身的库函数,了解Win32操作系统内核及其比较深层次的开发,额外再加上一个比较大的系统体系结构如“MS Word”这样的大型软件的把握和设计。此书正是为此而准备的,额外还赠送一个“认识cpu”的“大餐”,这些正是“我十几年来”的经验与精髓。真是“千呼万唤始出来,犹抱琵琶半遮面”,终于有点像“把我所了解的东西和盘托出”了。这个“和盘托出”来得好不容易! 再看这个“和盘托出”其实还有点猫腻的,因为真正的“和盘托出”却不是从C语言入手,不是这里传授的从某种语言到某种平台的行进路线(本想再延续到认识cpu的,忽然记起这是被琵琶遮住了,因此也就没有挂上名号),而是“从cpu入手到Windows体系,到接口方式……”,该书的行进路线倒是真的像前言那样“和盘托出”的。 深深浅浅浅浅深深,挥洒自如,高手真的不愧为高手!这样的高手大概不止是“比较少”,应该仅是“更少了”的位居方塔形这种断层的不良结构的最顶层上的高手们吧。岂能是“橄榄型的人才结构”所能形容的。 当修炼到第四阶段后,“这时已经不再有语言的束缚,语言只是一种工具,即使要用自己不会的语言进行开发,也只是简单地熟悉一下,就手到擒来,完全不像第一阶段的时候学习语言的那种情况。” 在第一阶段学习某种语言后,再到后来学习其他语言时就“手到擒来”了。在一定意义上,语言正是一种工具。不过,要想一律对其他任何语言都“手到擒来”恐怕没有那么简单。就以“没有什么两样”的“C语言本身和BASIC”来说吧,你先学习BASIC语言,然后再去“手到擒来” “没有什么两样”的C语言看看;更别说再去“手到擒来”C++、C#、Java等语言了。也只有我们的出神入化的编程高手敢大言不惭地夸下这个海口。想凭借一门语言轻而易举地掌握其他任一语言的时代早已过去了。 偶尔翻阅《大道至简》,看到这样的文字:“当你熟悉了一门语言之后,你会发现,编程语言只有喜欢不喜欢的问题,没有会不会的问题。任何一门语言,你都可以在两周内掌握并开始熟练编程。因为任何一门语言,它们的底层函数库都是那样相似,它们的API都是那样地依赖于操作系统。A语言里有的,B语言里基本也有。” “它们的API”?恕我孤陋寡闻,我还是第一次听到语言除了它们的底层函数库之外,还有“那样地依赖于操作系统”的“它们的API”。既便有罢,怎么能凭“都是那样地依赖于操作系统”就断定“A语言里有的,B语言里基本也有”呢?“那样地依赖于操作系统”Windows的A语言里的API,竟在“那样地依赖于操作系统”Linux的B语言里基本也有,这也许有罢,但现在天下的操作系统“们”还远没有大一统呢,恐怕难呐。 至于说到语言的底层函数库,如果没有弄错的话,BASIC这种解析语言基本上没有那样的底层函数库(其下是解析器)。汇编也基本上没有那样的底层函数库,因为它已经够底层了,再底层下去一点点就到赤裸裸的机器语言了。 如果说“带有贬低编程味道的软件工程书籍”的《大道至简》这么说还在情理之中,而我们的编程高手也这么认为,那么编程的根本与精义恐怕要改为“顺序、分支和循环”了,并且“仅仅就编程序来说,实在是一件很简单的事,甚至可以说是一种劳力活。”恐怕只有不是真正从编程到工程、或虽从编程到工程但早已忘本的“工程”者才这么贬低、轻率、武断罢。如此看来,那里还会有什么层层修炼、出神入化的编程高手的神话呢!在中国,冒出的一个个“高手们”夸下的海口似乎一个盖过一个,语不惊人不罢休似的,不知道为什么,已经成“高手”了,一个个语言都被轻易地一手“罩住”了,它们还想罩住什么? “一般对于一个问题,初级程序员和高级程序员考虑这个问题的方法绝对是不同的。比如,在初级程序员阶段时,他会觉得VB也能做出应用来,且看起来也不错。但到了中级程序员时,他可能就不会选择VB了,可能会用MFC,这时,也能做出效果不错的程序。到高级程序员时,他绝对不是首先选择以上工具,VB也好,VC也好,这些都不是他考虑的问题。这时考虑的绝对是什么才是具有最快效率、最稳定性能的解决问题的方法。” 真是处处非要显出足够高级的来不肯罢休。口口声声的商业化软件、程序,却是不计成本地、不顾要求与目标地去追求完美、追求快和稳了。真正的高手的水平大抵还不是体现在一味地追求这些性能和效率方面。除了极少数对稳定性、效率要求苛刻的情形外,大多数的软件系统首先考虑的决不是“具有最快效率,最稳定性能的解决问题的方法”。一个连正确性都不能做到的软件系统,即使再“最快”再“最稳定”也是比不上只有初级或中级程序员才会选择的“用MFC”或“用VB”等做出的正确的应用的。“让一个正确的程序更快速,比让一个快速的程序正确,要容易的太多、太多。”“使事情复杂的行为,包括优化,总是以后进行的——而且只在必要的时候进行。”“不成熟的优化是万恶之源。” 顺便想问一问,这样的高级程序员,是梁先生公司里的高级程序员么? 自然,真正的高手也不在于是否对“VB”和“MFC”等不屑一顾。“语言只是一种工具”,这回总算说对了,是的,语言首先是一种工具,不过“还是一个具体的解决方案——是人对实际中所遇到的问题的回应。”从大的方面看,它们或者有着不同的设计目的与所要解决的问题,如Fortran语言主要为解决科学计算,而COBOL语言则主要面向商业应用,C语言则是一种通用的系统语言,等等。虽同为工具,还是不能一概而论的。 “程序员到达最高境界的时候,想的就是‘我就是程序,程序就是我’,这时候我要做一个软件,不会有自己主观的思路,而是以机器的思路来考虑问题,也就是说,就是以程序的方式来思考程序,而不是以我去设计程序的方式思考程序。这一点如果不到比较高的层次是不会明白的。 ......在我设计这个程序的时候,相当于我‘钻’入这个程序里面去了,这时候没有我自己的任何思维,我的所有思维都是这个程序。它这步怎么走,下步该怎么走,它可能会出现什么情况。……是否要干扰…….它们之间是怎么相互影响的?也只有达到这个境界,你的程序才能真正地写好,绝对不是做个什么可视化。可视化本身就是‘我去设计这个程序’,而真正的程序高手是’我就是程序‘,这两种方法是绝对不同的。比如我要用VB去设计一个程序,和我本身就是一个程序的思维方式,是不一样的。别人也许觉得操作系统很深奥,很复杂,其实,如果你达到高手状态,你就是操作系统,你就能做任何程序。” 到达最高境界,“不会有自己主观的思路,而是以机器的思路来考虑问题“,原来如此!以机器的思路来思维,无怪乎软件蓝领更像传统产业工人了,不,软件白领、编程高手都成了机器了,软件蓝领就更不在话下了,他们最后凝定为一部机器。多么奇妙的开放性思维!连编程高手似乎也不再像艺术家了,倒更像传统产业工人了,更辉煌的是终于可以互换“机器”了!到那时,软件人才市场恐怕要改叫软件人才批发市场了,软件人就可以像机器一样陈列在批发市场里等着互换、交易了。到那时,高手们带领着其下的“中手”“低手”们都发展到“自我消亡”的历史阶段了。 其实,在这些表面的玄虚之后,无论怎样的“钻”入,我都不可能以机器的思路来考虑问题。“计算机基本上是简单的,它只是能做很少几种操作。……问题是我们并不希望计算机做简单的事情。我们希望‘机器’帮助我们做那些难以完成的事。但是计算机是挑剔的、无情的和不会说话的东西。”《大道至简》所言也极是,“所谓编程实际上是把一件事情交给计算机去做,你认为这件事该如何做,就用‘程序语言’的形式描述给计算机。如果你原本就不明白如何去做,那么你也不要期望计算机去理解你想要做什么。所以编程的第一要务是先把事情分析清楚。”这里说得明白极了,所谓的“钻”入或“以程序的思考方式来思考程序”,至少是:第一要务,先把事情分析清楚;第二,用“程序语言”的形式把这件事情交给给计算机去做。这时如果“没有我自己的任何思维”是办不到的。不过另一方面,这也许是对的:大概“这一点如果不到比较高的层次是不会明白的。” 在我设计这个程序的时候,“我的所有思维都是这个程序",“以程序的思考方式来思考程序”。 在你设计这个程序的时候,程序还没有出生呢,它正是需要设计过程才能产生的,正是设计过程的结果(成品或半成品)。而一开始设计时我就摒弃了我的所有思维只剩下这个程序了,而这个程序竟然就已居我的思维之中了,并成了唯一,可是在设计之前、之初,这个程序是怎么产生的呢?现在恐怕得程序自我产生、自己显现的罢。听梁先生布道了半天,原来兜绕了一个大弯又溜回到了原地!并称这就是所谓的最高境界!真是发前人所未发的。事实上,由于事物本身的复杂性、多样性,由于人的思维认识的复杂性、多样性,由于人的个性、差异等,由于程序设计语言的发展日新月异,由于设计理念、方法、技术等的不断发展,等等,程序设计正是有着广阔的创造性的天地,虽然尽管也不能抓住自己的头发企图离开地球,不能仅仅为“高手而高手”。 “到2005年以后,中国软件这个行业的门槛比现在还要高很多,与美国不会有太大的差别。此时,中国软件才真正体现出它的威力来。如果你是这些威力中的一员,就已经很厉害了。” 没想到“一再强调耐心”的梁先生,断定就在2003年过了两年之后中国软件这个行业的门槛“与美国不会有太大的差别”了,并且,“此时,中国软件才真正体现出它的威力来。如果你是这些威力中的一员,就已经很厉害了。” 中国软件的威力真正体现在那里呢?“就已经很厉害了”的“这些威力中的一员“们又在那里呢?不过,“此书写作之时正值IT业狂躁之际”,也许是罢,不过总觉得还少点什么。 接着梁先生在下面的插曲里对“公司越来越大,而别的公司只火一阵子,他却火了还会再火”的比尔.盖茨恭维了一大通,莫非梁先生在做“战略决策”么?无论怎样,比尔.盖茨总值得正面意义上的“恭维”的,不过——。最后总结道,“就算微软再庞大,你如果不能把握软件技术的最前沿,一样也会玩完。就像Intel时刻把握着cpu的最新技术,才能保住自己是行业老大。技术决定它的将来。” 现在又变成唯技术论了,以前的商业化过程那里去了。程序≠软件的调子又那里去了。 “程序员是吃青春饭的吗”?“很多人都认为程序员是三十岁以前的职业,到了三十岁以后,就不应再做程序员了。现在的很多程序员也有这种想法,我觉得这种想法很不对的。” 梁先生教导的极是。 在谈到微软里面的那些高手有耐心、没有任何难度和压力地“每一步技术他都跟得上”时,梁先生解析到,“因为计算机技术没有任何时候是突变的。它的今年和去年相差不会很大,但是回过头来看三年以前的情况,和现在的距离就很大。” 随着年年辞旧迎新之际,梁先生也把参照点一起辞旧迎新了。自然,年年“计算机技术没有任何时候是突变的”。如此说来,技术浪潮一浪接着一浪,自然年年也“没有任何时候是突变的”。真是出神入化的境界。 我们来欣赏一下梁先生给我们描绘的、也是我们程序员们所向往的高手境界之魅力与美好未来吧:“每年都跟着技术进步”,“时刻都能掌握最新的技术”,“但是,如果你落下来,别说十年,就是三年,你就赶不上了。”尽管此前有此担忧,不过我庆幸的是“实际上技术到达最高的境界后,是没有分别的”,“看到世界最新技术就能马上掌握,马上了解。”“任何东西都是相通的。”“只要你到达这个境界以后,什么问题一看就能明白,一看就能抓住最核心的问题,最根本的根本……做到这一点后才算比较成功”(还是够谦虚的)。“事实上,会做程序后,就会有一种分析问题的方法,学会怎样把问题的表象剖开,看到它的本质。这时你碰到任何具体的问题,只要给点时间就能轻而易举地解决。实际上对开发计算机软件来说,没有什么做不了的软件,所有的软件都能做,只看你有没有时间,有没有耐心,有没有资金做支撑。”当然技术问题自不在话下,更无需用资金做支撑,不然,高手不就成了被资金吹大的了么。 再欣赏欣赏梁先生的现身说法: “我要时刻保持技术的最前端,这样的话对我来说是不困难的,没有任何累的感觉”。当然啦,有着出神入化境界的高手,任何问题、任何具体的问题都是不成问题的,不仅如此,任何软件也是不成问题的(至少是技术上的),前面已经说过了。而且“实际上是没有年龄限制的”。只要一朝成为高手,自然是“手到擒来”,就从此一劳永逸了,哪里用得着去“晚上熬夜”、去“黑白颠倒”呢,更不用说“每天”了。自然“一直玩到退休都没有问题。” 我们好好地继续修炼吧!没有什么能挡住的。高手成长的圣殿训示已过,再一次的其次,接下来就是“正确的入门方法”了。我们终于等到这一刻了,阿门。