言語習得の為に始めたAtCoderで入茶するまでの話

# はじめに
2024/6/15に実施された [AtCoder Beginner Contest 358](https://atcoder.jp/contests/abc358) にて、
今回、いわゆる**入茶**と呼ばれるスコア400に到達する事が出来ました。

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737208/050cf8a1-73cb-ea1a-69d8-84c5d374b616.png" width = 400>


今年の3月の末から参加を始めたAtCoder Beginner Contestですが、
8回目の参加ですが、ようやく初心者脱出と言えるのかなと思います。
本記事ではAtCoderに参加する様になった動機と、活動内容について記載していきます。


# きっかけ
## 言語習得の必要性
私が業務において実務で使えるレベルであるプログラミング言語は、
AtCoderを始める前の段階で以下の通りでした。

- PHP
- IBM RPG3/RPG4
- COBOL
- VB/VBA

あまり聞き覚えの無い言語もあるかもしれませんが、
上記一覧の通り、元々IBM i serverを中心とした開発をしていた関係もあり、
一般的な言語の種類・幅はあまり広くありませんでした。
しかし転職を機に、今の企業ではAWSでの構築を中心にした業務に遷移しています。

ただ、今の企業に移ってAWSでの開発を進めている間に、
自分のスキルと照らし合わせるとどうしても解決出来ない問題が発生しました。
それは以下の存在です。

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737208/ddc4f6ad-5245-15d9-1daf-91966e8c20b9.png" width=200>

それは <font color=red>**AWS Lambda**</font> の存在です。
AWS Lambdaはいくつものプログラミング言語をサポートしていますが、
自分が実務で使えるレベルの言語範囲では、残念ながら**１つも該当しなかった**のです。

これではAWS Lambdaを実務で使おうにも、言語の習得からスタートしてしまい、
業務の進捗に支障を来たしてしまうという事が分かりました。
勿論、昨今では生成AIに頼るという手法もありますが、
自分で読めない／書けない事には到達出来ない部分もあるだろう、という思いもあります。
なので、新たにAWS Lambdaで使える言語を習得しようと考えました。

## 言語習得の選択
AWS Lambdaでは以下のプログラミング言語をサポートしています。

>AWS Lambda は、ネイティブでは、Java、Go、PowerShell、Node.js、C#、Python、Ruby のコードをサポートしています。

基本的にはLambdaで取り扱える言語であれば何でも良いという考えでしたが、
今後私が使う機会の多そうな **Python** を習得したいと考えました。

しかしながら、一概に言語を習得すると言っても、
どこまで使える様になったら習得出来たと言えるのか、
どういう事が出来る様になったら使えると言えるだけの実力になるのか、
それを示す為の指標が必要かと思いました。
ただ参考書を読みながら、闇雲に例題を叩くだけでは自分の物にならないと思いました。

## 目的を付加する
作りたいアプリケーションがあるならそれが一番良いと思いましたが、
実際にすぐに取り掛かりたい様なアイデアは特に持っていなかった事もあり、
結局それではモチベーションが上がらないだろう、という結論に至りました。

それは、今回の目的はあくまで「言語習得」であり、
「アプリケーションを作る」事が目的であれば言語習得は「手段」ですが、
言語習得の為にアプリケーションを作るのであれば、**目的と手段が入れ替わっています**。
これでは到底良いアプリケーションになるとは思えませんし、
言語の習得という本来の目的を達成する事が出来ないと考えました。

とはいえ何もしないのは勿体ないと、
ひとまず私が始めたのは、転職サイトpaizaのスキルチェックを解き始めました。

https://paiza.jp/

しかし、途中で気付いたのです。
このスキルチェックは、**いわゆる競技プログラミングなのでは**？と。

だったら、競技プログラミングの世界に飛び込んでみよう。
そこで様々な技術を磨く事は言語の習得にも繋がるし、
競技プログラミングにおいて重要な高速化の技術を学ぶ機会にもなるのではないか？
「Pythonの習得」と「競プロ」は、互いに補う関係となる目的と手段ではないだろうか？
と思った事が、私がAtCoderを始めたきっかけです。

## 競技プログラミングとAWS Lambdaの相性の良さ
AWS Lambdaはサーバレスで動くイベント駆動型のコンピューティングシステムです。
このサービスは従量課金制であり、短い時間で完了する程コスト効率が良くなります。
また、長い時間稼働させることを元々想定していない作りであり、
最大で30秒の実行時間制限が課されています。

そもそもAWS Lambdaを利用する上で時間が長く掛かる処理は行うべきではないし、
一方で短く終われる計算方法があるなら、その手法を採用すべきという事も言えます。
しかし、もし高速化して短時間で終われる様な工夫が出来るのであれば、
Lambdaもアーキテクチャの選択肢に入れる事が可能になります。

以上から、AWS Lambdaは高速化を存分に使うべきサービスであり、
競技プログラミングで学んだ知識が十分に使えるという事を考えると、
これらの相性や学習における相関関係は最高と言っても過言では無いかと思います。

# コンテストに参加する前に
まずはAtCoder Beginner Contestに参加する為の事前練習として、
AtCoder内で常設されているコンテストである、競プロ典型90問に取り掛かりました。
どの様な問題が出されるのか、実際にどんな形で提出するのか、
そういうことを事前に習得しておく事はとても重要です。

https://atcoder.jp/contests/typical90

しかしながら、実際に取り掛かってみても、ほとんどの問題を解けませんでした。
☆２の問題で精一杯で、それも実際に回答を提出してみると
TLE(いわゆるタイムオーバー)を頻発し、解けなかった扱いになるものばかりです。
実際に問題クリアとなるACの結果を出すまで、解法を見た問題も数知れません。
そして☆２の問題を全て解き切った後に、
AtCoder Beginner Contestに参加する様になりました。

# 実際に参加してみて
初回参加した[ABC347](https://atcoder.jp/contests/abc347)の結果をここに残しますが、
私は全７問中の２問しか解く事が出来ませんでした。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737208/1b15afd3-0bef-445c-fe9b-bff8e47bc0fe.png)

後から考えてもこの時の３問目はやや難しかった印象を受けますが、
いわゆる「少し複雑だったり高速化が必要な計算」といわれる３問目(C問題)を
私は確実に解くことは出来ません。それは今もそうです。

しかしながら、参加した結果、
**自分がいかにコーディングの事を知らない**、**そして実現出来ない**か、
**高速化する為のノウハウを身に着けていない**、
そういった事を知る事が出来ただけでも大きな収穫であったと感じています。

# 参加した後
実際に取り掛かってみて、分からなかったり、出来なかったりした問題については、
なるべく解き直した上でアウトプットする様にしています。
この時解けなかった問題Cについては、以下の様にnoteにまとめました。

https://note.com/hira0912/n/n7f1246c7ef6f

この様にアウトプットをする事にはメリットがあります。
それは、**実際に解法をインプットした上で自分でコードを書き**、
**さらにアウトプットする事で自分の技術として定着する**、という事です。

今回参加した[ABC358](https://atcoder.jp/contests/abc358)では初めて[D問題](https://atcoder.jp/contests/abc358/tasks/abc358_d)でACを出す事が出来ましたが、
そこで高速化に利用した「尺取り法」という手法も、
過去に高速化が足りずに解けなかった問題をnoteでまとめていたからこそ
スムーズに頭の引き出しから持ち出す事が出来ました。
その手法が記載されている記事は、以下になります。

https://note.com/hira0912/n/n94863a5242b9

# 今後初めて参加する方々に向けて
自分は高速化の技術の事は、まだほとんど分かりません。
だからこういう技術を覚えておけとか、すぐにステップアップ出来る様になる方法とか、
そういった事柄については他の方の記事を読む方が有用です。

しかしながら、慣れない言語で参加を始めた自分でこそ伝えられる事もあると思うので、
ここからはそれを列挙していきます。

## 参加する事へのハードル
まず伝えたい事は、
自分が思っていた程 **参加する事のハードルはそれほど高くない** ことです。

一番初めに参加するのはAtCoder Beginner Contestとなると思いますが、
それについての唯一のハードルは毎週土曜日の21:00~22:40を拘束される事くらいです。
参加する事自体への義務感だったり、スコアという評価への恐怖を持つと辛いと思うので、
参加出来る時に参加する、スコアは気にしない、くらいの気持ちで参加してみて下さい。
私は他の予定があるならそちらを優先する、くらいの優先度で参加しています。

勿論事前に例題を多少やってみるとか、過去のコンテストの問題に提出する事も可能です。
自信が持てず、自身のレートがどうしても気になってしまう、という方は
**Unrated**というスコアに反映されない参加をする事も可能です。

競技プログラミングというと、ハードルが高そうに見えますが、
例えば競プロを将棋に例えると、プロと呼ばれる棋士は確かに存在していますが、
家族と将棋を打ったって問題ない訳ですし、詰め将棋を一人でやっても良い訳です。
AtCoderの主軸は「**スポーツや娯楽として楽しみ競い合うこと**」と記載もあるので、
私たちは、遊び感覚で参加したって良いのです。

## プログラミングの楽しさを再発見出来る
エンジニアの方々はプログラミングが好きな方が多い、と勝手に思っていますが、
競プロはある種、コードで書くパズルの様な物です。
普段業務で使っている言語であっても、巧みに組まないと解決出来ない問題、
取り組んでみたくありませんか。

ただ、段々とアルゴリズムなど、数学的な要素が入るので、
多少そこに好き嫌いは出るかもしれません。

## プログラマとしての実力を示せる
自分はその段階に達していないと思っていますが、
AtCoderのスコアはプログラマとしての力量を示す為の指標になります。

転職の際に、履歴書等に使えるプログラミング言語などを記載して提出したりしますが、
そこには合わせて「実務にて〇年」等の書き方をしたりすることがあります。
プログラムを書ける技術の証明は非常に難しく、
現状で他人に伝えられるのは関わって来た年数、という形が一般的です。

しかし、AtCoderのスコアはその技術力を数値化して記録に残す事が出来ます。
先に記載した様に、昨今では生成AIがコードを記載する事も可能ですが、
人間が読み書き出来ない様では、そのコードの安全性は担保出来ません。
AtCoderのスコアはその様なプログラムを読み書き出来る技術を証明する、
プログラマの力量の指標にすることが出来ます。
実際にAtCoderではアルゴリズムの実技検定試験も行っています。

https://past.atcoder.jp/

# おわりに
何だかんだ、AtCoderを通してpythonでコードを書いては消してを繰り返している内に、
いつの間にか自然とpythonを書けるようになっている自分がいました。
AtCoderで必要なアルゴリズムを記載したいと思った時に、
必要な記載の仕方を習得し、さらにアウトプットする為に適切な書き方を覚え、
それがいつの間にか身に付いて行った訳です。

また、私はまだAtCoderを始めたばかりですが、
知らない、習得していない技術が沢山ある事に気付かされます。
そして、世のサービスではそんな技術が、当たり前に使われている事にも気付きました。

もし本記事を読んで、少しでもAtCoderに興味を持った方がいたら、
まずはAtCoderのサイトをちょっと開いてみてくれると、自分も嬉しいです。

:::note
興味があったら、良ければ一緒に参加しませんか？
:::

https://atcoder.jp/