大三下有幸到了美團點評實習。在這半年的時間里,經過導師和主管的悉心教導,無論是專業技能還是開發技巧方面都有很大的提升。恰好午休時間,隨便寫寫,總結一下這半年的收獲吧。不留下篇文章總感覺有點遺憾。
一、 初到美團
剛入職的時候,其實自己非常虛,因為懂的東西不多。投簡歷的時候,自己只是做過一些Android的Demo,然后就掌握了一點課堂上的知識吧。(計算機網絡,數據結構等等)面試的時候,也是面試了這些,很幸運主管讓我通過了面試。后來被告知入職之后要學習Spring來開發,雖然自己以前寫過一些Servlet的小程序,但是框架、控制反轉、依賴注入和切面這些東西真的是一點都不理解。怎么看網上的博客也不懂,就是和JavaSE中間隔了一堵牆的感覺。
入職之后,美團給開發配發的是15寸的mac pro,雖然當時剛使用mac不適應,但是現在看來,mac的確很適合開發工作。剛開始的一周主要是熟悉環境,熟悉mac的操作,熟悉美團點評的內部系統等等。值得一提的是,美團的內部應用很多,並且在工作中很實用。內部交流有專門的應用,類似微信,功能強大。最近還出了一個話題社區,和知乎差不多。可以說現在主流的互聯網產品,美團點評都有相應的內部應用。有一點比較麻煩但是很重要的就是每天要發工作日報,每一周要發周報。對於記錄和思考自己的工作,還是有很大幫助的。
熟悉了內部環境,就要開始學習一下開發相關的知識了。有兩點讓我感觸很深,一個是開發使用IDEA,第二個是Git。說一下之前我是這么寫程序的吧,用Eclipse,寫好類,在Main函數里面寫寫幾句話就完了,然后也沒有什么保存的工作。下次繼續開發就找到項目存儲的地方打開項目即可。所以在那個時候,我並不理解Git的作用,不就是遠程保存一下代碼嘛。但實際上,開發工作並不是一個人完成的,不可能大家進度都一樣,也不可能保存在一個硬盤。難道別人開發的時候,你就把項目拷給別人添加完代碼自己再弄嗎?在導師的指導下,我學習了IDEA和Git。
IDEA是主流的Java開發IDE,用過AndroidStudio的就明白了,同一個公司的。主要是好用,能集成的東西很多,個人感覺比Eclipse好用。
至於Git,基本上每天都會接觸到。最簡單的用處就是能夠保存代碼,創建了Git項目后,pull到本地,然后編寫完代碼后push上去。這樣就算你電腦進水了壞了開不了了,換了一台電腦,你的項目還在的。第二個用處,當一個項目,已經在線上運行了,但是你要開發一個新功能,怎么辦呢?你不可能在現有的項目上改啊,因為改了代碼重新編譯,服務肯定會斷掉的,會影響到使用的用戶們。還有就是改錯了怎么辦呢?Git提供了一個辦法就是,新開一個dev分支,該分支上的代碼和master分支上一樣的,你可以在dev分支上隨意改。Dev就算改錯了,還能回滾到以前的版本。當確認無誤了,可以將dev的代碼合並到master分支上。當然了,大項目的合並是有權限的,master分支不能讓你隨便合並。你可以提一個合並的請求,然后在Git上能看到你修改的地方。當管理員查看的你的代碼之后,確認沒有問題,他就會讓合並通過。如果沒有沖突,這樣新的功能就添加上去了。第三個用處就是在服務器部署很方便。不需要從本地拷貝代碼到服務器,只需要從git上pull代碼下來,直接跑就可以了。當然,重新編譯啟動項目要選在使用者較少的時候。這就能理解為什么一些游戲都選在晚上更新維護了吧。主要用到的地方,暫時想到的就這么多吧。說實話,當時我看Git教程也非常迷糊根本不懂,在工作中慢慢接觸就理解明白了。
二、 接觸項目
說起來非常幸運,實習的任務就是和導師一起負責美團點評·眾測平台的后端開發。這個項目主要是讓用戶通過這個平台提交試用美團點評旗下APP發現的BUG與建議,然后相關業務線的QA能在后台處理相關的問題。在我實習結束之前,已經進行過四次的線下眾測活動和三次版本迭代。目前的運營方式就是讓報名參與眾測活動用戶(非對應QA)在限定的時間內去測試某一業務組提供的一個新應用包,提交自己發現的BUG,然后給予相應的積分獎勵。讓我感到非常驚訝的是,每次活動結束完,都能發現一百多個有效BUG。不敢相信一個待上線的應用能有這么多的Bug,第二個就是感嘆參與的用戶發現Bug能力太強了。
為什么說幸運呢,我感覺有兩點。第一點是這個項目覆蓋面很廣,基本上美團點評線上應用很多都通過了眾測平台來收集發現BUG。是個影響面廣並且很實用的項目。自己負責開發的項目這么多人用到,很有成就感。第二點就是,它不是一個很難的項目。麻雀雖小五臟俱全,現在想起來,對於我這種剛起步的Spring學習者來說真的最適合不過了。
說一下項目用到的框架:Spring+SpringMVC+Mybatis,構建項目使用了Gradle,數據庫使用MySQL,服務器是jetty,部署於美團點評的線上機器。接下來就簡單說下每個框架的用處吧。
Gradle:最簡單的說法,就是管理依賴。總不能每用到一個jar包,就去網上下載,或者在美團點評的庫上下載,拉進項目里面吧。使用gradle,可以在配置文件里面寫幾句話就能管理一堆相應的依賴了。還有一個就是gradle和jetty的集成,在服務器上,只要一句命令:gradle apprun,項目就跑起來了。非常方便實用。
Spring:依賴注入/切面。這個用處太廣泛常見了,導致我不知道怎么說(逃
SpringMVC:以前處理前端請求的服務端,都是用Servlet,代碼冗長。SpringMVC是基於Servlet的框架,對於前端的請求,只要編寫相應的Controller,匹配url,然后在函數里面進行相應的處理即可,非常簡單。SpringMVC的返回也非常有意思,可以自定義一個Result類,填入相關數據,然后轉換為Json返回到前端。
Mybatis:以前使用數據庫,要寫一堆冗長的JDBC的代碼,而且拿到了數據,處理起來也很麻煩。使用了Mybatis,只需要在Mapper編寫相關的SQL即可。
以上的框架,我剛開始學習的時候,都是一臉懵逼,完全看不懂,從Spring開始,是完全不理解的。但是接觸了項目,在經過導師對我一堆幼稚問題的耐心講解,也就慢慢懂了。在這就不講解這些框架了。
在項目里面,除了框架的學習,還有一點就是項目里面結構的分層。最著名的應該是MVC模式了。但是實際上,分得要更細一點。在眾測里面,簡單的概括是:
Bean:用到的類。
Controller:處理請求。
Config:配置類(沒有用xml,不太直觀
Service:服務類(讓controller調用)
ServiceImpl:服務類的實現(邏輯+dao)
Dao:操縱數據庫的方法。
Mapper:SQL語句,其實就是dao的實現。
如果不采取分層的話,項目代碼看起來就非常亂。比如Controller里面,邏輯應該盡量簡單,比如說應該只是看看執行了什么Service。如果把Service的實現什么的都放進去,一個controller就非常的復雜,排查問題也很困難。對於分層,印象深刻。因為第一個版本我寫得太亂。第二次改版的時候,導師讓我把代碼趕緊重構掉。
三、 添加功能
眾測項目上線期間,導師還給我安排了一個任務,就是給美團點評·雲測平台添加設備預約功能。雲測平台是一個能個各個業務線提供真機自動化測試的項目,用戶可以自己上傳相關的app,相關的測試項,然后這邊的機器就會幫你跑app,發現bug,生成報告給你。另外還有一個點評側的項目phoneDP是可以在線調試Android設備的(當初口號是讓QA
不需要真實的Android設備在手即可工作),用到的框架是STF。因為雲測平台下有大量的設備,自然也能通過phoneDP占用。但是之前沒有預約的功能,用戶如果想操作指定的機型的話,只能定期去看看機型有沒有在跑自動化測試任務了。因此,有了預約這個需求。
至於預約流程,因為篇幅原因,簡單講講自己的思考感悟吧。
首先肯定是要看雲測項目的代碼的。這一點很重要,鍛煉了自己看代碼的能力。遇到函數和類看不懂,就command+單擊點進去,一層層深入去看,刨根問底。我發現,這個項目很有意思,也可以算一個學習的案例。雲測平台直接分成了3個項目:Core/portal/slave。顧名思義,core就是要使用的核心代碼。比如用到的類(bean)。Portal就是入口,也是項目的前端。當然不是前端頁面的意思。而是這個項目處理了前端的所有操作。並用於向slave推送任務。Slave:就是處理具體任務的項目。
前端負責生成任務,並給slave推送。如果沒有推送,slave會定期掃描等待的任務。如果等待的任務需求的設備空閑,那么任務將會執行。有一個小細節很有意思,slave的掃描,不是固定時間的。一段時間內,掃描沒有能夠執行的任務,那么掃描線程將會睡眠。睡眠時間是上一次的兩倍。就是說第一次睡眠10s之后掃描沒有任務可以執行,將會睡眠20s再次掃描,以此類推,當發現有任務執行之后,睡眠時間刷新回到10s。這樣做的好處就是,不用一直掃描,浪費cpu。因為一個任務一般執行時間是很長的,所以一次掃描到全部都執行不了后,其實也是意味着在往后一段時間內都執行不了。
進入開發階段,首先就是要搞清楚,一個任務,portal是怎么生成的,然后slave又是怎么掃描的,掃描到了之后,進行了什么操作。兩個項目過程中,又用到了core里面的什么bean。這個部分就搞了我很久。
其次,要構思預約的流程。Phonedp遠程調試插進來的任務,和用戶或系統提交的不一樣,會有特定的標志。當初的想法比較簡單。任務完成的時候,會調用callback的函數,只要在callback里面,檢查有沒有該設備預約,有的話,馬上占用設備,通知用戶就完了嘛。
於是我創建了預約表,記錄預約情況。還編寫了檢查預約、執行預約、通知用戶的代碼。結果一上線,完了,有問題。為什么呢,任務執行完,執行callback的時候,你去檢查預約表。但是這個時候,是有另一個線程是在掃描等待任務的。就是說查預約表,和檢測等待任務和空閑設備的線程,有沖突。這樣就預約在執行狀態了,設備卻被其他任務搶了。所以這個構思不行啊,得重寫。
最后和導師討論,有一點讓我收獲很大:編寫侵入性小的代碼。就是說,這個預約功能,最好也看成一個任務,和之前的任務一樣,只要分一個類別區別就好了。這樣的話,線程掃描任務的時候,因為排隊,會先掃到預約任務,不會沖突。然后自己定義掃描到的預約任務要進行什么操作就可以了。最后也這么實現了,的確沒問題。
編寫這個功能的時候,因為眾測得需求還有自己拖拖拉拉和不熟悉業務,弄了挺久的。但是這個也讓我受益匪淺,比如查看Mysql錯誤日志,打印日志,部署STF環境,和上海側的同學討論接口排期什么的,還有很多零零散散卻非常實用的知識。對了,還有很多細節才是重中之重,比如很多出錯的情況之類的,但是脫離了項目,也沒什么講的了。
四、感謝
在這半年的實習里面,我的主管和我的導師給我很大的幫助。工作中我經常問一些非常簡單的幼稚的問題,我的導師都給我一一解答,而且語言組織得很好,我都聽明白了。此外還有很多像環境配置,啟動項目之類的問題,我的導師剛開始也一一操作給我看。看了他怎么弄,聽了他的講解,然后我自己再照葫蘆畫瓢。自己弄得多了,再去百度google等地方弄清楚原理,滿滿就懂了。當時我也是對依賴注入啊什么的概念完全不懂,工作中接觸多了,滿滿就理解了,所以不要太局限於書本,要多動手實踐。“紙上得來終覺淺,絕知此事要躬行”,說的就是這個道理吧。還有就是我經常問我導師同事問題,他也細心給我解答了。還有我們的PM,平時相處的也很好,完全沒有像知乎上“程序員和PM是死對頭”那種感覺。在美團的半年時間里,參加了部門的年會,組內的兩次團建,平常同事們也一起吃飯,相處得還是挺愉快的,消除了自己第一次“北漂”的孤獨感。
經過了這次實習,學到了很多知識,同時也開闊了眼界,看到了自己的不足之處。大四即將到來,打算給大四定一個小計划:1、保持coding。刷leetcode上的題,保證自己的碼感。2、深化自己實習學到的知識,編寫一個簡單的MVC框架,能夠支持依賴注入、切面、請求分發和處理就好。造輪子能夠提高自己的代碼水平,順便把這個作為自己的畢業設計,一舉兩得。半年的實習,感覺自己水平提高了不少。希望大四完結后,對於現在的自己,能有更大的進步。