你的代碼可以是優雅的,但是還有更重要的

引用
軟件設計有兩種方法:一種是盡可能地簡單,這種設計明顯沒有什么缺陷;另一種是盡可能地復雜,這種設計沒有明顯的缺陷。
——C.A.R. Hoare,1980年圖靈獎講座

在開發過程中,我的口頭禪是: Your code may be elegant, by mine works。我為此而常常受到質疑,也有人反駁我“你不會使用最優方法!”“你在逃避測試!” 為了避免一次又一次地重復解釋,我決定闡述下我的觀點,仁者見仁,智者見智。

首先,我認為“項目可能會延期,但是代碼會更好或更容易維護或更簡潔”這句話是有問題的。項目延期,就是未完成,不應該用代碼質量會更高作為借口。如果客戶要在圣誕節進行推廣活動,但你在12月29號才完成項目,即使提供了史上最好的產品,也是毫無價值的。

其次,我們來談談“最優方法”這個問題,“最優”是否意味著要寫出更易于維護的代碼需要更長的時間呢?其實除了大家都知道的《101個最優方法》以外,“最優”的標準是各種各樣的。無論你對其進行怎樣的定義,“最優方法”對所有程序員來說,應該是一種自然的編程標準。舉個最簡單的例子,經驗豐富的程序員會自然地將變量命名為:$a、$b、 $c等,也能正確地縮進代碼行。說得再深入一點,有經驗的開發者知道在什么時候、如何提高效率以使得項目能如期完成。雖然 “最優方法”的標準有很多,但這些標準不會令你因此而延長項目時間。這引出我將談到的下一點——Over-engineering(過度設計,指設計出來的系統比恰到好處要復雜臃腫的多,過度的封裝、一堆繼承、接口和無用的方法,以及超復雜的xml配置文件)。

像任何經驗豐富的程序員一樣,我了解那種想為每個項目搭建最好、最靈活、最耐用的系統的心態。但我也了解每個項目都有的商業限制:時間和資金。大多數項目都有明確的截止日期和項目預算,開發者要有意識地去控制項目規模以按時達到目標。你沒有任何理由花一周時間,來為一個20行的table表上的數據庫查詢設置“恰當的”緩存層。多了解實用案例,如果只是為了實現一個頁面訪客計數器的功能而構建支持多種同時響應請求的XHR框架,是不現實的。要有眼界,這是我最強調的一點,最好的程序員不是精通如何構建最棒的系統的人,而是了解系統不需要的是哪些功能的人。

另外,在軟件開發領域,上市時間是商業驅動力,在web應用開發領域,由于其動態性,這點更為明顯。當時間成為關鍵,“最優方法”就是最簡單的解決方案。

最后,我們來討論一下技術債務(指為了匆忙實現一個功能,破壞了現有的程序庫,在實現的過程中污染了代碼庫的設計)。如果在開發過程中,你在某個地方偷工減料了,那么就會產生無法解決的長期存在的技術債務,而且在之后的開發中,任何一個決定,都會受該債務的影響。事實上,在接手商業項目時,明白何時、如何對代碼進行簡化的能力是很關鍵的,這也是區分老手和菜鳥的標準。解決技術債務的辦法有很多,但應盡量做到不產生技術債務。同樣地,過度設計也不可避免地會產生技術債務。

通常人們在談到技術債務的危險時,并沒有包含商業影響。但其實技術債務與實際投資回報率是相對的,因為在許多情況下,早日上市更具成本效益。也有種情況是技術債務與收益同時存在,那么你可以慢慢償還債務,但這會延長你的項目時間,很可能當你解決完技術債務時,你也失去了市場機會。

作為軟件開發者,我們常常認為自己的工作就是開發軟件,但其實這只是一種手段,我們的目的是令開發商達到他們的商業目標,你的代碼也許很優雅很簡潔,但如果不能達到目的,就絲毫沒有意義。

英文原文:Your Code May Be Elegant

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

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

相關文章

15--0~n-1中缺失的數字

文章目錄1. 問題描述2. 解題代碼1. 問題描述 一個長度為n-1的遞增排序數組中的所有數字都是唯一的,并且每個數字都在范圍0~n-1之內。在范圍0~n-1內的n個數字中有且只有一個數字不在該數組中,請找出這個數字。 示例 1: 輸入: [0,…

如何在README中使用圖片

將圖片放在倉庫里面,在文件里鏈接它,最后 push 到 github 上。 github 圖片鏈接格式: (http://github.com/yourname/your-repository/raw/master/images-folder/xxx.png) 要自己設定的:yourname, your-repository, your-folder…

Unity中傳入任意數,轉換成分,秒,并進行倒計時換算..(兩種方式)

第一種方式是利用Unity中的協程,代碼如下: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class DemoTest : MonoBehaviour {public Text text;//測試用的數字public int MyTime 60;void Start (){//開啟協程…

內核編程小結(引用)

https://www.cnblogs.com/fanling999/p/4509785.html轉載于:https://www.cnblogs.com/endenvor/p/9006507.html

JIRA 5.0.1 發布

Atlassian公司發布了JIRA 5.0.1版本,該版本相比JIRA 5.0有更多改進功能。1. 管理界面的改進 將更多頁面管理轉為對話框形式。例如點擊頁面右上方的“Add New”就可實現新增issue types、sub-tasks、field configurations 、screens。2. 性能改進 解決了基于Lucene 3…

java開啟新線程的三種方法

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 方式1:繼承Thread類 步驟: 1):定義一個類A繼承于Java.lang.Thread類. 2):在A類中覆蓋Thread類中的run方法. 3):我們在ru…

16 --刪除排序數組中的重復項

文章目錄1.問題描述2.代碼實現1.問題描述 給定一個排序數組,你需要在 原地 刪除重復出現的元素,使得每個元素只出現一次,返回移除后數組的新長度。 不要使用額外的數組空間,你必須在 原地 修改輸入數組 并在使用 O(1) 額外空間的…

jquery評分效果Rating精華版

參考:https://blog.csdn.net/bluceyoung/article/details/8573629轉載于:https://www.cnblogs.com/yingyigongzi/p/9400489.html

NVIDIA助力SiemensPLMSoftware“工業4.0創新實驗室”,攜手推進中國制造創新之路

今日,NVIDIA宣布為SiemensPLMSoftware在北京建成的“工業4.0創新實驗室”提供了支持。該實驗室配備SiemensPLMSoftware全面的產品生命周期管理解決方案,結合第三方硬件,向中國制造企業展示“數字化企業”的全景圖。實驗室的工作站全部配備NVI…

java中的native方法

一. 什么是Native Method簡單地講,一個Native Method就是一個java調用非java代碼的接口。一個Native Method是這樣一個java的方法:該方法的實現由非java語言實現,比如C。這個特征并非java所特有,很多其它的編程語言都有這一機制&a…

17--合并兩個有序數組

文章目錄1.問題描述2.代碼實現1.問題描述 給你兩個有序整數數組 nums1 和 nums2,請你將 nums2 合并到 nums1 中,使 nums1 成為一個有序數組。 說明: 初始化 nums1 和 nums2 的元素數量分別為 m 和 n 。 你可以假設 nums1 有足夠的空間(空間…

Maven 添加本地 jar 包、添加依賴 jar 文件到本地 Maven 倉庫、引用本地 jar

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 把要用的jar放在固定位置: 2.打開CMD,進入到libs文件夾: 3.運行如下命令: mvn install:install-…

如鵬網 net高級技術 第二章 委托和事件(復習)

委托 委托是一種數據類型,可以聲明委托類型變量。 委托是一種可以指向方法的數據類型。 聲明委托的方式:delegate返回值類型 委托類型名(參數)   比如  delegate void MyDel(int n) 注意這里的除了前面的delegate,剩下部分和聲明一個函數一樣&#…

黃文俊:Serverless小程序后端技術分享

歡迎大家前往騰訊云社區,獲取更多騰訊海量技術實踐干貨哦~ 黃文俊,現任騰訊云SCF無服務器云函數高級產品經理,多年企業級系統開發和架構工作經驗,對企業級存儲、容器平臺、微服務架構、無服務器計算等領域均有涉獵。今天講的是怎么…

最少編碼原則

本文作者是一位資深軟件工程師,他根據多年的編程經驗,把自己的觀點組織整理成本文,希望能給大家一點啟發。 “最少編碼原則”并不是說寫的代碼少到令意思表達不清楚。其實在很多情況下,可以只寫幾行代碼就能執行相同的邏輯&#x…

什么是標記接口

標識接口的作用 標識接口是沒有任何方法和屬性的接口。標識接口不對實現它的類有任何語義上的要求,它僅僅表明實現它的類屬于一個特定的類型。 標接口在Java語言中有一些很著名的應用,比如java.io.Serializable和java.rmi.Remote等接口便是標識接口。標識…

18--兩數之和 II - 輸入有序數組

文章目錄1.問題描述2.解題代碼1.問題描述 給定一個已按照升序排列 的有序數組,找到兩個數使得它們相加之和等于目標數。 函數應該返回這兩個下標值 index1 和 index2,其中 index1 必須小于 index2。 說明: 返回的下標值(index1 和 index2&a…

阿里巴巴 連接池 druid 的使用、maven依賴

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. Druid是一個JDBC組件,它包括三部分: DruidDriver 代理Driver,能夠提供基于Filter-…

Oracle數據庫(二)—— 基本的SQL SELECT語句

(一)SQL語句分為一下三種類型 DML:Date Manipulation Language 數據操縱語言DDL:Data Definition Language 數據定義語言DCL:Data Control Language 數據控制語言DML:用于查詢與修改數據記錄 包括如下SQL語句&#xff…

簡單 3 步實現高效編程

本文的內容可能部分開發者已經了解,并且已經按照這些方法實施了。但本文還是想強調這些方法,因為這些簡單的方法可以讓你的工作更加高效。要想實現高效編程,最主要的是集中注意力,但這往往也是比較難以實現的,因為你在…