本連載では複数回にわたり、GNU makeとMakefileについて基本的な機能を説明してきた。これでGNU make、およびMakefileのことはかなり理解できるようになったと思う。もっと込み入ったテクニックもあるのだが、それらは主にプログラミングのビルド処理で使われるものなので、ここではこれ以上深追いする必要はないだろう。今回からは本題である、このMakefileを仕事に適用する方法を取り上げていく。

Makefileとビジネスフロー

Makefileはもともとはプログラミングにおけるビルド処理を記述するためのものであり、現在でもそれはその通りなのだが、これまで説明してきたように、Makefileが体現している概念というものはビルド処理に限らずさまざまな処理に応用することができる。本質的に物事を整理する仕組みに向いている。

多くの場合仕事は順番に処理するものだが、場合によっては前提となる条件が複数になることもある。こうした関係性はMakefileに整理する関係性と同じだ。タスクをMakefileのターゲットとして整理していくことで、ビジネスフローをそのままMakefileに落とし込むといったことができる。

もちろん、Makefileに全てを落とし込んでいくには、ある程度プログラミングのスキルも必要になるのだが、そういった点も含めて長期にわたって取り組んで損をしない仕組みでもある。シェルスクリプトやプログラミングに詳しくなればなるほど、仕事の自動化がしやすくなるからだ。

また逆の発想となるが、Makefileにビジネスフローを落とし込む使い方をしていくと、久しぶりにその仕事をするときにMakefileを読むことで仕事の手順や内容を思い出すことができる。要するにMakefileが仕様書であり、手順書という状態になるのだ。これはかなり効果的なのでお勧めしたい。

例えばこんなアプローチ

一口に「仕事」といってもやることは千差万別だ。経理処理といった定型的な作業もあれば、プロジェクトごとにことなる作業もあり、粒度もまちまちではないかと思う。

どのように切り分けるかはその人のセンス次第だが、ある程度切りの良い単位で仕事を「ディレクトリ」に分けるようにしてみよう。例えば、~/Documents/に仕事ごとにディレクトリを作っていくイメージだ。

$ tree Documents
Documents
├── A社システム開発(Web)
├── B社システム開発(Web)
├── C社システム運用(サーバ)
├── C社システム運用(給与)
├── 経理処理(経費関係)
├── 経理処理(売上関係)
└── 出勤簿

7 directories, 0 files
$

そしてそれぞれのディレクトリの下にまず1つ、Makefileを用意する。このMakefileの内容はそれぞれの業務に即したものにする。

例えば月に1回、経理処理を行うのであれば、それ専用のMakefileを作成する。ターゲット例は次の通りだ。

  • add: その月の経理処理用ディレクトリを作成し、必要なファイルを用意する。例えば「202208」という年月の名前のディレクトリを用意し、そこに経理処理に必要になるデータなどを配置する
  • clean: 不要なデータを削除する処理を書いておく

202208ディレクトリにも、作業用のMakefileを用意する。これはテンプレートファイルを用意しておいてそこからコピーして作成してもよいし、includeディレクティブで共有のMakefileを読み込むようにしてもよい。使いやすい方を選択していただきたい。

こうして用意した「202208/Makefile」には、次のようにターゲットを用意して、経理処理を行うためのビジネスフローをなるべくそのまま書いておく。

  • fetch: 経理処理に必要になるデータを自動取得または自動生成する
  • edit: 収集されたデータをベースに編集処理を行う。プログラムで自動処理させたり、スプレッドシートアプリケーションを起動したり、Webアプリケーションを呼び出したりする
  • report: 作成したデータを提出する。報告書を提出するメールを自動生成して送信したり、メールアプリケーションを起動したり、Webサイトを自動操作して自動送信する

こんな感じで整理しておくと、業務が変わっても同じ手順で作業を行うことができるし、身に付けた自動化のスキルをほかの業務にも応用できる。使えば使うほど作業効率が上がっていきやすい。

税務処理やライセンス更新または請求書処理など、年に1~数回しか処理しないような業務も、ディレクトリとMakefileにまとめておくようにすると、いざというときに思い出す手間を省くことができる。このように、Makefileとビジネスフローをはなかなかに相性が良い。

もしビジネスフローをMakefileに落とし込むことができないなら、それはもしかすると処理自体が難しすぎるか、そもそも仕事として整理できていない可能性がある。そうした場合は、仕事そのものを一度見直してみた方がよいかもしれない。

実際に試してみようー経理処理編

ここからは、具体的な実装例を見ていこう。例えば、「日々の売上を整理する」という業務について考える。まず、次のようにこの仕事を「~/Documents/経理処理(売上関係)」というディレクトリで行うことにする。関係するファイルは、最初は次のような感じで用意しておく。

$ tree 経理処理(売上関係)
経理処理(売上関係)
├── Makefile
├── mk
│   └── base.mk
└── templates
    └── Makefile

2 directories, 3 files
$
  • ビジネスフローをディレクトリとMakefileへ落とし込んだ最初のステップ

    ビジネスフローをディレクトリとMakefileへ落とし込んだ最初のステップ

売上関係の経費処理は日単位で行っているとして、実際に作業するときには「20220801」「20220802」といった年月日のサブディレクトリを作成して、そちらで作業を行うことにする。このサブディレクトリ作成の処理はMakefileに書いておく。次のような感じに書いておけばよいだろう。

all:    clean

#========================================================================
# 新規作業ディレクトリのセットアップ
#========================================================================
add:
    dir=$$(date +%Y%m%d);                       \
                                    \
    if  [ ! -e $${dir} ];                   \
    then                                \
        mkdir   -p $${dir};                 \
        cp  templates/Makefile              \
            $${dir}/;                   \
    fi

#========================================================================
# クリーンナップ
#========================================================================
clean:
    for i in 20*;                       \
    do                              \
        cd  $${i};                      \
        make    clean;                      \
        cd  ..
    done

年月日のサブディレクトリを作成したら、そこにtemplates/Makefileをコピーしている。templates/Makefileは次のような内容にしておく。

include ./../mk/base.mk

つまり、サブディレクトリに用意するMakefileの本体はmk/base.mkというMakefileだ。

mk/base.mkの内容は、次のような感じにしておく(今回はコメントだけで処理は省いているが、実際にはここに処理を書いておく)。

fetch:
    # 経理関連データの取得処理

edit:
    # 経理関連データの編集処理

report:
    # 作成した経理報告データを提出する処理

clean:
    # 不要なデータの削除処理

手順は書いてある通りなので、後は「cd 20220802; make fetch edit report clean」のように実行して、導かれるままに処理を進めれば仕事は完了ということになる。

  • 毎日同じように仕事をこなしていく

    毎日同じように仕事をこなしていく

このアプローチはビジネスフローを整理すると同時に、そこで利用したデータに関しても構造的に整理した状態が生まれるという利点がある。このように整理されたデータは、後からスクリプトやプログラムを使っていくらでも利用できる。整理しておくだけで価値がある状態になる。

使うのはMakefileのシンプルな基本機能

このアプローチで使うMakefileの機能はシンプルなものばかりだ。これまでに取り上げてきた機能は、ソースコードのビルド処理などで必要とされることが多く、こうした手順の整理といった用途ではそれほど使わないことが多い。

ただし、仕事の内容によってはもちろん使うこともある。ただ、どちらかと言うとシェルスクリプトのスキルの方が重要になってくるように思う。

Makefile自体がかなりプログラミング寄りのツールなので、このツールをビジネスフローの整理に使っている方はそれほど多くないかもしれないが、本質的にはこういった処理に向いているので、ぜひ活用してみていただきたい。これをどのように使えば処理の自動化ができるか、次回以降、数回に分けて取り上げていく予定だ。