ハトネコエ Web がくしゅうちょう

プログラミングとかAndroid

エンジニアマネージャーに必要なことってなんだろう?

最近、ありがたいことにチームリーダーをやらせてもらっているのですが、
経験が無いのでどうすればいいのか手探りでやっています。

今後どうしていけばいいのか、
今の時点で得られていることを頭の整理としてまとめておきたいと思います。

インプットを続ける

エンジニアに大切なことは技術力の向上ですが、
マネージャーはそれにプラスしてマネージング力の向上を続けていかなければなりません。

そのためには人事、経理、組織論について、本やネット記事を読むだとか、
職場の他のマネージャー、他社のマネージャーに話を伺いに行き、手法を学び続ける必要があります。

そうしないと自己流が出来上がってしまい、「自分は上手くやれてるはずなのに」と、しだいに頭の固い人間になってしまいます。
上手くやれてるつもりになるのが一番危ないです。

どうすればチームがダメになるのかを知る

いくつか手段があると思います。

  1. 経験する
  2. 聞く・読む
  3. チームメンバーの性格を把握する

1 はつまり自分や自分の所属するグループが崩壊をすることです。
自分の経験なので記憶に強く残りますから、同じ失敗はしにくくなります。
問題点はそんなに何回もチームの崩壊を経験できないことです(笑)

ということで、2 の、人から聞いたり記事を読むことになるわけです。
他社の「こんな状況からこう正常化させた」という記事から、逆説的に、ダメな状況がどういうものかを学べます。

3 は上記とは別軸の話です。
一般論としての 1, 2 ではなく、現在のチームの特性としての 3 です。
個人のやる気を下げる要因がなんなのか知ることは、チーム崩壊を起こさないために大事なことです。
何がイヤなことであるか直接聞いたり、現在の職場で気になりつつあることを聞いたり、前の職場を辞めた原因はなんなのか聞いたり
1 on 1 や普段の会話で、個人個人のNGポイントを集めておきましょう。

上司が何を欲しているか知る・予見する

これはマネージャーに限らず大切なことですが、
上司が何を欲しているか予見して動くことは非常に大切です。

マネージャーの上司はマネージャーです。
チームマネージャーはメンバーの行動や未来を考えますが、その上司のマネージャーは
「チームが何をしているか」「チームがこれからどうしたいか」などを気にしています。

チームの四半期目標だったり、1 on 1 の結果報告だったり、チームが達成したことの週次報告(月次報告)だったり、
チームの状況を知るために必要なことは聞かれる前に上げていくくらいにしましょう。

あなたがチームリーダーとして上司からの信頼を得られることは、
チームが好きに動きやすくなれることにもつながります。大事なことです。

自分が頭いいと思わない

自分の頭がいいと思ってしまうと、あらゆることを自分でやろうとしてしまいます。
それはスケジュール的に自分の首を絞めてしまうばかりでなく、
結局のところ自分が気付いていないだけで他の人のほうが上手くやれることだったりして、
周りの反感を知らず知らずに買っていたりします。

周りの人間を信じましょう。
その人は失敗するかもしれませんが、失敗から学ぶこともあります。
子どもが怪我をしないように公園で遊ばせない親がいい親とは言えません。
(ただし大怪我に気付けるよう、公園のベンチから様子を確認してはおきましょうね?)

メンバーの成果は褒め称える

何かしてもらったら「ありがとう」と言うべきですし、
良い成果を上げたのなら「ナイス!」と伝えるべきです。

信じて任せて感謝する
聞いた話だとこれがけっこう難しいらしいです。

信じられて任せられて感謝されたら、誰もが気持ちよく働けるでしょう。

メンバーの市場価値を高める

エンジニアはひとつの会社には留まりません。常に新しい環境を求める生き物です。
そのとき――チームメンバーの転職――は必ずやってきます。

それは他の会社に嫁(婿)に出すようなものだと私は思っています。
ですので、親の立場となるマネージャーがそのときまでにすることは、
「どこに嫁(婿)に出しても恥ずかしくない人間にする」ことだと私は思っています。

そのために必要なことは、会社でいろいろなことを経験させること、そしてそのおこなったことを説明できる能力を身に付けさせることです。
面接で絶対に聞かれることは「前職でおこなってきたこと」です。
ここの説得力は面接の結果を左右します。

  1. いろいろな業務を経験させる
  2. その業務で何をしたのか、何を工夫したのか、チームの振り返り会や 1 on 1 で振り返らせる
  3. プレゼンテーション能力を向上させる(社内勉強会の開催など)
  4. 社外へのアウトプット(勉強会での登壇やブログなど)を勧める

これらのことを継続的におこなうと、メンバーの市場価値は上がっていくのではないでしょうか?
このことによって会社の利益が出るとかはないでしょうが、続けていけば何かいいことがある……はず? ……たぶん。

夢を持つ

自分がすごく苦手なところなんですが、夢を持つのは大切だと思います。
チームメンバーに将来どのようになりたいのか聞いてキャリアプランを設計すべき人が、将来どうなりたいのかを持っていないってのは意味がわかりませんし、
そんな人にはメンバーも正直に夢を語ってはくれないでしょう。

夢って、難しいですね……うーん、自分は将来何をしたいんだろう。
『夢をかなえよう』って曲の主人公並みに夢について考えちゃうぞ。

これは現在の自分が特に出来ていない課題です……。

1 on 1 で何を話せばいいのか?

今までのことの総まとめになります。

  • 最近会社で気がかりなこと(嫌なこと)はないかの確認
  • 直近の業務で何をしたのかの振り返り
  • 次にどういう業務をやってみたいかヒアリング
  • 会社に欲しいもの、導入したいツール
  • 短期的・長期的な個人目標

など、エンジニアマネージャーとしてチームを回していく上で必要な情報の収集をおこないます
基本は気軽に雑談をすればいいと思いますが、
こういった、チームを回していく上で必要な情報を得られていないのなら、
1 on 1 の機会を利用して積極的に情報収集をしていくべきでしょう。

おわりに

以上が、現時点で考えるエンジニアマネージャーとして必要なことです。

考えたり経験したり、読んだり聞いたりして情報を集めてはいますが、
いかんせんまだリーダー経験としては2ヶ月なので、圧倒的に経験不足!!

足りないところや間違いなどがあり、数ヶ月経ったら更新したくなりそうですが、
今の時点で一度、得たことを振り返っておきたかったのでまとめました。

まだマネージャー職という自覚がなくて、
「メンバーのタスク状況の確認とか文章書いたりでコードあまり書いてないし、重たい実装タスクはメンバーに任せてるし、私って仕事してないのでは?!」
と思う日々が続いています。

同業の人に相談したら、「いや、コードはあまり書かなくなるものだよ、それでいいんだよ」と言われましたが、
突然リーダーになってしまいコードを書くことが仕事という考えから抜けられない私はまだ戸惑っています。
慣れるかな・・・?

最後に、最近読んでよかった本をアフィリエイトとしてぺたりとー。
自分やチームメンバーが今なにが出来て、次はなにを出来るようになればいいかを考えることができる良書でした。

Googleスプレッドシートでセルの文字列の文字列結合(IFの活用)

スプレッドシート関数の書き方わからなくて困ること多いのでメモ。

f:id:nekonenene:20180225103733p:plain

こんなふうに、右の列に "/releases" と文字列をくっつけた行が続く場合には関数で書きたい。

文字列の結合は & で書ける。
なので、C2 には =B2&"/releases" と書けばいい。

ただ、これで困るのがB列の文字列が空のとき。
隣のC列には /releases とだけ書かれてしまう。

これでは見栄えが悪いので IF 文を使う。

=IF(NOT(B2 = ""), B2&"/releases", "")

これでOKだ。

!= が使えないので NOT でなんとかしている。

=IF(B2 <> "", B2&"/releases", "")
=IF(B2 = "", "", B2&"/releases") とも書けるので、個人的な見栄えの良さで選択するといいと思います。

Datadog のメモリ監視に関するダッシュボード設定

「君のアカウント、試用版だから有料版にアップグレードするか無料版にダウングレードするかしないと消すね」
Datadog から警告が来たので、もし設定しなおす場合の参考用に。

1. メモリを used, buffers, cached, free の分け方で見る場合

free コマンドで言うところの used, buffers, cached, free で分けて見る場合です。

グラフはこんな感じ。

f:id:nekonenene:20171128003424p:plain

それの設定はこうする。

f:id:nekonenene:20171128004118p:plain

JSONだとこういう設定になっている。

{
  "viz": "timeseries",
  "requests": [
    {
      "q": "avg:system.mem.free{*} by {host}, avg:system.mem.cached{*} by {host}, avg:system.mem.buffered{*} by {host}, avg:system.mem.used{*} by {host} - avg:system.mem.cached{*} by {host} - avg:system.mem.buffered{*} by {host}",
      "aggregator": "avg",
      "conditional_formats": [],
      "type": "area",
      "style": {
        "palette": "dog_classic"
      }
    }
  ],
  "autoscale": true,
  "status": "done"
}

used には buffered と cached が含まれていて、 used + free = total になります。
ですので、下から

  • (used - buffered - cached)
  • buffered
  • cached
  • free

と領域を持つようなグラフになっています。
(used - buffered - cached) が使用メモリ容量とほぼイコールです。

2. メモリを available, not available で分ける場合

(used - buffered - cached) は使用メモリ容量とほぼイコールと上で書きましたが、厳密には異なります。
以下の記事が詳しいです。

Datadog では available は system.mem.usable が当たりますのでそれを使います。

こういうグラフになります。

f:id:nekonenene:20171128010845p:plain

それの設定はこう。

f:id:nekonenene:20171128010955p:plain

JSONでの記述はこうなっています。

{
  "viz": "timeseries",
  "requests": [
    {
      "q": "avg:system.mem.usable{*} by {host}, avg:system.mem.total{*} by {host} - avg:system.mem.usable{*} by {host}",
      "aggregator": "avg",
      "conditional_formats": [],
      "type": "area"
    }
  ],
  "autoscale": true,
  "status": "done"
}

グラフの下部分がメモリ使用量だとわかりやすいので、下から

  • (total - usable)
  • usable

と領域を持つグラフにしています。

基本的にはこちらのグラフだけあれば充分ですが、 1. で紹介したグラフも並べておくと、なんとなく充実感を持てると思います。

CygWin 環境に nokogiri , ffi, mysql2 をインストールできるようになるまで

WindowsRails アプリを動かしたくて CygWinbundle install したら nokogiri で止まってしまうので、必要なものをまとめた。

なお、 Windows 10 64bit 環境に CygWin64 をインストール、
apt-cyg mirror には http://cygwin.mirror.constant.com/ を利用した。

apt-cyg

まず、CygWin のデフォルトのインストーラーを使うのは大変なので、
apt-cyg を入れる。

デフォルトのインストーラーで lynx をインストールしておく必要がある。

lynx -source rawgit.com/transcode-open/apt-cyg/master/apt-cyg > apt-cyg
install apt-cyg /bin

で apt-cyg のインストール完了。

apt-cyg install wget
apt-cyg update

でパッケージ情報を最新に。

ruby , ruby-devel

ruby だけじゃなくて ruby-devel も、nokogiri のインストールには必要なので注意。

apt-cyg install ruby ruby-devel

必要なものを入れる

ここまでで gem install nokogiri をやってみても悲しいことに失敗するので、いろいろ足していく。
makeやCコンパイラーや、各種ライブラリ。

apt-cyg install make gcc-core zlib zlib-devel libiconv libiconv-devel

これらを足すことで nokogiri がインストールできるようになっているはず。

gem install nokogiri

成功だったらバンザイ! ダメだったらすみません……。

nokogiri 単体で使うことはあまりないので、インストールが確認できたらアンインストール。

gem uninstall nokogiri

代わりに今後使うであろう bundler を入れておきましょう。
どうも gem install でグローバルインストールすると ~/bin 以下に実行ファイルが置かれるようなので、 ~/bin にPATHを通します。

gem install bundler
echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

その他 : ffi , mysql2

ffi のために

apt-cyg install libffi6 libffi-devel

mysql2 のために

apt-cyg install mysql libmysqlclient-devel

これらをインストールすることによって、 bundle install を正常終了させることができた。