歲月劃過生命線(16.02 ~ 10 -提前轉正)
歲月劃過生命線(16.02 ~ 10)
提前轉正
標籤 : coder
10月9號收到了提前轉正通知後就想寫些總結, 總結在微店的一年裡見過的人、讀過的書、做過的事兒, 不然怕很多有意思的細節以後都忘了. 但一直找藉口遲遲懶得動筆, 這篇總結斷斷續續竟寫了一個月…
9月28號動態中心的全部程式碼部署上線後去聽了公司關於晉升的分享會. 很多細節已經模糊, 但get到了以下兩點訊息:
1. 府笛分享的晉升的關鍵- 主動性: “以P7的視角完成P5的工作, 那你離P6還遠嗎?!”
2. 敏潔分享的提前轉正: 新同學表現優異的可申請提前轉正.
雖然自己畢業才3個月,未滿6個月試用期, 但由於在前段時間的新人總結
由於15年的大部分內容已在 中涉及到, 因此不再贅述, 只總結16年的自己的個人提升、工作總結以及未來計劃.
個人提升
想要成為一名優秀的開發者/研發工程師, 我認為不光要有過硬的技術實力、分析和解決複雜問題的能力和優秀的架構設計能力, 還要有對生活的感悟、對技術的品味以及良好的身體素質. 因此這部分我將從 人文* 、技術 和 健身 三個角度來談個人提升.
這部分對我啟發很大一本書是 , 建議每一位身在職場和即將步入職場同學找來讀下, 絕對收穫很大.
1. 技術
通過15年在 阿里 和 微店 實習時的基礎沉澱和查漏補缺, 工作中常用的技術已基本掌握, 因此在16年我將技術的重點放到了對基礎知識的梳理鞏固和一些感興趣的技術上:
2. 人文
一年多來這方面讀了/看了很多優秀的小說/影視作品, 也遇到了像大學之路、軟技能這樣優秀著作, 下面我將從偏技術、純人文、影視作品和其他四方面聊聊:
偏技術:
這方面讀了 程式碼的未來 和 大型網站技術架構:核心原理與案例分析 兩部出色非常書: <未來> 中松本行弘老師以一名語言設計者的角度講述了從語言的經典特性講述到技術潮流中的新思想:多核、通訊、現代儲存等多個主題, 對我們這些“可能最早與未來接觸的人”純人文:
今年有幸成為東野圭吾的粉絲: 嫌疑人X的獻身、白夜行、解憂雜貨店、惡意、宿命(不推薦) 東野圭吾對人性的刻畫, 對邏輯剖析讓人不忍釋卷. 而三體(三部曲)則以巨集大的視角、幾百億年的時間跨度徹底打開了人們看待事物的寬度和廣度.影視:
山影的幾部作品琅琊榜、歡樂頌、偽裝者絕對是業界良心, 演員的敬業以及對人物的刻畫不禁讓人肅然起敬. 而電影就有太多可以講述, 感興趣的同學可以參看我的豆列-翡青.其他
有時間還涉獵了一些經濟學、心理學和歷史的內容, 但較為淺顯也就沒什麼好說的了.
3. 健身
從16年年後回到杭州起, 就一直有計劃的健身: 跑步、游泳、羽毛球、騎行.
截止到開始寫這篇部落格的時間, 已經累計跑步123天(平均每天6公里)、羽毛球也拿到了公司羽毛球賽的男雙冠軍和混雙季軍. 而體重也從年初的89Kg減到了現在的75Kg. 附上十一在西湖的一張自拍:
顏值不夠, 風景來湊(⊙﹏⊙)b.
工作總結
在微店的一年裡(15.9月底~16年.9月底)做的東西可以簡單總結為七個專案, 三個框架.
專案
從最初實習時的跟師兄一起做動態遷移, 到後來自己負責一個“好店再來”模組、“動態後臺”開發, 再到後面正式入職之後的feedcenter-push新功能、後臺重構、push重構、全球購動態遷移, 一直到最後師兄轉崗, 自己獨立承擔一個包含三個應用的feedcenter系統, 為微店買家版和全球購兩個App提供近三十個dubbo介面, 每天上百萬次的請求. 一路走來, 一方面使得自己對Java這門優秀的程式語言越來越得心應手, 另一方面, 自己的抗壓能力, 對整體架構設計能力, 對系統性能瓶頸分析都能感到有明顯的提升. 由於大部分的業務系統對開發人員的考驗並不在技術這一關(感覺要對Java語言、非同步、併發、分散式快取、分散式訊息佇列、RPC、分散式資料框架、集中式配置中心有較深的瞭解, 相對更偏重的是使系統設計的更加簡潔和可擴充套件, 而這一點很多業務系統是想通的), 且由於公司的內部資訊不方便公開, 因此就只著重於總結下自己做的幾個小框架: cache-annotation、script-engin和Touch.
三個框架
Cacher
最初產生要開發這個工具的idea是由於北京的Redis叢集經常宕機, 我們不得不將所有的快取切到杭州叢集, 但同時我們又不想寫一堆先查快取, 未命中再去查DB, 然後寫入快取傻瓜式的程式碼, 因此我們就了開發一款基於註解的快取框架, like this:
@Override
@Cached(expire = ONE_HOUR)
public AuthorFeed getAuthorFeed(@CacheKey(prefix = "feed_id:") long id, String authorId) {
return dao.selectAuthorFeed(id, authorId);
}
只要添加了@Cached
註解, 我們的框架便會根據@CacheKey
內的定義拼裝出一個快取的Key先去查詢快取(可以是HashMap、Guava等LocalCache, 也可以是Redis、Memcached等專業的快取服務). 如果未命中再去執行方法並將方法結果快取. Cacher的優勢還在於還支援批量的快取查詢(相比於Spring-Cache等產品), 如果有部分key未命中, 則將用這部分key去執行一次方法並快取, 然後將兩部分結果合併返回, 如:
@Cached(expire = TWO_HOUR)
public Map<Long, List<String>> getLikeUsers(@CacheKey(prefix = "feed_id:", batch = true) List<Long> feedIds) {
Map<Long, List<String>> userIdMap = new HashMap<>(feedIds.size());
for (long feedId : feedIds) {
List<String> userIds = feedLikeDAO.getLikeUsers(feedId);
userIdMap.put(feedId, userIds);
}
return userIdMap;
}
該框架我和師兄共同設計, 並由我全部開發, 但由於gitlab掛在了師兄名下, 且原先的設計跟微店的Redis叢集綁的很死, 因此我將其重新設計開發, 現在已經處於測試&優化階段, 後面我會陸續釋出到這個git地址下:https://github.com/feiqing/Cacher .
ScriptEngine
一個線上指令碼執行引擎, 現在支援在伺服器上跑JavaScript和Groovy兩種指令碼. 只要在專案環境中配置了一個SpringBean, Engine便會跟隨應用一起啟動一個RMI服務, 然後就可以在Engine的後臺向這個應用傳送JS、Groovy指令碼執行, 為了提高框架的易用性, 在指令碼執行前會將Spring內所有Bean作為全域性變數匯入到指令碼環境供指令碼呼叫, 因此非常適合做線上資料訂正、手動載入等後門操作, 其開源地址如下:https://github.com/feiqing/ScriptEngine. 不過現在Engine的後臺Web介面只著重於實現功能, 因此介面不太美觀, 且由於我自己前端功底較弱, 希望看到這篇部落格的前端同學有時間可以幫我優化一下, 在此先謝過了O(∩_∩)O.
Touch
開發這個框架的原因是由於動態中心的黑名單載入改造: 原先的黑名單載入由微店的統一排程框架排程載入, 但這個框架有個問題是每次只會排程到一臺, 而我們線上有多臺機器, 因此我就自己用Timer實現了一個統一排程框架, 為定時任務分配固定的執行時間片, 所有的任務當時間到後會被統一呼叫, 這樣就沒必要每一個定時任務開啟一個執行緒. 但這樣還未解決定時任務手動觸發的問題, 如果運營將一條動態拉黑, 它就必須等待一定時間才能生效, 而他又想立即生效. 於是在一次睡午覺前, 我看著線上程式碼, 想著能不能在系統上線之後我直接用手摸到線上程式碼, 於是 Touch 的名字和想法就這樣產生了: 只要給你的一個方法打上@Touch
註解:
你便可以在瀏覽器上手動執行你的方法:
這樣一方面可以使你在系統執行時手動執行一些任務, 而且還可以節省大量測試介面(如Dubbo、HSF)開發的Servlet、Controller測試程式碼. 這個框架從產生idea到設計、開發, 到測試、buf-fix、釋出, 再到文件編寫一共用了不到二十個小時, 經歷了一天半時間. 當釋出了第一個版本之後便引發了部門內部激烈的討論, 並獲得一致好評. 目前已經發布了5個大版本: 修復了大量bug, 提升了效能, 增加了包掃描的功能, 也加入了基於ZK開發的安全控制. git地址為: https://github.com/feiqing/Touch.目前在微店內部使用的最新版本是0.3.2, 其相比0.2版本大幅度優化了效能、記憶體佔用以及簡化配置(去除了@TouchArg引數, 動態獲取泛型引數型別), 但現在github上的版本還在0.2版本, 等一有空閒時間我會馬上更新上來, 當然也歡迎感興趣的同學提出想法&加入.
未來
未來一年~一年半的可以簡單用沉澱一詞定義:
1. 語言
如今動態語言大熱, 感覺不會幾門動態語言都不好意思跟人打招呼, 因此在繼續鞏固自己的飯碗Java的基礎上, 還規劃學習幾門動態語言:
- Java: JVM原理、Effective Java、Java併發程式設計的藝術(Java併發程式設計實戰)、Groovy(更靈活的Java);
- JavaScript: 似乎JS想要一統天下: MongoDB支援、JDK內建的JS解析器從Rhino升級為Nashorn、 Node.js、 Chrome外掛開發、React Native以及最近大熱的微信小程式.
- Python: 靈活的指令碼, 運維同學的一大殺器, 各類機器學習框架、樹莓派、Alfred工作流、Jython, 甚至Sublime編輯器.
3. 儲存與大資料
- 像MySQL、Redis、Memcached這類儲存服務我們幾乎每天都會接觸, 但其實對其的底層知之甚少. 但只有我們深入的瞭解了他們的底層原理, 才能更高效的使用他們, 比如一條資料是物理刪除還是邏輯刪除效能更高?對索引更友好? 這方面打算讀下這幾本書: MySQL技術內幕-SQL程式設計、MySQL技術內幕-InnoDB儲存引擎、Redis設計與實現、大規模分散式儲存系統: 原理解析與架構實戰
- 隨著Hadoop的成熟、Spark/JStorm的流行, Zookeeper在分散式協同方面的事實標準, 感覺一個Java開發對Hadoop這類大資料框架依賴越來越強. 你不可能總讓BI他們幫你跑MR吧. 這方面推薦幾本我看過以及打算看的書: Hadoop基礎教程、Hadoop權威指南(第四版:英文版)、HBase權威指南、Hive程式設計 從Paxos到Zookeeper : 分散式一致性原理與實踐.
3. 搜尋引擎與中介軟體
作為開發中技術含量最高的兩類技術, 雖然日常工作中經常接觸和使用, 但並未有很深的理解. 這部分打算讀幾本書, 但更加深入和實踐的內容還需要和專業的團隊進行交流和溝通:
這就是搜尋引擎: 核心技術詳解、解密搜尋引擎技術實戰:Lucene & Java、大型網站系統與Java中介軟體開發實踐.
4. 演算法與機器學習
演算法與資料結構無論何時都不能放下, 但反觀自己實習和工作的一年多時間裡, 在這方面投入的精力地區很少, 因此在未來的一年裡會在這方面以及最近很火的機器學習投入更多的精力. 推薦幾本自認為還不錯的書: Java資料結構與演算法分析、演算法(第四版)、機器學習實戰、機器學習(周志華).
5. Computer System 原理
如今的RPC/MQ/分散式資料框架/集中配置中心從設計的角度來看不過是對作業系統等底層技術的延伸和封裝. 比如RPC其實封裝的是Socket和動態代理, MQ是將IPC中訊息佇列放到了分散式環境中. 因此對系統底層如作業系統、TCP/IP等知識的掌握對理解甚至開發的中介軟體應用都有著非常大的作用. 這方面的好書有深入理解計算機系統、TCP/IP詳解、 作業系統設計與實現、計算機程式的構造與解釋 等.
6. 部落格更新
另外還有一個比較有意思的轉變是從這周起 翡青的部落格 正式更名為 翡青的技術週刊, 從這周起, 我會盡量做到每週更新一篇部落格: 每週我會選定一個比較有意思的話題(比如這周的 JVM初探-記憶體&GC), 在這一週的時間裡, 我會每天抽出一到兩個小時的時間, 去讀書、查資料、做實驗、思考, 豐富這篇文章, 然後再每週週五下午六點發出(網際網路公司正式下班時間), 供各位開發同學在一個唯一不加班的晚上閱讀. 文章的內容還是秉承一貫的風格: 偏實戰但又不乏深度. 這篇文字一方面可以看做是一個職場新人一週的學習總結, 另一方面也可以看做是一個開發新人每週交出的一份作業. 歡迎大家到時訂閱收看(2017更新: 現已棄用…).