軟體的本質是什麼 ? | 軟體為什麼是軟體 ?

 



軟體為什麼是軟體 ? | 軟體的本質是什麼 ?

程式人 x 靈魂深處的疑問

大綱

  • 程式人的疑問 ?
  • 軟體的本質 ?
  • 軟體為什麼要是軟的 ?
  • 如何製作軟的產品 ?
  • 掌握關鍵,展望未來 !

程式人的疑問 ?

各行各業,經營的關鍵核心,在 「一流的人讀書,都在哪裡畫線?」一書中提到 :

  • 餐廳的關鍵點在於「口味」
  • 零售商的關鍵點在於「品項」
  • 經銷商的關鍵點在於「下游數量」
  • 製造業的關鍵點在於「暢銷商品」
  • 金融業的關鍵點在於「有錢的客戶」

軟體資訊業肯定也有關鍵點 !

學習程式設計到一定程度的人,可能都曾經在腦海中思考過這個問題,

這個問題的核心其實是在問:

  • 軟體為什麼是軟體 ?
  • 軟體的本質又是什麼 ?

軟體的本質 ?

軟體的本質是服務嗎 ?

正確一半

在剛開始進入職場工作時,我認為軟體的本質是「服務」,遇過的 SA 系統分析師,也是這樣認為。

拜讀過 無瑕的程式碼-整潔的軟體設計與架構篇 ( Clean Architecture )

序章提到 :

「軟體提供的價值有兩個,其中一個是服務。 另外一個在名稱中。」


軟體的本質在名稱中

Software

  • Soft : (adj) 軟的 可以輕易改變的
  • Ware : (n) 商品、產品
Software 可以輕易改變的產品

軟體的本質就在於,希望機器的行為是 「可以輕易改變的」!

如果希望機器的行爲是不可以改變的,那麼應該稱呼此種產品為「硬體」(Hardware)



軟體為什麼要是軟的 ?

軟體的優勢在哪 ?

兩個原因 :

  1. 成本
  2. 動態

第一個原因 :「成本」

孫子兵法 - 第二章 作戰篇

孫子曰:凡用兵之法,馳車千駟,革車千乘,帶甲十萬,千里饋糧。
則內外之費,賓客之用,膠漆之材,車甲之奉,日費千金,然後十萬之師舉矣。
其用戰也,貴勝,久則鈍兵挫銳,攻城則力屈,久暴師則國用不足。
夫鈍兵挫銳,屈力殫貨,則諸侯乘其弊而起,雖有智者,不能善其後矣。
故兵聞拙速,未睹巧之久也。夫兵久而國利者,未之有也。故不盡知用兵之害者,則不能盡知用兵之利也。
善用兵者,役不再籍,糧不三載,取用於國,因糧於敵,故軍食可足也。
國之貧於師者遠輸,遠輸則百姓貧;近於師者貴賣,貴賣則百姓竭,財竭則急於丘役。
力屈財殫,中原內虛於家,百姓之費,十去其七;
公家之費,破軍罷馬,甲胄矢弩,戟楯矛櫓,丘牛大車,十去其六。
故智將務食於敵,食敵一鍾,當吾二十鍾;萁稈一石,當吾二十石。
故殺敵者,怒也;取敵之利者,貨也。故車戰,得車十乘以上,賞其先得者,而更其旌旗。
車雜而乘之,卒善而養之,是謂勝敵而益強。
故兵貴勝,不貴久。故知兵之將,民之司命。國家安危之主也。
  • 馳車千駟,革車千乘,帶甲十萬,千里饋糧 : 準備戰爭的成本
  • 故兵聞拙速,未睹巧之久也。夫兵久而國利者,未之有也 : 準備要慢,動手要快
  • 故智將務食於敵,食敵一鍾,當吾二十鍾;萁稈一石,當吾二十石 : 只要能夠壓低戰爭的成本,就能夠提高勝算

硬體 vs 軟體

雇用硬體工程師跟軟體工程師的薪資都一樣昂貴,但產品的設計通常需要大量的試錯,

產品原型的製作、升級、修正,硬體試誤的成本非常高

如果硬體無法正常運作,通常代表要在花數個月的時間重新設計。

如果產品已經發佈了,全數招回的成本更是可觀。

但軟體如果不如預期運行,可能只需要花數分鐘到數天,找出問題修正、提交即可,

即使客戶已經正在使用產品了,也是可以透過後續的更新補丁修復回來。


硬體公司也可以運用軟體優勢

英特爾 (Intel) 原先是讓每一位客戶付費開發專利晶片,以設計代工為主要業務的公司 。

後來,知曉運用軟體把通用型晶片轉換為專業型晶片的意義

省去每一位客戶,客製化的花費,專注在開發通用晶片,壓低成本並且大量製造。

促使 英特爾 (Intel) 從設計代工轉變成全球晶片產業微處理器的主要供應商。


第二個原因 :「動態」

一個企業要經營,不得不考慮的因素是「競爭力」,如果你有好的服務,競爭者一定會想方設法的模仿

而軟體的彈性 ,就可以使產品提供的服務隨時可以改變,當你一直保持可以擴充的能力,競爭者就會慢一步

但一旦失去擴充的能力,

無法添加新的功能,或者添加新功能的成本太高,

對手就可能追上甚至超越,面臨被市場淘汰的危險。


軟體的版本可以不斷的演進,擴大競爭優勢

微軟的作業系統 :

  • Windows 95
  • Windows XP
  • Windows Vista
  • Windows 7
  • Windows 10

版本持續演進,如果他的作業系統,因為大賣就一直賣,後續也沒有在更新

一定會有其他厲害的電腦工程師,創造出類似的作業系統來取代。

軟體具備不斷更新的特性,也使得潛在的競爭者,在相同的領域要贏過此企業

除了要完整複製軟體產品,還要比它的下一個版本更優秀,才可能戰勝。



如何製作軟的產品 ?

大方向來說兩點

  1. 程式碼本身
  2. 軟體設計的架構

程式碼

軟體工程師,可以很容易做出能動的程式,但不容易做出 :

  • 容易閱讀的程式
  • 容易維護的程式
  • 容易擴充的程式

修正方案 : 一系列讓程式碼有序的動作

撰寫開發文件

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 整潔的軟體設計與架構篇
  • 華衫講透孫子兵法
  • 好策略,壞策略

網路文章




留言

熱門文章

Markdown 語法大全,範例模板

【如何寫乾淨的程式碼 ? 】程式設計 代碼風格 指南 | 基礎 + 9 個進階概念

【 git 基礎教程 #1】什麼是 git ? | Sourcetree 介紹 與 入門基礎操作教學

【什麼是 git flow ?】 5 項分支全詳解 | Sourcetree 實戰演練