與程式語言的距離──文科生跨域轉職全紀錄(中)
–
開始上課
我參加的是資展國際的「智慧應用微軟C#工程師就業養成班」,課程時數共528小時,屬於「產業新尖兵補助計畫」補助班。班上大多數學員都是接受補助的29歲以下青年,自費生約佔四分之一,這比我原本預期的還多,有些意外。
查找培訓班資料時,我參考一些過去學員的心得,早早就決定進入培訓班後要每天過朝九晚九的生活——除了上課還要晚自習到九點。第一週主要適應環境和新生活,從第二週開始,除了少數日子外我幾乎都留下晚自習;相對地,我回家後基本不再碰程式碼——事實上,回家已超過10點,洗澡後時間也不多了。
晚自習時,我大多整理筆記、讀課本、做作業和自主練習,期中專題開始後,也忙於相關作業。週五晚間不開自習教室,通常就當作放鬆日;而週末會用半天到一天的時間練習程式。
事前原本有點擔心自己對資訊相關的常識太過缺乏,會影響到理解能力,後來發現不愧是專門給零基礎學生的培訓班,老師的授課避免提到陌生專業名詞,甚至用「這觀念就和XXX一樣」這種要是根本不認識XXX就不懂的講解法;如果有提到,老師都會簡單說明,說明深度則視與課程內容的相關性而定。
上課教材以老師自編的講義為主,課本則更像參考書,需要時可以自己翻閱。由於書都很厚,我會斟酌閱讀,原則上只要新課程開始,就會放下上一門未讀完的教材,全心專注在新課程上。
專業科目01_C#入門(老師A)
C#的基本概念,包括變數、迴圈、條件式、陣列、集合、自訂函數……等。
我認為應該要包含控制項的操作,但這位老師幾乎沒有讓我們碰控制項,只有用到Label、Button和TextBox而已,甚至已經幫我們放好在上面。
這位老師的教學方式是在專案中寫大量註解,註解的內容大多是指示,指示學生要觀察哪裡、做怎樣的練習。也就是說,我們的實作練習大多很片段,寫一小段程式碼,成功達到指定的效果即可。
總之,由於我先前自學的範圍幾乎等同於這門課教授的內容,老師的講解方式也沒有讓我有更深的理解(甚至有些還蠻莫名其妙),所以這門課我相當輕鬆與不專心,常常邊上課邊問chatGPT來補充額外內容。
專業科目02_SQL語法與SQL Server(老師B)
SQL Server 介紹、SQL 介紹,以及基本的 SQL 語法。
課堂上會安排幾題小題目,講解一段、練習一題。課程有明確架構,很能知道自己現在在學什麼,感覺老師教學已經熟到可以記得北風資料庫(SQL Server 的 Northwind 範例資料庫)的資料了,很能控制要講哪些內容,而且毫不戀棧,也沒想補充多點內容,提前一小時就把這門課結束了。
過去只有碰過 C# 和 Visual Studio,很不適應 SQL 語法和 SSMS;課堂上雖然跟得上進度,卻也能明顯意識到,要是額外做題目肯定會頭昏眼花,簡言之就是還無法應用,例如子查詢和CTE;有些概念不完全懂,像是 GROUP BY 不知為何花了許久才搞懂,Transaction 乍聽是不難,也就糊裡糊塗的過去了。
後來學了 LINQ 後,就不太用到 SQL 語法,記憶便散失大半,然而業界很看重 SQL,強烈建議找工作前要去 LeetCode 上做做 SQL 50,作為複習用很適合。
補充:實際開始工作後,發現 SQL 真的是無敵重要,以我目前工作的狀況來說,常常需要查詢資料庫裡的資料,不需要用到多複雜的語法,但基本上每天都會需要用到 SQL。
專業科目03_資料庫實作(老師B)
正式學習 SQL Sever,著重在 SQL Sever 內含的各種概念、SSMS 圖形化界面的操作,與資料庫設計方式。
課程一開始我學得手忙腳亂,勉強跟得上老師的速度進行動作,腦袋卻來不及跟上,感覺跳來跳去的建立不起來一個知識架構(事實上無架構可言)。後續專題只需要做資料庫設計就好,很多上課學到的內容並不會實際用到,像是預存程序和Trigger之類的,現在已經不知道那是啥了。大體來說這門課最重要的就是資料庫設計。
這門課有安排一個作業是設計一個至少包含六張資料表的資料庫,老師會在上課時一一檢討。這個作業相當實用,經過老師的檢討,無形中學習或複習到許多關於資料庫的設計邏輯。
不過呢,由於老師在教學中會特別強調「資料庫正規化」,導致後來專題的資料庫設計上,我有點「過度正規化」導致資料表太多,後續才刪減到剩一半的量。
實際上我們這些新手去工作,公司也不會讓我們設計資料庫,所以這部分我覺得就是能好好設計好專題使用的資料庫、了解自己為何要這麼設計就夠了。
補充:我工作的公司資料庫非常非常龐大,事實上經過半年我還沒摸熟,也不甚清楚資料表之間的關聯,但最起碼要會看單張表的 primary key 和資料型別。另外,我曾經遇過一個查詢過於緩慢的問題,前輩提到關於叢集索引和非叢集索引的概念,我想這些知識還是頗為重要。
專業科目04_C#元件開發(老師C)
一言以蔽之,就是學習物件導向。
這門課的上課步調不快,老師授課方式相當容易讓學生跟上,概念說明簡單扼要,還會留時間讓學生拍照和做筆記;開放練習的時間頗長,會等到三分之二以上的同學都完成才會進下一步。
大致來說,因為有老師帶著做,對於物件導向、工廠模式、MVVM 會有一定的認識,要自己從無中生有就比較困難了。實際上在製作專題的過程因為太忙亂,未必有心力用物件導向的寫法,可以說這門課是屬於日後到業界才需要用到。
這門課有個很重要的功用是終於能體驗怎麼做出一個程式,先前在 C# 課以學習程式語言為主,到這門課才開始邊寫邊學控制項該怎麼用。我在自學時期已經接觸不少,對我來說還好,但我想完全零基礎的新手學到這裡才終於感受到寫程式是怎麼一回事吧!
專業科目05_ADO.NET(老師C)
程式和資料庫溝通的方式之一。
這門課終於解開我的迷惑,SQL 和 C# 差這麼多,到底要怎麼結合在一起?我原本還以為 ADO.NET 是另一套語言呢。
老師教得不錯,要理解並不難,比較不習慣的是要在 VS 內寫 SQL 語法,有錯誤難以看出來,如果先前 SQL 沒學好,可能會加倍痛苦。
由於後續會再學 LINQ 及 Entity Framework,有許多同學(包括我)期中專題就沒用 ADO.NET,自然是忘掉了大部分。實際上業界還是有不少在使用 ADO.NET,以及前面說過普遍會重視 SQL 語法的熟悉度,就這方面考量,或許期中專題用 ADO.NET 來寫有助於通過面試?
補充:我工作的公司是使用 ADO.NET,但和課堂上所學到的基礎用法不一樣,是將資料庫連線與查詢的功能封裝在一個 Class 裡,內含連線設定、查詢操作等多個 Function。因此,在不同程式中只需要創建該 Class 的物件,然後呼叫相應的方法,即可完成所需的資料庫操作,無需每次都重複撰寫連線設定與查詢細節。
專業科目06_LINQ 與 Entity Framework(老師C)
LINQ 是一種簡便的查資料語法,Entity Framework 是一種框架,用來把資料庫映射到程式裡,就可以像操作物件一樣來操作資料庫,是另一種程式和資料庫溝通的方式。簡單來說,會覺得自己一直在用 C#,沒有出現 SQL 語法。
這門課就將上一門課寫的專案,改成用 Entity Framework 和 LINQ 的方式來寫,除了語法不同之外,概念並不難,但由於課堂上只學很簡單的資料操作,專題製作會根據你所設計的資料庫複雜程度而有不同的狀況發生,Entity Framework 本身也常出現各種稀奇古怪而難解的錯誤,課堂上根本沒遇到。
遇到錯誤時是連錯誤訊息也看不懂在寫啥、問題究竟出在哪,更糟的是牽涉到資料庫設計以及程式的設計,很難把問題具體告訴 chatGPT,直接給它錯誤訊息,它也只能概括列出有哪些可能造成此問題的因素,就靠著這些線索努力找尋問題源頭,期中專題時吃了不少苦頭。
總而言之,這門課就是學基礎,其餘就是從錯中學。遇到錯誤→找出問題→記下來,如此循環幾次,一些常發生的錯誤就自然記得是哪裡出問題,或者建立起一些概念,大致可以猜到哪裡出現問題,漸漸地就會與它越來越熟了。
對了,強力提醒,所有資料表──不管是多小的資料表或是中間表格,絕對都要設主鍵,不然透過 Entity Framework 就會發生你根本看不出問題出在哪的錯誤。
專業科目07_MAUI(老師C)
跨平台應用程式 UI,簡單來說就是可以用同樣的程式碼,在電腦與手機上運行,包括Windows、Mac、Android、iOS等。課堂上以 Android 手機 APP 為主。
這門課有點小尷尬,也很難實際用在專題上,不過在這門課接觸到 XMAL 和 XML 的概念,對於之後學 HTML 有點幫助(我覺得);課程中有用到 MVVM 的開發架構,對於之後學 MVC 也有些幫助。另外,即使很陽春,看到寫的程式在手機上運行,是蠻讓人興奮的,算是學起來頗開心的課吧。
期中專題
接著說說專題,專題以小組進行,一組 7-8 人。大概培訓開始四週後導師就公布分組名單,第四週會用一堂課來介紹專案開發的流程與一些知識(例如什麼是 site map),然後導師會一組一組分別面談。從主題發想→決定主題→畫出 site map→確定所有子功能以及各自負責人→資料庫設計,導師會安排進度,大致上是每星期會和各組討論一次,共三次左右(如果小組有遇到問題,可以額外和老師約時間)。
在這個階段決定的小組專題主題、分配到哪個子功能,就會一路延用到期末專題。像我們這組做的是學生服務系統,我負責的子功能是工作媒合,所以只要是工作媒合有關的部分,前端後端、前台後台都會是由我負責。
大致來說,期中專題是用 winform 來製作「後台」,期末專題則是用 web 網頁來呈現「前台」。話雖如此,web 版的後台一樣也必須要做,只是會根據每個人負責的功能而有不同的比重,有些功能可能絕大多數都必須在後台呈現,所以他會花較多時間做後台;像我負責的工作媒合前後台都有,但我把心力都放在做前台,後台就很陽春了。
在第八週的時候,多數人會開始在課餘時間製作期中專題,正式的「期中專題製作課」是排在第九週,這個星期就是專心做期中專題,然後會以組別為單位進行發表(每個人都要上台講話)。
【學到的事情】
期中專題的製作時間真的很少,Bug 卻不斷出現,想做的效果出不來,可以說是整個培訓期中我最有壓力的幾天。也因為太痛苦了,讓我下定決心期末專題時要好好做事前規劃。
我深深體悟到,寫程式這件事不是光付出時間就能有高產能,常常是花太多時間反而會造成阻礙,例如嘗試了數小時就是無法解開的問題,隔天早上莫名三兩下就解決了,這樣的案例不只一次。當疲累時思考容易停滯,犯錯的機會也會上升。另外,我也發現自己沒有想像中那麼「耐操」,大約拼命努力三天左右,身體就開始有揮之不去的疲累感,剩下幾天就沒辦法保持精神了。
總而言之,做好時程管控以及適當的休息是非常重要的事,事前規劃好哪些是重要必做、哪些是次要,這會對做出取捨有幫助,時間有限,不要高估自己的效率,在經驗不足的狀況下做出的估算完全不準確。
我認為期中專題的重點反倒不是在程式上,而是在學習如何開發專案,包含評估自己的能力、速度以及小組內的磨合。因為有期中專題的經驗,才讓我能在期末專題時有餘裕的完成進度;也因為有經過磨合,我們小組才能真正上軌道,在期末專題時發揮良好的合作。
至於程式方面,就盡量做,不需太苛求自己要做到多棒多完美,坦白說這個 winform 專題投資報酬率不高,除非原本就對它很熟,能夠在短時間內做出很棒的成果,不然大多數人都做得零零落落,我未來在面試時也沒臉把它拿出來。老師會建議大家要花時間整理、優化它,然而現實的狀況是期中專題後就開始新的課程,根本沒時間再回頭。