深藏若虛

對國中生介紹程式設計師這個職業

Introduce The Programmer for Students of Junior High

這篇文章是前陣子受到擔任中學教師的朋友邀稿,寫給國中生看的職業專欄。嘗試在有限的篇幅以及制式模板下,盡量以國中生看得懂的描述去介紹這個行業,雖然難免還是會混進許多專有名詞,但朋友說近來因為資訊科技普及,許多學生多少會把這個行業想得太簡單,留點專有名詞,至少讓這些學生知道這行沒有想像中的簡單,好吧,希望不會讓這些小孩一看到這篇文章就直接拿去墊便當了。 XDrz

既然都寫完了,也就順便發佈到部落格,希望能給對資訊圈有興趣的朋友,簡單了解程式設計圈的產品、專案大概是怎麼劃分、又大概分哪些職責。因為我也沒有真正踏進業界,所以或許有些見解偏離實際狀況,在這邊還請讀者多多見諒。願意幫忙糾正以及想知道其他人給予建議的朋友,可以訪問這篇Google 文件。最後感謝 freetsubasaiblis17、michaelnity、tjjh89017xatier 在這篇文章編寫時,提供建議與修正。

本篇文章授權台南慈中國中部輔導室使用,並得以不經同意直接修改、發佈在學校的生涯發展專欄中。

前言

隨著智慧型手機普及,資訊科技從庶民化再次突破,跨越了年齡,很直接的走進老少青壯的世界裡,各種琳瑯滿目的手機應用程式融入了我們的生活,各類遊戲也成為學生裡聊不完的話題。

這些程式背後都是有一群程式設計師進行編寫的,這是個很常聽到,但想去了解才發現被雲霧所包圍的職業。太多形象來自於電影中快速敲打鍵盤,瞬間入侵電腦的駭客,或是動漫畫裡厚重眼鏡盯著電腦的人物。到底程式設計師是一個怎樣的職業?喜歡玩電腦是否就代表適合成為一個程式設計師?我想這也是現代青少年心中免不了的疑惑。

簡介(定義)

程式設計師(又稱程式工程師、軟體工程師、開發人員等),其職責主要在於編寫軟體,軟體的定義很廣泛,舉凡在資訊領域,和硬體電路設計、製造無關的,都能算是軟體的範疇。一般人比較常聽到的軟體程式通常是高階應用的部分,像是指直接運行在作業系統(Windows, macOS, Linux, Android, iOS)的應用程式,像是 Office Word
、遊戲軟體、手機 App 等;或是透過瀏覽器((IE、Chrome、Safari)瀏覽的網站;另外作業系統本身以及與其相關的工具程式,也是軟體一部分,其中當然也包括讓硬體與作業系統溝通的驅動程式等等。除了軟體的編寫外,伺服器維運、資訊硬體設備管理通常也會是程式設計師的工作範圍。

雖然程式設計師在台灣薪水,相較於其他職業高,且有可能在家工作或是有彈性的工作空間。但是,工時也是比其他職業還要長,甚至需要隨呼隨到(On Call),如果自已負責的程式、軟體發生重大錯誤,加班到天亮或是半夜被叫醒,也都是很正常的事情。雖然在電影中很常看到駭客或是程式設計師以神乎其技的方式達成任務,但那通常都是需要數十年的累積,且以在旁人看起來孤獨、枯燥的方式去自我學習才能趨近這種功力。

在台灣的就職市場,常因為程式設計很難單純透過視覺展示其成果與背後努力的多寡,導致工作成果被認為廉價或是簡單。與和其他職業溝通也很有著難以跨越的鴻溝,很難和外人分享自己的成果與喜悅。加上時間多用在進修技術上,所以交友也多局限於資訊圈中,

特質

  1. 充滿好奇與求知慾
  2. 樂於分享知識、參與社群(Community)
  3. 真心熱愛寫程式
  4. 專業主義(Profesionalism)
  5. 謙虛,永遠知道自己所學的還只是冰山一角
  6. 不被既有框架束縛
  7. 追求品質
  8. 駭客文化(Hacker Culture)
  9. 自造文化(Maker Culture)
  10. 開放文化(Open Culture)

工作內容

因為軟體的範疇很廣,所以工作內容也很多元,但觀念上都是以程式設計理論為基礎,只是使用的程式語言(programming language)與框架(framework)不同而已。若要簡單區分,通常會以平台或領域的不同作為劃分:

  1. 桌面程式:平時電腦、筆電使用的軟體就是桌面軟體,例如 Microsoft Office。
  2. 手機程式:在手機上的各個 App,就是手機程式。
  3. 網頁程式:透過瀏覽器上網看到的網站,都是網頁程式。
  4. 系統程式:作業系統、驅動程式、工具鏈程式。

另外每項軟體專案的開發,可能又會細分為不同的職責:

一、規劃
主要負責根據軟體需求來去定主要使用的技術、設計系統的主體框架,並負責指導其他程式設計師進行程式碼的開發工作。負責這項職責的通常稱為系統架構師(System Architect)和系統分析師(System Analyst)。

二、開發
程式開發的主力,通常所稱的程式設計師就是泛指負責這項職責的人員,通常稱為開發者(Developer)。開發者根據架構師訂定的系統架構與專案經理(PM)提出的時程規劃和整理好的客戶需求,去開發程式。除了熟悉規格所要求使用的工具——程式語言與框架外,對資訊科學相關的基礎理論也要有所了解,尤其是計算機概論、計算機結構、資料結構、演算法、網路概論等,如此才能夠針對需求做程式設計、並編寫出有效率且少有錯誤的程式。另外設計模式、物件導向、軟體工程等知識,則會增進開發者在程式編寫上的品質與可維護性。

三、測試、品質控管
一套軟體從開發完成到交予使用者前,都需要經過測試,確保程式邏輯正常、軟體的功能有如預期,且不容易發生意料之外的錯誤,進而造成程式停止運作。這邊會特別指有能力根據軟體功能需求去設計一套測試流程的人員,而非遵從流程重複機械性動作去測試一次又一次的勞力。另外測試也分為數個階段,從最單純的驗證程式模組單一功能性的單元測試、到程式組件整合後的整合測試,再來是確認軟體是否符合需求和預期效能的系統測試,以及為了檢驗軟體原有功能在修改後是否保持一致的回歸測試等。負責這項職責的人員通常稱為品質確保(Quality Control,簡稱QC),但近年來開發者通常也要自備簡單的測試能力,尤其是單元測試的設計與編寫自動化測試程式的職責。

四、維運
現代的軟體、程式幾乎很難離開網路,舉凡網路服務(線上購物、部落格、Facebook)、雲端軟體(像是 Google Docs、Dropbox)、線上遊戲、可以課金或是和其他人簡單互動的手遊皆是如此,而除了使用者所使用的軟體外,這背後都需要有程式在伺服器接收資訊、運算,並回傳資訊給使用者的軟體。程式除了經由上述四項職責共同生產,建置能讓程式正常運作的環境,則是在正式營運前必須通過的最後一道關卡。其中要考慮的事情很多,包括該程式所相依的其他程式是否已經安裝、版本是否與開發使用的相同、現有的運算資源是否能夠撐起多少人同時訪問(簡單的比喻就是,這款線上遊戲能夠讓多少人同時上線)、能不能簡單快速的將程式部署,且行為模式ㄧ樣等等,這些與維護和營運相關的職責就簡稱維運(Operations,簡稱Ops)。

五、資訊安全
程式在編寫時,很容易因為開發者的疏忽,或是對該技術的不了解,進而產生漏洞(vulnerabilities)。這些漏洞或許不會造成軟體使用上的困擾或是錯誤,程式照樣能照使用者所預期的進行,但這些漏洞卻會被有心人士利用,成為入侵或破壞的管道。最近很猖狂的勒索病毒 Wanna Cry 就是利用 Windows 作業系統的漏洞進行入侵、感染、並破壞,最後勒索要求還原的贖金。利用這些漏造成危害的人,稱為黑帽駭客(Black Hat)、破壞者(Cracker),相對的,ㄧ樣會去探索軟體是否有漏洞,但是會通報作者或是協助修補的人,則稱為白帽駭客(White Hat)、駭客(Hacker),也就是主要負責資訊安全職責的人員。這部分是另一個專業,也是台灣資訊社群近來正積極投入的領域之一。

不管程式設計師事負責哪項職責,主要都是從開發者為基礎去延伸的,且由於資訊科技快速的,除了理論上的進步,技術的實作更是推陳出新,各種框架後浪推前浪,如果程式設計師停下學習的腳步,很容易就會被潮流給淘汰。除了原有理論的必須不斷溫故知新外,對技術的掌握更是不能懈怠,也不能故步自封的單純守著自己得職責。像近年由於軟體工程的進步,興起一個名詞稱為 DevOps,主要是將開發、測試、維運串起來,透過自動化「軟體交付」和「架構變更」的流程,來使得構建、測試、發布軟體能夠更加地快捷、頻繁和可靠。也顯示出近年程式設計師不再只單純負責一項職責,對其他職責也必須有所了涉獵、甚至參與。

上述只是針對職責去闡述工作內容,但要更了解程式設計師,則必須了解其日常生活。由於是靠資訊吃飯的,程式設計師在工作上也幾乎是整天看著電腦,長時間坐在電腦前思考、編寫程式只能算是家常便飯,更甚至會為了某項問題加班甚至通宵。若不是有「想把問題解決不然不罷休」的特質,是很難在這行堅持著,事實上在外行看來覺得枯燥的行為下,對程式設計師而言卻像解謎一樣有趣,儘管樂趣難向外行所言,但是一但把問題解決時的成就感就像是觸碰到世界真理一樣,令人雀躍且滿足。每位程式設計師的心裡頭,都有一個駭客的靈魂,熱衷解決問題,突破限制,並享受電腦按照自己指令按部就班進行的成就感。

待遇

程式設計師的初步待遇依照地區與資歷有所不同,初級程式設計師(Junior)約為28K到50K,資深程式設計師(Senior)約33K到80K,中南部大概都在待遇比較低的區間,北部則是在待遇比較高的區間,尤其是雙北市和中南部的待遇差異甚大。也因為北部職缺多且待遇較好,多數程式設計師都會前往北部尋找工作。

傳統產業公司的資訊部分對待程式設計師與其他職業差不多。但若是在新創公司或是純軟公司裡,程式設計師通常會得到一個比較好的開發環境,像是公司配給的電腦與週邊設備、提供書籍預算添購所需書籍,有些甚至會提供零食、飲料或是每週一次的下午茶時間,為的就是讓急需專注力的程式設計師能夠心無旁騖地投入到工作中。

延伸閱讀

這邊提供一些書單,讓有興趣的朋友可以透過這些讀來了解這個行業與其文化。

  1. 賀元著(1995),《資訊遊俠列傳》,臺北市:資訊人文化
  2. 黃志賢等著(1995),《我的電腦探索》,臺北市:資訊人文化
  3. Daniel Hillis著,林遠志,陳振男譯,《電腦如何思考(The Pattern on The Stone)》,臺北市:天下文化
  4. Frederick P. Brooks, Jr.著,錢一一譯(2004),《人月神話:軟體專案管理之道》,臺北市:經濟經潮社
  5. Paul Graham著,莊友欣、莊惠淳譯(2006),《駭客與畫家》,臺北市:碁峰資訊
  6. Dave Hoover, Adewale Oshineye著,莊弘祥譯(2011),《學徒模式:優秀軟體開發者的養成之路》,臺北市:碁峰資訊
  7. Steven Levy著,Jedi, Pluto譯(2012),《黑客列傳:電腦革命俠客誌(25週年紀念版)》,臺北市:碁峰資訊
  8. Robert C. Martin著,陳錦輝譯(2013),《無瑕的程式碼 番外篇:專業程式設計師的生存之道》,臺北市:博碩文化
  9. 夏海公司著,志麻、蔡長弦譯(2011),《奮鬥吧!系統工程師》,臺北市:台灣角川

General