我是怎麼靠自學成為工程師的:懂原理比應用更重要

直到現在我才明白,就算這套語言有著完美的邏輯設計,但一台超跑還是需要厲害的車手才能發揮潛力。也許是因為我自學,不清楚我的能力到了哪裡,也許是因為騙子症候群,也許我覺得不正規的自學,感覺像是作弊。
評論
評論

原文為《How I Became a Programmer. And When I Started Calling Myself One》,作者為 Auto-acc IT 專員 Kurt Rohlandt ,Inside 獲授權編譯。

好幾個月前我就開始想寫部落格了,就像其他人一樣,我迫不及待地希望能為世界貢獻,所以我申請了一個網域,安裝了最新版的 WordPress,然後開始跟 CSS 奮鬥,想把它改造成最適合我的風格。

等到我終於準備好,面對一張擋在我和世界間的空白頁面和閃爍的游標,卻什麼都想不到。我在腦袋裡按了 F5 重新整理,接著又狂按 Ctrl + F5 ,檢查了一遍腦袋的連線,沒有問題,但還是什麼都沒出現。最後我按了 F12 開啟開發者工具,發現那裡也一片空白,只看到狀態代碼:HTTP 204 —— 無內容。

這並不是因為我懂得太少,或是我找不到有趣的例子,想要的話我也是可以信手捻來一些教學文的,我只是不知道該從哪裡開始。

我知道自己想寫一些問題的實際解法或不同觀點,同時給程式新手和老手看,但該討論什麼樣的問題呢?比較內建陣列函式和迴圈的的各項指標,看看該求效率還是易讀?簡介 MVC(Model-View-Controller)、寫 jQuery 外掛教學、列出常用的 SQL 指令,或是單純談論應用程式建構的心得文?想到這裡,我的腦袋就開始進入無限迴圈,所以我只好強制終止思考,把寫作這件事擱在一邊,回頭去處理手邊的程式碼。直到兩個月前,Medium 這個平台吸引了我的注意,才決定要從這裡開始寫作。

(Photo Credit: hobvias sudoneighm)

騙子症候群:我根本沒有資格當工程師

然後我看到了 Jeff Smith 寫的一篇文章,題目是「認識並解決 騙子症候群」(Recognizing and Dealing with Impostor Syndrome),那篇文章提到,維基百科對騙子症候群(Impostor Syndrome)的定義是:

騙子症候群是一種心理狀態,當事人通常無法將自身的成就內化。

Jeff 對此的解釋則是:

簡單來說,在某領域優秀又成功的人,有時會認為自己配不上這份工作,或任何正面的成就和獎勵。他們認為自己的成功不值一提,同時持續擔心自己無能勝任工作,雖然現實狀況根本相反。

剎那間我發現自己好像有騙子症候群,這些症狀非常眼熟。我之前從來沒聽過騙子症候群,說得更精確一點,我根本不知道除了我和辦公室角落那個超級內向的女生以外,世界上還有其他人也有這種感受。

到了這裡,先容我自我介紹一下,我在目前的公司已經待了一年,你可以稱我是領導、資深,或者主任工程師,我前一份工作做了四年,在更早之前,出於熱情和不想自己處理麻煩事的懶惰,我自學了程式。幸運的是,也有很多人跟我有相同困擾,很多使用者踴躍訂閱我寫的程式,讓我得到投資並成立了一家公司。

經過幾年,我在一個專業的小圈子裡面成了德高望重的成員,裡面的人都在自己的領域有相當的專業和權威,我透過這個圈子也經手了許多工作,其中很多根本是不可能的任務。我們也會互相幫忙解決問題或交換意見,很多新手工程師異常地尊敬我的程式碼,這讓我有點不習慣,畢竟我才剛開始有自己是專業工程師的自覺,我也不習慣從學生變成老師。這一切都提醒著我,不久之前自己還什麼都不懂。

我通常幾分鐘之內就能解決漏洞,我可以一眼看出哪裡需要修改,有時候我寫出來的解既簡單又優雅,讓我可以佩服自己好幾天。我知道自己很聰明,朋友也常在酒過三巡後開始瘋狂誇獎我:

他是天才,他的程式都是自學的!你應該看看他寫的東西。

我通常會回答:

我可能滿聰明的,但不是天才,我只不過是編寫前人發明的語言,他們才是天才,我只是照著使用說明走而已。

這全都是我的真心話,我並不是開拓了一片未知的土地,我只是跟著地圖走,你覺得我聰明,可能是因為這份地圖是用函數寫的,看起來很難懂,但它終究是一份地圖,我看著這份地圖,知道何時該抄近路、何時該橫越河流,讓這趟旅程更快、品質更好,但我還是遠遠比不上發現公園的那個人。我連寫了一段還不錯的程式都不敢居功,把功勞都歸給了設計這套語言的人。直到現在我才明白,就算這套語言有著完美的邏輯設計,但一台超跑還是需要厲害的車手才能發揮潛力。也許是因為我自學,不清楚我的能力到了哪裡,也許是因為騙子症候群,也許我覺得不正規的自學,感覺像是作弊一樣。但透過這份自白,我認為相當適合作為一系列工程師心得的起點,了解從何處開始你就成為了真正的工程師。

你可能有注意到,我盡量避免使用「開發者」這個詞,因為我個人覺得這個詞太模糊了,常常產生誤解。另外,很多文章都在探討有資訊工程學位和自學的工程師孰優孰劣,但我並不打算在這裡談論這個話題,因為對我而言,程式之美便是你永遠無法習得全部的知識,我們生存的世界、使用的工具和準則都經常在變動演進。而我認為這可能就是騙子症候群的成因之一。

最終你得抉擇,究竟是想要樣樣通樣樣鬆,把寫程式當作當作興趣,在工作上頂多就是能幫你管專案或開規格;或者是你想要專精某樣領域,時時更新該領域的最新應用,直到你專精的領域被淘汰,最後工作內容只剩下維護舊程式碼。

(Photo Credit: Jens Lelie)

框架泡沫扼殺了工程師幼苗

所以(軟體)工程師到底是什麼?工程師的定義當然就是:

寫程式的人。

但會煮飯不一定就是主廚,寫了這篇文也不會讓我變作家。一開始你就像「薛丁格的工程師」,在成為工程師之前,你是也不是工程師。

我覺得現在整個程式界正處於一種「框架泡沫」(Framework Bubble)中,許多的資源和精力都聚焦在開源和頂尖的框架上,而專精一項程式語言的使用及討論就成了沒人關注的大盲點。幸好我自學程式的年代,框架還沒有如此氾濫,我也不會看到這樣的敘述:

Ruby 是新一代的 PHP。如果你想玩玩可以用 Python,但想要認真一點你最好在 Heroku 或 AWS 用 Node.js ,NPM 適合快速開發,用 socket.io 從 Mongodb 建立 REST API  然後最好用含 Material Design 模板的 Angular app ,不要忘了把它推送到 Git 還要用上 Gulp ,否則這就是糟糕的程式,會讓你的使用者痛不欲生,而且你還會因為玷污了神聖的程式開發,遭到流放。

如果我當時看到前 5 篇搜尋結果都是這樣的內容,我大概就會早早放棄,當個無業遊民或是躺在沙發上尋找心靈啟發。

先別急著攻擊我,其實我很愛框架,因為它們可以讓小程式也能在短時間內擁有大量功能,不用重複 debug 和從頭架構,也不用檢查一堆基本問題。框架幫我們省去大把時間和成本,降低架設網站和應用程式的門檻,讓更多人能將自己的產品分享給世界,達到最有效率的成長和創新。框架也能讓初至中級的工程師開發出實用、架構嚴謹又整齊的程式,你才不會在假日接到求救電話,說新手工程師把你先前建的穩定架構破壞殆盡。

雖然降低門檻大概是框架最大的優點,卻也是最大的缺點,我覺得它會扼殺工程師的幼苗。我認為在沒有全盤了解以前,就不該使用那個框架,你應該要有能力重寫或至少重製這個框架,或者擴充、改造,甚至最重要的是 debug。框架和程式庫對正在學寫程式的人來說可能非常危險,因為你會把他們和基礎程式語言搞混。jQuery 便是常見的例子,我見過無數的人學會 jQuery 就以為自己懂 JavaScript,我自己偶爾也會把 jQuery 和 Vanilla JavaScript 弄混,都是因為我在熟悉 JavaScript 前先接觸了 jQuery。

我花了好幾年改掉這個毛病,因為我在學程式語言的語法前,先學了框架的語法,更因為我習慣了 jQuery 的功能,像是 DOM 的操作和動畫之類,而且丟臉的是,我以前也會大言不慚地說「有了 jQuery,誰還需要 JavaScript 啊?」

那個時候我應該要專心研究語法、設計模式,最重要的是要去理解物件是 JavaScript 的靈魂。我應該要學習製作物件原型,去充實重點觀念,像是「用物件導向的語言寫程式,不代表你就是用物件導向的方法寫程式,」等等。結果我都浪費時間在把按鈕弄得一團亂,做一些累贅的隱藏、滑動、彈出、旋轉動畫,把網頁搞得很花俏卻一點也不實用。

(Photo Credit: Joe Loong)

我的工程師之路始於一套會員卡系統

我一直都對電腦很在行,8 歲的時候我就已經是 Windows 的進階使用者了,我也知道自己有一天一定會開始寫程式,不過命運的捉弄讓我很晚才開始寫程式,當時我甚至有好幾年過著沒有電腦的生活,而且那時候南非這裡網路不普及,沒多少人聽過 Google,而我至今還沒在圖書館和書店看過像樣的程式相關書籍。

2008 年的時候我終於有動力和機會學程式了,當時我在一家超市當經理,那間超市在本地算大,不過也只比得上美國 Walmart 或 Target 商店的一個攤位而已。當時店內有 18 個櫃台,而我是最年輕的經理,所以麻煩事自然都落到我身上。為了一項老年人優待方案,結帳時我得用一隻鑰匙打開鍵盤,登入電腦,經過一堆複雜又不人性的操作,才能順利使用這項折扣,熟練之後我只要 30 秒就能完成以上流程。

我們店附近有 3 間養老院,所以很多老人會光顧,而我時常得在折扣櫃檯和收銀櫃台間跑上跑下。當時我壓力很大,每天工作的內容就是在樓下結帳、陪熟客長輩逛超市,期間又要不斷衝到樓上兌換折扣,我覺得自己要不是年紀輕輕就提早退休,不然就是哪天在店裡崩潰,還被拍下來上傳 YouTube。

然後我就想到了,應該要在店裡安裝一台自動折扣機,我們發優惠卡給這些退休老人,他們只要輕輕感應一下,就能自動折扣。於是我馬上 Google 了「如何寫程式」,一個禮拜後就做出了基本的程式,3 個月後店裡就成功誕生了一套老人優待系統。優待卡的消息流傳得很快,店裡的生意變得很好,年長的客人多到我們得另外買三台輪椅,讓他們行動不便或逛得太累的時候可以用。不久之後我又加入了一般會員卡功能,並將這套系統發展成了南非最早的賣場會員卡系統之一。

到這個階段,不會寫程式的人會將我視為程式達人,但儘管我確實可以寫出一套程式,卻還稱不上工程師。我的系統簡陋又粗糙,是我從網上一知半解地參考了許多語法段落拼湊而成的。我基本上不知道自己在做什麼,而且也不知道背後的原理,我選擇不去質疑背後的問題,就像那句俗話一樣:「如果它沒壞,就不要修它。」

(Photo Credit: Sai Kiran Anagani)

當寫程式變成正職:邊做邊建立觀念

沒過多久我就找到了投資人,接著當上了工程師的職位,但我竟然不是去做一些 Visual Basic 相關應用,而是被派去做網頁。我的概念作品之後雖然還是經過別人修改,但也意外發現我拙劣的 HTML 和所見即所得軟體的功力,和駐站的 ASP Classic 工程師比起來不算太差。當時 Google 真的救了我一命,兩週內我就熟悉了 HTML 和 CSS,再過了兩週我已經會了基本的 JavaScript,開始接觸 jQuery ,而且學會了 CSS box method。

一年後我已經會了 SQL、ASP Classic(VB Script)而且可以做出有管理員登入介面的,還不錯的網站。我開始用閒暇時間寫自己想要的程式、做一些教學,我開始用 canvas 做一些小遊戲,然後終於能夠不靠 Google 寫出程式或網站的 80% 。大約從此刻開始,我認為自己總算是一個工程師了,不是因為我的技術有多強,我那時連中等程度都沒有,而是因為我某種程度上可以了解(物件導向)編寫的概念和潛力。

別誤會了,我不是設計模式(Design Pattern)大師,我當時幾乎不知道它們的存在,但我就是在沒聽過「設計模式」的狀況下,做了一堆類似的東西。我會在腦袋裡面有個概念,可以擬定程式該怎麼寫,而不用真正打出一堆指令,然後再東拼西湊讓它可以勉強運作。我不只會宣告陣列,我還知道陣列是什麼、可以拿來幹嘛、要用什麼方法、這些方法有什麼效果。一旦你透過像這樣的方式理解背後的觀念,學新的程式語言就容易了 100 倍,因為你知道你該做些什麼,也知道你可以用它來做什麼。

搞定這些,剩下的就是一些語言習慣、輸入、輸出和語法了。這代表你能超越這套程式語言,不再受限,你可以建構穩定的應用程式,還有優秀的整體邏輯和設計,這些都是你在語言語法裡面找不到,而要透過一些訣竅、追求完美的心態,或者花時間獲得經驗才能學到的。這些就是我所認為,凌駕於語言或框架之上的技能,也是真正的工程師必須具備的條件。

《延伸閱讀》

想「轉行」靠寫程式吃飯嗎?一個自學程式語言幾乎將自己逼瘋的親身經歷 – 軟體工程師 Quincy Larson

為什麼工程師總是喜歡在三更半夜寫程式?

下班後,堅持自學有多難?

美國工程師的台灣夢

軟體工程師從優秀到卓越的進化之路

大神工程師教你怎麼練就「 coding 速度快、 bug 數量少」的境界

歡迎加入「Inside」Line 官方帳號,關注最新創業、科技、網路、工作訊息

好友人數

Cookie 消失?試試看全新 AI 影像內容辨識:讓用戶看的內容決定看到的廣告

Google Chrome 即將淘汰幫助廣告主的工具—— Cookie ,它的離去將再一次地影響數位廣告產業。
評論
Photo Credit:<a href="https://www.shutterstock.com/zh/image-photo/ai-artificial-intelligence-big-data-internet-1075853384" target="_blank">shutterstock</a>
評論

透過GA分析進站者發現, Safari的新客數越來越多,難道這表示 iOS 的用戶數也跟著增加了嗎?注意了,這有可能是 Apple 封鎖第三方 Cookie 帶來的影響。隨著 Google 即將淘汰 Chrome 上的 Cookie ,這個幫助廣告主記住用戶受眾的小工具,將要再一次地影響數位廣告產業。

Photo Credit:驚點股份有限公司( FreakOut Taiwan )

後 Cookie 時代的廣告受眾如何鎖定?

各大廣告平台在過去幾年不斷地透過 Cookie 以及其它方式,悄悄收集使用者的用戶數據,隨著這幾年用戶的隱私權意識抬頭, Apple 與 Google 對於藉由 Cookie 辨識用戶資料的廣告投遞方式,持有不同的態度,這也將是所有廣告主的極大挑戰。當 Cookie 不復存在,要如何辨識使用者資料?

Cookie 消失了,或許會有新的數據辨識工具來取代,但是任何試圖跟蹤受眾的方式,都難以符合大眾對於保護隱私權的期望。另一方面,也極有可能無法再通過日趨嚴格的媒體監管限制。無論如何,數位廣告不能像過去一樣,無條件地使用類似 Cookie 的追蹤方式,來達到與現在同樣的廣告效果。

後 Cookie 時代內容辨識類型的廣告鎖定方式,將成為未來具指標性的投放策略。廣告與瀏覽平台或內文主題的高相關性,不僅能顯著提高受眾的互動度,更重要的是,完全不需要收集任何個人數據。

FreakOut Taiwan 不斷嘗試更友善的廣告投遞形式, 自 2016 年進入台灣市場的原生廣告,到 2020 年末引進「 Mirrors 」 AI 影像視覺內容辨識系統,都是以網路使用者的角度出發。「 Mirrors 」不需要使用傳統的受眾興趣設定,即可針對「目標受眾在觀看的影像內容」、「品牌自身競爭對手或相關指定系列產品出現的影片」來投遞 YouTube 上的影音廣告。

Photo Credit:驚點股份有限公司( FreakOut Taiwan )

AI 人工智慧影像技術突破,推動新一代內容辨識功能

傳統的內容比對廣告皆為自然語言處理 NLP 中心,基於「純文字」的比對來顯示相關廣告,如大家很熟悉的 Google AdSense 。但是,結合新興的 AI 演算和複雜的圖像辨識,已然能夠達到「影片」的內容偵測,透過增加多個比對層和基於自然語言處理 NLP 的基準定位,可深度學習並提供更精細的辨識洞察力。

舉例來說,若想要將汽車廣告投放給對汽車有興趣的人,我們要先從可能對汽車感興趣的受眾中開始推估,並且根據過去的經驗加入不同的興趣條件,最後針對素材更進一步地測試。透過 Mirrors ,我們可以讓廣告出現在有滿足特定條件的影片內,例如:在消費者觀看的影片中,出現汽車評測報告、自家品牌或競爭對手的 LOGO 、代言人等指定條件,再依照不同廣告主設定的預算判斷是否露出廣告。

藉由這樣的影像比對方式,可以更有效地根據消費者行為觸發廣告投遞條件,而不再是現行的用戶受眾數據。人的興趣是多樣且多變的,當對汽車有興趣的用戶在完成汽車的選購後,短期內將不會再瀏覽相關資訊,轉而瀏覽其他更具時效性的內容。透過消費者當下正在觀看的影片內容,取代消費者身上被貼上的數位標籤,將更貼近消費者本身的使用行為。

Photo Credit:驚點股份有限公司( FreakOut Taiwan )

Mirrors AI 影像辨識:用消費者看的內容決定廣告

2021 年台灣數位報告指出,台灣人在各網路內容服務中,最愛「網路影片」的比例高達 97.9%,遠超過 Vlog、串流音樂、網路廣播、Podcast 。

影音廣告早已是品牌經營的趨勢:根據 DMA 2019 年台灣數位廣告量統計報告指出,台灣各類型廣告中,影音廣告以 37.2% 的成長比例大幅領先奪冠。其中 YouTube 持續蟬聯台灣最常被造訪網站第 2 名(僅次於 Google ) ,在台灣各大影音平台中的觸及率及影響力不容小覷。

2021 年 FreakOut Taiwan 已與客戶合作,進行搭載新系統的 YouTube 串流內廣告投遞,在針對品牌及產品客製化的多層鎖定策略建議下,房地產廣告的 CTR 表現高於平均,並發現「人臉」群組辨識表現為佳,其中多為財經、名嘴等名人。而美妝品牌廣告 VTR 表現優異,則以品牌「 Logo 」、「人臉」群組有最出色的表現。

本文章內容由「驚點股份有限公司( FreakOut Taiwan )」提供,經關鍵評論網媒體集團廣編企劃編審。