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