編程思想才是所有程序的基礎

gznr9617 8年前發布 | 73K 次閱讀 編程

先講一下我寫這篇的目的:

1、最近幾天剛開始稍微正規地學習一下編程。

2、整理自己學習編程用到的知識,鞏固知識。

3、這個過程肯定有N多漏洞,希望大家指出。

4、順帶幫助大家。

我是一個不怎么安分的編程學習者,總想學很多東西,然而連最基本的一門語言都沒有好好學習,雖然這并不妨礙我對編程的熱愛,但在實際編程中的確遇到了很多問題。但我覺得這些問題并不是基礎不牢,語法運用得不熟練,這些都可以搜索出語法,用時間解決,但真正決定一個程序好壞的遠不止這些。

假設我們學習編程的目標就是寫出一個長得像市場上的APP或者網頁的話,感覺就算四年學完學校里的東西也不一定能寫出來。這其中的差距我覺得并不是由于這些基礎的編程語言熟練度決定的。特別對于一個像我這樣,僅對編程感興趣,但可能不會把編程當飯吃的人來說,這篇文章就以新手的視角探索總結了一些目前的一些編程思想。同時我希望有人能認真地看下去并實踐,甚至給出一些反饋意見,一起成長。

在我們開始編程前會有一個疑問,編程應該從一門流行的語言開始學起嗎?編程應該從最基礎的C學起嗎?作為一個才入門的小白,我覺得——編程應該從歷史學起。只有從全貌理解了編程是怎么發展的,發展出了有哪些編程方式,在我們實際編寫代碼的過程中才知道自己欠缺哪部分,實際寫代碼的時候才會知道該補充哪些知識,怎么找到這些知識。

一、編程的歷史

1.1計算機

最早的編程伴隨著計算機的誕生而誕生,計算機是用來計算的,而要用到計算就必須有機器運作的邏輯,而對基于電路的CPU來說,能用來運算的只有兩個狀態:0和1,分別表示電路開關的“關閉”和“打開”狀態,也可以說是“不通電”和“通電”狀態。這也就是我們說的二進制,二進制的運算規則是“逢二進一”、“借一當二”,數字2如何在電路中表現出來?電路中有兩個開關00,給電路+1,開關變成01,再+1,開關變成10,于是15可以用四個開關表示為1111。二進制對運算的幫助是:不需要用開關數量表示數字,不然那得多少開關。

因此CPU在設計時自然而然地分成了三部分:控制器、邏輯運算、存儲器。控制負責CPU要做什么工作,一般會分配4個“開關”,0000到1111共16個操作指令,假設把0000定義為加載,0001定義為儲存。然到邏輯部分,指要進行什么運算,假設0001為加法。最后到存儲部分,由于存儲空間很大,可能會用12位來表示數據所在的地址。

 

之前玩的游戲MineCraft里的紅石電路就講了幾個邏輯電路的概念:“與門”、“或門”、“非門”,以及由他們組成的高級電路。CPU為了實現這些計算功能,設計了一系列硬電路和指令集,硬電路是與或非,或者更高級的電路,指令集是指導CPU運算優化的方案。

 

1.2機器語言、匯編語言、高級語言

計算機編程語言共分為三種:機器語言、匯編語言、高級語言。上面講的其實就是機器語言,人們通過輸入不同的二進制數設計程序,而計算機通過這些定義好的規則進行運算。但可以預料到機器語言是多么麻煩,要記不同的數字代表的意思,所以匯編語言應運而生,匯編語言案例:

操作:寄存器BX的內容送到AX中

1000100111011000              機器指令

mov ax,bx                           匯編指令

匯編語言也就是將機器語言用英文單詞的方式來表現出來,因此非常容易記憶。這樣來說,高級語言就好理解了,也就是將匯編語言的集合整理成我們常用的英文邏輯指令,例如高級語言中的“if”判斷指令,對應的匯編語言可能就有一大堆代碼來進行運算,實現判斷功能。

隨著編程的發展,高級語言也分成了很多種類型,例如C、C++、VB、JAVA、python、lisp,他們各自有各自的特點,設計概念的不同也導致了運算效率的不同。正因為高級語言的運算方法是各種指令的集合,所以越接近機器語言的語言,效率越高。假設我們要計算從1加到100,有一門語言是直接順序相加,另一門語言像高斯一樣,(1+100)*50,那效率的差別一下子就看出來了。

因此,優秀的語言會吸引來一大堆程序員使用,使用的程序員多了,他們自然也可以在這個基礎上設計各種運算的方法,形成高級語言衍生的語言,這樣對于其他程序員來說就不需要重復造輪子,直接用別人的代碼,省了N多編程的事情。

所以,剛開始學習的時候選擇哪種編程語言其實并不重要,只需要對程序最基本的邏輯方法,比如加減乘除、判斷循環等熟悉就可以了,每種語言都有自己的編程方式,但這些最基礎的是不會變的,在學習新的語言的時候,只要了解他們的語法就可以了。

那到底該選擇哪種語言?對于只是業余喜歡編程的人來說,當然是越簡單越好,越熱門越好。簡單意味著不需要學習復雜的語法,熱門意味著有很多“輪子”給你使用。這樣只需要拼湊起來就能做成一個程序了。看看編程語言排行榜就知道了,Python的語法很簡單,比前四名的簡單了一倍不止,熱門程度高,有很多別人寫好的“指令庫”可以使用,所以Python是一個很好的入門選擇。

二、編程的現狀

不同的語言有不同的語法,但不同的語法可以使用相同的軟件架構(software architecture)。所謂的軟件架構,就是代碼的組織結構。舉個更具體的例子,最初我開始學習編程的時候,只會用的軟件架構就是數據流,就是一種流水賬的模式,例如要按順序實現三個功能ABC,數據流會把ABC的具體實現代碼都放在一起順序執行。當需求改變成ACB的時候,又要把具體代碼改成ACB。這樣代碼就會這樣:

1.選擇處理方法:ABC、ACB...,并調用相關代碼。

2.ABC代碼,輸入數據。

3.ACB代碼,輸入數據。

...

顯示結果

這樣就造成了很多代碼的重復,換一個軟件架構可以編程這樣:

分別定義A、B、C要輸入什么,A負責處理什么、輸出什么。

輸入處理流程:ABC、ACB、BAC等都可以。

處理模塊:輸入數據,按流程順序調用ABC(輸入并輸出到另一個,直到輸出最后一個)。

顯示結果

由此,我們就可以理解軟件架構是什么東西了,說白了就是一種軟件的設計思想,說得更白就是組成系統的各個型號的螺絲釘、馬達等零件,你可以設計一個只能用于一種解決方法的一體化的工具,也可以設計成由不同零件組成的可以拆解組裝的工具模塊。

軟件架構設計有三大要點:1、代碼復用性高;2、易于測試;3、易于維護;

這幾個點不知道總結得對不對,求指正:

復用性高指編寫的代碼重復的概率極少,一般是通過調用各種功能模塊來實現整個程序。直白地說就是分塊設計成不同零件,它最大的好處是一次編程,隨時可以無成本地ctrl+c,ctrl+v,接下來功能編寫完后只需要專注于流程的設計,流程是如何組合的。

易于測試是指編程中可能會出現各種BUG,而現在的編程不需要一行行看代碼來修改BUG,可以通過編寫測試腳本,讓程序來測試程序,模擬用戶操作,在各種條件下看看會不會出現漏洞。

易于維護也說明了代碼可以被另一個人輕松讀懂。于是在代碼維護的時候,可以快速了解是哪方面出了問題,出了問題也僅需要對出問題的功能部分進行維護,而不是對整個代碼進行分析。

記得這里有一本好書推薦,關于好代碼和差代碼的(不知道是不是這個名字):

《代碼整潔之道》

所以,好的架構是軟件成功的一半。

2.1常用的軟件架構

關于軟件架構這一部分的歷史我并不太了解,但是目前常用的軟件架構有:MVC、MVP、MVVM這些,簡單地介紹一下:

 

2.1.1MVC

M指模型(Model):負責數據保存;

V指視圖(View):負責用戶界面;

C指控制器(Controller):負責業務邏輯;

MVC是一種很經典的軟件架構,經典到已經快過時了,不過小型軟件的架構基本就是如此,一部分代碼保存數據,一部分處理業務,一部分顯示結果。用戶在使用時接觸到的是視圖部分,當對視圖V部分進行操作時,代碼執行C控制器的業務流程,流程從M中讀取數據,最終返回到V中讓用戶獲得執行結果。

 

2.1.2MVP

1.View 傳送指令到 Controller

2.Controller 完成業務邏輯后,要求 Model 改變狀態

3.Model 將新的數據發送到 View,用戶得到反饋

2.1.3軟件架構總結

具體關于MVC、MVP、MVVM的可以參考:

MVC,MVP和MVVM的圖示

在實際編程中,要注意自己寫的代碼該用哪種軟件架構,雖然一開始可能不懂,但按著網上搜索的一些簡單案例,理解了之后編寫自己的程序很有用。

選擇了軟件架構也就選擇了一種程序結構,一種編程風格。我們選擇的軟件架構可能各有不同,選擇軟件架構一看項目需求,代碼比較多就找分得細點的。網上也有很多不一樣的軟件架構,我也不太懂,希望留言指教。

另外還有一個要配合的是團隊開發流程(這個真不了解),例如TDD的流程,測試驅動開發。先編寫測試代碼,然后編寫程序,需要用到的功能測試可行后,代碼才是OK的。

 

2.2開發框架

軟件系統發展到今天已經是相當復雜的了,在實際的編程過程中不再需要也很少有必要自己去寫一些最基礎的功能邏輯。開發框架就是別人編寫的一套成熟的基礎功能集合(一般也是在某個軟件架構的基礎上的),你可以不必實現一些基礎功能,而僅需要關注業務邏輯代碼的編寫,以及在此基礎上的一些個性化代碼的實現。

這些框架一般是成熟的、穩定的、經過多人使用、測試過多次的,結構和安全性都非常好,可擴展性也強的。從定義上來說,開發框架也可以類比機器語言到高級語言的過程。高級開發框架可能建立在一些基礎的開發框架之上(也就是實現這些高級功能依賴某些基礎功能),大環套小環。當然,框架之間也可能是平級關系,可以同時使用。

 

我們可以把開發框架的概念放寬一點以便于理解,計算機硬件是一個最基礎的框架,它是通過01來處理數據的。然后是操作系統,例如Linux、Windows、OSX,要開發這些操作系統上的應用,就要遵守他們的編程規則(各種API接口、界面設計規則等),接下來是一些基礎的軟件框架,比如Windows上的JAVA環境、MYSQL數據庫環境、IIS環境,他們也有特定的規則。再接下來就是各種軟件,或者互聯網應用。每個層級都有他們特定的規則,一般來說,更高級的框架會提供一個API去實現更低層的框架的內容,除非我們要寫的軟件是這個框架無法實現的,我們才需要了解低層框架的編程規則。

 

例如比較常用的網頁腳本語言是javascript,javascript下又有jquery、bootstrap等實現更多高級功能的框架,這些框架下面還有更多高級功能的小框架。我們可以用javascript直接寫這些框架的功能,但你也可以引入這些框架,直接寫一行代碼就實現了這個功能。更直白地說就是,別人拍了一堆照片,你只需要挑選幾張來用就好,而不需要自己選擇相機拍攝,各種PS處理。

框架的發展得益于各種開源項目(提供源代碼給你免費用,但一般來說你用這些開源項目做的項目也要開源),github就是一個很好的開源項目集中地,我們可以在上面找到很多有用的開源項目,可以應用到自己項目中。

在我們選用開發框架的時候,要選擇盡量少的框架,同時框架能實現的更多自己需要的業務。越少意味著加載越快,功能冗余越少,安全性越高。框架自身也有性能瓶頸等問題,這就是后期考慮的了。

這些框架一般會提供給你功能的API,也就是應用程序編程接口,這些內容可以在框架官方的API文檔中找到。你只需要給出一個符合API的參數,就可以調用功能并輸出結果。例如假設有個plus(num1,num2)功能,輸入plus(3,2),功能就會自動計算3+2,并返回給你“5”。 

2.3現在的編程

所以在我的理解中,現在的業余編程只需要學習最基礎的通用語句,選擇自己的軟件架構,選擇好各種框架,學習其API文檔和編程規則,遵循框架規范,調用這些功能實現想要解決的業務。就目前而言,基本上需要自己編寫具體基礎功能代碼的產品已經很少了。

另外,軟件架構其實還有一種比較感性的“軟件架構風格”,設計風格而不是標準,只是提供了一組設計原則和約束條件。例如restful框架,基于這個風格設計的軟件可以更簡潔,更有層次,更易于實現緩存等機制。

2.4使用各種框架時需要注意的一點

其實在實際編程中運用框架會出現很多問題,每個框架都有自己設計上的一些邏輯、處理優先級。比如說互聯網前端中的CSS框架,有時候明明寫了這些代碼卻沒法正常顯示,然后你會發現框架中的處理邏輯是不一樣的,實際需要應用哪些API,哪些組合可以提升性能,從一個框架傳遞信息到另一個框架該怎么處理,出錯率最少。這些都是優秀程序員在不斷編寫中積累出來的,也是新手與老手最大的區別。

三、互聯網

于是最基礎的東西講完可以繼續講比較基礎的了。編程語言一開始其實只是單機使用的,編輯好一個程序后,運行就行了。但是人類又發明了一個改變世界的方法,把計算機用網線連接起來,計算能力不是更強了?而且也能做很多其他的事情,比如把資料從一頭傳到另一頭。但是,因為機器不像人,你給另一個計算機發送一個指令,如果另一個計算機的程序里沒有這個指令,那運行后豈不是完全混亂然后死機了?

于是,各種互聯網協議產生了,互聯網協議是什么?給雙方計算機一個約定,我們用什么樣的語言進行溝通,最簡單的例如,開頭部分寫清楚發送者、接受者、使用的協議等,然后后面就可以跟著要傳輸的數據了。

2.1基礎的互聯網協議

當互聯網從一臺計算機連接到另一臺的過程,變為一億臺連接到一億臺計算機,我們不可能用這種最簡單的約定實現如此大規模的傳播,因此衍生了各種各樣的互聯網協議,例如TCP/IP協議,約定了我們有一個IP地址,通過什么樣的流程進行數據輸送。例如PPPOE協議,小區要拉網線的時候就是用這個協議驗證用戶名和密碼,給你提供相應的帶寬的。當然,硬件上一個網卡也會有一個MAC地址,來確定機器就是要建立連接的那個機器。

除非你編程的時候需要用到改變協議,否則具體原理可以不用了解,很多程序員發明的“庫”(也就是Kit,也就是程序員造好的輪子)已經幫你解決了如何使用這些協議的問題,你可以直接一個sent命令就從一臺電腦發送到另一臺了。現在的計算機應用或者手機應用,已經很少是一個單機應用了,我們或多或少會用到互聯網協議來獲得用戶的一些信息。

所以,這些協議有很多,需要用到的時候再找就是。但如果是做互聯網應用的話,有一些協議是不可避免的:

2.1.1、HTTP協議(超文本傳輸協議)

絕大多數的Web開發,都是構建在HTTP協議之上的Web應用。例如我們常說的網址,就是http://www.xxxxx.xx/,用的就是HTTP協議。由于剛開始學,我也講不了多少,也許后面會補上。HTTP協議比較基礎的部分:

http請求由三部分組成,分別是:請求行、消息報頭、請求正文。

請求行包括URI(統一資源標識符)和協議的版本。

消息報頭包括普通報頭、請求報頭、響應報頭、實體報頭。

請求報頭舉例:

GET /form.html HTTP/1.1 (CRLF)

Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF)

Accept-Language:zh-cn (CRLF)

Accept-Encoding:gzip,deflate (CRLF)

If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)

If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF)

User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)

Host:www.xxx.com (CRLF)

Connection:Keep-Alive (CRLF)

(CRLF)

從上面可以稍微看出來,其實HTTP協議其實是一個看起來比較復雜,但能說清楚要傳輸什么的方法,目前覺得看看是什么就行,實際編程中感覺不會用到這些知識。

然后,服務器和自己的計算機溝通的時候會用到一些請求方法,例如:GET、POST,也就是從服務器獲得哪些資源,發送哪些資源。

還要知道的就是,HTTP協議的響應方式,也就是服務器給自己的計算機返回的狀態代碼:

1xx:指示信息--表示請求已接收,繼續處理

2xx:成功--表示請求已被成功接收、理解、接受

3xx:重定向--要完成請求必須進行更進一步的操作

4xx:客戶端錯誤--請求有語法錯誤或請求無法實現

5xx:服務器端錯誤--服務器未能實現合法的請求

例如經典的404頁面,當請求資源不存在,或者輸入了錯誤的URL,就會出現“404錯誤,您訪問的頁面不存在”等提示。這個對于web應用來說是比較有用的,你可以了解web應用出現了什么錯誤,進而想清楚如何解決這些問題。

2.1.2更多關于協議的東西

水平有限,目前就知道這個協議比較有用啦,想看更多可以參考:

阮一峰——互聯網協議入門(一)

2.2基于互聯網的開發框架

就像單機編程會用C++、JAVA這些一樣,應用在互聯網環境中的編程語言也有好幾種(有些可能不叫語言),互聯網開發主要分為兩部分,前端和后端。

前端: 也就是負責編寫Web應用中用戶可以看得見點擊得著的東西。包括Web頁面的結構、Web的外觀視覺表現以及Web層面的交互實現。

后端:后端更多的是與數據庫進行交互以處理相應的業務邏輯。需要考慮的是如何實現功能、數據的存取、平臺的穩定性與性能等。

前端需要學習的框架:

1、HTML——是超文本標記語言,通過對資源定義標記從而加載該資源,顯示到頁面上。地址里面以.htm或.html結尾的就是用這個語言編寫的,例如上面那個地址就是html語言編寫的。它是最常用的編寫網頁的語言。

2、CSS——是能夠真正做到網頁表現與內容分離的一種樣式設計語言。相對于傳統HTML的表現而言,CSS能夠對網頁中的對象的位置排版進行像素級的精確控制,支持幾乎所有的字體字號樣式,擁有對網頁對象和模型樣式編輯的能力,并能夠進行初步交互設計,是目前基于文本展示最優秀的表現設計語言。

3、Javascript(以及一些衍生的jquery、bootstrap等)——JavaScript是一種屬于網絡的腳本語言,已經被廣泛用于Web應用開發,常用來為網頁添加各式各樣的動態功能,為用戶提供更流暢美觀的瀏覽效果。

后端需要學習的框架:

1、后臺語言——如Python、Java、PHP等,實現業務邏輯的代碼編寫。

2、數據庫——SQL等,實現數據儲存的方式。

這些框架其實有非常多種,我們平時可以多去一些開源網站積累,個人見識較少,這部分大家可以補充。

2.3不同框架之間如何實現數據傳遞

一般來說,網上都有很多案例教你怎么實現數據從后端傳輸到前端或者其他,用到哪些代碼、方法,注意積累就好了。例如可以學習如何在HTML中使用CSS,如何在HTML中使用javascript框架實現一些動態內容。這個得先理清框架之間的包含關系,哪個為基礎可以先寫哪個。

四、開始編程

以上僅是我對于編程不成熟的理解,其中也許有許多錯漏,希望大家可以指出來,也歡迎大家留言,指出哪里不太懂的地方,這也許也是我沒學到的。概念搞清楚之后,接下來也許就是從新手到老程序員的積累了吧。前路漫漫,也許還有各種未知的困難沒有涉及到,希望與大家共勉...

 

文/夜妖黑貓(簡書)
 

 

 本文由用戶 gznr9617 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!