見出し画像

プログラミングレベルが上がった瞬間3選

こんにちは、ムンペイです。
30年以上プログラミングをしてきました
その中でいろいろなことを習得してきましたが、プログラミングレベルがグッと上がったと思ったタイミングがいくつかあります。それを時系列に3つご紹介します。


1. ファイル読み書き

最初にレベルアップを感じたのは、ファイルをオープンしてデータを保存し、またあとでファイルからデータを読み込む、という処理を覚えた時です。

はじめに覚えたのは、編集ソフトのように一度プログラムを終了してもあとでまた続きができるという利用法でした。次に、別のソフトに後続の処理をしてもらうために保存するという利用法も覚えていきました。時間方向の自由と、先人の多様な成果も使えるようになったことで、実現できることがとても多くなりました。

また、保存するときのフォーマットについても大いに学びになりました。プログラムの実行中のデータは実際はメモリ上にあるわけですが、ソースコード中の何かの変数に紐づいていているのでメモリ上にどこに何を置くといったレイアウトを意識することはありません。しかし、ファイルに保存するときは、ソースコードの役割をするものはないので、配置の仕方のルールを作っておかなければ後で読み込めません。

例えば画像ファイルをよく触っていたので BMP (Windows Bitmap) や JFIF (JPEG向けフォーマット) を読み書きするプログラムを作ってました。先頭4バイトはデータ種類、次の4バイトはその後に続くデータ長、そしてさっきのデータ長だけデータが続く、といった構造が仕様化されています。

このようなフォーマット構造の工夫は、空白や改行のような区切りルールがあるテキストファイルよりも、何でもアリのバイナリファイルの方が興味深いのですが、マーカー+データというペアでデータを保存する戦略は、HTMLやJSONなどテキストベースのフォーマットであっても、BMPやJFIFのようなバイナリフォーマットであっても同じだったりします。

2. デバッガ

次のレベルアップの瞬間は、デバッガを覚えた時です。

プログラムにバグがあるときに一番よくやるデバッグ方法は、print文の挿入によるプリントデバッグではないでしょうか。原因箇所が特定できているときは良いですが、そうでない場合は大量のprintを埋めて大量の結果とにらめっこ、というのもままある光景です。

こういうときはデバッガが役に立ちます。処理をソースコードの1行進んでは止め、1行進んでは止め、という感じで(あるいは命令単位で同様に)実行しながら変数やメモリ内容の変化を確認できます。print文を挿入しないプリントデバッグと考えても良さそうです。

ところで、プログラム全体を1行1行止めて実行していては時間がかかりすぎます。ですので、ブレイクポイントという機能を利用して問題が起こる瞬間の直前までは普通に実行し、その後デバッガで実行するようにします。そのため、問題がありそうな範囲を徐々に狭めていく技術が身につきました。

もう一つ、C/C++のデバッガではソースコード上の変数の値だけでなく、CPU内部のレジスタやメモリ上のデータも見られます。これらの挙動を追跡しながらデバッグすることで、プログラムはどのように動くのかが良くわかるようになりました。

今はPythonばかり触っているのでレジスタなどを見る機会はなくなりましたが、ブレーク、ステップ実行、ウォッチなどを活用したデバッグはとても役に立ちます。

3. ネットワーク通信

3つ目は、ネットワーク通信を覚えた時です。

通信プログラムへの入門は、クライアント&サーバーという概念への入門でもあります。API という約束を通じて、異なるマシンに仕事を頼めるようになりました。これまでは人間がコンピュータで仕事をするという感じでしたが、コンピュータがコンピュータを使って仕事をする世界に入門したという感覚を覚えています。

さらに、ファイル読み書きの時もそうでしたが、通信プロトコルやAPIを自分で設計してみた経験は、確実な処理に必要なやり取りの方法の学びになりました。

また、ネットワーク通信は遅いので、通信中に GUI が固まらないよう非同期的に実行しておくとか、並行処理の重要性を学ぶ機会にもなりました。

現代のプログラミング環境でも通じるか

以上が私がレベルアップを感じた瞬間3選ですが、現代のプログラマにもお勧めできるものばかりです。

現代のプログラミング言語もよくなり、豊富なライブラリがついているので、ファイル読み書きもネットワーク通信も簡単になりました。フォーマットやプロトコルなどに苦労する場面は減りました。

また、現代のコンピュータは非常に高速なので、バイナリファイル何それ?JSONでいいじゃん!とか、うちは光回線だからネットワーク通信も一瞬だぜ!といった感じで、なかなか工夫の機会が少なくなっているようにも感じます。

道具の進化としては良いことなのですが、積極的に学びにいかないと機会が得られないでしょう。学びとしてはやはり自分で悩んで設計する経験が大事だと思います。数msでも速くする!といったことを楽しめる方だと、学びは早いかもしれません。

その後の学びは?

もちろん、その後もいろいろ学びはありました。
正規表現、ユニットテスト、Docker、Web アプリ技術、などもレベルアップを感じた時かもしれません。詳細はまたの機会に。

これにて御免!

UnsplashIgor Omilaevが撮影した写真を使わせていただきました)

この記事が気に入ったらサポートをしてみませんか?