本文摘自《程式設計原來不只有寫 CODE!銜接學校與職場的五堂軟體開發實習課》一書的〈序〉。本文為精簡版,敬請支持原書來觀看完整內容以及精美排版。

一個資工系所畢業的學生該具備什麼技能?一個半路出家的工程師需要具備什麼能力?除了基本的程式設計能力與專業科目所學的知識,這本書想好好來討論一下任何寫程式的學生或工程師都該該具備的「基本素養」。

前言

筆者大學不是念資工系,而是到了研究所才念。在研究所之前,我學程式的路徑是非典型的,高中時上課學到 C++,但那時候的我以為寫程式就是要「解題」。直到大一時藉由學長的提點,才開始對廣義的寫程式開始有興趣,接著靠自學摸索大部分入門知識,很幸運地有機會去好幾家軟體公司實習,也有嘗試貢獻一點簡單的開源程式,後來到了大三下、大四上我才真正去修資工系的課,但我不認為當時我有真正了解計算機科學,直到上了交大資科工所才真的勉強算是具備「資訊工程專業」。

因為這種特殊的學習路徑,所以讓我特別去注意自己缺乏的資工必備技能,很多技能都是我走了很多彎路才學會,花了很多時間自學查資料,或是實習時受到提點,抑或是在開源社群中得到指導,原本以為我花了很多時間搞懂的東西,對於資工系學生也許很簡單,但我觀察學校同學時發現缺乏資工人必備的軟硬技能(基本素養)的人卻比比皆是,例如我大三修課時,竟然需要教台大電機系同學怎樣使用 Git,上了交大資工所發現助教課同學不會除錯技巧,甚至連開始工作之後,來自東大情報理工博士實習生竟然不知道 CMake,甚至連 C++ 程式都不太會寫。

資工系所學生如果畢業之前沒有養成資工人該具備素養的話非常吃虧也很可惜,而外系學生或是轉職的程式開發工程師就更容易忽略或甚至不知道要學習這些重要的基本能力。一個具備良好素養的工程師需要長期的訓練培養,本書希望將這些素養及早傳授給讀者,讓大家少走點彎路。

這些基本素養包含了以下幾點:

  • 建立高效率的程式開發環境
  • 熟悉系統的操作
  • 閱讀原始碼以及進行程式除錯與分析
  • 熟練多人協作開發的流程
  • 維護高品質的程式專案
  • 關於電腦的一切基本知識

前述五點分別對應本書的第一章到第五章,唯獨最後一點並沒有在書中特別形成一章,但卻是最重要的一點,需要靠讀者自己廣泛學習。

程式開發環境

工欲善其事,必先利其器,程式開發環境是我們能進行高效率開發和高品質寫作的基礎,我們要了解到寫程式並不是打開文字編輯器打打程式碼而已,對於我們所用的作業系統平台以及平台上能利用的工具,我們應該都要清楚如何使用。

在本書第一章中會介紹三個常見的作業系統:Linux、Windows、macOS,並說明各系統的差異與特色,此外還會詳細介紹如何使用主流的編輯器:Visual Studio Code 和 Vim。

優秀的工程師應該要具備跨平台的開發能力,並能充分使用各種開發工具。

系統操作

系統操作的熟練度對於我們能不能有效率地進行開發一樣很重要,我們需要知道shell需要如何使用,並且以shell來對系統操作時,知道如何使用各種命令工具來達成任務。

在第二章中,以 Unix/Linux 為主體介紹如何使用 shell 以及進行系統的操作,先是對 shell 有深入的說明和示範,接著我們將學習用各種系統命令程式來做系統操作和資源管理,最後學習如何使用SSH來進行遠端連線操作。

好的程式設計師懂得怎樣有效率地操作系統來達成目的。

程式碼閱讀、除錯、追蹤與分析

現實世界的程式碼往往都是數百萬行起跳,不像學校的程式專案最多就一兩千行,如何閱讀那麼龐大的程式碼會是一個很大的挑戰。如果我們還需要從這麼龐大的程式碼中進行程式除錯、追蹤、分析,那是更加困難的挑戰了。

在第三章中,本書以系統化的方式教導如何去閱讀程式碼,尤其對於數百萬行等級的程式碼規模更是適用,接著本書會詳細說明如何對程式進行除錯,以及進行程式碼的分析。

傑出的工程師懂得如何快速閱讀程式碼並從中找到問題的癥結點。

多人協作開發

一個人能寫的程式碼有限,真實世界中工程師們必須互相合作,才有辦法完成數百萬行程式碼的專案,而要能做到多人協作開發,我們需要了解現代的工具和平台。

本書第四章中介紹了程式碼版本控制系統和程式碼託管平台,這是讓多人協作開發變得可行的重要工具,我們將會特別著重在 Git 的使用上,而有了工具後平台也很重要,GitHub 平台讓我們更容易搭配 Git 來進行多人協作開發。

工程師往往不是靠單打獨鬥,而是需要靠彼此合作來完成一件大作品。

程式專案的品質維護管理

程式並不是寫完就結束了,後續還有很長的維護和更新,好用、賺錢的程式專案可能會用上數十年甚至更久。一棟建築完善的建築可以經過風吹雨打屹立不搖數百年,程式專案也是一樣的道理,唯有以好品質來進行程式專案的開發管理,才能使該專案長久持續下去。

在本書第五章中,將介紹如何替程式撰寫測試來確保程式的正確性,並說明如何使用程式碼託管平台來做到持續整合與持續發布,讓每次程式碼更新時都能經過驗證和發布更新,此外此該章節還介紹怎樣寫高品質的程式,以及如何替程式碼撰寫文件。
品味高的程式設計師不僅寫出高效能動的程式碼,同時還注重程式碼的品質以及維護性。

關於電腦系統的一切基本知識

我們寫的程式終究是跑在電腦上,程式是否執行得正確有效率與電腦系統息息相關。計算機概論、計算機組織、計算機網路、作業系統、演算法、資料結構,這些學問只要是資工系所學生都應該學過,並且是資工系所學生所具備的最大利器,因為在解決問題時常常要回歸最基本的原理或系統底層架構,如果不懂得這些基本的計算機知識的話,在解決比較底層或複雜的程式系統問題時,就比較不容易看到問題點。

如果行有餘力,我們還可以去學習其他資工相關知識,像是自然語言處理、機器學習、電腦圖學、電腦視覺、編譯器原理、異質運算、網路安全等等。這些電腦科學或計算機系統的知識往往會在意想不到的情況下派上用場,就算都沒用到,了解這些科學原理增廣見聞也是一大樂趣。

偉大的程式設計師,必定對電腦系統有很高程度的了解,將其所學的各種知識整合起來解決問題。

結論

上述所提到的各個核心能力,是成為優秀的程式設計師的必備技能。如果讀者有欽佩的電腦科學家、軟體工程師、計算機相關領域專家,期許自己也能和他們一樣厲害的話,首先我們可以從基本的資工素養開始培養起。

本書匯集了筆者在台大與交大求學階段、多家軟體公司實習期間,以及職場工作中所經歷與觀察到的關鍵經驗與洞見,將筆者認為重要的基本能力有系統地整合於書中。

有太多東西是「希望早點知道」,很多時候我們不是不夠聰明,而是缺乏學習和認識的機會,不管是在學校、實習、職場,很多能力我們終究是需要學會的,既然如此何不早點學會並應用,還能讓他人另眼相待,提早讓各位讀者知道要學習哪些能力,這正是本書的目標。

本書也用來勉勵各個資工系所學生、轉職工程師,或任何想要踏進資工領域的讀者,期待書中教授的知識對各位有幫助,希望大家可以一起進步!

欲閱讀更多內容,請參閱《程式設計原來不只有寫 CODE!銜接學校與職場的五堂軟體開發實習課》介紹頁面。
「程式設計原來不只有寫 CODE!銜接學校與職場的五堂軟體開發實習課」書籍封面