這篇文章是這個部落格搭建起來以後寫的第一篇文章,如果我未來真的成功養成持續寫文章產出內容的習慣,持續寫了很久的文章到這個部落格,甚至文章寫的越來越好,讓這個部落格的流量起來的話,那對未來的某一天而言,這個第一篇文章應該是一個很有意義的文章。
對於這樣一個(可能的)很有意義的文章,應該要寫些什麼呢?想了想,不如就來聊聊我人生打的第一行程式碼吧,感覺挺有儀式感的,也很呼應這個「第一篇文章」的主題。
一切從遊戲開始說起
回想起小時候我為什麼會接觸程式設計,那就要從一個廣為人知的遊戲說起了 - Minecraft。那時候應該是我國小五年級左右的時候,我弟(對,我有一個相差四歲的弟弟)和我推薦了這款遊戲,在我搞清楚這是一個怎麼樣的遊戲以後,真的是非常興奮,居然有一個可以自己用方塊隨便蓋東西的遊戲 ... 我和我弟那天花了好久時間在蓋雲霄飛車。
玩了一陣子以後,我發現這個遊戲居然還有多人連線的玩法。和一般的線上遊戲不一樣,Minecraft 並沒有一個官方的伺服器讓大家選擇,因此想要多人連線和別人在同個世界一起蓋房子的話,就必須找到一個別人架設的伺服器才行。在這個遊戲的巔峰時期,台灣估計同時也有上百個大大小小的伺服器吧,從 3 ~ 5 個好友自己搭的小伺服器到 1000 個玩家同時在線的超大型伺服器都有。
後來玩了大概一兩年吧,在各個不同的伺服器定居過,也交到了很多網路上的朋友,也發現網路是一個很殘酷的地方(還記得有次不知道什麼原因結果被線上的其他玩家霸凌,結果在電腦前哭了出來,回想起來有點蠢)。
尤其是和一般的線上遊戲不一樣,線上遊戲一般都是有一個遊戲營運廠商來維護,然後玩家之間並沒有太大的差別,但 Minecraft 的私人伺服器就不同了,架設伺服器的那個人就是神或皇帝一般的存在,和他關係很好的其他玩家就是擁有特權一般的存在,不小心說錯話可能你蓋了兩個月的房子就會瞬間消失,或是挖了很久的鑽石直接被搶走,甚至更狠的直接把你的帳號 Ban (封鎖) 掉。
搭建自己的世界
也因為如此,誰不想當那個權利最大的人呢?這可比蓋房子或挖鑽石好玩多了。所以我開始嘗試搭建一個自己的 Minecraft 伺服器。大概花了半天的時間在 Google 上找了各種教學文章,終於把一個伺服器給跑起來了,而且那時候沒有任何網路、域名、NAT、IP 的概念,就是單純照著網路上的教學把大家加到 Hamachi (一個提供虛擬的局域網服務的軟體)然後再連線進來,非常原始 XD
後來我把伺服器的連線方式發到了 巴哈姆特 Minecraft 交流版,然後等了幾分鐘之後終於有一個陌生人進到了我的伺服器,那個時候我簡直快要喜極而泣了。而且沒想到我嘗試架設伺服器的第一天就累積到了 20 個線上玩家一起玩,那個時候想或許我真的有這方面的天份也說不定。
但很快我就發現到,事情並沒有我想的那麼簡單,如果想要讓伺服器有更多的玩家一起玩,我必須幫他們營造一個舒適有趣的遊戲環境,而當玩家數量愈來愈多的時候,營造舒適有趣的遊戲環境也是一個愈來愈難的事情。
加入一些技術手段
好險 Minecraft 伺服器提供了一種插件 (Plugin) 的機制,插件可以改變原有的遊戲規則,在原始遊戲的基礎上加入額外的系統,這就可以幫助我們在規模愈來愈大的情況下維持伺服器的品質了,比如說:
我可以用權限插件規定每個玩家擁有什麼權限,因此就可以避免玩家之間惡意搶奪資源導致遊戲體驗被破壞的問題。也可以用 RPG 插件讓玩家選擇自己的職業,選擇不同的職業以後可以獲得不同的能力,把原本單純蓋房子、挖礦、種田的遊戲變成一個 MMORPG 角色扮演遊戲。
上面說的這兩個插件都是很多伺服器會裝的插件,而這些插件都是由網路上的插件作者開發以後公開在網路上讓大家下載使用的。
我的第一行程式碼
用了一陣子網路上公開的免費插件以後,發現伺服器的規模發展遇到了瓶頸,人數卡在一定的規模 (大概同時 80 ~ 100 人在線) 就沒辦法再繼續擴大了,而原因正是因為,我的伺服器能玩到的內容,其他伺服器也能玩到,因為用的都是一樣的插件!所以為了突破這個瓶頸,我開始上網學如何開發 Minecraft 伺服器的插件。
Minecraft 本身是用 Java 寫的,他的伺服器和伺服器的插件自然也都是用 Java 寫的,所以我的第一行程式碼就這樣寫出來了,那就是幫自己的 Minecraft 伺服器實現一個其他地方玩不到的專屬系統,這個時候我大概是國二左右。
SMD 是我當年架設的伺服器的名字,並且因為開了三次伺服器所以每次都有不同的名字,例如國中開的叫做 SMD 伺服器,國中升高中的暑假開了 SMD II,然後高中畢業的暑假又開了一次 SMD:Kingdoms,可以在 這個巴哈姆特文章 看 SMD:Kingdoms 的宣傳文章。
當時學用 Java 寫 Minecraft 插件對我後面的生涯規劃有很深遠的影響,因為已經有一定程度的基本功了,當其他人從頭開始學 C / C++ 的時候我基本上只要重新理解一下語法就好。
甚至也讓我熟悉了很多軟體開發的實踐概念(感謝當時願意花時間教我這個小屁孩的工程師網友們XD),比如我們的插件需要將玩家的資料保存到資料庫裡,避免伺服器關掉之後資料就沒了。或是開發註冊登入系統的時候,要先將玩家輸入的密碼經過一層非對稱加密才能存到資料庫,而不是直接存明文 ...
今天的我
即使不說為了開發 Minecraft 插件而學的 Java,我想對小時候的我而言,經營管理一個如此大型的遊戲伺服器,同時兼任營運管理員、行銷策劃、工程師 ... 多個身分,也讓當時的我對於「動手實現一個產品」有更紮實的基礎,也讓我因此走上產品設計和軟體開發這個方向吧。
也因為我比別人早了一些學會了程式語言,在其他同學剛開始學的時候,我也很樂意提供他們幫助,或許這也讓我養成了幫助別人的習慣。即時是現在我也會花一些時間投入在推廣開發技術的路上,例如學生開發社群 Chief Noob,或是這個部落格的其他教學文章等等。