他在BAT等大廠研發10年,總結了12條開發經驗給你
關注「實驗樓」,每天分享一個專案教程
在一線做了十年的開發,經歷了網易、百度、騰訊研究院、MIG等幾個地方,陸續做過3D遊戲、2D頁遊、瀏覽器、移動端翻譯app等。積累了一些感悟。必然有依然幼稚的地方,就當拋磚引玉,聊為笑談。
正文共:3813 字
預計閱讀時間:10 分鐘
在一線做了十年的開發,經歷了網易、百度、騰訊研究院、MIG等幾個地方,陸續做過3D遊戲、2D頁遊、瀏覽器、移動端翻譯app等。
積累了一些感悟。必然有依然幼稚的地方,就當拋磚引玉,聊為笑談。
對於團隊而言,流程太重要了
行軍打仗,你需要一個嚮導;如果沒有嚮導,你需要一個地圖;如果沒有地圖,至少要學習李廣,找一匹識途的老馬;如果你連老馬也沒有,那最好可以三個臭皮匠好好討論,力圖勝過一個諸葛亮;如果三個臭皮匠連好好討論也做不到,那就是典型的烏合之眾了,最好寫程式碼前,點上三炷香,斟上一杯濁酒,先拜拜菩薩,再拜拜谷歌。
我個人屬於性格溫和的(程式設計師大多性格不錯),但確實見過少數強勢的人,說很多強勢的話。在技術上一言而決,一聽到任何反對就上升到私人恩怨。這樣的風格,到底是剛愎自用,還是胸有成竹,就需要仔細判斷了。
為什麼說流程重要呢?實際上,如果團隊上有孫悟空存在,去西天取經,大概也不需要什麼流程,只要方向就可以了。 但作為普通的戰士,應該先慮敗。找人算命時,應該先聽聽不好的地方,好的地方就不用聽了,總歸是好的,不好的地方一定要聽,這樣才能規避。
這就是我的態度:先悲觀一點,劃清底線,考慮在這個底線上你該怎麼做?
這是我做開發的一個習慣,但這個習慣肯定不適用於買房。
怎麼劃清底線呢?就是假想團隊中沒有孫悟空了,光靠你唐玄奘、豬八戒和沙和尚,應該怎麼去取經。
這個月走什麼地方,遇到山怎麼走,遇到河怎麼過,遇到路上有妖怪劫道,誰去抵擋。遇到路上有少女要搭救,怎麼辦?這就是流程,是原則。
我經歷過一個流程很混亂的階段。都是很多年前的事情了,可以拿出來說說,不涉及單個人。
2011年在百度瀏覽器團隊時遇到幾件讓人影響深刻的事情。 有一次開會,產品拿出Google某個產品的DEMO,裡面有一段很酷炫3D 效果,要求開發加上,只給2天時間,大家目瞪口呆。後續的開發為了趕節奏,導致非常多的bug,又為了修改bug,leader將所有的bug按照人員平均分配,導致不同模組間的同學相互修改。。。。。實在難以想象。好比讓做花捲的廚子,去修改西湖醋魚的味道。
最初的現象是:bug下降的慢,延伸bug反而增加,每個人都累的半死,程式碼風格極其雜亂,為了趕工導致的臨時方案層出不窮;
到了中期:人員離職越來也多,程式碼難以維護,新加的需求與之前的臨時方案衝突。
到了後期:想做一些修復,想調整架構,又要保證正常執行,其難度好比在一架飛行的飛機上拆換零件。
然後我也急忙離職了。。。。實在看不到成功的可能性。
後來到了騰訊的團隊,感覺流程就規範多了。需求和bug有Tapd跟蹤,產品釋出按照節奏,需求提出前會和開發反覆討論可行性,有專門的質量跟蹤,有專門的使用者反饋,每天知道要做什麼,也知道明天要做什麼。有產品需求,也有開發需求!這個非常重要。很多團隊,都是隻有產品需求,開發好像牛一樣,耕完地就不管了?
流程其實沒那麼複雜,就是各司其責+節奏。我們都是“哆瑞咪發梭拉西多”中的一員,各自有各自的責任,然後組合在一起,按照一個節奏跑起來。把該做的事情與該跑的節奏定好。
不要炫技,老老實實寫程式碼
網上有一個段子,說有人要用JS實現一個簡單的功能,然後朋友給他推薦了幾十個庫。
真的有必要嗎?具體情況具體分析。
居家過日子,你只需要一套普通的工具就可以了;如果你是修車的,你需要一套修車的工具;如果你是光頭強,你需要一臺伐木機。 吃飯用筷子,用刀叉,都可以,但不要用殺豬刀,不要用丈八長矛!,當然也不能用牙籤。
用什麼工具,用什麼庫,問問過來人,多在KM上搜尋一下。舉個例子:android上加密,用SQLChpher就可以了,微信也在用,你當然可以學習;資料庫ORM思想,用KM上推薦的GreenDAO就可以了;PC上3D引擎,用OGRE就可以了;小型遊戲DEMO,用Irrlicht足夠;寫WebGL,用ThreeJS足夠。
首先想想:一些大庫hold的住嗎,後續發展如何?這些庫對安裝包的體積影響有多大?有沒有調研過同樣的產品在用什麼?
想清楚了再決定用什麼,最好是跟隨成功專案的腳步。
架構上實用+適用
很喜歡曾國藩的一句話:結硬寨、打呆仗。
一字長蛇陣、八門金鎖陣,哪個好?iOS都是單個程式,微信Android版本3.5以前是單程式,3.5以後有獨立的網路程式; PC瀏覽器的程式架構更加複雜,UI程式、核心程式、Render程式,而且還有根據頁面多少的程式調節模型。
這些設計都很好,各有各的道理,都適用於當前的產品。所以我的觀點是:首先分析當前產品的規模、性質,然後再設計架構。
在當前階段達到:開發效率+架構的平衡;並向後展望3個月,或者半年左右,看看架構能不能適應。
我做騰訊翻譯君時,曾反覆猶豫要不要模仿微信加入獨立的網路程式。後來逆向了有排在第一二位的競品,最終採用了現在的主功能單程式模型。
產品規模、人員規模、功能階段,具體問題具體分析。
既要有攻城之力,也要有熬戰之氣——
BUG
產品開發完成後,必然有bug。其實開發人員在工作過程中,是有一定的直覺或者心理預判的,即:某個功能模組的質量如何。 這裡面的質量包括:可維護性、擴充套件性、演算法渲染效率,還有就是bug與崩潰率。
功能開發完成後,就要開始守城了。
bug,一部分產生是由於架構帶來的,例如比較複雜的架構,會導致複雜的實現細節;
但還有很大部分bug,其實是基於如下三個原因產生的:
對於某個api的不瞭解,或者對於某個平臺,或者SDK版本的不瞭解。 舉例而言:andrid裡面非主執行緒,是不能直接處理UI相關的事情的;JAVA的記憶體釋放也不是絕對的,相互指向是無法釋放的;函式個數是有DEX問題制約的---------------------這些bug的產生,也是開發人員摸索學習的過程,經歷過一次就不會再犯了。這是學習廣度與熟練度的問題;
還有一些bug,是由於粗心大意導致的。例如空指標的問題,野指標的問題。在C的開發中,野指標的問題,GDI控制程式碼的釋放問題,這些都是嚴謹的程式碼需要避免的; 而又一些工具,或者方法是可以規避這些問題的,例如android中的利用@Nullable和@NonNull加強空指標檢測等方法;
還有一些bug,是由於“使用情況各異導致的”。例如:偶現在某個模組crash。這裡的本質還是因為邏輯的異常邊界沒有處理好。例如android上的OOM問題,還有PC上UI焦點導致的物件釋放問題。這些異常情況,一部分靠測試發現,一部分靠使用者反饋,還有一部分就靠自己的異常處理。例如Android中的try catch機制,其實就是遇到異常了,你能糾正錯誤的機會。
自審
每過一段時間,都要站在高空俯視自己,問問:到底是在承擔過去,還是在改變未來。
如果之前程式程式碼質量不好,後面修改問題的時間就會比較多。到了開發的中期,得多問問自己,你在不停的改正以前的錯誤,還是在做新的東西。 如果修改錯誤的時間多一點,那就要注意自己的程式碼質量了!
註釋
我很喜歡寫註釋。有大牛說:程式碼就是最好的註釋。 可惜我還沒有達到那個程度。所以,我會把註釋寫的非常清楚。其一:為了自己以後維護的方便; 其二:為了其他人接手的方便。
這是我在翻譯君專案中寫註釋的方式。
1:對於很複雜的邏輯,務必用12345的順序依次寫清楚;
2 :對於函式中的某個引數,需要解釋為什麼要設定這個引數,尤其是公用工具類裡面的函式---說清楚引數的背景含義,可以讓其他呼叫者理解的更加清晰。
我一般不用英文寫。雖然這樣看起來格調很低,但勝在大家都能輕鬆的看懂。寫程式碼不能太傲嬌,寫註釋也不要太傲嬌,目的是讓你的搭檔或者接手者,更輕鬆的理解,讓她/他少加班。
程式碼結構
程式碼結構要清晰。有按照功能劃分的,有按照UI結構劃分的。還有公用工具類,有資料管理,有主邏輯控制。不管用哪種思想,有序的程式碼結構,可以讓每個人感覺很乾淨。好比日本的收納整理技巧讓很多小資推崇,無非就是乾淨、整潔、便於管理。
而且,還有一個重要的好處:程式碼結構表現出來的其實是——程式的一個模組邏輯思想——讓大家工作在不同的區域。
程式碼風格
程式碼風格統一!好比一家人,有叫Tom的,有叫安東尼的,還有叫流川楓、石破天、聖傑夫拉斯基,無所適從。理論上,看一個函式,就能從名稱上區分哪些是成員變數,哪些是區域性變數,哪些是全域性靜態值。
除了命名統一外,還有一行程式碼最大的寬度,函式的連續呼叫長度等,標頭檔案的包含風格,也最好有一個約定。類的出現時間,建立人名,最好也加上,看起來沒用,但到了追蹤問題時,就能看出時間線的好處。
安全與逆向
這是針對Android說的,還有PC外掛也需要考慮。Android上首先要防止被別人逆向,我成功逆向並重新打包過有第一位和第二位的競品。這似乎有點不可思議,但確實做到了。加固+混淆+程式碼判斷,最好都有。
安全上,可以看金剛掃描的漏洞,逐一修改就行。公司很多工具很好用的!
開發效率
開發效率可以用這些方式提升:
構建公用工具類,方便大家使用
使用開源的一些包,例如ORM思想的資料庫等
可以很快的找到問題。開發中,找bug的時間,往往是很多的。我用的方法有3個: 使用try catch; 攔截所有crash到我指定的地方;超多的Log,Log有統一的控制開關。
借力:資料上報用燈塔,崩潰上報用bugly,公司KM上很多經驗,拿過來用。
安裝包體積
TINY壓縮圖片
刪除無效的資原始檔
UI渲染效率
UI是使用者的第一感覺;UI快並穩定,第一感覺就不會差太多;管理好記憶體,基本管理好了一半crash;管理好UI,等於管理了人機互動感受。
UI上的開發是:渲染效率與渲染效果的平衡。
很匆忙的寫的,必然有很幼稚的地方,歡迎斧正。
作者:中公優就業
出處:51CTO
原文連結:http://mobile.51cto.com/news-572973.htm
學習更多
樓+「 Python實戰 」、「 Linux運維與Devops實戰 」、「 機器學習實戰 」優惠報名中——來自騰訊、Intel、IBM等網際網路大廠的一線大牛親自指導,培養有真正工作能力的工程師!
點選下面的連結瞭解詳情:
他在一線網際網路大廠研發PHP數年,用6周時間帶你打通“全宇宙最好的語言”
相關文章
- 2年開發,我總結了7條經驗!
- 8 年產品經驗,我總結了這些持續高效研發實踐經驗 · 研發篇
- Android開發經驗總結Android
- iOS開發經驗總結iOS
- iOS開發經驗總結2iOS
- iOS開發經驗總結3iOS
- 拿到BAT等大廠offer以後,我總結了這些技術面試技巧BAT面試
- 我的2019校招面經大全(包含BAT頭條網易等大廠面經)BAT
- 總結Django一些開發經驗Django
- Java反射機制開發經驗總結Java反射
- 一年Node.js開發開發經驗總結Node.js
- 大資料開發工程師的兩年工作經驗總結大資料工程師
- 微信小程式開發BUG經驗總結微信小程式
- 開發中的一些經驗總結
- Java秋招面經大合集(含BAT等大廠面經,均已拿offer)JavaBAT
- 網際網路大廠,常見研發線上事故總結!
- 今日頭條研發面經
- 膜拜大牛!3年Android開發工程師面試經驗分享,最全的BAT大廠面試題整理Android工程師BAT面試題
- 拿到BAT等大廠offer以後,我發現了關於秋招的一些真相BAT
- Android開發3年,九月份面試12家大廠跳槽成功,我有一些面試經驗想分享給你們Android面試
- BAT研發面試36題總結:Spring+Redis+Docker+Dubbo+高併發架構BAT面試SpringRedisDocker架構
- 學會了這些技術,你離BAT大廠不遠了BAT
- 解密國內BAT等大廠前端技術體系-完結篇解密BAT前端
- 怎麼提高程式碼質量?-來自Google的研發經驗總結Go
- 經驗總結--我的小程式開發和進化之路
- 十年開發的程式設計師,總結出了這些開發經驗程式設計師
- 大廠5年前端開發經驗,想給初學者們幾點建議,關於你是否能找到工作!前端
- 我的Java秋招面經大合集(包含BAT頭條網易等公司)JavaBAT
- 他們測試了上萬款APP應用,總結了APP測試的經驗及流程APP
- 2019年Javaer開發面試BAT學習重點總結Java面試BAT
- 20+條軟體開發的經驗教訓
- 都已經1202年了,你竟然還在說測試比不上開發?
- 前端開發想要月薪過萬?給你指幾條明路前端
- 一位Android大牛的BAT面試心得與經驗總結AndroidBAT面試
- 2019年Android崗位BAT等大廠面試題知識點小結AndroidBAT面試題
- 軟體研發之道:微軟開發團隊的經驗法則微軟
- Pinterest 首位產品經理:爆發式增長背後的 5 大經驗總結REST
- 為了給你們安全感,Oculus也要研發邊界系統