一、怎麼問「具體」的問題、怎麼聽懂「模糊」的問題
在體制內學校就學的時候,並不是所有的體制內老師都鼓勵大家問問題,或者換句話說,並不是每個人都願意問問題,但如果萬一你有一個問題要在半小時內排除呢?

以上所描述的就是軟體工程師在工作時經常遇到的問題,如果你是個Junior工程師,經驗還不老道,那麼請教前輩就會是必經之路,而讓排除問題的時間減少,那麼就得「精確的描述問題」,相信我,這是最重要的事情。
而怎麼聽懂模糊的問題,這也很重要,因爲你一旦擁有了經驗,別人找你問問題是遲早的事,但你得知道,並不是每個資淺的工程師都知道如何描述「具體」的問題,甚至問問題的人可能表達能力有點問題。所以如何聽懂別人的問題,也是最重要的事情。
軟體工程師的工作時間是很重要的,解決問題的效率越快,代表你的價值越高。
二、學習能力
要我精確的說,學習能力這四個字的詮釋,我會說是:「如何迅速掌握一門知識的能力」。
那麼你會用什麼方式掌握呢?或者你會怎麼去找一門知識呢?
有的人會去找教學影片來看,也有的人去找最根源的文件來看,要我說,我是覺得都可以,但對我來說,是先後順序的問題。
嗯?為什麼我這麼說?
如果你寫過碩士論文,那麼你一定知道理論基礎是很重要的事情,理論清楚描述得越清晰,代表你越知道怎麼用這個理論去研究你想研究的問題,同樣的道理,回到如何迅速的掌握一門知識,你必須先紀錄最精確的定義(很像碩士時期的名詞解釋),如果我是一名iOS行動裝置的工程師,那麼我可能就會去看蘋果的官方文件,看看他們是怎麼寫這個物件的,為什麼要這麼寫?為什麼棄用的某些屬性或方法。
對我而言,我會區分一手資料跟二手資料,什麼是一手資料?對我來說文件、規格書就是一手資料,它是最精確的描述,但對常人來說也是最不想接觸的,畢竟是深澀的規則。
二手資料呢?大概就是所謂的大家在網路上分享的各種文章,還有在網路上看的教學影片。除非它被標註具有「官方」的色彩,那麼你就要審視一下它在解決的問題是不是就是你想要問的問題。
而我通常掌握知識的順序是這樣:
第三方參考資料、官方文件、第三方參考資料
第一順序的參考資料讓你先淺懂這個知識大概在講什麼。
第二順序是深度理解真正的定義、解決的問題。
第三順序是回頭看別人的應用。
當你有第二層的精確定義後,回頭看第三方參考資料就是一種昇華,因為你知道了所謂的Know How。
P.S.我通常不會叫別人去看Youtube上的影片,假如一個影片花20–30分鐘Live Coding,那麼你要研究它,就得花上四、五倍的時間去了解它為什麼這麼寫,在畫面來回切換Research的過程,你也失去了寶貴的時間。
請記得,「時間可以轉換為任何的價值」。
三、下關鍵字的能力
對我來說,這跟前兩點有點關係,因爲你必須要問,相信我,所有的東西透過google都找得到,不然就是你下關鍵字的方式有問題、再不然就是你太懶,只想打伸手牌去問別人。
但,下關鍵字這件事情,怎麼下才下的好?
對我來說,就是你在一瞬間下完關鍵字後,如果參考資料沒有馬上出現在前三個連結,那麼你可能就會需要再練練下關鍵字的能力。或者你就是單純沒有下對關鍵字,這就跟問別人問題具體與否一樣,也許在那個知識領域,它並不是被稱作你所認知的那個名詞也說不定。

其實上述三點加起來就是所謂的「自學能力」,你怎麼「從無知到找到答案」,這個過程花的時間越短、你能解釋的東西越多,你的自學能力也就越強。
雖然我沒有去過其他的培訓機構,但如果有一套教材的話,那你可能就會遇到傳統體制內教育那樣的問題,沒有人教你上面三個能力。
這也是為什麼「好想工作室」是我認為的軟體工程學習的烏托邦,如果你還在猶豫到底要不要花大錢去資策會、Build School、五倍紅寶石…etc
其實你有合適的自學工具(筆電)、合適的環境、合適的導師(Mentor)就可以開始了。
接下來,我想聊聊除了自學能力之外,你需要注意的事情。
四、本職學能
1.語法能力
對於軟體工程師來說,無非就是你要精熟的語言是什麼,花一個月的時間先打好寫這個語言的基本能力,無論是看第三方參考資料,或是看官方釋出的語法文件。好好的走基本能力,會比起你走到一半要繞回來補這些坑還要有效率的多。
2.框架(Framework)
你要知道你除了基本語言之後,哪些材料被拿來用?那你勢必要熟悉這些材料,在用的時候,好好的去看官方釋出哪些文件是描述這些類別(Class)、協議(Protocol)或結構(Struct)的吧。
3.第三方程式庫(Third Party Kit)
會了上面兩種東西可能還有點不太夠用,因為你有時候會需要用更快的方式去做出一個東西,這時你可能就會需要一些第三方框架來幫助你更快的排版、建構更好的架構…etc
最重要的就是讀懂這些東西怎麼用。
P.S.第三方程式庫只要去github上找就一堆…
4.資料庫
在建構前端工具的時候,往往會需要儲存一些東西資料,無論是本地的,或是網路上的,建議你了解它們可能有哪些特性,可以做哪些操作,大致上知道了之後,就可以引入你現在練習的App了。

五、版本紀錄工具操作能力(Git)
對於軟體工程師而言,Git的操作非常重要,絕對不亞於本職學能,因為你可能會涉及到的問題是修改專案時需要動用的技術,這時候有效率的下指令會讓你在操作修改、增加專案的程式碼很有幫助,建議在開始自學的時候,就好好的把這個技能點好。
Command Line or SourceTree?
終端機下指令使用Git的好處就是你可以很直接、很直覺的藉由指令去完成工作,也是最直接的接觸Git的使用Know How。
使用SourceTree的好處是圖形化介面操作,算是開發者友善,但如果你對Git熟悉到一定的程度,使用終端機下指令跟SourceTree其實是很類似的事情了。
不過我的習慣是挑難的做啦。
六、試水溫、辨認工作是機會還是陷阱
說到這裡,大抵上你已經知道了軟體工程師的在前兩個段落所描述的幾個核心能力,接下來你可能會是面對的會是實戰,也就是實際的找工作,在這個階段,就是你知道你現在所會的技能在就業市場值多少錢,你有時候會納悶自己到底能不能找到工作?
但請先跳過這個質疑,就去直接的投履歷,面試10間到20間公司之後,你就會知道你在哪個價位的落點了。
P.S.履歷怎麼寫也很重要,但這裡不討論。
最後,我想聊聊除了上班8小時之外,你可能可以怎麼調整你自己。
七、關於休息
好的休息有很多種,一種是倒頭就睡、一種是轉移注意力…etc
但總的來說,我所認為的「好的休息」,就是能讓你的注意力更有效率的完成代辦事項。而在「自學期間」跟在實際在「工作期間」的休息,其實也有一些差別。
自學期間,你面對的是自我懷疑、成本焦慮、達克曲線
工作期間,你面對的是績效、人際壓力
我自己有一個習慣,只要你覺得累了,那就去做一些別的事情。做一些能讓你再回到工作上時,更有效益的事情。後來我總有一個想法:「你如何休息,決定你回到工作時效率多高。」
「休息也是有層次的」,我希望你能夠認同我這句話。
我自己怎麼做呢?我目前認為最高層次是「冥想、靜默」。
當你真正的閉上眼靜下來時,你可以開始辨認周遭環境的聲音、別人試圖否定你所激起的情緒、家人伴侶在私事上煩擾你的情緒,你先是接受這些情緒,然後讓自己不要專注在這些事情上,就是單純的沈澱。
不過休息是挺個人的事情,不是每個人都能夠用這種方式休息。但對我來說,休息的層次拉到最高時,就是「安息」。
八、面對知識焦慮
知識焦慮就是你覺得你知道的不夠多,所以你企圖的想要知道更多的想法,而這種想法讓你不得不學習時,這就是「知識焦慮」。
Well,我想我還是要回到休息的概念,要適當切斷對於知識的攝取。你可以做做無關緊要的事情,這個世上無關緊要的事情可多著呢。
寫Code並不是人生在世唯一重要的事情,如何好好生活才是。
成為工程師的過程可能會覺得自己被知識追著跑,但其實你還是不能脫離好好生活的這件事情。
九、練習謙和
到達彼岸(就業),就是你在短期自學內達到的目標,我知道做到這件事情真的很狂,但也要知道這是另一個開始。
總會有人想問你你現在在做什麼職業,但也別急著表露你為何選擇軟體工程師作為你的職業而否定其他行業的專業,畢竟生活還是靠著各式各樣的職業而建構的。即便你知道你在這個過程裡付出多少努力,這些都直得肯定,但還是整整少年得志的心情,穩重的繼續學習。
說到底,軟體開發這件事情充其量不過就是需要高強度的核心能力與知識門檻。但穩定、謙讓的性格可以讓大家更信任你的能力,一個有效率的團隊就是這樣建立起來的。
後記
在經歷這麼一段路程之後,最近只覺得學東西開始變得容易、更能夠去辨識或攝取知識,但當然每件事情都有它的反面,有時候容易會陷入知識焦慮的陷阱裡。
但總的來說,我喜歡。
至於自己在性格上的變化,大概就是要花時間調適了。
這篇文章希望能給那些「想轉職成為工程師的人」,也給希望成為「好工程師」的一些好的指引。
我是MJ,是一名iOS工程師。