本文由騰訊云加社區(qū)整理和發(fā)布,原文鏈接:cloud.tencent.com/developer/article/1004735,內(nèi)容有刪減和改動(dòng)。
1、引言
在互聯(lián)網(wǎng)一線做了十年的程序開(kāi)發(fā),經(jīng)歷了網(wǎng)易、百度、騰訊研究院、MIG 等幾個(gè)地方,陸續(xù)做過(guò) 3D 游戲、2D 頁(yè)游、瀏覽器、移動(dòng)端翻譯 app 等。積累了一些感悟,但必然有依然幼稚的地方,就當(dāng)拋磚引玉,聊為笑談。
(本文同步發(fā)布于:http://www.52im.net/thread-2162-1-1.html)
2、關(guān)于作者
康亮:
騰訊高級(jí)工程師;
歷經(jīng)網(wǎng)易在線游戲事業(yè)部、百度客戶端部門(mén)、騰訊研究院、騰訊MIG;
橫跨多個(gè)平臺(tái)10年開(kāi)發(fā),目前負(fù)責(zé)騰訊翻譯君app。
3、對(duì)于開(kāi)發(fā)團(tuán)隊(duì)而言,流程太重要了
行軍打仗,你需要一個(gè)向?qū)В?/p>
如果沒(méi)有向?qū)В阈枰粋€(gè)地圖;
如果沒(méi)有地圖,至少要學(xué)習(xí)李廣,找一匹識(shí)途的老馬;
如果你連老馬也沒(méi)有,那最好可以三個(gè)臭皮匠好好討論,力圖勝過(guò)一個(gè)諸葛亮;
如果三個(gè)臭皮匠連好好討論也做不到,那就是典型的烏合之眾了,最好寫(xiě)代碼前,點(diǎn)上三炷香,斟上一杯濁酒,先拜拜菩薩,再拜拜谷歌。
我個(gè)人屬于性格溫和的(程序員大多性格不錯(cuò)),但確實(shí)見(jiàn)過(guò)少數(shù)強(qiáng)勢(shì)的人,說(shuō)很多強(qiáng)勢(shì)的話。在技術(shù)上一言而決,一聽(tīng)到任何反對(duì)就上升到私人恩怨。這樣的風(fēng)格,到底是剛愎自用,還是胸有成竹,就需要仔細(xì)判斷了。
為什么說(shuō)流程重要呢?
實(shí)際上,如果團(tuán)隊(duì)上有孫悟空存在,去西天取經(jīng),大概也不需要什么流程,只要方向就可以了。 但作為普通的戰(zhàn)士,應(yīng)該先慮敗。找人算命時(shí),應(yīng)該先聽(tīng)聽(tīng)不好的地方,好的地方就不用聽(tīng)了,總歸是好的,不好的地方一定要聽(tīng),這樣才能規(guī)避。
這就是我的態(tài)度:先悲觀一點(diǎn),劃清底線,考慮在這個(gè)底線上你該怎么做?
這是我做開(kāi)發(fā)的一個(gè)習(xí)慣,但這個(gè)習(xí)慣肯定不適用于買房。
怎么劃清底線呢?就是假想團(tuán)隊(duì)中沒(méi)有孫悟空了,光靠你唐玄奘、豬八戒和沙和尚,應(yīng)該怎么去取經(jīng)。
這個(gè)月走什么地方,遇到山怎么走,遇到河怎么過(guò),遇到路上有妖怪劫道,誰(shuí)去抵擋。遇到路上有少女要搭救,怎么辦?這就是流程,是原則。
我經(jīng)歷過(guò)一個(gè)流程很混亂的職業(yè)階段:都是很多年前的事情了,可以拿出來(lái)說(shuō)說(shuō),不涉及單個(gè)人。
2011年在百度瀏覽器團(tuán)隊(duì)時(shí)遇到幾件讓人影響深刻的事情。 有一次開(kāi)會(huì),產(chǎn)品拿出 Google 某個(gè)產(chǎn)品的 DEMO,里面有一段很酷炫 3D 效果,要求開(kāi)發(fā)加上,只給2天時(shí)間,大家目瞪口呆。后續(xù)的開(kāi)發(fā)為了趕節(jié)奏,導(dǎo)致非常多的 bug ,又為了修改 bug ,leader 將所有的 bug 按照人員平均分配,導(dǎo)致不同模塊間的同學(xué)相互修改......實(shí)在難以想象。好比讓做花卷的廚子,去修改西湖醋魚(yú)的味道。
最初的現(xiàn)象是:bug下降的慢,延伸 bug 反而增加,每個(gè)人都累的半死,代碼風(fēng)格極其雜亂,為了趕工導(dǎo)致的臨時(shí)方案層出不窮;
到了中期:人員離職越來(lái)也多,代碼難以維護(hù),新加的需求與之前的臨時(shí)方案沖突;
到了后期:想做一些修復(fù),想調(diào)整架構(gòu),又要保證正常運(yùn)行,其難度好比在一架飛行的飛機(jī)上拆換零件。
然后我也急忙離職了......實(shí)在看不到成功的可能性。
后來(lái)到了騰訊的團(tuán)隊(duì),感覺(jué)流程就規(guī)范多了。需求和 bug 有 Tapd 跟蹤,產(chǎn)品發(fā)布按照節(jié)奏,需求提出前會(huì)和開(kāi)發(fā)反復(fù)討論可行性,有專門(mén)的質(zhì)量跟蹤,有專門(mén)的用戶反饋,每天知道要做什么,也知道明天要做什么。有產(chǎn)品需求,也有開(kāi)發(fā)需求!這個(gè)非常重要。很多團(tuán)隊(duì),都是只有產(chǎn)品需求,開(kāi)發(fā)好像牛一樣,耕完地就不管了?
流程其實(shí)沒(méi)那么復(fù)雜,就是各司其責(zé)+節(jié)奏。我們都是“哆瑞咪發(fā)梭拉西多”中的一員,各自有各自的責(zé)任,然后組合在一起,按照一個(gè)節(jié)奏跑起來(lái)。把該做的事情與該跑的節(jié)奏定好。
▲ 圖左 - “精英團(tuán)隊(duì)”,圖右 - “烏合之眾”
4、不要炫技,老老實(shí)實(shí)寫(xiě)代碼
網(wǎng)上有一個(gè)段子:說(shuō)有人要用JS實(shí)現(xiàn)一個(gè)簡(jiǎn)單的功能,然后朋友給他推薦了幾十個(gè)庫(kù)(哈哈哈!)。
真的有必要嗎?具體情況具體分析。
1)居家過(guò)日子,你只需要一套普通的工具就可以了;
2)如果你是修車的,你需要一套修車的工具;
3)如果你是光頭強(qiáng),你需要一臺(tái)伐木機(jī)。
吃飯用筷子,用刀叉,都可以,但不要用殺豬刀,不要用丈八長(zhǎng)矛!當(dāng)然也不能用牙簽。
用什么工具,用什么庫(kù),問(wèn)問(wèn)過(guò)來(lái)人,如果是騰訊內(nèi)部,可以多在KM上搜索一下。
舉個(gè)例子:
1)android 上加密,用 SQLCipher就可以了,微信也在用,你當(dāng)然可以學(xué)習(xí)(《微信本地?cái)?shù)據(jù)庫(kù)SQLCipher破解版》);
2)數(shù)據(jù)庫(kù) ORM 思想,用 KM 上推薦的 GreenDAO 就可以了;
3)PC 上 3D 引擎,用OGRE就可以了;
4)小型游戲 DEMO,用 Irrlicht 足夠;
5)寫(xiě) WebGL,用 ThreeJS 足夠。
首先想想:一些大庫(kù) hold 的住嗎,后續(xù)發(fā)展如何?這些庫(kù)對(duì)安裝包的體積影響有多大?有沒(méi)有調(diào)研過(guò)同樣的產(chǎn)品在用什么?
想清楚了再?zèng)Q定用什么,最好是跟隨成功項(xiàng)目的腳步。
5、架構(gòu)上要遵循:實(shí)用+適用的原則
很喜歡曾國(guó)藩的一句話:結(jié)硬寨、打呆仗。
一字長(zhǎng)蛇陣、八門(mén)金鎖陣,哪個(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ù)頁(yè)面多少的進(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á)到:開(kāi)發(fā)效率+架構(gòu)的平衡;并向后展望3個(gè)月或者半年左右:看看架構(gòu)能不能適應(yīng)。
我做騰訊翻譯君時(shí),曾反復(fù)猶豫要不要模仿微信加入獨(dú)立的網(wǎng)絡(luò)進(jìn)程。后來(lái)逆向了有排在第一二位的競(jìng)品,最終采用了現(xiàn)在的主功能單進(jìn)程模型。
產(chǎn)品規(guī)模、人員規(guī)模、功能階段,具體問(wèn)題具體分析。
6、既要有攻城之力,也要有改Bug的熬戰(zhàn)之氣
產(chǎn)品開(kāi)發(fā)完成后,必然有 bug 。其實(shí)開(kāi)發(fā)人員在工作過(guò)程中,是有一定的直覺(jué)或者心理預(yù)判的,即:某個(gè)功能模塊的質(zhì)量如何。 這里面的質(zhì)量包括:可維護(hù)性、擴(kuò)展性、算法\渲染效率,還有就是bug與崩潰率。
功能開(kāi)發(fā)完成后,就要開(kāi)始守城了。
bug,一部分產(chǎn)生是由于架構(gòu)帶來(lái)的,例如比較復(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ì)的,相互指向是無(wú)法釋放的;函數(shù)個(gè)數(shù)是有DEX問(wèn)題制約的---------------------這些bug的產(chǎn)生,也是開(kāi)發(fā)人員摸索學(xué)習(xí)的過(guò)程,經(jīng)歷過(guò)一次就不會(huì)再犯了。這是學(xué)習(xí)廣度與熟練度的問(wèn)題;
2)還有一些bug,是由于粗心大意導(dǎo)致的。例如空指針的問(wèn)題,野指針的問(wèn)題。在 C 的開(kāi)發(fā)中,野指針的問(wèn)題,GDI 句柄的釋放問(wèn)題,這些都是嚴(yán)謹(jǐn)?shù)拇a需要避免的; 而又一些工具,或者方法是可以規(guī)避這些問(wèn)題的,例如 android中 的利用@ Nullable 和@ NonNull 加強(qiáng)空指針檢測(cè)等方法;
3)還有一些bug,是由于“使用情況各異導(dǎo)致的”。例如:偶現(xiàn)在某個(gè)模塊crash。這里的本質(zhì)還是因?yàn)檫壿嫷漠惓_吔鐩](méi)有處理好。例如 android 上的 OOM 問(wèn)題,還有 PC 上 UI 焦點(diǎn)導(dǎo)致的對(duì)象釋放問(wèn)題。這些異常情況,一部分靠測(cè)試發(fā)現(xiàn),一部分靠用戶反饋,還有一部分就靠自己的異常處理。例如Android中的try catch機(jī)制,其實(shí)就是遇到異常了,你能糾正錯(cuò)誤的機(jī)會(huì)。
7、自審、反思
每過(guò)一段時(shí)間,都要站在高空俯視自己,問(wèn)問(wèn):到底是在承擔(dān)過(guò)去,還是在改變未來(lái)。
如果之前程序代碼質(zhì)量不好,后面修改問(wèn)題的時(shí)間就會(huì)比較多。到了開(kāi)發(fā)的中期,得多問(wèn)問(wèn)自己,你在不停的改正以前的錯(cuò)誤,還是在做新的東西。 如果修改錯(cuò)誤的時(shí)間多一點(diǎn),那就要注意自己的代碼質(zhì)量了!
▲ 程序員的“進(jìn)階之路”
8、注釋!注釋!
我很喜歡寫(xiě)注釋。
有大牛說(shuō):代碼就是最好的注釋。 可惜我還沒(méi)有達(dá)到那個(gè)程度。
所以,我會(huì)把注釋寫(xiě)的非常清楚:
其一:為了自己以后維護(hù)的方便;
其二:為了其他人接手的方便。
上圖兩個(gè)截圖,是我在翻譯君項(xiàng)目中寫(xiě)注釋的方式:
1)對(duì)于很復(fù)雜的邏輯,務(wù)必用12345的順序依次寫(xiě)清楚;
2)對(duì)于函數(shù)中的某個(gè)參數(shù),需要解釋為什么要設(shè)置這個(gè)參數(shù),尤其是公用工具類里面的函數(shù)---說(shuō)清楚參數(shù)的背景含義,可以讓其他調(diào)用者理解的更加清晰。
我一般不用英文寫(xiě)。雖然這樣看起來(lái)格調(diào)很低,但勝在大家都能輕松的看懂。寫(xiě)代碼不能太傲嬌,寫(xiě)注釋也不要太傲嬌,目的是讓你的搭檔或者接手者,更輕松的理解,讓她/他少加班。
9、代碼結(jié)構(gòu)
代碼結(jié)構(gòu)要清晰。有按照功能劃分的,有按照 UI 結(jié)構(gòu)劃分的。還有公用工具類,有數(shù)據(jù)管理,有主邏輯控制。不管用哪種思想,有序的代碼結(jié)構(gòu),可以讓每個(gè)人感覺(jué)很干凈。好比日本的收納整理技巧讓很多小資推崇,無(wú)非就是干凈、整潔、便于管理。
而且,還有一個(gè)重要的好處:代碼結(jié)構(gòu)表現(xiàn)出來(lái)的其實(shí)是——程序的一個(gè)模塊\邏輯思想——讓大家工作在不同的區(qū)域。
10、代碼風(fēng)格
代碼風(fēng)格統(tǒng)一!好比一家人,有叫 Tom 的,有叫安東尼的,還有叫流川楓、石破天、圣杰夫拉斯基,無(wú)所適從。
理論上,看一個(gè)函數(shù),就能從名稱上區(qū)分哪些是成員變量,哪些是局部變量,哪些是全局靜態(tài)值。
除了命名統(tǒng)一外,還有一行代碼最大的寬度,函數(shù)的連續(xù)調(diào)用長(zhǎng)度等,頭文件的包含風(fēng)格,也最好有一個(gè)約定。類的出現(xiàn)時(shí)間,創(chuàng)建人名,最好也加上,看起來(lái)沒(méi)用,但到了追蹤問(wèn)題時(shí),就能看出時(shí)間線的好處。
這方面可以看看阿里團(tuán)隊(duì)做的幾個(gè)編碼規(guī)范方面的規(guī)約,《重磅發(fā)布:《阿里巴巴Android開(kāi)發(fā)手冊(cè)(規(guī)約)》[附件下載]》、《阿里技術(shù)結(jié)晶:《阿里巴巴Java開(kāi)發(fā)手冊(cè)(規(guī)約)-終極版》[附件下載]》。
11、安全與逆向
這是針對(duì)Android說(shuō)的,還有PC插件也需要考慮。Android 上首先要防止被別人逆向,我成功逆向并重新打包過(guò)有第一位和第二位的競(jìng)品。這似乎有點(diǎn)不可思議,但確實(shí)做到了。加固+混淆+代碼判斷,最好都有。
安全上,可以看金剛掃描的漏洞,逐一修改就行。
12、開(kāi)發(fā)效率
開(kāi)發(fā)效率可以用這些方式提升:
1)構(gòu)建公用工具類,方便大家使用;
2)使用開(kāi)源的一些包,例如 ORM 思想的數(shù)據(jù)庫(kù)等;
3)可以很快的找到問(wèn)題。開(kāi)發(fā)中,找 bug 的時(shí)間,往往是很多的。我用的方法有3個(gè): 使用 try catch; 攔截所有 crash 到我指定的地方;超多的 Log,Log 有統(tǒng)一的控制開(kāi)關(guān)。
附錄:更多感悟、思考
[1] 程序員的百味人生:
《一個(gè)微信實(shí)習(xí)生自述:我眼中的微信開(kāi)發(fā)團(tuán)隊(duì)》
《微信程序員創(chuàng)業(yè)總結(jié):如何提高Android開(kāi)發(fā)效率》
《如何做一個(gè)合格的 iOS Team Leader》
《程序員中年危機(jī):拿什么拯救你,我的三十五歲》
《一個(gè)魔都程序員的3年:從程序員到CTO的歷練》
《為什么說(shuō)即時(shí)通訊社交APP創(chuàng)業(yè)就是一個(gè)坑?》
《致我們?cè)僖不夭蝗サ?Github ...》
《一名90后二流大學(xué)程序員的自述:我是如何從“菜鳥(niǎo)”到“辣雞”的》
《一個(gè)魔都程序員的3年:從程序員到CTO的歷練》
《選擇比努力更重要:我是如何從流水線工人到程序員的?》
《程序員的抉擇:必須離開(kāi)帝都——因?yàn)槌斯ぷ鳈C(jī)會(huì),還有什么值得留戀?》
《干了這碗雞湯:從理發(fā)店小弟到阿里P10技術(shù)大牛》
《程序員神級(jí)跳槽攻略:什么時(shí)候該跳?做什么準(zhǔn)備?到哪里找工作?》
《感悟分享:在騰訊的八年,我的成長(zhǎng)之路和職業(yè)思考》
《調(diào)皮的程序員:Linux之父雕刻在Linux內(nèi)核中的故事》
《迷茫中前行:一個(gè)專科渣渣菜鳥(niǎo)的編程入門(mén)感悟》
《機(jī)會(huì)不給無(wú)準(zhǔn)備的人:一個(gè)Android程序員屢戰(zhàn)屢敗的悲慘校招經(jīng)歷》
《笑中帶淚的碼農(nóng)往事:入職三天被開(kāi),公司給100塊叫我走人,有我慘?》
《阿里技術(shù)分享:阿里自研金融級(jí)數(shù)據(jù)庫(kù)OceanBase的艱辛成長(zhǎng)之路》
《干貨分享:十年大廠資深程序員的開(kāi)發(fā)經(jīng)驗(yàn)總結(jié)》
>> 更多同類文章 ……
[2] 即時(shí)通訊/社交產(chǎn)品的實(shí)踐總結(jié)、感悟分享:
《技術(shù)往事:微信估值已超5千億,雷軍曾有機(jī)會(huì)收編張小龍及其Foxmail》
《QQ和微信兇猛成長(zhǎng)的背后:騰訊網(wǎng)絡(luò)基礎(chǔ)架構(gòu)的這些年》
《閑話即時(shí)通訊:騰訊的成長(zhǎng)史本質(zhì)就是一部QQ成長(zhǎng)史》
《騰訊開(kāi)發(fā)微信花了多少錢?技術(shù)難度真這么大?難在哪?》
《技術(shù)往事:史上最全QQ圖標(biāo)變遷過(guò)程,追尋IM巨人的演進(jìn)歷史》
《開(kāi)發(fā)往事:深度講述2010到2015,微信一路風(fēng)雨的背后》
《開(kāi)發(fā)往事:記錄微信3.0版背后的故事(距微信1.0發(fā)布9個(gè)月時(shí))》
《微信七年回顧:歷經(jīng)多少質(zhì)疑和差評(píng),才配擁有今天的強(qiáng)大》
《前創(chuàng)始團(tuán)隊(duì)成員分享:盤(pán)點(diǎn)微信的前世今生——微信成功的必然和偶然》
《QQ的成功,遠(yuǎn)沒(méi)有你想象的那么順利和輕松》
《[技術(shù)腦洞] 如果把14億中國(guó)人拉到一個(gè)微信群里技術(shù)上能實(shí)現(xiàn)嗎?》
《QQ和微信止步不前,意味著即時(shí)通訊社交應(yīng)用創(chuàng)業(yè)的第2春已來(lái)?》
《那些年微信開(kāi)發(fā)過(guò)的雞肋功能,及其帶給我們的思考》
《為什么說(shuō)即時(shí)通訊社交APP創(chuàng)業(yè)就是一個(gè)坑?》
《即時(shí)通訊創(chuàng)業(yè)必讀:解密微信的產(chǎn)品定位、創(chuàng)新思維、設(shè)計(jì)法則等》
《老羅最新發(fā)布了“子彈短信”這款I(lǐng)M,主打熟人社交能否對(duì)標(biāo)微信?》
《盤(pán)點(diǎn)和反思在微信的陰影下艱難求生的移動(dòng)端IM應(yīng)用》
《QQ現(xiàn)狀深度剖析:你還認(rèn)為QQ已經(jīng)被微信打敗了嗎?
《那些年微信開(kāi)發(fā)過(guò)的雞肋功能,及其帶給我們的思考》
《漸行漸遠(yuǎn)的人人網(wǎng):十年親歷者的互聯(lián)網(wǎng)社交產(chǎn)品復(fù)盤(pán)和反思》
《中國(guó)互聯(lián)網(wǎng)社交二十年:全民見(jiàn)證的互聯(lián)網(wǎng)創(chuàng)業(yè)演義》
>> 更多同類文章 ……
(本文同步發(fā)布于:http://www.52im.net/thread-2162-1-1.html)