知識0の初心者が2年で1万鯖導入を達成したBotを作るまでに経験したこと

:::note warn
この記事は私が高校1年生の時に書いた記事です。
全体的にかなり生意気な感じの文章なので、事前にご了承の上閲覧ください...
:::

こんにちは、しなもんと申します。

数カ月前に某高校の情報科に入学したこともあり、自分のプログラミング体験を話すことが増えました。

どうしてこの道に進んだのか、どのように知識を身につけたのかを語る機会が増えて、初心者の頃の勉強方法や戸惑いも思い出しました。

そこで、この記事では「プログラミングをどう学んでいけばいいか」「何から始めるべきか」、特に「サービス運営に必要なこと」など、分からない方々に向けて書きました。
ただし、アドバイスというより、「サービス運営を始めた初心者」としての実例を共有していきます。

# はじめてのpython（2021年10月）
最初に触ったのは2021年でした。
そもそもプログラミングを触ったことすらなく、Pythonって何状態でした。
とあるコミュニティにて、ネ友がdiscordのbotを作っていたのを見て、「えっなにそれ作ってみたい」と思ったのが始まりです。
コードを書いたわけでもなく、ただ教えてもらったコードをreplitにコピペしただけですが、今思えばこれがすべての始まりだったわけです。
もちろん、そのbotの機能は「ping」と送信すると「pong」と帰ってくる程度でした。

ちなみに当時のチャットがこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1927831/0e2b75e2-57b0-4b0e-ee97-42cad6b425eb.png)

ひどいですね。
関数どころか変数でさえ理解していなかった自分は、Progateというサイトを勧められます。

https://prog-8.com/

そこで、Pythonというか、そもそもプログラミングが何をすることか学びました。
いうて1時間くらいの勉強です。for文や関数からは有料なので。

しかし雰囲気をつかめました。その後に作ったbotは、数値を入れると8倍にしたり8で割った数値を返してくるbotです。マイクラの座表計算用ですね。
ただそれだけですが、変数さえ理解してなかった最初に比べれば、大きな進化です。

```main.py
@bot.command()
async def nether(ctx,x,y):
    await ctx.send(f"x:{int(x)/8}\ny:{int(y)/8}")

@bot.command()
async def world(ctx,x,y):
    await ctx.send(f"x:{int(x)*8}\nz:{int(y)*8}")
```

しかしこれでbotの作り方を「完全に理解した」自分は、タイマーを作ったり、apiの使ってマイクラ鯖にいるメンバーを取得するコマンドを作ったりしてました。
もちろん自分で作ったわけではなく、原型はすべてネ友に書いてもらっていました。
でも方法だと、書いてもらったコードをちょっと変えれば無限に応用できるので、本当にいい学習方法だったと思います。

ちなみにこのころのコードのgithubが残ってたりします。

https://github.com/CinnamonSea2073/DiscordBotpy/blob/master/main.py

この時良かったのは、身近に詳しい人がいっぱいいるコミュニティで作ってたことですね。
マイクラを主にする少人数コミュニティなんですが、なぜかプログラミング経験者が多く、みんなでわいわいやりながら作ってました。そのおかげで、モチベがなくなることはなかったです。

# Githubを完全に理解する（2022年4月）
さて、その6か月後の私はGithubの使い方を知ります。エンジニアの第一歩な気がします。

どのような経緯があったかというと、それまでコードを共有するときは全部Discordを使っていました。その時のbotはmain.pyだけで動いていたので別に困らなかったのですが、ファイルが増えていくとなかなか共有が難しくなってきたんですね。

そこで教えてもらったのがGithubでした。最初は使うメリットとかわからなかったんですが、これから使っていく中で早めにGithubの使い方を覚えられたのはいい経験でした。
おかげで、初心者の頃に書いたコードを振り返れていい思い出になってます。

# クラスの仕組みを完全に理解する（2022年6月）
これも大事な経験で、何より理解するタイミングが完璧でした。塾に向かうバスの中で、チャットで教えてもらった記憶があります。
もともとDiscordBotのラッパー自体が完全にクラスを使いまくる仕組みをしていたので、クラスの仕組みを覚えるのは必須だし、むしろ今まで使っていたので簡単に理解できました。
\_\_init__()関数とは何か、super()とは何か、継承とは何か、みたいにいろいろ教えてもらいました。
教えてくれる人が身近にいるっていうのは本当にいい環境だったと思います。

さて、このころのコードを見てみましょう。

https://github.com/CinnamonSea2073/CinnamonBot

.gitignoreを使ったり、環境変数を分けたりしているので、Githubの使い方をちょっと理解してきてますね。また、ファイルを分散させてたり、いろんなライブラリやAPIを使って超多機能すぎるbotになってます。

# 原神ステータスBotの誕生（2022年8月）
さて、先ほどの無駄多機能Botにはとある機能がありました。それは、原神というゲームのapiを利用した機能です。

当時のコミュニティは主にマイクラをする人が大勢だったのですが、私が原神を布教したために、みんなでガチャ大会をするくらい流行ってしまいました。
そこで、ガチャシミュレーターやキャラクターの詳細を見れる機能を作ったら面白いんじゃないかと思って作った機能がこれです。
仕組み自体は難しくないのですが、なんかこれが楽しく、
「これ、外部に公開してもいいんじゃない？」
と思いました。

そう、今まで書いていたコードはすべて、身内コミュニティのためです。外部に公開したことは一度もありません。

実は、原神のBOTというのはすでにあり、それもプロフィールを画像にまとめて表示するような高性能なBotでした。しかし、それしか機能がなく、ガチャシミュレーターとかがあるBotなら人気にならないかな？と妄想してました。

そうして、それまで私の師匠をしてくれていた @nikawamikan さんをチームに迎え、
ノリと勢いだけで爆誕したのが、「原神ステータスBot」です。

# サービスの運営
さっそくBotを作り、運営を始めました。
もちろん、知名度0の人が作った無名のbotです。利用者は掲示板のおかげで数十人ほどいましたが、それでもサービスが止まっても迷惑にならないくらい微力なものです。
ですが、バージョンが増えることに謎の楽しさがわき、一日中コードを書く日々が始まりました。
何を言ってるかわからないと思うんですが、今もそうです。
バージョンってかっこよくないですか？（？）リリースって言葉、楽しくないですか？（？）

多分マイクラの影響だと思います。マイクラってバージョンの差がすごくて、それだけ重要視されるものなので。

こんな感じで一日にアプデを繰り返しまくっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1927831/2bebd19a-9d09-1d62-dacf-edf246dc67e8.png)

さて、技術の話ですが、やはりプログラミングは実践です。成長速度が爆上がりしました。
実際に作ったものを運営することで、「ユーザーをyamlで管理するヤバさ」「データ管理はSQL使え」「すべてのデータを変数にしていちいち関数の引数にする行為の愚かさ」というものを知っていきます。
また、このころキャラクターのデータを画像として表示する機能を追加するため、画像処理ライブラリPillowの使い方も理解しました。
時系列的には少し後ですが、MVC（モデル／ビュー／コントローラー）思想に基づいたリファクタリングもしました。

そういった機能の拡張や自分の成長による開発速度の向上によって、開始から一か月で100サーバー導入を達成しました。

# ライバルBotのサービス終了（2023年3月）
年をまたいで3月、アップデート作業は二週間に一度ほどまでペースは落ち着いてきました。
特に負担になることもなく、運営＆アプデ作業しながら高校受験をして無事に第一志望を勝ち取るという快挙（？）を成し遂げた一週間後、事件が訪れます。

それは、このBotを立ち上げるきっかけにもなったBot、「GenshinArtifacter」のサービス終了です。

最初に言った「原神のBOTというのはすでにあり、それもプロフィールを画像にまとめて表示するような高性能なBot」というのはまさにこのことであり、利用者数は数十万人ほどいます。
実はそのBotは一人の高校生によって開発されていて、大学入試に向けて勉強するため、運営ができなくなったとのことでした。

こちらとして大きなチャンスです。数十万人もいるコミュニティが崩壊するわけですから、少しでも私の運営してるサービスに誘導できれば利用者数の大幅増加につなげられます。

サービスに誘導するため、公式Twitterの運営を始めたり、Youtube動画の投稿をしました。（時系列的には少し前ですが）。
マーケティングはプログラミングとかあまり関係ないですが、知名度を上げないとせっかくサービスを運営しても誰も使ってくれません。意外と大切なスキルだと思うようになりました。

そして一番頑張ったもので、一番効果的だったのは公式サイトを作ったことです。
実はサービス開始直後から利用規約などを書くために作ってはいたのですが、検索して上位に出るようなサイトにするため、大幅にリニューアルしました。
といっても、htmlとかをゴリゴリ書く感じではなく、Wixというサイトを使って作ってました。
サイトデザインやSEO対策を勉強してサイトを作り、Googleに申請してグラフと格闘しながら検索順位を上げる生活を一週間繰り返しました。
これが一番の効果で、「原神 Discordbot」とかで検索すると普通に上位4つは「原神ステータスbot」のものが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1927831/b55ff492-1c84-1a7e-df6c-17581f8f2823.png)
また、検索だけでなく、こういうやつも私のサイトが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1927831/9fd05822-5703-7d75-87ea-226d757f6a29.png)

さて、かなり話が脱線しましたが、プログラミングやウェブの仕組みとしての知識も身に付きました。
「クロール」って単語聞いたことありますか？GoogleとかBingのBotが世界すべてのサイトを巡回してるんですって奥様。わたしはその時まで知りませんでした。

# Dockerとの出会い（2022年4月）
さて、プログラミングの習得を目指す＆サービス運営を目指す方に問いたい。
サーバーって何かわかりますか？

「いや、普通にサービスを運営するためのコンピューターだろ」って思われると思うんですけど。
じゃあそのコンピューター、あなたの家にありますか？
24時間稼働して、絶対に停止しないような、サーバーに特化したコンピューター。あります？
一般のご家庭にはないと思います。

なぜこんな話をしたのかというと、それまでこのBotは私が7000円で買って改造したwindowsノートPCを無理やり24時間動かして使っていたんですね。燃えるわそんなん。
というわけで、インフラ整備ということをしなければならなくなりました。実際にプログラムを作っても、実行する場所がないと意味がないんですね。

ちなみにインフラというものはまじで沼なので皆さん気をつけてください。末期患者はこういう動画を見てニヤニヤが止まらなくなるようになります。まじで気をつけてください。

https://youtu.be/23GoObFnFdA

さて話が脱線しましたが、とにかくこのままでは危ない。寝てる間に家が火事になりかねない。ということで、インフラの大改造計画が始まりました。

そこで登場するのが「Docker」です。
普通サービスというものは、何かに依存しています。例えば、このbotが使っている画像処理ライブラリ「Pillow」はもちろん私が開発したものではないので、外部から取得する必要があります。
しかし、サービスを別のパソコンに移動するとどうなるでしょうか。Pillowはないどころか、Pythonさえインストールされてないかもしれません。
しかしこのDockerは便利。なんとサービスを運営しているOSごと移動させることができるのです。（概念的な表現で、実際は全く違いますが。）

これによって、どんなコンピューターでも全く同じものを起動できるようになります。
このDocker、ほんとに便利なもので、どんなコンピューターでもアプデ作業ができるようになるんですよ。末期が加速しますね。

そんなことは置いといて、インフラ整備の話に戻りますが、まずサービスをDockerに移植しました。
そして、開発チームの @nikawamikan さんにつよつよのサーバーを貸していただき、Dockerごと移動しました。
Dockerなら、起動構成をファイルに書いて送るだけで全く同じものを向こうで構築されます。すばらしい。

これも、サービスを運営する中で本当に大切な経験でした。家が燃えなくてよかった。

# API化（2023年8月現在）
いきなり時間が飛びます。というのも、さすがに新高校生。やることは増えてきたのでサービスに構ってる余裕がありません。

しかし何といっても入学したのは情報科。そう、ほかでもなくこのサービス運営がきっかけで高校を選びました。まさにこのサービスは私の人生とともにあります。

具体的にはこの期間、とあるWebアプリを開発していました。残念ながらリリースには至ってませんが、Djangoフレームワークを利用してHTMLとCSSを初めて使い、Figmaでデザインして、それっぽいアプリを作りました。
これは学校で習ったわけではなく独学ですが、今までの経験のおかげでわりとすんなり習得できました。一年前とは大違いです。


そしてその経験を生かして、ベータ版ではあるものの、画像生成部分をAPIとして切り離しました。FastAPIを勉強してhttpリクエストを学び、Dockerのネットワークを理解して並列処理を完成させました。
現在は、そうして誕生したAPIを使って、原神ステータスbotのWeb版を開発しています。

現在、原神ステータスBotは累計10920サーバー導入を達成しています。

# まとめ
正直この記事の内容を理解させる気は一ミリもありません。むしろ後半は専門用語で殴り倒してます。
でも雰囲気が分かればいいんです。この記事、最初のほうは難しい言葉は出てこないですが、後になるにつれて意味わかんなくなってくると思います。

とにかく、こうやって最初は自分のためにアプリやサービスを作る。もちろん実用的なものにしたほうがいいです。モチベにつながるので。
そして、完成度が高いやつを選んで世間に公開する。これが大切だと思います。

皆さんもサービス運営を目指して、この道に入ってみてはいかがでしょうか？