題目

Building a backend service and a database for a pharmacy platform.

交付項目

未實作任務

  • Search for pharmacies or masks by name, ranked by relevance to the search term.
    搜尋藥局名稱可用關聯性做排序。但口罩名稱搜尋有實作但無法達成以關聯性做排序。

  • Write appropriate tests with a proper coverage report.
    目前沒有導入自動化測試流程,所以這部分尚未實作。

雲端部署

服務架構

服務架構

部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Login to remote server with ssh on AWS EC2
ssh root@phantom_mask_host

# Pull project from github
cd /data
git clone git@github.com:wenchan3918/phantom_mask.git

# Create .env file, then edit it
# Refernce: 4.4 .env檔

# Build docker image and run
cd /data/phantom_mask
bash run.sh dev up -d

# Create django superuser
docker exec -it django /bin/bash
python manage.py createsuperuser


# 一鍵部署,透過簡單腳本語言,進行代碼更新與容器重啟。
# cd to local project root directory
./cli/publish2prod.sh

測試資料匯入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Operation on docker container
docker exec -it django /bin/bash

# Import pharmacies.json and users.json
python manage.py import_data

# 若要重新匯入,請先刪除所有資料
python manage.py clear_data



# Operation on host(宿主主機)
# Import pharmacies.json and users.json
docker exec django bash -c "python manage.py import_data"

# 若要重新匯入,請先刪除所有資料
docker exec django bash -c "python manage.py clear_data"

.env檔

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#.env file

# Nginx setting
MODE=dev
SERVER_NAME_LIST=mask.langgo.app


# Django setting
ENABLE_SILK=1

ALLOWED_HOSTS=127.0.0.1,localhost,0.0.0.0,mask.langgo.app

# SECRET_KEY generate by https://djecrety.ir/
SECRET_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

DB_HOST=db
DB_NAME=phantom_mask
DB_USER=postgres
DB_PASSWORD=xxxxx
DB_PORT=5432
POSTGRES_HOST_AUTH_METHOD=trust #Must

LOG_PATH=/log

APP_ROOT_PATH=/app

容器狀態

當前啟動容器
容器使用資源

任務需求

任務1

List all pharmacies open at a specific time and on a day of the week if requested.
理解為: 列出藥局,可指定篩選某星期以及幾點營業的藥局。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 測試條件: 列出週三早上八點營業且晚上八點結束營業的藥局。

# Resquest
curl --location --request GET 'https://mask.langgo.app/api/pharmacy/?week=3&open_at=02:00&close_at=20:00&fields=name,opening_hours&page_size=3'

# Response
{
"next": "https://mask.langgo.app/api/pharmacy/?close_at=20%3A00&fields=name%2Copening_hours&open_at=02%3A00&page=2&page_size=3&week=3",
"previous": "",
"count": 18,
"results": [
{
"name": "DFW Wellness",
"opening_hours": [
{
"week": "WEDNESDAY",
"open_at": "08:00",
"close_at": "12:00"
}
]
},
{
"name": "Carepoint",
"opening_hours": [
{
"week": "WEDNESDAY",
"open_at": "08:00",
"close_at": "17:00"
}
]
},
{
"name": "First Care Rx",
"opening_hours": [
{
"week": "WEDNESDAY",
"open_at": "08:00",
"close_at": "17:00"
}
]
}
]
}

任務2

List all masks sold by a given pharmacy, sorted by mask name or price.
理解為: 列出藥局,需附帶已販售的口罩,且可依照口罩的名稱或價格做降冪或升冪排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# 測試條件: 列出所有藥局的販售紀錄且以販售價格做降冪排序。

# Request
curl --location --request GET 'https://mask.langgo.appapi/pharmacy/?fields=name,sales_history&ordering=price&is_desc=true&page_size=3'

# Response
{
"next": "https://mask.langgo.app/api/pharmacy/?fields=name%2Csales_history&is_desc=true&ordering=price&page=2&page_size=3",
"previous": "",
"count": 20,
"results": [
{
"name": "DFW Wellness",
"sales_history": [
{
"mask": {
"pharmacy_id": 21,
"pharmacy_name": "DFW Wellness",
"mask_product_id": 97,
"mask_product_name": "MaskT (green) (10 per pack)",
"price": 41.86
},
"transaction_amount": 38.34,
"transaction_date": "2021-01-26 10:49:29"
},
{
"mask": {
"pharmacy_id": 21,
"pharmacy_name": "DFW Wellness",
"mask_product_id": 96,
"mask_product_name": "True Barrier (green) (3 per pack)",
"price": 13.7
},
"transaction_amount": 14.74,
"transaction_date": "2021-01-29 04:17:31"
},
{
"mask": {
"pharmacy_id": 21,
"pharmacy_name": "DFW Wellness",
"mask_product_id": 100,
"mask_product_name": "Masquerade (green) (3 per pack)",
"price": 9.4
},
"transaction_amount": 9.6,
"transaction_date": "2021-01-15 08:46:36"
},
{
"mask": {
"pharmacy_id": 21,
"pharmacy_name": "DFW Wellness",
"mask_product_id": 99,
"mask_product_name": "Second Smile (black) (3 per pack)",
"price": 5.84
},
"transaction_amount": 5.28,
"transaction_date": "2021-01-02 10:58:40"
}
]
},
{
"name": "Carepoint",
"sales_history": [
{
"mask": {
"pharmacy_id": 22,
"pharmacy_name": "Carepoint",
"mask_product_id": 101,
"mask_product_name": "Masquerade (blue) (6 per pack)",
"price": 7.05
},
"transaction_amount": 7.6,
"transaction_date": "2021-01-24 21:48:58"
},
{
"mask": {
"pharmacy_id": 22,
"pharmacy_name": "Carepoint",
"mask_product_id": 101,
"mask_product_name": "Masquerade (blue) (6 per pack)",
"price": 7.05
},
"transaction_amount": 6.68,
"transaction_date": "2021-01-30 08:25:13"
},
{
"mask": {
"pharmacy_id": 22,
"pharmacy_name": "Carepoint",
"mask_product_id": 101,
"mask_product_name": "Masquerade (blue) (6 per pack)",
"price": 7.05
},
"transaction_amount": 6.67,
"transaction_date": "2021-01-28 14:03:58"
},
{
"mask": {
"pharmacy_id": 22,
"pharmacy_name": "Carepoint",
"mask_product_id": 101,
"mask_product_name": "Masquerade (blue) (6 per pack)",
"price": 7.05
},
"transaction_amount": 6.44,
"transaction_date": "2021-01-07 05:07:21"
},
{
"mask": {
"pharmacy_id": 22,
"pharmacy_name": "Carepoint",
"mask_product_id": 101,
"mask_product_name": "Masquerade (blue) (6 per pack)",
"price": 7.05
},
"transaction_amount": 6.39,
"transaction_date": "2021-01-17 04:24:31"
}
]
},
{
"name": "First Care Rx",
"sales_history": [
{
"mask": {
"pharmacy_id": 23,
"pharmacy_name": "First Care Rx",
"mask_product_id": 108,
"mask_product_name": "MaskT (black) (10 per pack)",
"price": 44.4
},
"transaction_amount": 41.66,
"transaction_date": "2021-01-06 07:46:12"
},
{
"mask": {
"pharmacy_id": 23,
"pharmacy_name": "First Care Rx",
"mask_product_id": 109,
"mask_product_name": "MaskT (green) (10 per pack)",
"price": 37.87
},
"transaction_amount": 36.64,
"transaction_date": "2021-01-17 10:46:34"
},
{
"mask": {
"pharmacy_id": 23,
"pharmacy_name": "First Care Rx",
"mask_product_id": 110,
"mask_product_name": "Second Smile (black) (3 per pack)",
"price": 14.96
},
"transaction_amount": 14.24,
"transaction_date": "2021-01-03 07:30:30"
}
]
}
]
}

任務3

List all pharmacies with more or less than x mask products within a price range.
理解為: 列出藥局,需附帶可販賣的口罩,且可用價格範圍進行篩選。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 測試條件: 列出所有藥局並附上販售的口罩商品,口罩商品只顯示出販售價格為10~20元區間並以銷售價格做降冪排序。

# Request
curl --location --request GET 'https://mask.langgo.app/api/pharmacy/?fields=name,mask_products&min_price=10&max_price=20&is_desc=true&page_size=3'

# Response
{
"next": "https://mask.langgo.app/api/pharmacy/?fields=name%2Cmask_products&is_desc=true&max_price=20&min_price=10&page=2&page_size=3",
"previous": "",
"count": 20,
"results": [
{
"name": "DFW Wellness",
"mask_products": [
{
"product_id": 96,
"product_name": "True Barrier (green) (3 per pack)",
"price": 13.7
}
]
},
{
"name": "Carepoint",
"mask_products": []
},
{
"name": "First Care Rx",
"mask_products": [
{
"product_id": 105,
"product_name": "Masquerade (black) (10 per pack)",
"price": 19.95
},
{
"product_id": 110,
"product_name": "Second Smile (black) (3 per pack)",
"price": 14.96
},
{
"product_id": 107,
"product_name": "Masquerade (black) (3 per pack)",
"price": 12.0
},
{
"product_id": 104,
"product_name": "Second Smile (blue) (6 per pack)",
"price": 11.07
}
]
}
]
}

任務4

The top x users by total transaction amount of masks within a date range.
理解為: 列出顧客,可篩選某個日期範圍內的交易總金額,並依照交易總金額做降冪排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# 測試條件: 列出2021-01-11~2021-01-15有進行交易的顧客且依交易總金額做降冪排序。

# Request
curl --location --request GET 'https://mask.langgo.app/api/pharmacy/customer/?start_date=2021-01-11&end_date=2021-01-15&ordering=total_transaction_amount&is_desc=true&fields=name,total_transaction_amount,purchase_history&page_size=3'

# Response
{
"next": "https://mask.langgo.app/api/pharmacy/customer/?end_date=2021-01-15&fields=name%2Ctotal_transaction_amount%2Cpurchase_history&is_desc=true&ordering=total_transaction_amount&page=2&page_size=3&start_date=2021-01-11",
"previous": "",
"count": 8,
"results": [
{
"name": "Timothy Schultz",
"total_transaction_amount": 77.71,
"purchase_history": [
{
"mask": {
"pharmacy_id": 37,
"pharmacy_name": "Health Element",
"mask_product_id": 172,
"mask_product_name": "Masquerade (green) (6 per pack)",
"price": 25.44
},
"transaction_amount": 27.98,
"transaction_date": "2021-01-12 10:33:56"
},
{
"mask": {
"pharmacy_id": 33,
"pharmacy_name": "Foundation Care",
"mask_product_id": 150,
"mask_product_name": "Masquerade (green) (10 per pack)",
"price": 29.66
},
"transaction_amount": 31.95,
"transaction_date": "2021-01-11 17:49:49"
},
{
"mask": {
"pharmacy_id": 32,
"pharmacy_name": "PharmaMed",
"mask_product_id": 149,
"mask_product_name": "MaskT (green) (10 per pack)",
"price": 17.81
},
"transaction_amount": 17.78,
"transaction_date": "2021-01-11 02:32:53"
}
]
},
{
"name": "Willie Moran",
"total_transaction_amount": 49.19,
"purchase_history": [
{
"mask": {
"pharmacy_id": 25,
"pharmacy_name": "Prescription Hope",
"mask_product_id": 117,
"mask_product_name": "Cotton Kiss (green) (10 per pack)",
"price": 46.07
},
"transaction_amount": 49.19,
"transaction_date": "2021-01-13 20:44:43"
}
]
},
{
"name": "Wilbert Love",
"total_transaction_amount": 28.8,
"purchase_history": [
{
"mask": {
"pharmacy_id": 28,
"pharmacy_name": "First Pharmacy",
"mask_product_id": 126,
"mask_product_name": "Cotton Kiss (green) (10 per pack)",
"price": 16.02
},
"transaction_amount": 17.5,
"transaction_date": "2021-01-13 01:18:23"
},
{
"mask": {
"pharmacy_id": 34,
"pharmacy_name": "Keystone Pharmacy",
"mask_product_id": 152,
"mask_product_name": "True Barrier (green) (3 per pack)",
"price": 12.06
},
"transaction_amount": 11.3,
"transaction_date": "2021-01-13 00:19:32"
}
]
}
]
}

任務5

The total number of masks and dollar value of transactions within a date range.
理解為: 列出口罩,可篩選某日期範圍內的口罩交易的總金額。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# 測試條件: 列出口罩,在2021-01-11~2021-01-15有販售紀錄且顯示這段時間販售的總金額。

# Request
curl --location --request GET 'https://mask.langgo.app/api/pharmacy/mask/?start_date=2021-01-11&end_date=2021-01-15&fields=name,sale_total_amount,sale_total_transaction_amount,purchase_history&page_size=3'

# Response
{
"next": "https://mask.langgo.app/api/pharmacy/mask/?end_date=2021-01-15&fields=name%2Csale_total_amount%2Csale_total_transaction_amount%2Cpurchase_history&page=2&page_size=3&start_date=2021-01-11",
"previous": "",
"count": 9,
"results": [
{
"name": "True Barrier (green) (3 per pack)",
"sale_total_amount": 2,
"sale_total_transaction_amount": 24.26,
"purchase_history": [
{
"mask": {
"pharmacy_id": 34,
"pharmacy_name": "Keystone Pharmacy",
"mask_product_id": 152,
"mask_product_name": "True Barrier (green) (3 per pack)",
"price": 12.06
},
"transaction_amount": 12.96,
"transaction_date": "2021-01-12 09:26:36"
},
{
"mask": {
"pharmacy_id": 34,
"pharmacy_name": "Keystone Pharmacy",
"mask_product_id": 152,
"mask_product_name": "True Barrier (green) (3 per pack)",
"price": 12.06
},
"transaction_amount": 11.3,
"transaction_date": "2021-01-13 00:19:32"
}
]
},
{
"name": "MaskT (green) (10 per pack)",
"sale_total_amount": 1,
"sale_total_transaction_amount": 17.78,
"purchase_history": [
{
"mask": {
"pharmacy_id": 32,
"pharmacy_name": "PharmaMed",
"mask_product_id": 149,
"mask_product_name": "MaskT (green) (10 per pack)",
"price": 17.81
},
"transaction_amount": 17.78,
"transaction_date": "2021-01-11 02:32:53"
}
]
},
{
"name": "Masquerade (green) (10 per pack)",
"sale_total_amount": 1,
"sale_total_transaction_amount": 31.95,
"purchase_history": [
{
"mask": {
"pharmacy_id": 33,
"pharmacy_name": "Foundation Care",
"mask_product_id": 150,
"mask_product_name": "Masquerade (green) (10 per pack)",
"price": 29.66
},
"transaction_amount": 31.95,
"transaction_date": "2021-01-11 17:49:49"
}
]
}
]
}

任務6

Search for pharmacies or masks by name, ranked by relevance to the search term.
理解為: 列出口罩與藥局,當名稱符合關鍵字搜尋,且需要搜尋關聯性詞語做排序(此部分未實作)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# 測試條件: 列出藥局,搜尋含有『Health』關鍵字的藥局,且附帶販售的口罩資訊。

# Request
curl --location --request GET 'http://127.0.0.1:8080/api/pharmacy/?fields=name,mask_products&name=Health&page_size=3'

# Response
{
"next": "https://mask.langgo.app/api/pharmacy/?fields=name%2Cmask_products&name=Health&page=2&page_size=3",
"previous": "",
"count": 5,
"results": [
{
"name": "Health Mart",
"mask_products": [
{
"product_id": 119,
"product_name": "Cotton Kiss (blue) (3 per pack)",
"price": 7.1
}
]
},
{
"name": "Health Warehouse",
"mask_products": [
{
"product_id": 121,
"product_name": "MaskT (black) (10 per pack)",
"price": 15.71
},
{
"product_id": 120,
"product_name": "Second Smile (green) (10 per pack)",
"price": 43.51
}
]
},
{
"name": "Health Element",
"mask_products": [
{
"product_id": 173,
"product_name": "Cotton Kiss (green) (6 per pack)",
"price": 20.5
},
{
"product_id": 171,
"product_name": "MaskT (green) (10 per pack)",
"price": 24.55
},
{
"product_id": 172,
"product_name": "Masquerade (green) (6 per pack)",
"price": 25.44
},
{
"product_id": 174,
"product_name": "MaskT (blue) (10 per pack)",
"price": 33.96
}
]
}
]
}

任務7

Process a user purchases a mask from a pharmacy, and handle all relevant data changes in an atomic transaction.
理解為: 顧客可一次購買多筆口罩,購買結帳過程中如果發生客戶有餘額不足時,則取消此次交易,並回復客戶原本餘額以及藥局銷售金額。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 測試條件: 客戶『Ada Larson』購買兩筆口罩商品。
- Ada Larson購買前可用餘額$978.49
購買下面兩筆口罩:
{
"pharmacy_id": 1,
"pharmacy_name": "DFW Wellness",
"mask_product_id": 1,
"mask_product_name": "True Barrier (green) (3 per pack)",
"price": 13.7
}
{
"pharmacy_id": 1,
"pharmacy_name": "DFW Wellness",
"mask_product_id": 2,
"mask_product_name": "MaskT (green) (10 per pack)",
"price": 41.86
}
- 第一次購買後,可用餘額$922.93


# Request
curl --location --request POST 'https://mask.langgo.app/api/pharmacy/mask/order/' \
--header 'Content-Type: application/json' \
--data-raw '{
"customer_name": "Ada Larson",
"items": [
{
"mask_product_id": 1,
"num": 1
},
{
"mask_product_id": 2,
"num": 1
}
]
}'

# Response
status: 200


Ada Larson購買前可用餘額$978.49
第一次購買後,可用餘額$922.93

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 測試條件: 客戶『Ada Larson』購買兩筆口罩商品,其中一筆產品購買數量為100。
- Ada Larson購買前可用餘額$922.93
購買下面兩筆口罩:
{
"pharmacy_id": 1,
"pharmacy_name": "DFW Wellness",
"mask_product_id": 1,
"mask_product_name": "True Barrier (green) (3 per pack)",
"price": 13.7
}
{
"pharmacy_id": 1,
"pharmacy_name": "DFW Wellness",
"mask_product_id": 2,
"mask_product_name": "MaskT (green) (10 per pack)",
"price": 41.86
}
- 第二次購買後,因超過可用餘額將不扣款,可用餘額維持$922.93


# Request
curl --location --request POST 'https://mask.langgo.app/api/pharmacy/mask/order/' \
--header 'Content-Type: application/json' \
--data-raw '{
"customer_name": "Ada Larson",
"items": [
{
"mask_product_id": 1,
"num": 1
},
{
"mask_product_id": 2,
"num": 100
}
]
}'

# Response
status: 400
[
"Customer cash balance is not enough. Ada Larson's cash balance is $922.93."
]


第二次購買後,因超過可用餘額將不扣款,可用餘額維持$922.93

資料模型

共有五個資料模型,分別為:

  • Pharmacy Model: 藥局資料表。
  • Opening Hour Model: 藥局營業時間資料表。
  • Mask Model: 口罩資料表。
  • Pharmacy Mask Model: 藥局口罩資料表,用來對應藥局與口罩的關係,每筆資料代表可販售的口罩商品。
  • Customer Model: 顧客資料表。
  • Purchase History Model: 顧客購買紀錄資料表。

使用 DBeaver 工具產生ER Diagram。
使用 Django migrations 來建立資料表,可控管Schema異動版本。

ER Diagram

API

共提供四隻API,分別為:

  • Search Pharmacy API: 搜尋藥局。
  • Search Customer API: 搜尋顧客。
  • Search Mask API: 搜尋口罩。
  • Buy Mask API: 購買口罩。

使用文件

此文件主要優化閱讀性但不提供測試 https://mask.langgo.app/doc/
Swagger API文件2

線上測試

可進入 https://mask.langgo.app/swagger/ 直接點選Try it out按鈕進行測試。
Swagger API文件

效能分析

使用 django-silk 套件,可在 https://mask.langgo.app/silk/ 分析過去的API請求。
請求總表
請求詳細Request
請求詳細SQL

測試工具

使用Apifox工具進行API測試。
Apifox

後台管理介面

使用Django admin進行後台建置,提供畫面可直接對數據進行觀看與編輯。

管理員登入

後台登入
後台首頁

藥局管理

顯示各家藥局,包含營業額、銷售數量、營業時間、與販售的口罩商品。
Pharmacy藥局列表
Pharmacy藥局詳細內容

口罩管理

顯示各種口罩,包含銷售數量。
Mask口罩列表
Mask口罩詳細內容

顧客管理

顯示各位顧客,包含可用餘額與購買紀錄。
Customer顧客列表
Customer顧客詳細內容

演算法

線上面試

資訊收集

了解公司與老闆背景,以及目前公司產品與服務。

資訊消化

  • 公司主要針對企業客戶,提供合約雲端作業平台,可在線上編輯合約內容與電子簽署等服務。
  • 從提供服務類型得知,市場應該是以企業客戶為主。
  • Creativity 365與Notion看似為同質性產品。
  • 公司獲利來源,APP廣告與雲端服務訂閱。
  • 提供的雲端數位創作,競爭應該滿大的,例如office 365、notion。

提問問題

  • 公司未來發展方向應該以企業客戶為主要市場?希望再提供哪方面服務(還有哪些痛點),以目前產品點點簽應該已經解決到客戶合約簽署痛點。
  • 目前技術團隊組成,APP、前端、後端規模?是否有還有其他職務?,如AI、運維?
  • 三位技術經理主要負責領域?
  • 公司目前使用的技術有哪些?
  • 資深後端工程師職務內容,希望協助解決哪方面問題?
  • 一個專案任務,從需求到實作整個過程會是如何進行討論與分配?
  • 公司是否有提供創新環境?讓員工能有時間跟環境進行idea發想與創新?
  • 目前公司提供的服務,對未來遠景與競爭對手有什麼看法?
  • 公司主要獲利來源?
  • 針對這次筆試呈現結果,是否有哪些地方需要改進?

面試過程

HR電話面談:

At 2022/11/25
輕切熱忱,主要通知技術面試時間跟內容,並介紹公司文化、背景、產品以及辦公情況。

技術視訊面試(ㄧ面):

At 2022/11/27 14:00
面試內容:

  • 自我介紹,並介紹自己的經歷。
  • 針對筆試內容做詢問,
    • 為何使用目前Django框架?有哪些好處?
    • silky工具很有趣,怎麼解讀上面數據?以及上面反應時間好壞如何判定?
    • API接口設計想法?
    • query custom field設計想法?
    • nginx主要用途?
    • nginx work connection數量設定想法?為何要設定為1024?
    • db connection數量設定想法?
    • 部署雲端,除了SSH外,是否有其他更安全的部署方式?
    • 有用過Redis?
    • 有用過Ruby on Rails?
    • 有用過什麼測試框架?
    • 有用過什麼CI/CD工具?
    • 如果面對有百萬等級用戶,你會使用什麼服務架構?
    • 有過與同事發生衝突的經驗嗎?如何排除?
  • 解說目前公司團隊規模跟文化。
  • 解說公司如何發想一個產品到安排實作過程。
  • 解說職務內容,需要哪些技能、會負責哪個產品。

學習與檢討

  • 關於參數設定,應該要多了解一下,例如nginx的work connection數量設定,為何要設定為1024?,db connection數量設定想法?
  • 需導入測試框架與CI/CD,有成熟產品的公司基本上都會著重在這兩部分,值得學習。
  • 大流量處理經驗,這部分比較欠缺。
  • 內部對工程師要求,每次交付都需要寫測試單元,這部分對產品品質有一定保障。
  • 公司會針對筆試跟面試做出完整回饋,此部分有別於其他公司,對彼此成長很有幫助。
  • 這次為第二階段技術面試,如有合格會再安排第三階段面試,再與部門主管面談公司環境、薪資等等。

主管視訊面試(二面):

At 2022/12/08 14:00
提問問題:

  • 職務
    • 協同合作方式,從想法->規劃->實作->測試->上線->維護整個過程。
    • 如何管理技術團隊,有導入一些開發流程(例如Scrum)?
    • 如何分配團隊成員的任務與時間?
    • 選用Ruby on Rails的原因?有採用其他方案?
    • 在導入k8s有遇到哪些問題?
    • 測試覆蓋率想法。
  • 公司
    • 團隊組成?行銷與技術成員佔比?
    • 獲利模式,內部產品與外部接案?
    • 公司文化理念。
    • 老闆願景。
    • 矽谷資本投資過程。
  • 福利
    • 薪資。
    • 獎金。
    • 配備。
    • 工作型態(進公司、遠端)。
    • 其他。

面試內容:
come soon~

Keyword

1
2
3
4
5
6
7
8
9
10
11
12
交付項目, Deliverable, de-live-rable
未實作任務, Unimplemented Task, un-im-ple-ment-ed task
藥局, Pharmacy, phar-ma-cy
關聯性排序, Related Sorting, re-lated sort-ing
導入自動化測試, Import Automated Testing, im-port auto-mat-ed test-ing
容器, Container, con-tai-ner
理解需求, Understand Requirement, un-der-stand re-quire-ment
餘額不足, Insufficient Balance, in-suf-fi-cient bal-ance
面試筆試, Interview Written Test, in-ter-view writ-ten test
效能分析, Performance Analysis, per-form-ance ana-ly-sis
架構圖, Architecture Diagram, arch-itec-ture dia-gram
亞洲美國多元技術協會(台北搖籃計畫), Asia America Multi-Technology Association