『頭破血流』學(xué)編程語言(Rust 篇)
學(xué)習(xí) Rust 已經(jīng)有一段時間了,斷斷續(xù)續(xù)地在業(yè)余時間造了一些輪子。通過這一系列的練習(xí)和仿造,對于如何學(xué)習(xí)新的編程語言有一些新的感悟。這篇文章講的方式并非是捷徑,也不是什么 7 天精通,而是繼續(xù)使用笨辦法地方式來進(jìn)行學(xué)習(xí)。
從我的角度來看,前者的介紹過于簡單,只是告訴了你應(yīng)該這么做,但是沒有說要怎么做。而后者則難度太大,對于大部分的人來說,幾乎是不會想著去做這樣的事情。而本文的難度呢,剛好介于兩者之間,至于是不是中間嘛,也不好說。難度,因人而異,因時間也有區(qū)別。
對于編程和計(jì)算機(jī)理解越來越深刻,那么原先難度適中的事情,因?yàn)樽鲞^會變得更加簡單;而原先復(fù)雜的事情,如果我們還沒做過,那么我們可能還覺得它依然相當(dāng)?shù)膹?fù)雜。
為什么學(xué)習(xí)新的編程語言?
工作多年,我們依然會和同事、朋友討論到:業(yè)務(wù)是永恒的,技術(shù)是永遠(yuǎn)在變的。所以,成為一個業(yè)務(wù)專家更容易、更持續(xù),成為一個技術(shù)專家更難、更需要持續(xù)提升。選擇很難,因?yàn)槲覀儾皇腔鹦侨?,也沒有上帝視角。所以,成為一個技術(shù)上的專家,我們需要不斷地接觸一些新的東西,接受一些新的概念。其中的一種模式便是,人們口中經(jīng)常說的:每年學(xué)習(xí)一門新的語言。
從個人的角度來看,這是一個非常 SMART (具體、可度量、可實(shí)現(xiàn)、相關(guān)性、有時限)的目標(biāo)。所以,它還會存在這么一些優(yōu)點(diǎn):
- 保持學(xué)習(xí)的習(xí)慣。
- 為技術(shù)熱情添到香油。
- 學(xué)習(xí)不同的編程模式。
- 拓展職業(yè)機(jī)會和前景。
除此,從職業(yè)雞湯上來說,就是:機(jī)會是留給有機(jī)會的人。如果你學(xué)習(xí)了一門新的編程語言,那么未來有相關(guān)的機(jī)會,你更有可能觸摸到。
若是你將學(xué)習(xí)新的編程語言,視為非?;馃岬氖裁磧?nèi)卷化、奮斗逼之類的說辭,那么我倒是沒啥好說的。有的人是真的在 “奮斗”,有的人是想了解各種有意思的東西。從我的角度來看,學(xué)習(xí)新的編程語言和上述的說辭是不存在關(guān)系的 —— 不存在競爭,只是加一條賽道,笑。
尋找語言學(xué)習(xí)的高效路徑
在上文中,我提及的第一篇文章《學(xué)習(xí)的藝術(shù)——如何學(xué)好一門技術(shù)、語言》在今天對于我來說,已經(jīng)是一個相當(dāng)浪費(fèi)時間的事情 —— 重復(fù)勞動。文中提到的方法,無非是造重復(fù)的輪子、重寫舊的應(yīng)用,這種方式和諸如在 30 天里去練習(xí)不同的項(xiàng)目,都只是在特定的場景之下,出于特定的目標(biāo)而練習(xí)的垃圾產(chǎn)物。隨著我們的成長,生活和工作上的一些事情,會占據(jù)我們更多的時間。盡管,我尚未被這些問題困擾著,但是我已經(jīng)有了一個又一個的方案。不過,我相信你們都會有這些問題。
簡單來說,我們需要即學(xué)好一門編程語言,又不重復(fù)勞動。所以,可行的方式是學(xué)習(xí)新的語言,并在新的編程語言里尋找新的輪子。諸如于《『如何同時學(xué)會兩門編程語言?』》就是一種不錯的方式,但是對于多數(shù)的人來說,它有點(diǎn)難。不過,從個人的角度來看,如果你是選擇從一個 XML 解析、JSON 解析開始的話,可能就沒有那么難。但是,就是在重復(fù)的造輪子。
這么一圈廢話下來,其實(shí)我們的結(jié)論就是:在語言的適合場景下,造適合的輪子 —— 這可能意味著一定的時間成本。比如,用 JavaScript 來處理非關(guān)系型數(shù)據(jù),用 Go 來開發(fā)跨平臺命令行工具,用 Rust 來開發(fā) WASM 應(yīng)用等等。
高效路徑
在我嘗試了一系列的造輪子工作之后,我有了一個初版的模型(基于 Rust 語言)。我暫時劃分了四條路徑:
- 工程實(shí)施。即使用該語言時,開發(fā)應(yīng)用時需要哪些實(shí)踐。
- 應(yīng)用開發(fā)。理解完整的開發(fā)應(yīng)用所需要的知識體系。
- 框架設(shè)計(jì)。使用該語言如何進(jìn)行各種抽象設(shè)計(jì)。
- 語言練習(xí)。要么用它來寫語法解析,要么來解析這門語言。
- 領(lǐng)域特定編程/場景編程。即尋找適合這門語言的場景。
作為初版,這條路徑可能不一定能 match 上你的需要,但是隨著我們不斷也提升,我們終將能形成一個更完整的路徑。
工程實(shí)施
從工程實(shí)施,這個角度來看,我們所要掌握的是一些基本的編程能力:
1.自動化測試。諸如于單元測試、集成測試等等,以幫助我們開發(fā)出高質(zhì)量的應(yīng)用,并節(jié)省 debug 的時間。
- TDD(測試驅(qū)動開發(fā))。同上。從個人的角度來看,若是掌握 TDD 這一項(xiàng)技能,可以編寫高質(zhì)量的代碼。
- 測試覆蓋率。
- 持續(xù)集成。真實(shí)的軟件開發(fā)需要持續(xù)集成,這也是我們學(xué)習(xí)編程語言時,要掌握的工程技能。
- 構(gòu)建管理。尋找適合于這門語言的構(gòu)建體系,以幫助我們構(gòu)建出可信的軟件。
如我們在使用 Rust 開發(fā)應(yīng)用時,就可以使用 GitHub + Travis CI 的方式完成對于持續(xù)集成的了解;結(jié)合 Justfile/Makefile 等,完成自動化的構(gòu)建。
應(yīng)用開發(fā)
應(yīng)用開發(fā)是基于真實(shí)項(xiàng)目的角度出發(fā),來完成對于語言的練習(xí)。這些內(nèi)容包含了:
- 自動化部署。主要用于學(xué)習(xí)在真實(shí)項(xiàng)目下,如何提交效率。
- 容器化部署。
- 分層架構(gòu)。如何合理的劃分項(xiàng)目的目標(biāo)結(jié)構(gòu),常見的方式有兩種:
- MVC 架構(gòu)。傳統(tǒng)的三層架構(gòu)
- 整潔架構(gòu)?;诔橄蟮男问皆O(shè)計(jì)的架構(gòu)
- DevOps 體系。根據(jù)需要,完成從需求到上線流程的支持。如:
- 應(yīng)用性能監(jiān)控。
- 日志。
不同的語言之間,或許存在一些差異,但是從最終的情況來看,它們都需要提供一致性的接口,或者是采用一致性的接口。如對于數(shù)據(jù)庫的訪問,使用的接口是一致的;提供 RESTful API,其對于消費(fèi)者來說,也需要提供一致地 API。
框架設(shè)計(jì)
框架設(shè)計(jì)是基于造輪子的需求場景下的路徑。它包含了:
- 抽象。語言如何進(jìn)行抽象
- 支持 OO。
- 不支持 OO。如何使用諸如于 Rust Trait 完成類似的工作
- 語言無關(guān)。如何進(jìn)行跨語言的設(shè)計(jì)支持。如:
- 語言無關(guān)的數(shù)據(jù)格式。
- 模塊化開發(fā)。如何完成跨團(tuán)隊(duì)、跨業(yè)務(wù)模塊的代碼、服務(wù)共享。
- 包管理/依賴管理。如如何構(gòu)建,并發(fā)布到制品倉庫,實(shí)現(xiàn)復(fù)用。
框架設(shè)計(jì)從理論上來說是稍微復(fù)雜一些。至于有沒有必要,就看你想學(xué)習(xí)到什么程度了。
語言練習(xí)
語言練習(xí)是《如何同時學(xué)會兩門編程語言?》模式之下的一種路徑方式,相對會陡峭一下。
- 編寫其它語言/DSL 的解析器。
- 使用其它語言編寫該語言的解析器。
- 使用該語言解析該語言。
嗯,是不是有點(diǎn)意思了。從場景上來說,當(dāng)我們拿到了一個語言的 AST,然后就可以嘗試去做一些高端的事情。如我在 Coca 里做的自動化重構(gòu)、架構(gòu)可視化等等。
領(lǐng)域特定編程
領(lǐng)域特定編程是在該語言擅長的場景下,做該語言擅長的事情。如 Rust 里的
- 跨平臺
- WASM
- 一門應(yīng)用跨端運(yùn)行
- 系統(tǒng)級編程
- 結(jié)合系統(tǒng)接口,如獲取用戶輸入,并修改輸出。
這依賴于我們識別場景,并知曉出什么時候才是合適的場合。
其它
沒有銀彈,如果有的話,那就不需要人類了。
本文轉(zhuǎn)載自微信公眾號「Phodal」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Phodal公眾號。