我對“什么是程序(Program)”的理解


程序(Program)——分為內在層面和外在層面。內在層面為指令,外在層面為需要解決的問題和環境參數約束。

所以程序就是在某些環境參數的約束下,針對需要解決的問題而編制的一系列指令、數據的集合

流行的解釋:“程序=數據結構+算法",我覺得作者僅僅看到指令本身,而忽略了指令的最終目的和環境約束。也就是說,“數據結構+算法”只是手段,屬於上面所說的內在層面,不是程序的目的。

舉個可能不太恰當的例子,先破后立:A君對B君說:“麻煩寫一個加法器,能讓用戶輸入兩個int類型的參數,然后這個加法器返回結果給用戶”。

——“寫一個加法器,返回結果給用戶”是B君需要解決的問題,“輸入兩個int類型的參數”是B君的環境約束(用戶輸入類型是int,個數是2個)。

此時B在干什么?B像一個呆子一樣,仿佛聽不見,喃喃自語地說着“我應該再做一個數據結構,用某種算法”,寫着天書一樣的程序,程序上滿是數據結構和算法,可是這個對A君有沒有用?沒用!

A君比喻的就是外在層面,B君比喻的就是內在層面,兩者不能割裂。B君寫的指令是為了能讓A君用,而不是自顧自地寫程序——因什么而寫(解決的問題)?為什么這么寫(環境參數約束)?


環境,根據個人看法分為真實環境、硬件環境、指令環境和文法環境,它們因為需求和被需求的關系而結合。舉個例子來解釋,一台打印機打印出了一張報紙。真實環境是一張白紙,硬件環境是打印機,指令環境是驅動程序。白紙需要打印機打印,打印機需要驅動程序發出中斷信號。函數Function A調用另一個函數Function B,Function A是Function B的指令環境。Function A、Function B定義了兩個函數,寫法本身是文法環境。


也許在《深入理解計算機系統》中一段話可以用來印證上文:“信息就是位加上下文”。一個“位”本身無意義,必須聯系上下文才能顯示它的意義。一段指令本身也無意義,聯系它需要解決的問題和環境約束才有意義,解決的問題和環境約束就是指令的上下文。


這個對程序的解釋,我們也可以引申到日常學習當中去。A君在公司里,每天的編程工作是做網站開發,具體需求無非是展示各種信息——需要解決的問題;工具是ASP.NET,面對的受眾范圍僅限在本城市,網站性能要求不高,開發進程不能太慢,老板不重視有沒有bug,快點做出來賺到錢才要緊——環境參數約束。好,這時候,A君他很好學,買一堆書來看——《設計模式》、《計算機程序設計藝術》、《TCP/IP詳解》、《C++ Primer》、《鳥哥的Linux私房菜》。請問,這些對他的開發有用嗎?沒有用!因為他要開發的程序,主要無非是對數據庫進行增刪改查而已,又不需注重性能,又不重視bug。所以不需要多么高深、完美的代碼。工作平台又是ASP.NET、Windows系統,所以《C++ Primer》、《鳥哥的Linux私房菜》這些對他都沒用,寫代碼用不到。


許多大公司,比如百度、阿里巴巴、騰訊(俗稱“BAT”),他們可能要求真正精通一門語言(用C++舉例),為何?在我看來,就是因為他們——需要解決的問題很多,環境參數約束很少——項目規模大,受眾多,功能豐富,性能要求極高,等等。這些很大程度上主動決定了他們涉及的C++語法非常全面,對C++的理解必須非常深入(保證質量和性能是主要原因)。於是要求精通語言,也就在情理之中了。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com