Star Telescope——繁星望遠鏡開發心路歷程

Star Telescope 繁星望遠鏡 Github 頁面:大學的繁星入學需要參照往年資料才能做出最佳的志願填選,但是無論是紙本手翻或是網頁點選都花費較多的時間,因此繁星望遠鏡是一個縮短加速這個過程的程式,能夠用較少的時間來得到更完整的資訊。

緣起

繁星上榜後的高三下學期,我因為想找點樂子而開始發想一些有意義的事。在那個時候和我一起填繁星的同學們,有不少人因為要比對多間學校而將紫色本子(一種可以看歷年繁星門檻的工具書)上貼滿標籤紙,以方便在向班導諮詢時能夠翻到想要的校系。雖然說當時就已經有 University TW 這個網站可以查詢一些簡單的紀錄,但效率上還是比翻閱紙本還慢不少,於是我便想要寫一個程式來代替紙本與網頁查詢。

參考時間線

第一年

  • 2022/4/3 v1.0 上線,使用了安裝檔
  • 2022/4/8 v1.0.1 調整視窗大小,改成免安裝檔
  • 2022/4/11 v1.1.0 新增了最愛清單功能
  • 2022/4/14 v1.1.1 為 macOS 提供了 DMG
  • 2022/4/28 v1.2.0 新增多重檢視,可以一次看到多個校系的錄取需求
  • 2022/7/25 v1.2.1 新增五標篩選以及 105 至 107 年的數據
  • 2023/1/5 v1.2.2 更新 112 年門檻,這時突然找不到舊的檔案
  • 2023/2/22 v1.2.3 重構版本,但因為錯誤嚴重後來下版了
  • 2023/2/27 v1.2.3.1 hotfix
  • 2023/2/28 v1.2.4 修正一些錯誤

第二年

  • 2023/4/2 v1.2.5 更新 112 年結果,但因為亂碼而下版
  • 2023/7/10 v1.2.5.1 使用 UTF-8 以及使用 Noto Sans 字體,移除隨附 JRE
  • 2023/7/10 v1.2.5.2 修正第一階段和第二階段相同的問題
  • 2023/7/17 v1.3.0-beta1 重構,記取上次教訓而使用 beta
  • 2023/7/17 v1.3.0-beta2 hotfix 亂碼
  • 2023/10/22 v1.3.1 將資料部分模組化並獨立為 StarAPI
  • 2023/11/6 v1.4.0 更新 113 年門檻,即將停止維護
  • 2024/3/29 v1.4.1 更新 113 年結果
  • 2024/3/29 封存

從零到有

當時我熟悉的程式語言只有 Java,加上我只有 Windows 電腦,因此便選擇了 Java 做為開發語言在 Windows 平台上開發,可以看出選擇 Java 的原因顯然不是看中 Java 的跨平台性。我選擇 JavaFX 框架,參考一個簡單的 Gitbook 教學,沒有什麼軟體工程概念的我邊看教學邊做,使用 Scene Builder 依樣畫葫蘆做出了 GUI。

這個 Gitbook 教學的文字令我印象深刻,他讀起來的感覺非常詭異,它是繁體中文但是讀起來卻缺少中文的語感並且夾雜了中國用語。我想到的最貼切形容就是透過機器翻譯,從英文先翻譯成簡體中文再翻譯成繁體中文。現在我已經找不到這個教學了。

當時的 GUI 還只是一些假文字,不是真正的資料。我用 Python 來生成資料,先用 Beautiful Soup 4 抓下大考中心公布的資料,但這些資料都是 PDF 格式,非常不容易處理,第八類以及需要術科考試的科系的表格甚至和一般科系不同。為了簡單,我只處理一般科系,其他科系都被我捨棄了。接著需要解析這些 PDF,我用 PDF Plumber 套件抓出 PDF 中的表格,再把它們全部轉為 CSV 格式供程式讀取。

最後,再花一些時間讓程式讀取 CSV 並顯示之後,一個可以用的應用程式終於完成了。

v1.0 發布

可以用的應用程式是完成了,但還有一個問題,那就是要如何將這個應用程式送到使用者手中?

Java 和其他語言不同,Java 的程式需要運行在虛擬機 JVM 上,要求運行 Java 程式的電腦都要安裝 Java。這對於預裝有 Java 的 Linux 與 macOS 也許不成問題,但是大多數非資訊背景的電腦使用者都是使用 Windows,而 Windows 沒有預裝 Java。

要求使用者安裝 Java 是一件很困難的事,使用者不見得知道如何安裝,也可能因為要手動安裝而乾脆不用我的程式了。因此我參考 Minecraft 近年來的做法,將 JRE(包含了 JVM)和應用程式捆綁在一起讓使用者下載,這是最簡單的解決方法,也能避免 Java 版本的問題,缺點則是產生較大的檔案。

如果你是 Minecraft 老玩家,想必你一定對 Java 8 的下載頁面不陌生。當時的 Minecraft 使用 Java 8,玩家一定要下載 Java 才能遊玩 Minecraft,甚至於 Java 的說明頁面中有我要到哪裡可取得 Minecraft?這個頁面。後來 Minecraft 使用了更高版本的 Java,並和遊戲本體捆綁下載,這才不需要玩家手動下載 Java。

把 JRE 和應用程式捆綁在一起後,需要一個腳本來讓電腦使用該 JRE,使用腳本開啟程式對於一般使用者也是陌生領域。於是我研究了各種方法,將程式包裝成 exe 檔,終於讓零知識的使用者可以使用。

當時我還為它弄了一個安裝軟體,就是可以讓你選擇安裝位置的那種安裝軟體,不過因為安裝軟體的格式 exe 與 msi 容易被瀏覽器當作病毒擋下來,所以在下個版本就沒有這麼做了。

於是,在 2022/4/3 這天,我在 Github 創建 Repository,上傳第一個提交,公開發佈了 1.0 版本。

1.0 版本實際畫面: 1.0 版本實際畫面

v1.1 最愛清單

我在 1.1 版本時新增了最愛清單的功能,這個功能顯而易見的是一開始最想要的功能,因為想要讓使用者快速找到自己想要的科系。為了實作這個功能,需要同步總覽與最愛清單的選擇科系,這也是產生最多 Bug 的地方。

1.1 版本實際畫面: 1.1 版本實際畫面

之後我有了 MacBook 電腦,並在 1.1.1 版本中為 macOS 發布了 DMG 安裝檔,從此之後開發工作轉移至 MacBook 上進行。

在版本 1.1.2 之前,在五標門檻的那一欄中,自然與社會的標準是對調的狀態,幸好及早發現,才能在 1.1.1 發布的四天後發布 1.1.2 修正問題。

v1.2 繁星望遠鏡

1.2 版本將程式名稱從「繁星推薦」改為「繁星望遠鏡」,希望使用者能夠藉由這個望遠鏡看見他們嚮往的那些繁星。

在這個版本中也新增了多重檢視,當時沒有想到一個好的功能名,因為它能夠同時看到多個科系的歷史紀錄,所以才叫多重檢視。這是這個程式的核心功能之一,是能夠取代紙本查詢的關鍵性功能,可以一口氣看四年內的五標門檻、學業成績百分比以及招收人數。

1.2.1 版又推出了我沒想到能夠完成的篩選,使用者可以根據自己的成績來篩選掉不符合的科系,直接跳過沒辦法填的科系。如果還不知道成績的話,也可以觀察五標對可以填的科系有什麼影響,例如英文均標會被大多數頂大科系拒之門外。

大學的寒假放得比較早,於是我趁這段時間時間來更新 112 年的門檻標準,發布於 1.2.2 版本。但當時我找不到以前的爬蟲與解析程式,於是手動重新寫了一個,並和大考中心防爬蟲的網站鬥智鬥勇。後來寫完了準備要發布時,我在很正常的地方找到了最初的那個爬蟲程式,——。

希望這樣的標點符號用法能夠傳達我的心情。

1.2.1 版本實際畫面,可以看見多重檢視畫面以及篩選工具。圖中不符合使用者體驗的部分是右方表格的科系放在最愛清單中,需要切換為最愛清單的標籤才可以對上科系。 1.2.1 版本實際畫面

下一屆的學弟妹考完學測後,我在二二八連假這段期間進行了程式碼的重構,並在學弟妹的反饋中修正了不少的錯誤,陸續發佈 1.2.3 及 1.2.4。

1.2.3 版本進行重構、使用 Maven 以及更換 Java 版本,實際發布後存在大量問題,後來就下版了,最後發布 1.2.3.1 修正這些問題。

到了七月,我在 1.2.5 版中更新了 112 年的篩選結果,同時因為龜毛的心態,把隨附的 JRE 移除而將檔案縮小至原本的 30%。那時做出這個決定是因為發現發布的過程愈來愈不容易,特別是在大學發布的版本,由於我沒辦法隨手取得 Windows 電腦而不容易同步發布 Windows 版本的程式。於是我毅然決然統一發布可執行 JAR 檔,提供非常簡單的教學讓使用者自行下載 Java。

1.2.5 版本修改了字體,不過發布後產生亂碼問題,便發布 1.2.5.1 修正問題。隨後又發現第一階段與第二階段的結果顯示成相同的資料,緊急修正並發布 1.2.5.2。

v1.3 序列化更新

112 年暑假,我偶然發現了 Json 能夠讓物件序列化成同一格式,並且能夠容易地反序列化。1.3 版本中我將所有 CSV 科系資料轉換成 Json,再用 Google 開源的 Gson 讀取,同時也把最愛清單的科系全部以 Json 儲存。

有鑒於取得資料的程式碼逐漸與 UI 耦合,於是在 1.3.1 版本中我將取得資料的部分獨立為 StarAPI。這大多是為了個人的樂趣而做的,把許多細節抽象化之後,我得到了不少的成就感。

v1.4 最終版本

1.4 版本推出於 112 年 11 月,當時知道大考中心公布簡章後,馬上就著手下載資料並更新程式,由於有 1.3 的模組化,這過程變得容易不少。不過這時的我已經接受了不少大學課程的訓練,清楚了解到這個專案維護難度偏高,於是當時在 README 中標註將於更新 113 篩選結果後封存。

繁星放榜之後,1.4.1 版本於 112/3/29 發布,在更新 113 年的繁星放榜結果並修正一些錯誤之後,正式在 Github 上把這個專案封存。

心得

回顧這段開發過程,我認為我的高中班導是讓種子發芽的關鍵養分。當初我做出 1.0 版程式後,馬上拿給班導試用,班導認為這是很有意思的程式,並提出了不少功能要求,讓我能夠讓這個程式更加豐富。此外,班導也提出改名、添加啟動動畫甚至是販售軟體的想法,不過到最後我也就只有把程式改名為「繁星望遠鏡」而已,販售軟體一部份是因為可能涉及到法律問題所以我就沒有做了。

開發過程中可以看到一個沒有受過專業訓練的新手會做出什麼事,包括了版本號隨便訂、沒有自動測試以及各種不明所以的 Commit Message。還有一個很不好的習慣就是倉促地發布版本,應該要經過仔細測試後再發布,我發現問題時常常都是在發布的三分鐘後,不得已只能再上傳新版本。

不明所以的 Commit Message:不明所以的 Commit Message

如果重來一次我不會選擇 JavaFX,但如果還是 JavaFX 的話,我會想要研究 JavaFX 如何自動測試以及自動部署,簡化這些手動操作的流程;另外我會想要試看看 SQLite,相較於 Json 還多了更多篩選及查詢的功能,可能會是不錯的 Data Source。