会社カレンダーを別ファイルで持つだけで勤怠ロジックの見通しが良くなった話

会社独自休日と終わらない勤怠システム修正

総務部門の壁の向こうから聞こえてくる「今年の飛び石連休は。合間の平日を休みにしよう」という会話。それを耳にした瞬間、「あ、またあの作業か……」と胃がキュッとなる。勤怠集計のプログラムを開き。直接その日付を例外処理として書き足さなきゃいけないからです。

日本の祝日判定だけであれば、外部ライブラリを活用すればあっさりと解決する。
Pythonであれば`jpholiday`という便利なパッケージが存在し、これを組み込むだけで国民の祝日は自動で判定してくれる仕組みになっている。
だが、会社特有のルールとなるとそうはいかない。
創立記念日、夏季の特別休暇、そして拠点ごとに異なる工場の稼働停止日。
これらは標準のライブラリでは一切カバーできない領域となる。

終わらない日付のハードコード修正

まず、毎年春先に総務から「今年は拠点Aだけ5月2日を休日にする」と告げられるたび。冷や汗をかきながらPythonコードのif文に直接日付を追記していた。わずか1行の修正なのに、全拠点のテストをやり直すハメになり。ゴールデンウィーク直前の深夜に一人オフィスでキーボードを叩きながら泣きそうになっていた。

結局、手っ取り早く解決しようとして。プログラムの中に特定の日付を直接書き込んでしまう。いわゆる「ハードコード」と呼ばれる、初心者がやりがちな失敗だ。条件分岐のif文が、まるで継ぎ足し秘伝のタレのように、どんどん増えていく。最初は「今回だけ、とりあえず」と自分に言い訳をしていたが。年を追うごとにコードは巨大化し。自分でも中身がよくわからないスパゲティ状態が完成する。

誰も読み解けない複雑な条件式が完成する。プログラムを起動するたびに。今年は何かの休日を拾い損ねていないかと不安に苛まれる。毎年同じ時期に同じような修正作業に追われ、その度にエラーの恐怖と戦う。この「終わらない修正」のループから抜け出さない限り。本当の意味で業務を楽にしたとは言えありません。

コード内休日判定の悪夢、外部化で保守性向上

次に、なぜ、コードの中に休日判定を書くことがこれほどの苦痛を生むのか。理由はすごく単純だ。カレンダーが変わるたびに「中身のコード」をいじってテストしなきゃいけないから。それがミスやバグの元凶になるのです。

プログラムのコード内に特定の値を直接記述するということは。ルールの変更をエンジニアあるいはコードを書いた本人しか行えなくなることを意味する。担当者が有給休暇を取っている最中に急なルール変更があれば、業務は完全に停止する。非エンジニアである総務担当者に。たった一つのカンマやインデントのズレが致命傷になるPythonコードを直接触らせることは到底できありません。

コードを修正した際。インデントを1つ間違えて本番の勤怠集計が全拠点でエラーを吐き出した。翌朝、出社するなり部長からの内線で呼び出され。「なんで手作業でやってた頃より遅れるんだ」と詰め寄られて胃の奥が鉛のように重くなった。あのときの脂汗は今でも忘れられありません。

疎結合:設定外部化による効率化

一方で、ここで必要になるのが。保守性の高いシステム設計で重視される「疎結合」という考え方だ。不変のロジックである計算手順と。可変のパラメータである休日データ等の設定を完全に分離する。プログラムは「今日が休みかどうか」を自分の内部で判断するのをやめる。代わりに、外部に置かれた設定ファイルを見に行き。そこに書かれた結果をただ受け取るだけの構造に変える。

コード修正なら最低でも30分はかかるテストと反映作業が。外部ファイルの書き換えならわずか2分で完結する。この差が、一ヶ月、一年と積み重なれば、どれほどの自由な時間を生み出すか。

この構造に移行すれば、プログラム自体は一切変更しなくてよくなる。変更を加えないということは、新しいバグが入り込む余地がなくなるということです。

そのため、設定を外部ファイル化することで、非エンジニアである実務担当者でも。コードを1文字も触らずに業務ルールを変更できるようになる。自分が休みの日に総務が勝手に休日を追加してくれて。システムが文句も言わずに正常稼働する。属人化を排除し、システムの寿命を飛躍的に延ばす設計の第一歩がここにある。

Excelマスタでシンプル休日管理

外部ファイル化すると決めたら、次に考えるべきはそのフォーマットだ。システム開発の世界ではJSONやYAMLといった形式が好まれる。しかし、相手はプログラミング言語に触れたことのない総務や人事の担当者である。彼らにJSONの括弧のネスト構造を理解させ。カンマの抜けがないようにテキストエディタで編集させるのは現実的ではない。入力ミスが起きれば、結局プログラム側で読み込みエラーが多発し、元の木阿弥となる。

そこで最も有効なのが。誰もが使い慣れているExcelをマスタファイルとして採用することだ。直感的に操作でき、入力規則を設定すれば表記揺れも防げる。総務担当者にとって。Excelの表を更新することは日々の業務の延長線上でしかありません。

しかし、設計図は極めてシンプルにする。縦軸に1年分の日付を並べる。横軸には「本社」「大阪支店」「九州工場」といった拠点名を配置する。そして、それぞれの交点に「休日は1。出勤日は0」というフラグを立てていくだけです。

ここで一度立ち止まって考えてみてください

Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。

プログラミングスクール Enjoy Tech!(エンジョイテック) →

Excelマスタで拠点別休日を簡単管理

このマスタさえ作ってしまえば、各拠点の独自の休日はすべてこの表の中に吸収される。振替出勤日も、創立記念日も、飛び石連休の中休みも。すべてExcelの該当するセルを「1」に変えるだけで終わる。総務部門は毎年年末に。翌年の会社カレンダーを見ながらこのExcelを更新する作業をルーティンに組み込めばいい。これで、拠点ごとに休日ルールが異なるという複雑な勤怠管理の課題は。視覚的に管理しやすい一覧表へと見事に姿を変える。

システムはただ。毎日起動したときに指定されたフォルダにあるこのExcelファイルを読みに行くだけだ。人間のための見やすい表と、プログラムのための読み取りやすいデータを両立させる。これが実務で保守しやすいマスタ設計の最大のコツです。

pandasでExcel連携、日付型統一の肝

さらに、マスタが完成したら、いよいよプログラム側の実装に入る。
Pythonを使えば、外部のExcelファイルを読み込んでデータとして扱うのは非常に簡単だ。
強力なデータ分析ライブラリである`pandas`を活用する。
数十行に及んでいた条件分岐のコードが、嘘のように短い記述で置き換わる。

かつて50行を超えていた複雑なif文のジャングルが。pandasの読み込みと辞書化によって。わずか3行のスマートなコードに集約された。

実装の流れは明快だ。
`pandas`の`read_excel`関数を使って、先ほど作成したカレンダーマスタを読み込む。
読み込んだデータフレームを、Pythonが扱いやすいように辞書型に変換しておく。
あとは、判定したい日付と拠点名をキーにして辞書を検索し、フラグが「1」であれば休日として処理を進める。

日付処理の落とし穴と安定稼働の秘訣

まず、ここで、非エンジニアが必ずと言っていいほど直面する大きな落とし穴がある。日付のデータ型の不一致だ。Excelから読み込んだ日付は。pandas内部でタイムスタンプ型として認識される。プログラム側で取得した「今日の日付」が文字列や別の型になっていると。見た目は同じ「2024-05-02」でも、システムは「別物」と判断してしまう。キーが見つからないというエラーを出して。プログラムが唐突に停止する原因の大半はこれです。

これを防ぐためには。比較する前に必ず日付のフォーマットを統一する処理を挟む必要がある。読み込んだExcelの日付列を。特定の文字列フォーマットに明示的に変換してから辞書のキーとして扱う。このひと手間を加えるだけで、日付比較の確実性は劇的に向上する。

pandasで効率化と安定稼働

初めてpandasでExcelを読み込んで辞書化し。日付と拠点名をキーにして一発で休日フラグを取得できたとき。これまで書いてきた冗長なif文がバカバカしく思えて思わず天を仰いだ。画面の向こうでシステムがカレンダーを瞬時に理解して動いているのを見て。声が出そうなくらい感動した。

次に、Pythonの辞書から値を取り出すときは、エラーハンドリングを怠らない。もしマスタに存在しない未来の日付で検索をかけてしまっても。エラーを出さずにデフォルト値として出勤日を返すように設計しておく。エラーで処理全体を止めるのではなく。想定外の事態でも安全側に倒して動き続ける仕組みを作ることが、安定稼働の要となる。

運用設計の要 休日判定の外部ファイル化

休日判定を外部ファイルに切り出すというアプローチは。単なるコードの整理術ではない。それは業務とシステムの責任分界点を明確に引くという。運用設計の根本に関わる転換だ。プログラムの中に業務ルールを書き込んでしまうと。ルールが変わるたびにプログラミングの知識が要求される。属人化を解消するために導入したはずの自動化ツールが。新たな属人化の温床を生み出すという最悪のパラドックスに陥る。

一度作り上げた計算ロジックは。よほどのことがない限り触らない大切な資産として保護する。日々変化する休日や拠点の情報といった設定項目は。現場の担当者が運用の中で柔軟に書き換えていく。この明確な線引きこそが、長く続く自動化のコツとなる。

会社カレンダー外部化で開発者の心の平穏

一方で、会社カレンダーを別ファイルで持つという、ほんのわずかな工夫。それだけで勤怠ロジックの見通しは驚くほど良くなり。何より開発者自身の心の平穏が保たれる。毎年のように「今年の休日はどうなるんだ」と怯える日々を終わらせるために。今すぐハードコードされたif文を消し去り。Excelファイルの作成に取り掛かるべきです。

関連リンクとチェックリスト

学習サービスとアンケート

このスキルを活かしてさらに前へ進むなら

Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。

プログラミングスクール Enjoy Tech!(エンジョイテック) →