絶対にやってはいけないシステム開発スケジュールの作り方はっしー2018.07.07キャリア働き方Shareこんにちは、ニュージーランドで働くプログラマのはっしーです。僕がかつてシステムエンジニアとして働いていたとき、めちゃめちゃ苦手だったのがスケジュール作成。予定通りに進まず、毎回のようにデスマーチ(=連日の残業地獄)に陥ってしまっていたからです。何が原因なのかさっぱりだったんですけど、仕事をやめてから5年経ってようやく問題点がわかってきました。我慢するなら仕事辞めます。会社が有給を取らせてくれない?有給休暇の取りやすい職場に必要な3つのポイントすべての工程のスケジュールを一度に引いてしまうシステム開発は、作業が段階的にわかれているのが普通です。ように開発が進んでいきます。ここで注意してほしいのは「前の作業が終わるまで次の作業ボリュームが確定しない」という点です。要求された機能を実現するためにどれくらいの画面やフォームが必要になるかは、基本設計が終わってみるまでわかりません。基本設計が終わるまで詳細設計のスケジュールを引くことはできないはずなんです。詳細設計は2週間でいけるかな〜」などと適当にスケジュールを引いていると、前工程で予想外の開発ボリュームがあらわれた時点でジ・エンド。「前の工程が終了次第、成果物のボリュームをみて次の工程のスケジュールを考える」と段階的に予定を決めていくようにしましょう。そもそも、1ヶ月も先のことまで見通してスケジュールを引こうというのが無謀すぎます。人間そんな未来のことまでわかりません。まともに予定が立てられるのはせいぜい2週間くらいと思っておいたほうが確実です。一切のバッファをもうけない「1週間で終わるかな〜」と思われる作業があったとします。それに対し1週間ぴったりでスケジュールを引いてもよいのでしょうか?当然、答えはNOですね。システム開発に限らず、あらゆる仕事には「不確実性」がつきものです。急ぎの仕事が飛び込んでくるかもしれないし、思いもよらないミスが見つかって作業がやり直しになるかもしれないし、インフルエンザにかかって一週間休んじゃうかもしれない。そんな不測の事態に対応するためにも、スケジュールにはバッファ(あそび)をもうけておく必要があります。これを怠ると、ちょっと想定外のことが発生した時点でもう残業から逃げられません。バッファの取り方にもコツがあります。バッファは、各工程に割り振るのではなく、まとめて全行程の最後に設けるようにしましょう。いうと、各工程の直後にバッファがあると次のような問題が起きてしまうからなんです。時間があると思ってギリギリまで作業に着手しない(学生症候群)早く仕事が終わっても結局バッファいっぱいまで仕事してしまう(パーキンソンの法則)これは「クリティカル・チェーン・マネジメント」と呼ばれる手法です。具体的な内容をはずばり『クリティカルチェーン』という本に詳しく書かれていますよ。クリティカルチェーン―なぜ、プロジェクトは予定どおりに進まないのか?作業の遅れを残業で取り戻そうとするいざ開発を進めてみると、思ったより難しくてはかどらないってことがよくあります。「スケジュール通り作業ができないなんて、使えないヤツと思われるかも......」そんな不安から、ついつい残業してでもスケジュールに間に合わせたくなる気持ちはわかります。作業の遅れを残業で取り戻すのは絶対にダメ!残業しないと間に合わない状態にあるということは、スケジュールに対して作業量が多すぎるんです。それを無理してスケジュール通りに進めていくと、後半になればなるほど作業量がふくれあがって、残業でもカバーしきれなくなります。そこまで事態を放置してしまうとリカバリーも困難。「スケジュール通り進んでます」ってずっと報告してきたのに、いまさら予定を変更するなんて無理でしょう。徹夜と休日出勤を繰り返し、泣きながら納期に間に合わせる地獄が待っています。スケジュールに対して遅れが出るのは悪いことではありません。重要なのは、遅れが出た時点ですぐに上司に報告し、スケジュールの延長や開発ボリュームの削減を申し出ること。早めにヘルプを申し出れば周りも手伝いやすいですからね。万が一、上司が「なにがなんでもスケジュール通りにやれ!」と指示してきたとしたら......その会社はけっこうやばいので転職を考えたほうがよさそうです。まとめ〜スケジュールは柔軟に変わるものだと考えよう〜自分がしでかしてきた失敗をひとことでまとめると「一度決めたスケジュールは絶対だと思いこんでいた」と表すことができます。システム開発では、いきなり完璧なスケジュールを作ることなど不可能です。次回も働き方のヒントになる記事をお届けします。我慢するなら仕事辞めます。PopularPR連載一覧イベント情報Web制作デザインTechnologyAIオウンドメディアSEO対策アプリ開発システム。