はじめに
プログラミング言語を新しく勉強するとき、Hello world!した後に何しよう?と思ったら、自分はとりあえずストップウォッチを作ることにしています。
理由はいくつかありますが、
- 時間測定はどのプログラミング言語でもほぼ必ず実装することになる
- 時間や小数などの基礎的な型を知るきっかけになる
- 言語を学習するときの難関である「非同期処理」の練習になる
という3点が大きいです。
具体的なストップウォッチ記事は、たとえば C# 言語ならば「C# ストップウォッチ」でGoogle検索すればすぐに出てきます。
とはいえ、それだとどの記事を読んだらいいのだろう?と迷ってしまうと思いますので、自分が言語を学ぶ際に参考にしたウェブ記事を末尾に載せておきます。
なぜストップウォッチ?
時間測定はどんな言語でもほぼ使う
厳密には業種や言語にも依るとは思いますが、「プログラムの実行時間を調べる」という行動はどんなアプリケーションやサービスを作る上でも必要になります。
ブラウザやアプリを起動するときに、ローディングが長くてイライラした経験が誰しもあると思います。実行時間がかかりすぎると、それだけでアプリの価値を損ねてしまいます。
「アプリなんて動けばいいじゃん!」と考えている方も多いと思いますが(実際私も割とそう思ってますが)、より価値のあるアプリを作るためには、アプリの実行時間を意識して改善すると良いでしょう。
そのためにも、まずはストップウォッチの実装から初めてみると良いと思います。
時間や小数などの型を知れる
最近はjavascriptやPythonからプログラミングに初めてとりかかり、別言語における「型」(タイプ)の概念をあまりよく知らない、という方も多くなってきたと思います。
ストップウォッチでは、「文字列」「時間」「小数」といった3種類の値を扱うことになります。
ストップウォッチを作っているうちに、文字列に時間を足す、時間を文字列に変換する、等を行う必要がでてくると思います。
世の中には、文字列+時間 が直接できる言語と、時間を文字列に変換してからでないと 文字列+時間 ができない言語があります。
11:30:25 を表す時刻に 1 を足した結果が、
11:30:26 の時刻になったり、"11:30:251" の文字列になったり、エラーになったり……言語によってこの辺の細かい仕様は異なります。この違いをしっかり把握しておきましょう。
前述のjavascriptやPythonでは値の型の違いをあまり気にせずプログラミングできますが、C++やC#、TypeScriptといった言語の場合には型の違いをしっかり理解した上でプログラミングをしなければなりません。
逆にいえばC++やC#に慣れきった人がjavascriptやPythonを学習すると面食らうと思います。私もそうでした。
Hello World!やfor文などの基礎を学んでいるうちは文字列と整数を扱うことがメインになるとは思いますが、時間についてのサンプルにはまだ触れたことがないという方もいるかもしれません。言語によっては小数も整数も同じnumber型として扱う!みたいなものもあるので、こういった言語ごとの型の違いについて把握するのにも良いサンプルになると思います。
また、後述する非同期処理を扱うのに使われる型も学べます。しっかり学習すれば、関数自体を引数として扱う関数や、アロー関数、async/awaitなどの非同期処理用の文法も扱えるようになると思います。
非同期処理の練習になる
非同期処理とは何か?ざっくり言えば「別々の仕事を同時に行う」ことです。ストップウォッチによる時間測定はその最も分かりやすい例です。
ストップウォッチは、「スタートを押した時間から現在までの時間を測定し、それを画面に表示する」というのが主な機能のひとつです。
そのへんの店で売ってるリアルなストップウォッチは、例えば短距離走の時間を測ったり、料理するときの茹で時間を測ったりするのに使いますよね?ストップウォッチは、「何か別の仕事をするのにかかる時間を測定する」という仕事が主な用途です。つまり、時間を測定・表示すると同時に別の仕事も同時にこなせるような状況になっている必要があるのです。
これが「非同期処理」の例です。実際の業務プログラミングでは他の機器から通信を待機するのに非同期処理はよく使います。とはいえ、とりあえずオフラインで非同期処理の練習をしたければストップウォッチはよい例になると思います。
(ただ、同期的にストップウォッチを作るコードを紹介しているサイトもあります。同期的なストップウォッチを作ってから、非同期的なストップウォッチを作っても良いと思います)
ちなみに、よくある誤解ですが「非同期処理」と「マルチスレッド」は別々の概念です。
例えばマルチスレッドでない環境のJavaScriptでも、非同期処理は実行できます。
マルチスレッドならば非同期処理をしょっちゅうすることはその通りなのですが、マルチスレッドでないからといって非同期処理を行えないということはないのです。
ストップウォッチの作り方を紹介しているページの例
JavaScript
【JavaScriptの実践】ストップウォッチの作り方 | ワードプレステーマTCD
https://tcd-theme.com/2022/06/javascript-stopwatch.html
C#
ストップウォッチ アプリをつくる方法 | 鳩でもわかるC#(C#)
https://lets-csharp.com/howto-stop-watch/
私が新しくプログラミング言語を習得するごとに、ここに記事を追加していきます。