对2018的展望
之前寫過一篇《我的2015技術學習流水賬》,最近兩年因為讀研的緣故導致職場的空白期,所以就不做總結(關于讀研所學的總結可以參考之前的文章《北美CS求學找工指南》),而是展望一下即將到來的2018年。本文提到的資料書籍都可在《高分編程佳作推薦》中找到,都是高分好書。
1.兩條戰線
如果從實習的那年算起,2018年將是進入職場的第十個年頭。從二十二歲入行到已經三十有二,可謂感慨良多。為此,分兩條主線進行展望,這也是從入行一直嘗試不斷推進的兩條線。
一是每天的日常工作,不求多快升職,但畢竟工作是生活的保障,至少要保住飯碗才有機會做自己的研究。所以,職場上最基本的原則就是爭取達到組內中上技術/業務水平。同時了解客戶,并為團隊做貢獻。從進入一個新團隊時你什么都不懂,有很多要學的,最后離開時你卻是團隊里有價值的一員,如果在每個團隊你都能做到這樣,你的能力就會不斷提升。
二就是個人能力的進修,因為時間、能力有限,所以一直都游走于工程與學術之間,尋找一個適合自己的平衡點。這是一條很長的路,想從根本上提升個人能力,可能短時間內看不到明顯的改變,但是三五年,甚至八年十年后可能就會看到質變。
2.日常工作
最近從《重構》和編程工具的書得到了一些感悟:編程的最大敵人是重復,對付重復的最好方法是概念的抽象和工具的自動化。所以,今年想進一步提高自己對編程抽象的理解以及工具的使用。但與此同時,還要了解一些“業務”——AWS服務。
2.1 業務:AWS服務
AWS的頂級服務已經多得快數不過來了,更不用說更多的內部服務。感興趣的可以看一下之前的整理《AWS核心服務概覽》,因為都沒有開源,所以只能介紹得比較淺顯。為了對目前所在組的系統架構有更好的理解,需要花一些時間去學習,目前尤其對VPC和SWF畢竟感興趣。當然,還有最主要的Elasticsearch,要了解內部的運行機制以及常見問題的解決,才能更輕松的oncall。之前看了大部頭《Elasticsearch: The Definitive Guide》的許多章,但沒有及時做總結,一定要補上。
2.2 技術:Python、OOD、遺留代碼
最近半年,不知不覺地工作語言從Java變成了Python,所以新的一年以Python為主,但不能流于表面,深入學習Python的元編程等高級特性。平時讀了一些書,例如之前提到的可以說是最經典的兩本《Fluent Python》和《Python Cookbook》。尤其是第一本,彷佛找到了十年前讀《Thinking in Java》的快感。可沒想到很快從一個Python小白,變成了很多時候周圍人中最熟悉Python的一個。現學現用,馬上就派上了用場,所以就更加有深入學習的動力。目前尤其對Python的OOD、以及Python和Ruby中的元編程感興趣。
同時還有一點非常感興趣的是面向對象編程的設計方法與正確性驗證。目前重讀了《Clean Code》和《Refactor》等經典著作后,對如何設計正確而簡潔的函數有一些感覺和見解,但對對象一直沒有形成很好的認識。目前有一些不錯的資料,除了同樣經典的《Design Pattern》,還有更古老的《Object-Oriented Software Construction》,非常新的《Elegant Objects》兩卷。準備換一大塊時間探索一下,OOD/OOP這個老瓶里還有什么新酒可以品嘗。畢竟目前面向對象還是主流,學明白了后平時工作里應該是非常受用的。
此外,最近注意力轉移到了遺留代碼的開發方法論,包括重構和《Working Effectively with Legacy Code》都是很好的資料。為什么要關注遺留代碼呢?因為回首整個生涯,參與過的全新的項目和系統開發屈指可數(大概五六個?),時間上滿打滿算加起來大概有兩年,剩余的五六年都是在維護所謂的遺留代碼。包括現在也是,在現有代碼庫的基礎上加新功能、改Bug。所以要在遺留代碼上寫出優雅簡潔的代碼,還不破壞原有功能是一件挺難的事兒。
2.3 工具:新利器的使用
在引入新工具前,先要梳理好目前的工作流程,每一步都涉及到哪些命令和步驟,然后再想法通過一些有趣的工具自動化或簡單化。目前在Amazon的工作主要可以分成日常開發和oncall兩大塊,第一塊的流程分為任務管理、設計、編碼、測試、Review、打包上線、線上驗證回滾等,第二塊則由常用命令、常見問題處理等組成。
列清楚了自己的工作流程,就著手用工具改進,讓每一天都能輕松一些。說到工具就不得不去*nix里去尋寶了。最近對命令行工具非常著迷,接觸到了一些非常棒但之前卻不了解的工具,彷佛發現了一個“不為人知”的大寶藏。比如Bash里之前沒用過的小命令、用Zsh配合各種插件替代Bash、Tmux和Tmuxinator對命令窗口的初始化和自動布局、Vim各種好玩的插件以及Tmux與Vim的完美結合。
3.個人進修
3.1 分布式系統
入行以來就一直專注于后端分布式系統的開發,從簡單的B/S應用到SOA再到各種中間件的開發。念研究生時選修了分布式系統的課程,但沒想到異常的難,沒有學好,所以今年想花時間好好整理一下,從時鐘同步、通信等基礎設施,到復雜的分布式算法,尤其是如何設計和證明分布式算法的正確性,以及工程實現上的一些實用技巧。目前手頭有一本《Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems》非常適合深入學習。
3.2 函數式編程
研究生時選過一門《Principle of Programming Language》的課,用的Standard ML,非常有趣也非常難。之前讀過一點SICP,所以準備重讀一下,順帶學習編程語言的設計實現。長期的話,編譯原理是必須要學的,這也是研究生時的遺憾,沒有選上編譯器的課程。
3.3 算法與數學
算法照之前計劃的,就是啃透CLRS《算法導論》,包括習題。因為CLRS也是研究生時算法課的主要教材,老師的引領自然地對自學有巨大的幫助。不然純靠自己理解,真是沒有信心啃完這部上千頁的算法巨著。之前已經開始重讀計劃,但因為工作原因擱置了,期待各種準備知識就緒后繼續一直讀下去。
數學則是另一個老生常談的話題,一直止步于前。但就在幾個月前有了一些進展,開始讀一些數學的入門書籍,主要方向是想趁著還有精力,把微積分、線性代數、概率論等基礎又對編程有幫助的分支學一下。最終目的是想提高一下科學素養,之后深入某一熱門的前沿領域,例如機器學習、人工智能等等。
4.總結改進
4.1 寫文章
2017年忙于找工作和適應新工作的生活,也因為惰性和寫作狀態不好,所以文章寫得不過。另外個人一個老毛病就是看書比較細、比較慢,喜歡在書上做旁注,導致最終的讀書筆記經常擱置無法及時完成。過后想要補上時,又沒有了當時的狀態和上下文。打開了個人的文件夾看了一下欠下的“債”,在此列一下(題目擬定),很多已經開了頭但沒有寫完,回頭一一補上:
- 一篇Vim的《Vim:所思即所得》:介紹Vim核心思想,目前已快寫完了
- 一篇Python的:介紹Python不同于其他編程語言的特性
- 一篇Elasticsearch的:主要深入理解內部的數據管理和搜索機制
- 一篇OOD的《面向對象沉思錄》:重新思考OOD的利與弊
- 一篇DevOps的《DevOps文化》:介紹開發與運維的結合
- 一篇CleanCode的《編程這件小事》:整理編碼中最細節的東西
- 一篇編程美學的:從頂層架構到底層理論支撐,思考如何欣賞代碼中的美
- 至少一篇工具的《情迷自動化》:介紹新接觸到的Zsh、Tmux等工具
- 至少一篇數學的《程序員的數學修養》:主要介紹數學的研究方法,與編程的關系
現在再思考一下如何改進。一個改進方法就是周末集中看一本書,立刻寫好文章,但這樣可能會導致書看得不夠細,思考不到位。可以先嘗試一下,有更好的辦法再去嘗鮮。
4.2 代碼庫
因為最近疏遠了Java,所以“宏偉”的Java代碼庫整理計劃就擱淺了,轉而開始思考Python代碼庫的整理。但因為Python本身的庫非常齊全、抽象層次高,所以與其整理基礎的,還不如做出一些有用的東西開源到GitHub上,所以今年爭取能用Python寫出一點有用、并且可以開源的東西。
4.3 職業生涯規劃
如果打算長期工作在一線的話,整個職業生涯可能長達幾十年。在這漫長的時間里,會出現一個又一個瓶頸,一些瓶頸也許能被打破(參見《如何突破編程學習的瓶頸期》),但有時也許會困在哪里難以自拔。所以程序員也是需要一些規劃和心理指導的,我們或許可以從《Clean Coder》和《Coders at Work: Reflections on the Craft of Programming》大師口中得到一些領悟,照亮前進的方向。
4.4 編程的本質…
編程的本質是語言?數學?計算?《SICP》開篇的回答很震撼人心,是Have fun,有趣、快樂,不免讓人回想自己入行時的初心。編程能掙錢、是一門手藝,但更重要的是給漫長的人生帶來一點快樂,不是嗎?
總結
 
                            
                        - 上一篇: shawl.qiu Javascript
- 下一篇: 分式的化简(约分、通分)
