「編程語言只是個工具杭攻。」很多人這樣說疤坝。
是的兆解,編程語言「只是」一個工具,但作為開發(fā)人員最主要的工具跑揉,編程語言的語法就是開發(fā)者的用戶界面锅睛。很大程度上,編程語言的風(fēng)格決定了開發(fā)人員的思維風(fēng)格历谍,編程語言的局限也會成為開發(fā)人員的思維局限现拒。所以我一直覺得,語言設(shè)計者是得學(xué)點心理學(xué)望侈,懂點用戶體驗的印蔬,可惜 PL 學(xué)界似乎很少見到這方面的研究(有個名字很好玩的不起眼的會) —— 我認為很多學(xué)術(shù)上很好的語言完全沒流行起來,可以歸咎于此脱衙。
編程語言還是個社交工具扛点,程序源代碼是開發(fā)團隊成員最主要的信息交流媒介(你什么時候見過程序員主動寫文檔了?)岂丘。所以陵究,就跟設(shè)計社交應(yīng)用一樣,設(shè)計編程語言可能還真得懂點社會學(xué)奥帘,UC Berkeley 還真有相關(guān)研究铜邮。編程語言決定團隊成員思維方式的同時,也決定他們怎么交流寨蹋、協(xié)作松蒜,顯著地影響了團隊文化。組建團隊已旧,準(zhǔn)備寫下第一行代碼的時候秸苗,選擇什么編程語言,也就不純粹是技術(shù)問題了运褪。
從這個角度看惊楼,一些設(shè)計得很糟糕的語言對團隊文化反而是有利的。比如 PHP, MIT Technology Review 的文章 Toolkits of Mind 里講述了它對 Facebook 的影響:它門檻低秸讹,而又能力局限無法支撐復(fù)雜設(shè)計檀咙,反而能夠鼓勵簡單直接解決問題,容忍不完美和丑陋實現(xiàn)的所謂 Hack 文化璃诀』】桑可以想象,來到公司劣欢,看著那一坨 PHP 代碼棕诵,你不會有類似看到巴特農(nóng)神廟的精妙設(shè)計的神圣感裁良,你不會空談什么設(shè)計模式,測試驅(qū)動校套,而是和所有人一樣趴久,逮著段代碼,一通胡改搔确,move fast and break things 去了彼棍。PHP 的反面就是我極端憎恨的 Java, 雖然門檻同樣低(也就是你會遇到同樣糟糕的開發(fā)者),但 Java 設(shè)計良好膳算,JVM 效率高座硕,足以支撐復(fù)雜的設(shè)計,也鼓勵復(fù)雜涕蜂、龐大的軟件华匾。就像 Java Shop Politics 里寫的一樣,Java 鼓勵復(fù)雜設(shè)計的同時机隙,其實也在鼓勵與軟件結(jié)構(gòu)一一對應(yīng)的層級蜘拉、僵化的管理。這么看來有鹿,如果誰拿刀架我頭上要我在 PHP 和 Java 項目里選一個旭旭,我還是去折騰屎一樣的 PHP 比較合算。
另一方面葱跋,一些特別強大的語言或語言特性也值得警惕持寄。Paul Graham 在 Beating the Averages 里盛贊了 LISP 語言,LISP 的強大來源于它的 macro 系統(tǒng)娱俺,你可以用 LISP macro 定義 DSL 乃至任何符合自己需要的語言稍味,這給他們這些聰明人帶來了無限的自由。但是荠卷,當(dāng)你的團隊擴大模庐,不可避免地招來了普通人的時候,情況就變化了油宜。LISP 這種無限定制能力是在鼓勵「魔法」—— 一種超越普通人理解的 LISP 語言常識的能力掂碱。運氣比較好的,上層管理者會順應(yīng)民意殺掉你的項目验庙;運氣糟糕的顶吮,你會發(fā)現(xiàn)社牲,團隊里越來越多的人會從嘗試?yán)斫饽ХㄞD(zhuǎn)到崇拜魔法而不求甚解粪薛,他們不可能通過發(fā)明新魔法來提高效率,而只會以懂得使用魔法為榮搏恤,它們的眼界和野心就被圈定了违寿。Java 沒有 LISP 這樣的能力湃交,但它有無數(shù)的魔法框架,你能看到一模一樣的后果藤巢。當(dāng)你來到一個團隊搞莺,面對幾十萬行的代碼,被告知掂咒,加上這個那個 Annotation, 你的對象就會被自動創(chuàng)建才沧,各種參數(shù)注入成功,你面對的就是魔法绍刮。你無從了解整個系統(tǒng)的架構(gòu)温圆,你無法解釋程序是怎么啟動運行的,無法找到一個接口的實現(xiàn)孩革,你甚至不知道你手上這個該死的對象到底是怎么被創(chuàng)建出來的岁歉,你在其他環(huán)境積累的編程知識根本無法解釋這一切。你只好老老實實地從「最基本」學(xué)起膝蜈,按照他們教的锅移,加上這么一堆 Annotation, 寫完這個類,如果有一天饱搏,你發(fā)現(xiàn)自己也能教別人怎么用這些東西了非剃,你難免也會沾沾自喜起來。
這些編程語言對團隊的影響推沸,也許不是必然的努潘。你可以在 PHP 里搞出超級復(fù)雜的框架,也可以在 Java 上做出簡單清晰的設(shè)計坤学,你可以很努力地在團隊內(nèi)部抵御工具的文化趨勢疯坤,樹立另一種文化。但是在今天深浮,你很難避免使用開源軟件压怠,圍繞語言的整個社區(qū)的社會氣氛就不是你可以控制的了。C++ 可能是難得的可以讓各個團隊建立自己的內(nèi)部規(guī)范飞苇,營造截然不同的團隊風(fēng)格的例子了菌瘫。C++ 超級龐大的語言集迫使不同團隊根據(jù)自身需要裁剪出不同的語言子集 —— 其實差不多是不同的語言了,導(dǎo)致 C++ 開源庫很難像 Java 庫一樣拿來就用布卡,讓團隊不受外界影響發(fā)展自己的小社會成為可能雨让,大概也算是因禍得福了。