軟件開發如同木匠做桌子

做一張桌子看起來十分的簡單。任何人都可以做,不是嗎?找個大塊的四方形木板,四個等長的木頭柱子,四個釘子和一個錘子。把四個柱子釘到四方板的四個角上,你就做成了一個桌子。當當當!

現在來讓一個真正的木匠為你打造一張桌子。首先他要花時間跟你討論桌子的用途和功能——用在室內還是室外,廚房還是餐廳,主要用來展示還是使用,它需要能夠承受多大的負載。然后他需要確定使用什么樣的材料——軟木還是硬木,用木板還是三合板還是鐵軌枕木。然后他會研究桌子的風格——桌邊的截面設計,桌腿底座設計,桌腿是按在中央還是四角。這最后,他才去動手做這張桌子,他花大量的時間去斜截,鑿眼,契合所有的連接點,安裝撐條,使用高質量的粘膠,木釘,螺釘,他要檢查表面平整,打磨它,著色,封蠟,拋光——打造出一張能夠引以為豪的桌子。看起來是一大堆的事情要做,不是嗎?它只是一張桌子,不是嗎?

兩種做桌子的方法存在著很多不同之處,你看出來了沒有?

只用了四個釘子的桌子看起來很毛糙,它不穩,因為桌腿不牢固,桌腳不平,頂多能用一個星期,它的一個腿就會扭斷,根本承受不起一個鹽罐子的重量。木匠的桌子看起來更好,好用而且美觀,它很牢固,不搖晃,桌腿經過矯正,直的,很平,沒有棱角,能用很久,你完全可以放心的在它上面擺上一頓豐盛的晚餐跟一群客人享用。你更想要哪個?

當人們談論起軟件,大多數人想像的工作量很像第一張桌子的建造過程。只需要創建一個數據庫,填上一些數據,畫出一些界面,這就完了,你就得到了一個軟件產品。我無論如何都想不出人們這樣的一種認識是怎么產生的。也許是人們用慣了Excel——“我可以用Excel做這些,所以編程應該很簡單”。什么?

開發軟件不容易。需要做很多的工作。非常像那個木匠做桌子的方式。作為設計師和程序員,我們需要理解業務、用戶用例,以及產品功能。我們需要討論和理解誰將要用它,它有什么功能,它如何和其它軟件集成,它要用在什么地方,數據量如何,等等,等等。我們然后才去花大量的時間搭建架構,確保它能承受用戶和數據負載壓力,要能夠升級和擴展,要能處理大數據量情況(例如單表負載)。我們然后需要更多的時間寫出有質量的、可讀的、可維護的代碼,測試每個組件,確保它們正確、快捷的運行,改正bug,清除瓶頸(在數據庫表模型上使用正確的結構和關聯)。我們還要使用更多的時間來把這些組件組合到一起,確保每個接口都正確的調用,確保錯誤都被捕捉到,確保界面設計可用,簡單,美觀(桌子的切截,鉆孔,契合,打磨,著色,拋光)。最終,我們交付客戶一個完整的可信賴的產品,一個符合需求的產品,一個我們和你們都引以為豪的產品。

我相信,木匠很少會遇到像程序員需要面對的那樣讓人抓狂的事。也許他的客戶也會抱怨做這個桌子花了太長的時間,或造價太高。也許他的客戶并沒有說桌子的用途或應該是個什么樣,然后大聲的抱怨它跟他從未說出的期望的樣子不一致。也許他們的客戶會瞪著他說做這樣的桌子只需要幾塊木板和幾個小時,木匠做桌子已經有幾千年的歷史了,這種桌子能有什么不同。也許他們的客戶會說這很簡單,所以應該很快,很便宜,魔術般的做出來,我猜測他們是這樣想的。

我們的客戶完全也是這樣。而且幾乎每次都這樣。從沒例外過,最初給我們新需求時說“這只需要你花幾個小時的時間…”,或“你可以這樣做…這樣更簡單”,或“你只需要簡單的把它改成…”。什么?

對軟件產品增加新功能可不像多釘一顆釘子或多加一個柱子。我們需要理解新功能的形式和功用,創建它,測試它,寫文檔,確保新增加的功能不會影響現有的系統。如果我們不這樣做,軟件就會做出錯,到處是bug,不能正確的運行,給用戶來帶來大量的問題。有很多軟件項目都是這樣,任何用過這種有問題的軟件的人都不會信任它,甚至不愿意使用它。就像那個搖晃的桌子。

如果你需要一個新功能,盡管提,但你要做好準備跟我們的木匠——程序員們認真仔細的討論它。我們會用正確的方案開發你要的應用,保證讓它正確的運行,一直正確的運行。你到我們這里來是想要有質量、可信賴的軟件,就像是你要從木匠那得到一個有質量的桌子。

千萬不要告訴我們這樣多簡單,多容易——除非你自己做過。如果你真的認為能既迅速又簡單的做出來,你自己試試。干吧,拼裝出一個搖晃的桌子。

如果你希望得到一個好的產品,你要理解明白開發需要時間和技能,有很多你根本想象不到的問題在里面,工匠們也是人,是有感情的,一個好的產品是一個永遠讓人快樂的事,值得我們付出努力和耐心,這樣,它將成為我們所有人能引以為豪的東西。


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

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

相關文章

Django加載靜態文件

方法一: 1.在app目錄中創建static 目錄,并在該目錄下創建存儲css,img,js的子目錄. 2.在相應的目錄下創建相對應的靜態文件. static/css/mystyle.css, static/img/timg.jpg,(保存圖片) static/js/myjs.js 3.在模板文件中加載靜態文件 例: mystyle.css: bo…

Flsak愛家租房--實名認證

0.頁面展示效果 1.設置用戶實名認證信息–后端代碼 api.route("/users/auth", methods["POST"]) login_required def set_user_auth():"""保存實名認證信息"""user_id g.user_id# 獲取參數req_data request.get_json()if …

IntelliJ 啟動不同端口的兩個spring cloud項目

IntelliJ 啟動不同端口的兩個spring cloud項目 1,使用maven進行clean package 2,在Terminal界面,輸入java -jar xxx.jar --server.port8001就可以更換server的啟動端口了;

python sort怎么用,Linux Sort命令詳細用法(有實例)

Linux Sort命令詳細用法(有實例)sort是在Linux里非常常用的一個命令,管排序的,集中精力,五分鐘搞定sort,現在開始!Linux sort命令進階:1 sort的工作原理sort將文件的每一行作為一個單位,相互比較…

需求分析階段各種圖的功能

實體聯系圖,描繪數據對象及數據對象之間的關系,是用于建立數據模型的圖形。數據流圖是建立功能模型的基礎。狀態轉換圖描繪了系統的各種行為模式和在不同狀態間轉換的方式。

python面試題總結(7)--操作類

1. Python 交換兩個變量的值 答:在 Python 中交換兩個對象的值通過下面的方式即可 a , b b ,a 但是需要強調的是這并不是元組解包,通過 dis 模塊可以發現,這是交換操作的字節碼是 ROT_TWO,意思是在棧的頂端做兩個值的互換操作。…

選擇讓孩子練習羽毛球的家長好好看看!

一、初級階段 主要要練習小孩的各項身體素質指標、基礎的發球和高遠球、最基礎的步伐訓練。根據小孩年齡的不同以及練習頻率的不同,大概需要100-300小時的訓練量(訓練間隔天數越多,時間需要越長)。 二、初級提高階段 高遠球對抗能…

LOJ#6281. 數列分塊入門 5

內存限制:256 MiB時間限制:500 ms標準輸入輸出題目類型:傳統評測方式:文本比較上傳者: hzwer提交提交記錄統計討論 1測試數據題目描述 給出一個長為 nnn 的數列,以及 nnn 個操作,操作涉及區間開…

版本控制工具歷史的10個里程碑

導讀:作者Eric Raymond在flourish上發表的一篇《Astonishments, ten, in the history of version control》,文中總結了版本控制工具的重要10個里程碑,一起與開發者分享下。 如果你想要了解真正的歷史,你需要回到在打孔卡上進行人…

php把語音轉成幀,[轉載]用TCP/IP實現自己簡單的應用程序協議:成幀器部分

在前面《字節和字符,對信息進行編碼》,《Socket>流,TCP連接,TCP可靠性概述》一系列的隨筆中我們已經表述了相應的理論知識,現在可以動手實現一個自己的應用程序協議。將 數據轉換成在線路上傳輸的字節序列只完成了一半的工作,在…

實體聯系圖簡介

通常,使用實體聯系圖(entity relationship diagram)來建立數據模型。可以把實體聯系圖簡稱為ER圖,相應地可把用ER圖描繪的數據模型稱為ER模型。 ER圖中包含了實體(即數據對象)、關系和屬性3種基本成分,通常用矩形框代表實體,用連…

Flask愛家租房--城區信息

0.效果展示 城市列表使用緩存的過程 1.后端代碼 # coding:utf-8from . import api from flask import g, current_app, jsonify, request, session from ihome.utils.response_code import RET from ihome.models import Area, House, Facility, HouseImage, User, Order from …

數值計算算法-多項式插值算法的實現與分析

數值計算是指在數值分析領域中的算法。數值分析是專門研究和數字以及近似值相關的數據問題,數值計算在數值分析的研究中發揮了特別重要的作用。 多項式插值是計算函數近似值的一種方法。其中函數值僅在幾個點上已知。 該算法的基礎是建立級數小于等于n的一個插值多項…

HIVE ORC 報錯ClassCastException

HIVE ORC格式的表查詢報錯 Failed with exception java.io.IOException:java.lang.ClassCastException: org.apache.hadoop.hive.ql.io.orc.OrcStruct cannot be cast to org.apache.hadoop.io.BinaryComparable 建表語句如下: CREATE EXTERNAL TABLE test_orc( te…

程序型語言VS.編譯型語言

導讀:每日[快訊精選]是由CSDN研發頻道推出的特色欄目,每一天我們將從國外技術媒體(例如Hacker News、Reddit...等等)中挑選出有價值的新聞簡訊,讓您在第一時間掌握業界主流的技術文摘,每天清晨為您獻上第一份技術早餐。 [1]程序型…

ancestral 箭頭符號,譯林版《牛津高中英語》模塊五 高二上學期

《牛津英語》由譯林出版社和牛津大學出版社聯合編寫出版。通過在南京和蘇州開始的試用,取得了非常良好的效果,己在省內全面推廣。有人認為新教材在教育觀念和編排體系上的改革力度是八十年代以來最大的一次。它帶給我們一線教師的沖擊無疑是巨大的。二、…

[NOI2012]騎行川藏

題解: 我發現拉格朗日乘數法真是個好東西。。 我是不會說我數學競賽求最值都是用這個東西的 由于我不太會打那個符號就用li代表通常偏導數中的lanmuda 。。。 這題里化簡一下就可以得到 2 li * ki * ?(vi??vi′?)* vi^2?1 然后一旦li確定 我們會發現這個三次函…

MAC地址和IP地址的關系

簡單地說:ip地址是服務商給你的,mac地址是你的網卡物理地址。 一、IP地址 對于IP地址,相信大家都很熟悉,即指使用TCP/IP協議指定給主機的32位地址。IP地址由用點分隔開的4個8八位組構成,如192.168.0.1就是一個IP地址…

Linux中斷 - tasklet

一、前言 對于中斷處理而言,linux將其分成了兩個部分,一個叫做中斷handler(top half),屬于不那么緊急需要處理的事情被推遲執行,我們稱之deferable task,或者叫做bottom half,。具體…