为什么说思想高于语法

在普通人眼中,一名程序员懂的语言越多,做出的界面越华丽,很大程度上便意味着他的编程水平越高,但是从软件工程师的角度来说,只从语言、GUI编程这些角度并不足以窥之全貌。语言只是程序开发相对低层的东西(与“底层”有所区别),语言就像工具,和扳手、钳子一样,会用它们只是干活的起始,语言又跟英语差不多,会说Hello World不代表你能用英语和人探讨人生哲学了,相反,语言是基本关,是程序设计的必要条件。

Pascal之父,结构化程序设计先驱Niklaus Wirth提出了那个经典的等式:Algorithms + Data Structures = Programs. 事实上在程序设计、架构设计的过程中,很少会去考虑相关的语言细节(Don’t care for the implement, just design!),当然我会考虑这样的设计采用什么样的语言、哪种框架来做可行且对我来说最高效。这两年脚本语言大行其道,不是因为它们的功能之强大可以超越其它任何语言,恰是因其高效,生产力不仅可以用来衡量程序员,也可以用于评估一门语言。没有最好的语言,只有适合的语言,好的开发者应当懂得因地制宜,用最恰当的手段最高效地解决眼前的问题。

武侠小说里的剑客们最厉害的地方绝不是他们拿着什么神兵利器,而是剑法,好的武器固然可以提升战斗力,但是高手过招,一击必杀,往往剑尚未出,胜负已定。

前段时间Google公司首席Java架构师Joshua Bloch接受采访时曾把程序员选择编程语言比作是选择酒吧。

“选择一种语言时,所考虑的不仅仅是一系列技术上的权衡,而是在选择一个社群。这就像选择一个酒吧。没错,你希望去一个提供美酒的酒吧,但是美酒不是最重要的。主要是那个酒吧里都有什么样的人,他们在谈论些什么。选择计算机语言也是这样的。时间一长,就这门语言也形成了一个社群,社群里不仅仅有人群,还有他们的软件成果,如工具、库等。”

与人的接触中最大的交流是什么呢,是思想,是方法,一个成熟的程序员不会整天纠结于语法糖,因为那实在是一件太不值得投入的事了。在于人交流的过程中,我们学习到更多解决问题的方式,包括读书也是。为什么强调不要光盯着一种语言不放?一种语言便是一种思想,是一种解决方案,它们之所以各不相同是因为各具特色。这里说的不是不同语言的不同语法,语法虽然各异,但差异更大的是思想,换句话来讲,你完全可以用A语言去实现B语言的很多特性,A语言的一些用法也完全可以在B语言里套用,语法虽然不同,但是思想高于语言。

好的程序员应该时刻提醒自己不要试图用一种方式解决所有问题,这里包含两点:1、采用不同的工具;2、用同种工具但多种不同方式。这可以拓宽人的思路,并且我们可以有更多的选择,选择多是件好事,大家可以讨论、筛选出最合适的方案,怕的是别无选择,不免让人感到被动。

初学语言的语法之后,再看的书大多就是关于思想的,学习大师的思想,学习前人解决问题的经典算法,这时我们常常会发现书中的代码甚至比语法书里的要“简单”得多,大师们总是尝试用这些简单的代码最简洁地说明思想。初学者和熟手的区别在于,新手容易陷入代码细节中去,而熟手可以在更高的视角上,反观代码,抽象出层次,代码呈现出另外一种结构,更深地思考这种设计的用途和原因。

另外一方面,编码的时间已经被压缩得越来越短。在《梦断代码》中,某公司的统计数据标明,项目的实际编码时间往往不到项目总时间的10%。此外,好的设计和架构通常可以最大程度地简化代码逻辑,也只有好的设计才能帮助程序员以最快的速度编写出优良的代码。在这个意义上,编码已经成为一种翻译,将算法和实现方式翻译成程序语言。

可见,锤炼自己的思想才能使自身得到本质上的提升。有人说过,外语演讲比赛中,评委们对语言流利程度的关心在其次,最关键的是看演讲者讲话是否有内涵,是否包含深刻的思想。那些才是一个人风格和能力的真实体现。

关于学科沉淀,王建硕曾经在博文中写道:

“不同人的大学经历差异很大,但这一段经历,和其他经历一样,与一些能力的相关性还是很大的。在经历它的时候,常常以丑陋,无聊,和迷茫的形式出现。大学教育教会我们的东西,不总那么显而易见。”

的确,很多学科在我看来都属于沉淀性的学科,例如编译,例如组成原理,再例如网络。也许某些人这辈子都不会去专门做编译器或是做嵌入式或是组网,但不可否认的是,这些学科提供的最大的帮助在于让人在潜移默化中学到了更多解决问题的经典方式,看看前人遇到问题是是如何处理的。谁说学科之间没有交集呢,这里的交集很大程度上取决于自身对知识的领悟和变通。

开拓视野自然也是一种发散思维的好途径,试想如果没有Lisp那样的函数式编程,我们现在很可能还没有MapReduce。而MapReduce的C或Java实现也印证了我之前所说的,尽管语言语法各异,但思想高于语言,学明白思想,我们就总能有办法在自己的领域里实现它。

前些日子有个朋友跟我说想学习编程,并强调他绝不会去学Java,因为学Java的人现在实在是泛滥了,有民工化趋势。我最感兴趣的是这里“会”Java究竟有多“会”?如果不懂面向对象的思想,对程序员来说,接口和抽象类还有没有那么大的价值和作用?如果不懂设计模式,程序员能不能理解为什么java.io包里要有那么多不同类型的流?如果不懂重构,代码的复用性和可维护性又有几何?

更直接地说,用面向对象语言写出来的程序,未必是面向对象的程序。

语法终究没有那么难,但是会写字不代表会写文章,会讲话不代表会发言。程序员是写代码的人,而非打字员。更好的思想让软件工程师可以做出更好的设计,并以最高效的方式将其实现。这里的高效取决于两点:第一,技术人员思维的广度,包括其知识面,包括其在平日生活中潜移默化沉淀积累下来的东西;第二,对工具的熟悉程度,这里的工具不仅仅是语言,还包括对以前代码的复用等诸多方面,框架本质上也是复用,且不仅仅是代码复用,还有思想的复用。

在《程序员修炼之道》一书中提倡每个程序员每年学一门新语言,学新语言不单单是为了去用,更是开拓思路的一种方式。什么算是真正懂得一门语言呢?很难说,但起码你得知道它和别的语言不同在哪,它的优势又在何处。

我很不喜欢某些人说的C/C++或者汇编打遍天下的论调,语言在不断发展,不仅是用户有需求,开发人员对语言也有更高的需求,什么都会变,不变的是发展的脚步和前进的方向。

为什么说思想高于语法》上有5条评论

  1. 有道理!
    不过我一开始看到题目的第一反应却是对该命题的否定,因为数理逻辑的抽象出的形式结构远远比命题本身蕴含的意义更具有扩展推广的作用,看完文章才知道不是一回事。

    [回复]

    Hesey 回复:

    @free_all_POC, 呵呵,幸好我不是标题党:)

    [回复]

发表评论

电子邮件地址不会被公开。