程序開發常識感悟

前言

之前學習計算機網絡、計算機組成原理、操做系統等基礎課程的時候,不少概念都是囫圇吞棗的背過去了,不是很能理解其背後的含義,更沒法把它與實際的程序開發、應用結合起來看待。最近研究小程序、安卓開發、網站開發、網絡協議、雲計算、大數據、AI等基礎常識的時候,忽然一會兒好像有點明白整個網絡、程序是怎麼轉起來的了,以及一些編程語言、設計架構等等一些東西是怎麼回事,好像一會兒明白了其中的邏輯,或者說是知識體系是怎麼回事。雖說如今讓我開發一個什麼網站、應用、小程序、軟件之類的東西也不是一時半會就可以開發出來,可是至少知道該怎麼去作開發了。
可能裏面有些理解也不是特別深入or有錯誤的地方,但願你們不吝賜教。css

網站、程序、APP、小程序

在以前不瞭解這些產品(姑且統一稱做產品)是怎麼開發的時候,對他們開發須要用到的編程語言、開發工具等都有種霧裏看花的感受,並且不是很能理解這些產品之間的關係or區別。
實際上,這些產品的開發均可以分爲兩個部分,一個是前端的界面展現、用戶交互邏輯,一個是後端的數據處理、存儲邏輯。簡單的說,我認爲,前端的核心在於展現和交互,後端的核心在於計算和數據。
好比說網站,用戶看到的網頁界面就是前端,也就是前端工程師的活計,須要瞭解的基本技術體系是html/css/js,它們三個分別表明了網頁佈局、網頁樣式、網頁事件/用戶交互;以前有一些把網頁的內容/數據也算在html裏面,後面對內容和佈局進行了分離,把數據放在了xml裏面;而再後來數據實際上是經過與後端進行交互,獲取到後端服務器的數據,而後再在前端界面進行展現,也就是說,把數據/內容放在後端進行維護。簡單的說,前端工程師,就是設計用戶看到的展現界面,與用戶進行交互,而後與後端進行交互,顯示後端的數據。那麼,後端工程師作什麼呢?後端工程師須要瞭解和掌握一些操做數據庫的知識,若是項目足夠大,有專門的數據庫工程師負責創建數據庫表,維護數據庫;後端工程師接收到前端回傳的數據請求以後,訪問數據庫,可能中間會通過一些數據計算or處理,而後返回數據給前端,前端收到數據就進行展現。至此,這樣一個完整的面向用戶的網站就創建好了。可是隻有這個不夠,通常狀況下,還會搭配一個網站後臺管理系統,具體的說,它其實也是一個網站,只不過它面向的是網站的管理員,而不是普通用戶。以前學習的時候很長一段時間把「後端」和「後臺」這兩個概念沒有理解透徹。能夠理解「後臺」是一個有別於剛剛說的面向用戶的網站,它是一個面向網站管理員的網站。爲何須要這個網站呢?有如下幾個緣由:1. 若是要對網站顯示的數據進行修改的時候,在沒有「後臺」的狀況下,須要一個懂數據庫操做的程序員,經過對數據庫的操做,才能完成對數據庫中數據的修改,這樣的行爲其實十分浪費人力資源;2. 通常狀況下會把網站的管理or內容的更新等操做交給一個專門作編輯or運營的小夥伴來管,他不懂技術,而若是有了「後臺」系統,他就能夠做爲管理員經過後臺來對數據庫的數據進行操做了。那麼,「後臺」管理系統是作什麼的呢?通常狀況下後臺也會是一個網站,管理員訪問後臺這個網站頁面,登陸本身的用戶名密碼,而後就能夠經過後臺的一些按鈕、對上傳文件、修改數據庫某個字段,如文章標題、文章內容之類的東西。網站管理員經過後臺操做,修改數據庫中的數據,前面說的面向用戶的網站再次請求數據的時候,就會看到更新後的數據/內容了。因此說,其實後臺這個網站也有它自己的前端和後端,它的前端就是展現給網站管理員看到的界面以及管理員可以作的界面交互,它的後端和麪向用戶的網站的後端功能會有一些重合的地方,但它的後端功能應該會更爲強大,好比說面向用戶的網站後端只可以查詢數據庫的數據,而它能夠進行修改刪除更新。後端涉及到的技術,一個是純粹的數據庫方面的東西,好比說sql語句、oracle/mysql等關係型數據庫,以及一些mongodb/redis等nosql數據庫等;一個是對數據庫的操做,然後端的程序語言有不少,好比說經常使用的java/c++/python以及比較新的node.js等,每一個語言有它本身的使用場景和擅長的地方,選擇什麼語言都OK。而這裏就存在一個問題,前端的開發語言還算是比較統一,然後端的開發語言各類各樣,怎麼可以進行一個交互?這就須要前端和後端定義一個統一的接口,經過接口去訪問數據,比較流行的就是設計一套RESTful API,這樣,無論前端用的什麼語言、什麼技術,後端用的什麼語言什麼技術,均可以經過這一套定義好的接口實現先後端開發分離,按照某種規範進行通訊。而所謂的規範通訊,其實就是網絡協議。若是說,假設網站前端代碼和網站後端代碼和網站後端數據庫都在同一臺服務器or電腦主機上,那麼前端向後端獲取數據的時候,根本用不到什麼網絡協議,直接調用網站後端提供的接口代碼就能夠了,至關因而寫個接口函數的路徑。這樣放在本地,沒有網絡通訊的代碼,前端+後端+數據庫,其實就是一個單機的桌面程序了。
接着桌面程序提及。當前的用戶端主要分兩大類,PC端和手機端,一些嵌入式設備or智能設備暫時不是很瞭解就先不說了,但猜想應該和這兩個的實現比較相似。PC端操做系統主要有windows、Mac、linux三種,手機操做系統主要有android、IOS兩種。而通常咱們把PC端的程序叫軟件,而手機端的程序叫app/應用,其實只是名字的區別,以及具體實現的編程語言不同罷了,但其核心也就是提供一種服務,從這個角度,網站其實也是服務的一種,只不過它的服務資源和計算在遠端的服務器上。PC端軟件的開發根據不一樣的操做系統有不一樣的語言,好比說windows就有C#/C++等,其實還有不少,只要你看到某種編程語言支持的開發環境和運行環境有哪些,就能夠在這些開發環境上開發&在這些運行環境中運行。相比於手機端的開發語言,PC端的開發語言更爲豐富。事實上,若是在PC端運行的軟件和在手機端運行的app不具備網絡通訊功能的話,那就是一個單機的程序。而若是他們具備網絡通訊的功能的話,就至關於前面網站的前端界面了。也就是說,在android和IOS中用java和Object-C開發的app,其實只是一個相似網站前端界面,用於展現和用戶交互;而他們是具備後端的,後端用於作數據計算處理、存儲數據庫的。【這裏注意一點,全部的後端都是可選擇的,能夠有,能夠沒有;沒有的時候不是說前端就不能作數據的存儲,前端數據的存儲叫作緩存,就至關於網頁緩存、軟件本地緩存,其實也多是採用數據庫存儲的好比說前端的數據庫SQLite】毫無疑問,沒有後端,只有前端的網站、程序,其功能比較受限。受限的地方主要是由於, 前端的運行環境是瀏覽器(網站)、單臺我的主機(軟件)、單臺我的手機(app),其運行所須要的CPU計算資源,以及內存、硬盤大小是極爲有限的,只可以限制在必定大小的數據存儲。而若是有後端,全部的前端程序至關於插上了加速外掛,能夠擴大CPU的計算資源、內存的存儲資源,其支持的功能獲得了大幅度的提高。也就是說app是有後端服務器的,以前一直對app有一個誤解,覺得就是寫一個app,安裝在手機上就能夠了,但實際上,大多數經常使用的app都是有後端服務器程序的,經過接收app的請求,推送本身的信息到app中。
最後說到新興的小程序,以前不是很瞭解,最近調研了發現,小程序其實和網站比較相似。它雖然名字中有"程序",可是其實和網站的實現沒什麼區別,也就是從對小程序的調研,才最後把這一堆的網站也好,軟件也好,app也好給串起來,發現其實他們只是表現形式和表現位置的不一樣,其實內裏的邏輯都是同樣的。小程序也是有前端的內容渲染,而若是要進行一些數據的存取,則須要後端的代碼部署在遠端服務器上進行請求響應。前端用到的技術主要是wxml/wxss/js/wxs,其實看後綴就知道對應的就是html/css/js這東西,雖然有一些本身獨有的特性,可是基本技術仍是十分相近的。而因爲採用restful接口來進行先後端的交互,後端的代碼使用的技術和前面網站後端使用的一致,官方建議用node.js+express的框架進行開發,不過其實無論用什麼後端開發語言都是能夠的。
最後總結一下。首先對於用戶來說,前端是必要的,若是沒有前端界面,用戶須要直接登陸到那臺存放代碼的服務器上纔可以看到想要看到的數據,固然,對於懂技術的命令行工具從業者來講,這點小事都OK,可是對於不懂技術的普通用戶來講,這簡直是不可能實現的任務;因此必要的前端是須要的。其次,後端不是必須的,好比說就寫了一個網頁helloworld直接靜態顯示,須要後端嗎?不須要,就寫了個桌面本地小遊戲,須要後端嗎(須要網絡通訊的那種後端)不須要,寫了個單機app小遊戲,也不須要後端。【這裏注意一下,本地軟件和app這種,可能會須要與特定環境的數據庫進行交互,有些人認爲與數據庫交互就是後端,沒有交互的就是界面,這種這裏暫時不認爲是後端,只認爲是一種本地緩存】;而後,若是具備後端,網站、程序、app、小程序,就須要具備網絡通訊的功能,可以與遠端的服務器進行通訊,請求須要的數據進行顯示,並且其功能比沒有後端的通常會更爲強大,第一是由於它具備網絡通訊,可以支持多人的網絡訪問,第二是它的服務器CPU計算資源和內存硬盤存儲資源較本地機器更爲豐富,可以實現更多更復雜的需求;最後,由於restful接口的實現,其實先後端開發分離,也就是說,若是是一個公司想要在多線發展本身的產品,它能夠開發一個網站前端、桌面軟件前端、app客戶端、小程序前端,而這些前端都須要針對不一樣的運行環境選擇不一樣的前端技術,好比說html/css/js、C++、Java/Object-C、wxml/wxss/js/wxs,開發不一樣的前端顯示界面,可是,它們能夠只須要一個後端程序,共用一套後端代碼,包括後端數據計算、處理、存儲、數據庫等邏輯,這是徹底可行的,或者說,就應該這麼作。html

怎麼部署一個具備前端和後端的程序?

首先,你須要有一臺服務器,你的電腦能夠當服務器,也能夠本身在阿里雲、騰訊雲上租一臺服務器,還能夠直接上淘寶買一臺實體服務器。【其實所謂服務器能夠簡單理解爲就是性能更好的我的電腦主機】。
其次,你須要一個具備公網IP的服務器。若是你只想要在同一局域網中的人訪問你的程序,那麼直接把你的主機當作服務器,這樣在這個局域網中的人,就可以訪問到你的主機,進而訪問到你的程序。而若是你想要上線,想要全世界的人都可以訪問你的程序,一種方法是把你的主機or你本身買的實體服務器設置成支持訪問的服務器(其實就是分配一個公網IP給這臺機器),windows上有IIS支持配置,linux上更容易,一搜確定就能搜到;一種方法基於阿里雲、騰訊雲租用的服務器,當你買的時候,它已經默認給你配置好了它的公網IP,直接使用便可(畢竟花錢買服務,省心很多)
而後,這時候,其實就已經能夠在這臺服務器上部署你的後端代碼、後端數據庫;網站前端和小程序的前端代碼文件也是放在這臺服務器上面,用戶請求的時候,才把這個前端的頁面文件返回給用戶,而後經過瀏覽器or微信進行渲染,展現到用戶的面前。而桌面程序和app就須要從官網or應用商店,下載本地的一個客戶端程序,下載安裝OK了,前端就有了。
按理說,有一個前端,有一個後端,再加上resetful接口來實現網絡通訊就能夠完美訪問服務了。實現restful的途徑有不少,最基本的仍是採用http的實現,就是前端發送http的請求,後端根據http請求的參數,返回對應的數據。其實http是支持直接輸入公網IP做爲host字段的,可是,若是直接用ip進行訪問,數字對於用戶來講很難記憶,並且若是直接把IP暴露在http中,很容易遭到攻擊,由於IP很容易僞造,可能會返回給你一個錯誤的服務內容;因此網站和小程序基本上是採用host爲域名的請求方式去把前端頁面請求回來,而桌面程序和app的前端是已經下載好了,不用請求獲取,只用請求後端服務器上的資源便可,而用戶的請求都是經過一些點擊發起的,用戶不用直接本身輸入IP,ip已是寫死在程序代碼or配置文件中的;不過也是由於前面說的容易遭受攻擊的緣由,有些程序和IP也是經過域名進行請求的。
也就是說,你須要有一個域名。域名就涉及到找一個域名註冊商,買下某個域名,而後在該域名註冊商的操做下,把這個域名和你剛剛服務器公網IP的對應關係存到DNS中,基於DNS的策略,把這個DNS記錄存到對應的域名服務器中。而後當用戶經過域名host發起HTTP請求的時候,就能夠利用DNS解析出這個域名對應的公網IP(就是買的那個服務器的公網IP),而後就能夠根據IP路由尋址找到那臺服務器了。域名是有使用期限的,通常從1年到10年不等,能夠經過阿里雲和騰訊雲進行購買,他們提供了比較好的域名解析、配置服務,比較方便省心。前端

雲計算、大數據、AI

剛剛有說到,之全部要有後端程序,很大程度上是由於遠端服務器的計算和存儲資源更爲豐富,可以提供更多的需求和響應。這也就是引入雲計算、大數據、AI的契機。
前面開發的那些程序,開始可能會比較小,功能也不夠完善,只能支持上百我的的同時訪問,可是當使用的用戶愈來愈多的時候,就會遇到高性能、併發性的問題。此時最簡單的方案就是增長機器,增長後端服務器的個數,天然同時支持提供的服務就多了。
慢慢的,當服務器增長到必定量的時候會發現一個問題。那就是資源浪費,舉個簡單的例子,淘寶雙十一的時候,同時那麼多訂單,淘寶的後端服務器都可以支撐下來,那時候的CPU多是100%在使用,可是在平時的時候,那些服務器的資源可能只用了20%就支撐了平時狀態的訪問。難道要刪除服務器,不行,等雙十一的時候就崩了,那這些服務器怎麼辦?廢物利用,就是雲計算。大廠商把本身平時閒置的服務器資源共享出來,出租給其餘小廠商,他們不用本身購買服務器實體,直接租用大廠商的雲服務器,把本身的後端程序部署在所謂雲上,利用雲的計算資源來作本身的東西。固然雲計算不只僅是這點東西,還包括並行計算、分佈式計算、虛擬化等等技術,這個就須要深刻了解了。
當用戶愈來愈多,後端數據庫中的數據、用戶產生的數據也會愈來愈多,慢慢的就達到了大數據的標準(這裏簡化了,真正大數據是要達到好幾個V的纔算大數據,具體能夠查一查),產生的這麼多的數據確定是有用的,能夠利用雲計算的技術對這些數據進行處理。大數據相關的技術架構不少,主要是hadoop那一堆,從數據的傳輸、處理、存儲,都有對應的技術路線,大數據工程師就是作這個的,其實他們和後端開發工程師同樣,都是在後端幹活,可是感受他們更加的細分,並且須要較大的應用場景、用戶規模的時候纔會用到他們,而若是隻是簡單的一個什麼程序之類的,根本用不到大數據工程師。
而AI,則是對數據處理的算法,用戶產生了這麼多的數據,大數據工程師仍是更偏開發層面,也就是說用一些技術去開發支撐這些大數據的傳輸、處理、存儲。可是AI則是對數據內容的自己進行挖掘發現,以支撐決策。這樣的就是對應算法工程師的職業需求了。vue

2018-10-16 23:53:49

有一些理解or感悟是從別的地方看到、記下的,忘了引出參考文獻。之後若是有更深的感悟or更詳細的調研結果,再對本文進行更新。java

2018-10-22 15:14:47

今天看了個推送,他提出了9大平臺的及對應的指標比較。看完,搜了下他提出來的 uni-app 的前端框架,基於vue.js,參考微信小程序,可以同時編譯成 android IOS wx小程序三種;主要好奇的是怎麼編譯成 android 和 IOS 的,明明以前的android和IOS開發都須要對應的java和Object-C語言,他是怎麼把vue.js寫的代碼編譯成功的?並且感受他說的這個框架和最初文章中的統一的全端框架不是一回事,他開發的原生app是可以達到和自己的原生app同樣的效果嗎?他說可以達到和小程序同樣的效果,並且比小程序的確多了一些原生sdk的支持可是我的感受仍是有點不太對。可是毫無疑問的是,若是有這麼一個全端開發接口,能夠極大的下降我的開發者的開發難度,並且它那篇文章的分析仍是很不錯的。以前考慮的是後端代碼統一,如今連前端代碼都統一的話……不過參考他說的研發作薄、運營作厚,若是是不一樣的用戶羣體,既要在全端作到最基礎的功能需求,又要在原生app中提供更多的功能,其實也只能部分代碼重用吧,不過最主要的是,若是可以簡化學習語言的成本就的確很不錯了。
可能之後真的會出現一種徹底統一的全平臺框架,這樣同一套代碼可以編譯成全平臺的各個程序了。node

相關文章
相關標籤/搜索