鄙人的 CS 領域發展之路

自從國中起對 CS 領域感興趣,利用 Visual Basic 6.0(被時代淘汰的東西)寫一些啓蒙的程式、小遊戲。

基本上本文會着重介紹:演算法競賽、系統網路管理。


時間線劃分

這裏粗淺介紹鄙人經驗,會在下方領域劃分的區塊詳細撰寫。

國中

由於家裏是住在比較鄉下,本身見識也不足,因此不懂得尋求什麼資源。 由於當初見識很粗淺,雖然知道所謂 C++、Java,但也只是知其然不知其所以然。

不明白為什麼這些語言會成為主流,淘汰掉我使用的 VB6。

那時候的我順便了學習了 C++ 和 Python 的基礎語法,但進階的 Library 和語言特性一竅不通

高中

直到高一,偶然的發現了 APCS 程式鑑定,我當時就去報考了交大考場,並且使用了我不熟悉的 Python,在第一次考試中,拿下了實作 4 觀念 4 的成績。

但我那時候對於自己特別自信,我覺得自己寫的東西絕對沒有錯誤,然而後來才知道,的確可能是正確的,但是是因爲超時(TLE),才導致沒拿到分數,而掉到 4 級。

後來是直到了高三,才直到原來校內有資訊比賽,去參加了,結果在校內勉強拿了優勝;直到這個時候我才對競技程式、演算法比賽有了正式的概念,在此之前我不是不知道,只是沒有很有概念,甚至我高二就有刷個一些 Leetcode 題目。

大學

上了大學,拿了個勉勉強強的成績,然後就半退役了(儘管我認爲我從來沒有真的很認真的在這個領域上面)。

我認爲我最感興趣的領域還是專案的開發,直到上了大學,我遇到了我感興趣的第二個領域:維運。

我替了某單位引入了 RADIUS 作爲網路設備 AAA Server、實作網路架構重構以及使用 Ansible(CaC 工具)來自動化管理網路設備……等衆多內容。

還替了某單位研究了 Prometheus + Grafana 的資源檢測系統,以及 Elastic Stack 的基本使用教學外加 Python Bot 自動通知系統。

做這些維運的 PoC 會讓我感到快樂,注意,是 PoC,而不是日復一日的繁瑣工作。

我喜歡腦中產生一個想法,然後把它實作出來,不斷的優化它,用各種方式讓我可以以最簡單的方式做到最好。 這其實和寫 Project 很像,我愛上了這種感覺。

因此我喜歡系統、網路維運,我甚至有自己的 ASN 和 IP Prefix。但我其實不是個 BGP Player,因爲對我而言那個不有趣,那個不斷設定各種 BGP 設定、Tunnel、RouteMap,以及調整 Community、調整各種路由,對有些人是很有吸引力,但對我而言我不太感冒(但我不介意免費的 Transit 和 Peering,xD)。


領域劃分

這邊會介紹,我個人是推薦新手要如何發展這條路的。

程式語言與基本程式邏輯

這部分我推薦去看 w3schools,上面有針對於各個語言的基本教材。

以 C++ 爲例子,我會建議各位詳細閱讀並且學習上面的:

接下來再去各 OJ 寫最簡單且不包含數學的題目:

不過我本人以上均沒有體驗過,上述結果是根據調查而來的。

演算法

這邊我推薦中正大學退休教授吳邦一老師撰寫的 AP325 講義,出於方便,我將它放在我網站的爬蟲禁區,聲明:

這篇文章有一些先備需求:

  1. 基本上是爲了 C++ 準備,當然學會其它語言也可以從中學到演算法知識,不過這會導致閱讀範例程式的困難。
  2. 他需要基本的實作能力,你要能撰寫出基本的程式碼以及瞭解與之相對應的程式邏輯。

並且需要大量的練習,這邊我推薦:

當差不多摸到入門門檻之後,你就會發現演算法和高中競賽數學一樣,也有分類,高中數學分爲 A、C、G、N,而演算法競賽分的就更多了:DP、Math、Data Structure、Graph……,並且一種題目可能是多種技巧的組合,甚至有發生過一個題目就是一篇論文的情況。

因此我們如果想要真的強化自己的演算法能力,就必須要學習各種知識,我也仍在這部分繼續學習,比如你可以看到我撰寫的組合筆記等。

進階的學習資料,我會推薦可以看 OI-Wiki 的目錄,可能是貢獻者還是不足,它的內容量還是不足。 但是看看目錄挺不錯的,你可以清楚的知道哪些東西你還沒碰過,唯一的缺點可能是因爲它是大陸平臺,因此和臺灣人溝通時候有時候會發生代溝。

營隊、鑑定

鑑定:

營隊:

演算法比賽

我會推薦參與的演算法比賽(包括但不限於):

系統網路維運

這部分我們稱爲 Infrastructure(基礎建設),或是簡稱 infra。

如果是完全沒有概念者,我會推薦你先對網路有一些概念,包括但不限於:

以及選擇一套你喜歡的系統,包括但不限於:

那爲什麼我們當下(2024)主要會選擇 Linux?

個人慣用 Debian,目前最新版本號是 12,名稱 Bookworm。

基本上我會推薦你找一臺空閒主機,安裝 Proxmox VE,然後你就可以在上面開很多台虛擬機(VM),然後每臺 VM 都可以各司其職,互不影響,你可以在你的私有網路內建設服務、測試,以及玩任何你想要玩的東西。

如交大的網路管理課程,它需要建設 Router、DNS、Mail、LDAP(除了 Router 都還要有 HA 節點),因此合理情況下會開 7 台 VM,極端情況下也會開至少 3 台。

如何建立基本的系統維運能力

個人覺得可以去參考交大的 NASA 系列課程:

基本上只需要把它的講義都讀過一次,作業做過一次,我想最基本的系統操作能力就沒問題了。

包括但不限於:

比較可惜的事情是,這兩門課程還在使用 FreeBSD 作爲教案,甚至在數年前,他們都還是作業需求之一。

而且這兩門課程可以給你建立很多其它的觀念,比如說 PKI、Driver Programming、IDS 和 IPS……等,每年不定的會提供一些補充教材。

如何建立更進階的系統維運能力

進步往往取決於需求,現在的需求基本上就是往:

所以以現在而言,最紅的是 Kubernetes 和 Cloud,都是提供了高 HA 和更低的營運成本。

Cloud 方面,可以去嘗試使用 GKE、GCP、AWS Cloud 等工具。甚至可以去研究 Serverless Application 是如何運作的。

Kubernetes 方面,可以大幅下降你可能的 Downtime,並且大幅降低你的營運成本,在妥善配置的情況下,哪怕你只有 1 台 Worker 節點,要進行版本更新也可以做到 0 Downtime。

然後也不能只是 infra,你可能也要研究 application 與 infra 的關係。

如果你還是和我一樣喜歡傳統在機器上面安裝、操作的快感,可以研究 DevOps 、系統安全性和系統架構。

最常見的 DevOps 需求:測試、部署、營運、監控,你可能就可以使用 Jenkins(測試、部署)、Ansible(部署、營運),以及各種監控系統(包括資源監控系統、流量監控系統、日誌監控系統等)等的工具。

除此之外,現在流行 IaC 和 CaC,前者最著名的工具就是 Terraform,後者則有 Ansible、Chef、Puppet 等衆多選擇。他們都可以加快你部署、配置的效率。

如何建立基本的網路維運能力

這點我沒有好的方法,因爲我是靠着配置學校網路和配置 HomeLab 養成的能力。

如果捨得花錢,可以買一本 CCNP 的書,然後搭配 Packet Tracer(只能模擬 Cisco 的老款機型)。或是有能耐的可以開一臺 VM,配置 EVE—NG 或是 PNETLAB 來實現網路拓撲模擬(可以模擬各種廠牌新款機型的系統),進行測試。

如何不用花錢的當一個 BGP Player

如果你喜歡設定各種 BGP 設定、Tunnel、RouteMap,以及調整 Community、調整各種路由,再研究如何提高網路可靠性和網路速度,降低網路延遲,那麼你可以當一個 BGP Player;然而 ASN 要錢,IP Prefix 要錢,IP Transit 和有用的 Peering 要很多錢,如何在不花錢的情況下體驗呢?

參見:DN42

證照、鑑定

網路方面,包括但不限於:

系統方面,僅列舉其中一兩個:

但其實這些證書基本上都是在認證一些觀念和你是否會使用他們家的產品,如 Cisco 的 CCNP,基本上就在考你會不會用 IOS(Cisco 的 Switch OS)。