2019-01-19

做開發(fā)十年,我總結(jié)出了這些開發(fā)經(jīng)驗(yàn)

在一線做了十年的開發(fā)桅滋,經(jīng)歷了網(wǎng)易慧耍、百度、騰訊研究院丐谋、MIG 等幾個(gè)地方芍碧,陸續(xù)做過 3D 游戲、2D 頁游号俐、瀏覽器泌豆、移動(dòng)端翻譯 app 等。

積累了一些感悟吏饿。必然有依然幼稚的地方踪危,就當(dāng)拋磚引玉蔬浙,聊為笑談。

一贞远、對(duì)于團(tuán)隊(duì)而言畴博,流程太重要了

行軍打仗,你需要一個(gè)向?qū)Ю吨伲蝗绻麤]有向?qū)Ь悴。阈枰粋€(gè)地圖;如果沒有地圖袱结,至少要學(xué)習(xí)李廣亮隙,找一匹識(shí)途的老馬;如果你連老馬也沒有垢夹,那最好可以三個(gè)臭皮匠好好討論溢吻,力圖勝過一個(gè)諸葛亮;如果三個(gè)臭皮匠連好好討論也做不到果元,那就是典型的烏合之眾了促王,最好寫代碼前,點(diǎn)上三炷香噪漾,斟上一杯濁酒硼砰,先拜拜菩薩且蓬,再拜拜谷歌欣硼。

我個(gè)人屬于性格溫和的(程序員大多性格不錯(cuò)),但確實(shí)見過少數(shù)強(qiáng)勢(shì)的人恶阴,說很多強(qiáng)勢(shì)的話诈胜。在技術(shù)上一言而決,一聽到任何反對(duì)就上升到私人恩怨冯事。這樣的風(fēng)格焦匈,到底是剛愎自用,還是胸有成竹昵仅,就需要仔細(xì)判斷了缓熟。

為什么說流程重要呢?實(shí)際上摔笤,如果團(tuán)隊(duì)上有孫悟空存在够滑,去西天取經(jīng),大概也不需要什么流程吕世,只要方向就可以了彰触。但作為普通的戰(zhàn)士,應(yīng)該先慮敗命辖。找人算命時(shí)况毅,應(yīng)該先聽聽不好的地方分蓖,好的地方就不用聽了,總歸是好的尔许,不好的地方一定要聽么鹤,這樣才能規(guī)避。

這就是我的態(tài)度:先悲觀一點(diǎn)母债,劃清底線午磁,考慮在這個(gè)底線上你該怎么做?

這是我做開發(fā)的一個(gè)習(xí)慣毡们,但這個(gè)習(xí)慣肯定不適用于買房迅皇。

怎么劃清底線呢?就是假想團(tuán)隊(duì)中沒有孫悟空了衙熔,光靠你唐玄奘登颓、豬八戒和沙和尚,應(yīng)該怎么去取經(jīng)红氯。

這個(gè)月走什么地方框咙,遇到山怎么走,遇到河怎么過痢甘,遇到路上有妖怪劫道喇嘱,誰去抵擋。遇到路上有少女要搭救塞栅,怎么辦者铜?這就是流程,是原則放椰。

我經(jīng)歷過一個(gè)流程很混亂的階段作烟。都是很多年前的事情了,可以拿出來說說砾医,不涉及單個(gè)人拿撩。

2011年在百度瀏覽器團(tuán)隊(duì)時(shí)遇到幾件讓人影響深刻的事情。 有一次開會(huì)如蚜,產(chǎn)品拿出 Google 某個(gè)產(chǎn)品的 DEMO压恒,里面有一段很酷炫 3D 效果,要求開發(fā)加上错邦,只給2天時(shí)間探赫,大家目瞪口呆。后續(xù)的開發(fā)為了趕節(jié)奏兴猩,導(dǎo)致非常多的 bug 期吓,又為了修改 bug ,leader 將所有的 bug 按照人員平均分配,導(dǎo)致不同模塊間的同學(xué)相互修改......實(shí)在難以想象讨勤。好比讓做花卷的廚子箭跳,去修改西湖醋魚的味道。

最初的現(xiàn)象是:bug下降的慢潭千,延伸 bug 反而增加谱姓,每個(gè)人都累的半死,代碼風(fēng)格極其雜亂刨晴,為了趕工導(dǎo)致的臨時(shí)方案層出不窮屉来;

到了中期:人員離職越來也多,代碼難以維護(hù)狈癞,新加的需求與之前的臨時(shí)方案沖突茄靠。

到了后期:想做一些修復(fù),想調(diào)整架構(gòu)蝶桶,又要保證正常運(yùn)行慨绳,其難度好比在一架飛行的飛機(jī)上拆換零件。

然后我也急忙離職了......實(shí)在看不到成功的可能性真竖。

后來到了騰訊的團(tuán)隊(duì)脐雪,感覺流程就規(guī)范多了。需求和bug 有 Tapd 跟蹤恢共,產(chǎn)品發(fā)布按照節(jié)奏战秋,需求提出前會(huì)和開發(fā)反復(fù)討論可行性,有專門的質(zhì)量跟蹤讨韭,有專門的用戶反饋脂信,每天知道要做什么,也知道明天要做什么拐袜。有產(chǎn)品需求吉嚣,也有開發(fā)需求梢薪!這個(gè)非常重要蹬铺。很多團(tuán)隊(duì),都是只有產(chǎn)品需求秉撇,開發(fā)好像牛一樣甜攀,耕完地就不管了?

流程其實(shí)沒那么復(fù)雜琐馆,就是各司其責(zé)+節(jié)奏规阀。我們都是“哆瑞咪發(fā)梭拉西多”中的一員,各自有各自的責(zé)任瘦麸,然后組合在一起谁撼,按照一個(gè)節(jié)奏跑起來。把該做的事情與該跑的節(jié)奏定好滋饲。

二厉碟、不要炫技喊巍,老老實(shí)實(shí)寫代碼

網(wǎng)上有一個(gè)段子,說有人要用JS實(shí)現(xiàn)一個(gè)簡(jiǎn)單的功能箍鼓,然后朋友給他推薦了幾十個(gè)庫崭参。

真的有必要嗎?具體情況具體分析款咖。

居家過日子何暮,你只需要一套普通的工具就可以了;如果你是修車的铐殃,你需要一套修車的工具海洼;如果你是光頭強(qiáng),你需要一臺(tái)伐木機(jī)富腊。吃飯用筷子贰军,用刀叉,都可以蟹肘,但不要用殺豬刀词疼,不要用丈八長(zhǎng)矛!帘腹,當(dāng)然也不能用牙簽贰盗。

用什么工具,用什么庫阳欲,問問過來人舵盈,多在KM上搜索一下。舉個(gè)例子:android 上加密球化,用 SQLChpher就可以了秽晚,微信也在用,你當(dāng)然可以學(xué)習(xí)筒愚;數(shù)據(jù)庫 ORM 思想赴蝇,用 KM 上推薦的 GreenDAO 就可以了;PC 上 3D 引擎巢掺,用OGRE就可以了句伶;小型游戲 DEMO,用 Irrlicht 足夠陆淀;寫 WebGL考余,用 ThreeJS 足夠。

首先想想:一些大庫hold 的住嗎轧苫,后續(xù)發(fā)展如何廓脆?這些庫對(duì)安裝包的體積影響有多大酬蹋?有沒有調(diào)研過同樣的產(chǎn)品在用什么阀溶?

想清楚了再?zèng)Q定用什么,最好是跟隨成功項(xiàng)目的腳步鳄袍。

三、架構(gòu)上實(shí)用+適用

很喜歡曾國(guó)藩的一句話:結(jié)硬寨吏恭、打呆仗拗小。

一字長(zhǎng)蛇陣、八門金鎖陣樱哼,哪個(gè)好哀九?iOS 都是單個(gè)進(jìn)程,微信 Android 版本3.5以前是單進(jìn)程搅幅,3.5以后有獨(dú)立的網(wǎng)絡(luò)進(jìn)程阅束; PC 瀏覽器的進(jìn)程架構(gòu)更加復(fù)雜,UI 進(jìn)程茄唐、內(nèi)核進(jìn)程息裸、Render 進(jìn)程,而且還有根據(jù)頁面多少的進(jìn)程調(diào)節(jié)模型沪编。

這些設(shè)計(jì)都很好呼盆,各有各的道理,都適用于當(dāng)前的產(chǎn)品蚁廓。所以我的觀點(diǎn)是:首先分析當(dāng)前產(chǎn)品的規(guī)模访圃、性質(zhì),然后再設(shè)計(jì)架構(gòu)相嵌。

在當(dāng)前階段達(dá)到:開發(fā)效率+架構(gòu)的平衡腿时;并向后展望3個(gè)月,或者半年左右饭宾,看看架構(gòu)能不能適應(yīng)批糟。

我做騰訊翻譯君時(shí),曾反復(fù)猶豫要不要模仿微信加入獨(dú)立的網(wǎng)絡(luò)進(jìn)程看铆。后來逆向了有排在第一二位的競(jìng)品徽鼎,最終采用了現(xiàn)在的主功能單進(jìn)程模型。

產(chǎn)品規(guī)模性湿、人員規(guī)模纬傲、功能階段满败,具體問題具體分析肤频。

四、既要有攻城之力算墨,也要有熬戰(zhàn)之氣——BUG

產(chǎn)品開發(fā)完成后宵荒,必然有bug 。其實(shí)開發(fā)人員在工作過程中,是有一定的直覺或者心理預(yù)判的报咳,即:某個(gè)功能模塊的質(zhì)量如何侠讯。這里面的質(zhì)量包括:可維護(hù)性、擴(kuò)展性暑刃、算法渲染效率厢漩,還有就是bug與崩潰率。

功能開發(fā)完成后岩臣,就要開始守城了溜嗜。

bug,一部分產(chǎn)生是由于架構(gòu)帶來的架谎,例如比較復(fù)雜的架構(gòu)炸宵,會(huì)導(dǎo)致復(fù)雜的實(shí)現(xiàn)細(xì)節(jié);

但還有很大部分bug谷扣,其實(shí)是基于如下三個(gè)原因產(chǎn)生的:

1 .?對(duì)于某個(gè)api的不了解土全,或者對(duì)于某個(gè)平臺(tái),或者 SDK 版本的不了解会涎。 舉例而言:android里面非主線程裹匙,是不能直接處理UI相關(guān)的事情的;JAVA 的內(nèi)存釋放也不是絕對(duì)的末秃,相互指向是無法釋放的幻件;函數(shù)個(gè)數(shù)是有DEX問題制約的---------------------這些bug的產(chǎn)生,也是開發(fā)人員摸索學(xué)習(xí)的過程蛔溃,經(jīng)歷過一次就不會(huì)再犯了绰沥。這是學(xué)習(xí)廣度與熟練度的問題;

2 .?還有一些bug贺待,是由于粗心大意導(dǎo)致的徽曲。例如空指針的問題,野指針的問題麸塞。在 C 的開發(fā)中秃臣,野指針的問題,GDI 句柄的釋放問題哪工,這些都是嚴(yán)謹(jǐn)?shù)拇a需要避免的奥此; 而又一些工具,或者方法是可以規(guī)避這些問題的雁比,例如 android中 的利用@ Nullable 和@ NonNull 加強(qiáng)空指針檢測(cè)等方法稚虎;

3 .?還有一些bug,是由于“使用情況各異導(dǎo)致的”偎捎。例如:偶現(xiàn)在某個(gè)模塊crash蠢终。這里的本質(zhì)還是因?yàn)檫壿嫷漠惓_吔鐩]有處理好序攘。例如 android 上的 OOM 問題,還有 PC 上 UI 焦點(diǎn)導(dǎo)致的對(duì)象釋放問題寻拂。這些異常情況程奠,一部分靠測(cè)試發(fā)現(xiàn),一部分靠用戶反饋祭钉,還有一部分就靠自己的異常處理瞄沙。例如Android中的try catch機(jī)制,其實(shí)就是遇到異常了慌核,你能糾正錯(cuò)誤的機(jī)會(huì)帕识。

五、自審

每過一段時(shí)間遂铡,都要站在高空俯視自己肮疗,問問:到底是在承擔(dān)過去,還是在改變未來扒接。

如果之前程序代碼質(zhì)量不好伪货,后面修改問題的時(shí)間就會(huì)比較多。到了開發(fā)的中期钾怔,得多問問自己碱呼,你在不停的改正以前的錯(cuò)誤,還是在做新的東西宗侦。如果修改錯(cuò)誤的時(shí)間多一點(diǎn)愚臀,那就要注意自己的代碼質(zhì)量了!

六矾利、注釋

我很喜歡寫注釋姑裂。有大牛說:代碼就是最好的注釋∧衅欤可惜我還沒有達(dá)到那個(gè)程度舶斧。所以,我會(huì)把注釋寫的非常清楚察皇。其一:為了自己以后維護(hù)的方便茴厉;其二:為了其他人接手的方便。



這是我在翻譯君項(xiàng)目中寫注釋的方式什荣。1:對(duì)于很復(fù)雜的邏輯矾缓,務(wù)必用12345的順序依次寫清楚;2 :對(duì)于函數(shù)中的某個(gè)參數(shù)稻爬,需要解釋為什么要設(shè)置這個(gè)參數(shù)嗜闻,尤其是公用工具類里面的函數(shù)---說清楚參數(shù)的背景含義,可以讓其他調(diào)用者理解的更加清晰因篇。

我一般不用英文寫泞辐。雖然這樣看起來格調(diào)很低笔横,但勝在大家都能輕松的看懂竞滓。寫代碼不能太傲嬌咐吼,寫注釋也不要太傲嬌,目的是讓你的搭檔或者接手者商佑,更輕松的理解锯茄,讓她/他少加班。

七茶没、代碼結(jié)構(gòu)

代碼結(jié)構(gòu)要清晰肌幽。有按照功能劃分的,有按照UI 結(jié)構(gòu)劃分的抓半。還有公用工具類喂急,有數(shù)據(jù)管理,有主邏輯控制笛求。不管用哪種思想廊移,有序的代碼結(jié)構(gòu),可以讓每個(gè)人感覺很干凈探入。好比日本的收納整理技巧讓很多小資推崇狡孔,無非就是干凈、整潔蜂嗽、便于管理苗膝。

而且,還有一個(gè)重要的好處:代碼結(jié)構(gòu)表現(xiàn)出來的其實(shí)是——程序的一個(gè)模塊邏輯思想——讓大家工作在不同的區(qū)域植旧。

八辱揭、代碼風(fēng)格

代碼風(fēng)格統(tǒng)一!好比一家人病附,有叫Tom 的界阁,有叫安東尼的,還有叫流川楓胖喳、石破天泡躯、圣杰夫拉斯基,無所適從丽焊。理論上较剃,看一個(gè)函數(shù),就能從名稱上區(qū)分哪些是成員變量技健,哪些是局部變量写穴,哪些是全局靜態(tài)值。

除了命名統(tǒng)一外雌贱,還有一行代碼最大的寬度啊送,函數(shù)的連續(xù)調(diào)用長(zhǎng)度等偿短,頭文件的包含風(fēng)格,也最好有一個(gè)約定馋没。類的出現(xiàn)時(shí)間昔逗,創(chuàng)建人名,最好也加上篷朵,看起來沒用勾怒,但到了追蹤問題時(shí),就能看出時(shí)間線的好處声旺。

九笔链、安全與逆向

這是針對(duì)Android說的,還有PC插件也需要考慮腮猖。Android 上首先要防止被別人逆向鉴扫,我成功逆向并重新打包過有第一位和第二位的競(jìng)品。這似乎有點(diǎn)不可思議澈缺,但確實(shí)做到了坪创。加固+混淆+代碼判斷,最好都有谍椅。

安全上误堡,可以看金剛掃描的漏洞,逐一修改就行雏吭。公司很多工具很好用的锁施!

十、開發(fā)效率

開發(fā)效率可以用這些方式提升:

1 .?構(gòu)建公用工具類杖们,方便大家使用

2 .?使用開源的一些包悉抵,例如 ORM 思想的數(shù)據(jù)庫等

3 .?可以很快的找到問題。開發(fā)中摘完,找 bug 的時(shí)間姥饰,往往是很多的。我用的方法有3個(gè): 使用 try catch孝治; 攔截所有 crash 到我指定的地方列粪;超多的 Log,Log 有統(tǒng)一的控制開關(guān)谈飒。

4 .?借力:數(shù)據(jù)上報(bào)用燈塔岂座,崩潰上報(bào)用 bugly,公司 KM 上很多經(jīng)驗(yàn)杭措,拿過來用费什。

十一、安裝包體積

1 .?TINY 壓縮圖片

2 .?刪除無效的資源文件

十二手素、UI渲染效率

UI 是用戶的第一感覺鸳址;UI 快并穩(wěn)定瘩蚪,第一感覺就不會(huì)差太多;管理好內(nèi)存稿黍,基本管理好了一半 crash疹瘦;管理好 UI,等于管理了人機(jī)交互感受闻察。

UI 上的開發(fā)是:渲染效率與渲染效果的平衡拱礁。

很匆忙的寫的琢锋,必然有很幼稚的地方辕漂,歡迎斧正。

對(duì)Java技術(shù)吴超,架構(gòu)技術(shù)感興趣的同學(xué)钉嘹,歡迎工作1-5年開發(fā)程序員加QQ群:645615966一起學(xué)習(xí),相互討論鲸阻。




<?_7????

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末跋涣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鸟悴,更是在濱河造成了極大的恐慌陈辱,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件细诸,死亡現(xiàn)場(chǎng)離奇詭異沛贪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)震贵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門利赋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人猩系,你說我怎么就攤上這事媚送。” “怎么了寇甸?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵塘偎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我拿霉,道長(zhǎng)吟秩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任友浸,我火速辦了婚禮峰尝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘收恢。我一直安慰自己武学,他們只是感情好祭往,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著火窒,像睡著了一般硼补。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上熏矿,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天已骇,我揣著相機(jī)與錄音,去河邊找鬼票编。 笑死褪储,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的慧域。 我是一名探鬼主播鲤竹,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼昔榴!你這毒婦竟也來了辛藻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤互订,失蹤者是張志新(化名)和其女友劉穎吱肌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仰禽,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氮墨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坟瓢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勇边。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖折联,靈堂內(nèi)的尸體忽然破棺而出粒褒,到底是詐尸還是另有隱情,我是刑警寧澤诚镰,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布奕坟,位于F島的核電站,受9級(jí)特大地震影響清笨,放射性物質(zhì)發(fā)生泄漏月杉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一抠艾、第九天 我趴在偏房一處隱蔽的房頂上張望苛萎。 院中可真熱鬧,春花似錦、人聲如沸腌歉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翘盖。三九已至桂塞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間馍驯,已是汗流浹背阁危。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汰瘫,地道東北人狂打。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像吟吝,于是被迫代替她去往敵國(guó)和親菱父。 傳聞我的和親對(duì)象是個(gè)殘疾皇子颈娜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫剑逃、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評(píng)論 4 62
  • 哈哈哈都以為會(huì)追我的一個(gè)學(xué)弟官辽,今天因?yàn)閷W(xué)妹的表白蛹磺,脫單了 人生真的太神奇了。這位先生同仆,鬼知道我要等你多久呀萤捆!我今天...
    要做配得上電腦的人閱讀 325評(píng)論 0 0
  • 01 ▲⊿ 久久等待別人的贊美俗或,哪怕是贊許的目光,又一次失望了岁忘。 我那樣的努力辛慰、真誠(chéng),不曾撒了一點(diǎn)謊干像。 加班到十點(diǎn)...
    生活不鬧閱讀 1,026評(píng)論 0 50
  • dispatch_once方法廢棄帅腌,可以使用如下兩種方式實(shí)現(xiàn): public extension Dispatch...
    效宇笑語閱讀 1,661評(píng)論 -6 2