程式碼即設計 | 掘金年度徵文

EltonZhong發表於2019-03-03

寫在前面

2018年過去了,我很懷念它。

2018年是漫長的一年,在這一年裡收穫了太多,難以細細道來。

從一個在屎山上添屎的菜雞,到現在的用心設計程式碼,飲冰二年,難涼我對程式設計藝術的追崇熱血。

從“SB js, SB java”的抱怨,到後面漸漸理解各個語言的設計思想,變成了對各個語言之美的讚歎。

2018年,對我最重要的書是clean code,我寫的最多的是java 和 js, 熟悉了python,但最讓我讚歎的語言還是kotlin,一門將clean code演繹在骨子裡的語言。

2019於此,我總結下我的2018關鍵字: 設計, 語言。

設計

設計是門藝術。

設計你的程式碼

在年中的時候,我一度認為程式碼醜陋主要有兩個原因:

  • 沒有遵循約定的程式碼格式,令程式碼不可讀。所以我使用ktlint,eslint去改善這一點,並在java程式碼中嚴格遵循這種規範
  • 沒有好的介面,沒有註釋文件

所以這導致我在寫新的模組中,大量地使用了介面,並且在暴露的介面方法中寫了十分詳實的文件,遵循javadoc的規範。

後來我認為這是愚蠢的做法。類可以自己描述、表達的,就不需要為其寫介面。程式碼可以描述的,就不需要為其寫文件。在我新的程式碼當中,我開始控制我自己寫註釋的慾望:人們往往不會去維護註釋。

我開始發瘋一樣,在起一個類名、方法名、變數名的時候想半天。我開始抽象大量的方法,每當我覺得我有好一段程式碼有寫時,我就開始準備一個新的方法。我遵循了clean code的原則,並覺得每一句話都是聖經。

直到我看到了5分鐘原則:起名超過5分鐘的話,就妥協吧。是的,你沒辦法為程式設計裡面的所以類與物件對映成一個在現實生活中有意義的事情。很多重構的書,《clean code》 或者是《重構》,都不斷地叫你:類名不要出現helper,不要出現manager,但是他們卻沒有給出解決的方案。

我開始思考:如果我不寫helper,我該怎麼命名輔助類?我不寫manager,我怎麼抽象facade?

世界上本沒有路,走的人多了,便有了路。Helper,manager本來是不可讀的,寫的人多了,他就被約定可讀了。

所以我開始隨心所欲地寫,找很多牛人幫我code review。我開始對自己的程式碼有信心,並再也不怕展示自己的程式碼。

設計你的系統

也是因緣際會。當初在看DDD的時候,感覺DDD是這麼一種思想:

一問都知道,一說都明白,卻從來沒人用。

我自忖在理解能力上還行(當年語文還行),卻也看的昏頭巴腦。這更激起我的好奇心,所以我開始準備搞清楚這是個什麼玩意。

我翻閱了許多的部落格,大部分的討論只是淺嘗輒止,只有一篇知乎上的美團點評的實踐還算詳盡:zhuanlan.zhihu.com/p/32459776

然後我開始讀DDD,IDDD,啃電子書是痛苦的。我一邊筆記一邊讀,勉強啃完,但是也是隻是通了幾竅。

在我讀完IDDD後,再重讀美團這篇文章,發現可能和我理解的不太一樣,所以我在評論中留下這樣的評論,但是遺憾沒有收到回覆:

一點淺見: 題中作者已經提到了, 架構和IDDD中有所不同, 我仔細回顧了一下, 發現可能不同的有點多。 在IDDD中, 領域服務是對領域模型的一種補充, 是附屬品, 相當於實在是程式導向的才放到領域服務裡, 實際上可能根本用不上, 而在本文中, 不知道我有沒有理解錯, 領悟服務變成了對領域模型的封裝? 這點感覺會導致貧血, 而且和書中所描述的領域服務有所出入?望指教。

後面看到18年9月印刷了一本《領域驅動設計精粹》,我趕緊從淘寶買來,放在案頭準備有時間好好研習。

DDD給我帶來的是:在每一個專案開始時,我都會細細地理通領域知識,並在分層、結構設計上更加自信。但是遺憾,我沒有真正實踐它的機會。

語言

Kotlin

初識Kotlin時正好我在研習clean code。當時我就在想:設計kotlin的人一定是clean code的粉絲。Kotlin的思想,禁止空值傳遞、取消違反開閉的checked exception、 類似groovy的有表達力的dsl等,讓我覺得寫kotlin是種享受。

Kotlin太新了,所以吸收了無數的別的程式語言的智慧,並且使用富有表達力的形式展現。

Kotlin multiplatform也是強大的,雖然它還是十分地年輕,但是我十分看好它。我也十分自豪,為kotlin multiplatform的社群貢獻了自己的程式碼。

也是因緣際會,當初接到一個需求,將一個kotlin multiplatform的專案增加node.js的支援。我開始研究這個東西,並且發現ktor這個庫沒有對node.js做支援,而這個kotlin multiplatform的專案是有依賴ktor的。所以我提了issue,提了pr,為ktor加上了node.js的support。

js

js圈簡直就是娛樂圈。今年爆出幾個大事,都與js有關係,就連我常用的nodemon,也依賴了event-stream這個庫。

不過這改變不了js優秀的非同步驅動的思想。用Js程式設計你可以忘掉一切多執行緒的煩惱(node在18年5月份release了對多執行緒的支援,不過好像是通過傳遞來共享記憶體),而es678的語法讓你發現,你要的js基本都有。

2018年也嘗試了Typescript,將一個js的專案完全地重構成ts,過了一把重構的癮。有人說ts和python3.5基本是一個語言,我非常認同。

展望

18年過去,常常感覺自己還是好弱,想學的東西太多。

感覺自己soft skills更是需要好好提升了。這是重中之重。沒有辦法做一個純粹的programmer。

掘金年度徵文 | 2018 與我的技術之路 徵文活動正在進行中……

相關文章