iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 1
1
Software Development

淺談軟體開發與工程的基本追求系列 第 1

概覽

定好可以講的內容與簡單的綱要後,在本次鐵人賽報名截止的前十分鐘,開始苦惱地思考要定什麼題目和雨怎麼敘述。在不斷地刪去與鍵字中,時間來到了最後一分鐘,終於倉皇的寫下標題「淺談軟體開發與工程的基本追求」,並寫了以下描述:

淺談一名程式設計師在軟體開發與軟體工程領域中應該了解並遵守的知識與哲學。

嗯,非常抽象。好吧,我短時間真的不知道該怎麼把我要講的綱要濃縮成標題和一小段敘述,不過至少我報名了。接下來三十天就請各位多多指教了。 <(_ _)>

故事

從我們鍵下了第一句 hello, world 的敘述時,便穿越了一個通向無盡世界的隧道。我們發現了一個充滿魅力的時空,在這裡我們得以透過鍵盤建構出一個個世界,探索不完的新知、綿綿不絕的成就感,麻痺了我們多少夜的時間感,在靜謐的夜裡仍樂此不疲的敲擊的。

不知不覺地走了好長一大段路,學會了程式設計、掌握了語言技術、編寫了幾個有趣的玩具。在突然驚覺自己已經離起點有了數月到數年的時間,卻發現還是看不到這世界的邊境之地[^1],只看著遠處一座座前人們聳立的高山,聽聞著一個個前輩們的故事,不禁悠然神往。省視著自己,果然還是太弱、太渺小了,於是繼續踏步向前,充滿熱血的繼續學習。

又過了許久、許久,這段期間自己暸解了物件導向、將設計模式視為了圭臬、獨自完成了幾個作品。或許,自己似乎已經成為能獨當一面的程式設計師?興致勃勃的我們開始進行了各種挑戰,陸陸續續為這有趣的世界留下了屬於自己的腳印,或是幾間屋子、或是幾道機關。更有信心的我們,繼續往未知的挑戰邁進。

走著、走著,到底走了多久?最近突然有種徬徨感,和各個如雷震耳的先進比起來,自己似乎還是很弱。那幾坐在前方佇立的高山,還是一樣難以望其項背。這時,旁邊的人跟我們說了,比起從前這世界是越來越大,一個人的力量是有限的,和人交流與合作,才能創造出更有價值的成就。恍然大悟的我們開始組隊、參與大型團隊的建設,有些自傲的我們,相信自己一定能夠突出的表現出自己的能力。

覺得沮喪。世界是如此廣闊,卻覺得自己眼前不遠處有場大霧,遮蔽了自己的去路,每走十里路,卻仍覺得離原處很近。自傲的我們,嘗試透過合作書寫出屬於我們的故事,結果卻是產生了一隻隻猙獰的巨獸,我們失去了對自己創造之物的控制權,每想要改變某處時,卻從我們意想不到的地方爆出攻擊,擊退了我們的自尊。而身旁一處處雖然高大卻搖搖欲墜的地標,彷彿在嘲笑著我們的失敗。我們開始吵架、指責對方、堅持己見、推託責任,是的,程式設計的眷顧逐近從我們身上褪去。

「醒醒吧,迷失在程式設計之道的羔羊,靈魂濁化的程序猿們!」
「拋棄執我,重新淬煉自身的技藝吧!燃起心中追求專業的不該熄滅之火吧!」

一盞明燈出現在霧中。跟隨著亮光的我們走離了霧,遇見了被尊稱阮公[^2]的大師。他教會了我們如何馴服自己創造出的巨獸、如何團隊合作、如何建造出穩健的高塔。我們懂的重新審視自身程式碼的不足、學會寫出他人可以看得懂的敘述、瞭解如何維持程式的品質與穩健性。我們的眼神重獲了明亮與堅毅。

在我們重新踏出旅程前,試著將自己還沒融會貫通的知識與收穫寫下,希望這二十幾篇的阮公學筆記,不但能讓我們獲得更深的體悟,也能為後人後人早點指出一條明路。

專業的原則與追求

如同故事闡述,再厲害的程式設計師,只有一個人的話,力量總是有限。團隊合作最終仍是許多不擅長溝通與社交的程式設計師終須面對的課題,但就算再怎麼開朗的程式設計師,在這有形又無形的領域中,該如何合作可能也有點茫然。

那我們該如何像是建造巴別塔的工匠,有志一同的建造出心中的理想呢?統一的語言,是聖經裡給出的答覆。一但一個團隊沒有統一的風格,或是大家不願意為整個團隊著想,盡心盡力的把自己的事情做好,那大概就會像是失去共同語言的巴別塔工匠們,在偉大的夢想也嘎然而止。

如同傳統行業的工匠,在其專業技藝裡,總是會有許多身為該職業必須堅守的原則與哲學。那身為程式設計師的我們該追求什麼?又該遵守什麼?在寫出會動的程式之於,我們又該對什麼精益求精,做出可維護、讓旁人得以暸解並合作的程式碼呢?

透過人月神話[^3],我們暸解程式設計師不是越多越好,讓程式設計師合力建構一個既宏大、又符合需求、且能維護的專案一直是艱難的題目。離該書出版的時候也過了四十多年,軟體工程領域經過這麼多年後,身處現代的我們又有什麼方法可以降低團隊合作的門檻,讓合作這件事變得簡單且愉快?

在本系列文,敝人將嘗試將一些聽起來既沒那麼重要[^4]又零散的各個原則與方法,編織成一條道路。或許我沒辦法講得很深,也沒辦法在荒地中鋪設出如日本那般品質的柏油路,至少有個道路的雛形,讓有想要了解這塊知識的夥伴有跡可循,在入門後能夠探索出屬於自己的軟體工程知道。

大概會講述些什麼?

剩下的二十幾天,我會從下面的清單中逐一講述,因為可以講得實在太多,或許到鐵人賽結束時,我仍只能講述其中一小部分,但我仍會嘗試以導讀的方式將每個項目都帶過一遍。

基本修養

  • Issue description
  • Coding Standard
  • Lint
  • Clean code
  • Comment

透過版控的合作

  • Git commit timing
  • Git commit messages
  • Git rebase
  • Git Flow
  • Github Flow

團隊合作

  • Code Review
  • Piar Programming
  • Development Flows

軟體品質與自動化

  • Unit Test
  • Integration Test
  • Regression Test
  • Continuous Integration
  • Continuous Delivery
  • Continuous Deployment

巨獸攻略

  • Legacy system
  • Refactor

上述這份綱要只是一個參考,我不一定會按照一個項目一篇文的形式講述,也不一定會全講,或只講述裡面有的項目。

結語

榨乾了想像力講了一篇奇怪又抽象的故事,又列了一個個待寫事項,我想我也是踏上了不歸路。對我來說,目前最大的挑戰正式鐵人賽的標桿,三十天不斷文吧(抖)。

[^1]: 邊境之地(Far Lands),取自 Minecraft 中對世界盡頭的描述。
[^2]: 戲稱,源自軟體工程的口語簡稱,軟工。
[^3]: 指的是《人月神話:軟體專案管理之道》書中所提到的內容,該書雖然出版於 1975 年,但仍是軟體工程領域的聖經之一。
[^4]: 事實上都很重要,只是這些原則和方法最容易在現實環境中被犧牲、忽略。


下一篇
Issue Description (1)
系列文
淺談軟體開發與工程的基本追求5

尚未有邦友留言

立即登入留言