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

来源:https://www.cnblogs.com/qcloud1001/archive/2019/01/04/10218876.html
-Advertisement-
Play Games

本文由雲+社區發表 在一線做了十年的開發,經歷了網易、百度、騰訊研究院、MIG 等幾個地方,陸續做過 3D 游戲、2D 頁游、瀏覽器、移動端翻譯 app 等。 積累了一些感悟。必然有依然幼稚的地方,就當拋磚引玉,聊為笑談。 一、對於團隊而言,流程太重要了 行軍打仗,你需要一個嚮導;如果沒有嚮導,你需 ...


本文由雲+社區發表

在一線做了十年的開發,經歷了網易、百度、騰訊研究院、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 上的開發是:渲染效率與渲染效果的平衡。

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

此文已由作者授權騰訊雲+社區在各渠道發佈

獲取更多新鮮技術乾貨,可以關註我們騰訊雲技術社區-雲加社區官方號及知乎機構號


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、類的理論 1、類的核心概念:多態 是說父類的通用行為可以被子類用更特殊的行為重寫 二、類的機制 1、構造函數 類實例是有一個特殊的類方法構造的,這個方法名通常和類名一致; 類構造函數屬於類,構造函數大多需要用new來調。 2、類的多態 其實就是子類可以改寫父類的同名方法也可以調用繼承自父類的同名 ...
  • lastIndexOf() 方法可返回一個指定的字元串值最後出現的位置,在一個字元串中的指定位置從後向前搜索 var str = 'Hello World' str.lastIndexOf('Hello') 如果能匹配到 --> 返回一個指定的字元串值最後出現的位置 str.lastIndexOf( ...
  • //組件引入import pager from '../../component/pager/pager.vue' //組件調用聲明components:{ pager} //參數data () { return { pageSize: 30, //總頁數 -- 後臺傳值 pageNo: 2 //當 ...
  • 個人認為:margin是用來隔開元素與元素的間距;padding是用來隔開元素與內容的間隔。margin用於佈局分開元素使元素與元素互不相干;padding用於元素與內容之間的間隔,讓內容(文字)與(包裹)元素之間有一段“呼吸距離”。 ...
  • 總結了一些常見的http的狀態碼,以及常見的解決方案。 一.各範圍內狀態碼大致含義 1xx:臨時響應(Informational),需要請求者繼續執行操作的狀態代碼,表示伺服器正在接受請求。 2xx:成功狀態碼(Success),已成功接受客戶端請求。 3xx:重定向狀態碼(Redirection) ...
  • jQuery 選擇器 jQuery 效果函數 jQuery 文檔操作方法 這些方法對於 XML 文檔和 HTML 文檔均是適用的,除了:html()。 jQuery 屬性操作方法 下麵列出的這些方法獲得或設置元素的 DOM 屬性。 這些方法對於 XML 文檔和 HTML 文檔均是適用的,除了:htm ...
  • isNaN(val) 當val為NaN的時候,isNaN(val)返回ture 當val不為NaN的時候,isNaN(val)返回false ...
  • 居中問題: 1.Fixed定位margin:0 auto;不管用,水平居中需要做如下處理: position: fixed; top: 0; bottom: 0; left: 0; right: 0; margin: auto; 2.relative定位margin:0 auto;管用,水平居中需要 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...