寫給產(chǎn)品經(jīng)理們的技術(shù)分享——后端篇
在上一篇文章中,筆者分享了web前端的相關(guān)知識與應(yīng)用(寫給產(chǎn)品經(jīng)理的技術(shù)分享–前端篇),這篇文章是對上一篇文章的補充,主要分享后端、以及前后端交互相關(guān)知識及其在產(chǎn)品工作中的應(yīng)用。
一、簡單談一下API
1. API的種類以及定義
API這個詞,我想所有的產(chǎn)品經(jīng)理都聽過無數(shù)次。
上一篇分享中,我們提及了一種用于前后端通信的API,其作用方式之一是:前端隨請求將要傳遞的數(shù)據(jù)打包并發(fā)送到服務(wù)器,服務(wù)器執(zhí)行相應(yīng)處理程序,并將程序的輸出發(fā)回前端。
前端通常使用這種方式從服務(wù)器請求最新數(shù)據(jù),因為這些工作涉及到前后端配合,因而在實際工作中還需要產(chǎn)出相應(yīng)的API文檔(甚至于在一些公司是由產(chǎn)品經(jīng)理去輸出API文檔),指明隨請求發(fā)送的參數(shù)、請求方法,傳回的參數(shù)等。
除了這種用于前后端通信的API,還有很多其他類型的API,例如:我們調(diào)用支付寶、微信等第三方應(yīng)用的API,從而為自己的應(yīng)用增加支付、分享等功能。
在《headfirst python》這本書中,通過一個具體的例子,更加透徹的講解了API的由來:
在編程中,通過定義函數(shù),可以減少重復(fù)代碼;將函數(shù)保存在一個腳本文件中,使之轉(zhuǎn)化為模塊;將模塊放入文件夾,同時增加元數(shù)據(jù)文件,就可以將模塊打包準(zhǔn)備發(fā)布;在web上發(fā)布你的文件(也就是API),以供他人下載、安裝和使用,其他開發(fā)者可以使用API所提供的函數(shù)為產(chǎn)品增加功能。
為了讓更多人以不同方式更加靈活的調(diào)用API,我們在定義函數(shù)時可以使用可選參數(shù)(也就是為參數(shù)提供默認(rèn)值),通過使用參數(shù)控制函數(shù)的行為與表現(xiàn)。
2. 在產(chǎn)品工作中的應(yīng)用
即便不需要寫API文檔,產(chǎn)品經(jīng)理對于API及其調(diào)用方式也需要有基本的認(rèn)知,進(jìn)行考慮并體現(xiàn)在產(chǎn)品設(shè)計方案或者PRD中。
以調(diào)用QQ分享接口為例進(jìn)行說明:我們需要查看QQ開放平臺API調(diào)用說明,明確各種API調(diào)用的效果以最終確定要選取的API,以及該API需要自定義哪些參數(shù)。
下圖是我的PRD的截圖,指明了調(diào)用的API、調(diào)用效果以及需要自定義的參數(shù)值。
二、web開發(fā)
1. web應(yīng)用如何工作
在上一篇講前后端通信的時候,已經(jīng)初步提及了web應(yīng)用的工作方式。
這里再大概陳述一下:
- 用戶在瀏覽器執(zhí)行操作,比如輸入URL或者點擊一個跳轉(zhuǎn)鏈接。
- 瀏覽器將用戶動作轉(zhuǎn)換為一個web請求,通過互聯(lián)網(wǎng)發(fā)送到服務(wù)器。
- 服務(wù)器收到請求并進(jìn)行處理。在這里,如果請求的是靜態(tài)內(nèi)容,服務(wù)器會找到相應(yīng)資源并把它作為響應(yīng)返回給瀏覽器;如果請求的是動態(tài)內(nèi)容(也就是需要運行程序才能輸出),那么服務(wù)器會找到并運行相應(yīng)服務(wù)端程序,并將程序的輸出作為響應(yīng)發(fā)給瀏覽器。這個生成動態(tài)內(nèi)容的過程稱為通用網(wǎng)關(guān)接口(CGI),符合這個標(biāo)準(zhǔn)的服務(wù)端程序稱之為CGI腳本。
- 瀏覽器接收到web響應(yīng),通過改變DOM將之顯示在用戶的屏幕上。
2. 采用MVC設(shè)計web應(yīng)用
MVC即模型-視圖-控制器(model-view-controller),這是一種常用的開發(fā)模式,有助于將代碼分解為易于管理、維護(hù)、擴展的功能模塊。
其中:
- 模型(model):用于封裝與應(yīng)用程序的業(yè)務(wù)邏輯相關(guān)的數(shù)據(jù)以及對數(shù)據(jù)的處理方法;
- 視圖(view):代碼提供直接與用戶交互的界面;
- 控制器(controller):代碼起到組織協(xié)調(diào)作用,將模型代碼和視圖代碼粘合起來,用于處理響應(yīng),控制應(yīng)用程序的流程。
在互聯(lián)網(wǎng)早期,后端做了絕大部份工作,也就是模型、視圖、控制器代碼都由后端完成。
后端會建立數(shù)據(jù)模型,通過視圖代碼對HTML標(biāo)記進(jìn)行拼接,通過控制器代碼將模型數(shù)據(jù)填充到頁面視圖中并打印出來,這些輸出作為響應(yīng)發(fā)回瀏覽器,瀏覽器再將頁面顯示出來。
這種模式的缺點在于:每次請求都要返回一個新頁面,這會降低瀏覽器的響應(yīng)性;另外,許多前端頁面存在大量重復(fù)代碼,但是還要一遍一遍重復(fù)生成。
而現(xiàn)在,這一情況已經(jīng)改變,視圖代碼和部分控制器代碼已經(jīng)運行在前端,模型和部分控制器代碼則運行在后端。
在這種模式下,后端不再需要每次都返回一個完整頁面,只需傳送數(shù)據(jù)(通常為JSON格式);前端定義好頁面樣式,從服務(wù)端獲取數(shù)據(jù)并根據(jù)業(yè)務(wù)邏輯填充到頁面中。這可以提高頁面的響應(yīng)速度,并且高效利用了不同頁面的重復(fù)代碼。
舉個例子:比如我們的網(wǎng)站有一個這樣的頁面,用戶輸入某一個歌手,我們的網(wǎng)站就為其展示該歌手的所有歌曲名。那么前后端分別需要編寫哪些代碼模塊呢?
前端需要編寫視圖(View)相關(guān)代碼,提供一個表單頁面讓用戶輸入歌手名;前端還需要編寫一部分控制器(controller)代碼,用于創(chuàng)建請求,隨請求將用戶的輸入以鍵值對的形式(例如 singer:“周杰倫”)發(fā)送到服務(wù)端,另外還需要編寫數(shù)據(jù)到達(dá)時的處理程序,在服務(wù)端數(shù)據(jù)到達(dá)時,對歌曲數(shù)據(jù)進(jìn)行處理并以一定的結(jié)構(gòu)增加到頁面中。
后端需要有一個數(shù)據(jù)模型(model),該模型以一定的結(jié)構(gòu)存儲了許多歌手及其歌曲數(shù)據(jù),還定義了獲取業(yè)務(wù)所需數(shù)據(jù)的方法或者說函數(shù)(在這個例子中就是通過歌手的名字,獲取該歌手的所有歌曲);后端還需要有一個控制層(controller),用于處理前端發(fā)來的請求并進(jìn)行響應(yīng),在這里就需要獲取用戶輸入的歌手名(同樣是使用鍵獲取對應(yīng)的值),調(diào)用數(shù)據(jù)模型及相應(yīng)函數(shù),并將歌手名傳入函數(shù)。該函數(shù)會獲取模型數(shù)據(jù)并進(jìn)行處理,最終輸出該歌手對應(yīng)的歌曲列表,作為響應(yīng)發(fā)回前端。
3. 在產(chǎn)品工作中的應(yīng)用
通過以上的例子,我們就可以看出:前后端在軟件開發(fā)中角色的分工與配合方式,知道了目前前后端的分工原則后,我們在和前后端的溝通中就應(yīng)該相應(yīng)有所側(cè)重。
著重像前端展示頁面的結(jié)構(gòu)、樣式、交互,指明頁面數(shù)據(jù)來源;著重向后端展示,哪些數(shù)據(jù)來源于后端,這些數(shù)據(jù)的計算規(guī)則(如上文所言,復(fù)雜的數(shù)據(jù)邏輯運算一般發(fā)生在服務(wù)端),和現(xiàn)有數(shù)據(jù)的關(guān)聯(lián)等。
了解前后端的分工不僅可以幫助我們更好的推動產(chǎn)品方案落地,還有助于在出現(xiàn)bug時,更加快速定位到問題來源與對應(yīng)開發(fā)人員。
在這里還要強調(diào)一下:無論是“模型-視圖-控制器”這一開發(fā)模式,還是上述的前后端的分工方式,都不是唯一正確答案,這種劃分也不是非黑即白的。我們要明確其間的區(qū)別,但更要知道其中的聯(lián)系。
三、關(guān)于數(shù)據(jù)庫
1. 簡介
前面已經(jīng)提到了數(shù)據(jù)在前后端之間的傳遞,在上一篇講本地存儲的時候也提及了可以使用local storage(本地存儲)、session storage(會話存儲)將數(shù)據(jù)存儲在瀏覽器本地。但是,絕大多數(shù)用戶數(shù)據(jù)、內(nèi)容信息是存儲在服務(wù)端的數(shù)據(jù)庫中。
數(shù)據(jù)庫的類型主要有關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫。
關(guān)系型數(shù)據(jù)庫是一種基于關(guān)系模型的數(shù)據(jù)庫,這種關(guān)系模型是對現(xiàn)實中實體關(guān)系的抽象表達(dá)。非關(guān)系型數(shù)據(jù)庫,在存儲的數(shù)據(jù)結(jié)構(gòu)上沒有那么嚴(yán)格的約束和規(guī)范,以更加靈活的方式定義數(shù)據(jù)存儲。
常用的數(shù)據(jù)庫管理系統(tǒng)(軟件)包括:Oracle、MySQL、MongoDB等。
可以這樣理解數(shù)據(jù)庫和數(shù)據(jù)庫管理軟件的關(guān)系,數(shù)據(jù)庫就是一個類似Excel文件的數(shù)據(jù)文件,里面包含很多的數(shù)據(jù)表,這些文件會放在web應(yīng)用的根文件夾下,以便在運行程序時進(jìn)行訪問;數(shù)據(jù)庫管理系統(tǒng)類似于Excel軟件,可以可視化的查看并管理數(shù)據(jù)庫文件。
在這里我們僅對關(guān)系型數(shù)據(jù)庫進(jìn)行講解。
2. 如何與數(shù)據(jù)庫交互
這里以python編程為例,講解服務(wù)端程序與數(shù)據(jù)庫如何進(jìn)行交互。python的數(shù)據(jù)庫API提供了一種操作數(shù)據(jù)庫的標(biāo)準(zhǔn)機制,如下圖(注意這并不是與數(shù)據(jù)庫進(jìn)行交互的唯一方式)
以上流程翻譯成python代碼是這樣的:
3. 設(shè)計并建立數(shù)據(jù)庫
關(guān)系型數(shù)據(jù)庫是由一張張相互關(guān)聯(lián)的數(shù)據(jù)表構(gòu)成的,對數(shù)據(jù)庫的設(shè)計也就是設(shè)計數(shù)據(jù)表的結(jié)構(gòu)和關(guān)聯(lián)。我們現(xiàn)在來設(shè)計一個數(shù)據(jù)庫,并使用python真正建立這個數(shù)據(jù)庫。
現(xiàn)在我們設(shè)計了一個名為runningdata的數(shù)據(jù)庫,里面包含兩張數(shù)據(jù)表,一張表記錄每個用戶的基本信息(姓名和出生日期),另一張表記錄每個用戶的跑步時間數(shù)據(jù)。
兩張數(shù)據(jù)表分別如下:
可以看到,這兩張表通過用戶ID進(jìn)行關(guān)聯(lián),這種表的結(jié)構(gòu)和關(guān)聯(lián)應(yīng)該是具有邏輯意義、現(xiàn)實意義、業(yè)務(wù)導(dǎo)向、支持?jǐn)U展的。
上面是對數(shù)據(jù)表的設(shè)計,那么如何通過python建立上面的數(shù)據(jù)表,并進(jìn)行數(shù)據(jù)插入和查詢等操作呢?
首先套用3.2中的流程,建立與數(shù)據(jù)庫的連接、創(chuàng)建數(shù)據(jù)游標(biāo),然后使用create語句創(chuàng)建兩個數(shù)據(jù)表。使用SELECT語句對數(shù)據(jù)表進(jìn)行查詢并獲取結(jié)果,使用INSERT語句分別向表增加數(shù)據(jù)(其中用戶ID可以自動生成,我們使用第一個表生成的用戶ID填充第二個表,使之關(guān)聯(lián)起來),然后提交修改并關(guān)閉連接。
建立后的數(shù)據(jù)庫一般長這個樣子:
4. 將數(shù)據(jù)庫集成到web應(yīng)用
上面講MVC(模型-視圖-控制器)時我們提到,模型代碼用來存儲并提供數(shù)據(jù)。所以,我們只需在模型(model)中編寫上述代碼,讓其幫助我們創(chuàng)建數(shù)據(jù)庫,并定義相關(guān)的數(shù)據(jù)處理方法。這樣在控制器代碼進(jìn)行響應(yīng)時就可以調(diào)用該方法,使之返回我們需要的數(shù)據(jù)。
5.?在產(chǎn)品工作中的應(yīng)用
產(chǎn)品經(jīng)理對于數(shù)據(jù)庫的設(shè)計方式、作用方式有一定的了解,有助于評估產(chǎn)品功能的實現(xiàn)對現(xiàn)有數(shù)據(jù)庫的影響,以及新的設(shè)計對原有數(shù)據(jù)的兼容性問題。
另一方面,現(xiàn)在的產(chǎn)品設(shè)計往往需要參考大量的用戶行為數(shù)據(jù),進(jìn)行下一步優(yōu)化。這些用戶數(shù)據(jù)往往存儲在數(shù)據(jù)庫中,產(chǎn)品經(jīng)理有時需要使用SQL語句對數(shù)據(jù)庫進(jìn)行查詢,因而對于數(shù)據(jù)庫的了解也是大有幫助的。
寫在后面
本文主要講解了三個方面的內(nèi)容:
- 關(guān)于API的基本知識
- web應(yīng)用的工作方式、開發(fā)模式
- 數(shù)據(jù)庫的簡介、操作方法、應(yīng)用方式
通過這些內(nèi)容簡單介紹了服務(wù)端的基本知識,以及與產(chǎn)品工作的聯(lián)系。
我個人對于服務(wù)端技術(shù)的學(xué)習(xí)是通過《Head First Python》這本書,因此寫這篇文章,也算是拋磚引玉。后端的內(nèi)容非常之龐大,我雖誠惶誠恐,還是大膽把自己有所感悟的寫了下來,歡迎大家與我探討或者批評指正。
這兩篇文章講解了web應(yīng)用開發(fā)所涉及的基本知識,希望大家看完之后有所收獲,也建議產(chǎn)品經(jīng)理們?nèi)タ匆幌录夹g(shù)相關(guān)的書籍,甚至于寫一個自己的應(yīng)用,體會一下開發(fā)的過程,思考產(chǎn)品設(shè)計與技術(shù)實現(xiàn)的關(guān)系,思考產(chǎn)品經(jīng)理與開發(fā)人員的協(xié)作方式。
本文由 @lemon 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載
題圖來自Unsplash,基于CC0協(xié)議
view和html/css是什么關(guān)系,view包含html和css這樣嘛
感覺寫的我讀不下去,可以更通俗易懂點嗎
view不是前端寫的,不誤導(dǎo)人好么
視圖層就是前端寫的啊……書里也是這樣教的。
這位同行,首先view前后端都可以寫,我也具體指明了過去MVC往往都由后端來寫,現(xiàn)在view往往由前端來寫。我所看的書里是這樣教的,我也和大多數(shù)開發(fā)溝通過,他們也是這樣理解的。不知你還有什么疑問?
說的沒錯啊,是這樣的
贊,作者是自學(xué)Python嗎
嗯,對的,不過學(xué)的比較淺