享知行·思考:一個程式設計師7年來的總結與反思
2019年已經過去兩個月了,應朋友之邀,寫寫自己的個人經歷,與其說經歷還不如是自我的總結與反思。2012年2月份隻身一人拖著行李箱來到北京庫巴科技有限公司實習,那時候庫巴處在高速發展的階段,我記得那一年庫巴招了300多個應屆畢業生,光技術就招了50多人,有運維、測試、開發、產品經理。那時候公司有宿舍,4個人一間,上下鋪,條件雖然艱苦了一些,但認識了很多好朋友,至今還在保持著聯絡。下班之餘大家經常一起吃飯喝酒,也就是那個時間胖了很多,回學校答辯的時候老師說:“你怎麼胖成這樣了,都有點快認不出來了”。
在學校的時候對java很感興趣,以至於上C語言課的時候,我在看java的學習視訊,記得那時候看了很多牛人的視訊,像魔樂科技的李興華老師,尚學堂的馬士兵老師,傳智播客的張孝祥老師。在學校學的是struts、spring、Hibernate,實習的時候,公司用的是SSI,Ibatis沒有用過,花了一週的時間學習框架,可能基礎還算比較好,第二週領導就讓我參與專案,這也是我人生中的第一個真實專案,雖然以前在學校也做過一些專案和參加過一些比賽,都是隻限於單機版。公司的網站最早是用.net開發的,遇到高併發的時候經常宕機,我屬於使用者中心組,我們的任務是將註冊登入部分用java進行重構,我負責登入功能的開發,在這個專案學到了很多東西,Nginx負載均衡、redis快取,diamond配置中心,那時候只是知道一個概念,並不瞭解nginx是如何工作的,都有哪些負載均衡的策略,對於redis只是知道它比資料庫要快,並不知道為什麼它很快?那時候阿里開源了很多專案dubbo、diamond、metaq、tddle等等,我是比較幸運的,庫巴是一個敢於使用新技術的公司,在這個環境下我也學到了很多東西。
2012年年底庫巴被國美收購,就面臨著公司合併和大裁員,到了年底300多個應屆生,留下來的不多,可能不到50個吧,我有幸被留了下來,兩個公司合併不光只是人員組織合併、系統、資料都要合併,2012年年底我的主要任務就是遷移資料,匯出sql指令碼,在那段時間我學會了使用python,因為用java效率比較低下,那時候庫巴已經有800多萬的使用者,最開始用的是limit進行分頁,隨著分頁越來越往後,查詢速度會越來越慢,最後經過研究才知道mysql使用limit會需要先定位到前多少條之後再取出後面的資料,當limit200萬的時候,先要查詢出前200萬的資料,就會很慢,最後的解決方案是根據id分段,每次取1000個id,這樣還可以使用索引,最後800萬的資料使用了2個小時就匯出成功了。
2013年過年之後就到國美上班了,在中關村鼎好大廈,國美給我的印象不太好,雖然有好幾層辦公樓,人員也很多,但是辦公室政治也挺嚴重,不太喜歡那個氛圍。國美使用的是oracle公司的電子商務相關的ATG系統,很複雜,光是搭建開發環境都需要很久,我也挺排斥的,不太想學這個,即便學會了對將來出去找工作也沒有什麼幫助,因為能買得起ATG系統的公司並不多,我把這個想法告訴了領導,領導給我重新分配了任務,讓我參與了一個“國之美”的專案,用以前庫巴的技術系統,去搭建一個網站售賣藝術品的網站。之前部署應用的同事,不想再搭建伺服器了,他把這個任務交給了我,這段時間學到了很多,我學會了很多linux命令,如檢視日誌、軟鏈、安裝軟體、掛載、啟動應用等等常用的命令。學會了如何配置nginx,怎麼讓nginx重新載入生效。最重要的是對整個系統架構,應用之間的依賴呼叫關係,有一些基礎的認識,因為以前只是對註冊登入、使用者中心比較瞭解,對訂單購物車、促銷、庫存知之甚少。
2013年6月底,很多同事都不太喜歡國美的工作氛圍,都想去換工作,也包括我,領導讓我們再等等,他最近在談一個專案,那就是做醫藥電商的網站壹藥網(2018年美國上市,哈哈,我也是在上市公司待過的人),那時候壹藥網還沒有自己的技術團隊,使用的是一號店的系統,需求排期需要很長,響應速度很慢,想找一個有能力的技術團隊,然後我們9個人從北京來到上海,月底就全部去武漢出差,因為1號店研發部門設立在武漢,需要與他們對接,遷移藥網的資料(使用者、訂單)和做系統的切割,一邊對接資料,一邊開發系統。那時候20多人,在武漢待了兩個月,每週工作6天,每日從9點到晚上10點,那時候很辛苦,但是成長也最快。以前是在同事帶領下輔助完成工作,現在需要自己獨當一面,因為電商系統相對來說比較複雜,功能模組很多,每個大的模組都是單獨的應用(有點微服務的感覺),每個人都負責好幾個應用,我負責註冊登入、使用者中心以及一些後臺的應用開發,還有就是應用的部署,那時候還沒有整合jenkins,都是通過linux命令和指令碼部署應用。經過3個月的努力,系統上線了,我現在還記得那天上線的情形,從晚上10點開始上線,還是出現了很多意想不到的問題,記得那時我們到第二天下午5點多才解決完問題,然後才回家休息。
在壹藥網工作的這段期間,最大的收穫是業務上的成長,接觸到了商品、庫存、促銷、購物車、CPS等,商品還是挺複雜的,有產品、商品、sku、商家、商品屬性(篩選屬性、說明書屬性),前後臺分類、套餐、圖片、文描等。庫存要求比較嚴格需要控制超賣,我們使用的是樂觀鎖,每次凍結庫存的時候where條件加上庫存數量的判斷,如果有足夠多的庫存才允許凍結。CPS是和網盟合作,如51返利、億起發、萬里通、成果網等等,需要和網盟對接,推送訂單至網盟,併為對方提供查詢訂單介面。
2013年-2015年是藥網高速發展的兩年,業務運營人員和技術人員都很給力,月銷售額從50萬做到了8000萬,日註冊使用者2萬人,介面效能要求越來越高,經常晚上使用jmeter對介面進行壓力測試,有一次網站遭遇DDOS攻擊,網站長時間服務不可用,最後使用了阿里雲盾之後,才恢復正常。隨著業務量的增加,使用者的增長,對系統的考驗也越來越大。系統的架構演進過程,註冊登入、使用者中心、購物車、訂單、庫存、商品、促銷、退換貨等部署在同一個應用,業務增長,單臺伺服器不足以支援業務發展,增加伺服器使用nginx負載均衡,隨著機器的不斷增加,mysql很快達到瓶頸,應用拆分微服務,各模組獨立,資料庫獨立,為了進一步提升效能,增加快取,前臺介面查詢快取,後臺才查資料庫,通過訊息佇列進行資料庫和快取的同步,同時每天定時任務,保證資料庫和快取的最終一致性。使用限流、降級和熔斷等方法應對瞬間高併發。
15年8月份,從藥網離職,來到360健康,重構商品,將商品屬性去掉了動態屬性,系列屬性、說明書屬性、更加動態,商品管理也變得簡單。在這裡開始使用敏捷開發,每兩週一個迭代,需求通過系統管理,每天花15分鐘開晨會,回顧昨天的任務,今天的計劃,過程中遇到了什麼問題。每天提前發現問題,這個迭代結束之前,確認好下個迭代的需求,並將需求拆解,估時,並錄入系統。每隔一段時間做一次覆盤,發現迭代過程中做得好的地方,以後的迭代中繼續保持。迭代中做的不足的地方,一起討論解決方案,避免下次再犯,會議結束後,通過郵件的形式給予反饋。技術方面,真正意義上開始使用jdk8,用gradle替換了maven,更簡單靈活,crm系統審批使用了工作流activiti,為了提高效率使用了spring boot,使用程式碼生成器,減少重複程式碼的開發。
12年7月份畢業以來,工作之餘花了很長的時間打遊戲,週末也不研究技術,就宅在家裡,看看電影,打打遊戲,LOL、劍靈、dota2、風暴英雄,浪費了很多大好時光。還好17年在亦師亦友的領導影響下,迴歸正道,我記得我是在17年3月份開始減少打遊戲的時間,因為那段時間在udacity學習機器學習,因為要學習機器學習需要把大學的數學知識重新撿起來,比如離散數學、高數、概率論、線性代數,3個月拿到了機器學習進階的證書。到了17年10月份,當我讀了採銅《精進·如何成為一個很厲害的人》,讓我徹底明白了,打遊戲是一個高收益,但是半衰期很短的事情,我們應該多做一些收益高和半衰期長的事情,如讀書。從那以後我就再也沒有玩過遊戲了。當自己想通了,覺得某件事是對的我會毫不猶豫地堅持下去,我覺得自己還算一個自制力比較強的人。15年在藥網的時候,周邊的同事都在戒菸,再加上抽菸,讓我早上起來的時候,噁心乾嘔的厲害,為了健康把煙戒了,萬事開頭難,剛戒菸那會兒真的很痛苦,看到別人抽菸真的忍不住想抽,過了幾個月之後,就沒有那麼強烈了,現在已經沒有什麼感覺了,戒菸到現在雖然中途抽過幾根,也只是在一些特殊的場合,抽著好玩而已。
我以前覺得自己不太愛表達歸咎於自己內向的性格,現在我漸漸發現,其實不然,可能是知道的太少了,不知道怎麼去表達,更不知道該表達什麼,隨著讀的書多了,慢慢的就有話題聊了,當然讀書不只是為了談資、炫技,更多的是自我提高,通過學到的知識,幫助我們解決問題,提高效率,提高做成功決策的概率。一開始我是很排斥讀書的,像戒菸一樣,一開始很痛苦,真的是逼著自己去看,為了培養自己的讀書習慣,我先從自己感興趣的書開始,我比較喜歡歷史,從《如果這就是宋史》這套書一共有十冊,我給自己制定了計劃花3個月的時間看完,基本上是一週一冊,因為看的是電子書,在去地鐵的路上,合理利用這些碎片化的時間,3個月下來我把這十本書真的看完了,並分了3次和同事一起分享,自己做PPT,最主要是為了鍛鍊自己的表達能力。經過這三個月,給自己建立了一些信心,後面覺得看書也沒有這麼難。這兩年也看了一些書,也買了很多書,讀書還是要讀一些經典的書,不要像我一開始,不管三七二十一,只要在亞馬遜評分還不錯就會買,就會讀。現在讀書會有選擇性的讀,會讀那些經常被人推薦的書,在這裡也推薦幾本我自己覺得還不錯的書,《遠見》《見識》《窮查理寶典》《黑天鵝》《精進·如何成為一個很厲害的人》《高效能人士的七個習慣》《運營之光》《原則》《深度思維》《終身學習》《思考快與慢》《富蘭克林自傳》。
《遠見》的作者提到了三大職場燃料,可遷移的技能、有意義的經驗和良好的人際關係。在職場中的能力分為兩種,一種是硬技能,一種是軟技能。硬技能對於一個程式設計師來說就是技術能力,軟技能就是日常工作中經常使用的,溝通表達能力、協調能力、決策能力、管理能力等等。這兩年投入的大量的時間在提高軟技能方面,以至於硬技能有所懈怠,今年過完年之後,覺得有必要重新合理安排時間,將大部分時間投入到硬技能學習中去。最近在聽左耳聽風的技術專欄,他在技術領導力的一篇文章中提到提高技術領導力的四個方法,覺得很有道理在這裡和大家分享一下。1.吃透基礎技術,基礎技術是各種上層技術共同的基礎2.提高學習能力,所謂學習能力,就是能夠很快地學習新技術,又能在關鍵技術上深入的能力3.堅持做正確的事。做正確的事,比用正確的方式做事更重要,因為這樣才始終會向目的地靠攏4.高標準要求自己。只有不斷地提高標準,才能越走越高,所以要以高標準要求自己,不斷地反思、總結和審視自己,才能夠提升自己。從第一點開始做起,準備讀《圖解HTTP》《圖解TCP/IP》《圖解網路硬體》《資料結構與演算法分析》《程式設計師修煉之道》《Mysql權威指南》《深入分散式快取》。
程式設計師猝死的新聞很多,所以健康最重要,工作之餘記得鍛鍊身體,身體是革命的本錢。跑跑步、擼擼鐵,早睡早起身體好。現在得癌症的人越來越多,也越來越年輕化,為了降低風險,如果你是家裡的主要經濟來源,一份重疾保險值得擁有。先大人,後小孩,先人身,後財產。
選擇比努力更重要,格局比能力更重要,以此和大家一起共勉。