行業本質:我們在做產品&辦公室裡的木匠
我們在做產品&辦公室裡的木匠
這不是木匠的兒子嗎?他母親不是叫馬利亞嗎?他弟兄們不是叫雅各、約西、西門、猶大嗎? 《馬太福音》 13:55
科學是什麼?不少人對科學抱著一種敬畏,乃至神聖的態度。不盡其然,正如有人解釋,所謂的科學就是一門一門的學問。一門一門的學問加起來,就是科學。軟體開發是門學問。以此理推之,那軟體開發也隸屬於科學範疇之一。那這到底是一門什麼樣的科學呢?難道真的如常人所想象的那樣神祕,甚至有如科學世界神聖而不可侵犯嗎?抑或,如牛頓所說的,科學在上帝眼中不過是兒戲?
作為平凡的程式設計師,我們自然難以像偉大的科學家牛頓那樣把科學看得那麼透徹,可同時身為這個行業的從業人員,我們又定然不會向隔行如隔山的外人一樣,把軟體世界看得過於神祕,深不可測。那麼,程式設計師本身到底該如何審視自己的所從事的行業呢? “詩人對宇宙人生,須入乎其內,又須出乎其外。入乎其內,故能寫之。出乎其外,故能觀之。入乎其內,故有生氣。出乎其外,故有高致。” 我國近、現代相交時期的著名學者王國維在<<人間詞話>>裡有對詩歌有這樣精闢的評說。事不同而理同。同樣的,要思考軟體開發的本質,最好的方法莫過於即“入乎其內”,又“出乎其外”。“入乎其內”時,觀察其內在規律和外在趨勢。“出乎其外”時,時爾審視其細微之處,時爾縱觀其整體脈絡,品察其微妙。正如<<道德經>>所說的,“常無慾,以觀其妙;常有欲,以觀其徼。” 當這樣如此反反覆覆的觀察、審視之後,或許不難發現其實軟體開發跟其他實體行業差不多,都是在做一些具體的產品。<<聖經>>上記著耶穌的父親約瑟是個木匠。照著古時一般“父承子業”的傳統,耶穌本人也應會木工。或許比較巧,我的父親也是個木匠,可是我沒有走子承父業的道路,去做個木匠,而選擇了軟體開發。去過幾次父親工作的地方,觀察過他們的工作。靜而想之,其實自己從事的是軟體開發,但性質跟做傢俱仍是一樣。只是工作環境不同,使用的行業工具不一樣罷了。工作環境,有些髒亂、吵鬧的大車間換成了整齊的、安靜的現代化辦公室。使用的行業工具,從笨重的機器換成了輕巧的筆記本。此外,就是工作最終的結果不同,他們產出的是傢俱,我們產出的是軟體系統。
程式語言翻譯
科技時代,傢俱廠裡基本已經見不到最初的斧頭和鋸了。相對來說,在農村卻依然可以看見不少斧頭和鋸了。在若干年前,鋸、斧頭和尺子等就是木匠吃飯的傢伙,他們靠著這些,憑著自己的手藝,把一堆堆笨重的木料就擺弄成了平整的、結實的傢俱。
程式碼清單1:Carpenter類原始碼
/** * 傢俱廠裡的故事 */ package furnitureFactory;
/** * 木匠 */ public class Carpenter {
/**
* 做傢俱的工具:鋸
*/
private String saw;
/**
* 做傢俱的工具:斧頭
*/
private String axe;
/**
* 做傢俱的工具:尺子
*/
private String ruler;
/**
* 做傢俱的材料:木料
*/
private String wood;
/**
* 要做的傢俱
*/
private String furniture;
/**
* 木匠拿出鋸鋸木材
* @return 鋸
*/
public String getSaw() {
return saw;
}
/**
* 給木匠一把鋸
* @param saw
*/
public void setSaw(String saw) {
this.saw = saw;
}
/**
* 木匠拿出斧頭劈木材
* @return 斧頭
*/
public String getAxe() {
return axe;
}
/**
* 給木匠一把斧頭
* @param axe
*/
public void setAxe(String axe) {
this.axe = axe;
}
/**
* 木匠拿尺子畫圖,量木材尺寸
* @return 尺子
*/
public String getRuler() {
return ruler;
}
/**
* 給木匠一把尺子
* @param ruler
*/
public void setRuler(String ruler) {
this.ruler = ruler;
}
/**
* 木匠拿到木料
* @return 木料
*/
public String getWood() {
return wood;
}
/**
* 給木匠做傢俱所要的木料
* @param wood
*/
public void setWood(String wood) {
this.wood = wood;
}
/**
* 木匠做好的傢俱
* @return 做好的傢俱
*/
public String getFurniture() {
return furniture;
}
/**
* 告訴要木匠做什麼樣的傢俱
* @param furniture
*/
public void setFurniture(String furniture) {
this.furniture = furniture;
}
/**
* 找來木匠時,首先要做的傢俱和提供的木料
* @param wood 提供的木料
* @param furniture 要做的傢俱
*/
public Carpenter(String wood,String furniture ){
this.wood = wood;
this.furniture = furniture;
}
/**
* 木匠開始做傢俱
*/
public String work(){
//以做書桌為例
//1、用尺子,按著書桌外觀要求,畫出設計圖紙。
//設計圖紙上標名書桌各個部分長寬高,如書桌的四個腳長多少、高多少、寬多少等;
//2、把傢俱拆分成幾個部分,如桌腳、抽屜、桌面等,再用斧頭和鋸分別做好這幾個部分
//3、組裝。把桌腳、抽屜、桌面等,組裝到一起,就成了一張書桌
//把做好的書桌交給客戶
return this.furniture;
}
public static void main(String[] args){
//找來木匠師傅(這裡用木匠祖師:魯班),給他提供一些松樹木料,要他做一個辦公桌
Carpenter luBan = new Carpenter("松樹木料","書桌");
//木匠祖師開始工作
String furniture = luBan.work();
}
}
就像木匠一樣,有著他們業內特有的行業傢伙。同樣的,軟體從業人員也有屬於自己行業特有的作業工具。電腦、開發語言、整合開發環境等,程式設計師就是靠著擺弄這些,折騰出一個有實際意義、有商業價值的軟體系統來的。電腦是工作中最基本的硬體平臺。整合開發環境,諸如一些工具Eclipse、Office、資料庫,以及畫圖的工具等等是程式設計師行業道具。其中,開發語言是比較重要的工具之一。根據這個可以分出些不同的領域、不同的崗位、不同的稱呼來,如Java程式設計師、C++程式設計師、PHP程式設計師等等。但究其本質來看,不管是整合開發環境也好,還是任何一門程式語言也罷,都是程式設計師開發軟體系統時的工具。
程式碼清單2:Developer類原始碼
/** * 軟體公司裡的故事 */ package softCompany;
/** * 程式設計師 */ public class Developer {
/**
* 整合開發環境:Integrated Development Environment
*/
private String IDE;
/**
* 使用的開發語言
*/
private String developLanguage;
/**
* 電腦
*/
private String computer;
/**
* 系統需求
*/
private String systemRequirement;
/**
* 做好的系統軟體
*/
private String software;
/**
* 得到程式設計師搭建的整合開發環境資訊
* @return
*/
public String getIDE() {
return IDE;
}
/**
* 程式設計師搭建整合開發環境
* @param iDE
*/
public void setIDE(String iDE) {
IDE = iDE;
}
/**
* 得到程式設計師用的開發語言
* @return
*/
public String getDevelopLanguage() {
return developLanguage;
}
/**
* 指定程式設計師用什麼開發語言
* @param developLanguage
*/
public void setDevelopLanguage(String developLanguage) {
this.developLanguage = developLanguage;
}
/**
* 得到程式設計師使用的電腦相關資訊
* @return
*/
public String getComputer() {
return computer;
}
/**
* 給程式設計師一臺電腦
* @param computer
*/
public void setComputer(String computer) {
this.computer = computer;
}
/**
* 得到程式設計師所理解的系統需求
* @return
*/
public String getSystemRequirement() {
return systemRequirement;
}
/**
* 給程式設計師指定系統需求
* @param systemRequirement
*/
public void setSystemRequirement(String systemRequirement) {
this.systemRequirement = systemRequirement;
}
/**
* 得到程式設計師開發好的系統軟體
* @return
*/
public String getSoftware() {
return software;
}
/**
* 指定程式設計師要做一個什麼型別的軟體
* @param software
*/
public void setSoftware(String software) {
this.software = software;
}
/**
* 給開發人員指定系統需求
* @param systemRequirement 提供的系統需求
*/
public Developer(String systemRequirement){
this.systemRequirement = systemRequirement;
}
/**
* 根據需求,開發系統
* @return 開發好的系統軟體
*/
public String developer(){
//以進銷存系統為例
//1、分析客戶提供的需求
//2、根據需求做出設計。
//一般先是大體的系統框架設計,然後再細化到模組設計,諸如庫存管理、銷售管理的具體設計等。
//3、根據設計編寫諸如庫存管理、銷售管理等各個功能模組的程式碼
//4、把做好的各個模組組織起來,連在一起構成整體,就是要做的系統軟體
//把開發好的系統軟體提交給客戶
return software;
}
public static void main(String[] args){
//找來開發人員,要其開發一個進銷存系統
Developer developer = new Developer("進銷存系統");
//開發人員開始開發。開發完成後,並把做好的進銷存系統提交給客戶。
String software = developer.developer();
}
}
小結 木匠把從自然界的樹木拿來做成為人所用的傢俱,讓人的生活變得更舒適,體現了人類管理、享受自然界的萬物的義務和權利。程式設計師開發出軟體系統來,目的在於更高效、更便捷的管理我們人類所擁有的資源。透過現象看本質,軟體開發究其本質還是在於管理自然界的資源,只是中間人類利用自己的聰明智慧發明了些工具,以便管理起來更便捷、更高效。 在此,不禁想起在做系統設計時,為了程式碼條理分明、結構清晰、擴充方便等,常常要分層。跟資料庫互動的,單獨隔出來分為一層,叫做DAO層。跟業務互動,也單獨隔開來分為一層,叫做Service層。頁面展現的再次單獨分為一層,叫做展現層。類似的,在沒有計算機之前,人類通過筆來寫,通過算盤來計算,再用賬本來記錄。有了計算機,軟體走進了公司,走進了人們的生活,鍵盤和滑鼠就代替了筆,CPU就代替了算盤,硬碟就代替了賬本。於是,人們似乎不再面對面的直接跟實體物質互動,而是簡單的對著電腦、對著應用系統去管理遠處或近處的物質。這樣一來,在人和物質的中間單獨隔出了一層,叫做資訊化。因為社會需要、時代需要,如今資訊化不僅已經成為一個產業,甚至已經成為一個產業鏈。可不管是發展成產業,還是延伸到了產業鏈的地步,究其本質仍然逃脫不了“管理海里的魚、空中的鳥、地上的牲畜和全地,並地上所爬行的一切昆蟲。”即<<聖經>>所說的,“神說:‘我們要照著我們的形像,按著我們的樣式造人,使他們管理海里的魚、空中的鳥、地上的牲畜和全地,並地上所爬的一切昆蟲。’(《創世記》 1:26)”
一個老木匠 穆旦
我見到那麼一個老木匠 從街上一條破板門。 那老人,迅速地工作著, 全然彎曲而蒼老了; 看他揮動沉重的板斧 像是不勝其疲勞。
孤獨的,寂寞的 老人只是一個老人。 伴著木頭,鐵釘,和板斧 春,夏,秋,冬……一年地,兩年地, 老人的一生過去了; 牛馬般的飢勞與苦辛, 像是沒有教給他怎樣去表情。 也會見:老人偶而吸著一支旱菸, 對著漆黑的屋角,默默地想 那是在感傷吧?但有誰 知道。也許這就是老人最舒適的一剎那 看著噴著的青煙縷縷往上飄。
沉夜,擺出一條漆黑的街 振出老人的工作聲音更為洪響。 從街頭處吹過一陣嚴肅的夜風 捲起沙土。但卻不曾搖曳過 那門板隙中透出來的微弱的燭影。
9月,29日,1934年
相關文章
- 智慧產品融入生活 盤點貼近我們生活的智慧家居產品
- 資料領域概念橫行?讓我們從本質出發
- 《流浪地球2》裡的機器人企業,如何高質量地交付產品?機器人
- 創業和打工的最本質區別在哪裡?創業
- 由情色行業想到產品經理與產品行業
- 半導體行業的ERP品質管理,如何操作行業
- 資料庫行業以及產品資料庫行業
- 我的產品/競品分析鍛鍊記錄(分析產品核心)
- 在《資訊簡史》裡讀資訊本質的迴歸史,重新認識你所在的行業行業
- 他們還在做遊戲遊戲
- SAP CRM行業解決方案裡的產品主資料高階搜尋功能行業
- 從程式碼到產品,我的IT職業成長之路
- 遊戲行業產品荒“不講武德”遊戲行業
- 蓋茨接受採訪時說:我們家從來不用蘋果的產品蘋果
- 從業者生存質量報告之 教育行業裡的IT男行業
- 汽車行業如何有效提升產品質量水平,六西格瑪培訓來解決行業
- 流量門檻加高、產品黑馬頻現,讓我們來聊聊遊戲出海的選品問題遊戲
- 電感行業,在困境中堅持品質行業
- JavaScript 疲勞終極指南:我們行業的真相JavaScript行業
- 作為AI產品經理,我們到底在優化什麼?AI優化
- 熊貓直播產品 VP:我的十年社群產品經驗談
- 淺談數棧產品裡的 Descriptions 元件元件
- Anson:關於Google Glass,我們在做的是未來(圖靈訪談)Go圖靈
- 從業者生存質量報告之,教育行業裡的IT男之苦行業
- 生產管理-移動端品質檢驗及裝置管理-行業經驗及方案行業
- 並行工程的本質分析(轉)並行
- 德國漢堡:我們愛上了這裡的生活方式,併成為了遊戲行業的一員遊戲行業
- 我的程式設計生涯裡啟發我的15本書程式設計
- win10產品金鑰專業版免費 win10產品金鑰在哪裡能找到Win10
- 我們應該定位在哪裡?
- 在程式猿的強烈要求下 我們殺了一個產品經理祭天
- 我們小公司,哪像華為一樣,用得上IPD(整合產品開發)?
- 我的會話(session)在做什麼?會話Session
- 我的會話session在做什麼?會話Session
- 聚焦使用者本質需求,解讀UCloud極簡產品背後的極深技術Cloud
- 與狼共舞---致資本遊戲裡的人們遊戲
- 產品經理的私房菜 - 騰訊產品模型 - 執行力篇模型
- 軟體產品安全測試,保障軟體產品質量的關鍵性步驟