碼農的靈魂拷問之(二)什麼是應用軟體

  • 2022 年 11 月 6 日
  • 筆記

什麼是應用軟體?這是一個看似很無聊很沒有營養的的問題。然而如果不能立刻回答出來,則這意味著一個更加有趣的事實:作為一個程式設計師,天天在開發程式,然而卻無法解釋明白是應用軟體,這說明這個問題看似無聊實則水很深,是一個值得深思的問題。

在回答這個問題之前,我們先簡化一下。如果問軟體是什麼,作為一個有實際工作經驗的程式設計師,即使無法對軟體給出清晰的定義,但是他至少能識別什麼東西是軟體,什麼東西不是。所以在此,我們不必去糾結軟體這個術語,因為能區分什麼是什麼不是就說明我們已經理解了這個概念。

然而,應用軟體是什麼?這個就比較難以回答了。我們也不一定分的清楚什麼是應用軟體什麼不是應用軟體。作為一名單純平凡普通守法的程式設計師,上百度百科搜一下應用軟體這個概念,發現是這麼解釋的:

應用軟體(Application)是和系統軟體相對應的,是用戶可以使用的各種程式設計語言,以及用各種程式設計語言編製的應用程式的集合,分為應用軟體包和用戶程式。應用軟體包是利用電腦解決某類問題而設計的程式的集合,多供用戶使用。
應用軟體是為滿足用戶不同領域、不同問題的應用需求而提供的那部分軟體。 它可以拓寬電腦系統的應用領域,放大硬體的功能。

第一句話咱就看不懂,因為它說應用軟體是跟系統軟體相對應的概念。然而什麼是系統軟體?幸好,百度百科在應用軟體的詞條下貼心給出了解釋:

系統軟體是指控制和協調電腦及外部設備,支援應用軟體開發和運行的系統,是無需用戶干預的各種程式的集合,主要功能是調度,監控和維護電腦系統;負責管理電腦系統中各種獨立的硬體,使得它們可以協調工作。系統軟體使得電腦使用者和其他軟體將電腦當作一個整體而不需要顧及到底層每個硬體是如何工作的。

那麼現在懂了嗎?說句實在話,我不懂。因為從百度百科上引用過來的這兩段話,有幾個明顯的問題:

  1. 我們都知道軟體是人直接或間接寫出來的,那麼無論系統軟體還是應用軟體,它們必然都是人用程式設計語言編製出來的。哪怕是拿電話機按0101寫程式的大神,那也是在使用機器語言編寫程式,這仍然逃不開程式設計語言的框子。因此,是不是用程式設計語言開發出來的,這不能作為區分應用軟體還是系統軟體的依據。
  2. 系統軟體的概念解釋相對清晰,但也不算太清晰。比如它提到監控、維護電腦系統,眾所周知,360安全衛士可以監控咱們的電腦系統免受病毒侵害,那麼它算不算系統軟體呢?如果它算,同時它又是用戶可以使用的軟體,那麼它到底是個什麼鬼?

正是因為這些自相矛盾或存在歧義的概念定義,使得我們搞不懂什麼是應用軟體。要搞清應用軟體到底是什麼,我們需要先回答另一個極為重要的問題:我們開發的軟體是如何操控硬體的?

public class Main {
    public static void main(String[] args) {
        System.out.println("hello world");
    }
}

以上是一個平淡無奇的java hello world示例程式碼。運行它可以在螢幕上輸出hello world這行字。然而為什麼它可以控制螢幕顯示這行字呢?

此時我們不必翻開厚達千頁的電腦科學系列叢書去尋找這個答案,我們可以從非常簡單的常識去倒推背後的原理。具體如下:

  1. 我們都知道軟體可以控制硬體,那麼同樣我們可知控制螢幕顯示什麼也一定是通過軟體實現的。
  2. 不同的程式語言都可以控制螢幕輸出hello world,但是他們的具體寫法各不相同。
  3. 正是因為我們調用了System.out.println("hello world");螢幕才會輸出hello world,所以我們知道println方法一定會直接或者間接的控制螢幕輸出。
  4. 查看這些程式語言的具體實現,比如java,會發現println方法找不到具體實現的源碼。

結合以上四點,我們可以合理的猜測,我們所使用的常規的高級程式語言,都可以間接調用硬體。但是我們在開發程式的時候,通常都無需關心控制硬體具體是怎麼實現的,只需要調用標準庫給我們提供的各種方法或函數即可。基於此,我們可以進一步猜測,無論是go還是java開發的程式,儘管源碼不同,但是運行到到操作硬體的指令部分時,他們應該是執行的一樣的程式碼,這樣硬體才能表現出相同的行為。

如果覺得上面的推理不一定是對的,我們還可以觀察在宏觀層面的軟體設計來佐證這個猜想。例如java web服務提供rest介面,無論是瀏覽器還是手機APP,它們都可以通過網路通訊來調用這個介面,完成一樣的功能。客戶端的實現技術程式語言各不相同,但是它們都能調用到相同的後端服務介面。提供api介面供上層程式碼調用這個思想,放之四海而皆準。

分析到這裡,對於應用軟體與系統軟體的邊界,我們應該相對清晰了。系統軟體可以直接操控硬體,這是百度百科說的,我們可以信。基於前面的api調用設計思想,系統軟體它可以把操作硬體的部分封裝成api,供上層軟體調用。而這個上層軟體,就是應用軟體。