轉職軟體工程師,你必須經歷的三個階段(轉貼)

原文連結
https://kaochenlong.com/2019/02/08/how-to-be-a-qualified-developer/?utm_source=facebook.com&utm_medium=social&utm_campaign=190219_ppal_a1&utm_content=190417_article_kao&fbclid=IwAR2eh5yxH1Psc1TBjR3rdh3DTdYMcu46vC_lOQMiGfOUZk4v5tmzI582EWo

人人都有可能

「我不是本科生,適合寫程式嗎?」這樣的討論,是每個轉職工程師的人心中,一定曾冒出來的問題。

其實像這樣非黑即白、非敵即友、非 true 即 false 的二分法命題很容易討論,也很容易討戰,特別是文人相輕,自古皆然,誰也不想自己學的專業被批得一文不值,所以只要立場不一樣很快就能戰起來。戰起來倒也不是壞事,只是到最後可能容易淪為戰文而失焦… 啊,扯遠了。

很多學生,或是在網路上很多人會敲我,問我說「現在還適合轉職工程師嗎?會不會太晚?我適合嗎?」坦白說,這些回應都應該要「個案回答」,但成為工程師這件事情上,還是有一些通則。就透過過年這段時間寫了篇文章,來跟大家分享我觀察到的通則。

從我的觀察中,無論原來的背景為何,只要通過這三個階段,就是一個「可以在求職市場上立足的工程師」。

先分享一下我的背景:我從事資訊相關行業近 20 年,為了謀生曾經寫過 ASP、Perl、PHP、Python、Flash(ActionScript)、Objective-C…等程式語言,最後落腳在 Ruby。曾辦幾大型的技術研討會,也曾在國內、外的技術研討會當過講者。自己出過兩本跟程式相關的書,有一本還賣得不錯,應該算是有資格談談這個議題(笑)。

最近寫文章很流行破題,先破個題,這三個階段分別是:

  • 一、學習並熟悉至少一款程式語言。
  • 二、善用開發工具解決問題,完成有用的專案。
  • 三、多人協作,完成更大規模的專案。

提醒1:因為年紀大所以故事文長,不想聽故事可以直接 end 看結論。
提醒2:本文是我個人從業以來的心得,可能有偏見或是帶有業配成份,請自行參酌。

記得當時年紀小

記得我高中時候,有一門叫「工藝課」的課,因為是普通高中,所以這種對升學沒直接幫助的課常會被移去做別的事,但我真正開始接觸電腦程式正是這個工藝課。

floppy disk

那是個還有大、小片軟碟機、家裡電腦有比較大容量的硬碟就可以在同學之間秋好一陣子的時代。當時學校教的是 QBASIC,但我完全不知道這到底要幹嘛,也不知道敲打那些指令有什麼用途,所以只好巴著當時班上幾位比較厲害的同學跟他們拷貝作業,改幾個字之後交差了事(那時候不要說什麼 Stack Overflow 可以抄了,連 Google 都還沒出生咧)。因此,在高中的時候,班上那些會寫程式的同學對我來說就跟神一樣的存在。講到這裡,我突然可以理解現在其它人看到我開 editor 在寫程式的感覺了。

附帶一提,那時候覺得可以用貼紙把磁碟片旁邊的孔貼起來就能防止資料寫入這件事好酷!

是說,作業交了之後,就沒再碰電腦了。運氣不錯,高中畢業後,大學勉強有個醫學院的後段班的科系可以讀。忘了什麼原因,差不多是大三還是大四開始學了 Photoshop,後來因為這項技能,被學校電算中心找去幫忙設計海報,然後就在那邊開始學著用寫學校的校務系統,就這樣誤打誤撞闖進程式設計的領域了,這也是我第一個寫有真正使用者會用的系統(就是學校的老師跟學生啦)。

回到前面提到的「我不是本科生,適合寫程式嗎?」這個題目,我寫程式近二十年來,除了自身成長之外(經驗值 & 體重),也近距離看過不少朋友從新手變成老手,我可以跟大家說,寫程式這件事情跟是不是本科生並沒有直接的關係(其實這本身就是個假命題?)

另外,從 2009 年開始從社群開始的社群分享,到後來的校園推廣、企業內訓及開班授課,這十年下來,我看到不少從完全新手或是非資工、資管科系畢業,變成現在在業界做得很好的朋友(當然也有更多失敗的例子),我有觀察這些朋友們的「成長軌跡」,分別是這三個階段:

  • 一、學習並熟悉至少一款程式語言。
  • 二、善用開發工具解決問題,完成有用的專案。
  • 三、多人協作,完成更大規模的專案。

關於軟體工程師…

在開始討論「新手成長必要的軌跡」之前,我們先聊聊「軟體工程師」吧!所謂的軟體工程師,廣泛來說,就是在工作的時候,使用一種(多種)程式語言,撰寫電腦看得懂的指令,叫電腦幫我們工作,這樣的角色就叫軟體工程師。

很多人對工程師有很多誤解,例如:「不從小開始學程式,長大就學不會了」,或是覺得不是資訊相關科系畢業就沒辦法當軟體工程師。

工程師其實也有分領域,如果你的目標是進到 IC design house,若不是頂尖大學電機資工碩博士,我想是沒什麼機會。如果你的目標是成為大數據、人工智慧方面的專家,不具備數學、統計或演算法方面的背景知識,大概也沒什麼機會。

但如果是做出像 Dcard、活動通、Uber、honestbee…等網路服務的網站工程師,那就算不是相關科系畢業也是很有機會的。還有一些關於成為工程師的迷思,也讓我晚一點再跟大家說明!

階段一、學習並熟悉至少一款程式語言

如果你已經掌握一款程式語言,並且可以運用它來解 LeetCode easy,可以直接跳轉第二段

成為「軟體工程師」的第一步,就是學會「一款程式語言」(不然咧~)。這句話聽起來像幹話,但卻是很多新手入門的卡關點之一。很多人在學習程式的路上,一開始遇到的挫折是「不知道自己該學什麼」。

不少人說,「聽說要先知道將來要做什麼,再選擇那個領域強項的程式語言」

常聽到說「如果想要做人工智慧、機器學習,你就是要選 Python,如果要做網站開發的話,就是選…」這樣的說法。

其實,程式語言本身之間並沒有所謂的強弱,只有適不適合的差別而已。而決定「適不適合」,是決定在每款程式語言的「生態圈」。這裡指的「生態圈」有兩個面向:

  1. 用這個程式語言的人大多拿它在做些什麼事?
  2. 這個程式語言週邊的套件或函式庫大多是在做哪方面的事?

以我最熟悉的 Ruby 來舉例的話,在這個圈子裡八成以上的人拿 Ruby 都是在開發網站,而且它有許多的套件(包括框架)也都是網站開發相關的,所以用來做網站是一個很好的選擇;Python 在資料分析、統計以及機器學習方面有許多相關的套件,所以才會聽到「Python 適合用來做人工智慧、機器學習」這樣的說法。

對已經會寫程式的人來說,這自然不是什麼問題,但對於還不會寫程式的你來說,可能連「類別、繼承、迴圈、變數…」基本概念都還不熟,讓你「開始開動寫程式」這件事情的重要性,遠大於去評估該程式語言擅長什麼,挑一個讓你學習阻礙最低的程式語言,建立「計算思維(Computational Thinking)」, 才是成為軟體工程師最聰明的第一步,以下是我的建議:

  1. 身邊朋友用什麼你就學什麼:
    剛進入這廣大程式領域的新手,無助或挫折感是一定會有的,許多人會因為這樣而放棄學習。事實上你需要的,就是當遇到問題的時候,旁邊有個人可以抓著問的人。所以如果你的工程師朋友在用 PHP,你就學 PHP,在用 Python 你就學 Python,這樣做的好處是,你遇任何有問題就抓著他問。新手時期遇到的問題,通常工程師朋友都能夠秒解,這樣可大大降低學習曲線。

  2. 挑一個「自己看得懂的教材」:
    不要以為中文字你就看得懂,市面上有些(特別是翻譯書)是那種把你看得懂的中文字放在一起之後變成你看不懂的句子的中文書。但無論是書還是網路上的教材,只要教材上面教的內容你看得懂,那就跟著學。如果你英文還不錯,可以試試 CodeCademy ,這個網站上的程式語言,我推薦 Ruby 跟 Python , 這兩個程式語言語法簡潔、且在上面都有免費的課程。
    但如果英文不太行,也可試試我自己寫的「為你自己學 Ruby on Rails」,至少如果你有看不懂的地方可以留言或是來信問我(咦)

  3. 跟著大家一起學:
    如果你跟我一樣沒朋友,你可以來跟我學 Ruby(誤)。如果你人在台北,每週二晚上在台北車站附近都有 Ruby 社群活動,可以帶著你的程式問題來找我們,或是來看看工程師們平常都在做些什麼,不要害羞,這邊有許多願意協助你的人。

「那要學到什麼程度?」

我的建議是,把一個程式語言的基本念完之後(知道型別、懂得建立方法、懂什麼是 if else、知道迴圈怎麼用…),可以來試看看 https://www.codewars.com/ 最低的等級(八級)。如果玩的過關的話,就可以先不用鑽太多牛角尖,先往下一階段走,只要你還走在工程師的路上,終究是會回來學些更基礎的東西,現在先不著急。

小結:

挑選一個喜歡的程式語言(有朋友在使用、或是有好的教材&社群),然後把這個程式語言練習到能夠解 https://www.codewars.com/ 最低的等級(八級),就可以開始往下一個階段走囉!(如果不知道要學什麼,就在 Codecademy 上面學 Ruby 吧 )

階段二、善用開發工具解決問題,完成有用的專案

許多人對「寫程式」這件事情的誤解,工程師們並不是把靠自己把所有的程式碼寫出來。如果要打個比方的話,軟體工程師跟機車行修車的師傅在做的事情還滿像的。修車師傅了解各個零件的用途、應該裝在哪邊以及各自的優缺點,找到對的「工具」解決問題,軟體工程師在做的事情很螱時候也是差不多這樣。

回想一下,如果你騎的機車的輪胎沒氣了,你把機車牽到機車行,師傅一開始應該是會幫忙檢測到底是輪胎哪邊有破洞,能不能用修補的方式就處理掉,還是破損太嚴重需要換一個新的輪胎。(應該不會是一進店裡就說要拆排氣管、拆座墊,那是黑店!)

軟體工程師們的工作,第一步也是先定義出問題(issue),再來就是決定這個問題要全部自己做掉還是找現成套件來幫忙完成功能。

問題定義出來之後,我們通常會把這些問題記錄在某個系統,然後針對每個問題開一張「票(ticket)」,把這張「票」指派給某位同事負責。這個「票」可以是實體的,可能有些單位會用便利貼把它們一張一張貼在牆上:

kanban

photo by Redlink GmbH

或是有些單位會用 Trello 之類的軟體來做類似的事。不管是實體的或是虛擬的,每一張「票」,就是一項任務。當把「票」解決之後,可以把狀態改成「已完成」或「待確認」,當所有的任務都完成後,就等於是把功能做完了。

像這樣的流程是目前業界常見的開發流程,也就是工程師們每天在做的事情。

該做什麼專案?

問題是,如果你是個剛學完程式語言基礎的新手,要做什麼專案比較好?我有以下建議:

  1. 做你自己會用的專案:
    如果你是個上班族,你每天應該遇到「中午要吃什麼」、「喂,大家要訂雞排嗎」之類的問題,你就可以自己試著動手寫個「隨機午餐推薦系統」或是「下午茶揪團系統」給自己或是公司的同事使用。這樣的系統難度不會太高,而且在畫面的設計上一開始也不需要太美觀,再加上你的同事可能會給你像是「你可以加上自動計算金額或付款的功能嗎」之類的反饋,讓你不斷的加強功能的同時,也學到了「把客戶的需求轉換成系統功能」的功力。

  2. 致敬你自己也喜歡的產品:
    模仿是最好的學習。如果你完全不知道該做什麼樣的專案的話,你可以直接找一個你自己本來就很喜歡也有在用的產品,直接進行一個復刻的動作。在復刻的過程一定會一直碰壁,不過學習技術就是這樣的,在不斷的碰壁的過程中,最後把牆給撞破,學會更厲害、更成熟的技術。這麼做的好處,也可讓自己可以做出更貼近業界產品,而不是躲在洞穴裡自己練功,還以為外面還在撥接的時代。

階段三、多人協作,完成更大規模的專案

當你已經學會了一個程式語言,也用這個程式語言做了一些有人在用的作品,那你離「合格的工程師」可能就沒有多遠的距離了。

在這個狀態,你可以再往這三個方向再做加強:

  1. 多人協作:
    當你一個人寫程式、且未來也只有你一個人會維護這個程式的時候,那麼,你要怎麼放置你的檔案、怎麼樣拆解模組,那是你個人的選擇,但,一個合格的工程師,不會是「只能一個人工作」,而是能夠與別人一起協作。這個時候你需要的就是學會版本控制(git)以及了解更多的模式(pattern)。

  2. 了解商業需求:
    在一個產品團隊當中,規劃「產品功能」不會單純只是 PM 的事情,如果放棄了這個技能,就是把自己更往「碼農」的地方推。將自己訓練成「能夠跟產品 owner 溝通商業目標」,並試著把「商業價值」轉為「功能」,除了讓自己可以保留彈性,若不想要一輩子走工程師,可以轉 FAE, PM,甚至也是將來要走到技術管理職,所必備的技能之一。

  3. 專案管理:
    專案管理不是 PM 專屬的技能,身為一個好的工程師,專案管理是延續上一個技能「了解商業需求」;在了解商業需求後,如何將大功能拆解成數個小功能,並且做做工持的估算時,考慮到維護性、彈性。

要怎麼練習?

答案很簡單,你可能也聽到不想聽了,就是「做,就對了」。挑一個自己有興趣的主題、問身邊有沒有人有想法想做網站,如果真的什麼想法都沒有,你也可以試試我們公司新人內部教育訓練的教材。

簡單的用一句話講完上面三點的話,就是:

把從「商業需求」來的「功能」,透過「多人協作」,在「估計好的工時」完成「程式碼」,並思考到「維護性」以及「彈性」。

對我來說,如果你能做到以上的事情,就是一個「合格」的工程師了。

結論

其實寫這篇文章,是很容易有爭議的。爭議的點可能有:

  1. 什麼是「合格」?
    你的合格不是我的合格。對有些人來說,必須要了解某方面的知識了解到非常透徹,別人怎麼問都問不倒,那麼,才叫做合格。也有些人覺得,先不思考未來會發生什麼事情,只要能夠運用、只要能夠交付商業價值,就是合格。
    對我來說,我心目中的「合格」是市場導向的,如果要用薪資來量化的話,大概就是「能夠在台北找到月薪 35~40K 以上工作的工程師」,就算是一個合格的工程師。

  2. 階段二完成已經可以找工作,為何還需要階段三?
    其實,大部分所謂「本科生」大學畢業,不一定有經歷過「多人協作專案」這回事。你也許會好奇不是本科生畢業都有所謂的「畢業專題」嗎?那個不是好幾個人一起做的嗎?

    這個嘛…,我們也都當過大學生,你有真的參與過就會知道,其實做專題的人就是那少數幾個人,這跟業界所謂的「多人協作」還有一段距離。

所以,該選哪一條路開始?

其實軟體工程師也分很多種類,有寫手機應用程式的,有管系統的,有負責資料庫的,有負責演算法的。如果你是非本科入門,我建議走「前/後端工程師」,也就是俗稱的「web 工程師」。

最近大數據、人工智慧當道,新聞媒體、報章雜誌們爭先報導有多火紅、職缺數量多少、薪水多高…,這些都是事實,但,他們都只缺「有經驗的人」。尤其以人工智慧、機器學習來說,這個領域特別不缺新手,而且這個背後所需的技術門檻相對的高。以目前大部分的網路公司來看,Web 以及 App 方面工程師所需要的數量遠多於人工智慧工程師,在數量稀少、競爭高的情況下,非本科入行或沒有底子的人很難直接跨到人工智慧的領域。

相對的,Web 工程師的需求量每年都非常的穩定,且從最新手入門 35~40K 的職缺、到在台灣年薪 200 萬以上的工作都有。

「網站不就是用 dreamweaver 拉一拉、點一點就能做出來的東西嗎?」那是遠古時代的事情,現在你常使用的網站,例如:Gmail、Facebook、Instagram 這些網站,都是軟體工程師撰寫出來的「軟體」, 跟以前所謂的「Dreamweaver 拉一拉」就能出來的網站,差距大概就是狗跟熱狗的差距。

選擇 Web 工程師除了職缺多以及相對的容易入門外,「國際移動能力」也是個很大的優點。「國際移動能力」的意思是指這個技能,無論是在台灣、日本還是美國,基本上只要是開發網站,雖然每間公司用的技能也許不太一樣,但的共通性是很高的。

舉個極端一點的例子,以一個行銷或是業務人員來說,通常要真正創造產值、大概要一個月以上,甚至半年。但對一個 Web 工程師來說,上班的第一天就有產出並不是天方夜譚。正常來說,新人到部後一到兩個禮拜熟悉公司的環境與流程,一個月內對公司專案有貢獻是很正常的。因此,當這職業有這項特色後,就容易聘請「語言不精通,但技術很好的外國人」,這也是為什麼許多寫 Web 的人,非常容易出國工作的原因。

寫了這麼多,最後簡單的幾點結論:

  1. 對於新手來說,不要花太多時間在「評估該學什麼比較好」上面,直接動手寫看看。
  2. 試著找個專案來練習,只有實際進行專案開發,才會知道會在哪邊撞到牆。
  3. 參與社群,看看其它業界的朋友都在做些什麼事。
  4. 對新手來說,Web 工程師可能會是個最容易上手、風險相對較低的選擇。

共勉之!

Posted by 高見龍 Feb 8th, 2019 9:00 pm  diary

發佈留言