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

作者寫給那個兩年前徬徨不安的自己、那個曾經想過轉換跑道卻躊躇不前,或是正在經歷這個轉捩點的讀者。
評論
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

延伸閱讀:



疫情竟使童婚比例暴增?2023 年前將新增 400 萬女童被迫成婚

全球有無數女童正在面臨貧窮、家暴、性別暴力、失學的困境,在動盪不安的 Covid-19 威脅下,女童遭受的生命危機更勝以往,而你我都不該漠視。立即加入世界展望會的資助兒童計劃,不再讓悲劇發生。
評論
Photo Credit:世界展望會
評論

在新冠疫情、武裝衝突的影響下,阿富汗女性與兒童正面臨重大威脅,不僅人身自由、教育、工作等權利備受衝擊,近期更傳出 12 歲女童被強擄配婚給軍人的消息,使當地長期存在的「童婚」問題更加嚴重。事實上,不只是阿富汗,全世界仍有無數女童深陷在不安與恐懼中,面臨童婚、童工、貧窮,以及女性割禮等殘酷傳統文化等挑戰,這一關又一關的生存考驗,只因為她們是女生。

女童困境恐怕比你想像的嚴重——關於性別暴力、童婚

根據聯合國統計,每年有 1,200 萬未成年女童結婚,她們大多是因為民間習俗或經濟弱勢而被迫成婚,婚姻不僅逼迫這些女童放棄學業,其遭受家暴的風險也將大增,甚至被迫從事性行為,使得尚未發育完全的身體備受負擔;許多未成年少女因為懷孕或分娩併發症死亡,嬰兒胎死腹中或夭折的機率也更高。

來自緬甸的 17 歲少女荷拉(Hla)就曾是性別暴力與未成年婚姻的受害者。在她12歲時,一場重病帶走了她的母親,而酒精成癮的父親根本顧不了這些孩子,因此荷拉被迫離家、在街上討生活。為了尋求避風港,荷拉甚至嫁給了大她 15 歲的男子,並在 14 歲成為一名母親,但生下孩子沒多久後,丈夫便另尋新歡,留下荷拉和孩子相依為命。無助的荷拉為了不讓孩子跟著吃苦,只能忍著思念的痛苦,把孩子送到安置機構。

Photo Credit:世界展望會/荷拉小時候常跟著爸媽到各個城市的慶典或嘉年華活動兜售玩具,並以此維生。然而非常微薄的收入,根本無法支撐荷拉與 13 個兄弟姊妹的生活。

幸好在荷拉最低潮的時刻,遇上了世界展望會。在世界展望會的協助下,除了支持荷拉重建身心健康,也提供她職業訓練的機會,培養一技之長。僅管有些髮廊仍因荷拉的經歷而不願接受她,但在世界展望會的引薦下,現在的荷拉已找到一份穩定的髮廊實習工作,每月都能賺取 20 美元的薪水,並和同事們住在一起、彼此照顧。從街頭遊童到髮型設計師,荷拉因為世界展望會出現在她的生命中,而有了希望。

Photo Credit:世界展望會/荷拉說:「我住在街頭時,常常受到男性的輕蔑和不尊重。即使我根本沒有做錯事,也常常得躲避警察取締,生活充滿恐懼和不安。很感謝世界展望會的幫助和支持,我才能把自己的人生拉回正軌,創造更好的未來。」

女童困境恐怕比你想像的嚴重——關於失學、文盲、童工

荷拉的故事絕不是少數案例。事實上,許多女童不只遭受可怕的性別暴力,也因為貧窮或環境動盪,而被迫放棄受教育的權利,成為失學的童工,甚至不得不從事對身心發展有害的勞動工作。根據聯合國資料,全球童工人數在疫情的影響下,20 年來首次增加至 1.6 億;而全球約 7 億人口的文盲當中,女性就佔了 2/3。困在社會底層的弱勢女童,身心備受煎熬,急需你我關注。

印度女孩珊蜜拉,便是弱勢女童的縮影之一,遭遇令人心疼。珊蜜拉(化名)原本是個熱愛上學的女孩,14 歲時由於家中經濟無法負擔她繼續升學,因此被送到孟買與姊妹們一起工作,幫助家中生計。當時,珊蜜拉請妹夫幫她找工作,沒想到卻是噩夢的開始,妹夫將她送到人口販子手上,珊蜜拉被推入妓院工作,並經歷長達三個月地獄般的生活。

「只有我工作了才會有飯吃。如果我不工作,妓院老闆、甚至是客人就會拿皮帶打我。我被迫喝酒、他們會拿菸燙我的手。我一直在哭,求他們放我回家。」後來珊蜜拉得知自己陷入險境是受親人所害,整顆心都碎了。

Photo Credit:世界展望會/珊蜜拉好不容易說出那段記憶:「我經歷的那些,希望沒有其他任何女性需要經歷。我承受了非常多的痛苦,那是一段很難熬的時期。白天會有 12 到 14 個男人,晚上則會有 15 到 16 個。一整天工作完後,所有的女孩會被送到荒郊野外中的一棟建築物裡休息,整間房間裡只有一扇窗戶。因為太偏遠,即便我們大吼著求救,也沒有任何人會聽到。」

終於有一天,珊蜜拉和其他女孩們的工作場所遇到警察臨檢,珊蜜拉便趕緊抓住機會向警方求救。成功獲救的同時,同樣在場的妹夫和妓院老闆也遭到警方逮捕。接著,珊蜜拉花了數個月的時間輾轉換了好幾間避難所,最後終於回到家人身邊。

在家人的陪伴以及世界展望會的支持下,珊蜜拉終於踏上復原之路。由於人口販運的受害者往往受到許多暴力與虐待而留下嚴重陰影,這段遭遇遂成為她們心中無法說出口的痛,且大多數受害者因地處偏遠、經濟貧困,或是覺得丟臉、自責等心理因素,難以取得身心重建的專業支持。因此,世界展望會提供包括創傷後症候群、焦慮、憂鬱、恐慌、斯德哥爾摩症候群、藥物濫用等醫療與心理照護,讓更多像珊蜜拉一樣遭遇創傷的女童,得以重建生命。

Photo Credit:世界展望會/珊蜜拉現在加入了印度世界展望會的受害者支持團體,踏上了復原之路。

你有力量打破女童困境:資助 1,000名 女童,扭轉 1,000+ 個家庭命運

在 Covid-19 的疫情衝擊下,脆弱國家的資源更加緊縮,這也讓兒童面臨前所未有的考驗。世界展望會的分析報告指出,2020 年 3 月全球疫情爆發後,與 2019 年相比,童婚案例在許多社區暴增了一倍以上;而童婚的增幅速度,更攀升到25年來最高,若無法改善,預估 2030 年前全球將再增加 1000 萬名兒童新娘。

對於女童而言,貧窮、家暴、性別暴力、失學等問題是無法分割的,這些威脅往往彼此連動、加乘,為女童的生命帶來嚴重打擊。但從上述的實際案例可以發現,受困女童的命運並非不能扭轉,只要世界上某個角落的某一個人願意付出行動,女童的生命就有希望曙光。

世界展望會推動「資助 1000 個女童 挺聲而進 願景無懼」行動,期待在 10 月 11 日女童日前,能為 1000 個女童找到資助人,每個月 700 元,就能翻轉一個女童的生命,為她提供安穩的生存環境與受教權,並將這份改變延伸至女童的家庭與周遭社區,帶來正向影響力。讓我們一起阻止女童悲劇再次發生,現在,就加入改變世界的行列!