Overreacted

2018年,那些我所不知道的技術

2018 M12 28 • ☕️ 2 min read

大家常以為我懂很多技術。事實上,人們假設的遠比我真正懂的還要多出許多。這並非壞事,我也不是在抱怨。(少數族群的朋友們,儘管他們擁有努力得來的證書,則常受到相反的偏見。)

在這篇文章裡,我會列出一些大家以為我會,但我其實不會的程式設計相關的技術。我並不是說不需要去學習它們 — 或是其他有用但我所不知道的東西。但既然我現在並非身處弱勢,我可以誠實地談論這個議題。


為什麼我覺得這很重要?

首先,很多人對於有經驗的工程師常有一個不切實際的迷思,認為他們一定知道自己領域內的所有技術。你有看過那種列出一大堆函式庫和工具的「學習路線圖」嗎?它們很有用,但也令人望而生畏。

更驚人的是,不管你多有經驗,你依然會經歷這幾種感覺:有時你覺得自己做的還不錯,有時你覺得自己很糟糕(冒牌者症候群),但有時你也會過度自信(達克效應)。你的感受取決於你的環境、職位、個性、團隊、心理狀態、事件發生的時間等等。

經驗豐富的開發者常會坦誠的談論他們的不安用以鼓勵新人。話雖如此,但拿一個經驗老道卻仍會緊張的醫生跟一個第一次拿手術刀的學生相比,兩者的感受還是有天壤之別的!

聽到「我們都是初級開發者」這句話不僅令人沮喪,對於那些真的有知識缺口的初學者來說也顯得十分空泛。由像我這樣充滿善意的職業開發者所寫的讓人感覺美好的自白書並無法真正幫助到他們。

然而,即使是經驗十足的工程師也有許多知識上的不足。這篇文章是我的不足之處。我想藉此鼓勵所有能夠討論自己的不完美的工程師站出來分享你們的經驗。我們在分享不足之處的同時,亦不抹煞我們的價值。

是的,我們可以承認我們知識上的不足、我們的不安以及自我懷疑。與此同時,我們依然擁有我們寶貴的、日積月累才得到的專業與技術。


免責聲明說完了,以下是一些我不會或不太會的技術。

  • Unix 命令和 Bash(Unix commands and Bash) 我可以用 lscd,但其他的我都要用查的。我知道管線(piping)的概念,但我只用過幾個簡單的例子。我不知道怎麼用 xargs 去建立複雜的串鏈,或如何輸入或重新導向不同的輸出串流。我也從未正規學習怎麼使用 Bash,所以我只能寫一些非常簡單(且常出錯)的 shell 腳本。

  • 低階程式語言(Low-level languages) 我知道組合語言讓你儲存資料在記憶體中並在程式碼內跳來跳去,但僅限於此。我寫過幾行 C,也知道什麼是 pointer,但我不知道怎麼使用 malloc 或其他手動管理記憶體的技巧。我也從沒使用過 Rust。

  • 網路相關技術(Networking stack) 我知道電腦有 IP 位址以及 DNS 如何解析 hostname。我知道像是 TCP/IP 的低層協定可以確保(或許?)封包交換的安全。就這樣了 —— 我對細節不熟。

  • 容器相關技術(Containers) 我完全不知道如何用 Docker 或 Kubernetes(他們有關嗎?),我大概知道他們讓你用可靠的方式架一個獨立的虛擬機器。聽起來很酷,但我還沒使用過。

  • 無伺服器架構(Serverless) 跟容器ㄧ樣,聽起來很酷,但我也沒使用過。我不清楚這樣的架構如何改變後端的程式(如果它有)。

  • 微服務架構(Microservices) 如果我的理解是正確的話,這只是代表「許多 API endpoints 彼此相互溝通」。我不知道這個架構實際上的優缺點是什麼,因為我還沒使用過。

  • Python. 我覺得有點糟 —— 我曾經使用過 Python 幾年,但我從沒想要認真學習這個語言。它的很多特性,像是 import,是我完全不懂的。

  • Node 後端(Node backends) 我知道如何執行 Node,怎麼用 fs 之類的 API 建立工具,也會設定 Express。但我從未把 Node 跟一個資料庫連結,也不知道要怎麼寫 Node 的後端。我對很多 React 的框架也不熟悉,像是 Next。

  • 原生平台(Native platforms) 我曾經嘗試學過 Objective C 但沒有成功。我沒學過 Swift,也沒學過 Java(但我用過 C#,所以我可能可以學得起來)。

  • 演算法(Algorithms) 運氣好時,我最多就只知道 bubble sort 或 quicksort。我或許可以簡單的遍歷一個 graph,如果它跟實際應用層面的問題有關的話。我懂 O(n) 的概念,但我的理解大概就只到「不要放迴圈在別的迴圈裡」。

  • 函數程式語言(Functional languages) 除非你把 JavaScript 也算進去,否則我對傳統定義上的函數程式語言其實都很不熟。(我唯一比較熟的是 C# 跟 JavaScript,而我已經忘了大部分的 C# 了)。對我來說閱讀 LISP 類 (例如 Clojure)、 Haskell 類(例如 Elm)或 ML 類(例如 OCaml)的程式碼很困難。

  • 函數式相關詞彙(Functional terminology) 我知道 Map 跟 reduce,但我不知道 monoids 和 functors 等等其他的詞彙。我知道什麼是 monad,但也有可能是我在做夢。

  • Modern CSS. 我不會 Flexbox 或 Grid。 Floats 是我的最愛。

  • CSS Methodologies. 我會用 BEM(是 CSS 的部分,不是原本的 BEM),僅此而已。我還沒試過 OOCSS 或其他的方法。

  • SCSS / Sass. 從沒學過。

  • CORS. 我超怕看到這個!我知道需要設定一些 header,但我曾花了好幾個小時在這上面。

  • HTTPS / SSL. 從來沒有設定過它們。除了了解私鑰和公鑰的概念,我不知道它們實際是如何運作的。

  • GraphQL. 我能讀懂一個 query ,但我不知道怎麼解釋 nodes 和 edges 的概念,或什麼時候用 fragments、怎麼用分頁。

  • Sockets. 我腦中的裡解是它們讓電腦在 request 和 response 之外互相溝通,但大概就這樣了。

  • Streams. 除了 Rx Observables 之外,我沒怎麼使用過 streams。我使用過舊的 Node streams 一兩次,但總是搞砸錯誤處理的部分。

  • Electron. 從沒使用過。

  • TypeScript. 我理解類型(types)的概念,也能看懂註釋,但我從沒寫過任何 TypeScript。我嘗試過幾次,但每次問題都很多。

  • 部署和 DevOps(Deployment and devops) 我可以通過 FTP 發送一些文件或終止一些程序,但這大概就是我 devops 的極限了。

  • Graphics. 不管是 canvas、SVG、WebGL 或低階 graphics,我都很沒用。我大概知道它的概念,但我還是得從圖元(primitives)學起。

當然,這個列表可以無限延伸下去。我所不知道的東西可多著呢。


談論我們不會的東西可能是一個奇怪的、不太對勁的話題。我是在炫耀我的無知嗎?我這篇文章最主要的幾個目的如下:

  • 即使是你最崇拜的開發者也很可能不知道許多你知道的東西。

  • 不管你的程度多好,你仍會感到不安或毫無自信。

  • 雖然經驗豐富的開發者也有很多不會的東西,但他們仍擁有十分寶貴的專業與技術。

我知道我的知識缺口是哪些(至少是某些)。我可以在未來我感到好奇或需要它們的時候補強這些不足。

而這個認知並不會抹煞我的知識與經驗。有很多事情是我可以做得很好的。例如:在我需要某個技術的時候,把它學起來。

更新: 在 UI 工程的元素中,我寫了一些我懂的東西。