做開發十年,我總結出了這些開發經驗

本文由云+社區發表,原文轉載地址:https://www.cnblogs.com/qcloud1001/p/10218876.html

在一線做了十年的開發,經歷了網易、百度、騰訊研究院、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,其實是基于如下三個原因產生的:

1 . 對于某個api的不了解,或者對于某個平臺,或者 SDK 版本的不了解。 舉例而言:android里面非主線程,是不能直接處理UI相關的事情的;JAVA 的內存釋放也不是絕對的,相互指向是無法釋放的;函數個數是有DEX問題制約的---------------------這些bug的產生,也是開發人員摸索學習的過程,經歷過一次就不會再犯了。這是學習廣度與熟練度的問題;

2 . 還有一些bug,是由于粗心大意導致的。例如空指針的問題,野指針的問題。在 C 的開發中,野指針的問題,GDI 句柄的釋放問題,這些都是嚴謹的代碼需要避免的; 而又一些工具,或者方法是可以規避這些問題的,例如 android中 的利用@ Nullable 和@ NonNull 加強空指針檢測等方法;

3 . 還有一些bug,是由于“使用情況各異導致的”。例如:偶現在某個模塊crash。這里的本質還是因為邏輯的異常邊界沒有處理好。例如 android 上的 OOM 問題,還有 PC 上 UI 焦點導致的對象釋放問題。這些異常情況,一部分靠測試發現,一部分靠用戶反饋,還有一部分就靠自己的異常處理。例如Android中的try catch機制,其實就是遇到異常了,你能糾正錯誤的機會。

五、自審

每過一段時間,都要站在高空俯視自己,問問:到底是在承擔過去,還是在改變未來。

如果之前程序代碼質量不好,后面修改問題的時間就會比較多。到了開發的中期,得多問問自己,你在不停的改正以前的錯誤,還是在做新的東西。 如果修改錯誤的時間多一點,那就要注意自己的代碼質量了!

六、注釋

我很喜歡寫注釋。有大牛說:代碼就是最好的注釋。 可惜我還沒有達到那個程度。所以,我會把注釋寫的非常清楚。其一:為了自己以后維護的方便; 其二:為了其他人接手的方便。

img

img

這是我在翻譯君項目中寫注釋的方式。1:對于很復雜的邏輯,務必用12345的順序依次寫清楚;2 :對于函數中的某個參數,需要解釋為什么要設置這個參數,尤其是公用工具類里面的函數---說清楚參數的背景含義,可以讓其他調用者理解的更加清晰。

我一般不用英文寫。雖然這樣看起來格調很低,但勝在大家都能輕松的看懂。寫代碼不能太傲嬌,寫注釋也不要太傲嬌,目的是讓你的搭檔或者接手者,更輕松的理解,讓她/他少加班。

七、代碼結構

代碼結構要清晰。有按照功能劃分的,有按照 UI 結構劃分的。還有公用工具類,有數據管理,有主邏輯控制。不管用哪種思想,有序的代碼結構,可以讓每個人感覺很干凈。好比日本的收納整理技巧讓很多小資推崇,無非就是干凈、整潔、便于管理。

而且,還有一個重要的好處:代碼結構表現出來的其實是——程序的一個模塊\邏輯思想——讓大家工作在不同的區域。

八、代碼風格

代碼風格統一!好比一家人,有叫 Tom 的,有叫安東尼的,還有叫流川楓、石破天、圣杰夫拉斯基,無所適從。理論上,看一個函數,就能從名稱上區分哪些是成員變量,哪些是局部變量,哪些是全局靜態值。

除了命名統一外,還有一行代碼最大的寬度,函數的連續調用長度等,頭文件的包含風格,也最好有一個約定。類的出現時間,創建人名,最好也加上,看起來沒用,但到了追蹤問題時,就能看出時間線的好處。

九、安全與逆向

這是針對Android說的,還有PC插件也需要考慮。Android 上首先要防止被別人逆向,我成功逆向并重新打包過有第一位和第二位的競品。這似乎有點不可思議,但確實做到了。加固+混淆+代碼判斷,最好都有。

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

十、開發效率

開發效率可以用這些方式提升:

1 . 構建公用工具類,方便大家使用

2 . 使用開源的一些包,例如 ORM 思想的數據庫等

3 . 可以很快的找到問題。開發中,找 bug 的時間,往往是很多的。我用的方法有3個: 使用 try catch; 攔截所有 crash 到我指定的地方;超多的 Log,Log 有統一的控制開關。

4 . 借力:數據上報用燈塔,崩潰上報用 bugly,公司 KM 上很多經驗,拿過來用。

十一、安裝包體積

1 . TINY 壓縮圖片

2 . 刪除無效的資源文件

十二、UI渲染效率

UI 是用戶的第一感覺;UI 快并穩定,第一感覺就不會差太多;管理好內存,基本管理好了一半 crash;管理好 UI,等于管理了人機交互感受。

UI 上的開發是:渲染效率與渲染效果的平衡。

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

?

轉載于:https://www.cnblogs.com/caodneg7/p/10224282.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395519.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395519.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395519.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2016年4月 TIOBE 編程語言排行榜

4月頭條: Visual Basic 正在漸行漸遠 COBOL, BASIC 和 FORTRAN 很長一段時間作為主力開發語言被使用。有很多軟件使用這些語言來編寫,并且發展的不亦樂乎。然而經過多年的發展,COBOL和FORTRAN逐漸被拋棄,而得益于微軟的存在,BASIC…

linux系統不知道電腦密碼怎么辦,Linux如何修復系統的Root密碼 -電腦資料

如果因為忘了root口令導致無法登錄系統,請試用下面的方法來改忘記的root口令:方法一:1、重新啟動系統,2、把光標定位在該選項上按下字母“e”鍵進入這個引導的編輯狀態;3、該選項有三行語句,請用光標選中第…

控制語句(4)

第4章 控制語句if<條件1>&#xff1a; <語句1>elif<條件2>: <語句2>elif<條件3>&#xff1a; <語句3>......else: <語句n>說明&#xff1a;elif語句&#xff0c;只要有一個條件成立&#xff0c;就會將其后的一個部分語句執行…

02 socketserver客戶端

import socket client socket.socket() client.connect((127.0.0.1,8001))while 1:msg input(客戶端說>>>)client.send(msg.encode(utf-8))from_server_msg client.recv(1024)print(from_server_msg.decode(utf-8)) 轉載于:https://www.cnblogs.com/work14/p/10235…

基于zbus的MySQL透明代理(100行)

項目地址 https://git.oschina.net/rushmore/zbus 我們上次講到zbus網絡通訊的核心API&#xff1a; Dispatcher -- 負責-NIO網絡事件Selector引擎的管理&#xff0c;對Selector引擎負載均衡 IoAdaptor -- 網絡事件的處理&#xff0c;服務器與客戶端共用&#xff0c;負責讀寫&am…

linux添加jetdirect協議,Padavan 路由器固件 不能驅動 hp1005、hp1020之類打印機 foo2zjs ZjStream協議的linux打印機驅動程序...

單擊鏈接&#xff0c;或剪切并粘貼下面的整個命令行以下載驅動程序。現在解壓縮它&#xff1a;Unpack:$ tar zxf foo2zjs.tar.gz$ cd foo2zjs現在編譯并安裝它。 INSTALL文件包含更詳細的說明; 請現在閱讀。Compile:$ makeGet extra files from the web, such as .ICM profiles…

返回指定月份的周列表 包含 周序號、開始日期、結束日期(不包含周末)

/*** 返回當前年月的周列表 包含 周序號、開始日期、結束日期(不包含周末)* param year 年* param month 月* returns {Array} */function getYearMonthWeekList(year,month) {var weekList[];var time year "/" month "/01";//取當前月的第…

tez-site.xml_數字支付系統的未來-Google Tez和音頻快速響應

tez-site.xmlby Vaidic Joshi通過Vaidic Joshi 數字支付系統的未來-Google Tez和音頻快速響應 (The future of digital payment systems — Google Tez and Audio Quick Response) Google recently marked its entry into the Indian digital payments market by introducing …

Window上安裝kafka

kafka在windows上的安裝、運行 - 進階者ryan-su - CSDN博客https://blog.csdn.net/u010283894/article/details/77106159 在Windows環境中安裝并使用kafka - 心靈空谷幽蘭 - 博客園https://www.cnblogs.com/xinlingyoulan/p/6054361.html?utm_sourceitdadao&utm_mediumref…

數集合有多少個TOJ(2469)

題目鏈接&#xff1a;http://acm.tju.edu.cn/toj/showp2469.html 感覺這個題目有點問題&#xff0c;算了不管他了&#xff0c;反正A了。 這里要注意的是求這個集合有多少種&#xff0c;那么就是要剔除重復數后&#xff0c;再數一下有多少個。 難一點的算法我也不會&#xff0c;…

linux path環境變量起什么作用,shell基礎(5)PATH環境變量的作用和使用方法

釋放雙眼&#xff0c;帶上耳機&#xff0c;聽聽看~&#xff01;關于PATH的作用PATH說簡單點就是一個字符串變量&#xff0c;當輸入命令的時候LINUX會去查找PATH里面記錄的路徑。比如在根目錄/下可以輸入命令ls,在/usr目錄下也可以輸入ls,但其實ls這個命令根本不在這個兩個目錄下…

天氣城市編碼對應地區編碼_如何在您的城市中建立強大的編碼社區-我是如何做到的...

天氣城市編碼對應地區編碼by Billy Le比利勒(Billy Le) 如何在您的城市中建立強大的編碼社區-我是如何做到的 (How you can build a strong coding community in your city — and how I did it) Communities are important. They are the bedrock that glues together shared…

python3 自動打包部署war包

2019獨角獸企業重金招聘Python工程師標準>>> 1 調用maven 命令打包 mvn -B -f D:/workspace/ksdcourse clean package 2 調用tomcat 部署war包 &#xff1b; 需要添加 CATALINA_HOME的環境變量 代碼如下&#xff1a; #!/usr/bin/python3# -*- coding: utf-8 -*-impo…

python 虛擬環境創建

創建虛擬環境&#xff1a;  sudo apt-get install virtualenv 新建虛擬環境文件夾 venv virtualenv venv 進入虛擬環境 source venv/bin/activate 安裝套件列表模塊: 用來記錄項目中所使用到的各種模塊&#xff0c;便于項目部署時統一安裝所需模塊 pip freeze > requir…

powershell開源新聞及簡介

作者&#xff1a;PowerShll傳教士 問&#xff1a;微軟的PowerShell腳本語言已經開源了 &#xff1f; 答&#xff1a;絕對真的&#xff01;已經&#xff01; 問&#xff1a;源碼在哪&#xff1f; 答&#xff1a;微軟.net源碼網站。 http://referencesource.microsoft.com/ 問&…

linux nginx重新編譯安裝,Linux系統Nginx編譯安裝教程

1、下載nginx1.2.4#注&#xff1a;下載地址&#xff1a;http://nginx.org/download/nginx-1.2.4.tar.gzwget -c http://nginx.org/download/nginx-1.2.4.tar.gz2、安裝#注&#xff1a;默認安裝到/usr/local/nginxtar -zxvf nginx-1.2.4.tar.gzcd nginx-1.2.4./configure如果出現…

htt://3g.hn_根據我對“詢問HN:誰在招聘?”的分析,開發人員技能發展趨勢

htt://3g.hnby Ryan Williams瑞安威廉姆斯(Ryan Williams) 根據我對“詢問HN&#xff1a;誰在招聘&#xff1f;”的分析&#xff0c;開發人員技能發展趨勢 (Trending Developer Skills, Based on my Analysis of “Ask HN: Who’s Hiring?”) For people learning to code an…

day1作業二:多級菜單操作

作業二&#xff1a;多級菜單 &#xff08;1&#xff09;三級菜單 &#xff08;2&#xff09;可以次選擇進入各子菜單 &#xff08;3&#xff09;所需新知識點&#xff1a;列表、字典 要求&#xff1a;輸入back返回上一層&#xff0c;輸入quit退出整個程序 思路&#xff1a; &am…

JDK源碼分析(5)之 HashMap 相關

HashMap作為我們最常用的數據類型&#xff0c;當然有必要了解一下他內部是實現細節。相比于 JDK7 在JDK8 中引入了紅黑樹以及hash計算等方面的優化&#xff0c;使得 JDK8 中的HashMap效率要高于以往的所有版本&#xff0c;本文會詳細介紹相關的優化&#xff0c;但是主要還是寫 …

linux usb init,復制Linux liveUSB導致init.d腳本出錯 - 不可能..?

請發表您的想法或想出的任何想法。我很想知道別人在想什么。整體問題當我安裝一個簡單的Java應用程序(我寫的)通過/etc/init.d/在啟動(在后臺)運行時&#xff0c;它適用于我明確安裝它的liveUSB。當我制作該棒的副本時&#xff0c;它永遠不會成功啟動。在引導liveUSB副本時&…