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