编程语言的发展和自然语言是相似的,根本上都是以满足沟通需求为驱动力的。其中也不乏沟通的障碍,这里做个简单的探讨!
1. 语言是什么
语言是沟通工具,是为了交流信息而产生的。(语言包含说和写两个方面,这里主要探讨写。)
从结绳记事到现代语言,语言(包含文字)的每一次变革都是为了促进交流而进行的。最初是不需要语言和文字的,没东西可记。 再后来,打到的猎物多了,有些东西需要记下来,以便总结经验,所以在草绳打结表示一下。这就像二进制的机器码。打个结表示1,没有结为0。在一条绳上打结和以前在纸带上打孔是多么的相似。
后来,物质丰富起来,部落间的交流产生许了问题,可能需记下礼尚往来,甚至战事等事情,打结肯定会把人搞糊涂了。于是聪明的人类发明了象形文字。象形文字是少数人的专利,而且不通用。这就像是汇编语言,各系统下的指令集不同。他们有个共同特点,难读!当然也有牛人至人仍对使用汇编语言写程序而津津乐道,也正说明那是少数人的专利。
继续发展,要记录的事情越来越多,人与人的交流也日益密切,表达方式越来越丰富。纸和印刷术的出现促进了文字的发展,文言文的推广,都大大促进了语言的发展。这个阶段相似于高级语言出现的时代,如C/Fortran等等。但是整篇之乎者也的文言文和日常生活太远,所以到近代又开始出白话文,因为这更接近于人的日常思维。对应的Java/C++的时代来临了。
(OOP更加切合人的思维习惯,最明显的例子就是社会分工细化后,人格独立、契约精神等就成了自然而然的事情。这些内容都被体现到了编程语言的发展上了。)
如果现在朋友聚会,你站出来要给大家默诵一篇《如梦令》,要么被令人仰慕,要么被人鄙视。但一见面就要来一篇,那肯定只有鄙视了。因为这已经不是良好的沟通方式了。听众的需求决定了你应该怎么说话。而写代码时,强调编码标准是不是也一种需求?
经我这么一拉扯,编程语言和自然语言就变得十分相似了,本质上都是为沟通服务的,只不过前者的沟通存在两个构面:人与机,人与人。所以编程语和自然语言就将现实世界和软件世界连接起来了,也等同数学符号的作用。
2. 语言的沟通难题
既然是沟通,就一定存在沟而不通的障碍。
a. 语言差异
首当其冲的就是语言间的差异。语言不通就找个翻译嘛!所以软件世界里就有了各式的代理、IPC等等。为了达到同声翻译,就有了混编。
b. 方言
日常生活中遇到的方言的问题,在编程语言的世界里也时有发生。下面是我以前工作中遇到一个数据库字段名称,以拼音缩写命名:
[CJSJ]
你能猜到这是出勤时间(ChuQinShiJian)的缩写吗? 这样的字段还很多,我一直很困惑!后来终于发现原来系统的第一开发者是个四川人。
c. 混编
现在在口语中将中文与英文"混编"的人越来越多,特别是IT男。这在编程语言里也是很常见。再举数据库建表的例子(因为表与业务逻辑的对应关系导致它是高发地区):
CREATE TABLE [dbo].[Doormm] (
[Bh] [varchar] (3) NOT NULL ,
[Mc] [varchar] (8) NULL ,
[Mm] [varchar] (16) NULL ,
[Manager] [bit] NULL ,
[Report] [bit] NULL ,
[QzPass] [bit] NULL
) ON [PRIMARY]
初看,你一定是觉得和门(Door)有关系,里面还有经理(Manager)。第一个栏位应该是BianHao,来作主键的。
……
不猜了! 这个表的功能只有开发者才知道了。
d. 领域中专业词汇
另外在聚会时还会有所谓共同语言的问题,举个例子,下面这个笑话我婆看完后觉得很无聊:
某两程序员夫妻新婚,一年之后喜得贵子,起名“灵灵”;又过一年又得一女,起名“灵伊”;两年之后得子“伊灵”;复过两年,夫妻商定为得圆满最后再生一子,取名“伊伊”。不料产检发现所怀的乃是双胞胎,夫欲减胎,妻不允,冥思许久,对夫曰:“老五就叫‘忆初’吧”……
不懂这些专业名词,显然不知所云。这就是领域知识的专业词汇构成的障碍。再比如,一般都知道"Subject"是"主题"或"科目"的意思,但在统计学里面,它还有"受测试者"的意思。面对函数arrangeSubject()是不是很难"望文生义"呢?
e. 文法
最后,是文法问题。有人说话简洁清晰,有人则啰啰嗦嗦让人不知所云。还有一种觉得实在不知道怎么说,那就不说了。这叫一言难尽! 写文章也一样, 好的文章看起来行云流水,很顺畅!当然也有文章出现“此处省略500字!”!
把说不清楚的说清楚是科学,把不好说的说好是文学。关键是一个组织结构的问题。对应编程语言的世界里,这相关的词很多:结构化、设计、层次、抽象……
我们来对比一下HelloWorld 和 一篇日记:
HelloWorld.cpp int main(int argc, char *argv[ { int i=0; printf(" Hello, World! [%d] Do something else...... return 0; } |
早上,xxxxxxxx 帮助老大爷过马路 xxxxxxxx 啊,真是快乐的一天! |
结构上都有三个部分:
i. 交待条件
ii. 发现些一些事情
iii. 收尾,返回
结论:
Beck在<<实作模式>>中提倡的编码三个价值观:沟通、简洁和灵活。也确实很有道理。
把写代码当成写作,先求有再求好,然后思考别人看我的代码能看懂吗?有几个简单Tips:
a. 由上及下细化,
也就是写作时先有大纲的做法。
比如上班路上,思路可以简化为:下楼,坐车,步行到公司。然后再细化一些细节,对重要的地方,再加以修饰。
思维导图之所以受到重视,正因为它顺应了人的这种思维习惯。
b.学英语,抓关键字
当你看到一个词的时候,一定要想到它背后的知识图谱。就像Google推出的这个功能(LINK)。可以使用思维导图的方式记录下来,形成一个系统,非常有利于知识的掌握。
在国内,英文书的翻译经常可以看到有若干人。以赶工的方式,每人分一两章就开工了,然后起个惊世骇俗的名字就拿出来卖了。结果下来,翻出来书自然质量不高,更不用说能系统一点了。详细的讨论可以看这篇(程序员谈如何掌握计算机英语)。
平时花些时间学英语,尽量用英语来捕捉最新的资料,以免被误导。
c. 注重实践细节
养成好的命名与注释的习惯很重要。特别是注释,如果描述的不好,甚至没有和代码同步,它所造成的困惑可能会很大。这些信息可以<<代码大全>>中找到,可以看一下这篇资料(编码工艺:命名与注释)。
*顺便提一下<<代码大全>>和<<程序员修炼之道>>都是好书,但书名起得实在让人接受不了!