《APPX時賦科技》半年後端實習技術總結與心得分享

總結這半年來在時賦科技實習所學到的技術,並講述一下心得。

柯基
appxtech
Published in
21 min readMay 23, 2023

--

目錄
一、關於時賦科技
二、實習硬實力-技術總結
1. 基本專案架構
2. .NET Core泛型應用與實作
3. Dependency Injection (依賴注入)
4. Auto Mapper
5. AWS DynamoDB/S3
6. Microsoft power automate
7. NLog
8. DBeaver
三、實習軟實力-實習所獲及心得分享
1. 動機與目的
2. 儀式感
3. 時程配合
4. 喘口氣吧
四、FAQ
1. 實習的流程?
2. 找實習要準備什麼?
3. 什麼時候可以開始參與實習?
4. 非資訊類本科生可以參與嗎?
5. 學期實習會不會佔掉很多時間?
6. 實習期間有什麼要注意的嗎?
五、從無到有-實習心得總結

嗨嗨大家好!我是柯基,目前就讀資工系大三(學期也快結束了),並擔任時賦科技的後端實習生。

在時賦擔任後端實習不知不覺也過了快半年了,這期間參與過各種專案,也接觸了很多以前不曾碰過的技術或應用,實習上班的過程中,也經歷了不少心路歷程。這篇文章就來總結一下半年來所習得的硬實力與軟實力!

(文章篇幅較長,建議可以透過上方的目錄,選擇自己想了解的部分~)

關於時賦科技

時賦科技團隊創立於民國103年 ,從事電腦軟體服務業,執行過許多大大小小專案,擁有豐富的專案實戰經驗,累積了許多domain knowledge以及不同領域的合作夥伴。

為了提供人才更多的機會,時賦科技開始耕耘教育,期望將程式專業教育與業界實務結合,豐富的專案經驗與經營團隊的背景,使程式教育更加有競爭力,且為業界所認可。

時賦在做的事:

● 軟體客製化開發

● APP應用軟體開發

● APP UI/UX 設計

● 資料庫設計規劃與調校

● 軟體雲端服務架構規劃

— 擷取自時賦科技官方網站

在時賦科技中,開發大多採用前後端分離,並主要使用.NET Core、Java及Node.js 作為主力開發語言。並且,不定期舉辦講座及課程,期望能培育更多人才。

實習硬實力-技術總結

以下將逐一介紹出這半年來所接觸的新技術、服務及應用。

基本專案架構

對於一個專案而言,不僅要跑得動,也要跑得快,更重要的,要讓人看得懂,也要讓人改得動。在上述的需求下,維護一個好的專案架構,自然成為每個工程師必備的技能。

在先前的實習文章中已詳細介紹過實習時所採用的系統架構,想進一步了解的朋友,請參見以下連結!

.NET Core泛型應用與實作

開發API時,即使完成了目前的功能,也無法保證未來是否會有類似或相關的新需求,因此,我會盡力將程式寫成可以重複利用的形式。其中,泛型就幫了我很大的忙,讓我的程式得以更加彈性,減少冗贅的程式碼。

關於泛型,我也寫了一系列的文章來介紹.NET Core是如何實作的,一共分上中下三篇文章。推薦各位在觀看時,可以隨意開一個線上.NET IDE,並跟著文章中的範例練習,會有更好的學習成效!(我也是邊寫文章邊嘗試的)

Dependency Injection ( 依賴注入 )

與泛型相仿,DI也是個在OOP中經常遇到的Design pattern,主要是為了實現控制反轉及解決高低階模組強耦合的問題。在專案一層一層的架構中,由於上一層會使用下一層提供的服務,因此若不使用DI,低階模組更改時則會發生牽一髮而動全身的慘劇。以下是我當時學習DI時所參考的文章,內容深入淺出,非常好懂,在此推薦給各位。

另外還有時賦其他關於DI的簡介~

(順帶一提,最近在自學React時,也遇到了component間強耦合的情形,其解決方法也是利用了類似DI的控制反轉,不過目前還不是很理解xD,看來離Full-stack還有一段路)

Auto Mapper

在某個功能需求中,我需要拿出資料庫中的資料,放進DTO回傳,待client request update時,再將DTO轉回資料庫各table的model,並進行更新。一切看起來非常正常,直到我得知那個「資料」關連到五個table時,整個人都不好了,這怎麼樣才能寫得好看啊?

在暴力的作法下,需要不停的在DB Model和DTO封裝解包間往來反復,滿滿的new彷彿漫天星斗般灑落在程式碼中,看得見摸不著,更遑論集中管理了。然而,有了Auto mapper後,將可透過註冊的方式統一管理型別之間轉換的定義,呼叫時更只需一行,便可將複雜型別間的解包與封裝一次完成。

這裡一樣附上我學習時的reference及時賦曾介紹過關於Auto mapper的文章。自從用了Auto mapper後,我考試都考100分,朋友也變多了,你還不試試嗎?

AWS DynamoDB / S3

AWS ( Amazon Web Services ) 提供的服務眾多,其中DynamoDB和S3是我在一個專案中經常用到的服務。

DynamoDB屬於NoSQL,操作上跟先前所接觸的RDBMS ( MySQL, postgreSQL, MSSQL … ) 不太一樣,但因為具體的query都被ORM給抽象化了,實作上沒有太大變化,且比SQL更加直覺與彈性。若沒有複雜的資料查詢需求,資料儲存上使用DynamoDB是挺不錯的選擇。

S3 ( Simple Storage Service ) 提供物件儲存的服務,具自動備份與災難復原的能力。開發上最常使用到S3的情境,便是跨專案存取同一份檔案,或是單純儲存某支專案產生的報表。值得一提的是,若專案有大量的多媒體資料需供使用者短時間內大量存取,可以讓使用者直接向S3發送請求,而非透過API server存取。如此一來不僅可以降低API server的流量,更可以防止API被戳爆的情形(畢竟如果有人能獨力把S3戳爆,那怎麼樣都拿他沒轍)。

Microsoft power automate

用過iOS或macOS的人應該都知道「捷徑」這個App,power automate也是一樣的應用。Power automate可以透過設定觸發的條件,主動或被動的去執行一套自動化的流程。例如在專案中,我需要接收outlook信件並解析內容,這套流程便可透過power automate實現,並以API request的形式將結果傳入程式,進行後續的處理。

流程定義示意圖

除了郵件的相關功能,還可以結合Teams, MSSQL, Jira, Office, OneDrive, Github及AI Builder等等,執行跨應用間的互動,省去重複的行為。然而,若要將power automate用得淋漓盡致,則需處於微軟的產品生態圈內,這是我個人認為所有平台的自動化流程瑕不掩瑜的共同缺點。

NLog

NLog 是一個幫助開發人員使用log除錯的套件,且相較於內建的logger更加簡潔與彈性。

在套件生成的NLog.config XML中,可以在rules下新增logger,定義觸發logger的條件,包括執行檔案之路徑、log層級 ( Trace, Debug, Warning, Error ) 及log儲存目的地等等。在指定log的目標時,則可以在targets下定義一個target,定義儲存的目的地及格式等等。以之前的專案為例,API需要在發生錯誤時,把Ip, Sender , ApiPath, StatusCode 等資訊一口氣存進資料庫,於是在target中,便需要與資料庫進行連線,再進行SQL query執行插入。如此便可省去local儲存的不便利性,也讓log的條理透過DB schema顯得更加清晰。

DBeaver

相見恨晚的優質工具!

DBeaver 是一個資料庫管理工具,使用者可以透過GUI對table進行CRUD,必要時候也可以透過SQL query來直接對資料庫進行修改,讓資料庫的操作上更加直覺。

值得一提的是,DBeaver 不僅會根據你目前的設計,自動產生DDL,還會根據各table的PK及FK繪製該資料庫的ER Diagram,table間的關聯一目了然,在各個專案開發時都非常好用。

DBeaver 自動產生的ER Diagram,綠色方框代表FK關聯 Photo from DBeaver Docs

為何說是相見恨晚呢?先前使用MySQL時曾聽說過Workbench,功能與DBeaver相差不遠,但當時卻堅持使用SQL query來進行CRUD,ER Diagram也堅持自己手繪,直到這次嚐過GUI帶來的甜頭後,才真的是回不去了……

雖說如此,個人還是不建議資料庫初學者直接使用這類的管理工具,無法操作原生語法可能會導致觀念不清楚,建議還是要有一定程度上的資料庫操作經驗,使用上才有如虎添翼的效果。

實習軟實力-實習所獲及心得分享

人們常說,學生的本份就是好好學習,出了社會就好好工作,如此足矣。雖然這是舊時代的觀念,但放在現今來講,一個大學生確實得試著從學校帶走些什麼,出了社會也得有份工作維持生計。若撇除部分族群為分擔家計半工半讀,理論上這兩個時期幾乎是沒有交集的,實習期間,便是兩個身分短暫而寶貴的交集,也因此可以得到其他時期無法獲得的經驗。

從年初開始到現在,從大三的寒假開始到現在學期即將結束。每周累積約三天的實習時長,與17學分的縱橫交錯(很少)。這半年內,我累積了很多以往未曾擁有的經歷與能力,下面就來一一講述我的心路歷程與所獲。

動機與目的

動機與目的左右你的實習體驗 Photo by Markus Winkler on Unsplash

先前面試各家公司實習時,最常被問到的兩個問題是「這份實習是學校規定的嗎?」及「未來有讀碩班的打算嗎?」,這剛好對應到了實習的動機與目的。我認為在開始找尋實習職缺時,釐清自己「為何追求?」及「追求什麼?」十分重要。

先提「為何追求?」。有些人面實習缺的原因,其實是因為學校的畢業門檻規定,自己也是心不甘情不願。雖然自己不是,但每次被問到這個問題時,第一時間都有點難以啟齒,說直白點是因為周遭的同學都有一份實習,自己當然也想找一份啊,當然,真正的理由並非這麼膚淺。最根本的原因,是實習帶來環境上的改變

這句話有兩個意思,學校做為最基本的學習場所,可以帶給你的東西終究有限,若想打破現狀,必定得另尋新的學習環境。實習期間,除了各種平常不會主動接觸的技術,更多的是以業界開發的標準看待你的程式,在這樣的環境下進行開發,即使只有半年,我的程式設計能力也有顯著地改善。

另一個環境改變的意思,是得以接觸不一樣的人。不僅僅是與辦公室內同事們的交流,在其他地方,也能曾經或正在類似公司實習的朋友們交換實習心得及一些業界生態。就跟化學反應需要能量的改變才能產生一樣,環境的改變能帶給你截然不同的人事物,改變你看待自己或世間的角度。

再來提「追求什麼?」。會與未來碩班打算做關聯的原因,是因為部分人是為了實習後直接轉正,部分公司通常更歡迎這類人的加入,但對於大學實習的人來說,捫心自問「實習結束後,希望自己有什麼顯著的改變」是至關重要的,有了目標,才會知道這段路要往哪個方向走。

對我來說,我所追求的概括來講就是經歷。這個經歷可以受惠於很多方面,不論是前面所提到的環境帶來的眼界改變,抑或是履歷上的工作經歷創造未來更好的求職機會,甚至是求學時能帶來特別的第一印象。更抽象的說,這是實習的經歷,也是人生的經歷,正如前面所述,未來進入職場後,幾乎不會再有參與實習的機會了,若以後有機會說出「我以前大學在外面實習時,曾經…」,這樣也算是為人生多添一筆色彩了。

我不敢妄言「經歷」是追夢的象徵,是奉獻的足跡,畢竟他終究是對一個人有利且現實的一筆紀錄,不是一個適合過度美化的名詞。因此我很感謝時賦科技給予我這份實習的機會,願意讓我從零開始累積自己的經歷,絕對不會忘記這份恩情。

儀式感

如何透過儀式感達到Work-life balance ? Photo by Rebecca Peterson-Hall on Unsplash

作為學生,我為了爭取未來研究所推甄的機會,汲汲營營於成績與在校表現,因此奉獻了很多時間在課業上,寫程式熬到半夜或整晚沒睡已是常態。開始實習後,我的讀書時間自然而然地被壓縮了,起初以我的習慣,我會在上課時間看上班時沒解開的Bug,下課後繼續看,回到家後才開始碰學校的作業與報告。工作、課業、休息這三點同時進行,常常令我感到焦頭爛額,覺得事情沒有弄完的一天。一直到步入正式專案後,這樣的情況才有所改進。

進入正式專案後,有些程式是需對齊需求才可以寫的,不在辦公室寫扣,幾乎是盲人摸象,沒有太大的意義。在這樣的影響下,我離開辦公室後幾乎不碰專案的扣,這也連帶影響了我在學校時,不處理實習的專案,只處理作業與報告等課業事務,回家後專注放鬆與休息,避免碰任何作業與實習的專案。

這樣的生活模式是我未曾嘗試過的,也因為儀式感的緣故,對我而言十分有效。實習期間,我一天的行程是「實習→上課→讀書→回家」,由於每個行程都在不同的場所,因此在通勤的途中,會有「我現在要去OOO做OOO」的意識,製造所謂的儀式感。到了目的地後,潛意識便會與那項行程綁定,自然地提高了生產力,避免事情混雜的情形出現。

也因為如此,在辦公室時,我會盡力把進度告一段落才離開;在學校時,也是圖書館自習區的常客,經常待到閉館後,再自己去系上自由使用的教室處理作業與報告。若弄不完當天的進度,就弄到半夜才回家,回家後再聽聽音樂放鬆休息。透過「強制留在某場所製造儀式感」或許不適合每個人,但用儀式感來區分不同身分的職責,個人認為是很有效的方式。

時程配合

專案開發有著縝密的規劃,時程也是一點 Photo by Kaleidico on Unsplash

在時賦科技中,一個人會同時處於一個以上的專案,每個人都有明確的分工,每個專案也都有各自跟客戶安排好的時程。實習生雖然不需與客戶開會,討論需求細項與開發時程,但每個功能還是得在給定的時程下開發,時程壓力不可避免。

除了學生與實習生的身分,我在校另有擔任兩個助理職位,因此學校的事務整體而言偏多,經常會有專題meeting、報告討論、趕作業及臨時會議的情形發生。起初,我秉持著學校事務為優先的精神,有事就會向公司請假,不希望實習牽扯到在校的表現。然而,其對開發的影響甚大。在時賦,每個人都在專案中擔任舉足輕重的位子,一旦缺漏了一天的進度,一個功能可能就需推遲一天。雖然時程本身都會保留緩衝時間,但要是開發時數少了,時程就很有可能耽擱,便會造成客戶的觀感不佳,對團隊的影響非常大。即使有同事願意接手,讀懂程式碼及需求後再開始寫,也是隱含的時間成本,整體不利於時程的推動。

先前缺乏團隊意識的我,在經過提醒過後,開始試著平衡兩端的事務。我後來大致參考了時間管理四象限與實習時間進行安排與取捨:

  1. 重要且緊急:可提前安排(如大考)
  2. 不重要但緊急:評估是否可跳過此活動或交付他人(如系上活動)
  3. 重要但不緊急:不安排,另尋時間完成(如小組討論、作業)
  4. 不重要且不緊急:不安排(如飯局)
時間管理四大象限 (Eisenhower matrix) Photo from Luxafor

簡言之,個人行程的安排原則,必須圍繞於一定水準之上的生產力,若遇上任何無法避免且可能降低生產力的事件,必須盡早讓團隊知道,不僅是尊重團隊的運作,也是讓團隊有足夠的反應時間去處理問題,以不至於拖延到整體的時程安排。

在校開發之於實習開發,就如演習之於實戰。實習開發時,專案對面是活生生的客戶,而不是單純的成績,因此看待專案需格外謹慎,並遵行時程安排,這是在學校內所體會不到。

喘口氣吧

沒靈感時,當隻水豚吧,什麼都別想 Photo by Jaime Dantas on Unsplash

實習與在校開發不同,一天的開發時數長達八小時,因此,維持高平均生產力成為實習時很重要的議題。

維持生產力的方法有很多。在實習時,總有那幾個瞬間,覺得手邊的問題今天一定處理不完,明天也不一定能解決,或是在絞盡腦汁思考後,依然對問題沒有任何頭緒。這個時候,不是用一口咖啡來解決,而是放空,並且是完完全全的放空,像放棄思考般地放空。一段時間過後,再回過頭來看,會彷彿重新開機一般,多了許多新想法與切入點,此時解決問題可說是游刃有餘,不費吹灰之力。

這看似很不切實際,放空如何與提高生產力扯上關係?就像一台過熱的電腦,我們不會再給他新程序,而是放著等他恢復正常一樣。當大腦開始遲鈍時,也就代表到達了運算上限,此時若繼續思考,等同於是給大腦持續輸入訊息及運算量,無疑是增加大腦的負擔。反之,若試著放空思緒,大腦便有餘裕處理先前所接收的資訊。就像睡覺一樣,人腦在休息放鬆時,資訊處理能力是動腦時的千倍以上,因此即使並沒有真正的思考,大腦也會幫我們整理現有的資訊,讓後來的思緒能更清晰。

要注意的是,放空不等於休息,任何會接收資訊的娛樂活動都該盡量避免,包括滑手機、看劇等等,都會持續為大腦輸入訊息,休息後反而會覺得疲勞不減反增,無法達到上面提到的功效。原則上此時的活動就是以「減少資訊接收」為核心精神,因此首推小睡10–15分鐘(實際時間因人而異),阻斷所有外界資訊,其次就是發呆放空思緒,若以上選擇難以實行,也可以選擇 與人閒聊,雖然仍會接收資訊,但整體的運算量不會比處理正事時來得高。

實習期間,每投入差不多3個小時,我的思緒就會開始變得遲鈍,排除掉早上至中午可以透過午餐時間休息,下午的開發經常會被有限的思考能力所限制。面對這種情況,我會選擇去泡一杯茶,在等待的期間放空思緒,或是利用公司的下午茶時間,用些許的糖分為自己補充能量,並同時停止任何思考,用心的品嘗這杯喝了就能Debug的仙丹,為接下來的一波大腦風暴做足準備!

FAQ

雖然沒有人問過,但還是為自己寫了一個FAQ,提供給各位一些關於實習的建議~

實習的流程?

  • 至各大求職網站或就博會等等投遞履歷
  • (不一定有)進行公司指定的前測(程式能力、智力測驗、問卷調查…)
  • 等待面試通知(記得接電話收Email!)
  • 參與面試
  • 等候面試結果
  • 錄取後與公司確認並協調報到日期
  • 開始實習生活

找實習要準備什麼?

規定上的履歷作品集是不可少,其它還有以下幾項:

  • 聚焦於學經歷的自我介紹
  • 充分了解自己的作品集
  • 認識公司相關背景(產業定位、規模、文化、氣氛…)
  • 未來可配合的時間
  • 動機與目的(為何找實習?想獲得什麼?)

什麼時候可以開始參與實習?

理論上只要合法且有能力,公司看上你就可以開始實習,但大多數情況還是有一些限制。以我自己周遭同學朋友為例,大二升大三暑假就會有少部分的人去參加暑期或學期實習,但還是大三升大四的暑假居多。其中由於大四的課通常較少,大多數人都是參與學期或學年實習,暑期實習則因時間過短,較不受企業採納(當然還是有部分大企業有舉辦)。

非資訊類本科生可以參與嗎?

可以,但大多數公司會要求資工或資管類的學生。若是非本科系應徵,建議要有較完整且獨立完成的作品集,以印證自己有足夠實力。

學期實習會不會佔掉很多時間?

會,大部分學期實習會要求一周三天以上,換句話說,學分極限只能安排16學分左右,所以請做好兼顧課業和實習的準備。

實習期間有什麼要注意的嗎?

有,充分利用這段人生的過渡期去學習,並好好享受每個特別的體驗。

從無到有-實習心得總結

半年的實習也即將告一段落了,接下來就要短暫回歸社畜學生了Orz。

這半年的實習生涯不算輕鬆,卻也非常充實。起初,我從幾乎零經驗開始,完成各項開發培訓,接著,我開始可以獨力完成簡單的小專案開發,後來,我又參與了幾個專案,並在其中有著實質的貢獻,在各個的專案中,我也學習到了不同的技術與技能。相比於半年前,我的開發能力有著顯著的成長,也因見識並參與了業界的實務開發,而大大地開闊了我的眼界。這半年從無到有的過程,無疑是我人生中重要的里程碑,也是為接下來要走的路開拓了一條康莊大道。

感謝FRank最一開始願意給我實習的機會,進來之後,除了時常關心我實習的情況,也常常給予實習生們一些開發建議,甚至是未來求學或就業的經驗談。在我怠惰散漫時,也能適當的釘我一下(我真的很欠釘xD),讓我能一直保持在正確的軌道上前進。

感謝我的主管Jim,在一開始提供簡單練習,讓我能迅速步入正軌。在正式的專案中,除了整理明確且難易適中的需求讓我們實作,也時常給予開發上的引導與建議。當遇到問題時,總是不吝於讓我們問東問西,開發上有自己的想法時,意見也能被重視,並一起討論解法,對能力提升上真的有很大的幫助。

感謝RD team的其他實習同仁,能一起在同個專案下一起努力,就算手上的專案各不同,也能時不時交流一些技術,彼此砥礪。也感謝PM team的同事,整理簡潔好看的需求,讓我們的開發能更順利。在專案完成後,對程式進行測試檢查,保障程式的品質。行銷方面,也正努力推廣時賦的活動及每個人寫的文章,期望讓更多人看見時賦的理念與核心精神。

最後,雖然有點奇怪,但還是得感謝半年前的自己,沒有安於現狀,而是願意花時間找尋實習的機會,並積極參與,才能造就今天跟先前不一樣的自己。未來,我也願意持續的尋找機會,挑戰各種困難或不敢嘗試的領域或可能,激發並充分發揮自我的潛能,讓每一天都能夠是更好的自己。

今後,雖然我不繼續在時賦實習,但我不會忘記時賦給予的這份恩情,謝謝時賦帶給我的一切!

--

--