歲月劃過生命線(16.02 ~ 10)
提前轉正
標籤 : coder
10月9號收到了提前轉正通知後就想寫些總結, 總結在微店的一年裏見過的人、讀過的書、做過的事兒, 不然怕很多有意思的細節以後都忘了. 但一直找藉口遲遲懶得動筆, 這篇總結斷斷續續竟寫了一個月…
9月28號動態中心的全部代碼部署上線後去聽了公司關於晉升的分享會. 很多細節已經模糊, 但get到了以下兩點訊息:
1. 府笛分享的晉升的關鍵- 主動性: “以P7的視角完成P5的工作, 那你離P6還遠嗎?!”
2. 敏潔分享的提前轉正: 新同學表現優異的可申請提前轉正.
雖然自己畢業才3個月,未滿6個月試用期, 但由於在前段時間的新人總結中老大康瑜給予了充分的肯定, 因此第二天便提出了提前轉正的申請, 並在十一過後收到通知, OA狀態已變爲正式.
由於15年的大部分內容已在 從阿里到微店 中涉及到, 因此不再贅述, 只總結16年的自己的個人提升、工作總結以及未來計劃.
個人提升
想要成爲一名優秀的開發者/研發工程師, 我認爲不光要有過硬的技術實力、分析和解決複雜問題的能力和優秀的架構設計能力, 還要有對生活的感悟、對技術的品味以及良好的身體素質. 因此這部分我將從 人文* 、技術 和 健身 三個角度來談個人提升.
這部分對我啓發很大一本書是 軟技能: 代碼之外的生存指南, 建議每一位身在職場和即將步入職場同學找來讀下, 絕對收穫很大.
1. 技術
通過15年在 阿里 和 微店 實習時的基礎沉澱和查漏補缺, 工作中常用的技術已基本掌握, 因此在16年我將技術的重點放到了對基礎知識的梳理鞏固和一些感興趣的技術上:
- 基礎梳理部分包含 Servlet 與 MVC、Spring、JDBC與MyBatis、設計模式、前端技術等.
- 感興趣的內容有: Redis與Memcached、Lua語言、Nginx、網絡與RPC 等.
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更新: 現已棄用…).
Best Wishes.
- by 攻城師@翡青
- Email: [email protected]
- 博客: 攻城師-翡青 - http://blog.csdn.net/zjf280441589
- 微博: 攻城師-翡青 - http://weibo.com/u/3319050953