天天看點

程式設計語言與自然語言

轉載請注明出處:http://blog.csdn.net/horkychen

程式設計語言的發展和自然語言是相似的,根本上都是以滿足溝通需求為驅動力的。其中也不乏溝通的障礙,這裡做個簡單的探讨!

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]\n",i);

   Do something else......

   return 0;

}

早上,xxxxxxxx

幫助老大爺過馬路 xxxxxxxx

啊,真是快樂的一天!

結構上都有三個部分:

  i. 交待條件

  ii. 發現些一些事情

  iii. 收尾,傳回

結論:

Beck在<<實作模式>>中提倡的編碼三個價值觀:溝通、簡潔和靈活。也确實很有道理。

把寫代碼當成寫作,先求有再求好,然後思考别人看我的代碼能看懂嗎?有幾個簡單Tips:

a. 由上及下細化,

  也就是寫作時先有大綱的做法。

 比如上班路上,思路可以簡化為:下樓,坐車,步行到公司。然後再細化一些細節,對重要的地方,再加以修飾。

  思維導圖之是以受到重視,正因為它順應了人的這種思維習慣。

b.學英語,抓關鍵字

平時花些時間學英語,盡量用英語來捕捉最新的資料,以免被誤導。

c. 注重實踐細節

 *順便提一下<<代碼大全>>和<<程式員修煉之道>>都是好書,但書名起得實在讓人接受不了!

寫得有些浮淺,歡迎指正!