突然ですが,高中生向け的程式設計比賽,日本資訊奧林匹克(以下稱為 JOI),您知道各都道府縣的參加人數差異有多大嗎?
下圖顯示了到 2020 年,各都道府縣在 JOI 的參加人數(取自這個頁面)。東京都的累計參加人數超過 2000 名,而大分縣在 2020 年之前卻沒有任何參加者的情況[^1]。

我在大學入學後,經常聽到朋友說:「我不知道有什麼資訊奧林匹克(JOI)或數學奧林匹克(JMO)之類的活動,如果早知道我會想參加......」。
許多學生尤其是在地方上,因為不知道 JOI 而無法獲得更大的幸福。我希望能讓這些學生了解這個世界,擴大人生的可能性......懷著這樣的願望,我從 2020 年開始逐漸展開活動。

我雖然仍在途中,但截至 2025 年 12 月已獲得以下成果。

本文將回顧這些活動。
另外,我也會介紹在與學生互動中產生的「AtCoder 水色學習方法」。這種練習方法不僅適用於以 JOI 為目標的高中生,也對那些希望進入 IT 行業的學生或在 IT 行業中提升技能的社會人士有幫助。
首先,我來簡單介紹一下什麼是 JOI。JOI 是針對高中生的「競技程式設計」(簡稱競程)比賽。而所謂的競技程式設計,簡單來說就是
使用程式設計,盡可能多地在限制時間內解決像謎題一樣的問題的運動
相信許多人都聽說過 AtCoder,AtCoder 是運營這項「競技程式設計」比賽的公司及網站。
JOI 成為了高中生們在競技程式設計世界中角逐的青春舞台。

JOI 的流程如上圖所示。簡單來說,如果能夠突破 JOI 初賽,就需要具備與解 Fizz Buzz 類似水平的能力。在重視資訊科學教育的高中,這被視為顯示成果的到達指標之一,與基本資訊技術者資格的取得一起。
突破 JOI 的二次預賽,可以與參加全國高等學校體育大會相提並論。而從那以後,便需朝成為該領域的專業人士邁進。
可能有些晚了,但我簡單自我介紹一下。
目前,我在NTT數理系統公司擔任顧問(負責公關)以及MONOGUSA公司的內容架構師(數學教材開發)。作為興趣,我參加競技程式設計及進行與其相關的種種活動(如下文所述)。
任何事情都得有教材才行......因此,我在 Qiita 上撰寫了許多文章。
之後,受到講談社科學部的邀請進行書籍化,於 2020 年出版了我的著作《鍛鍊解決問題的能力!算法與資料結構》[^2]。果真,出版社的觸角非常敏銳。隨後我持續進行寫作,至今已出版了四本書。

透過這些寫作活動,我收到了像是「因為這篇文章開始了競程!」或「因為讀了這本書我才能成為工程師!」的許多感人的回饋。
隨著時間推移,我越來越覺得,透過寫作間接與讀者互動也可以,但我希望能更直接地通過競程與人交流!!
因此,我利用配信應用程序 TwitCasting,創建了一個讓高中生追尋喜好事物的交流空間。特別是,我希望能讓那些「班上沒有能討論競程等話題的對象......」的地方高中生找到志同道合的夥伴,切磋琢磨,收穫成果,開創擴展世界的契機。
簡而言之,這項活動沒有很成功。要真正擴展高中生的世界,需要相當的時間和耐心去伴隨他們並取得一些成果。然而,在像 TwitCasting 這樣變化莫測的地方,將其具體化並不容易。
因此,我認為可以以「作為學校的努力」的形式,朝著 JOI 前進的方向發展。接下來,經過一段時間的摸索,我開始積極在 Facebook 上發佈資訊,並與全國的資訊教育工作者建立聯繫。
雖然 TwitCasting 的活動本身沒有成功,但並非毫無收穫。其中一位在當時是聽眾的 一般社團法人 MiraPub 的運營人員 ideal(イデアル),幫我搭起了与東京都立 A 高中的 B 教師的聯繫。
於是,我在 2022 年 8 月首次上課。初期甚至只有一名學生,但到 2023 年增至 4 名,2024 年更是超過 10 名。
參與人數的增長,與最初與那位學生的相遇有著莫大的關聯。雖然他身體不是很好,經常有身體不適的困擾,但卻是一位勤奮努力的學生。此外,儘管他性格較內向,但熱心助人,積極介紹自己所參加的社團,並向朋友宣傳,默默支持團隊中的成員們[^3]。
最終,每位學生都能夠實現各自的目標,取得了不小的成果。具體的練習方法等在後文中提及。
在取得一定成果後,我也開始投入學術會議的發表。下圖是我在2024 年全國高中資訊教育研究會(愛知大會)上發表的海報[^4]。

此外,學會發表果然是很棒的事情,並且會延續到後續的活動。與後文提到的來自大分縣立大分舞鶴高中的伊藤大貴老師的相遇,也是源於這類學會。
當我想將東京都立 A 高中的做法擴展至全國時,我又再次感受到對教材的需求。活動 ① 中提到的我的著作,對於剛開始學習程式設計的學生來說,水平太高。此外,在東京都的學校,我可以每月輕鬆出訪,但在地方的學校卻無法這樣頻繁。
因此,我與hiro、ウルズニャー、nonon、Blueberry 等志願者共同開發了名為 AtCoder NoviSteps 的網站,旨在讓學生能自律且高效地練習 AtCoder 的過去問題。
![]() |
| 已掌握的問題標示為綠色,想要複習的問題標示為藍色......等進行管理 |
在 AtCoder NoviSteps 中,針對競程中出題的問題所需的算法素養,我們依據「NoviSteps 等級標準」將其劃分為 17 嚴重等級(10Q, 9Q, 8Q, ..., 2Q, 1Q, 1D, 2D, ..., 7D)。例如,下表定義了 7Q 等級應學習的內容。

此 NoviSteps 等級標準被應用於:
等方面。NoviSteps 根據這個等級標準提供了能夠集中學習必要素養的練習題集。透過依序解答這些問題,可以順利提升技能。
茨城縣教育委員會非常重視教育,自 30 年度以來,為了培養全國頂尖的程式設計能力的中學生和高中生,開展了程式設計專家培育計畫。
目前已分為「遊戲・應用程式開發課程」、「AI 程式設計課程」、「競技程式設計課程」,去年和今年我擔任了競技程式設計課程的講師。
這裡的學生們彼此之間關係很好,每次都會進行活躍的討論。最終,學生之間的活躍交流才能真正拓展才能,這是我深有感觸的。我們的工作就是建立這樣的氛圍。
大分縣在 JOI 的普及過程中最為遲緩。自 2005 年現行 JOI 開始以來,直到 2020 年竟然沒有一位參加者出現。
在這樣的情況下,真是幸運,通過學會與大分縣立大分舞鶴高中的伊藤大貴老師(當時)相遇,得到了指導 JOI 的機會。伊藤老師在該校新設立了科學部資訊班,招募學生,並創建了一個積極展開各種活動的環境[^5]。我則負責與 JOI 相關的部分。

我個人的挑戰點在於,因為遠距離的原因,我與學生們的接觸次數有限,究竟能做到什麼程度......這是我在思考的問題。儘管我開發了 AtCoder NoviSteps,希望能幫助學生獨立學習,但實際效果卻讓我充滿期待與不安。
這所高校的科學部資訊班的特點在於,學生們非常陽光活潑,真的很享受討論。此外,有的學生因為對數學特別感興趣而加入,也有因對網頁開發等領域的興趣而入部的學生。背景和興趣各異的學生聚在一起,彼此交流的環境極為珍貴。透過相互感受到「擁有對方所缺少的東西」,獲取強大的刺激。
學生之間的互相學習效果驚人。我一直認為,「在達到一定水平後,學生可以自主學習,但在學習 Fizz Buzz 等基本問題的過程中,可能需要手把手的輔導......」。然而,大分舞鶴的學生們卻超出了我的預期。
最終,經歷了 2005 至 2023 年 JOI 參加者僅有 8 名的大分縣,2024 年這所學校卻成功培養出超過 10 名 JOI 初賽突破者 🎉
在與許多學生互動的過程中,我發現了一些競程的學習方法。
這裡,我假設高中入學時完全沒有程式設計經驗的初學者,目標是在高二的冬季比賽中突破 JOI 二次預賽(進入半決賽階段)。
在高中資訊科教師之間,通常認為突破一次預賽相對容易,但二次預賽則頗具挑戰性。然而,只要能夠確保足夠的練習時間,我相信每所學校都能有約 2〜3 名學生達成此目標。
此外,在 2024/2025 年度的大會中,JOI 二次預賽的突破標準相當於 AtCoder 綠色至水色(下圖的 C 到 B 級別)。

以下將分幾個階段來介紹。下表中的「等級」是指「NoviSteps 等級標準」,而「評分」是指 AtCoder 的評分。
| 練習等級 | 到達目標 | 到達評分(基準) | JOI 目標成果 | 參與期間(基準) | |
|---|---|---|---|---|---|
| 階段 ① | 10Q 〜 7Q | 掌握程式設計的素養,能夠順利撰寫 Fizz Buzz | R100 | 突破 JOI 初賽 | 高一的 4 月 〜 5 月 |
| 階段 ② | 6Q 〜 5Q | 能夠順利實現基於全探索的解法,或者正確預測計算時間 | R200 | 高一的 6 月 | |
| 階段 ③ | 5Q 〜 4Q | 學習逐步減少計算量的技巧,如二分搜尋、累積和。並熟練於高中數學,能夠解決需要數學思考的問題 | R300 | 高一的 7 月 〜 10 月 | |
| 階段 ④ | 3Q | 學習 DFS、BFS、UnionFind 等典型的算法與資料結構 | R500 | 高一的 11 月 〜 3 月 | |
| 階段 ⑤ | 2Q | 解決大量問題,以應用階段 IV 學到的算法 | R800 | 高二的 4 月 〜 6 月 | |
| 階段 ⑥ | 1Q 〜 1D | 解決更多問題,能夠解決實用的頂尖演算法問題 | R1200 | 突破 JOI 二次預賽 | 高二的 7 月 〜 12 月 |
階段 ① 的目標是在學習程式設計語言的同時,對程式設計有所適應。具體來說,目標是能夠順利解決 Fizz Buzz 程度的問題。若能達到這個目標,就能突破 JOI 的初賽。
開始競技程式設計的首要步驟是先註冊 AtCoder。註冊方法及 AtCoder 的使用方式,可參考以下文章。
AtCoder 每週六 21:00 舉行面向初學者的 AtCoder Beginner Contest(ABC)。截至 2025 年,這類比賽的過去問題已超過 7000 題。透過解決這些問題將大大提升實力。
此外,每週參加 ABC 的比賽對 JOI 練習也大有幫助。若每週都參加,則兩年內就能累積 100 次實戰練習。

(AtCoder 的 比賽列表頁面)
首先,您需要學習程式設計語言的文法。許多人在選擇語言時感到困惑,但在 JOI 中,特別建議使用 C++,理由如下。
學習程式設計語言的方法多種多樣,但 AtCoder 提供了一本「針對競技程式設計而設計的 C++ 入門教材」APG4b。如果沒有特別的偏好,學習 APG4b 是個不錯的選擇。