コードをモジュールに分割する

English version.

先日、大学で一緒にコンピュータ科学を学んでいた友達と話す機会がありました。彼は今、大学で情報科学の准教授をしていて、仕事の一環でプログラミングを教えています。
彼も自分もエンジニアリングが好きであり、またエンジニアを育てる立場にあるので、自然と会話はプログラミング教育についてになりました。

自分の今までの経験を振り返ると世の中には周りのコードを真似して、エラーが出たら調べながら直していくのでなんとかなっているエンジニアがいると思っています。以前モバイルアプリのエンジニアを面接していたら、その方はViewやViewModelがどういう仕組なっているかを理解しておらず、ただ、画面をコピーして、少し変更することで仕事をしていると言っていました。
一方で、世の中には上記のような変更はもちろんできますが、それ以上に、初見の問題に対して解決策を見出して、それを実装できるエンジニアもいます。
多くのエンジニアは最初は前者の状態からスタートして、少しずつ後者のような状態に成長していくと思います。では、前者の状態から後者の状態に成長するためにはどうすればいいのでしょうか?「経験」という言葉で片付けてしまうと、他の人が簡単に真似できないので、それ以外のものを考えたい、という話をしました。

すると友達は、成長していく中で「コードをモジュールに分割できるかどうか」が大事なスキルの一つだと気づいたと言いました。「モジュール」という単語は少し抽象的で場合によって意味が異なるのですが、ここでいう「モジュール」とは、コードを複数のファイルに分割するという意味です。

この話をしているうちに、なぜこのスキルが大事なのかについていくつか理由があることに気づきました。

1. コードを意味のある単位に分割させられる

すべてのコードが1つのファイルにまとまっていると、どの変数、関数、クラスでもスコープに入っていれば、名前を入力するだけで参照できます。
ただ、ファイルを分割するとなると、どの部分をどのファイルに入れるか、どのように分類するかなどを考えなければなりません。例えば100行ごとに分割する、という適当な仕事をすることはないと思うので、コードの各部分の意味を考えて、それを最も意味の通る形で分割する必要があります。
経験があるエンジニアの方であれば気づかれるかと思いますが、この考え方やスキルはソフトウェア設計ではとても重要です。

2. 間のインターフェースを考えさせられる

コードを分割することで、どのファイルからどのファイルを参照するかを考えさせられます。これは、ファイルが外部に提供する「インターフェース」を考えることになります。

  • ファイル内のすべての関数や変数を外部に公開する必要があるか?

  • クラスを公開する必要があるか、関数だけでいいか?

  • どのようなパラメータが呼び出し側にとって意味があるか?、等

この内容は、Web APIでもライブラリでも他の方が使うようなものを設計するときには同じことを考える必要があり、とても重要なスキルです。

3. 複数のファイルを使う方法を知らないといけない

以前の2つよりも実践的なのですが、複数ファイルを扱う場合は使用している言語の仕組みを理解する必要があります。例えば、C言語の場合は、複数のファイルをコンパイルしてリンクする方法を知らないといけませんし、Pythonの場合は、モジュールやパッケージをインポートする方法を知らないといけません。最近はIDEが充実していたり、スターターキット的なテンプレートレポジトリがあるため、多くのエンジニアは自分のコードがどのように実行されているかを知らなくても済んでしまっています。
ほぼほぼそれで問題ないのですが、時折、上記のようなことを知らないといけない場合が出てきます。例えば、モバイルアプリを開発している場合、XcodeやAndroid Studioを使ってコードを書いていると思いますが、開発しているアプリをCI/CD環境でビルドする場合は、別のツールを使うことになるので、そのツールがどのようにファイルを読み込んでビルドしているかを知らないといけません。

ファイルにとどまらない

この話をしているうちに、これはソフトウェアを設計するときにやっていることと同じだと気づきました。開発の最終形をイメージしつつ、それを小さな単位に分割して、それぞれを実装していく必要があります。また、それぞれの単位がどのように関わり合っているか、どのように使われるかを考える必要があります。そして、それぞれの単位がどのように組み合わされて実行されているかを知る必要があります。このブログでは単位はファイルでしたが、それはパッケージやライブラリ、マイクロサービスなどにも同様に当てはまります。
コードを複数のファイルに分割することは、これらのスキルを最初に実践する方法の一つであり、プログラミングを学ぶ上でとても重要なステップだと思いました。

これからは、エンジニアスキルの評価に使ってみたいな、と思っていますが、皆さんの参考にもなれば幸いです。

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