[ポエム]プログラムのスタート地点はどこなのか？

文章全体を敬体（ですます調）に統一し、誤字脱字を修正したバージョンを以下に示します。

---

こんにちは。Kaneyasuです。
本記事はプログラミングの初心者向けのお話です。

# はじめに

「大きなプログラムの修正はできますが、小さなプログラムをゼロから作ることはできません」
エンジニアの皆様、そんなことはないでしょうか？
例えば、検証用プログラムをサッと作ってくださいと言われたらできますか？

巨大プロジェクトに長年従事している方によく見られますが、実はこれ、意外とできない方が多いです。
私はこれが、エンジニアの成長の分岐点だと思います。
大きな枠が用意されていないとプログラムが書けないとなれば、仕事を請けにくかったり、自己研鑽がしづらいと思います。

では、ゼロから作れるようにはどうしたらよいでしょうか？
第一歩は「プログラムのスタート地点はどこなのか？」を理解することだと思います。
というわけで、プログラムがどうやって動くかを理解するために、プログラムの起点はどこなのかという話をしたいと思います。

# コンソールアプリの場合

コンソールアプリというのは所謂黒い画面（ターミナルやコマンドプロンプト）上で動かすアプリです。
バッチプログラムもこれに分類されます。

下記のどちらかになります。

- 一定のルールがあるパターン
- 単純にファイルの上から流れていくパターン

## 一定のルールがあるパターン

VB.Net、Javaでシンプルなコンソールアプリを書いた場合がこれにあたります。

https://learn.microsoft.com/ja-jp/visualstudio/get-started/visual-basic/tutorial-console?view=vs-2022

例えば、VB.Netでシンプルなコンソールアプリを作る場合、大体`Sub Main`が起点になります。
厳密には.Net系はVisual Studioの設定で起動時にまず実行する関数を変えることができます。
この設定のデフォルト値が`Sub Main`です。
ただ、この設定を変えるのはレアケースです。

## 単純にファイルの上から流れていくパターン

Pythonでシンプルなコンソールアプリを書いた場合がこれにあたります。

```python:hello.py
def main():
    print("Hello, World!")

if __name__ == "__main__":
    main()
```

```bash
python hello.py
```

これは、起点がmain関数でしょうか？
別にそういうわけではありません。
起点がmain関数と決まっているなら、この部分の意味がわかりません。

```python
if __name__ == "__main__":
    main()
```

これは単純にファイルの上から実行されるだけです。
上から順に、main関数が定義されて、そのmain関数が実行されます。
スタート地点はmain関数と決め打ちするのではなく、しっかりとプログラムを目で追うことが大事だと思います。

# Webサイトの場合

こちらが基本になります。

- ルートページ
- ルーティング



## ルートページ

ルートページは、Webサーバーにおいて、ディレクトリ（フォルダー）にアクセスされた時、最初に表示されるデフォルトのファイルです。
例えば、ApacheでWebサイトを公開していて、そのURLが`http://example.com`だとします。
ブラウザで`http://example.com`を開いた場合、サーバー上の`index.html`が開かれます。
ルートページは、この`index.html`のことです。

何がルートページのファイルかはWebサーバーの設定に依存します。
Apacheには、`DirectoryIndex`という設定があります。

https://httpd.apache.org/docs/2.4/ja/mod/mod_dir.html#directoryindex

```
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>
```

PHPでサイトを作っていて、起点を`index.php`にしたい場合はこのようになります。
左に書いている方が優先です。

```
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>
```

## ルーティング - WordPressの例

Webサーバーのルーティングとは、クライアントからのリクエスト（通常はURLを通じて）を受け取り、そのリクエストに応じてサーバー上で適切なページを返す仕組みのことです。

Wordpressを例にすると、Wordpressで動いているページは、どのURLを呼び出しても一旦一箇所に集中します。
集中した後にリクエストされたURLを解析して該当するページを表示します。
この機能は、WordPressがApacheで動いている場合、WordPressのソースコード群にある`.htaccess`を見ればわかります。

https://ja.wordpress.org/support/article/htaccess/

```
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
```

この`.htaccess`の内容をざっくり説明すると、

- `https://example.com/about-us/`
- `https://example.com/2024/05/26/sample-blog-post/`
- `https://example.com/category/technology/`

などのURLがブラウザで開かれた場合、どのURLであっても全てのリクエストを一旦`/index.php`に集約します。
`/index.php`およびそこから呼ばれるプログラムがURLに応じたプログラムを起動しています。

# AWS Lambda

AWS Lambdaの下部にある、ランタイム設定に依存します。

![AWS Lambdaのランタイム設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1959433/bd537b8e-a3ff-c8e4-8d72-c3b36d44254d.png)

![AWS Lambdaのコード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1959433/190306d7-a190-3d31-a16f-477000a8cc66.png)

ハンドラの部分に注目します。
この記述は`ファイル名.メソッド名`となっています。

# まとめ

以上、「プログラムのスタート地点はどこなのか？」という観点でいくつか例を書いてみました。
全て非常にシンプルな話なのですが、知らなければ出てこない発想なのかもしれません。

その昔私は、普段JavaやPHPを書いてる方にシンプルなバッチプログラムを依頼したら、手が止まってしまった方を見

たことがあります。
普段MVCのどこかしか触らないので、単独で動くプログラムが逆に書けなかったようです。
（別にJavaやPHPで書かなくてもよかったのですが）
ここで諦めてしまうかが成長できるかどうかの分岐点だと思います。

この分岐点でいい方向に行けるかどうかは、その人の気概、または普段から試行錯誤をしているかどうかによって変わってくるでしょう。
前者はテクニックでどうこうできるものではないので、後者を日々積み重ねておいて慣れておくのが大切だと思います。

- とりあえずやってみるを忘れないこと
- 写経で終わらないこと
- 新しいものに飛びついてHello worldすることを忘れないこと

この辺を忘れないようにしたいですね。