Minecraft 如何成為我的啟蒙老師


TL;DR 我從一個Minecraft相關的專案,學到了網絡編程,C#,git,Github,開源專案,容易維護的程式碼,更多的英文,從井底之蛙閉門造車變成眼界開闊、勇於探索的翱翔雄鷹。

Back in the days,我從小學開始就接觸到Minecraft這款像素風格遊戲,不時跟好友見面就會拿出來一起在像素世界裡無所事事,閒時也會下載別人做的地圖來遊玩消磨時間,可以說是Minecraft陪著我長大。但這裡要說的並不是Minecraft遊戲本身如何教懂我什麼,而是遊玩這款遊戲背後的動力造就了今天的我。

有玩過Minecraft的人應該都知道,Minecraft除了單人世界遊玩,還可以加入線上伺服器與其他玩家一起玩。在高中時期我主要就是在線上伺服器遊玩原味Minecraft,與其他玩家一起在伺服器「養老」。當時我非常熱衷於興建紅石掛機農場,從怪物農場到自動木頭/石頭都有。以防你不知道掛機是什麼意思,就是開著遊戲讓人物在保持在伺服器線上,令人物附近的紅石機器能夠運作。於是就引申出可以長時間在線上掛機的需求。

眾所周知Minecraft是一款3D遊戲,運行需要消耗不少的電腦資源,如果長期24小時打開遊戲掛機會浪費很多資源,於是網絡上就有一些開源程式專案用來專門在Minecraft伺服器上掛機。那些程式專案大多數都是一個簡單的命令行,沒有複雜的3D畫面計算,消耗資源極少。那時候我也在Github下載了一個用來掛機。

說這麼多終於要到重點了,那個Minecraft掛機程式雖然能掛機,但也只限於掛機,再進階的功能,例如讓人物攻擊怪物,放置方塊,進食等遊戲功能都沒有。要知道那個時候我已經有一定基礎的編程技術,於是動力(Minecraft)跟目標(進階掛機功能)一拍即合,我下載了原始碼,開始研究如何為掛機程式加上進階功能。

雖然想法很好,但老實說那個時候的我只懂php/html/js和一點點python,平常只寫點小程式,也不懂開源專案,不會用Github。

為了寫出對應的功能,我從零開始研究了Minecraft的網絡協定,人物攻擊需要傳送什麼網絡封包給伺服器,封包是如何組成的,裡面有什麼資料結構。原來需要知道怪物的實體ID,所以需要去解析伺服器發過來關於怪物資料的封包,封包的資料結構要怎麼正確讀取。

於是我學懂了網絡程式是如何互相溝通。

學習完Minecraft的網絡協定,就要開始對程式碼動手了。花了幾天的時間就成功令人物可以攻擊怪物。不過因為是第一次在大型專案寫程式碼,我那一點點的php跟python經驗,寫出來的程式完全就是一坨屎。

然後我就把那坨東西發了個Pull Request,那是我第一次用Github跟git,也是第一次用正式英文跟外國人溝通。作者收到我那坨Pull Request之後也表示有點驚訝,沒想到有人會造這樣能正常運作的進階功能。但很明顯,那坨東西是不可能直接merge進主分支的,作者可能看我很有心,於是耐心地在Github上每行程式碼留言應該怎麼寫比較好。如果那位作者沒有耐心指導,而是直接無情關掉PR,那故事可能就到此為止,所以我內心很感激那位素未謀面的大佬。

到這裡我學會了C#,git和Github,還有用英文溝通的機會。

經過幾輪整改,最終我的PR被正式合併,但我對Minecraft的熱情並沒有下降,後面也不時繼續開發其他進階功能,一直研究Minecraft網絡協定,然後運用跟作者學到的各種程式技巧繼續開發掛機程式,繼續發PR。我也對使用git和Github越來越上手。

直到有一天,作者表示欣賞我對專案的貢獻和持續高質量的程式碼,決定給我更高的Github repository權限,讓我可以直接合併PR,那一刻的成就感真的無與倫比。

正是因為這個專案,我學到了網絡編程,C#,git,Github,開源專案,容易維護的程式碼,更多的英文,從井底之蛙閉門造車變成眼界開闊、勇於探索的翱翔雄鷹。

其實標題是不是改成《素未謀面的大佬如何成為我的啟蒙老師》比較好╰( ̄ω ̄o)


發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *