論一個程式員的自我修養

来源:http://www.cnblogs.com/junyuhuang/archive/2016/02/01/5172434.html
-Advertisement-
Play Games

在《喜劇之王》中,周星馳扮演的尹天仇,一直夢想成為一名演員,而他不管是在扮演跑龍套,或者在街坊中開設演員訓練班,亦或成為主角時,他對待演員的態度,始終是認真,熱愛而又投入的。而那一本他隨身攜帶的書--《演員的自我修養》,儘管不知道裡面具體寫的是什麼,但我猜,他對待演員的態度和行為,就是書中內容顯示的


 

  在《喜劇之王》中,周星馳扮演的尹天仇,一直夢想成為一名演員,而他不管是在扮演跑龍套,或者在街坊中開設演員訓練班,亦或成為主角時,他對待演員的態度,始終是認真,熱愛而又投入的。而那一本他隨身攜帶的書--《演員的自我修養》,儘管不知道裡面具體寫的是什麼,但我猜,他對待演員的態度和行為,就是書中內容顯示的。

  於是,不禁問了問自己,作為一名程式員,一個“程式員的自我修養”是什麼?

  儘管我們不一定要像尹天仇那麼的認真對待自己的事業,但,一些基本的修養,作為一名新時代的碼農,總應該是要具備的吧。不過真要說修養,方面還是挺多的,技術自我提示自不必說。但我並不打算從這個大家都覺得理所當然的技術方面入手,而是談談,可讀性代碼,這個容易被大家忽視的基本素養。

1、遵從所在團隊的代碼規範。

  一個高效、成熟的團隊,必定有一個屬於自己的代碼規範,這個規範是團隊的寶貴的財富,它是整個團隊從各種坑中爬起來後積累的經驗教訓。什麼是規範,它是人們從無數經驗中總結出來的規則,標準。而代碼規範,指導團隊成員如何以最短的時間寫成最高效,可讀性強的代碼。試想,如果成員不遵從規範,你用駝峰命名,他用下劃線,這對程式的可讀,將造成多大的影響。我想,應該沒有一個人願意去閱讀一段,各種變數命名形式都能見得到,private, public 方法隨意排序,甚至常量類都散落在各個角落的代碼吧。

  代碼,一個作用是讓機器閱讀,另一個重要的作用是讓人閱讀!!!

 

2、遵從行業內通用的規範

  在團隊的代碼規範未涉及到的,那請按照行業內的規範來編寫代碼。規範的一個好處是,可以明顯減少學習和交流成本。在java中,當我們看到全大寫的變數名時,我們就知道這是常量,而不需要去看註釋,不需要去看代碼邏輯。為什麼這麼迅速,因為行業里大家都習慣把常量用大寫命名。但假如你用其他命名方式命名常量,比如team_nums命名常量,不僅不能讓人迅速知道這是個常量,而且可能讓人誤會這是個變數,增加了團隊成員學習和溝通成本,甚至可能誤導他們。就見過一位仁兄,明明用的是工廠模式,偏偏按模版模式的命名方式來命名,問他,他說他知道這是工廠模式,但他覺得,更應該叫模版模式。。。我的天,,你這麼任性,以後還能做朋友麽?

  舉個例子,我們需要根據支付類型,來生產多個支付產品,於是,我們寫了個工廠類,命名為FactoryPay。當其他人看到一個類叫FactoryPay,他們會猜測,這應該是個工廠類,負責生產各種支付產品的工廠,然後按照這個猜測去閱讀代碼,就能比較快速的理解整個類的作用。但是,假如我取名PowerPay,別人還不知道是啥,看了半天,才明白,這是個工廠的作用。這就明顯增加了他人的學習成本和維護代碼的成本。

  不管你是新手還是老鳥,務必瞭解施行行業規範,切勿為了標新立異而違反規範。這麼低端的裝逼,就沒必要採用了,要裝也寫個高端的框架來提升逼格唄。

 

3、變數、方法命名要能表達變數作用

  在程式員這個圈子很久了,就發現,程式員這貨,都喜歡這套,“這個介面幹嘛用的,有文檔麽”,“自己看代碼去”。很多時候都是一臉黑。

  儘管程式員閱讀別人代碼技術都是一流,不管你是有沒有註釋,不管你是怎麼迴圈嵌套,也不管你是怎麼命名,他們都能耐心的,把代碼分析個所以然來。但,對於程式員這個視時間寶貴如生命,分分鐘都能創造幾百萬價值的群體來說,您行行好,給我們省點時間吧,把變數是幹啥用的,說清楚唄,沒準節省的這幾分鐘,多賺個幾萬,還能請大家出去嗨呢。

  每每看到部門的某大神,用一個神一般的變數名“flag”,我就有吐血的衝動,他還這個flag一直雪藏,不用,只是傳遞到第n個方法才使用,頓時心力交瘁,我的天,這個flag都是是幹嘛用的啊,後來才明白,是isPay的意思,用來標識用戶是否支付成功了。當時一口老血吐屏幕上,心裡狂吐槽,老兄,你命名個isPay會死麽,我的腦細胞這麼不值錢麽。到後來看到,去魔法數字,用int NUM_7 = 7,而不是MAX_MEMBERS來表示最大成員、用x y z來命名變數名,各種只有作者,或者作者後來都忘了的獨特命名方式,都見怪不怪了。更有甚者,一個變數命名為passed,作用居然是“未通過”的意思,當時就石化了,作者還真是用心良苦,這都要考我細心不細心。

  一個好的變數名,能幫助閱讀者瞭解變數的作用,也輔助了對整段代碼的理解。

 

4、不要show英語,鄉下的孩子傷不起唉

  LZ所在的團隊,英語一直都是團隊的硬傷,但總是能看到,某位仁兄,加上大把大把的英文註釋,有些變數名也取些高大上的複雜的英語單詞。敢問,你這麼高的逼格,以後我們怎麼和你玩啊。(那位仁兄其實就是LZ,年輕時唉,罪過罪過)

  代碼是用來溝通的,傳遞作者意圖的,都看不懂,怎麼溝通交流。建議英語好的童鞋,英語能力可以放到閱讀英文書籍中展示,在代碼中,如果團隊英語能力很弱,避免使用英文,變數命名也儘量按照團隊英語水平來命名

 

5、添加必要的註釋

  正如上面LZ說的,經常遭遇“你仔細看看代碼,就知道幹嘛用的”這樣的神回覆。儘管閱讀代碼是每個程式員的強項,但必要的註釋,比如邏輯比較複雜的地方,添加必要的註釋,對提升團隊成員閱讀熟悉代碼的效率是有很大幫助的。試想,一個類,幾百行,沒有一行註釋,對於閱讀者來說,閱讀它將是一個多麼恐怖的事。

 

6、註釋保持簡潔,避免沒有必要的註釋

  即看過一行註釋都沒有的代碼,也看過註釋比代碼還要多的程式。一個是讓人生不如死,一個是讓人痛不欲生。(唉,有時不僅感嘆,在程式員界混,真的是難)。

LZ就經常看過,一大段註釋,啰嗦了半天,要不就是沒表達清楚重點,要不就是只為說明它是個迴圈的作用!!!譬如i++這樣的代碼,有必要加個“每個計數增加1”這樣的註釋麽,這完全是把讀者定位為非程式員啊,或者就是嚴重鄙視讀者的編程水平。

  註釋是幫助閱讀的人更好的理解程式的邏輯,只是輔助,如果不重視通過命名等方式來傳遞代碼的作用,而是依賴於註釋,這就是本末倒置了。而且,冗長啰嗦的註釋,這到底是幫助人理解,還是阻礙人理解啊,是讀程式還是讀小說啊。 

 

7、擁有自己的編碼規範

  規範是為了讓團隊更快的理解、熟悉代碼的,同理,擁有自己的一套規範,就能幫助其他人更快的理解我們所寫的功能,減少學習和溝通成本。 

 

8、代碼清晰簡潔的表達出作者的意思

  在我們每次寫完一段代碼時,一定要問問自己,代碼是否表達清楚了我的意思,是否需要添加些註釋,名字取得是否恰當了,別人在閱讀時是否吃力。。每每看到別人一團糟的費解的代碼,就時刻提醒自己,一定要把代碼寫好咯,我也確實是這麼做的,一遍又一編的檢查,看變數名、方法名是否表明瞭它的用途,是否有些不必要的、只是為了提升逼格的代碼,別人是否能在短時間內看懂。所有的這些,只是為了寫出一段更優美的代碼。

 

9、堅持並捍衛上面的準則

  經常能聽到,有些公司是代碼行數來定義績效的,但作為一個有操守,並秉承基本自我修養的程式員,我們絕不能為了各種誘惑或者脅迫,甚至是自己的惰性、個性,而放棄寫出簡潔清晰,可讀的代碼。

  

  以上的幾點,並不是嚴格的意見或者建議,只是提醒廣大程式員同胞們,在痴心與高端的技術時,千萬不要忘了,代碼不僅機器要閱讀,人也需要閱讀。就算你寫出再複雜的代碼,但它讓人完全無法閱讀,這有什麼用呢。這就如同,你很牛逼很牛逼,但別人聽不懂你說的話,還不是沒用。如果你真的寫出了可讀性強的代碼,但你也不應該鳴鳴得意,我覺得,寫出一段優美,健壯,可讀性高的代碼,是一個程式員最基本的自我修養。如果這個追求都沒有,那和鹹魚有啥區別呢。雖然常被外人看來邋裡邋遢,不善交流,但我們的的代碼優美,每段代碼都清晰簡潔的表達了心中的想法,這不也很好麽。代碼作為程式員間交流溝通的媒介,一定要保持它的高效溝通的屬性,切不要為了自己的個性,而犧牲它的可讀性。在此,建議大家業餘時間閱讀些比如《clean code》、《how to be a better programmer》等相關書籍


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

-Advertisement-
Play Games
更多相關文章
  • 轉自:http://www.infoq.com/cn/news/2015/12/linux-performance 如果你的Linux伺服器突然負載暴增,告警簡訊快發爆你的手機,如何在最短時間內找出Linux性能問題所在?來看Netflix性能工程團隊的這篇博文,看它們通過十條命令在一分鐘內對機器性
  • 目的:把本地上傳的圖片放置到跟目錄下的Images/Upload文件夾下。 修改步驟: 1、ueditor.config.js文件中的, imagePath: URL + "net/" 修改為: imagePath: "/" 2、net文件夾下的Config.cs文件中, public static
  • class ServicePinger { private static readonly ILog log = LogManager.GetLogger(typeof(ServicePinger)); public ServicePinger(string siteName, string sit
  • 前臺代碼: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 <div> <asp:GridView ID="GridView1" runa
  • 一個項目,一分收穫;一個項目,一些資源。Ktv項目也是一樣的,所以我想分享我的收穫,讓你們獲得你需要的資源。 一. 那MyKTV點歌系統具體的功能有哪些呢?我們就來看看吧! 1.MyKTV前臺功能: 01.歌星點歌 、拼音點歌 、數字點歌 、類型選擇 、金榜排行 02.切歌 、點歌 、重唱和退出 2
  • 近段時間,開發的需要,需要寫一個winform的程式。用VB.NET來寫。 開發開始,需要實現一個窗體設為多文檔界面 (MDI) 子窗體的容器。實現這個功能,開始找資料,得知設置一個屬性:Form.IsMdiContainer,它預設值為False,沒為True即可。 或者是form Load時添加
  • 前言 作為一隻菜鳥,之前學了一段時間的WPF,但是沒有總結,過了一學期發現好多東西都忘記了,很多東西還是需要記下來,以備後續複習。 數據綁定在事件中應用非常廣泛,可以有效地減少代碼量,那麼什麼是數據綁定?說的簡單就是從源對象提取一些信息,將其用於設置目標對象的屬性,這裡有一點需要註意,目標屬性需要是
  • c語言inline函數的使用 轉載自:http://blog.chinaunix.net/uid-21843265-id-3056446.html 大學在教科書上學習過inline函數,定義為inline函數之後,會省去函數調用的開銷,直接嵌套彙編代碼,取代函數調用,提高效率。工作後項目中也 很少用
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...