「あなたのチームは、機能してますか?」を読んだ感想

次の会社に入社するにあたり、事前に読んでおいてくれと渡された本のうちの1冊。
入社まで1週間を切ったので重い腰を上げて読んだので感想まとめ。

本の構成

会社の経営陣立て直しストーリーに沿って、チームにおける5つの機能不全について、その中身と対処法をまとめた本だった。
ストーリーの後に比較的堅めなスタイルで5つの機能不全のモデルを載せていた。
診断用項目がついており、これをコピーしてチームで使用することでチームの現状把握に使えそうな感じだった。

5つの機能不全

  1. 信頼の欠如
  2. 衝突への恐怖
  3. 責任感の不足
  4. 説明責任の回避
  5. 結果への無関心

本の中では信頼の欠如を三角形の底辺として信頼の欠如を三角形の頂点とする図で説明されていた。
それぞれ、の機能不全は三角形の置いて土台となっている機能不全によって引き起こされているという説明。
説明責任の回避は、「戒める責任の回避」という感じの言葉のほうがしっくりすると思った。

これらを、自分が理解した内容として改めて言葉で言い直してみる。

信頼が無ければ建設的な意見の衝突ができず、
建設的な意見の衝突ができなければ決定事項に責任を持てず、
決定事項に責任を持てなければ決定と違う行動を戒めることができず、
決定と違う行動を戒めることができないと「チームの」結果がどうでもよくなる。

ざっくり感想とか

ストーリーはフィクションだがリアリティがあった。
そのおかげか、没入して読むことができた。
登場人物たちの議論と現実の会社での体験とを照らし合わせたことで、物語と内容への共感度合いが高かった。

いくら個々として優れていたとしても、チームとして機能していなければ圧倒的に効率が悪いというメッセージが強く伝わってきた。
5つの機能不全を改善していくプロセスは簡単ではなく苦痛を伴う、そして継続的に意識しなければだんだんと機能不全に陥ってしまうことも理解した。

現実と照らし合わせ、それぞれの機能不全を具体的に思い浮かべた。
たしかに本で触れているように、それぞれの機能不全に陥っている理由として、その土台となっている機能不全の具体的なところもある程度思い当たった。
自制心を強く持って意識していないと自然と機能不全へと陥ってしまうという説明にも納得した。

この本を渡されたということは、これらの機能不全に陥らず上手く機能させる振る舞いを要求されていると感じた。
次の職場では、5つを適度に思い出し意識するように心がける。
だけではなく行動にも反映させる。

ニート日報 2016-09-27

ニート18日目

とにかくサボっていた分のブログを書きまくった日。
あとISUCONの感想を書いた。
他にやったことと言えば、人工無能の本をちょっと進めたくらい。

アニメのダンガンロンパの絶望編を見終わった。
未来編を見てなかったから少し見始めた。
あと、リゼロを見終わってしまった。
終わり方からの予想だけど、原作からストーリーを変えてなさそうだから素直に2期に期待。

それくらいだ。以上。

TODO進捗

https://gist.github.com/mihyaeru21/7ec2e6b408d0c7f546274fd4b5a1e610

  • 人工無能の本を少し進めた

ISUCON6で予選敗退してきた

今年も毎年恒例となっている同期チームで参加した。

素振り

素振りとしてPixivの社内ISUCONの問題をやった(某コミュニティでやった)。
素振り時に良かった点はこんなところだった。

  • 個々人の作業環境と本番環境を分ける
  • git管理して、本番への反映は本番でpullする感じ
  • アクセスログ、スロークエリの解析を行い、きちんとボトルネックを把握する
  • ログをリポジトリにぶち込んで見やすくする

事前準備

会社の会議室を広々と専有し、スクリーンに常にカンバンを表示したり、さっとホワイトボードが使えたり、ブラインドを開けて景色を良くしたり、とにかく作業しやすい空間を作った。
良い広さで、普段の業務もあんな感じの広々空間でできたら幸せだろうなとか思った。

当日のタイムスケジュールを大雑把に作った。
本当に大雑把で、これくらいしかなかった。

  • ○時までにしっかり作業を開始できる準備を完了させる
  • ○時になったらいったん手を止めて現状確認会をする x 2
  • 17時半になったら最終スコアを出す準備をする

Azureに慣れるため、チームメンバー全員でAzureのテンプレートから各自の環境を作る素振りをした。
最初はAzureの仕組みがよくわかっておらず、1つのリソースグループに同じテンプレートから複数個のインスタンスとかを立ち上げようとしていたができなかった。
そこで、人数分のリソースグループを作り、そこにテンプレートから作成する方法を試した。
このやり方で良かったらしく、無事、人数分の環境を作る方法を理解できた。

あとは、時間までGitHubのカンバンに必要タスクを追加していった。
その際、脳みそを空にして取り組めるような内容のものには、脳みそを空にして実行できる手順を書くようにした。

本番

自分がやったこと+感想

  • アプリをgitに載せて個々の環境でも動作を再現できるようにする
    • perlディレクトリ内に.gitignoreがあり、localディレクトリがignoreされていることに1時間くらい気づかず時間を無駄にしてしまった
  • Slow Queryをpt-query-digestで解析してボトルネックを探す
  • entry検索のボトルネッククエリを改善しようと、keywordの長さをカラムに持たせつつindexを貼った
    • 要件的に全件必要で、どうせフルテーブルスキャンになるから完全に無駄だった(というか複雑性が増しただけだった)
    • アプリを読めば、フルテーブルスキャンにならざるをえないことがわかったはずで、すぐにキャッシュの実装に入るべきだった
  • MySQLの設定をチューニング
    • たいした数ではないinsertがボトルネックになっていたので、パラメータをまともな感じにした
    • 結局insert自体は早くならなくて完全に無駄だった
  • keywordsをRedisにキャッシュする
    • 実装でハマってしまい3時間ほど無駄にしてしまい、これをやっているうちに競技時間が終わってしまった
    • なぜか更新タイミングの問題だと思い込み、更新をロックするように実装したが、もちろん意味がなかった
    • Perlが外部と文字列をやり取りする場合に文字列をEncodeする必要があることを完全に忘れていたのが問題だった

チームメンバーがやったこと

  • テーブル情報を抜き出す
  • アクセスログの解析
    • nginxが解析に必要なログを吐き出す設定
    • alpを使って解析
  • Perlの鯖をStarletからGazelleに変更
  • 定番のnginxの設定をぶち込む
  • PerlのWorkerを増やす
    • 2コアしかないマシンなのにWorkerを20にしたら地味に大きくスコアが上がって草生えた
  • keywordsのselectをhtmlfyを呼び出しているループの外へ移動
    • これでスコア上がった
  • isutarを破壊してisudaに統合
    • web部分だけ統合
    • 時間無くてDBは統合できなかった
  • isupamへのリクエストをkeyword/descriptionを結合した文字列にしてまとめた
  • BIGINTだったカラムを全てINTに変更

良かったこと+感想

  • GitHubのProjectを使い、やれること、誰が何をしているかを把握できるようにする
  • 会議室を広々と使い、話す時にさっとホワイトボードが使える状態
  • 効果がなかったが経験としてよかったのは、テーブルの構造を変えたこと
    • 過去2回のISUCONでは、怖くてテーブルの構造を変えることができなかったが、一歩踏み出すことができたのは大きい
  • 2年前からの1段階目の目標として「スコア1万を超える」というのがあり、目標を超えられた
    • 今回は22,220だった
  • 過去よりもいろいろなことにスムーズに取り組めるようになっていた

今回は、アプリのコードを読んでいじる部分の重要性が高かったように感じた。
MySQLだけ見たりnginxだけ見てもほとんど意味なかった。
総合的に判断する必要があるなーという学びを得た。

次回あればやりたいこと

細かいこと大きいこと含め、備忘録として次回やりたいことをざっと書いておく。

  • 素振りは複数回実行する
  • みんなでサービスを触りつつコードの理解に時間をかける
  • DB起動時にBuffer Poolにデータを載せる
  • 正規表現があったら事前コンパイルしておく
  • 自分の作業環境を使いやすく整える
  • nginxでgzip圧縮
  • チームメンバー的に読みにくいコードを、さっと読みやすい形式にスタイルだけリファクタリング
  • 過去問に対する他チームのアプローチを勉強する
  • Redis/Memcachedを事前にちゃんと使う

終わりに

多大なる時間と労力をかけて準備してくださった運営の方々、ありがとうございました!
今回も楽しく勉強になりました。

ニート日報 2016-09-26

ニート17日目

残すところニート期間はあとちょうど1週間。
来週から働くというのが信じられない。

全ての時間を座れると思っていたアクセル・ワールドを最新刊まで読み終わった。
これで明日からいろいろ復帰できる。

あと部屋の掃除をした。
机の引き出しにぶち込みまくっていたいらない物を判別して捨てるだけの簡単なお仕事。
ちょっとスッキリした。

TODO進捗

https://gist.github.com/mihyaeru21/7ec2e6b408d0c7f546274fd4b5a1e610

  • アクセル・ワールド完了

ニート日報 2016-09-25

ニート16日目

前日同様、アクセル・ワールドを読む機械で終わる……はずだった。
が、夜になぜかリムジンに乗った。

リムジンの様子

CA系列の某氏に誘われ、新橋にてリムジンに乗ることになった(謎)。
IT系のエンジニア野郎のみ8人という謎面子で乗った。
4500円で乗れた。
たった1時間くらいだけど思っていたよりも安い値段で乗車できるようだ。

内部は想像よりも狭く、8人は完全に定員ギリギリという感じだった。
内部にはお酒(ワインとウイスキー)とかお菓子が設置されていて、自由に飲み食いできるスタイルだった。

新橋とか汐留とか付近の東京のオサレスポットを少し巡るルートだったようだ。
途中で下車し東京タワーとリムジンをバックに記念撮影とかした。

結論:4人くらいで乗るのがちょうど良い

TODO進捗

https://gist.github.com/mihyaeru21/7ec2e6b408d0c7f546274fd4b5a1e610

  • アクセル・ワールドを読む機械

ニート日報 2016-09-23

ニート14日目

ニート歴も2週間が終わる日。
終わりが始まってしまった。

火曜に行こうと思っていた医者へ行ってきた。
喉と咳の調子が良くならず、9月中ほとんど薬を飲んで生活している気がする。

終わりの始まり

ずっとKindle版が出るのを待っていたアクセル・ワールドのKindle版が出ていることに気づいてしまった。
15-20巻を速攻でポチった。
そして……(メモはここで途絶えている

TODO進捗

https://gist.github.com/mihyaeru21/7ec2e6b408d0c7f546274fd4b5a1e610

  • アクセル・ワールドを読むのを追加

ニート日報 2016-09-22 PyCon JP 2016 2日目

ニート13日目

この日もPyConだけ。
気づいたらニート期間も折り返していた。

PyCon 2日目

ぎりぎり基調講演の開始に間に合ったような間に合わなかったような。
駅から会場まで回り込んで入るのが遠かった。

基調講演

Pythonのバージョンの話?とか型ヒントの話とかasyncioの話だった。

来年再来年あたりにPython 2系と3系を使っている割合が逆転して、ついに数字的にも3の時代になるようだ。
3系も3.5まで来てやっと統一が見えてきた気がした。

型ヒントはオマケではあるんだけど、個人的にはメソッドの入出力の型がはっきりしていると幸せだなーと思っている。

質疑にてロシア語で質問している人がいて強かった。
あと、ゆっくりはっきり喋っていただけたようで聞き取りやすい英語だった。

f2pyとmatplotlibを用いたブラウン粒子動力学のリアルタイム可視化

Fortranはまだまだ現役なのか!という感想。
Cよりも数値計算周りは最適化しやすいから利用されているっぽい?
f2pyは、PythonとFortranを繋ぐやつだった。

matplotlibでGUIちょこちょこ作れたのか…
あれはQtのやつだったのだろうか。

関係ないけど、matplotlibをpyenvのPythonで動かした時にmatplotlib.pyplotが使えないのが辛い。

ビッグデータとPythonではじめる野球の統計分析

力強かった。
60万行のデータがあるとか、すごい。

結論「ダルビッシュすごい」

Python を支える技術: モジュール・インポートシステム編

話している声が聞こえなすぎて内容に全く集中できなかった…
資料を見た感じ、とっても良さそうな内容だったのでとても残念。

メタプログラミングPython

Pythonにおけるメタい部分を広く浅く紹介する感じだった。

メタクラスの仕組みとか、Objective-Cとけっこう似てる気がした。
Ghost Methodは、メソッドを返すところが特徴的だと感じた。

withで影響範囲を絞って書き換えるのが便利そうだった。
PerlだとGuardオブジェクトを作って、Guardが生きているスコープで書き換えるとか、とくにテストでよくやる。

from forbiddenfruit import curseがとにかく強そうだった。

Pausable Unittest on EFI Stackless Python

Stackless Pythonなるものが存在していたこと知った。
言われてみれば、pyenv install -lした中にあった。

最初から聞いていたわけではなかったので、電源を切っても状態が保存されている?というのがわからないまま終わってしまった…

LT

Neo4jはグラフDBと。
一応存在だけ覚えた。

ルータが走るのやばかった。
しかし市販のルータ向けのLinuxディストリビューションがあるとは知らなかった(OpenWrt)。

その他

モノタロウブースにて、すてにゃん氏が目の前で1等を当てていて強さを感じた。

おやつ↓が可愛かった。

帰りになぜか10kmくらいの道を徒歩で返ってPyConが終わった。
3時間くらいかかって、さすがに頭おかしかった。

TODO進捗

https://gist.github.com/mihyaeru21/7ec2e6b408d0c7f546274fd4b5a1e610

進捗ダメです

ニート日報 2016-09-21 PyCon JP 2016 1日目

ニート12日目

この日はPyConの1日目だった。
朝から夜までPyConのみ。

PyCon 1日目

前日夜にfluentdとかElasticsearchとかKibanaとかをいじっていたせいで寝るのが遅くなってしまい、オープニングと基調講演に間に合わなかった。

聞いたトークとか一覧はこれ。

Pythonを含む多くのプログラミング言語を扱う処理フレームワークとパターン

SWEBOKという概念の存在を知った。
知識を体系化しているまとめているやつらしい。
何かを学んだとき、体系の中のどこに位置するかを意識しながら学ぶと効果的なようだ。
自分には基礎体系の理解が不足している実感はあるので、急ぎで学ばないといけないものが無い時に本を読んでみようと思った。

後半は、特定の言語にとらわれないツールの開発手法についての話だった。
言語によらないカバレッジツールとか面白そう。
言語間共通部分の翻訳は、新しい言語を勉強するときにはそんなに必要なさそうに思った。
Twitterで誰かが言っていたけど、いろいろな言語に共通の部分は難しくなく、サンプルをちょっと読めばすぐに理解できるので。

たった一ファイルの python スクリプトから始める OSS 開発入門

オペレーションを手動からワンライナー、書捨てスクリプト、そして管理ツール?作成までの話だった。
手動オペレーションだったところを、むりやりスクリプト化するのにはエネルギーが必要そうだと感じた。
何事もステップアップが大切だと思った。

仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発

誰も(見えるところで)やっていなかったニッチな部分をやった話だった。
ニッチなところでも、後で自分と同じ道を通る人がいるかもしれないという考えでオープンにする考え方は立派だ…。
途中経過みたいなところの話が聞けたのが貴重だった。

最後の質疑にて、より良い書き方ができるというアドバイスを頂いていて、アウトプットすると改善の機会が増えるという良い例になっていた。

Pythonistaよ、Pythonistaを知っているか 〜こんなの欲しかった! iOSアプリ開発環境Pythonista〜

おめがし。
ハプニングが多くて見てるこっちがひやひやした。
発表資料の査読を頼まれてたけど、2日前の時点でプロットくらいしかできてなくて、その時点でもあせあせだった。
本番資料はきちんとできていて発表も大丈夫そうで良かった。

LT

全体的にパワーがあった。

カラオケは、歌う部分がフォーカスされちゃってたけども中身はすごかった。
採点システムを自ら作ってしまうとは、愛が感じられた。

天文学とPythonの知られざる関係が明かされた。
まさか、すばる望遠鏡の制御システムがPythonで動いているとは。
驚くばかり。

ぱーちー

天文学の方とお話しようと思ってたけど完全に忘れてしまっていた。残念。
あとは、知ってる人、初めて会う人何人かと主にPythonじゃない話をしていた。
ぷりんたい氏と初めてリアルで会った。

TODO進捗

https://gist.github.com/mihyaeru21/7ec2e6b408d0c7f546274fd4b5a1e610

進捗ダメです

ニート日報 2016-09-20

ニート11日目

またも堕落。やばい。
堕落しすぎてやばかったから、自サイトのアクセス解析基盤を整えることにした。

fluentd + Elasticsearch + Kibana

nginxのアクセスログをfluentdでElasticsearchにぶち込んでKibanaで表示する。ってやつを作ってみた。
よくわからないところから数時間で構築ができたので、なかなか生産性の高いツール群だと思った。

この記事を参考にした。

fluentd

fluentdの設定の基本的な構造はシンプルかつ拡張しやすいなーという感想。
参考にしたサイトはngixを動かす鯖とElasticsearchを動かす鯖を分けて、ログをfluentdで転送してからElasticsearchにぶち込むスタイルだった。
そのままパクると動かないが、理解しやすい構文だったので(あまりよくないけど)ドキュメントを参照せずとも、やりたいこと(nginxとElasticsearchを同じ鯖で動かす)を実現することができた。

Elasticsearch

入れただけでほとんどいじってない。
が、ぶちこんだ文字列がanalyzedになってしまい、PathとかUserAgentとかでのグルーピングが上手くできなくなってしまった。
この記事の内容を実施したら、not_analyzedになり良い感じになった。

Kibana

Kibana自体にアクセス制限の機能が無かったため、雑対応としてnginxのvirtualhostにて家のIPアドレスからしかアクセスを許可しないようにした。
家以外からアクセス出来ないのは不便なので、あとで強そうなパスワードのBasic認証に変える。

表示設定は、昔会社で少し触った記憶を蘇らせて適当にいじった。
全アクセスログの時系列カウントは簡単に表示できたが、それをvhostごとに分割して表示する方法まではヒント無しでたどり着けなかった。
ちょっとググったらすぐにやりかたがわかり、晴れて「vhostごとの時系列アクセスカウント」を可視化できるようになった。

Ubuntu 16.04環境にそれぞれインストールしてOS起動時に立ち上げる設定

下記コマンドは全てrootにて。

インストール

日本語の情報だとKibanaをaptで入れる感じの記事がぱっと見つからなかった。

1
2
3
4
5
6
7
8
9
10
11
12
# td-agent(fluentd)
curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent2.sh | sh
td-agent-gem install fluent-plugin-elasticsearch

# Elasticsearch
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | apt-key add -
echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
apt update && apt install elasticsearch

# Kibana
echo "deb http://packages.elastic.co/kibana/4.6/debian stable main" | tee -a /etc/apt/sources.list.d/kibana-4.6.list
apt update && apt install kibana

OS起動時に立ち上げる

td-agentは自動で登録されたっぽい

1
2
systemctl enable elasticsearch.service
systemctl enable kibana.service

起動

1
2
3
systemctl restart td-agent.service
systemctl restart elasticsearch.service
systemctl restart kibana.service

TODO進捗

https://gist.github.com/mihyaeru21/7ec2e6b408d0c7f546274fd4b5a1e610

  • PyConのLTは諦めた…
    • 無理に頑張れば準備は間に合いそうだけど、発表時にどかどか喋ると確実に咳き込むのが辛い