寫給產(chǎn)品經(jīng)理們的技術(shù)分享——后端篇

8 評(píng)論 17094 瀏覽 256 收藏 16 分鐘

在上一篇文章中,筆者分享了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ù)值。

寫給產(chǎn)品經(jīng)理們的技術(shù)分享--后端篇

二、web開(kāi)發(fā)

1. web應(yīng)用如何工作

在上一篇講前后端通信的時(shí)候,已經(jīng)初步提及了web應(yīng)用的工作方式。

這里再大概陳述一下:

  1. 用戶在瀏覽器執(zhí)行操作,比如輸入U(xiǎn)RL或者點(diǎn)擊一個(gè)跳轉(zhuǎn)鏈接。
  2. 瀏覽器將用戶動(dòng)作轉(zhuǎn)換為一個(gè)web請(qǐng)求,通過(guò)互聯(lián)網(wǎng)發(fā)送到服務(wù)器。
  3. 服務(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腳本。
  4. 瀏覽器接收到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)行交互的唯一方式)

寫給產(chǎn)品經(jīng)理們的技術(shù)分享--后端篇

以上流程翻譯成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ù)表分別如下:

寫給產(chǎn)品經(jīng)理們的技術(shù)分享--后端篇

可以看到,這兩張表通過(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è)樣子:

寫給產(chǎn)品經(jīng)理們的技術(shù)分享--后端篇

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)容:

  1. 關(guān)于API的基本知識(shí)
  2. web應(yīng)用的工作方式、開(kāi)發(fā)模式
  3. 數(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é)議

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. view和html/css是什么關(guān)系,view包含html和css這樣嘛

    回復(fù)
  2. 感覺(jué)寫的我讀不下去,可以更通俗易懂點(diǎn)嗎

    來(lái)自上海 回復(fù)
  3. view不是前端寫的,不誤導(dǎo)人好么

    回復(fù)
    1. 視圖層就是前端寫的啊……書里也是這樣教的。

      回復(fù)
    2. 這位同行,首先view前后端都可以寫,我也具體指明了過(guò)去MVC往往都由后端來(lái)寫,現(xiàn)在view往往由前端來(lái)寫。我所看的書里是這樣教的,我也和大多數(shù)開(kāi)發(fā)溝通過(guò),他們也是這樣理解的。不知你還有什么疑問(wèn)?

      來(lái)自廣東 回復(fù)
    3. 說(shuō)的沒(méi)錯(cuò)啊,是這樣的

      來(lái)自四川 回復(fù)
  4. 贊,作者是自學(xué)Python嗎

    來(lái)自廣東 回復(fù)
    1. 嗯,對(duì)的,不過(guò)學(xué)的比較淺

      來(lái)自臺(tái)灣 回復(fù)