kakakakakku blog

Weekly Tech Blog: Keep on Learning!

新任リーダーにオススメする「ザ・ファシリテーター」を読み直した

リーダー,マネージャーと言っても役割はいろいろあって,組織のフェーズ,規模,目指すビジョンによっても求められるアクションが異なる.だからこそ難しいし,チャレンジングだと思う.また「リーダー論」をテーマにした本もたくさん出版されていて,最近だとオススメの本を聞かれることも増えてきたけど,僕は「ザ・ファシリテーター」をよくオススメしている.最初に読んだのはもう5年以上前のことだと思うけど,最近もう一度読み直してみて,今だからこそ感じることができる刺激もあった.本書の書評をまだブログに書いていなかったので,今さらながら書くことにした.

ザ・ファシリテーター

ザ・ファシリテーター

続編も出ていて,位置付け的には「実践応用編」となっているけど,個人的には「ザ・ファシリテーター」を読めば十分だと思う.

ザ・ファシリテーター2―理屈じゃ、誰も動かない!

ザ・ファシリテーター2―理屈じゃ、誰も動かない!

ファシリタティブ・リーダーシップ

「ファシリテーター」と聞くと,議論を中立的な立場から整理する役割のように感じる人が多いと思うけど,本書で描かれている「ファシリテーター」というのは「ファシリタティブ・リーダーシップ」と表現されていて,意見を引き出し,議論を促進し,個人や組織のパフォーマンスを最大化する「リーダーシップ」のことを意味している.僕はこの「ファシリタティブ・リーダーシップ」という表現が非常に好きで,リーダー,マネージャーに必要なスキルセットだと考えている.また,本書が素晴らしいのは小説形式になっていることで,自分の所属する組織に当てはめてみたりして,小説の世界でロールプレイングをしながら学ぶことができる.「ファシリタティブ・リーダーシップ」は理論だけ知っていても意味がなく,実践してこそ価値があるものだから.

構造化された議論

ファシリテーションフレームワークを使うことのメリットは「構造化された議論」ができることだと思う.本書でも「社長からの非現実的なビジネス目標」に絶望する場面が多く出てくるけど,「できない理由」を全て書き出して(これを発散と言う),次に「できるようにするには何ができるか」に置き換えていく(これを収束と言う)アプローチが紹介されていたりもした.どんなに非現実的な目標であっても,小さくブレイクダウンして「解決できそうな粒度」まで落とし込むことによって,可能性が見えてきてモチベーションが上がるという話は,メンタリング(自己達成)にも似ているし,スクラム開発にも似ているし,どんなシチュエーションにも応用可能なアプローチだと思う.僕はファシリテーションフレームワークを以下の本から学んだ.コンパクトにまとまっていて良いと思う.

ファシリテーターの道具箱―組織の問題解決に使えるパワーツール49

ファシリテーターの道具箱―組織の問題解決に使えるパワーツール49

  • 作者: 森時彦/ファシリテーターの道具研究会
  • 出版社/メーカー: ダイヤモンド社
  • 発売日: 2008/03/14
  • メディア: ペーパーバック
  • 購入: 47人 クリック: 385回
  • この商品を含むブログ (41件) を見る

やっぱり大切なのは腹を割って議論できる人間関係

本書の最初に「リーダーズ・インテグレーション」というフレームワークが紹介されている.リーダーと部下の関係を改善するために有効で,本音ベースの自己紹介をすることによって信頼関係を築くことができる.また「ジョハリの窓」の話も出てくる.また「緊張をほぐす質問」と表現される通り,空気を和らげるスキル(もしくは雰囲気・素質)が重要なのもリアルに描かれている.後半部分に出てくる「ウソつき自己紹介」というアイスブレークも面白いと思った.このあたりの話は,先月の勉強会で「組織パフォーマンス」の話をしたときにも引用したけど,やっぱり大切なのは人間関係だし,心理的安全だし,腹を割って議論できることだなというのが,個人的な結論だったりする.

kakakakakku.hatenablog.com

まとめ

  • 「ザ・ファシリテーター」は新任リーダーにオススメ
  • ファシリタティブ・リーダーシップ
  • 構造化された議論を促進するためにファシリテーションフレームワークをよく知っておく

関連記事

似たようなテーマだと「あなたのチームは、機能してますか?」もオススメ.同じく小説形式になっていて,反面教師的に読むことができる.

kakakakakku.hatenablog.com

少しテーマは異なるけど「1分間マネジャーの時間管理」もリーダー,マネージャーの心構えを学べるのでオススメ.

kakakakakku.hatenablog.com

読んだ!

f:id:kakku22:20170712011845j:plain

AWS Solution Days 2017「第2回 Aurora 事例祭り」で発表をしてきた

今日は「AWS Solution Days 2017 ~ AWS DB Day ~」に参加をして「第2回 Aurora 事例祭り」で発表もしてきた.すぐに資料公開をして良いとのことだったので,参加レポートをまとめる.

第2回 Aurora 事例祭り

今回は「Makuake の急成長を支える Aurora 移行事例」というタイトルで発表をした.特に MySQL 5.5 on EC2 から Aurora に移行したフェージングと,その効果を中心に話した.他の発表であったような,オンプレからの移行ほど複雑度は高くはないけど,全体感をギュッと凝縮した,良い発表ができたのではないかなと個人的には思っている.

今日の会場風景はこんな感じだった!運営側からの依頼もあり,今回は珍しく発表台の前から動かず発表をした(笑)

f:id:kakku22:20170705212546j:plain

クラウド上のデータ活用デザインパターン

午後のセッションにも参加してきた.

  • データ分析を実施する場合は,試行錯誤のサイクルを高速に回す必要がある
  • Amazon Redshift Spectrum を使うと,Redshift クラスタから直接 S3 にクエリを実行することができる
    • コールドデータを S3 に置いておくなどの工夫ができるようになる
  • パターン
    • BI パイプラインパターン
    • マルチクラスタパターン
    • ホットデータパターン
    • ラムダアーキテクチャパターン
    • マルチノードパターン
    • などなど

後半部分の発表では,参考になるパターンがたくさん紹介されていて勉強になった.特にストリーム処理(スピードレイヤー)とバッチ処理(バッチレイヤー)にレイヤーを分割した「ラムダアーキテクチャパターン」は興味があるので,資料を見たりして,もっと詳細に調べてみたいと思う.

www.slideshare.net

ETL をサーバーレスで実現する新サービス AWS Glue のご紹介

今日1番聞きたかった Glue のセッションにも参加した.

  • AWS Glue(現在,プレビュー中)
  • Glue はベース技術に Spark を採用している
  • データ量によって自動的にスケールアウトするフルマネージドサービス
  • EMR ほどの自由度はないが,PySpark で実装をすることで,ETL をカスタマイズすることができる
  • クローラーはデータソースのメタデータを収集して,データカタログ(Hive メタストア)に格納する
  • Gork でカスタマイズした Classifier を作成することもできる
  • 自動生成された Python コードを Glue 上で修正することもできるし,任意のエディタで修正することもできる
  • Glue のインスタンスは VPC の中に入るため,S3 にアクセスする場合は VPC Endpoint を使う必要がある

実際に試してみないとわからない部分も多いけど,基本的な ETL をフルマネージドでサーバレスな環境に任せられるのは良いなと感じた.東京リージョンで GA になるのを待とう.任意のエディタで実装したときにデプロイはどうするんだろう?と思ったけど,プルリクをマージしたタイミングで S3 に保存して,AWS CLI で S3 からデプロイすることはできそうなので,現実的な運用を考えると,そういう感じになりそうだなとは思った.

(資料公開待ち)

参考までに re:Invent 2016 の Glue のセッション動画を載せておく.

www.youtube.com

まとめ

  • 全体的にエンタープライズな参加者が多く,引き続きクラウドの注目度は高いんだなと感じた
  • 「第2回 Aurora 事例祭り」で発表ができて良かった!すごく楽しかった!
  • もっともっと Aurora を活用して,また違う事例を紹介できるように頑張っていきたいと思う

関連記事

今日の発表資料では割愛した技術的負債部分などは Developers Blog にまとめてあるので合わせて読んで頂ければと!

developers.cyberagent.co.jp

5月末にも Aurora 移行関連の LT をした!

kakakakakku.hatenablog.com

今日紹介した Fluentd でスロークエリを Amazon ES に転送する話は以下の記事に詳しくまとめてある!

kakakakakku.hatenablog.com

Unsplash API (unsplash_rb) を試した

写真サービスだと Unsplash が大好きで,気分転換に見ることも多いし,発表資料の背景写真はほとんど Unsplash から引っ張ってきている.全ての写真を自由に使えるし,シンプルなサービスながら,非常にクオリティが高い.

Unsplash 関連ツール

公式で Chrome 拡張も提供されていて,Unsplash Instant を使うと,新規タブの背景写真を Unsplash からランダムに取得できるようになってオススメ!

chrome.google.com

あと,最近だと Trello と Unsplash の連携があり,Trello のタスクボードの背景写真を Unsplash から引っ張ってくることができるようになった.この機能も気に入ってて,定期的に背景写真を変えて Trello に飽きないように工夫している.

trello.com

Unsplash API

そんな Unsplash から API が提供されていることを最近知って,さらに Ruby ラッパーも公式で提供されていたため,少し試してみた.事前に Application ID を取得しておく必要がある.なぜ今まで知らなかったのだろう!

unsplash.com

github.com

サンプルコード

ザッと書いてみた.キーワード検索だけじゃなく,キュレーション検索もできるし,ランダム検索もできる.また,写真によっては Exif 情報も取れるし,ロケーションも取れる場合もある.他にもまだまだ多くのレスポンスが返ってくるので,詳しくはドキュメントを参照してもらえればと.あと,utm パラメータを付けないとダメなど,ある程度のガイドラインがあるため,実際にアプリケーションに組み込む場合は,確認しておく必要がありそう.

require 'unsplash'
require 'active_support'
require 'active_support/core_ext'

Unsplash.configure do |config|
  config.application_id = ENV['UNSPLASH_APPLICATION_ID']
  config.application_secret = ENV['UNSPLASH_SECRET']
  config.application_redirect_uri = 'https://example.com/callback'
  config.utm_source = 'example_app'
end

def info(photo)
  # Basic
  puts "===== #{photo.id} ====="
  puts photo.width
  puts photo.height

  # Exif
  if photo.exif.present?
    puts photo.exif.make
    puts photo.exif.model
    puts photo.exif.iso
  end

  # Location
  if photo.location.present?
    puts photo.location.city
    puts photo.location.country
  end

  # URL
  if photo.urls.present?
    puts photo.urls.raw
    puts photo.urls.full
    puts photo.urls.thumb
  end
end

# Find by id
photo = Unsplash::Photo.find('srDN5nHM35g')
info(photo)

# Search by keyword
search_results = Unsplash::Photo.search('mountain', page = 1, per_page = 3)
search_results.each do |photo|
  info(photo)
end

# Search curation ( latest, oldest, popular )
search_results = Unsplash::Photo.curated(page = 1, per_page = 3, 'popular')
search_results.each do |photo|
  info(photo)
end

# Search random
photo = Unsplash::Photo.random
info(photo)

Ruby 以外の公式ライブラリ

PHP と js も提供されていた!

github.com

github.com

Unsplash Team の Hiring も発見して,Rails Engineer ならリモート歓迎って書いてある.気になるなー!

unsplash.com

組織パフォーマンスを改善しよう!

今週,社内で「技術的負債」をテーマにしたイベントがあり,トーク枠で発表をしてきた.タイトルは「技術的負債を "なるべく" 作らないためのコツ」で,意図的に技術の話をせずに,エモ系のストーリーに仕上げた.

特に伝えたかった部分は最後の「組織パフォーマンス」を改善する Tips で,雑談の重要さ,質問の重要さ,相互理解の重要さ,表情の重要さなどを語った.その中でも「ノンバーバルなコミュニケーション」の Tips はイベント中も気になっていて,発表者がもっと気持ちよく話せるように反応しましょー!と,緊張をほぐすようなアプローチもした.

もっと「組織パフォーマンス」を改善していきましょ!!!

発表資料

関連記事

「組織パフォーマンス」を改善する Tips はコーチングの文脈からもインスパイアされていて,コーチングを学ぶならまずこの本から読むのが良いのではないかなと思う.

kakakakakku.hatenablog.com

プレゼンのコツは最近まとめたので,参考になれば!

kakakakakku.hatenablog.com

CyberAgent Developers Blog

会社ブログも書いた!

developers.cyberagent.co.jp

Apex の --env オプションを使って Lambda を複数環境にデプロイする

最近仕事で必要になり,CircleCI + Apex を使って,Lambda を複数環境 (prd / stg / dev など) にデプロイできる仕組みを作ったので,実現したかったこと,工夫したことなどを紹介したいと思う.ちなみに,以前も似たような事例で CloudWatch Events + Lambda + CircleCI + Apex を使ったアーキテクチャを紹介したが,これはあくまで開発ツールの位置付けなので,複数環境の考慮が必要なく,単純に apex deploy を実行するだけの非常にシンプルな構成になっていた点が異なる.

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

エイリアスは採用しなかった

「実践 AWS Lambda」にも書いてある通り,Lambda にはエイリアスという機能があり,特定のバージョンに prd / stg / dev など,任意のエイリアスを付けて識別することができる.単純にバージョンと環境を紐付けるだけなら便利だと思うが,今回は以下の要件を満たしたいと考えていて,エイリアスで環境を識別するアプローチは採用しなかった.プロダクションで Lambda を使う場合,基本的には以下の要件はあると思う.

  • 環境ごとに異なる環境変数を設定する
  • 環境ごとに制御した IAM ロールを設定する
  • 環境ごとに異なるコンピューティングリソースを設定する

kakakakakku.hatenablog.com

複数環境デプロイ

公式ドキュメントにも記載がある通り,Apex は複数環境 (Multiple Environments) のデプロイに対応している.特に難しいことはなく,環境ごとの設定ファイルを用意して --env オプションを指定することで,環境別にデプロイを行うことができる.なお,環境ごとの設定ファイルには大きく2種類あり,粒度によって使い分けることができる.

  • project.json … 複数の Lambda 関数で共通して参照する設定ファイル
  • function.json … Lambda 関数ごとに参照する設定ファイル

今回作ったデプロイフローはザッと以下のようになる.

f:id:kakku22:20170620212838j:plain

事前作業

環境ごとに IAM ロールが必要になるため,事前に作成しておく.今回サンプルとして prd / stg / dev を作成した.

  • arn:aws:iam::00000000000:role/prd-myfunc_lambda_function
  • arn:aws:iam::00000000000:role/stg-myfunc_lambda_function
  • arn:aws:iam::00000000000:role/dev-myfunc_lambda_function

IAM ポリシーの設定は割愛するが,公式ドキュメントに Lambda のポリシーテンプレートが公開されていて,様々なユースケースを網羅しているため,非常に便利!

docs.aws.amazon.com

Apex ディレクトリ構造

Apex ディレクトリ構造は以下のようになる.project.*.json はルートディレクトリに配置して,function.*.json は Lambda 関数のメイン処理と同じディレクトリに配置している.なお,今回は2個の Lambda 関数をデプロイできるようにした(ランタイムは Python).

├── circle.yml
├── functions
│   ├── myfunc1
│   │  ├── function.dev.json
│   │  ├── function.prd.json
│   │  ├── function.stg.json
│   │  ├── main.py
│   │  └── requirements.txt
│   └── myfunc2
│       ├── function.dev.json
│       ├── function.prd.json
│       ├── function.stg.json
│       ├── main.py
│       └── requirements.txt
├── project.dev.json
├── project.prd.json
└── project.stg.json

project.*.jsonfunction.*.json

設定項目としては同じで,粒度が異なるだけなので,今回は project.dev.json を例に載せる.

{
  "name": "dev-myfunc",
  "description": "dev-myfunc",
  "memory": 128,
  "timeout": 5,
  "role": "arn:aws:iam::00000000000:role/dev-myfunc_lambda_function",
  "environment": {
    "XXX": "xxx",
    "YYY": "yyy",
    "ZZZ": "zzz"
  }
}

このように設定することで,今回の要件を全て満たすことができた.

  • 環境ごとに異なる環境変数を設定する
  • 環境ごとに制御した IAM ロールを設定する
  • 環境ごとに異なるコンピューティングリソースを設定する

デプロイする

残るはデプロイするだけとなる.

$ apex deploy --env prd
$ apex deploy --env stg
$ apex deploy --env dev

CircleCI で自動デプロイ

今回も CircleCI で自動デプロイをできるようにした.以下にサンプルの circle.yml を載せておく.これで,プルリクを出すと dev / stg 環境にデプロイされて,master にマージをすると dev / stg / prd 環境にデプロイされる.便利!なお,テストを書かないと CircleCI でエラーになるため,今回は echo を設定して回避している.

machine:
  timezone: Asia/Tokyo

dependencies:
  post:
    - curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sudo sh
    - apex version

deployment:
  prd:
    branch: master
    commands:
      - pip install --requirement functions/myfunc1/requirements.txt --target functions/myfunc1
      - pip install --requirement functions/myfunc2/requirements.txt --target functions/myfunc2
      - apex deploy --env dev
      - apex deploy --env stg
      - apex deploy --env prd
  stg_dev:
    branch: /^(?!master$).*$/
    commands:
      - pip install --requirement functions/myfunc1/requirements.txt --target functions/myfunc1
      - pip install --requirement functions/myfunc2/requirements.txt --target functions/myfunc2
      - apex deploy --env dev
      - apex deploy --env stg

test:
  override:
    - echo 'ok'

まとめ

  • Apex 本当に便利!
    • API Gateway / DynamoDB なども必要なら Serverless Framework や AWS SAM なども候補になる
  • Apex の --env オプションを使うと Lambda を複数環境にデプロイすることができる
  • 環境変数,IAM ロール,コンピューティングリソースを環境ごとに設定ファイルで変えることもできる

コントリビュート

公式ドキュメントを見ていたら --env の部分が -env になっていて,検索できずハマったので,修正のプルリクを投げたらすぐにマージしてもらえた!やった!

github.com