鄙人的 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++ 爲例子,我會建議各位詳細閱讀並且學習上面的:
- C++ Tutorial
- C++ Function
- C++ Data Structure
- C++ How To
- C++ Examples(除去 Class/Objects 部分)
接下來再去各 OJ 寫最簡單且不包含數學的題目:
不過我本人以上均沒有體驗過,上述結果是根據調查而來的。
演算法
這邊我推薦中正大學退休教授吳邦一老師撰寫的 AP325 講義,出於方便,我將它放在我網站的爬蟲禁區,聲明:
- 此區塊並不會被正規搜尋引擎搜錄,因此不會增加我網站在搜尋引擎上的流量。
- 我未經過將之放至於我網站上的授權,這只是爲了課程方便與分享方便,因此留在我本地一份版本 v:1.3 (20211117) 的備份。
- 如果吳邦一老師本人認爲這侵犯到他的著作權,我會立即刪除此檔案。如果這侵犯到您的權益,我在此向您道歉。
- 我在此向您表示敬意。
這篇文章有一些先備需求:
- 基本上是爲了 C++ 準備,當然學會其它語言也可以從中學到演算法知識,不過這會導致閱讀範例程式的困難。
- 他需要基本的實作能力,你要能撰寫出基本的程式碼以及瞭解與之相對應的程式邏輯。
並且需要大量的練習,這邊我推薦:
- CSES Problem Set:包含大量各種分支的各種經典題型、演算法。
- Formosa OJ:陽明交大資工系的 OJ 系統,你可以選擇某位老師開選的演算法課程,並且在上面寫他出過的演算法作業,來體驗大學演算法課程難度。
- Codeforces:上面的題目都有標註難度,基本上從 800 到 3500 都有,你可以根據難度來挑選題目;也可以根據你現在想要練習的領域,例如 math 或是 greedy。而且由於上面搜錄的題目幾乎都是他不定期舉辦的比賽的題目,因此幾乎都有解答,所以不用擔心想了好幾天無果的題目會找不到解答。本平臺會不定期舉辦比賽,並且會對參賽者進行評級,最終調整參賽者的總和評分(Rating),有些比賽還會有獎金、獎品或是入圍實體賽的旅費補助。
- Leetcode:找工作的人最愛的 OJ,題目基本上偏經典且簡單,難度分級比較不精確且粗糙,但仍然可以根據難度與類別進行分類,也幾乎都能找到解答。本平臺會定期舉辦比賽,並且會對參賽者進行評級,還會獲得積分點數,可以兌換紀念品。
當差不多摸到入門門檻之後,你就會發現演算法和高中競賽數學一樣,也有分類,高中數學分爲 A、C、G、N,而演算法競賽分的就更多了:DP、Math、Data Structure、Graph……,並且一種題目可能是多種技巧的組合,甚至有發生過一個題目就是一篇論文的情況。
因此我們如果想要真的強化自己的演算法能力,就必須要學習各種知識,我也仍在這部分繼續學習,比如你可以看到我撰寫的組合筆記等。
進階的學習資料,我會推薦可以看 OI-Wiki 的目錄,可能是貢獻者還是不足,它的內容量還是不足。 但是看看目錄挺不錯的,你可以清楚的知道哪些東西你還沒碰過,唯一的缺點可能是因爲它是大陸平臺,因此和臺灣人溝通時候有時候會發生代溝。
營隊、鑑定
鑑定:
- APCS:臺灣鑑定,基本上現在 5 級分是標配了。
- AP CSA:美國鑑定,沒考過不知道。
- CPE:題庫取自 Uva,基本上我不覺得他有什麼價值。
營隊:
- IOICAMP:臺大舉辦,有超難、超讚的講義。
- PCCA Winter CAMP:交大舉辦,會 release 課程影片。
- IONCAMP:清大舉辦,有分初級班和進階班。
演算法比賽
我會推薦參與的演算法比賽(包括但不限於):
- 學科能力競賽:爲臺灣高中生的,基本上題目品質仰賴區域,但申請大學他們似乎挺愛看的。
- Meta Hacker Cup
- Google Code Jam:目前停辦。
- TOI:專門針對國、高中生的奧林匹亞比賽,每年會選出 4 位作爲國手參與 IOI。
- ICPC:針對大學生、研究生的資訊比賽。以前的贊助商是 ACM,因此偶爾還是會被稱爲 ACM 競賽。
- NCPC:垃圾比賽,爲了獎金,不妨一去。
系統網路維運
這部分我們稱爲 Infrastructure(基礎建設),或是簡稱 infra。
如果是完全沒有概念者,我會推薦你先對網路有一些概念,包括但不限於:
- IP address、submask、subnet、gateway、route
- 這部分可以看我的 網路概論 Lesson 1 和 網路概論 Lesson 2,雖然沒辦法幫你確立完整的概念,但可以幫你建立基本觀念。
- DHCP、static IP、dynamic IP
- DNS、Domain、FQDN、Search Domain
以及選擇一套你喜歡的系統,包括但不限於:
- Linux 系:
- CentOS 系:
- CentOS Stream 系列
- Fedora 系列
- Debian 系:
- Debian 系列
- Ubuntu 系列
- Google Cloud - Associate certification
- 族繁不及備載,如果你想看更仔細一點,請訪問 Linux Distro-Family-Tree。
- CentOS 系:
- BSD 系列
- NetBSD 系列
- FreeBSD 系列
- Windows Server
那爲什麼我們當下(2024)主要會選擇 Linux?
- 開源:Windows 系列並不開源,因此需要授權;而這點,BSD 系列也是開源的。
- 功能性:Linux 永遠站在最前沿,支援着最新的硬體,發展的最新的技術,而 BSD 往往會慢半拍;Windows Kernel 主要是因爲顧慮到普通使用者,因此會支援新硬體,但不一定會引入開發者需要的技術。
- Container 技術的發展:這點並不是 Linux 的專利,BSD 也可以透過 jail 等技術做到類似的效果。但 Open Container Initiative 是出現在 Linux 上的,所以……,BSD 因此落下一大截。
個人慣用 Debian,目前最新版本號是 12,名稱 Bookworm。
基本上我會推薦你找一臺空閒主機,安裝 Proxmox VE,然後你就可以在上面開很多台虛擬機(VM),然後每臺 VM 都可以各司其職,互不影響,你可以在你的私有網路內建設服務、測試,以及玩任何你想要玩的東西。
如交大的網路管理課程,它需要建設 Router、DNS、Mail、LDAP(除了 Router 都還要有 HA 節點),因此合理情況下會開 7 台 VM,極端情況下也會開至少 3 台。
如何建立基本的系統維運能力
個人覺得可以去參考交大的 NASA 系列課程:
基本上只需要把它的講義都讀過一次,作業做過一次,我想最基本的系統操作能力就沒問題了。
包括但不限於:
- 瞭解 Unix-Like 系統的基本邏輯
- 文件系統
- 權限系統、使用者
- 網路、主機名稱
- 套件管理、服務管理
- 操作 Unix-Like 系統
- Shell 的基本操作和簡單 Shell Script
- 常見基本指令
- 相對、絕對路徑
- 權限切換、檔案權限設定
比較可惜的事情是,這兩門課程還在使用 FreeBSD 作爲教案,甚至在數年前,他們都還是作業需求之一。
而且這兩門課程可以給你建立很多其它的觀念,比如說 PKI、Driver Programming、IDS 和 IPS……等,每年不定的會提供一些補充教材。
如何建立更進階的系統維運能力
進步往往取決於需求,現在的需求基本上就是往:
- 更高的 HA
- 更低的營運成本
所以以現在而言,最紅的是 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
- CCNA:現在應該已經是標配了吧?雖然我沒有就是了。
- CCNP
- CCIE
- Juniper:
- JNCIA-Junos
- JNCIS-SP
- JNCIP-SP
- JNCIE-SP
系統方面,僅列舉其中一兩個:
- RedHat
- Red Hat Certified Engineer (RHCE)
- Red Hat Certified Specialist in Linux Diagnostics and Troubleshooting
- Google Cloud
- Google Cloud - Foundational certification
- Google Cloud - Professional certification
- AWS
- Solutions Architect - Associate
- Cloud Security Alliance
- Certificate of Cloud Security Knowledge
但其實這些證書基本上都是在認證一些觀念和你是否會使用他們家的產品,如 Cisco 的 CCNP,基本上就在考你會不會用 IOS(Cisco 的 Switch OS)。
