1. 首頁
  2. 面試

產品助理的面試題

產品助理的面試題

騰訊微信產品經理面試題

其中第二題是一道偏技術的問題,出現在產品經理的面試中確實有點意外,但這題不失為一道很好的產品設計與系統分析的題目。系統分析也是我們“產品經理學技術”系列文章規劃中的一個部分,也是將我們所講的技術進行“昇華”的一部分內容。

下面我們嘗試回答一下這個問題,算是拋磚引玉了,大家有好的答案也可以給我們留言進行討論。

朋友圈的基本資料結構設計是怎樣的?既能做到完美閱讀許可權設定,又能兼顧效能?

關於訊息的基礎資料,比如文字、圖片、時間、位置等這些咱就不表了。這些資料基本上與許可權和效能沒有多大關係,可以理解為單獨儲存,純技術活。這裡只討論許可權與效能相關的資料結構。

而在許可權管理上,微信採用了給使用者打“標籤”來進行分組,這個標籤的分組與微信通訊錄一致。在資料上,就是給每個關係增加一個“標籤”標記。這裡需要注意的是,雖然微信的關係在產品使用上給使用者是雙向的(即互相關注),但是在儲存的時候,是給互相關的兩個使用者分別建立了關係資料,也就是每個人獨有自己的一份“通訊錄”。這透過刪除了自己的好友之後,自己並不從別人的通訊錄刪除就可以看得出來。標籤分組的基礎資料就是這樣了,這也是後面朋友圈許可權管理的基礎。

對於個人朋友圈timeline所能看到的訊息,按照一般的邏輯是先獲取所有朋友的訊息,然後剔除掉沒有授權給自己看的訊息、剔除掉自己遮蔽的使用者訊息,然後才得到自己當前看到的timeline。如果是這樣的邏輯的'話,等於每次重新整理朋友圈,都要跑到所有的訊息池裡面去找到上述通訊錄中朋友們的訊息,還要對找到的每條訊息去判斷使用者是否有許可權閱讀。這顯然是效率低下的方式,更何況微信是這麼大的一個訪問量和資料量。所以,這種資料結構設計是行不通的了。

一般邏輯下朋友圈每次讀取的過程

解決這種效能問題一般的思路就是把需要大計算量的過程分散到平時零散的時間去做。在這裡的思路就是:平時就把每個使用者需要的timeline資料按照許可權設定準備好,等到用的時候(重新整理朋友圈)就直接讀取準備好的內容。那麼答案就出來了:除了儲存一份上面講到的文字,圖片等基本資訊外,還需要給每個使用者儲存一份timeline資料,注意,是每個使用者一份。當然,這裡的“每份”不需要儲存完整資訊,只需要儲存訊息的ID和時間(可能需要)。每個人重新整理自己的朋友圈時,讀取自己的那份資料就行了,既不用去訊息池子裡面篩選,也不用判斷使用者許可權。

那是怎麼實現許可權控制呢?

當一個使用者釋出一條訊息時會按照上面講的標籤設定相關的許可權,伺服器就會給每個有許可權接收這條訊息的使用者的timeline中寫入這條訊息。也就是在使用者釋出的這一刻,就做好了許可權安排,而不是等到讀取的時候。這樣就自然減少了讀取的時候的計算量,提高了效率。

釋出時進行許可權控制(示意圖,實際比這複雜)

至於分庫分表這些就不展開了,知道有這麼回事就行。有時候這種技術上的設計也是會限制產品的設計。

那怎麼證明上面說的合理呢?

感興趣的同學可以去測試下:先發一條帶閱讀許可權的訊息,比如允許某個標籤的人看。然後再給這個標籤新增一個新人。結果是這個新人是看不到這條訊息的,因為許可權劃分是在釋出的時候就劃分好了,新人加入標籤的時間是在釋出之後,所以沒法獲得這條訊息的許可權分配機會,雖然他後來在標籤組中,但是仍然沒有辦法看到這條訊息。

這就是上面問題的答案,其實主要考察的是在產品設計時是否能夠考慮到技術方案的限制。我把上面的答案貼在知乎上,有人就問了:微信產品團隊是在一開始設計就考慮到了這個問題,還是經過不斷的迭代成現在這樣的?這是個好問題,好的產品經理應該在設計的時候就考慮到這種情況,或者至少應該有相應的預案,而不至於在出現問題或者被研發發難時束手無策。在這個案例中,微信是一開始考慮到了還是迭代過來的並不重要,對於微信“朋友圈”來說,本來就是一個迭代產品,最早的許可權管理是單獨於通訊錄的,那個時候是純外掛的模式,現在才與通訊錄共用了分組模式進行許可權管理。

如果對於上面的技術對產品設計的影響還不是很清晰的話,那麼就再跟兩個問題(好的產品經理除了能回答問題外,還要能提出問題^_^):

1、朋友圈的訊息為啥不能編輯,只能刪除?

我理解這是產品設計和技術實現平衡的結果。編輯功能對於主要以釋出照片和即時訊息的朋友圈來說,並不是剛性的需求。但是在上面的技術框架下,編輯功能在技術上,就不好實現。具體來說就是:前面我們講了,許可權的控制是在釋出的時候確定了,如果增加編輯功能的話,意味著一旦使用者在編輯的時候調整了閱讀許可權的話,就需要將之前寫入到有許可權的使用者timeline的資料刪除掉,重新寫入一遍,這對於技術實現來說,也是一個很大的成本,需要更新的資料很多(該條訊息所有涉及到的使用者的timeline資料都要更新)。所以,平衡的結果是寧願讓使用者刪除了重新發布,也不提供編輯的功能。你可能又要問了,刪除時就不用更新相關人的timeline嗎?首先刪除比寫入簡單多了,第二個是使用者timeline的資料可能還真不用刪除。具體原因就不解釋了,想知道的給我們留言單獨解釋。

2、上述釋出時的許可權分配規則中會考慮遮蔽的人嗎?也就是問,如果一個使用者A遮蔽了某個人B的朋友圈,B釋出的訊息會進入A的timeline的準備資料中嗎(不是指使用者微信裡看到的)?

先說一下我的答案:在釋出時的許可權控制是不會考慮遮蔽的人的。前面我們講了,在訊息釋出的時候,伺服器會根據使用者設定的許可權資訊,將訊息有選擇的放到有許可權閱讀人的timeline中。如果這個時候需要考慮遮蔽的人的話,那就還要去讀取每個有許可權閱讀的人的遮蔽人清單,然後根據每個人的清單去決定是不是放到這個人的timeline中,顯然這又會增加多大的計算量。那麼有人就要問了,那怎麼實現遮蔽的功能呢?兩種方法實現,一種是在這個使用者重新整理朋友圈時,將讀取到的自己的那份timeline資料(含遮蔽人的訊息),在伺服器端過濾掉遮蔽人的訊息;另外一種則是讀取的時候,伺服器端按照原樣下發給客戶端,客戶端根據儲存的遮蔽清單來過濾,被遮蔽的則不顯示給使用者。兩種方法在實現效率上幾乎沒有差別,透過對於微信的使用體驗來看,我傾向於這個是由客戶端來過濾的。實際這也可以有方法去驗證,這裡就不做了。這種遮蔽方案也是基於上面提到的“把需要大計算量的過程分散到平時零散的時間去做”。

那麼怎麼驗證上述關於遮蔽的邏輯是對的呢?上面我們在驗證“釋出時進行許可權分配”中講到了,後新增標籤分組的人,是看不到之前釋出的分組許可權訊息的。這裡我們也可以透過類似的方法驗證:把使用者遮蔽後,該使用者的訊息全部看不到,但是取消遮蔽之後,又立即能在朋友圈中看到,包括之前釋出的訊息但沒有看過的訊息。

最後要說的是,作為一個微信設計的旁觀者,以上答案是作為一個使用者從系統分析的角度去考慮的,並不代表微信確實是這樣的一個設計思路,但答案中的方案已經儘可能做到了可以驗證。答案中也沒有涉及到具體的技術,僅僅是一個系統分析的思路。

很高興看到越來越多的產品經理招聘開始注重技術能力了。前段時間各大網際網路公司的產品經理校招也出現了不少“技術”相關的試題,說明業內開始意識到技術能力對於產品設計的輔助作用。還是那句話,技術並不是產品設計必須的,但是能有的話效率會提升很多。