書評)OKR シリコンバレー式で大胆な目標を達成する方法

感想
話題には聞くものの普段の目標設定、KPI設定と何が違うのか?ということを知りたくて読んでみた。
  • 大事なことは3つかな?
    • ゴールへのフォーカスの維持
      • 本当に重要でみんなが鼓舞されるようなゴールを見つけて
      • 組織やチームでそのゴールに向かってぶらさずやりきる
      • やりきるモチベーションを維持する仕組みをもつ
      • 大事に見えるけどゴールの達成に関係しないものは優先されない
    • 継続的な向上と学習のサイクル
      • KRはノルマじゃない
      • 失敗したら次どうするかを考える
      • 容易に達成したらより高いゴールを考える
    • OKRは連鎖する
      • 個人OKRは→組織/チームのOKRは→会社のOKRに貢献するものじゃないと
  • 大きく三部構成で理解しやすくなってる
    • 前半はストーリー仕立てでOKRがスタートアップに浸透して変わっていくイメージを持って
    • 中盤で方法を学び
    • 後半は実ケースをあげて実践のイメージを持つ
エンジニアリング、デザイン、営業といった複数機能組織が1つのプロダクトをみてるけど、そのみんなを含めて”プロダクトチーム”としてそのレベルでOKRを持った方がいい、それぞれが持つと板挟みを招くって書いてあって、確かにと思ったけど難しそう。
 
とりあえず自分の目標設定から取り入れてみようかな。
 
以下ポイントだと感じた部分のサマリ。
 
なぜやり遂げることができないのか
  • ゴールに優先順位をつけていない
    • Oを一つだけ、KRを3つだけ設定することでフォーカスを維持する
    • 4半期の途中で変えない
      • 誤っていても結果が出てから経験を踏まえて改善する
  • 熱意を持ってゴールを伝えていない
    • 職場環境にリマインダーを織り込む
    • 毎週自信度を更新し上下について話し合う
  • やり遂げるためのプランがない
    • 脱線しないようなプロセスが必要
    • コミットメント、お祝い、チェックインMTGなど
  • 重要事項のための時間を空けていない
  • 繰り返さずにやめてしまう
    • 何が機能するかを観察し、機能する点を増やし、機能しない点を減らす
OKR導入前にミッションを確認する
  • 公式にあてはめ推敲する
    • 私たちは『価値提案』によって『市場』における『問題点を取り除きます/生活を向上させます』
  • 少なくとも5年支えてくれるミッション
    • 目標との違いは期間
  • 四半期ごとのOはミッションを前に進めるものにする
Oの基本
  • 定性的で人を鼓舞する内容にする
    • すばらしいMVPを立ち上げる
    • ○○におけるクーポンの使い方の慣習を変える
  • 1ヶ月や4半期で実現できるものにする
    • 1年などかかる目標は戦略やミッションが近い
  • 個人のOは個人で、チームのOはチームで完結するようにする
    • あちらのせいで達成できませんでしたという言い訳が通用しなように
KRの基本
  • どうやってOを満たしたとわかるか
  • 感覚的なOを定量化する3つの指標
    • 40%のユーザが週に2回以上訪問する
    • 応答時間1秒未満
    • NPSやCVRなど
  • 難しいが不可能ではないKRを設定する
    • 自信度10分の5
ORKの働き
  • 下位のOKRは上位のOKRの達成に貢献する
    • 個人OKRは個人の成長とともに会社のゴールに貢献する
  • 問題のある従業員
    • MGRはその人のOKRを一緒に設定すれば、測定可能なKRで結果を評価できる
  • ノルマを課すためではなく自分ができることを学ぶためにある
    • 失敗は高い目標に挑戦しているポジティブな指標
プロダクトチームのOKR
  • プロダクトチームとはデザインとエンジニアリングといった機能別部署で構成されるプロダクトのためのチーム
  • 機能別部署ごとにOKRを定義するのはよくある失敗
    • それぞれのフォーカスが異なることが板挟みを招く
  • OKRをプロダクトチームレベルにする
  • プロダクトチームへの貢献を妨げないレベルで個別の目標を持つのは構わない
OKRの実行を習慣にする
  • コミットメント:例えばスクラムのプロセスに乗せて毎週月曜日に以下を話し合う
    • 今週の優先事項
      • OKR達成に向けて取り組むべき重要な事項
    • 今後の4週間
      • チームに知らせるべき予定
      • メンバーが貢献したり準備したりできるように
    • 自信度
      • 上下したら話し合う
    • 健康/健全性
      • 結果を目指す一方守りたいことを2つ
      • 追い込みすぎたり手抜きが発生していないか
  • プレゼンよりも話し合いの時間を多く
  • 金曜日のウィンセッション
    • どれだけ近づいているかを見せ合うことで不安をなくす
    • チームビルディングの役割も持つ
      • アルコールやおやつなどを提供して大事にされているという気持ちを持ってもらう
OKR設定ミーティング
  • 幹部など責任者を入れる
  • メンバーから取り組むべきだと思う目標を提出してもらう
  • 優れたOと多かったOをまとめる
    • 責任者も1つか2つ考える
  • MTG時間は十分に確保するが集中して早く終わらせる
  • 付箋に書いて議論し3つに絞る
  • 測定するための指標を10分くらいでできるだけ多く書き出す
  • 書き出した付箋をグルーピングしランクづけする
  • 最後に3つの指標を選ぶ
  • KRの値を設定する
    • 達成が五分五分となる数値を選ぶ
    • 互いの案に対する懸念を出し合う
    • バランスよく様々な角度で見つける必要がある
      • 売上だけに注目すると短期的アプローチで顧客定着率を損なうおそれ
  • 出来上がったOKRを納得するまで微調整する
失敗しないコツ
  • 最初は全体のOKRを一つだけ決める
    • 幹部が高い基準を自らに課していることがメンバーへ伝わる
    • 次の四半期に同じようにOKRを指示されても驚かない
  • 一つのチームで導入してみる
    • 成功したら広められる
  • プロジェクト単位で適用する
その他の例
  • MVPの開発ではOを仮説にしてもいい
  • 状況報告メールにOKRを応用する
    • 冒頭にOKRと自信度の更新を書く
    • 優先タスクと達成されたかを書く
    • 来週の優先事項を書く(最優先は3つまで)
    • リスクや障害を挙げる
失敗例
  • ゴールが多すぎる
    • 大きな企業は事業ドメインごとに1つ、スタートアップなら会社で1つ
  • 短すぎる
    • プロダクトマーケットフィットの前にOKRを持ってもすぐ変えないといけない
  • Oに数字を入れてしまう
    • 様々な立場の人を鼓舞しなければならない
  • 自信度レベルの設定を忘れてしまう
  • 自信度レベルの変化の追跡を忘れてしまう
  • 4つの四角形を状況報告に使ってしまう
    • 本当に達成できるのか、問題が発生してないかを話し合おう
  • ウィンセッションで厳しい話をしてしまう
    • 何ができたかを共有しよう

My英語の勉強教材

TOEICがそこそこ点数上がった後に、実際に英会話ができるように勉強していく中で、よかったものをメモしていってます。

オンライン英会話

オンライン英会話は普段インプットした内容をアウトプットする場として利用します。他の方も言われてますが、インプットなしにこれだけやっても上達しません。

オンライン英会話/イングリッシュベル英会話

発音コースからCNNコースからビジネス英会話などなどいろんなコースがあって、かつ料金体系もいろいろ選べます。僕はペースに合わせて月10回コースでDME Businessクラスというコースを選択して勉強してます。予約がとりやすいです。

DMM英会話よりちょっと高いですが先生がオフィスから接続するので回線が安定してるのとオリジナル教材がいいです。

英語発音/発声

正しい発音、発声を学ぶことでリスニング力も飛躍的にアップするそうです。自分も実際学習を始めてみて聞き取りやすくなったことを実感できています。またもちろん伝わる英語のために必須です。

http://free-academy.jp/senior/index.php?HP10

動画と絵でフォニックスの発音が学べて練習できます。学習初期にやっておくと発音の基本が身についていいと思います。

※2018/8/26追記

久しぶりに見たら500エラーになってました。。。図解と発音字の口の形の動画の組み合わせで非常にわかりやすかったので残念です。。。

最初は丁寧な解説とともに目と耳両方で口や舌の形を含めて学習できるコンテンツがおすすめです。「フォニックス 口の動き」とぐぐるといろいろ出てくるので探してみてください。下のドクターDに行く前にそういうコンテンツで基礎をやっておくとよいです。

※2018/10/21追記

上のサイトの動画がYoutubeに残ってました!

www.youtube.com

英語声プログラム® | ドクターDイングリッシュ

【おすすめ】元々はYoutubeで見つけたドクターDという方のレッスンが動画で受けられます。有料ですが教室に通ったりするよりは全然安いです。(教室だとうん十万円)

低くて渋い、アメリカ人っぽい発声法と英語独特の発声リズムを学びたくて、「動画コース」を購入して現在勉強中です。これを始めてから自分の発音の工場とリスニング力の向上を実感しています。

多聴多読

所詮テキストの英語は教科書英語、ネイティブはそんなゆっくり丁寧に話してくれません。ということで生の英語でリスニング、音読、シャドーイングができる教材として利用しています。時事ネタが読めるので内容も面白く、和訳、単語解説もついているので辞書と行ったり来たりせずとも読み進められ、かつ各記事30秒にまとめてくれているのでテンポよく勉強できます。

ビジネス英語

有名な瞬間英作文ですが、例文が割と仕事的に実用的なのが良いです。基本的な文の形がパッと思いつくようになるのでスピーキング力の向上に効きます。

2段階のスピードで意味の塊で区切って(サイトトランスレーション)英語→日本語を繰り返してくれますので勉強した後は通勤中の聞き流しにも良いです。ただCDの音声がネイティブっぽくなく聴きやすいので初学者向きっぽいです。初級レベルで、プレゼンテーションの時の会話の流れやボキャブラリーといったビジネスのシーンに合わせた学習ができます。リアルな英語リスニングはやっぱり上記のCNNがよいです。

 

PHP Conference 2013 に行ってきました。

http://phpcon.php.gr.jp/w/2013/

【主な収穫】

 

━━━ 以下、雑なログ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━

≪ミッションクリティカルなシステムの勘所≫
広告配信システム
・リアルタイムレポート
・膨大な配信ボリューム
・無停止メンテナンス
・柔軟な改修

・インフラ
  ほぼAWS
  富豪構成:Multi Load Balancer、Multi-Datacenter、Multi-Server
  多数のインフラを手動構築では危険
  Stack Deploymentパターン
    CloudFormation
    テンプレート+CLIの利用で柔軟に
    点プレから変更が少ないネットワーク部分を構築
    次にCLIでネットワーク上に置く変更の激しいものを設置
      

・アプリケーション
  広告配信はScala:Servlet
  計測部分はPHP+Gouche
  管理画面はPHP+Symfony2
  
  ‐テストコード
  ‐Pull Request運用
  ‐CI
  ‐ワンクリックデプロイ
  ‐本番同等検証環境完備
  
  サービス停止がまずい
    配信できない
    計測できない
      ぼっちで動く:連携システムが落ちても単体で動く。多少情報が古くても動かす。
      レスポンスを速攻で返すために:
        レスポンスだけ先に返す  ⇒  取り込みは裏バッチで。Fluentd
        か所によってはPHPをやめる  ⇒  PHP→Scalaで3倍速く。
        富豪的に解決  ⇒  スケールアウト+スケールアップ
      自動リトライ機能で運用を楽に。

・モニタリング
  fluentdでログ収集
  GrouthForecast:グラフ事前定義不要
  Xymon
  
  手軽に計測、手軽に関し、足らんなら作って公開

PHPはどのような部分に?
  どこでも。あなたがそれが良い選択だと評価できるならば。
  自分たちで検討して、動かして、計測して、評価する。
  
≪Composer≫
ライブラリはPackagistで探す。https://packagist.org/
VersionUP,Downも自在に。
PEARもインストールできる。
autoload.phpだけをrequireすれば二度とrequire_onceを呼ぶ必要がない。
  使う必要が出てきたタイミングで必要なものをLoadしてくれる。
  ライブラリごとのファイル名規則など把握する必要なし。
  
  PSRを守っていれば自作クラスでもautoloadされる。


≪パフォーマンスが悪い実装≫
・DB接続のキャッシュ
  __construct()でオープン
  __destruct()でクローズ
  とか。
  
  Apache child process (MINITとか)を理解して改善する。
  
・大量のdefine
  コストが大きく、リクエストごとに実行される。
  phpのextensionに記載すると改善できる。
  extensionが使えないか環境なら、hidefを活用するのが良い。
  
  
・ホスト名取得(exec)
  execによるプロセスの生成コストは非常に大きい
  Preforkの設計努力が無駄に。
  PHP5.3移行でサポートされたgethostname()を使いましょう。

・PFテストは継続的に
  ツールでサポートして促しましょう。
  Jenkinsでパフォーマンステストを自動実行して可視化するとか。

≪PHPからTwilioで電話を掛ける≫
・アメリカのサービスをKDDIが展開
  http://twilio.kddi-web.com/

・電話API
  電話発信、受信API(050番号取得)
  ダイヤル操作、録音などなど
・SMS
・VoIP連携

・初期費用が低く、スモールスタートでも使える。
・手順
  電話番号を買う。
  電話がかかってきたときにPOSTされるURLが発行される。
  
・既存サービスに付加価値をつけるのがフィットしている
  匿名通話
    電話番号を交換せずに。
  他者間通話
    海外からの電話に通訳をクラウドソーシングで入れる。
  電話受付
    かかってきた番号を記録して、後からかけなおしますと案内
  2要素認証
    ID/PASSと、自分の電話にSMSでコード送信

・利点
  Webサーバ連携が簡単
  1つの電話番号で同時着信可能
  電話番号でユーザ識別可能

・セキュリティ
  ほんとにTwillioサーバからのリクエストかを判別必要がある。
  サイトのドキュメントにその説明がある。
  署名の付加など。SSL証明書が必要。自己証明書ではできない。
  SMSにURLなど含めるとフィルタされる可能性あり。(au)
  SMSで迷惑メール設定などで届かない可能性あり


≪MySQL admin≫
・4.0から5.6への移行について
  Slaveから。
  mysql_upgradeで。
  mysqldumpで。

・スケールアップ
  INSERT/DELETEが重いときはパーティショニングが有効。
    パーティショニングキーを指定しないとSELECTは早くならない。
  SELECT、UPDATEが重いときはインデックスやパラメータが原因

・SQLレビュー
  今よりレコード件数が増えても想定のインデックスが使われることを考える。
  DEPENDENT SUBQUERY, type ALL, Using temporary table, using file sort 辺りは
  件数が増えると重くなる。

  テストデータの件数と分布も大事。

・外部キー制約
  嫌いな人が多い。パフォーマンスには影響ないので使いましょう。

・遅いクエリ
  相関サブクエリを使っている。
    CPU使用率が跳ね上がったらこのパターンを疑う。
  インデックスが足りない
    重いクエリーには複合インデックス
      ANDの条件を順番に並べる。それにORDERBYで使われているカラムを足す。
      不等号とかORを使うと、ORDERBYまで波及しない。
      LIMIT使ってるならWHEREよりもORDERBYを狙ったインデックスのほうが改善できるケースもある。
  パラメータ中忍具
    innodb_buffer_pool_sizeはデータ格納寮歌搭載メモリーの75%くらい突っ込む。
    MyISAMと同居するとメモリを取り合うので別にする。
    SSDなどの場合はパラメータチューニング
  
  クエリチューニング
    スロークエリに乗らないクエリもいろいろすると拾える。
    EXPLAINは基本。
    KEYが使われてるか、key lengthが想定している長さで使われているか。
    (int, datetime, varchar(32))なのにkey lengthが4とかだと、intのキーしか聞いていない。
    Using file sortは意外と重い。ORDER BYをIndexを狙う。
    
    
≪Vagrant≫
Vagrant入門ガイドが電子書籍で出た。Kindle。Gihyo Digital Pulishing.
関西PHP祭りで使った入門セッションのスライドがスライドシェアーに。
・用語
  Boxファイル     ⇒  マシンイメージファイル
  Vagrantfile     ⇒  仮想マシン構築設定
  vagrantコマンド ⇒  全ての操作

・PHP開発環境を構築
  流れ:
    $ git clone repos
    $ vagrant up
    完了

  Gitで管理
    Vagrantfileはプロジェクトごと
    ソースと一緒にGitで管理
    .vagrantは.gitignoreへ
  
  vagrant up
    仮想マシン構築、起動、OS起動
        構築
        Boxファイル名
        IPアドレス(ホストPCないだけのもの)
        ポートフォワード
      プロバイダ
        VirtualBoxの設定
        
    ミドルウェアインストール
      まずはシェルでやりましょう。
      php.ini, httpd.confは用意しておいてコピー。
      
    DB構築、データ投入
    アプリケーションデプロイ
    

・クラウド環境を構築
  AWSへも同じ環境を作成可能

・Vagrantが見せる夢
  Projectごとに独立した環境
  CIサーバにも使える。
  いつでも構築できる安心感。

≪WebAPI≫
・地図アプリAPIゼンリンデータコム)
  混雑状況、エリアの指定人数をリアルタイム表示

・駅データ.jp
  例)鉄道アラーム:乗り過ごし防止。
  
・Dropbox
  Dropboxへの送信をAPIで。

・WebPay
  クレジットカード決済

≪Phpstorm≫
・最初から高機能
・コード保管
  ・静的解析が優秀
  ・ライブラリや自作クラスも補完
・Symfony2、CakeStormなどのプラグイン
・Ctrl+Shift+AでFind Action、Jump to Class/File, Go to Decralation, Recent File
・自動アップロード、branch変更時も自動で, 
・Local history
・Bookmark
・リモートデバッグ
・LiveEdit

≪プロファイラ≫
・New Relic
  SaaS型パフォーマンス管理ツール
  お手軽。有償。フリートライアル有。

・xhprof
  facebookの人が作成。
  処理のフローをグラフ化。
  xhprof_enable()をbootstrap前に。
    /tmpのボリューム
    インストールが面倒
    詳細な情報がない。

・PHP Quick profiler
  ProfilerLog

≪PHPコアから読み解く定石の嘘ホント≫
・エラー演算子”@”のあるなし
  結果⇒エラーが起きるケースで比較すると、ある場合のほうが早い。
        error_reporting をクリアする処理が入るが、
        エラーログの出力などの処理の分の差が出る。

・比較演算子 == or ===
  === のほうが倍早い。===は方が違えばその場で処理終了。
  == は型変換がある。型が同じ変数の比較なら差が出ない。

・print / echo
  ややechoが早い。printは戻り値がある。ので戻り値を返した後に、
  変数を開放するプロセスがある。
  かつ、内部でechoを使う。

参考)
http://d.hatena.ne.jp/koto2/20080518/1211070116

[javascript]Javascriptを順番に動的ロード

はてなブログ始めました。(昔のブログ: エンジニアで行きたいです。 - 楽天ブログ

以下のようにappendChildしていくと解決するように思えるのですが、この場合非同期での読み込みになり、読み込みの順番が保証されないようです。

var ele1 = document.createElement("script");
ele1.type = "text/javascript";
ele1.src = "js/first.js";
document.body.appendChild(ele1);

var ele2 = document.createElement("script");
ele2.type = "text/javascript";
ele2.src = "js/second.js";
document.body.appendChild(ele2);

var ele3 = document.createElement("script");
ele3.type = "text/javascript";
ele3.src = "js/third.js";
document.body.appendChild(ele3);

これでは困るので、ネットの情報 (d:id:os0x:20080827:1219815828) を参考にチェーン式にappendChildする方法を考えてみました。

function JSSyncLoad(srces) {
  if (srces.length == 0) {
    return;
  }

  var sc = document.createElement('script');
  sc.type = 'text/javascript';
  sc.src = srces.shift();

  // クロスブラウザ対応(IE : readyStateはファイルのキャッシュ有無で変わるようです)
  if (window.ActiveXObject) {
      sc.onreadystatechange = function() {
          if (sc.readyState == 'complete' || sc.readyState == 'loaded')  {
            JSSyncLoad(srces);
          }
      };
  } else {
      sc.onload = function(){
            JSSyncLoad(srces);
      };
  }
  body = document.getElementsByTagName('body')[0];
  body.appendChild(sc);
}

使い方は、ロードしたい順にソースパスを配列で渡すだけです。

JSSyncLoad(['js/first.js', 'js/second.js', 'js/third.js']);

以下のブラウザで動作確認しました。