官术网_书友最值得收藏!

推薦序3

一個(gè)程序員到底需要掌握編程語言的多少特性?

每個(gè)程序員每天都在跟編程語言打交道,但是很少有人愿意真正了解這些“老朋友”。有一些編程語言的行為非常反直覺,比如JavaScript中著名的“0.1+0.2 ≠ 0.3”的現(xiàn)象。它看似語言的bug,但實(shí)際上來自浮點(diǎn)數(shù)的精度問題。正因如此,任何計(jì)算機(jī)語言的浮點(diǎn)類型都有著相似的問題。

而有些語言特性其實(shí)根本就是設(shè)計(jì)失誤,尤其是對(duì)于一門只花了兩個(gè)星期來設(shè)計(jì)的語言來說。比如JavaScript中的雙等號(hào),它“踐踏”著一切的直覺,如“==”的傳遞性:

又如if(x)與if(x==true)的等價(jià)性:

所以我相信很少有程序員想要了解“雙等號(hào)兩邊數(shù)據(jù)類型不一樣的時(shí)候”的轉(zhuǎn)換規(guī)則到底是什么。還有一些語言特性很有必要但是非常罕見,比如在最新的JavaScript標(biāo)準(zhǔn)中加入了code point系列API,用來處理Unicode基本平面(BMP)之外的字符。盡管在我十年的職業(yè)生涯里,一次都沒有遇到過BMP之外的字符,然而這并不意味著它們不重要。

在你不知道的角落,一些你不知道的特性在被你用不知道的方式使用著。以前我在參與es-discuss郵件組討論時(shí),曾經(jīng)非常冒昧地建議“函數(shù)調(diào)用與其后括號(hào)間不得加入換行規(guī)則”(即no line terminator規(guī)則)。但是很快收到回復(fù),這樣做會(huì)破壞一些既有代碼,比如有一些奇思妙想的框架用下面的方式生成HTML:

這讓我意識(shí)到,語言設(shè)計(jì)需要考慮的情況是極端和復(fù)雜的,一些特性對(duì)某些人來說無關(guān)緊要,但對(duì)另一些人來說是生命線。

今天,很多語言特性決定了技術(shù)產(chǎn)品的走向,比如Vue 3.0,它非常依賴Proxy特性。比起getter和setter實(shí)現(xiàn)的Vue 2.0,它對(duì)模型的侵入性更低,邊緣case也更少。而從歷史來看,在過去的幾十年里,多數(shù)開發(fā)者只需要掌握他們關(guān)心的一部分特性就可以了,甚至可以躲在框架之上進(jìn)行開發(fā)。

現(xiàn)在情況正在發(fā)生變化。在TC39,一些將會(huì)陪伴你職業(yè)生涯數(shù)十年的新特性,正在被針鋒相對(duì)地討論,而支持或者反對(duì)它們的理由可能與你不太相關(guān)—你必須從整體上理解語言的設(shè)計(jì),才有參與其中的可能。即使多數(shù)程序員不需要參與這樣的討論,如今語言的更新速度也對(duì)程序員的素質(zhì)提出了更高的要求,從ES5到ES2018,語言標(biāo)準(zhǔn)的表述篇幅增加到原來的三倍,這樣的信息增長(zhǎng)速度堪稱恐怖。

所以,今天,編程語言學(xué)習(xí)的門檻客觀上提高了,唯有站在更高的視角,跳出語言本身的約束,才能更好地應(yīng)對(duì)莫測(cè)的未來。

我們討論或者解釋JavaScript的問題時(shí),大多會(huì)引用標(biāo)準(zhǔn)的描述,比如執(zhí)行上下文、變量環(huán)境、詞法環(huán)境等,但是這些概念始終在變化。然而若我們以結(jié)構(gòu)化程序設(shè)計(jì)的角度去看,不論是原有的函數(shù)級(jí)、全局作用域,還是新加入的模塊、let級(jí)別的作用域,都沒有跳出一般的結(jié)構(gòu)化的思路。所以說,底層不等于本質(zhì),我們從更通用的角度去看待JavaScript,就會(huì)更容易理解它。尤其是,JavaScript是追求實(shí)用性的語言,它并沒有試圖像Haskell、Rust那樣從語言角度做本質(zhì)創(chuàng)新。

在我和我周圍,很多前端工程師認(rèn)識(shí)周愛民老師都是從他在2007年左右發(fā)布的系列博文“JavaScript面向?qū)ο缶幊獭遍_始的。從那時(shí)候起,周老師對(duì)語言的研究就總是早于這些特性的大規(guī)模應(yīng)用。作為架構(gòu)師,周老師的思路總是能夠給我們前端帶來一些新的靈感。在這一次的改版中,周老師又為圖書加入了不少新內(nèi)容(比如關(guān)于并行特性的部分),我很期待這些新內(nèi)容在未來成為每個(gè)前端程序員的新武器。

程劭非(winter)

2020年01月

主站蜘蛛池模板: 兴和县| 禹城市| 肇源县| 信阳市| 论坛| 泰和县| 报价| 老河口市| 中西区| 醴陵市| 临湘市| 峨山| 珠海市| 正安县| 永年县| 文登市| 绵阳市| 新安县| 嵩明县| 皮山县| 台北县| 莫力| 苏尼特右旗| 大竹县| 县级市| 伊吾县| 新绛县| 石河子市| 泽普县| 临海市| 黑河市| 通海县| 凉城县| 泾阳县| 南安市| 奇台县| 宣城市| 宁蒗| 阜阳市| 图片| 福清市|