2022/07/12

System Design Interview 不是比誰口才比較好


之前在台灣面試時都沒遇過 system design 面試,好像也較少聽聞有 system design 的關卡;
在英國時也不是所有面試時都會考 system design,通常是用來判斷該工程師是不是 senior 時會才比較會遇到。身為一個 senior engineer 除了被要求技術能力外,對於系統的架構設計和溝通能力也都會被期望達到一定的程度,同時也會預期多少具有領導能力。

而面試範圍可以小到設計一個 rate limiter,也可以大到設計一個 Netflix,其中要考慮的深度和廣度也就跟著不同,而且也有可能因為公司需求、軟硬體限制等而有所改變,沒有所謂最佳的解答。

在網路上看文章、影片 mock system design interview 時發現大家面試時,同樣一個問題,面試官的著眼點、流程的進行架構都不太一樣,那究竟什麼樣的內容是 system design inteview 時必須要談到的呢?

這裡用 designing a URL shortener 當範例,盡可能將流程結構化,並列出在設計時會考量的點,希望在面試時自己心中能有個大綱,好跑過一輪必考量的點;不過 system design 可以包含的範圍實在太廣了,可能會有些疏漏,還請見諒。


2022/06/16

簡單輕鬆十分鐘學會 Greedy Algorithm (貪婪演算法) 刷 LeetCode

一、Greedy Algorithm



1.1 基本觀念介紹


Greedy Algorithm (貪婪演算法) 是指在對問題求解時,總是做出在當前看起來最好的選擇,所以此種演算法在解問題時,不是所有題型都能得到 global optimization (全域最佳解),但對於相當多問題能產生整體最佳解或者是近似整體最佳解。


總之貪婪演算法的精神就是 : 短視近利、今朝有酒今朝醉,每一步面臨選擇時,都做眼前最有利的選擇,不考慮對將來是否有不良的影響,與 dynamic programming 不同,不會保留計算結果。


假設現在有個金額 M,有 1、5、10、20、50 元這些幣值種類,要盡可能用最少的錢幣湊到金額 M。根據貪婪演算法,能用 50 的就盡量用 50 的,否則盡量用 20 的...以此類推;在這種策略下,M 若是 15 則等於 10 * 1 + 5 * 1,共使用了 2 種錢幣。


但是如果我們換一組錢幣的種類如 1、5、11,貪婪演算法可能就不是最佳解。


或是我們有一個最多能背重量為 W 的背包,現在有 N 件物品,每件物品只能用一次且價值不相等,求解將哪些物品裝入背包裡物品價值總和最大,這時候因為要同時考慮重量和價值,也沒辦法用貪婪就取得最佳解。


這在下一篇 Dynamic Programming (動態規劃) 會講解到。


2022/06/14

簡單輕鬆十分鐘學會 Graph (圖) 刷 LeetCode

一、Graph

1.1 基本觀念介紹


此處談及的 Graph 並不是指圖片或者圖形,而是由數個 vertex (點) 及數條 edgs (邊) 所構成;點與點之間以邊相連,表示這兩點有關聯性。


而一個頂點的 degree (度) 指與該頂點相連的邊的條數。


兩點之間也可以有很多條邊,代表這兩點有很多項關聯;一個點有連到自己的邊,稱之為self-loop (自環),表示自己和自己有關聯。



1.1.1 Isomorphism / Isomorphic




(https://web.ntnu.edu.tw/~algo/Graph.html)


如果兩張圖的連接方式一模一樣時,則稱作同構圖。圖上的點可以任意移動位置,不論點的位置如何,都不會改變點與點之間的關聯。


簡單輕鬆十分鐘學會 Heap (堆疊) 刷 LeetCode

一、Heap

1.1 基本觀念介紹


Heap 有兩種分為資料結構和記憶體,都是取累積傾向的意思,而這邊要講的是資料結構的 Heap。


Heap 常見的實作為 Binary Heap,它的樹為 complete binary tree (完全二元樹) 如上圖。一棵依序節點可以從上到下、從左到右的表示為 1, 3, 6, 5, 9, 8。如果刪掉 node 9 那麼這便不是棵完全二元樹;如果拿掉 node 8 仍然是棵完全二元樹,因為整棵樹仍然可以從上到下、從左到右的表示成 1, 3, 6, 5, 9。
  • 新增節點時優先從左到右填滿階層後才往下一層
  • 概念基於 binary Tree,每個 node 下面最多只會有兩個 child,也有可能是一個或沒有
  • 常使用 array 來實作,由左至右、由上到下表示出一個完全二元樹
  • 若目前的 node 的 index 是 i,left child node 的 index 就是 i * 2 + 1,right child node 的 index 是 i * 2 + 2

2022/06/13

簡單輕鬆十分鐘學會 Tree & Binary tree & Binary search tree 刷 LeetCode

一秒理解資料結構裡的樹


一、Tree & Binary tree & Binary search tree

1.1 基本觀念介紹

1.1.1 Tree

是一種模擬現實生活中樹幹和樹枝的資料結構,分為 :

Root (根節點):沒有父節點的節點,所以每棵樹只有一個 root,如 A;在根節點之下是樹的樹枝,擁有 0 到 n 個子節點。

Node (節點):一個個連結點,如 A、B、C ... M 都是結點。

Parent (父節點) : 節點 B 是 I 和 J 的父節點。

Child (子節點) : 節點 I 和 J 是 B 的子節點。

Siblings (兄弟節點) : 擁有共同父節點,如 I 和 J、K 和 L 和 M。

Leaf (葉節點):節點沒有子節點的節點稱為葉節點,如 I、J、K、L、M、F、G、H。

Ancenstors (祖先節點) : 指某節點到根節點之間所經過的所有節點,都是此節點的祖先節點。

Level (階層) : 如果樹根是階層 1,其子節點即是階層 2,依序可以計算出樹的階層數;如節點A 階層是1,B、C 到 H 是階層 2,I、 J 到 M 是階層 3。

Height (樹高) : 又稱為 Depth (樹深),指樹的最大階層數,如此圖的樹高是 3。

Dregree (分支度):指每個節點擁有的子節點數,如節點 B 的分支度是 2,節點 E 的分支度是 3。

--
最廣義的樹對於 node 之 child 數目沒有限制,因此每個 node 可以有多個 child。

Linked list 也可以視作是樹只是每個 node 都只有一個 child。


2022/05/09

Coding Interview 就是刷好刷滿刷爆 LeetCode 就會上?

我家可愛貓貓鎮樓,最後她一個都沒選;
畢竟她靠可愛就可以過活了,還是由奴才來好好工作賺罐罐錢吧。


之前在台灣面試時一直都沒怎麼遇過需要 coding interview,
而且我也一直對於在別人面前寫程式感到害羞,
還以為自己可以就這樣逃過 coding interview 的關卡。

殊不知在英國面試時就常常遇到 
coding interview,雖然有時候會是 online test, assignment,
但果要進比較大的公司,coding interview 幾乎是必備。

還記得我第一次  coding interview 時,
面試開始時我想說我會寫我會寫欸然後我就直接寫完了,
還以為自己表現不錯題目有解出來 : )

結果得到 feedback 是 "感覺面試者沒有想跟面試官溝通"。
起先覺得困惑,後來才知道原來 coding interview 不是只是解題就好,
部分也是因為我自己這部份沒做好資料查詢。

所以痛定思定後,上網詳盡搜尋了相關資訊包括如何準備、面試時需要從哪些方面下手,並運用範例寫下 coding interview 過程,同時也請 MANGA 經過面試官訓練的朋友幫忙檢查內容。

我試圖把 coding interview 的流程寫成可以以較有結構式的方式執行;
這篇會分為平時練習時、面試前和面試過程中去解釋。

簡單輕鬆十分鐘學會 Stack & Queue (堆疊 & 佇列) 刷 LeetCode

一、Stack & Queue

1.1 基本觀念介紹

這裡講的 stack 和 queue,就是和 event loop 裡會用到的 call stack 和 callback queue 的基礎資料結構。

如果不是很清楚 event loop 是什麼,可以看這篇

Stack 和 Queue 常常用 array 或 linked list,但沒有限定,只要能實作出該資料結構即可。



1.1.1 Stack

Last in, First out (LIFO)

最後一個進去,第一個出來。

比如書籍堆疊起來,最後一本堆上去的會第一本先被拿走;


最下面 bottom 是第一個被放入的 frame,然後 frame 被一個一個堆起來 (push),

如果要把 frame 抽走,只能從最上方開始拿 (pop)。




2022/04/14

簡單輕鬆十分鐘學會 Recursion (遞迴) 刷 LeetCode

一、Recursion

1.1 基本觀念介紹


遞迴就是在函式之中呼叫函式自己本身,本質上是將複雜的問題,拆分成具有相同性質的子問題,進而解決問題的方法。


一個基本的遞迴函式一定要有:

  • 終止條件 (基本條件)

  • 遞迴條件 (呼叫自己的條件)


如果沒有終止條件,就會無限循環直到當掉。




範例 1 : 假設輸入一個正整數 n,求 1 + 2 + … + n 的總和


我們可以很直覺的使用迭代 (迴圈) 的方式,將所有數字累加在一起。



但因為這個問題能拆成有規律的數個小問題,

如輸入正整數 2 → 1 + 2 = 3

輸入正整數 3 → 1 + 2 + 3 = 6


所以這時候就可以使用遞迴來計算。


Time complexity 是 O(n),Space complexity 是 O(1)


簡單輕鬆十分鐘 Linked List (鍊表) 刷 LeetCode

一、Linked List

1.1 基本觀念介紹



Linked list 是一種常見的資料結構,會包含 head 和 tail 的資訊,以 null 來代表 Linked list 的終點,使用 node 來記錄、表示、儲存資料。



1.1.1 Singly linked list




單向鏈結串列 (單鏈結串列、線性鏈結串列、普通鏈結串列) 是最基本的鏈結串列,其特點是鏈結串列的鏈結方向是單向的,對鏈結串列的存取要通過從頭部開始,依序往下讀取。


每個 node 則會包含 value 和 next (Pointer,指向下一個 node 的位置) 的資訊。


2022/03/22

簡單輕鬆十分鐘學會 Hash Map (雜湊表) 刷 LeetCode

先來個地獄梗 emtional damage!

一、Hash Map

1.1 基本觀念介紹

  • Hash map 是儲存 (key, value) 這種 mapping 關係的一種資料結構 (當數據儲存在記憶體中時,決定數據的順序和位置的稱之為資料結構)
  • 各語言 / library 基本上有其 hash function,如有需要也可以自行建置
  • 語言不同名稱也會不同,但基本上 Hash map == Hash table == Hash object == Hash dictionary

(https://vhanda.in/blog/2012/07/shared-memory-hash-table/)



舉例來說,如果我們有 n 個數字要儲存時,通常會用 array 來存。 存好後如果我們拿到另一個數字 37,要判斷這個數字有沒有在 array 裡面,那我們就得跟 array 裡的元素一個個比較,這時 time complexcity 就會是 O(n);下次再換查另一個數字時, time complexcity 又就會是 O(n)。 但如果已經先建立好 hash table,之後如果要查數字 37 時,建立 hash map 時雖然 time complexcity 會是 O(n),但查詢的 time complexcity 就只會是 O(1)。 不過 O(1) 還是理論值,insert、search、lookup、delete 都有可能造成 time complexcity 是 O(n) (請看 example 3) 。


簡單輕鬆十分鐘看懂 Time complexity & Space complexity 分析刷 LeetCode

一、前導知識

1.1 演算法評估標準


當同一個問題可以用不同演算法去解決時,需要一個評量的標準去評估哪個演算法比較好,通常會用兩個指標去評量演算法的好壞 :
  • Time complexity (時間複雜度)
  • Space complexity (空間複雜度)
當然理論上所花費的時間和占用的記憶體是越小越好。


1.2 Time complexity


Time complexity 是電腦執行演算法所需要耗費的時間成本,通常會用 O (Big O notation) 去計算。


Big O notation 是解決一個規模為 n 的問題所花費的時間,或者所需步驟之數目;而演算法多快通常不是以秒而是步驟次數來衡量,因為每個人電腦效能會影響執行速度,若用秒數來衡量會顯得不夠客觀。

2021/12/21

在英國當面試官面試其他 Junior 工程師之經驗



1. 關於面試者

目前我在英國面試到的都是 Junior 的工程師,
有幾個遇到面試者常常會有的問題 : 

1.1 太緊張到沒辦法好好打招呼或是回答問題

總結要點其實就是平常心,講是這樣講但就是很難做到,
我剛開始是連回訊息或是接電話都緊張,甚至還逃避不回不接,
也是慢慢的去克服這件事。

這篇 瘋了才會在疫情的時候跑到英國找工程師工作有當時的心路歷程和實踐的方式可以參考看看。

還有多練習、多參加面試,不管這公司你有沒有興趣,都可以當作練習去參加,
練到你對面試無感,可以前五分鐘邀約後五分鐘你就能面試;
平常也可以找人幫忙 mock interview。


--
被問到的問題不知道答案沒關係,可以花點時間好好想想,
急著馬上給答案,可能會沒有思考清楚、也會容易讓人質疑你的處事態度。


--
把面試官當朋友,而不是一個在評估你的評審,
面試起來會比較放鬆、自然微笑,這樣也會給人比較有好感。
如果你有餘力,也可以試試加點 small talk 進去。


2021/10/13

英國倫敦客製 3D 蛋糕,把自己設計的蛋糕具現化



1. 工程師的除錯鴨鴨 + 壽星的個人特徵 + 壽星本人愛用的語言 Haskell ,參考之前的鴨鴨程式語言披風

2. 工程師必備筆電 MAC + 壽星用的編輯器 VIM 和 Terminal tmux,為了不給蛋糕師造成困擾,所以簡化了版面

3. 必備可愛的貓貓

這樣的 3D 訂製生日蛋糕超棒的吧 : D


2021/10/11

倫敦詳盡貓咖啡餐廳地圖,甚至還有結合領養貓?

Java Whiskers

本來這間是在瑞典,但在去年的時候在英國倫敦也開了一家店,位居於市中心。

有和救助貓機構 The Scratching Post Cat Rescue 合作,所以你可以先在網站上填寫期望領養貓的表單,然後預約時間到貓咖啡廳去實際和貓咪互動,看看是不是你在尋找的貓貓。

裝潢和餐點基本上都走高級路線,也因為在市中心,預定參觀的費用並不便宜,
像是光是純入場費不含餐點,一小時就是 15 鎊。

你可以在預約的時候就先選要純入場或是下午茶、也可以加點鹹食,或是到現場再加點也可以;只是純入場和下午茶的可以預約的時間就不一樣了,詳細如下 :


Standard Admission
Sun – Wed / 10.00 - 14.00 & 18.00 - 20.00
Thur – Sat / 10.00 - 14.00 & 18.00 -  21.00

Weekdays:
55 min £14.99
1h 25 min - £19.99
1h 55 min - £24.99

Weekends & Bank holidays:
55 min - £17.99
1h 25 min - £24.99
1h 55 min - £29.99


Afternoon Tea
Every day / 14.00 – 18.00

Weekdays:
55 min - £29.99
1h 25 min - £34.99
1h 55 min - £39.99

Weekends & Bank Holidays:
55 min - £32.99
1h 25 min - £39.99
1h 55 min - £44.99


官網上的食物照看起來很吸引人。

2021/08/13

2021/08/05

在英國什麼叫冷氣,店家住家沒有內建冷氣這件事

台灣的夏天熱到體感可以到 40 度,
但是稍微走幾步路都會有冷氣房可以躲,
三步一便利商店、五步一家店。
公車、捷運、百貨公司除了夜市幾乎都有冷氣,
夜市就算逛熱了也能躲進有冷氣的店。

怕熱如我在台灣開冷氣大概是 3 月 開到 12 月中,
對不起了北極熊但我真的需要那個酷玩意,
我還是有開高溫 + 風扇的拜託請原諒我。


在德國過冬時 0 度曾穿薄長袖出門,看到旁邊德國人穿羽絨外套,
心想你們一定沒經歷過台灣冬天,ㄏㄏ。


這次在英國度過我第一個夏日。

我。要。熱。死。了。

2021/08/04

很不舒服了還要在英國看醫生好不安,到底該怎麼敘述病情



一、先想好怎麼敘述自己症狀

得說現在因為 Covid-19 的關係,不管你再怎麼虛弱,還是只能一個人進去;
我上次是被扶進去的但沒有到意識模糊,醫院還是只准我一個人進去。

所以在看診前努力的想好該怎麼描述自己症狀吧,
我知道你很不舒服,但是撐一下! 說清楚醫生才能幫你治療,
如果真的沒辦法講話可以用手機打下來給醫生看。
也記得把常備藥物帶著,畢竟醫生開的藥和你使用的藥可能有交互影響,

也要有心理準備可能不像在台灣,
在英國 walk-in 除非嚴重症狀不然會等了三四小時以上,
預約 GP 可能預約不到近期的,
只能說在國外生病,真的需要很強很強的意志力。


二、常用到身體不適的描述單字 / 語句

Antibiotics  ⇒ 抗生素
Prescription ⇒ 處方簽
Medical certificate ⇒ 醫療證明
Prescription medicine ⇒ 需處方簽的藥
Over-the-counter medicine ⇒ 不需處方簽的藥
Cough ⇒ 咳嗽
Mucus ⇒ 黏液
Congested nose / stuffy nose ⇒ 鼻塞
Squeeze out ⇒ 擤鼻涕
Nausea ⇒ 感到噁心
Sneeze ⇒ 打噴嚏
Injection ⇒ 注射
Put on a drip ⇒ 吊點滴

2021/07/14

有長期處方用藥需求如何申請、攜帶出境,並在英國尋找相同 / 替代藥,包含使用 GP 諮詢和申請線上定期訂藥

一、處方用藥

1.1 藥物攜帶疑問

我本來就有長期需要吃處方用藥的需求,
一來是擔心在不容易預約到 GP (英國醫生) 看診。
一來是擔心可能 GP 會想要重新診斷以至於短時間沒辦法拿到藥。

於是在台灣跟醫生討論的作法是,
先開足夠幾個月藥給我 (這作法可能不是每個醫生都可以接受,請詢問你的醫生),
讓我用托運行李帶過去

那這邊就有一些問題 : 
  • 英國允許一個人帶多少月份的藥量? 
  • 哪些藥可以帶哪些藥不行? 
  • 需不需要申請? 
  • 申請內容要寫什麼?


1.2 藥品管制查詢

那要先來查關於藥物的入境管制,
List of most commonly encountered drugs currently controlled under the misuse of drugs legislation 裡列出了 class (藥品類別) 和 schedule (藥品管制級別)。

主要看自己的藥有沒有在藥品管制級別 schedule 上
注意是查製作藥品的藥物名稱,所以假設你是要查普拿疼,不是查 panadol 而是要查成份 acetaminophen。


(題外話,止痛藥英國就買得到不需要特別帶,底下第三大點第四大點也會提到如何查詢同成分用藥,和英國就可以買得到的常用藥。)

根據 Bringing medicine containing a controlled drug into the UK如果你要攜帶的藥物有包含在 schedule 2, 3 or 4 (part 1) 且只需攜帶少於三個月的藥量,可選擇以下其一選項
  • 攜帶 letter of proof 
  • 申請 personal license

如果你需要攜帶超過三個月的藥量則一定要
  • 申請 personal licence

如果你要攜帶的藥物有包含在 schedule 4 (part 2)
  • 攜帶 letter of proof 

如果你要攜帶的藥物有包含在 schedule 1
  • 在前往英國前要聯絡 Drug and Firearms Licensing Unit 




1.3 Letter of proof / Personal license 之申請


前面一點提到的 letter of proof 和 personal license 需包含的相關內容如下 : 

1.3.1 Letter of prove 

  • 姓名
  • 旅行目的地和什麼時候出發
  • 藥品名稱、用量及劑量
  • 醫生簽名

有的醫院的診斷書蓋印章會需要護照影本;
而一次要拿較多藥時,有的醫院會要求簽切結書和看電子機票。



1.3.2 Personal licence

  • Email 到 dflu.ie@homeoffice.gov.uk
  • 至少在抵達英國前 15 個工作日前申請
  • 藥品的名稱、用量及劑量
  • 醫生處方證明及註冊號

根據 Controlled drugs: personal licences 裡對於 personal licence 申請內容有更詳細的說明
    • 說明藥品中是否含有管控成分
    • 說明是否能合法從出發國帶出藥品
    • 寫明所用藥物全部細節如劑量、用量和總數量
    • 醫生處方證明及註冊號
    • 提供詳細的旅行計劃,如在英地址和訪英目的



    1.4 不推薦的作法

    有時候多多少少會看到有人採取此作法,但這種方法有可能背上刑事責任 :
    • 由朋友在台灣領藥後用郵局寄到英國
    • 請最近要來英國的人幫忙帶藥

    確診罕見疾病 - 菊池病,是什麼樣的感受?

    文長慎入,內文會有很多包括病情和其中遇到的其他崩潰實記,
    也會有各種就診照片,
    強烈推薦情緒不穩或不想看到太多負面情緒的人觀看。



    剛開始是這樣的 :


    2021 - 在英國


    5/19 - 5/28
    走在路上時突然覺得鼻子很癢、然後開始一直打噴涕,
    然後突然身體無力,勉強撐到走回家,
    但就這些症狀沒有咳嗽,應該是小感冒,自行服用感冒用藥大概一周後痊癒。



    5/31 - 6/3
    生理期,幸好並不是很嚴重。
    但可能免疫力下降吧,加上最近工作又比較累,所以 6 月開始又不舒服。



    6/1
    前幾天晚上睡覺時就覺得很乾,
    今天覺得喉嚨特別不適,狂喝水後還是覺得很乾。



    6/2 
    下午開始喉嚨痛,發燒到 38.3 左右,
    吃藥一小時後略降到 37.8,再過一段時間有退燒。



    6/3
    喉嚨兩側非常非常痛,連耳朵兩側都會痛,
    喝水吃東西全都難以下嚥,
    睡覺也會痛醒,持續微燒約 37.3 度。



    6/4
    持續喉嚨痛和微燒
     37.5 - 37.7,去 Boots 詢問藥師意見,
    對方說我能做的都做了 (感冒藥、止痛藥、蜂蜜檸檬、喉糖、多喝水多休息等等)
    可能就是要點時間吧。
    然後給我一套 covid test kit 測試,
    測試後是陰性 (但出廠是中國,據說很多人用這個測都是陰性)

    2021/03/09

    疫情下在英國工程師 on board 和工作紀錄

    首先是簽約
    公司先寄相關的文件給我,比如 contract, handbook, payroll form 等等,
    起先我想說是要印下來填寫,簽完名後再掃描給對方嗎?
    後來發現有線上 PDF 編輯器可以用,
    就填完表格和簽名再寄回去給對方。

    得說這種方式花了我不少時間在調整文字位置,
    比起手寫真的是慢很多,而且有問題的話只能打電話或寄信問。

    因為我收到 offer 到 on board 中間有遇到假日,
    所以我也有問對方那我星期一要怎麼開工,
    對方說會寄筆電給我,裡面會安裝好全部我需要的軟體,
    所以就等到筆電寄到再說囉。


    On board  

    雖然對方說筆電會在下午四點前到,
    但我還是準時上班時間起來,
    結果剛過 9 點沒多久電鈴就響了,
    可惡本來要打混到 4 點的。

    拿到包裹先拍個照,