2018年9月27日 星期四

如何成為更好的軟體工程師

六月份的時候,被 G 社找去面試,雖然最後沒有上,不過在準備的過程中,以及面試後的自我反省,了解到自己還有很多可以進步的地方,於是踏上了尋找工作的旅程。在之後又持續面試了幾間公司,雖然到目前為止都還沒獲得新工作,不過每次的失敗,都給了我一些對於工作的想法與啟發,想在這篇文章記錄下來,未來可以回來複習一下。

我覺得我一直以來工作算蠻順遂的,第一份工作就有機會進入世界級的外商公司上班,開了眼界;其次我工作很認拼,也都碰到不錯的老闆,升遷也算蠻快的。只是我一直不知道,我到底是怎麼表現好,因此受到賞識,進而維持這些優點,維持這個好的狀態。一直到我加入了一間不一樣的公司,讓我不得不修改原本的做事方式,遺忘了原本的做事方式,一些能力也漸漸一起遺忘了,最後連工作的熱情也漸漸遺忘了。

透過這些面試,讓我重新檢視自己如何工作,把一些能力與感覺抓回來,也更確立了未來的工作態度 -- 持續保持熱情。


一、好的工程師能夠提出 Edge case 驗證想法

Google 主要是面試技術題,在面試前我寫了 Leetcode Easy & Medium 的考題。
我最後幾年,都在做系統架構設計,因此對於這些演算法相對生疏,因為很久沒寫比較深的程式了,一開始寫的時候,平均一題要寫一個小時。

在解了演算法的這些題目之後,我忽然了解到,演算法設計和系統架構設計的相同之處,都是在於「目標情境」的「邊界條件」的處理,能夠將這些邊界條件處理的越好,就是越好的方法,最後的結果才會有好的「品質」。

「目標情境」指的是我們真正要解決的問題。因此邊界條件也不是無窮亂舉,而必須要屬於這個問題的範圍內。

「品質」意味著沒有錯誤,也就是運算的結果都是對的;在正確性最優先的前提下,我們才選擇複雜度、運算時間、運算空間較優的方法。也就是說,如果結果不正確,那麼演算法跑多快都沒有意義。

「邊界條件」指的是演算法的限制,或是系統的限制。例如要設計一個除法的演算法,那麼其中一個邊界條件就是整數最小值除以 -1 的情況是多少?如果設計一個批次處理的系統,那麼最極端應用案例是什麼?

二、好的工程師會先提出能正確解決問題的方法,之後再優化他

由第一點可以知道,「正確」是最重要的,也正代表著「品質」。
因此我們首先必須得到一個「正確」的參考設計,即使這不是最優的解法,例如時間複雜度是 O(n^2)。
接著就是腦力激盪的時候了,是否可以改善現有的方法,例如變成 O(nlogn),而且適用所有情境?又或是的確存在一個比較快速的方法,但是只有當特定條件滿足時,我們才可以使用這個方法?
之所以特別把這個列成一點,是因為重要的是分析問題,而不是找到捷徑找到所謂「正確」的答案。即使用感覺的得到一個很好的解法,但沒有好的分析問題能力,也無法證明這個方法是正確的,這麼一來結果還是不確定的,品質就是不穩定的。
只要學會分析,再搭配一些創意,永遠可以得到更好的解法。

三、學會和別人討論,並嘗試兩個人合作找到更好的解法

每個人的思考邏輯都不一樣,因此每個人切入角度不同,發展出來的長處也都不同。
若是一個人想解法,可能需要很多時間才能找到比較好的答案。
因此與自己觀點不同的人討論,可以幫助自己避開盲點;不同思路的碰撞,更容易激發出更好的方法。
與人討論,如果只是要證明自己的想法是對的,除了傷害彼此感情,而且永遠只會得到「自己永遠是對的」的結論。

四、好的工程師重視基礎能力

工作得越久,一些高級工具用得越多,基礎能力用得越少也忘得越多。
但是要用上述的方式找到更好的解法,最考驗的還是基礎能力,包含一些基礎知識、問題分析能力、溝通能力等。平常工作的時候,也可以多找一些機會練習溫習。

五、好的工程師能夠提前反應風險,對專案做良好的預估

在一個讓工程師發揮的環境裡面,每個人都是專案的擁有者。
專案一定是有挑戰性的,因此我們要針對專案做風險控管,才能避開陷阱、準時交件。
因此在接案的時候,無論是多大多重要的案子,如果能夠提早發現風險並勇敢地提出,也就能越早準備需要的資源,最後也會有比較好的結果。
若是硬吃案子最後開天窗,那麼有可能也是離開公司的那一天。

六、只有對自己正在做的事情保有熱情,才能持續地精進自己的技術

在面試的時候,我發現自己還有很多能力不足的地方。老實說,一開始面試我也只是想找一份穩定一點、福利好一點、薪水高一點的工作。但是越面試到後面,我發現只有持續不斷的去做去挑戰,我的技術能力才有辦法到達下一個層次。

於是我開始回顧過往碰到的許多神人同事,他們是如何工作的?

我發現他們除了上班之外,下班也不斷在做一些自己的專案。與其說他們很認真,下班不斷的在學習,不如說他們是因為對他們做的事情非常有熱情,因此不斷地投入鑽研。唯有找到自己有熱情的事情並且去做,而技術就不自覺的在執行過程中累積提升了。



我今年面試的心得大致就這樣了,對於自己的能力有失而復得的機會是很寶貴的,我從中體會了很多,學習了很多,也感覺到自己的一次蛻變。今後無論是否是在如 Google 這樣的公司工作,也都希望自己能夠謹記上面的要點,希望未來自己能夠成為更合格的工程師。

2018年4月12日 星期四

使用 OpenSSL 建立自己的 CA

最近有要自建 Self-signed CA,發現了這個好的教學。
OpenSSL Certificate Authority

特別在網誌推薦。