軟件開發(fā)的原理
對于非技術(shù)出身的軟件行業(yè)從業(yè)者來說,理解技術(shù)是一道坎,但卻是向上發(fā)展所必須跨越的一道坎。在一個軟件公司,無論是商務、售前還是項目經(jīng)理亦或者是產(chǎn)品經(jīng)理,對技術(shù)的理解程度,往往意味著他的專業(yè)程度。而如何理解技術(shù),很多人無從下手。
接下來我們從以下幾個方面,全面了解下軟件開發(fā)的過程、所用到的技術(shù)以及專業(yè)名詞,將軟件開發(fā)知識串聯(lián)起來,形成體系。
網(wǎng)絡
說到網(wǎng)絡就得從通訊提起,在信息傳遞過程中,肯定會有一個產(chǎn)生信息的源頭、也會有個接收信息的宿主,以及信息傳遞的通道。產(chǎn)生信息的源頭我們稱之為“信源”,接收信息的宿主我們稱之為“信宿”,而信息傳遞的通道,我們稱之為“信道”。
信道或者說信息傳遞的介質(zhì)有很多種,電話線路、光纖、無線等。信息從源頭產(chǎn)生,被宿主接收,形成通訊網(wǎng)絡;
而計算機網(wǎng)絡則是指,由客戶機發(fā)出請求,服務器接收請求,通過有線或者無線介質(zhì)進行傳遞,形成計算機網(wǎng)絡;那這里存在一個疑問,假設有一臺電腦和一臺服務器,我從電腦中發(fā)送消息,服務器接收消息,那么服務器能精準的接收到對應的某一臺客戶機發(fā)送的消息的呢?就算這臺服務器收到了客戶機發(fā)送的請求,那么服務器如何知道客戶機請求的意思呢?這中間肯定需要什么標準語法能讓雙方知道傳達的消息內(nèi)容。
這類似于我們?nèi)伺c人之間的溝通交流,我們把自己頭腦里的想法,表達給其他人,就需要遵循一定的語言以及語義規(guī)則,讓別人可以理解。計算機之間的通訊也是如此,有了信源和信宿之后,需要有語法規(guī)則讓倆臺物理機之間進行信息交互。于是我們的TCP/IP協(xié)議、HTTP協(xié)議就出現(xiàn)了。
我們在從瀏覽器中訪問web服務器時,需要通過這些協(xié)議進行請求;在軟件開發(fā)中接口與接口之間通訊也需要通過這些協(xié)議進行交互。
硬件
軟件開發(fā)中涉及到的硬件,主要是服務器,服務器的種類有很多。我們關注服務器一般是關注服務器的作用是什么,服務器的硬件配置是什么?
服務器從本質(zhì)上來說,其實就是一臺電腦,只不過這臺電腦,沒有顯示屏,可以24小時不關機的運行后臺程序,配置高于一般的家用電腦。
我們一般關注服務器的配置,一般關注的是內(nèi)存、CPU以及硬盤等。我們關注內(nèi)存是因為它決定著可同時運行多少程序,程序運行快慢;我們關注CPU是因為它決定著計算機的運算速度,計算機的性能;我們關注硬盤是因為它決定著計算機的存儲空間大小。
我們經(jīng)常在部署應用時,運維或者開發(fā)會和項目經(jīng)理確認服務器的配置是多大,項目經(jīng)理會回復說4核8G,那這個4核是什么概念呢?
這其實要提到編程里的多線程概念,多線程是指在一個時刻可以同時處理多件事情。但是程序中的多線程其實只是概念上的多線程,真正情況是程序的運行速度非常快,它將每個代碼在不同的細小的時間片中執(zhí)行,然后模擬出同一時刻執(zhí)行多個程序的假象。
但是多核CPU卻真正的解決了這個問題,它可以真正做到,同一時間運行多個程序,4核的CPU,他就可以做到同一時間點,可以同時運行4個進程。這就滿足了一臺服務器運行多個應用。
依此原理,CPU的核數(shù)越多,配置越高,就可以承受更多的應用。
4核8G中的8G,也是我們經(jīng)常說的關于內(nèi)存的概念,內(nèi)存是干什么的?為什么內(nèi)存對程序的運行影響這么大?
方寸之地,蘊含天地
其實軟件開發(fā)中所提到的內(nèi)存是指運行內(nèi)存,就是代碼運行的地方。比如說:我的手機運行內(nèi)存是4G,那么我啟動一個微信,占用了我500M的運行內(nèi)存,我啟動了一個抖音,占用了我500M的內(nèi)存,那可能我在同時啟用10個app后,我的運行內(nèi)存就滿了,這是就會出現(xiàn)手機卡頓,影響使用等這些情況。
同理而言,在服務器上,我們正常部署一個軟件時,可能會部署一些中間件,比如說openfire、redis等,這些東西和我的業(yè)務代碼一樣都會占用運行內(nèi)存。如果我的運行內(nèi)存大的話,我就可以在一臺服務器上同時運行多個軟件應用。
編程語言
很多非技術(shù)出身的軟件從業(yè)人員,他想了解技術(shù),一般都會直接從編程語言入手,其實了解詳細的編程語言,并不能夠讓你快速了解軟件開發(fā)的流程以及原理,但了解編程語言,有助于你判斷哪些需求是工作量很大的,哪些需求是工作量小的。
現(xiàn)在市面上主流的編程語言有:Java、JS、PHP、Python等。其實編程語言主要是定義一些數(shù)據(jù)字段的格式,以及編寫的規(guī)則,代碼的語義等。然后再通過if else、for循環(huán)等語句,編寫完成業(yè)務邏輯。所以我們在需求調(diào)研階段,能將業(yè)務流程梳理清楚,流程可以跑通后,代碼便可以實現(xiàn)。
現(xiàn)在編程主要的架構(gòu)還是三層架構(gòu),既:表示層、業(yè)務邏輯層、數(shù)據(jù)層,表示層是用于顯示數(shù)據(jù)和接收用戶輸入的數(shù)據(jù),為用戶提供一種交互式操作的界面,現(xiàn)在的軟件開發(fā)越來越精細化,程序員的分工也越來越明確,一般開發(fā)分為前端開發(fā)和后端開發(fā),表示層一般就是由前端開發(fā)人員開發(fā)完成的。前端開發(fā)人員需要和后端開發(fā)人員定義好,前后端對接的接口,用于數(shù)據(jù)傳輸。
業(yè)務邏輯層和數(shù)據(jù)層,則一般都是由后端開發(fā)人員完成,業(yè)務邏輯層主要是接收前端傳過來的數(shù)據(jù),然后完成客戶的業(yè)務需求邏輯。業(yè)務邏輯層主要是進行邏輯處理和判斷,如果涉及到需要向數(shù)據(jù)庫獲取數(shù)據(jù)的情況,則需要通過數(shù)據(jù)層,向數(shù)據(jù)庫獲取數(shù)據(jù)。
數(shù)據(jù)層主要的向數(shù)據(jù)庫獲取數(shù)據(jù),加工數(shù)據(jù),然后再將數(shù)據(jù)傳遞給業(yè)務邏輯層。在代碼中sql語句一般都是在數(shù)據(jù)層中編寫的。當然現(xiàn)在有很多的框架,比如說:MyBatis、hibernate等,可以自己生成sql語句進行查詢,這種方式有很多好處,比如說我們在切換數(shù)據(jù)庫時,就可以通過框架自生成的sql自動匹配。而不需要調(diào)整自己寫的原生sql了。當然這種方式也有弊端,就是無法進行復雜的sql查詢,比如說在做報表需求時,一般還是自己寫sql的較多。
上面說的是我們自己內(nèi)部寫程序時的結(jié)構(gòu),一般在做軟件時,尤其是做業(yè)務系統(tǒng),一般都是要和多個系統(tǒng)做對接,多個系統(tǒng)之間通過接口對接;這個時候就需要在業(yè)務邏輯層調(diào)用時,調(diào)用到其他系統(tǒng)中的接口,通過參數(shù)的傳遞,保持倆個系統(tǒng)之間的聯(lián)系;
總的來說:寫程序可以分為三個部分來看,前端、后端以及數(shù)據(jù)庫;涉及到的編程語言就是:前端語言,例如:html5、css3、js等,前端框架主要有Bootstrap、jQuery 、VUE等;后端語言,例如:Java、php、C#等,每個語言都會有自己特有的框架,以Java舉例來說,它具有的框架主要就是SSM,即Spring、SpringMVC、MyBatis,現(xiàn)在最火的還有SpringBoot;
在這里有人會疑惑這些框架有什么用?為什么研發(fā)會這么熱衷于優(yōu)秀的框架?
其實框架就是一些大牛公司寫好的方法,普通的程序員可以直接調(diào)用這些方法就可以完成自己的業(yè)務邏輯了,這就極大的節(jié)省了開發(fā)人員的開發(fā)時間;不僅如此,框架里封裝了很多很復雜的業(yè)務邏輯,這個可以避免開發(fā)重復的造輪子。
操作數(shù)據(jù)庫的sql語句也是開發(fā)軟件重要的一環(huán),sql的入門很簡單,就是增刪改查,但是如果要寫一段優(yōu)秀的sql,就會復雜到懷疑人生,寫一個報表,有時候會寫出幾百行的sql語句,復雜到讓人看都不想看。
以上是編程語言,但是在寫代碼時,我們還需要一些輔助的軟件工具,比如說編譯工具、開發(fā)的中間件、數(shù)據(jù)庫、代理服務器等等;
軟件
我們在編寫程序時,一般都會用一個編譯軟件,進行編寫;編譯軟件的好處有,我們可以在這個上面編寫程序,編譯軟件一般都會有代碼提示,極大的節(jié)省了開發(fā)時間;編譯軟件可以將開發(fā)寫完的程序編譯成可執(zhí)行的class文件,然后用內(nèi)置的tomcat運行程序,方便開發(fā)人員調(diào)試程序;
說到這里又提到了一個開發(fā)經(jīng)常提到的名詞:tomcat;很多不是技術(shù)出身的人,很不能理解tomcat這個東西,其實tomcat這個東西是一個容器,編譯后的代碼需要在這個容器中運行,然后代碼才可以做出各種我們想要的頁面和業(yè)務邏輯;
在開發(fā)中不可避免的都會涉及到一個軟件,就是數(shù)據(jù)庫。其實一些在軟件行業(yè)沉浸多年的人,他們對軟件有了一個返璞歸真的理解,就是所有的軟件都是對數(shù)據(jù)的加工,客戶輸入數(shù)據(jù),系統(tǒng)加工數(shù)據(jù),數(shù)據(jù)庫存儲數(shù)據(jù),系統(tǒng)再返回數(shù)據(jù);所有的業(yè)務邏輯都逃不過這點??梢姅?shù)據(jù)庫在軟件開發(fā)中的地位之高,遠非其他軟件可比。
常見的數(shù)據(jù)庫有mysql、oracle、sqlserver等。
除了這些東西,我們開發(fā)口中也會經(jīng)常說一些名詞,比如說redis、openfire等;其實這些在我們了解了軟件運行的原理后,都能理解了。舉個例子:redis,它其實就是用來做緩存的,所謂緩存就是存儲,都是存數(shù)據(jù)的;但是它的讀取速度要大于直接讀數(shù)據(jù)庫,所以一些代碼運行的中間數(shù)據(jù),一般都是存在這種緩存軟件中。
我們運維或者項目人員,一般也會用一些數(shù)據(jù)庫圖形化工具或者服務器圖形化工具,來連接服務器和數(shù)據(jù)庫。這會降低學習指令的時間。
接口
最后就來說下接口了,我們現(xiàn)在一般都是面向接口編程,在軟件開發(fā)之初,由資深的程序員設計好軟件的架構(gòu),然后分配給各個下屬程序員,基于這些各個模塊的架構(gòu),做詳細設計;這種設計中就會包括接口設計;
很多非技術(shù)的朋友一開始會關注,什么是接口,這個概念太過于抽象。其實類比到生活中就很好理解了,比如說:我們的電腦,我們在使用電腦時,不關心這個電腦內(nèi)部的構(gòu)造,我們關心的是提供給我們的操作方式,這也是一種接口,我們通過鍵盤就可以輸入很多文字,做很多操作,而不用管它是如何做到的。
在軟件開發(fā)中也是如此,開發(fā)經(jīng)理分配開發(fā)任務,每個人做一個功能模塊,然后封裝起來,如果想要獲取對方模塊中的數(shù)據(jù),就可以通過一個接口來獲取。
接口是要有入?yún)⒑统鰠⒌?,我們想要獲取對方數(shù)據(jù)時,就需要對方提供個接口給我們,我們傳入規(guī)定好格式的參數(shù),然后接口返回給我們對應的結(jié)果或者數(shù)據(jù)。
接口的種類一般有基于Http的接口以及Websocket的接口,這倆種都是一種協(xié)議,我們通過這倆種協(xié)議完成接口與接口之間的數(shù)據(jù)傳輸。
(來源:知乎)