1. 程式人生 > >我的2018年總結

我的2018年總結

轉眼又是一年,2018年也要離我們遠去。最近半年沒有怎麼更新部落格,落筆有些生疏,但其實一直都零星地寫一些。只不過寫作時間碎片化,導致好多文章半途而廢。趁著這年底最後的幾天,趕緊好好總結一下這充實的一年。以下是前幾年的總結,記錄著自己成長的軌跡:


1.理論

2018年最令人欣慰的一點就是有很多深入學習程式設計理論的機會,而且在學習之後還能在工作實踐中檢驗自己的理解。

1.1 軟體工程

在最近半年做的一個專案裡,有兩次比較大的設計,藉此重新熟悉了一下設計的流程。儘管軟體工程理論上都八九不離十,但每個公司因為文化、行業等不同,在具體設計時會有些許不同的設計流程、技術選擇傾向、文件模版等。所以,最好自己應該有一套獨立於不同公司的設計方式,根據不同公司的需要進行裁剪和補充。從分析問題到詳細的設計,形成自己的知識體系和行為習慣。

同時還有一個深刻的感受就是:在架構設計甚至不那麼詳細的“詳細”設計之後,如何能保質保量的完成。畢竟最終支撐一切的還是程式碼,說一千道一萬,落筆處見真章。下面就說說在具體編碼中對面向物件方面理論的一點感悟。

我的文章:《軟體開發的複雜度分析

1.2 面向物件

面向物件大家都再熟悉不過,可是讀過《Elegant Objects》後卻發現自己以前就是典型的用過程式思維來指導寫面嚮物件語言的程式碼。雖然一些原則和思想都瞭解,比如內聚耦合,比如SOLID原則,可就是有一層窗戶紙始終無法捅破。另外就是TDD理念的理解,如何選擇和完成第一個測試來觸發整個TDD的Cycle,從而驅動開發的完成。以及如何確定測試的粒度、範圍等等。

經歷過另外幾本好書的洗禮,以及不斷地實踐,感覺自己在OO方面的設計和動手能力都有了很大提高。但離真正悟透還很遠,甚至可能像有的大師級人物說的,寫了一輩子也始終寫不好程式碼。這可能真不是大師們的謙虛,因為寫好程式碼不是一件小事。

我的文章:《優雅的物件》,《設計模式沉思錄

1.3 計算邏輯

今年的一大收穫就是發現了《Engines of Logic》這本好書。閱讀過程中,最令我驚奇的一點就是計算與邏輯的統一。以前對此習以為常,但瞭解之後發現數理邏輯真的不一般。雖然一本書不可能囊括如此大的主題,但這本書可以很好地作為導引,由此展開對數理邏輯、哥德爾、圖靈機、馮諾依曼模型的學習。

1.4 編譯原理

讀研時一直有個遺憾,就是沒有選修上編譯原理課,因為本來本科時就沒有學好。沒想到研究生畢業再次工作後有機會接觸到,還是一個SQL解釋執行的好專案。於是藉著這個寶貴的機會,翻出了陪我不遠萬里漂洋過海過來的龍書影印版。可能因為有了更多的經驗和閱歷,這次閱讀基礎的詞法語法解析部分時,儘管龍書的風格比較偏教科書,但依然讀得非常流暢。當然厚厚的龍書沒法一口氣讀完,期待讀懂後面高階部分的那一天。

1.5 資料庫引擎

對編譯原理算是表面上的重溫了一下,很快就直接過渡到後端資料庫引擎的實現。翻看了不少資料,包括一些名校的課件,最終確定了logical planning和physical planning這種比較標準的架構,這裡簡單說一下給感興趣的同學參考,具體可以瞭解之後自行查詢資料深入瞭解:

  1. Logical Planning:Logical Plan與關係代數很像,在這一階段主要是對執行計劃樹按照一些規則進行優化,比如表示式化簡,過濾選擇條件的pushdown等。這一階段與具體的物理實現隔離,即便讀取一些資料庫的Metadata資訊,也主要是用來驗證SQL語句是否有語義上的錯誤,比如欄位或者表不存在。
  2. Physical Planning:這一階段的輸入就是前面最終產生的最優Logical Plan。計劃中的每一個Logical Operator都能一對一或者一對多地對映為多個Physical Operator,比如邏輯上的Sort可以對應物理實現上多種潛在的排序演算法,同理Join和TableScan也是如此。因此,這一階段會產生一個搜尋空間,最終目標就是預估不同選擇可能產生的Cost,從而得到一個最優的Physical Plan。

2.工具

2.1 重新認識Vim

今年讀過《Practical Vim》後,對Vim的設計哲學有了更深的認識,也更加喜愛了。現在寫Python直接遠端伺服器上原生Vim加各種外掛,Java時因為還是離不開強大的Intellij IDEA,所以還是本地IDE裡開發為主,但是IDE裡的編輯器都使用Vim外掛。同時Chrome這種日常工具也儘可能Vim化了,安裝了cVim外掛。於是使用滑鼠的時間越來越少,效率越來越高。

我的文章:《Vim終極指南-所見即所得》,《Python+Vim:天作之合

2.2 Tmux

Tmux本身只是一個在遠端伺服器為你保留Session,以防你意外掉線離開時,你執行的耗時命令不會意外終止。而且命令的輸出也儲存在Session裡。但真正驚豔的是它之上的Terminator,可以定製你想要的Tmux窗口布局。因為Tmux也像Vim一樣,可以分屏。Terminator可以定製這個佈局,同時指定各個子窗口裡要執行哪些初始命令,而且傳入引數動態地組裝到這些命令裡。當你像往日一樣開啟終端,啟動Terminator並帶上幾個引數。然後螢幕上就像有人在變魔術一樣,幾秒鐘後一個酷炫的自定義工作區就自動初始化好了。

2.3 Typora/Bear Note

與往年一樣,今年繼續使用Markdown寫所有文章。鐵打的Markdown語法,流水的編輯工具。今年發現了Linux平臺上非常優雅的Typora編輯器,寫文章時讓人心情舒暢。後來寫作時間碎片化,於是開始發掘iPad的潛能。發現了iOS上同樣漂亮的Bear筆記App,於是連上了鍵盤(可惜不能用HHKB,不過貌似能搜到一些解決方案),敲敲打打。如果需要寫大量程式碼,當然還是要開電腦。但如果只是少量示例程式碼用在文章裡,那線上的repl類網站就足夠了。

這樣iPad就成了一個利用碎片時間的生產力工具。而本文就是得益於這套工具,才得以在2018的尾巴上得以按時完工。關於看書做筆記,個人體會最深、最深惡痛絕的一點就是掌握不好何時該放下書做筆記,過於頻繁會導致閱讀不斷被打斷,而過少就會像本部落格一樣,積壓了大量擱置的文章草稿。不管是實體書還是切換到PDF,希望iPad這套生產力工具能讓我們更快地在專心閱讀與快速記錄之間切換,清理庫存,釋出出更多的好文章。

2.4 HHKB

幾個月前剁手入了HHKB鍵盤,為了能夠帶到公司去並且不影響同事,就買了更貴但是比較安靜的Type-S版。於是就開始了每天在公司Happy Hacking的日子。手感確實很不錯,但是因為也沒用過其他機械鍵盤,所以也不能過多評論。

除了鍵盤,這裡要著重介紹的一個好東西是配套軟體——Karabiner Elements。因為HHKB非常小巧,沒有Fn鍵,沒有數字區,甚至沒有方向鍵!這可能是最讓人受不了的一點,而Fn鍵的缺失則是要了重度IDE使用者的命,尤其是Intellij IDEA。而且HHKB也沒有提供程式設計介面,讓使用者自己修改按鍵的繫結。這時Karabiner在軟體層面提供的繫結就成了大家的救星。而裡面可能是最重要的一個繫結方面就是SpaceFn,起源於論壇裡網友的聰明才智。簡單說來,就是長按空格鍵代替Fn,同時Fn+HJKL代替方向鍵,而且與Vim的方向鍵一致。從此就在HHKB + SpaceFn + Intellij IDEA Vim外掛+ Chrome cVim外掛中,度過開心的一天又一天。


3.語言

3.1 現代Java

最近才瞭解到Java在Oracle的管理下並沒有凋零,而是繼續發展,甚至煥發了青春,今年秋天順利釋出了Java 11。十三年前,抱著買的第一本影印書《Thinking in Java》硬啃。來來回回看了三遍,雖然不知道有些很刁鑽的知識除了考試拿高分外有什麼用,比如兩個Integer用==比較結果是什麼。後來公司轉C#後離職繼續做Java,一直到現在,完全不用Java的時間加起來不超過一年。可以說整個職業生涯最要感謝的就是這門語言,雖然很多新語言讓它光芒不在,可它的確是最正確的選擇和投資。

最近,專注Java 8中Lambda的口碑不錯的In Action系列出了新版,書名改為《Modern Java in Action》。書中就Java 8 - 11的新語言特性做了詳細的介紹,乾貨滿滿。對於老Java程式設計師來說可以說是一本夢寐以求的書,因為它跳過初級甚至中級的知識點而直奔新Java的精華。

我的文章:《那些年我錯過的Java

3.2 Haskell

Haskell早聞大名,學習之後覺得確實名副其實。最深的感受就是函式竟然可以這樣玩!於是一發不可收拾,一直深入到Haskell背後的Category Theory範疇論。雖然理解不深,但還是很震撼地發現:程式設計的抽象層次竟可以如此之高!相比之下,我們日常寫的程式碼的抽象之低,編寫時的不用心,真心慚愧……

我的文章:《Haskell帶你玩轉函式

3.3 Kotlin

如果說《Modern Java in Action》依舊無法讓你對現在的Java有很大改觀,但你依然離不開JVM生態圈的話,那麼也許Kotlin會讓你對JVM重拾信心。曾經花時間學習過Scala,語言這東西稍微瞭解就能感覺出是不是跟自己氣味相投,而Scala就是讓我喜歡不起來的一門語言。Kotlin,一門非常實用,有些彌補Java的特性讓你大呼:這太有用了!比如instanceof判斷後自動轉換型別,比如巧妙地向已有的類甚至JDK加入新方法,給你一種Java也有Monkey Patch的錯覺。還有更多驚喜就不一一列舉,勤快的同學可以自己去試試,《Kotlin in Action》評價也非常好。嫌麻煩的同學就等著本部落格的後續更新吧。


4.“不務正業”

下半年每天通勤兩小時,於是在公交上看了一些技術書籍,以及更多的“閒書”,主要以科普類書籍為主,涵蓋了數學、物理、天文,三個個人最感興趣的主題。同時,還為了看懂曠世奇書GEB,看了一點音樂理論的書籍。

我以為我讀的都是沒用的閒書,直到我在《Hacker and Painter》裡看到了引用了一段哥白尼的語錄時,那種與作者心有靈犀的感覺很讓人難忘。通過欣賞大自然的美來提升自己的審美,對編碼以及做其他事都大有裨益的。比如,大自然的簡潔優雅、對稱和遞迴的美、模式與規律的可循、無處不在的平衡與守恆等等,無一不影響你對任何事的看法和做法。

我的文章:《當我通勤時我該讀什麼


5.思考

5.1 設計與編碼

作為技術人員可能很容易陷入鄙視鏈,下層的鄙視上層設計如空中樓閣,而上層又鄙視下層寫程式碼沒有技術含量還總是出bug。最近真心覺得:設計與實現是同樣重要的,頂層的思想和設計固然重要,但沒詳盡到可以直接翻譯成某種語言程式碼的話,就沒資格說編碼無足輕重。所以,也許最幸福的事就是做一個不太大的設計,然後自己親力親為,在設計與編碼中不斷學習成長。

5.2 如何解決問題

我們很容易在沒有思考清楚前,陷入了無盡的細節中而返工。剛入行時是這樣的,現在也如此。“問題=答案”,但這也不是說要一直空想,凡事都講究一個度。所以,如何分析問題,分析到什麼程度,是一個學問。很多人推薦的書:《How to Solve it: Modern Heuristics》,以及《Are your lights on?》。

5.3 儘早得到反饋

科學家通過物理實驗或者思想實驗,來驗證自己的理論。任何人提出想法,都需要來自現實世界的反饋。如何儘早地得到反饋從而知道自己的想法對不對就尤為重要。設計時通過詳細設計和原型系統來驗證,在實踐的初期得到更多反饋來修訂設計。編碼也是一樣,通過TDD儘早得到反饋,從而驅動開發和重構。

5.4 做一個Maker

程式設計只是一個表達我們思想的手段,重要的是做一個創造者。不管是通過程式碼、文章或其他任何形式,只要是Maker,就能享受到創造的快樂。