株式会社クイックのWebサービス開発blog

HAPPYなサービスプランナー・エンジニア・デザイナーのブログです。

【AWS Health】AWSのメンテナンス情報を取得してChatworkへ通知するスクリプトを作った

こんにちは。クイックSREチームのみっちーです。

先日、「AWSからのメンテナンスメールを見落としていて、知らぬ間にEC2が再起動」なんてことがありました。
ログ見ても原因不明。結局メンテナンスというオチで、工数返せよ!って気分になりました。(みなさんもそんな経験ありませんか?)

ということで、反省も踏まえて
AWSのメンテナンス情報を取得してChatworkへ通知するスクリプトを作った」
のでご紹介します✧(・ㅂ・)و

目次

1. 概要と背景

2. スクリプトの設計

3. スクリプトの実装

1. 概要と背景

概要

このスクリプトは、APIAWS コマンドラインインターフェイス) を利用して、「AWS Health」サービスへ情報を取得。
その結果をChatworkへ通知するシェルスクリプトを作成し、cronで1日1回動かすものです。

AWS Health」とは

AWS Health」は、ログインアカウント上で利用できる全サービスについて、以下の情報を提供するサービスです。

  • 再起動を伴うメンテナンススケジュール
  • issues

背景

これまでは、利用しているAWSサービスの全メンテナンス情報をメールで受信する運用にしていました。
しかしこの運用では、以下のような課題がありました。

  • issuesを含む全メンテナンス情報が来るので、受信メール数も(当初の想定よりも)多く、内容精査が少々面倒。
  • 基本的にはissuesが大多数。そのうちにメール自体を見なくなり、再起動を伴うような肝心なメールの見落とし頻度が増加。
  • 結果として、「知らぬ間にEC2が再起動していた」ということも何度か発生。
  • 上記に付随し、「予期せぬ再起動」なのか「メンテナンスによるもの」なのかの切り分けにも工数を割かれていた。

そこで、「再起動(ユーザ影響)を伴うメンテナンス情報だけを効率よく拾いたい」と思い調査を開始しました。

2. スクリプトの設計

ほしい情報

AWS管理コンソール上で、

と進むと確認できるメンテナンス情報の中で、
「再起動(ユーザ影響)を伴うメンテナンス情報だけ」がほしい。

具体的には、
以下画像の「Affected resources」に影響があるインスタンス数が表示されており、かつ「StatusがCompleted(またはClose)になっていない」ものが今回取得したい情報です。 f:id:aimstogeek:20190313161220p:plain

設計イメージ

以下を満たすことを前提に行いました。

  • 最新のメンテナンス情報を最低でも日に1回は取りたい。
  • 将来追加されていくAWSの新サービスについても、取得項目を追加せずとも動的に追従してほしい(ツールのメンテナンスコストを極力減らす)
  • 自分達が影響を受けるものだけを抽出するようにしたい。
  • できるだけ気づきやすいところに通知するようにしたい。※弊社だとChatworkを日々の業務で使っているので、そこに通知したい。
  • Lambda等、他のAWSサービスと連携させて~というのは、(新メンバーなど)後々のメンテナンス性が良くないので、できるだけ避けたい。

3. スクリプトの実装

事前準備

ChatworkAPIの利用申請

  • APIを利用できるように事前に申請をしてください。
  • なお利用申請方法はここでは省きます✧(・ㅂ・)و

スクリプト実行サーバの構築

  • 本記事では、「Amazon Linux AMI release 2017.03」を実行環境として記載しています。
  • AWS API コール用のコマンドである「aws」が最初から使えるためです。
  • 構築方法はここでは省きます✧(・ㅂ・)و

「~/.aws/credentials」の設置

  • AWSAPIを利用するためのキーペアを設置します。
  • 作成と設置の方法はここでは省きます✧(・ㅂ・)و

ソースコード

ご注意ください

  • ソースコードの品質に関するお問い合わせには応じられません✧(・ㅂ・)و」ので、予めご了承ください。
  • 万が一、本ソースコードを利用して損害を被るような事があっても、弊社では一切保証できません。事前によく検証してからご利用下さい。
#!/bin/bash

# define local command, & dir path.
BASEDIR=$(cd $(dirname "$0") && pwd)
LOGDIR="${BASEDIR}/logs/"

# define argument.
TARGET_ACCOUNT_AWS_PROFILE=$1

# Chatwork token.
CHATWORK_TOKEN='APIトークン情報を入れてね'
CHATWORK_ROOM_ID='通知先のルームIDを入れてね'

# exec.
## check argument.
if [ $# != "1" ];then
  echo "usage: $0 <target account for ~/.aws/credentials>"
  exit 1
fi

cd ${BASEDIR}
if [ ! -d "${LOGDIR}" ];then
  mkdir -p ${LOGDIR}
fi
ARN_NAME="${LOGDIR}/${TARGET_ACCOUNT_AWS_PROFILE}.arn"
LOG_NAME="${LOGDIR}/${TARGET_ACCOUNT_AWS_PROFILE}.log"

## initialize.
echo "" > ${LOG_NAME}

aws health --profile=${TARGET_ACCOUNT_AWS_PROFILE} describe-events --region us-east-1 \
--query 'events[?eventTypeCategory == `scheduledChange` && statusCode != `closed`].arn' | grep arn | tr -d '\,' > ${ARN_NAME} 2>&1

if [ -s "${ARN_NAME}" ];then
  for EVENT_ARN in `cat ${ARN_NAME}`
  do
    aws health --profile=${TARGET_ACCOUNT_AWS_PROFILE} describe-affected-entities --region us-east-1 --filter eventArns="${EVENT_ARN}" --query 'entities[].[entityValue,eventArn]' >> ${LOG_NAME}
  done

  SEND_MESSAGES=`echo "[info][title]警告:AWSの「再起動を伴うメンテナンス情報」が更新されました@${TARGET_ACCOUNT_AWS_PROFILE}[/title]" && cat ${LOG_NAME} && echo "[/info]"`
  ## for Chatwork report. 
  curl -X POST -H "X-ChatWorkToken:${CHATWORK_TOKEN}" -d "body=${SEND_MESSAGES}" \
  "https://api.chatwork.com/v2/rooms/${CHATWORK_ROOM_ID}/messages"  1>&2
fi

exit 0

ソースコードの説明

aws health describe-events

  • ここで指定したアカウントが利用可能なサービスの、「メンテナンス情報一覧」を取得できます。

aws healthで指定する「--region」は「us-east-1」 で固定。

  • リージョンはGlobal になるので、us-east-1(Global)で固定です。これ以外を入れるとエラーが返ってきます。

https://api.chatwork.com/v2/~

  • チャットワークにメッセージをPOSTするときに指定するAPIのURLです。
  • ${CHATWORK_ROOM_ID} は、通知したいチャットワークのルームIDです。

実行イメージ

  • ここでは実行環境として、「Amazon Linux AMI release 2017.03」を使用しています。
[ec2_user@test-ec2-instance] $ cat ~/.aws/credentials
[default]
aws_access_key_id = アクセスID
aws_secret_access_key = 秘密鍵

[ec2_user@test-ec2-instance] $ ./get_aws_health.sh default

スクリプトの引数として「~/.aws/credentials」のユーザ名(ここではdefault)を指定して実行します。
すると、こんな感じにChatwork上に通知が行きます。 f:id:aimstogeek:20190313162309p:plain

通知内容は、

  • タイトルに「影響を受けるAWSアカウント名」

  • 本文に、「影響を受けるインスタンスID」「影響を受けるサービス名」、および「メンテナンススケジュールのID」

が含まれていますので、「利用サービスにおいて、再起動を伴うメンテナンスがあるかを気づく」という目的は達成できました。
ただあまり見やすくは無いと思いますので、必要に応じて適宜整形してご利用ください~。

以上で終了です。
少しでも日々の運用のお役に立てば幸いです~ではでは!



\\『明日のはたらくを創る』仲間を募集中です!! // 919.jp

組織や風土のつながる先

はじめまして!
今回はアプリケーションエンジニアのrinx2が担当させていただきます。
前回のSK1と同じく最近入社し、PHP案件を中心に開発に携わっています。

新しいメンバーからの投稿がせっかく続くので、
今回は「透明性」と「エンジニアリング組織」という点から、
クイックの組織風土についてご紹介できればと思います。

f:id:aimstogeek:20190313212257p:plain

透明性

クイックに入社して先ず驚くことは、採用時の印象と実際の環境のギャップが小さいことです。
透明性を重視し、対話に時間を惜しまない風土があるので、
数ヶ月経った今でも、事前に知り得なかったことで困ることはほとんどありません。

同じような感想をもたれているメンバーも少なくないようで、

「面接の予定時間が過ぎても、認識が合うまでとことん会話をさせてくれたことが、
クイックに決めた理由の1つです!」

と仰っている方も居ました。
私の経験ですが、このギャップが小さいことは両者の納得に大きくつながっていると思います。

エンジニアリング組織

次に、クイックに入社して魅力的に感じたことは、エンジニアリングされる組織です。
入社後、私はメンターに組織の指向性がどういったところにあるのか、改めてうかがってみました。
すると、「エンジニアリング組織論への招待」という書籍を紹介いただきました。

ものすごく要約すると、

「組織運営における障害を定義/例示し、
それらの解決方法をマネジメント手法の変遷や心理学の観点から考えていこう!」

といった内容になっており、現代組織論をまとめた書籍になります。
とても良書なので説明しきれないことが残念ですが、
この書籍を読んだことで私が感じていたクイックの印象に合点がいきました。

  • 事業方針が明確で整理されている
  • 組織論・形成に力を入れている
  • 社員が疲れていない

文章にすると至極当然とも取れるし、ちょっぴり恥ずかしかったりすることを書いているのですが、
10年ほど前から提唱される現代組織論は、旧来日本のカイゼンにならった考えが重要視されています。

クイックでは意思決定の観点や手法を筆頭に、組織のサイジングや社員の育成方針、
制度といったものに先述の指向が随所で散りばめられているように思います。
個人の成長意欲が高く、元気に働く社員が多いことは、こういった風土があるからだと思います。

こちらも説明しきれないことが残念なのですが、
変化し続けてていくであろうこの組織を、私はシンプルに楽しみに思っています。

まとめ

私はエンジニアを7年やっていますが、上記は個人的にとても大切な観点に思います。

ITエンジニアというと、なんだかスーパーマンだらけで、 何かモノが急に出てくる印象があるかも知れませんが、
実際には日々作業し、仲間達と円滑なコミュニケーションをはかって、初めて成果物へたどり着くことができます。

人との関わりが薄い業界に見えて、人との関わりを1番見直している業界だったりします。

ものすごく体系的な内容になってしまいましたがいかがでしたか?
私もこの風土に早く混じり、活躍できるよう目の前の業務に邁進していこうと思います!



\\一緒に『明日のはたらくを創る』仲間を募集中です!! // 919.jp

メンター制度とは?

はじめまして!中途入社のSK1です('ω')ノ
社内に同姓同名がいるので、名前のあとに「1」がつきました。

実は入社ホヤホヤなのですが、ブログ担当をやっちゃいます(^o^)/
入社したばかりの目線でお伝えできればと思います。

今回ご紹介するのは、数年前から私達の課でスタートしたメンター制度についてです。

ちなみに私は、クイックに入社をするまでこの制度のことを知らなかったのですが、 「メンタル面の何だろう・・・サポートかな?」
ざっくりこんな感じのイメージでした。

所説ありますが、アメリカで始まった人材育成方法の一つで、
先輩社員をメンター新入社員をメンティーと呼びます。
メンターは、メンティーが社内で活躍しやすいよう、キャリアに関するアドバイスの他、ときには仕事以外の悩みの相談にものってくれます。

私達の課では、「新入社員」に限らず中途社員にもこの制度が適用されており、
メンターとメンティーで面談をする時間を設けています。

ちなみに私のメンターは、このブログにも登場したことのあるみっちーさんです!
とってもイケメン!

イケメンメンターのご紹介ページを載せておきます・・・
ちゃっかり(^^)v www.wantedly.com

OJT」とは何が違うの?

OJT(On the Job Training)は配属された部署で、同じチームの先輩から指導を受け、
実際に仕事をしながら経験を積んでいきます。

メンター制度は、業務の指導をするわけではないので 同じチームの先輩である必要はありません。あえて少し離れたところから見守る役目を持っています。

同じチームでは、人間関係の悩みなど相談し辛い場合もありますよね。

それでは、私の課のメンターとメンティーに協力をしてもらい
両者の視点を以下にまとめましたので、お伝えできればと思います。

メンター側の視点 

【メンターを担当しようと思ったきっかけは?】

・リーダーとして、何かメンバーに良い働きかけをしたいと思った

・自分が中途入社してこんなことあったら良かったなと感じたことを、
 新しいメンバーに提供したかった

【メンターとして心がけていることは?】

・主役はメンティである

・自分ばかり話さない

・否定しない

【メンティーと話す時間はどんな時間?】

・自分が見えていない気づきを与えてくれる時間

メンティー側の視点

【面談ではどんな話をしているの?】

・質問、疑問に答えてもらう

・一週間を振り返る

・漠然と考えていたことを整理する、してもらう

・次の方向性を考える、考えてもらう

中途入社である私が「メンティー」の立場として、この制度の良さをお伝えすると
メンターとの週に一度の面談は、自分の一週間を振り返るだけでなく、
仕事の話や他愛もない話をすることで、 緊張がほぐれる時間でもありました。

新しい環境に行くことは緊張しますし、最初は覚えることも多く環境に慣れることで精一杯です。 誰かに話を聞いてもらうことで少し楽になったり、
メンターの意見を聞くことで、考えすぎていた自分に気づくこともあります。

また今回新たな発見ですが、メンティーと話すことによって
メンターへ気付きを与えてくれる場合もあるようですね!

両者にとっても非常に意義のある制度だと感じています。

まだまだ私もスタートしたばかりですので、
早くクイックの環境に慣れるよう頑張ります!
ではまた~ヾ(@^▽^@)ノ~~~~~~~~~



\\一緒に『明日のはたらくを創る』仲間を募集中です!! // 919.jp

ArrayFormula関数内でSUM関数を使いたい!│Googleスプレッドシート

はじめまして、BIKKAです。
データ分析に興味をもって今のチームに移ってきて早3ヶ月、楽しく過ごしています。

自己紹介も早々に。
GoogleスプレッドシートのArrayFormula関数、とっても便利ですよね。
私個人としては、スプレッドシートを使い始めて感動したことTop3に入ります。

…しかし最近、「範囲を広げてArrayFormula関数でくくる」というだけでは実現できないことが!
それは複数列・1行ずつの合計値を計算すること。
実は、ArrayFormula関数内でSUM関数を使っても行毎の和を出すことはできないのです。
どうして…どっちもよく使う関数なのに…。

そこで今回は、スプレッドシートで1セルへの入力だけで行毎の和を出す方法を調べてみました。
細かい話はいいから早く結論を!という人はまとめだけ見てね!

ちなみに、ArrayFormula関数の使い方の詳細は以下の記事をぜひ参考に。

aimstogeek.hatenablog.com


目次



どうしてArrayFormula関数内でSUM関数が使えないの?

同じ行のB列からE列の値を合計してF列に表示するケースを考えてみます。

f:id:aimstogeek:20190228102821p:plain
各教科の合計点をF列に表示したい

SUM関数でB列からE列を指定し、ArrayFormula関数でくくれば一発では!?と思っていろいろ組んではみるものの、F2にB2からE11全範囲の合計値が返ってくるばかり。
f:id:aimstogeek:20190228105045p:plain
f:id:aimstogeek:20190228105200p:plain
f:id:aimstogeek:20190228105222p:plain
f:id:aimstogeek:20190228154454p:plain
ArrayFormula関数×SUM関数の結果。撃沈

SUM関数はカッコ内に指定したセルの中で取れる最大の範囲を合計してしまいます(今回の場合、上3式いずれもB2からE11)。
ゆえにArrayFormula関数とSUM関数を単純に組み合わせるだけでは行ごとの合計を出すことはできないのです。困った。

【コピペでOK】ArrayFormula関数で行ごとに合計値を出す方法

でも全行に数式をコピペするのは避けたい。そんなとき有効な、ArrayFormula関数を使った3つの数式を紹介します。

1.「+」で各列の値を足す

力技ですが、分かりやすいし一番手っ取り早いのではないかと思います。
ArrayFormula(B2:B11+C2:C11+D2:D11+E2:E11)
以下、数式の解説です。

=ArrayFormula(1列目+2列目+3列目+4列目+...)


上記のように、列ごと足しあわせてArrayFormula関数でくくると、B2+C2+D2+E2、B3+C3+D3+E3、…と行ごとに足し算が実行され、F列に結果が表示されます。

2.SUMIF関数を使う

全列を「+」で足すのは、列が増えると大変だしもっとスマートに書きたい…。という場合はこちら。
ArrayFormula(SUMIF(IF(COLUMN(B2:E2),ROW(B2:B11)),ROW(B2:B11),B2:E11))

=ArrayFormula(SUMIF(IF(COLUMN(1番上の行),ROW(1番左の列)),ROW(1番左の列),全範囲))


SUM関数の代わりにSUMIF関数を使えば特定のセルの値だけを足すことができます。
ただ正直、IF関数の中で何が起きているのかよくわからないです…。
SUMIF関数内の2つ目の引数でROW関数を使って条件を指定、3つ目の引数で全範囲を合計範囲として指定しているので、行ごとにB列からE列の同じ行にあるセルだけを抜き出しているようなのですが。

3.行列積を使って各行の和を求める

こちらもトリッキーですが、範囲指定は一番簡単な方法です。
MMULT(B2:E11,TRANSPOSE(ARRAYFORMULA(COLUMN(B2:E11)0)))
指定するのは合計する値が入っている全範囲だけ。

=MMULT(全範囲,TRANSPOSE(ARRAYFORMULA(COLUMN(全範囲)^0)))


※指定した範囲に空白のセルがあるとエラーが返ってくるので、予め「0」と入力しておくなどの方法で対処してください。

この数式は、B2からE11を行列として扱い(行列①)、行列①とTRANSPOSE関数を使って生成した行列をMMULT関数で掛け合わせた結果がF列に返される、という作りになっています。
TRANSPOSE関数を使って作られるのは

  • 1列
  • 行列①数と同じ数のをもつ
  • 全成分が1である

という3つの性質をもつ行列です(下図参照)。

f:id:aimstogeek:20190301112237p:plain
行列計算の解説

まとめ

今回ご紹介したArrayFormula関数×SUM関数の代替方法をまとめます。

1.「+」で各列の値を足す
=ArrayFormula(1列目+2列目+3列目+4列目+...)
2.SUMIF関数を使う
=ArrayFormula(SUMIF(IF(COLUMN(1番上の行),ROW(1番左の列)),ROW(1番左の列),全範囲))
3.行列積を使って各行の和を求める
=MMULT(全範囲,TRANSPOSE(ARRAYFORMULA(COLUMN(全範囲)^0)))


この中に1つでもお役に立つものがあれば幸いです…が、「どれもちょっと複雑だな」というのが素直な感想。
たかだか行毎の和を求めるのに、ここまで複雑なことをする必要があるのかどうかは疑問です。
身も蓋もない話になってしまいますが、全行にSUM関数をコピペするというのも一つの手のような気がします。



\\一緒に『明日のはたらくを創る』仲間を募集中です!! // 919.jp

Google Driveの共有データをワンクリックダウンロードしてもらう

初投稿です。
ヘルプデスク担当の "福" です。CUI大好きです。
私からはサーバー構築・運用ネタやクイックで絶賛活用中のG Suiteに関する
お便利機能を発信していきたいと思います。
このブログを訪れた悩める皆さまのお役に立てれば幸いです。

今回はG Suiteのコア機能のひとつ「Google Drive」に関する小ネタをご紹介します。 (CUI大好きとか言っといて・・・!)

その共有データ、もっと簡単にダウンロードしてもらいませんか?

Google Driveは共有設定を行うことで他者とデータを共有できます。
とても便利で私もよく利用するのですが一つ難点がありました。

それは「ダウンロードしてほしいだけなのにGoogle Driveで開いてしまう」
という仕様です。

こんな感じですね。
手間ですしUIもわかりにくい。「プレビューできません」の文字も不穏です。。
f:id:aimstogeek:20190222100257p:plain

更にGoogle Driveを詳しくない相手だと
上図の操作説明まで必要になり、お互いにとってストレスです。

「いやいや、Gmail同士なら本文にURLを貼りさえしたら、
自動でDriveアイコンが出るからダウンロードは簡単だよ」
というお声も聞こえてきそうですがここは心を鬼にして申し上げます。
それは送り手のエゴです。
悲しいかなアイコンの表示位置は添付ファイルと同じくメールの末尾。
これでは本文の内容とリンクさせにくく、
相手に何度も読み返させてしまったり、最悪読まれずに後回しされる恐れがあります。

こんな感じですね。文章量も多いし目移りするし・・・これでは読んでもらえません。
f:id:aimstogeek:20190222131147p:plain:h350:w250

ならばワンクリックダウンロードしてもらおう!

そこで皆さんに是非ご紹介したいのが、
Google Driveで共有したデータのURLをワンクリックでダウンロードできる形式に
変換する方法です。

と言ってもやり方は至って簡単です。
共有するURLにちょっと細工をしてあげるだけです。

例として、あるCSVファイルのURLが以下であった場合、
 https://drive.google.com/file/d/aaabbbcccdddeeefffggg/
共有設定を行ったあとに以下のように編集したらOKです。
 https://drive.google.com/uc?export=download&id=aaabbbcccdddeeefffggg/

少々わかりにくいのですが /file/d/ の箇所を /uc?export=download&id=
変更するだけなんです。

細工が済んだらこのURLを共有したい相手に送りましょう。
URLをクリックするだけで簡単ダウンロードできるので相手の手間も減らせますね。
メールで送る場合はhtmlメールで本文中にリンクを挿入してあげると、
非常によみやすくなります!開封率もグンと上がりますよ!

こんな感じですね。説明も簡略化できるので全体的にスッキリしました。 f:id:aimstogeek:20190222131554p:plain

なお、URLの変換は規則性があるので実際に運用する場合は、
スプレッドシートで変換用の関数を組むことをオススメします。

番外編:Googleドキュメントなどもできるんだよ

ここからは少し特殊なケースのご説明です。
先ほどのワンクリックダウンロードはGoogleドキュメント・スプレッドシート
スライドでも可能なのです。

こちらの細工方法はURLのIDの後ろに export?format=”拡張子” を追加します。
拡張子は以下が指定可能であることを確認しています。

  • .docx (MS Word)
  • .xlsx (MS Excel)
  • .pptx (MS PowerPoint)
  • .pdf (PDFファイル)

例として、あるスプレッドシートのURLが以下であった場合、
 https://docs.google.com/spreadsheets/d/aaabbbcccdddeeefffggg/
共有設定を行ったあとに以下のように編集したら、
Excelファイルとしてダウンロードしてもらえます。
 https://docs.google.com/spreadsheets/d/aaabbbcccdddeeefffggg/export?format=xlsx

面白いことに拡張子をpdfにするとPDF変換までしてくれるのです!
 https://docs.google.com/spreadsheets/d/aaabbbcccdddeeefffggg/export?format=pdf

この方法は、共有者同士がデータの取り扱い方法を十分に理解しており、
効率的にデータ共有したい時に有用なのではないでしょうか。

最後に

実を言うと今回ご紹介した方法を簡単に行えるサイトやアドオンは世に出ています。

ただ、以下の理由から日本での認知度は低いように感じました。

  • ほとんどが海外仕様となっていて日本語検索では辿り着きにくい
  • 辿り着いてもGoogle謹製のツールでないため利用を躊躇してしまう

また、ワンクリックダウンロードできる機能は備えていても、
そのメリットまで説明しているサイトは見つけることができなかったため、
今回思い切ってこのネタを紹介してみました。

他にも便利な共有方法があるので、次回ご紹介したいと思います!

G Suiteは日々アップデートしており今後の展開に興味が尽きません。
今後も便利な機能や上手な活用方法を見つけたら投稿していきますので、
楽しみにしていてくださいね!


\\『明日のはたらくを創る』仲間を募集中!! // 919.jp

必見!失敗しない見積もりのコツ!

初めまして。
サービスプランナーの"まー"です。
これからちょこちょこ登場しますのでどうぞよろしくお願いします。

それでは早速ですが本題に入っていきたいと思います。


「この仕事いつまでに終わりそう?」
「この仕事~までにお願いできる?」

日々仕事をしているとこんな感じで作業の完了目処や対応可否を
聞かれることはよくあると思いますが、後になって
「思ったよりも大変。。引き受けるんじゃなかった。。」
と後悔した経験がある人も少なくないのではないでしょうか。

でもそれって、作業量をより正確に見積もることができれば
避けられる or ダメージがより軽減できたはずですよね。

ということで今回は作業の見積もり方法についてご紹介しようと思います。



目次





見積もり手法の種類

見積もり手法には大きく3種類あります。

(1) 類推見積もり

1つ目は類推見積もりです。
これは過去の類似作業との比較から,作成するものの規模や作業時間(工数)を類推する方法です。

例えば、
「人参、じゃがいも、たまねぎ、豚肉が入ったカレーを50人分作るのにかかる時間」
を類推見積もりで見積もるとこんな感じになります↓

過去に10人分を作ったときは2時間、100人分を作ったときは20時間かかった。
だから50人分を作るのにかかる時間は大体10時間くらいだろう。

ざっくりと見積もるイメージですね。

作業を詳細には検討しないので比較的早い段階で見積もることができますが、
やはりざっくりなので精度は低くなってしまいます。

(2) 係数見積もり

2つ目は係数見積もりです。
これはあらかじめ決められた計算モデルをもとに工数を算出する方法です。

例えば、先程と同様
「人参、じゃがいも、たまねぎ、豚肉が入ったカレーを50人分作るのにかかる時間」
をこの方法で見積もるとこんな感じになります↓

これまでの経験からカレーライスを作るのにかかる時間は、
時間 = 具材の数×0.3時間+人数×0.2時間
の式で求められることが分かっている(仮定です)。

なので見積もりは今回の具材の数4種類、人数50人をこの式に当てはめて、

= 4×0.3+50×0.2
= 11.2時間

数学的に見積もるイメージです。

比較的高い精度で見積もることができますが(モデルの精度によりますが)、
計算モデルを適用できる作業しか見積もることができないのが難点です。

(3) ボトムアップ見積もり

3つ目はボトムアップ見積もりです。
これは作業をより詳細な作業に分解して見積もり、後でそれらを合算する方法です。

例えば、先程と同様
「人参、じゃがいも、たまねぎ、豚肉が入ったカレーを50人分作るのにかかる時間」
をこの方法で見積もるとこんな感じになります↓

カレーを作る手順を書き出す↓

・野菜をカットする
・具材を炒める
・ルーを入れ煮込む
・盛り付ける

この手順ごとに工数を見積もる↓

・野菜をカットする:1時間
・具材を炒める:5時間
・ルーを入れ煮込む:4時間
・盛り付ける:0.5時間

合計する↓

1+5+4+0.5=10.5時間

非常に高い精度で見積もることができますが(見積もる人の経験によりますが)、
紹介した3つの方法の中で最も難易度が高いです。

ここからはそんなボトムアップ見積もりについて少し深掘りしてみたいと思います。

ボトムアップ見積もり

ボトムアップ見積もりの手順は

①作業を細分化する
②個々の作業工数を算出する
③全作業工数を合算する

という3ステップで、方法自体はいたってシンプルです。
ただ、①作業を細分化する、②個々の作業工数を算出するにはいくつかのコツがあります。

①作業細分化のコツ

(1) トップダウンボトムアップを意識する
1つ目のコツはトップダウンボトムアップを意識することです。

トップダウンというのは、ある作業をより細かい作業に分解することを指します。
ボトムアップはその逆で、いくつかの作業を包括するより大きな作業単位を考えることを指しています。

ボトムアップをカレーを作る例で説明すると、

"人参をカットする"と"じゃがいもをカットする"という2つの作業から
"野菜をカットする"という一つ上のカテゴリの作業を考えることに対応します。

このトップダウンボトムアップを繰り返し考えることで作業はどんどん細かくなっていきます。
例えばこんな感じ↓

"人参をカットする""じゃがいもをカットする"

↓(ボトムアップ)↓

"野菜をカットする"

↓(トップダウン)↓

"人参をカットする""じゃがいもをカットする""玉ねぎをカットする"

(2) インプット→処理→アウトプットを意識する
2つ目のコツはインプット→処理→アウトプットを意識することです。

あらゆる作業ほぼ必ず"インプット→処理→アウトプット"という図式になります。
このときインプットの準備と処理環境の整備はタスクになることが多いのです。

例えばカレーを作る場合でいうと、
インプットは調理方法や食材、処理は調理になるので、

インプットの準備=調理方法を考えておく、食材を買う
処理環境の整備=キッチンの確保、調理器具の準備

のようになります。

前述のトップダウンボトムアップが作業の上下を意識する考え方だとすると、
こちらは作業の前後を意識する考え方といえます。

(3) テンプレートを使う
3つ目のコツはテンプレートを使うことです。

大体の作業は基本的なやり方が決まっています。
それをテンプレートして利用するのです。

例えば料理の場合は下ごしらえ、調理、盛り付け、片付け、
システム開発の場合は要件定義、設計、開発、テスト

といった具合です。

これらをもとに、トップダウンボトムアップを繰り返し行い、
また作業のインプット→処理→アウトプットを意識することで
作業を詳細化していくとスムーズに作業を洗い出すことができます。

工数算出のコツ

(1) 多めに見積もる(1.2倍、1.5倍など)
1つ目のコツは多めに見積もることです。

見積もりには大なり小なり必ず誤差が発生しますし、
想定外の事態が起こることもよくあります。
それを想定し予め多めに見積もっておくのです。

ではどのくらい多めに見積もるのか?ですが、
それは見積もる人の経験や傾向にはよるのですが、
一般的には1.2倍や1.5倍のようにすることが多いです。

(2) 作業者を具体的に思い浮かべる
2つ目のコツは作業者を具体的に思い浮かべることです。

自分の作業を自分で見積もるのであれば意識する必要はないですが、
誰かに依頼したい作業を見積もる場合、誰でも同じ工数で対応できるわけではないので
自分を基準に見積もってしまうと誤差が生じてしまう可能性があります。

なので事前に「この作業はあの人に依頼しよう」と決めてから、
その人が作業したらどれくらいかかるのかを見積もるようにしましょう。


さいごに

見積もり、特にボトムアップ見積もりは難易度が高いし面倒ですが、
作業をこれでもかと言わんばかりに洗い出して、見積もって、スケジューリングまで
できてしまうと妙な掌握感が生まれるんです。

「この作業・プロジェクトはもう俺の手中にある」みたいなw

私はその感覚が好きなので、これからも少し面倒なのを我慢して見積もっていきたいと思います。

ではでは。



\\『明日のはたらくを創る』仲間を募集中です!! // 919.jp

ディテールはデザインじゃない

こんにちは、フロントエンドエンジニアのFです。

唐突ですが、
アニメ界には高畑勲さんという素晴らしい方がいました。

スタジオ・ジブリ宮崎駿さんと並んで有名な方ですが、
去年亡くなってしまいました。
とても悲しいです。

アルプスの少女ハイジ

高畑さんの作品の一つに
アルプスの少女ハイジ』があります。
知ってますよね?

このアニメで行われていたことは
ハイジのリアルな日常を描くということでした。

ハイジの行動、仕草、
家具や食器の配置、動線、生活リズム。
道具の使用頻度までは言い過ぎかもしれませんが、
それらがわかるようなレベルでリアルに描かれています。

ディテールを作り込むことで、生活が見え、ドラマが生まれてくるんです。
作る側(アニメーター)は、見ている人に再発見させることが仕事。
と高畑さんは語っています。

しかし、ただただディテールを作り込むだけでリアルな日常は表現できるのでしょうか?
違いますよね?



耳をすませば

高畑さんの作品ではないですが、
スタジオ・ジブリつながりで、
近藤監督の『耳をすませば』という名作があります。

主人公の月島雫が家で準備をして出発し、
姉から手紙を受け取るまでの数分間覚えていますか?

わかりやすいところで言うと
姉が階段の踊り場から手紙を投げるところです。

急いで一階まで行って渡す、ではないのです。

投げるのです。

姉のなんとなくな性格や、
これ以前の主人公との日常のやりとりが簡単に想像できますよね?

たぶん音声を消して見ても同じような印象で見れるはずです。

そして、あの数分間だけで相当な情報量が見ている側に伝わっているはずです。
家族の生活レベル、生活リズム、人物の性格や関係性などなど。

描かれている人間自体が意識していない細かい部分を作り込むことによって、
見ている側にそれが伝わるのです。


何のためのディテールなのか

この『何のため』の部分を考えて作るのがデザインなのであって

ディテールを作り込むことがデザインじゃないんです。


アニメを例えに出しましたが、
タイトルの意味がわかっていただけたでしょうか?


Webサイトやツールも一緒です。

だれが使って、
どんな場面で使って、
どういうサイトやツールになるのかを考えることがデザインです。

最後に

最近自分でも制作中に忘れてしまうことがあるのですが、
常に『何のため』を考えながら創っていきたいですね。

あと、高畑さんは時代の流れとともにディテールを捨てるんですが、
その話はまた今度。



\\『明日のはたらくを創る』仲間を募集中です!! // 919.jp