從純文科生到軟體工程師之路「你想學程式做什麼?」一個不簡單的問題,與我的答案

作者寫給那個兩年前徬徨不安的自己、那個曾經想過轉換跑道卻躊躇不前,或是正在經歷這個轉捩點的讀者。
評論
Photo Credit:Shutterstock/達志影像
評論

本篇來自 Alice Yang 投稿,同步刊登於 Medium,INSIDE 編審後刊登。關於作者:從純文科生轉換跑道,誤打誤撞來到矽谷當起軟體工程師,上班寫的是程式碼,骨子裡仍然是無可救藥著迷於 storytelling 的浪漫主義者,不想錯過任何生命中發生的新奇事物,因此決定持續用文字,去紀錄一段段世代的呢喃。

前言:

兩年前,我結束了在哈佛教育科技的學業。兩年後,我又重回寫作崗位,多了個不一樣的職位:後端軟體工程師,座標矽谷。

從高中畢業之後就此與理科脫節,埋首於人文科學、詩集和小說的純文科生,跨足軟體工程的巨變,一切的契機源自美麗的錯誤……。

對程式語言一竅不通,卻仍有個「程式夢」

說起來慚愧,雖然自己曾洋洋灑灑地寫過程式學習相關的文章,向讀者介紹「哈佛大學最『狂』的一門課」,大談程式語言:

這堂課(CS50)所涵蓋的知識含量甚廣,課程內容包括抽象化(abstraction)、 演算法(algorithms)、資料結構(data structures)、封裝 (encapsulation)、資源管理(resource management)、資訊安全(security)、軟體工程(software engineering),以及網路開發(web development),還有各種程式語言介紹:C、Python、SQL、JavaScript、CSS、HTML,都包含在 12 週的課程內!

但是大家有所不知,當時的我壓根沒有任何物件導向(Object Oriented Programming)的基礎,也不懂網路開發有前端(front-end)、後端(back-end)之分,更別提有能力自己寫下任何一行程式碼。

但說也奇妙,在我心中一直有個「總有一天要學程式」的念頭,於是我輾轉來到了柏克萊大學的資訊學院,從麻州搬到了加州,筆記型電腦裡裝上了各式各樣的 IDE(整合開發環境,Integrated Development Environment),踏上了另一段截然不同的學習之旅。

無數次試誤後,我的經驗分享

回首兩年來的學習路,到即將展開人生第一個軟體工程師的正職工作,我總想寫下點什麼,寫給那個兩年前徬徨不安的自己、那個曾經想過轉換跑道卻躊躇不前,或是正在經歷這個轉捩點的讀者。不管是那些 “ Things I wish I would have known earlier in my life “(我希望人生中早點知道的事),還是 “ Lessons I have learned from the failure “(我從失敗中學到的教訓),那些我們共同有的掙扎、懷疑、焦慮、痛苦和迷惘,就像是通往獵人試驗的過程,很少數的人能夠在無盡的黑暗中,懷有對於出口光明的遙想,我也不例外。但這終究只是過程,在這之中我領悟到的是,唯有保持強大的信念,才能驅使自己一步步往前。

那麼,問題回到「文科背景的我,該如何踏出學程式的第一步?」網路上已有許多自學程式的文章,以及各式各樣的學習資源和線上課程,身處程式新手村的我們,究竟什麼樣的學習法最適合自己?在經歷無數次 trial and error 之後,以下是我的個人經驗與觀察:

1. Learn it the hard way:「資料結構」與「演算法」是必要之惡

數年之後,我重讀了〈十年程式自學之路〉這篇文章,文章裡提到學資料結構跟演算法的重要:

假如你真的對這行很有興趣,想要一直待在這邊而且薪水越來越高的話,你就勢必要開始補足一些「自學的人通常不會有的本科系知識」。
因為自學者通常都直接從 html, css, javascript, php, rails 等等的開始,甚至連資料結構跟演算法都沒聽過!有接觸而且實作過的更是少數。

資料結構和演算法之於程式語言,如同文法和修辭之於英文,實屬必要之惡。也許這些「魔鬼藏在細節裡」的規則太過抽象,讓許多初學者退卻──我們既不明白物件(object)、類(class)的定義;對於封裝(encapsulation)、繼承(inheritance)的概念一知半解;我更永遠也無法忘記初學時對於反轉鍊錶(reverse linked list)的疑惑,和哈希(hash)的實現原理,這些「非人類」的概念宛如被搗爛的馬鈴薯,在腦袋裡狠狠地碰撞。

然而,回首來時路,我漸漸發現:初學時期,一頭栽進資料結構和演算法的決定,對於日後實力的積累,實為不可或缺的基礎。也許是因為熬過了那段迷失在五里霧的撞牆期,在實作的階段我才能漸漸領會那些抽象虛無的資料結構,在大大小小系統設計的權衡上佔有舉足輕重的地位。

學習資源分享:相較於哈佛大學的 CS50 一口氣教授了 C、Python、SQL、JavaScript、CSS、HTML,我選擇了柏克萊大學的 CS61B 作為入門。柏克萊大學的 61 Series 課程為 CS 本科生的必修課(61A61B61C),每門課以不同語言作為學習重點:61A 學的是Python、61B 是 Java,而 61C 則是 C。

61B 最為資料結構的入門課,從最基礎的 Java 語法和物件導向語言特性出發,到各種資料結構的實現和複雜度分析,再到進階的演算法介紹,每一週都有影片、討論課、作業和 lab。兩到三週有一個專案,還有三次的考試,學習量和作業量實屬龐大,大多數的學習資源都公開在網路上,若能每週保持進度並且完成作業,那麼,在 CS 的學習路上你已成功站穩了腳步。

2. Learn it the practical way:「你想學程式做什麼?」

初學者經常被問到的第一個問題,往往是:「你想學程式來做什麼?」在〈Hello World,寫給教程式的人:print(“誰是初學者?”)〉這篇文章裡,作者用了「悲鳴」兩個字來形容初學者的心境:

「我根本不知道有哪些選項可以選擇啊!」
許多初學者並不清楚程式語言的原理、邏輯跟應用的場景。就算網路上看過很多文章,但沒有看過 demo、沒有實作體驗,其實很難光靠腦袋「想」出程式語言可以「做」什麼。對我們而言,「我可以拿程式來做什麼」是個非常抽象的問句。

固然初學者必然有學習程式的動機──不管是想轉行、想了解後再決定是否轉行、想增加第二專長、想了解大家最近流行學什麼,甚或是「模糊地覺得自己可能有興趣」;然而,這個動機只是一個學習的起心動念,面目仍然很模糊,難以具象,且很可能在認識程式的過程中被推翻。就像是考大學時想要主修某個科系,或是求職時打算嘗試某份工作一樣,沒有實際進入瞭解,都只是腦中未經驗證的「假想」。也因此,在我個人看來,「你想學程式來做什麼?」這個問題的前提,是你先對程式程式原理和網路架構有一定程度的掌握之後,才有能力進一步思考的課題。

至於逐漸瞭解之後,該如何決定下一步呢?我覺得可以從專案式學習(project based learning)的角度出發,不妨從生活中「要是有___就好了」的想法作為出發點──你想解決什麼問題?如果你可以自己打造這個產品,那會是什麼樣子?可能是個網站、app,或是個遊戲,都是讓你開始運用程式語言一點一滴刻畫自己藍圖的時刻,你可以開始理解到前端和後端到底是如何溝通、不同語言框架的適用範圍,進一步到資料庫該怎麼設計,以及各種環境的建置。

又或許你發現你想加深特定領域的知識,不管是資料科學、機器學習、人工智慧,到區塊鏈、虛擬貨幣,這個時期的學習可以效法 “ speed dating “ 的概念,短時間內廣泛的蒐羅,但只挑選真正感興趣的項目專精,並且持之以恆直到做出一個「專案」──不管是產品prototype、小程序,甚至只是每週的學習總結,你都可以從中看出學習的軌跡,並且體驗到從無到有,自己建構學習成果的過程。

學習資源分享:我個人會將「理論」和「實作」課程的管道分開,「理論」的課程大多在 Coursera 或是 edX 上找由大學開設的課程,著名的包括史丹佛大學的機器學習、普林斯頓大學的演算法 III 等。重點在於觀念的理解和底層知識的建構,打好理論的基礎之後才開始上「實作」的相關課程,像是 UdemyUdacitycodecademy 或是 Hahow(中文學習平台)上都有各式各樣的程式語言課程,這個時期的學習重點應是「求精不求快」,選擇一門感興趣的課程,並且貫徹始終,方才是細水長流之道。

3. Learn it the fun way:程式需集眾人之力

程式語言社群比我們想像的更加包容和多元,程式碼之間的交流溝通,其實是超越了各種文化背景、種族、性別的藩籬,因此在學習路上,最重要的心法是「不要害怕問問題」,並且能夠「勇於嘗試」。

程式的打造並非一人之力,因此在打穩知識基礎、做出了幾個個人專案之後,下一階段的學習目標將是「團隊合作」,究竟如何分工、一個產品如何從設計、開發、測試到上架,這些都是學校課程或是線上課程無法學習到、但在職場上不可或缺的能力。

能夠在短時間實踐,並且學習和不同人合作的場域非黑客松(hackathon)莫屬。黑客松宛如軟體工程師大會師的盛典,各方人馬無不盡全力角逐,只為打造出心目中理想的科技產品,從中激盪出的火花和對話,往往也孕育出了日後成熟的果實。

學習資源分享:黑客松往往有不同的主題,像是健康、智慧城市、區塊鏈、人工智慧、財務等等,這也是找尋志同道合夥伴的最佳場域,大家不妨可以搜尋學校或是企業舉辦的黑客松參加。另外也可以透過參加 meetup 或是工作坊等形式,從程式碼延伸出的科技社群,不止蘊藏了豐沛的技術含量,更寶貴的是與「人」的互動,我想,這也是其中的樂趣所在吧,為了編織共同的藍圖不眠不休,為了追求共同的理想日以繼夜,哪怕只是小小的科技產品,承載了創造者的夢想和智慧結晶,日後也足以撼動整個世界。

如果未來的共同語言是程式,我希望……

在被諸多專有名詞和技術框架包覆之下,回溯根源,程式的靈魂依然來自於人性。當今的企業龍頭用程式打造了龐大的科技帝國,但也間接摧毀了許多固有的傳統,程式宛如兩面刃,一面造就了新型態的服務,一面也無情的淘汰了追不上的產業。在這股科技浪潮上,我很幸運有機會能夠學習程式這樣技能,站在兩年學習的終點,和即將踏上職場起點的交叉路口,我想用「為臺灣而教」創辦人劉安婷在成大畢業典禮上的致詞來提醒自己:

這份幸運,叫做「選擇權」。選擇權讓我們徬徨,可是選擇權卻也是讓我們最幸運的地方。拿著這張很沈重的幸運,我會問自己:「我想要拿這份幸運,做什麼事情?」

是的,「我想拿程式來做什麼?」絕非只是對一個初學者的提問──這個問題也乘載了超乎你我想像的重量,關乎著善良與邪惡、理想與現實,以及責任與道德之間的拉扯。數年之後,程式也許讓世界變得更美好,也許讓世界變得更醜陋。

如果有一天,我們的共同語言是程式,我希望,字裡行間訴說的是善良,與勇敢。

我想用這句話送給未來的自己。

希望這篇文章對你有幫助,想看更多文章或分享歡迎來我的專頁/IG 逛逛。

責任編輯:Anny
核稿編輯:Mia

延伸閱讀:



助攻金融科技!訊連科技推出 FaceMe® Fintech 解決遠距投保、視訊會議、人臉辨識三大難題

因應疫情時代的視訊投保需求,以及各種遠端金融服務場景,訊連科技推出 FaceMe® Fintech 一站式解決方案,解決遠距投保、視訊會議、人臉辨識三大難題。
評論
Photo Credit:訊連科技
評論

受疫情影響,金管會於今年 6 月宣佈視訊投保暫行方案,確保壽險業者各項服務及業務不因疫情影響中斷;截至7月底止,已有不少知名金融保險業者獲准試辦遠距投保業務項目。

目前小規模試辦的結果,卻因為市面上欠缺可整合視訊會議及 eKYC(Electronic Know Your Customer)的解決方案,業者大多得透過整合多套不同服務,例如:採用 Teams、Webex 或  LINE 等工具進行視訊會議,或保險簽單需事先提供予客戶列印、簽名,又或者是透過第三方的方式錄影(如透過手機或攝影機翻拍)等,導致使用者體驗不佳。此外,這樣的做法還是仰賴保險業務員以肉眼比對投保人及身分證,仍有冒用風險。

對於未來大幅度開放遠距投保,勢必需要更成熟、高度整合的解決方案。

訊連科技推出 FaceMe® Fintech 解決方案,解決遠距投保的身份認證難題

以保險、金融應用來說,目前主流的生物辨識 eKYC 技術主要包含:人臉辨識、指紋辨識、虹膜辨識等。其中,人臉辨識在過去數年來,因為深度學習技術導入,辨識度大幅提高,加上辨識速度快、無須專用硬體(可使用裝置上的相機)即可進行遠端辨識,大大降低接觸風險,因此也在這幾年成為生物辨識技術的主流。

只不過,目前全球的人臉辨識技術大多為中國廠商,在台灣要落地應用,恐怕會有資安疑慮,無法安心採用。

Photo Credit:訊連科技/訊連科技推出人臉辨識產品 FaceMe® 並可作為一系列金融科技解決方案。

值得注意的是,過去以威力導演、PowerDVD 等軟體知名的「訊連科技」,近年來也跨足 eKYC、AI 領域,擴充人臉辨識產品,推出「FaceMe® AI 人臉辨識引擎」,提供高達 99.7% 準確度的人臉辨識服務,並於全球知名的 NIST(美國國家標準暨技術研究院)之 FRVT 人臉辨識基準測試中,於 1:1(人證比對)及 1:N(身份認證)項目排行全球第六,除了是台灣排名最佳的廠商之外,也是該項測試排除中、俄廠商的全球第一。這樣的技術,也是訊連科技針對金融保險業者的 FaceMe® Fintech 解決方案中,重要的核心之一。

辨明真偽!FaceMe® Fintech 提供整合性的金融科技解決方案

談到金融科技,除了資安、金流系統之外,在講求無遠弗屆的遠端服務時,辨明真偽更是信任基礎的第一步。因此,訊連科技的 FaceMe® Fintech 以精準辨識的技術為核心,為金融、保險應用提供一系列解決方案,包含:

  1. eKYC SDK 提供人臉辨識、身分證真偽辨識、活體辨識、人證比對等功能。
  2. 視訊會議 SDK 提供金融保險業者於公有雲或私有雲架設視訊會議、進行錄音錄影、畫面分享,業務員能透過畫面分享進行保單說明。以公有雲來說,FaceMe® Fintech 的視訊會議採用位於台灣機房的 GCP (Google Cloud Platform),即可符合資料落地的需求。

其中,視訊會議 SDK 功能完整,有諸多優勢。除了可於視訊會議過程中進行錄音錄影(符合金管會要求)、業務員能透過畫面分享進行保單說明之外,還有許多身分驗證服務,可導入包含:

  1. 身分證真偽辨識:透過 AI 辨識身分證是否為真,避免業務員肉眼誤判。此外,若有二階段認證需求,也提供聲紋比對功能。
  2. 活體辨識:避免透過相片或影片假冒身分。FaceMe® 的活體辨識可提供透過一般行動裝置之 2D 鏡頭、或是透過 3D 鏡頭(如 iPad Pro、iPhone X 等)進行活體辨識。
  3. 人證比對及核身:透過人臉辨識,比對證件照及鏡頭前的投保人是否為同一人,減少業務員肉眼誤判。
  4. OCR 光學字元辨識: 身分確認後,將證件資訊帶入保單,如姓名、身分證號、換發日期等,省去打字麻煩,加快投保速度。
Photo Credit:訊連科技/FaceMe® 可跨平台建置於 Windows、Linux、Android 與 iOS 等作業系統,亦可提供 HTTP API ,進行網銀服務串接。開發者可在各種終端設備或雲端服務中快速導入人臉辨識功能,進行身份辨識、身分驗證等多種應用。

不限智慧金融!FaceMe® 的其他廣泛應用:智慧安控、智慧健康量測

於前一陣子 IEEE 舉辦的 ICCV 電腦視覺大會中,訊連 FaceMe® 活體辨識成績為全球第三,且是排除中、俄廠商的全球第一。 FaceMe® 除了核心的跨平台軟體開發套件外,也針對安控、金融保險等應用,提供垂直整合方案。

除了上述保險應用之外, FaceMe® 也可廣泛使用於遠距開戶、 ATM 無卡交易、行動網銀身分辨識、遠距客服等服務,或是於分行內建立迎賓系統、黑名單偵測、機房金庫的門禁管理等;在疫情時代下,也提供非接觸性的健康量測功能,例如偵測是否配戴口罩,或偵測訪客額溫等。如果終究都要推行遠端,何不現在就了解 FaceMe® 各種強大的應用之處?