博客 / 詳情

返回

大一技術成長覆盤:課程、競賽與開源之旅

本文首發於:我的個人博客

大一學年即將結束,坐在圖書館回顧這一年,從對計算機科學的懵懂好奇到如今能獨立完成開源貢獻,這段旅程充滿了挑戰與驚喜。今天,我想分享這一年在技術領域的探索與成長,希望能給同路人一些啓發。

我將會從課程學習、課外參加的活動以及其他技術細節幾個方面分別聊聊我的思考。

課程學習

大一暑假通過學校考試,我選擇直接跳過了基礎課程,所以我大學的計算機課程是從計算機組成原理開始的。這門課程知識跨度很大,既有對於 C/C++ 這種高級語言內存管理思路的講解,也有對於彙編語言乃至 CPU 電路等更底層原理的分析,總體上還是很有挑戰性也很有趣的。這門課讓我第一次真正理解了從高級語言到硬件執行的完整鏈條,那種“原來計算機是這樣工作的!”的頓悟感令人難忘。

這門課程一項令我印象比較深刻的實驗是在模擬軟件中設計一個電路,可以使 CPU 能夠額外支持一種雙精度加法命令,單週期完成雙精度加法運算。這個任務本身其實難度不大,選取合適的邏輯門組合,處理好 flags 就可以比較輕鬆地完成,但關鍵難點在於拓展指令集後需要對寄存器、ALSU 等多個不同位置進行同步修改,需要十分細心才能將整個系統邏輯梳理暢通。

此外,上學期我在選取的一門物理課中鍛鍊了一下寫 Mathematica 的能力,見到了不少之前從未用過的命令和技巧。

下學期,我選了門數據科學入門課程。由於高中的時候做了很多相關工作,這門課程介紹的許多概念之前就接觸過,總得來説我感覺難度不算太大。這門課程的主要特色在於介紹了很多數據科學領域算法的數學原理,做了些比較複雜的數學推導,這讓我對於線性代數等數學工具有了新的認識。這門課程的實驗主要任務就是把課上講的數學原理轉化成程序語言,但同時也能看到教授在引導大家思考如何用更科學合理的方式去組織架構自己的代碼,如何將複雜功能拆分成易讀易維護的函數和類的組合,如何在實現算法時儘可能降低時間複雜度,總之收穫還是很大的。

這門課程的期末大作業其實只是要求選取課程中講到的兩三種算法應用在一個學生選取的數據集上,但我和同組的同學商量了一下主動加了點難度,決定探索一下業界結構化數據監督學習常用的 XGBoost 和 LightGBM 算法。我們也嘗試參與了 Kaggle 上的一個 Playground 級別的比賽,儘管首次參賽成績很一般,但也通過社區學習了不少他人的特徵工程思路,開闊了視野。

課程以外的活動

除了上課,這一學年中我也利用課餘時間參與了一些相關活動,收穫了不少新知識、新技能、新感悟。

組隊參加了周邊幾所學校聯合舉辦的 Hackathon,並獲得了不錯的成績。從上學期瞭解到這一比賽後我就開始着手組建隊伍,同時開始儲備項目想法和相關技術,這些準備工作對於獲得最終的結果是有很大幫助的。

產品想法其實很常規,就是設計一個校園活動信息聚合網站,算不得什麼驚世駭俗的點子;但是我們在產品內整合了一個通過 Ollama (一個本地運行大模型的工具) 部署的 DeepSeek-7B 模型,並藉助大預言模型實現了活動信息獲取的自動化。儘管這個 AI 功能雖然只是最低限度的整合,但這一項亮點還是獲得了評委的高度評價。此外,我主要使用的技術棧其實就是 Django 全棧,主要原因是我對 Python 最熟悉且整合 AI 比較方便。這個技術雖然在業界基本被淘汰了,但對於 Hackathon 這種需要極快速度完成原型設計、展示核心功能的場景下還是很好用的。

這個活動給我的最大啓發,就是平時還是要多動手實踐。通過 Ollama 在本地部署模型這個技術之前純粹是出於興趣探索了一下,也是出於好奇研究了 Ollama API 的調用文檔,沒想到這些平時無心的積累在這種極短時間週期的 Hackathon 中起到很大的幫助,給我在短時間內實現自己想要的功能提供了信心和技術基礎。

學習了 rust 語言並初步參與了 Apache Datafusion 開源項目。如果説最開始學習 rust 純粹是賽博追時髦 (總不能是因為麪包蟹 logo 太可愛吧),那麼後來我這個 C++ 小白犯了各種內存管理錯誤被 Valgrind 反覆軍訓,這之後再學 Rust 就開始逐步理解這個語言為什麼被設計成這麼特殊的樣子了。

在學了一段時間 rust 感覺自己掌握了基本語法和概念後,我當即打算嘗試看一些開源項目,也通過這個機會開始學習如何參與到開源貢獻中。當時也是初生牛犢不怕虎,我直接選擇了 Apache Datafusion 這個比較熱門的 rust 數據庫項目,挑了個帶有 "good-first-issue" 標籤的問題就開始研究。研究了一段時間後發現雖然説整個項目代碼有幾十萬行,但是如果定位清楚問題根源後其實相關代碼不過幾百行,解決起來其實沒有想象中那麼難。我花了點時間研究清楚了社區合作的規則,提交了 PR 並最終合入代碼主分支。當我看到自己提交的代碼被合併進主分支時,那種為全球開發者使用的項目做出貢獻的成就感,是任何課程作業都無法比擬的。

其實我覺得 Fust 是一門非常適合開源協作的語言。一方面,Cargo 作為一種極其優秀的包管理工具,極大程度簡化了代碼環境配置的複雜度,新的開發者往往只需要幾步命令就可以讓項目跑起來,提交 pr 前為確保代碼質量跑的 nextest、fmt、clippy 等檢查工具鏈也非常好理解和操作;由於語言本身具備很強的類型系統和嚴格的生命週期檢查機制,只要寫的代碼能夠編譯、能通過各種測試,大概率就不容易出現一些隱藏錯誤,社區內的其他開發者往往只要審閲代碼邏輯準確後就非常樂意接受新手貢獻的代碼。這兩點基本可以確保我們在開始時不會卡在某個難點過不去,能幫助大家比較快速地開始做實際的貢獻並建立起信心。

參與了一個數據科學比賽,跟着大佬拿了個獎。今年三月參加了一個地區級的數據科學比賽,主要分析了一個房地產行業企業提供的海量數據中的趨勢。這個其實我自己的貢獻會相對小一些,主要還是跟着上學期計組課認識的一個大三學長見見世面。我負責的工作除了做了些 EDA 和數據清洗,還有就是寫了個腳本調用 API 將數據中的街道信息轉換成經緯度,使得數據更好進行分析和可視化。

其實這場比賽主要是大三學長完成的統計學模型對於最終獲獎起到了關鍵性作用。這場比賽給我的最大啓發,就是想要做好數據分析和數據解釋,必須學好數學,具備堅實的統計學基礎。我打算在未來幾年裏多選點統計學課程。

其他

上述這些算是完成的比較重要的工作,但除了這些還有一些零星的事務和感悟:

  • 梳理通順了自己的環境管理工具鏈。我在自己的 Windows 筆記本上通過 Scoop + WSL 這個組合實現了比較絲滑的各種代碼環境管理。此外,引入了 uv 這個工具管理 Python 項目(uv 是真的香);
  • 進一步優化了筆記系統。進入大學以後自學的時間更多,自學內容更廣更深,這時候就需要通過更系統化的筆記系統把信息沉澱下來,最終轉化成知識體系化為己用。這一年裏,我進一步優化了自己的筆記系統,將 Obsidian 電子筆記和手寫紙質筆記相結合,比起前一年信息向系統化知識轉化率大大提升;
  • 讀書,特別是讀毛選。除了學習研究技術問題,我還讀了不少政治、經濟、哲學方面的書。其中毛選雖已不是首次閲讀,這次讀來許多以前不太理解的問題茅塞頓開,並開始能夠逐步將實踐論、矛盾論等文章中描繪的馬克思主義基本原理應用在生活中;
  • 近期報名參與了騰訊組織的遠程支教,給一羣三年級的小朋友們聊聊人工智能。這是一段很有意思的體驗,把一個比較複雜的問題將給沒有任何前置知識的小朋友們這件事的難度,不見得比學習複雜技術本身更簡單。看到他們中不少同學眼睛發亮的樣子,我意識到技術傳播的樂趣。

我想比較值得一提的事情恐怕就是上面列舉的這一些了。一年過去,雖然説我的能力提升道路仍然任重道遠,但我想無論如何還是取得了一些成果和進步的。

這僅僅是我的起點,前方的技術海洋更加廣闊。如果你也對計算機科學充滿熱情,歡迎關注我,願與君共勉!

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.