軟體的本質是什麼 ? | 軟體為什麼是軟體 ?
軟體為什麼是軟體 ? | 軟體的本質是什麼 ?
程式人 x 靈魂深處的疑問
大綱
- 程式人的疑問 ?
- 軟體的本質 ?
- 軟體為什麼要是軟的 ?
- 如何製作軟的產品 ?
- 掌握關鍵,展望未來 !
程式人的疑問 ?
各行各業,經營的關鍵核心,在 「一流的人讀書,都在哪裡畫線?」一書中提到 :
- 餐廳的關鍵點在於「口味」
- 零售商的關鍵點在於「品項」
- 經銷商的關鍵點在於「下游數量」
- 製造業的關鍵點在於「暢銷商品」
- 金融業的關鍵點在於「有錢的客戶」
軟體資訊業肯定也有關鍵點 !
學習程式設計到一定程度的人,可能都曾經在腦海中思考過這個問題,
這個問題的核心其實是在問:
- 軟體為什麼是軟體 ?
- 軟體的本質又是什麼 ?
軟體的本質 ?
軟體的本質是服務嗎 ?
正確一半
在剛開始進入職場工作時,我認為軟體的本質是「服務」,遇過的 SA 系統分析師,也是這樣認為。
拜讀過 無瑕的程式碼-整潔的軟體設計與架構篇 ( Clean Architecture )
序章提到 :
「軟體提供的價值有兩個,其中一個是服務。 另外一個在名稱中。」
軟體的本質在名稱中
Software
- Soft : (adj) 軟的 可以輕易改變的
- Ware : (n) 商品、產品
Software 可以輕易改變的產品
軟體的本質就在於,希望機器的行為是 「可以輕易改變的」!
如果希望機器的行爲是不可以改變的,那麼應該稱呼此種產品為「硬體」(Hardware)
軟體為什麼要是軟的 ?
軟體的優勢在哪 ?
兩個原因 :
- 成本
- 動態
第一個原因 :「成本」
孫子兵法 - 第二章 作戰篇
孫子曰:凡用兵之法,馳車千駟,革車千乘,帶甲十萬,千里饋糧。
則內外之費,賓客之用,膠漆之材,車甲之奉,日費千金,然後十萬之師舉矣。
其用戰也,貴勝,久則鈍兵挫銳,攻城則力屈,久暴師則國用不足。
夫鈍兵挫銳,屈力殫貨,則諸侯乘其弊而起,雖有智者,不能善其後矣。
故兵聞拙速,未睹巧之久也。夫兵久而國利者,未之有也。故不盡知用兵之害者,則不能盡知用兵之利也。
善用兵者,役不再籍,糧不三載,取用於國,因糧於敵,故軍食可足也。
國之貧於師者遠輸,遠輸則百姓貧;近於師者貴賣,貴賣則百姓竭,財竭則急於丘役。
力屈財殫,中原內虛於家,百姓之費,十去其七;
公家之費,破軍罷馬,甲胄矢弩,戟楯矛櫓,丘牛大車,十去其六。
故智將務食於敵,食敵一鍾,當吾二十鍾;萁稈一石,當吾二十石。
故殺敵者,怒也;取敵之利者,貨也。故車戰,得車十乘以上,賞其先得者,而更其旌旗。
車雜而乘之,卒善而養之,是謂勝敵而益強。
故兵貴勝,不貴久。故知兵之將,民之司命。國家安危之主也。
- 馳車千駟,革車千乘,帶甲十萬,千里饋糧 : 準備戰爭的成本
- 故兵聞拙速,未睹巧之久也。夫兵久而國利者,未之有也 : 準備要慢,動手要快
- 故智將務食於敵,食敵一鍾,當吾二十鍾;萁稈一石,當吾二十石 : 只要能夠壓低戰爭的成本,就能夠提高勝算
硬體 vs 軟體
雇用硬體工程師跟軟體工程師的薪資都一樣昂貴,但產品的設計通常需要大量的試錯,
產品原型的製作、升級、修正,硬體試誤的成本非常高。
如果硬體無法正常運作,通常代表要在花數個月的時間重新設計。
如果產品已經發佈了,全數招回的成本更是可觀。
但軟體如果不如預期運行,可能只需要花數分鐘到數天,找出問題修正、提交即可,
即使客戶已經正在使用產品了,也是可以透過後續的更新補丁修復回來。
硬體公司也可以運用軟體優勢
英特爾 (Intel) 原先是讓每一位客戶付費開發專利晶片,以設計代工為主要業務的公司 。
後來,知曉運用軟體把通用型晶片轉換為專業型晶片的意義。
省去每一位客戶,客製化的花費,專注在開發通用晶片,壓低成本並且大量製造。
促使 英特爾 (Intel) 從設計代工轉變成全球晶片產業微處理器的主要供應商。
第二個原因 :「動態」
一個企業要經營,不得不考慮的因素是「競爭力」,如果你有好的服務,競爭者一定會想方設法的模仿。
而軟體的彈性 ,就可以使產品提供的服務隨時可以改變,當你一直保持可以擴充的能力,競爭者就會慢一步
但一旦失去擴充的能力,
無法添加新的功能,或者添加新功能的成本太高,
對手就可能追上甚至超越,面臨被市場淘汰的危險。
軟體的版本可以不斷的演進,擴大競爭優勢
微軟的作業系統 :
- Windows 95
- Windows XP
- Windows Vista
- Windows 7
- Windows 10
版本持續演進,如果他的作業系統,因為大賣就一直賣,後續也沒有在更新
一定會有其他厲害的電腦工程師,創造出類似的作業系統來取代。
軟體具備不斷更新的特性,也使得潛在的競爭者,在相同的領域要贏過此企業
除了要完整複製軟體產品,還要比它的下一個版本更優秀,才可能戰勝。
如何製作軟的產品 ?
大方向來說兩點
- 程式碼本身
- 軟體設計的架構
程式碼
軟體工程師,可以很容易做出能動的程式,但不容易做出 :
- 容易閱讀的程式
- 容易維護的程式
- 容易擴充的程式
修正方案 : 一系列讓程式碼有序的動作
撰寫開發文件
Markdown 是個好選擇
規範代碼風格
以團隊為主,只要程式碼不要看起來像是一群意見不合的人協作,統一即可
使用單元測試
測試驅動開發:
開發時,先寫測試程式 在寫產品程式
軟體設計 : 架構
參考前人的設計經驗
物件導向設計 SOLID
- SRP : 單一職責原則
- OCP : 開放 - 封閉原則
- LSP : 里氏替換原則
- ISP : 介面隔離原則
- DIP : 依賴反向原則
元件內聚性原則
- REP : 再使用性 - 發佈等價原則
- CCP : 共同封閉原則
- CRP : 共同重複使用原則
元件耦合性原則
- ADP : 無循環依賴原則
- SDP : 穩定依賴原則
- SAP : 穩定抽象原則
領域驅動設計 - Domain-Driven Design
- 使用者介面層
- 應用層
- 領域層
- 基礎設施層
設計模式 - Desgin Pattern
- Factory Pattern
- Abstract Factory Pattern
- Singleton Pattern
- Builder Pattern
- Prototype Pattern
- Adapter Pattern
- Bridge Pattern
- Filter Pattern
- More ...
架構目標
高內聚,低耦合
遵循上述的原則,保持軟體具有一定程度的彈性
掌握關鍵,展望未來 !
要完全發揮軟體的優勢,需要去學習前人的經驗,
如果你是個程式設計師,或者是正在準備成為程式設計師的人,
可以在寫程式時 ,依據軟體的本質特性,思考如何為你正在寫的程式提供優勢。
架構思維
不因短期的利益,犧牲長期的利益
台灣的程式設計業 最大的公司是訊連,市值是台積電的千分之一,
台灣軟體產業並不強是事實,但並不代表「軟體」不行。
全世界最大的軟體公司是微軟,市值是台積電的四倍
如今已經掌握軟體業的關鍵點,還有機會
也許你也可以是下一個微軟、下ㄧ個谷歌、下一個臉書
參考資料
實體書籍
- 一流的人讀書,都在哪裡畫線 ?
- Clean Architecture 整潔的軟體設計與架構篇
- 華衫講透孫子兵法
- 好策略,壞策略
留言
張貼留言