我們在做系統設計或系統設計的面試中,常常會有一些固定的步驟,像是討論需求、設計架構、設計 API 等步驟,GreatFrontEnd 的開發者幫我們整理了一套 framework / pattern 循序漸進地針對設計每個環節做討論,也就是 RADIO framework
Requirements Exploration: 徹底的了解需求與決定範疇
(Understand the problem thoroughly and determine the scope by asking a number of clarifying questions).
Architecture/High-level Design: 決定關鍵的 component 與他們之間如何作用
(Identify the key components of the product and how they are related to each other).
Data Model: 描述不同的資料個體,他們的欄位跟屬於哪個 component
(Describe the various data entities, the fields they contain and which component(s) they belong to).
Interface Definition (API): 定義 component 之間的介面,API 之間的功能、參數與回應
(Define the interface (API) between components in the product, functionality of each API, their parameters and responses).
Optimizations and Deep Dive: 討論可能優化的機會與特定的關注領域
(Discuss about possible optimization opportunities and specific areas of interest when building the product).
你需要藉由更深入 & 清楚的了解問題模糊的部分
把你的 interviewer 當作 product manager 來問
有些問題甚至是不需要 engineering 就可以解決的
推薦問題:
想像你被要求要 "設計 Facebook",Facebook 是一個大平台,有
你應該 focus 在哪個層面?
面試官已經內心有答案了,但想要你去藉由提問找出來,
通常會 Focus 在產品上最特別的地方,
像 Facebook 就是 new feeds 的部分,還有 new feeds 的分頁,產生一個新的貼文,
像 Youtube 就是觀看體驗
功能性需求 (Functional requirements):
一些基本的需求,產品沒有這些功能就無法運作
非功能性需求 (Non-functional requirements):
產品的改善,但對產品來說不是必要的,包括:
推薦做法:
你的設計,至少需要做到滿足所有的 functional requirements,
當你完成了 functional 部分,再往 non-functional requirements 下去探討
雖然我們知道了有哪些 funtional requirements,但一個大 feature 可能有非常多個小 features 所組成,舉例來說:
當建立一個新的 Facebook posts,我們要支援哪種格式?
除了 text-based posts,那 user 可以上傳圖片嗎? 可以上傳影片嗎? 產生投票? 打卡 (check in location) 等
在進到下一個 feature 前,我們要釐清 core features,並對此做設計
目標:了解產品的關鍵 components,還有他們之間的關聯
時間:約佔 20% 會議時間
記住 focus 在 clien-side architecture
在 frontend design 常見的高階元件/模組如下:
當在定義元件時,可以考慮的問題如下:
![[Pasted image 20240908002026.png | 500]]
大致上分為
通常是:
以 new feeds 來說
Source | Entity | Belongs To | Fields |
---|---|---|---|
Server | Post |
Feed Post | id , created_time , content , image , author (a User ), reactions |
Server | Feed |
Feed UI | posts (list of Post s), pagination (pagination metadata) |
Server | User |
Client Store | id , name , profile_photo_url |
User input (client) | NewPost |
Feed Composer UI | message , image |
不管是 Client-Server 或 Client components 之間的 APIs,都有以下 3 個相同的地方:
Parts of an API | Server-Client | Client-Client |
---|---|---|
溝同媒介(Name and functionality) | HTTP path | JavaScript function |
參數(Parameters) | HTTP GET query and POST parameters | Function parameters |
回傳值(Return Value) | HTTP response, typically JSON format | Function return value |
以 New feeds 的例子來說,server API 提供 client 去拿到最新的 posts
Field | Value |
---|---|
HTTP Method | GET |
Path | /feed |
Description | Fetches the feed results for a user. |
Parameters
{
"size": 10,
"cursor": "=dXNlcjpXMDdRQ1JQQTQ"
}
Response
{
"pagination": {
"size": 10,
"next_cursor": "=dXNlcjpVMEc5V0ZYTlo"
},
"results": [
{
"id": "123",
"author": {
"id": "456",
"name": "John Doe"
},
"content": "Hello world",
"image": "https://www.example.com/feed-images.jpg",
"reactions": {
"likes": 20,
"haha": 15
},
"created_time": 1620639583
}
// ... More posts.
]
}
跟 Server-client api 差不多,主要差在是藉由 javascript function 溝通,或監聽的 events,最重要的部分為
React 組件之間的溝通界面:
Parts of an API | React Component |
---|---|
溝通媒介 (Name and functionality) | React component(組件) |
參數 (Parameters) | Props(組件的輸入數據) |
回傳值 (Return Value) | JSX 結構(渲染輸出) 或 Callback 函數的結果(回調函數) |
props
傳遞數據,這與 Server-Client 的 HTTP GET/POST
參數和 Client-Client 的函數參數類似。父組件通過 props
向子組件傳遞狀態、數據和回調函數,子組件接收這些 props
並在內部使用。
props
傳遞回調函數給子組件時,子組件可以在某些事件觸發時調用這些函數,這類回調函數的返回值可以視為子組件向父組件的反饋,類似於 HTTP API 的響應結果或函數調用的返回值。
溝通媒介(Component):
ParentComponent
通過組件 <ChildComponent />
與子組件溝通,這個溝通過程類似於 Server-Client 的 API 路徑(例如 /get-data
),React 組件之間的溝通是通過組件本身進行的。參數(Props):
function ParentComponent() {
return <ChildComponent message="Hello, world!" />;
}
message
就像 API 的參數一樣,是由父組件傳遞給子組件的參數。回傳值(JSX 和 Callback 函數):
子組件渲染出來的 JSX 結構就是其回傳值,它是 UI 的表現層。
如果父組件傳遞了一個回調函數,例如:
function ParentComponent() {
const handleClick = () => alert('Button clicked!');
return <ChildComponent onClick={handleClick} />;
}
onClick
回調函數,這就像 API 的回傳值一樣,子組件通過這種方式回傳數據或觸發父組件的某些行為。
沒有特定的方式來進行,但有兩種方向可以進行:
專注在 product 的重要方面:
專注在你的強項:
Step | Objective | Recommended Duration |
---|---|---|
Requirements Exploration | 徹底的了解需求與決定範疇 . | < 15% |
Architecture/High-level Design | 決定關鍵的 component 與他們之間如何作用. | ~20% |
Data Model | 描述不同的資料個體,他們的欄位跟屬於哪個 component . | ~10% |
Interface Definition | 定義 component 之間的介面,API 之間的功能、參數與回應. | ~15% |
Optimizations and Deep Dive | 討論可能優化的機會與特定的關注領域. | ~40% |