朝会をもっと良い感じに

朝会をもっと良い感じに

朝会に漫然と参加してしまっている気がする。もっと良い感じに活用するための策を考える。

朝会の目的

アジャイルサムライによると朝会は次のようなものらしい。

デイリースタンドアップは、重要な情報をチーム内ですばやく共有することを目的にした集まりだ。あらゆるミーティングを無くすための究極のミーティングがデイリースタンドアップだ。
.
.
.
この場で報告する内容は、基本的には自分の作業の最新状況だ。チームメンバーに知っておいてもらいたいことがあれば、それもこの場で共有する。
毎日、チームのみんなに「今日、私はこれをやります」とコミットメントを表明するんだ。これを続けていけば、自分でもびっくりするぐらい実際に仕事をやり遂げられるようになっていくはずだ。

つまり、朝会の目的は以下のふたつ。

  • 重要な情報をチーム内にすばやく共有する
  • 各メンバーが今日やることを宣言する

現状

チームの朝会では3つの情報を共有している。

  • 昨日やったこと・今日やること・困っていること
  • 溜まっているレビュー
  • 連絡事項

目的を照らし合わせると次のことが課題に思える。

  • チームメンバーに知っておいてもらいたいことをすべて報告できていない
  • 今日やることがコミットになっていない

チームメンバーに知っておいてもらいたいことをすべて報告できていない

昨日やったこと・今日やること・困っていることは共有できているはず。それ以外でチームメンバーに知っておいて欲しいことは連絡事項として共有すべきだが、連絡事項として話しているのは有休やリモートの取得、日報や勤怠の登録締切だけになっている。プロジェクトの最新状況やリリースまでの残り日数など、他にもメンバーに知っておいてもらいたいことがあるはず。

今日やることがコミットになっていない

  • 今日やることを具体的に伝えていないことがある。例えば「かんばんから取れそうなやつをとる」とは具体的になにをやろうとしているのだろう?
  • 終わらせなくても着手すれば良いと思っている。
  • 1日の終わりにはチームに伝えた今日やることを忘れてしまっている。宣言を守れたかどうか判断できないし、誰も覚えていない約束なら守る必要もない。

トライ

  • 今共有していること以外にも、チームに知っておいて欲しいことがあれば連絡事項として共有する。
  • 今日やることではなく、今日終わらせることを朝会で宣言するようにする。
  • 宣言した今日終わらせることをチームの目にふれる場所に記録しておき、1日の終わりに完了できたか確認する。
  • チームに無用なプレッシャーをかけたくないので、まずは個人的な活動として行う。

やってみよー。

unixパーミッションの優先順位

unixにおいてファイルやディレクトリのパーミッションは、 オーナー・グループ・その他に対して設定できる。例えばオーナーとグループのパーミッションが異なる場合、そのどちらでもあるユーザーにはどのようなパーミッションが適用されるのだろう。

このような場合、オーナー・グループ・その他のいずれかひとつのパーミッションが適用される。適用されるパーミッションは、オーナー > グループ > その他 の順に優先される。例えば、オーナーでもグループでもあるユーザーには、オーナーのパーミッションが適用される。

参考: http://inaz2.hatenablog.com/entry/2013/09/01/224223

syntax offっぽいvimのカラースキーム kuro.vim を作った

Go言語の開発者ともなるとvimにカラースキームなぞ不要らしい。

youtu.be

この動画に憧れてしばらくsyntax offでvimを使っていたのだけど、細かいところで使い勝手が悪い。 というわけで、使い勝手の良いsyntax offを目指してcolorschemeを作るというなんとも矛盾した活動により、kuro.vimを生み出しました。

github.com

今の所良い感じ。

2018.前半まとめ

読んだ

読んでる

積んでる

作った

書いた

tomota-tar-gz.hatenablog.com

雑感

  • 月1くらいでログを残すようにしよう。
  • Go言語面白い。手を出せそうなOSS探してみようかな。
  • 組み込みからwebに来たばかりでわからないことがいっぱい。学ぶのは楽しいが、学習効率が低い気がしてる。

「試して理解 Linuxの仕組み」に出てきたプロファイル系コマンドまとめ

はじめに

試して理解 Linuxの仕組みを読みました。 本書はOSとハードウェアの基礎知識を解説するもので、 理論を学ぶだけではなく実験もすることで理解が深められるようになっています。 実験に使われるプロファイル系のコマンドに知らなかったものが多く、 覚えておくと役立ちそうだと思ったので、この記事にまとめておきます。

コマンド

2章 ユーザーモードで実現する機能

strace

strace {program}
strace -o {log} {program}

プロセスが発行したシステムコールを1行ずつ表示します。

$ strace ls
execve("/bin/ls", ["ls"], 0x7ffc12f088f0 /* 19 vars */) = 0
brk(NULL)                               = 0x55f52beca000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=25766, ...}) = 0
mmap(NULL, 25766, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f2271fef000
close(3)                                = 0
.
.
.
オプション 効果
-T システムコールの所要時間をマイクロ秒単位で表示
-tt システムコールが発行された時刻をマイクロ秒単位で表示

sar -P

sar -P {CPU} {interval(s)}

CPUごとに使用時間の統計を表示します。 ctrl+cするとそれまでのを出力して終了します。

$ sar -P ALL 1
Linux 4.15.0-23-generic (vb-ubuntu-server)      07/23/2018      _x86_64_     (1 CPU)

10:38:45 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
10:38:46 AM     all      0.00      0.00      0.00      0.00      0.00    100.00
10:38:46 AM       0      0.00      0.00      0.00      0.00      0.00    100.00

10:38:46 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
10:38:47 AM     all      0.00      0.00      0.99      0.00      0.00     99.01
10:38:47 AM       0      0.00      0.00      0.99      0.00      0.00     99.01

10:38:47 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
10:38:48 AM     all      0.00      0.00      0.00      0.00      0.00    100.00
10:38:48 AM       0      0.00      0.00      0.00      0.00      0.00    100.00
^C


Average:        CPU     %user     %nice   %system   %iowait    %steal     %idle
Average:        all      0.00      0.00      0.33      0.00      0.00     99.67
Average:          0      0.00      0.00      0.33      0.00      0.00     99.67
フィールド 意味
%user ユーザーモードで実行した時間
%nice デフォルト以外の優先度で実行した時間
%system カーネルモードでシステムコールなどの処理を実行した時間
%iowait CPUコアで何も実行していなく、かつI/O待ちになっているプロセスが存在していた時間
%idle CPUコアで何も実行していなかった時間

ldd

ldd {program}

プログラムにリンクされているライブラリを表示します。

$ ldd /bin/ls
        linux-vdso.so.1 (0x00007ffff19b9000)
        libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007fa4fe68b000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa4fe29a000)
        libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fa4fe028000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa4fde24000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa4fead5000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa4fdc05000)

3章 プロセス管理

readelf

readelf {option(s)} {program}

Linuxの実行ファイルはELF(Executable Linkable Format)というフォーマットになっています。readelfはELFの各種情報を表示するコマンドです。

-hオプションでELFのヘッダーを表示します。 本文中ではエントリポイント(Entry point address)の確認に使われていました。

$ readelf -h /bin/ls
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x5850
  Start of program headers:          64 (bytes into file)
  Start of section headers:          132000 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         9
  Size of section headers:           64 (bytes)
  Number of section headers:         28
  Section header string table index: 27

-Sオプションで各セクションの情報を表示します。 本文中ではコード(.text)とデータ(.data)のファイル内オフセット・サイズ・開始アドレスを表示するために使われていました。

$ readelf -S /bin/ls
There are 28 section headers, starting at offset 0x203a0:

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] .interp           PROGBITS         0000000000000238  00000238
       000000000000001c  0000000000000000   A       0     0     1
  [ 2] .note.ABI-tag     NOTE             0000000000000254  00000254
       0000000000000020  0000000000000000   A       0     0     4
       .
       .
       .
  [14] .text             PROGBITS         0000000000003e90  00003e90
       00000000000124d9  0000000000000000  AX       0     0     16
       .
       .
       .
  [24] .data             PROGBITS         0000000000220000  00020000
       0000000000000268  0000000000000000  WA       0     0     32
       .
       .
       .
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
  L (link order), O (extra OS processing required), G (group), T (TLS),
  C (compressed), x (unknown), o (OS specific), E (exclude),
  l (large), p (processor specific)

/proc/xxxx/maps

プロセスのメモリマップを表示します。

$ cat /proc/14709/maps
55acf6656000-55acf675a000 r-xp 00000000 08:02 393245                     /bin/bash
55acf6959000-55acf695d000 r--p 00103000 08:02 393245                     /bin/bash
55acf695d000-55acf6966000 rw-p 00107000 08:02 393245                     /bin/bash
.
.
.

4章 プロセススケジューラ

taskset

taskset -c {cpu} {program}

論理CPUを指定してプログラムを実行します。

ps

ps ax

システムに存在するプロセスを表示します。

$ ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:05 /sbin/init maybe-ubiquity
    2 ?        S      0:00 [kthreadd]
    4 ?        I<     0:00 [kworker/0:0H]
    6 ?        I<     0:00 [mm_percpu_wq]
    7 ?        S      0:01 [ksoftirqd/0]
    8 ?        I      0:00 [rcu_sched]
    9 ?        I      0:00 [rcu_bh]
    .
    .
    .

STATフィールドの1文字目は各プロセスの状態を表します。

STATの1文字目 プロセスの状態
R 実行 or 実行待ち状態
S or D スリープ状態
Z ゾンビ状態

sar -q

$ sar -q 1 1
Linux 4.15.0-23-generic (vb-ubuntu-server)      07/23/2018      _x86_64_     (1 CPU)

02:29:20 PM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
02:29:21 PM         0       111      0.06      0.02      0.00         0
Average:            0       111      0.06      0.02      0.00         0

runq-szフィールドは実行中および実行待ちプロセスの数を示します。

/proc/cpuinfo

論理CPUごとの詳細情報が記録されているファイル。 本文中では論理CPUの数を調べるのに使われていました。

$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 78
model name      : Intel(R) Core(TM) i5-6360U CPU @ 2.00GHz
stepping        : 3
cpu MHz         : 1991.999
cache size      : 4096 KB
physical id     : 0
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 22
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid pni pclmulqdq monitor ssse3 cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti fsgsbase avx2 invpcid rdseed clflushopt
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass
bogomips        : 3983.99
clflush size    : 64
cache_alignment : 64
address sizes   : 39 bits physical, 48 bits virtual
power management:

time

$ time ls
.
.
.
real    0m0.003s
user    0m0.002s
sys     0m0.000s
フィールド 意味
real 経過時間
user ユーザーモードでのCPUが動作していた時間。複数の論理CPUで動作した場合はそれらの合計。
sys カーネルモードでCPUが動作していた時間

ps -eo

プロセス開始から現在までの使用時間と経過時間を出力します。 TIMEが使用時間、ELAPSEDが経過時間です。

$ ps -eo pid,comm,time,etime
  PID COMMAND             TIME     ELAPSED
    1 systemd         00:00:05    10:48:34
    2 kthreadd        00:00:00    10:48:34
    4 kworker/0:0H    00:00:00    10:48:34
    6 mm_percpu_wq    00:00:00    10:48:34
    7 ksoftirqd/0     00:00:01    10:48:34
    8 rcu_sched       00:00:00    10:48:34
    9 rcu_bh          00:00:00    10:48:34

5章 メモリ管理

free

システムが搭載するメモリの使用状況を表示します。

$ free
              total        used        free      shared  buff/cache   available
Mem:        1009124      115880      173296        1040      719948      734492
Swap:       2017276           0     2017276

Mem: |フィールド|意味| |:---|:---| |total|システムに搭載されている全メモリの量| |free|見かけ上の空きメモリ| |buff/cache|バッファキャッシュとページキャッシュが利用するメモリ| |available|実質的な空きメモリ。freeフィールドの値に空きメモリが不足したら開放されるカーネル内メモリ領域のサイズを足したもの。|

Swap: |フィールド|意味| |:---|:---| |total|swap領域のサイズ| |used|使用されているswap領域のサイズ| |used|空いているswap領域のサイズ|

sar -r

メモリに関する統計情報を出力します。

$ sar -r ALL 1
Linux 4.15.0-23-generic (vb-ubuntu-server)      07/24/2018      _x86_64_        (1 CPU)

02:00:49 AM kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty  kbanonpg    kbslab  kbkstack   kbpgtbl  kbvmused
02:00:50 AM    154660    716132    854464     84.67     79940    587968    308176     10.18    597792    145588         0     80920     78920      1856      5256         0
02:00:51 AM    154660    716132    854464     84.67     79940    587968    308176     10.18    597792    145588         0     80924     78920      1856      5256         0
^C

Average:       154660    716132    854464     84.67     79940    587968    308176     10.18    597792    145588         0     80922     78920      1856      5256         0
フィールド 意味
kbmemfree 見かけ上の空きメモリ
kbbuffers バッファキャッシュが利用するメモリ
kbcached ページキャッシュが利用するメモリ
kbpgtbl ページテーブルに使用しているメモリ

sar -B

$ sar -B 1
Linux 4.15.0-23-generic (vb-ubuntu-server)      07/24/2018      _x86_64_        (1 CPU)

01:45:52 AM  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
01:45:53 AM      0.00      0.00      1.00      0.00      1.00      0.00      0.00      0.00      0.00
01:45:54 AM      0.00    173.74      3.03      0.00      0.00      0.00      0.00      0.00      0.00
^C

Average:         0.00     86.43      2.01      0.00      0.50      0.00      0.00      0.00      0.00
フィールド 意味
fault/s 1秒あたりのページフォールト

swapon

システムのスワップ領域を確認します。

swapon --show
$ swapon --show
NAME      TYPE SIZE USED PRIO
/swap.img file 1.9G   0B   -2

sar -W

スワッピングの状況を表示します。

$ sar -W 1
Linux 4.15.0-23-generic (vb-ubuntu-server)      07/24/2018      _x86_64_        (1 CPU)

01:54:18 AM  pswpin/s pswpout/s
01:54:19 AM      0.00      0.00
^C

Average:         0.00      0.00
フィールド 意味
pswpin/s スワップインされたページ数(1秒あたり)
pswpout/s スワップアウトされたページ数(1秒あたり)

sar -S

スワップ領域の容量を表示します。

$ sar -S
Linux 4.15.0-23-generic (vb-ubuntu-server)      07/24/2018      _x86_64_        (1 CPU)

01:45:01 AM kbswpfree kbswpused  %swpused  kbswpcad   %swpcad
01:55:01 AM   2017276         0      0.00         0      0.00
Average:      2017276         0      0.00         0      0.00
フィールド 意味
kbswpfree 空いているスワップ領域のサイズ
kbswpused 使用しているスワップ領域のサイズ

/sys/kernel/mm/transparent/hugepage/enabled

トランスペアレントヒュージページ機能の有効/無効を設定するファイル。

6章 記憶階層

sar -d -p 1

ストレージデバイスへの読み書きを監視して表示します。

$ sar -d -p 1
Linux 4.15.0-23-generic (vb-ubuntu-server)      07/24/2018      _x86_64_        (1 CPU)

02:09:54 AM       DEV       tps     rkB/s     wkB/s   areq-sz    aqu-sz     await     svctm     %util
02:09:55 AM     loop0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:09:55 AM     loop1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:09:55 AM     loop2      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:09:55 AM     loop3      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:09:55 AM       sr0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:09:55 AM       sda      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
^C


Average:          DEV       tps     rkB/s     wkB/s   areq-sz    aqu-sz     await     svctm     %util
Average:        loop0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:        loop1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:        loop2      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:        loop3      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:          sr0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:          sda      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
フィールド 意味
rd_sec/s 1秒あたりに各ストレージデバイスから読み込んだサイズ
wr_sec/s 1秒あたりに各ストレージデバイスに書き込んだサイズ
%util 1秒あたりにストレージデバイスにアクセスしていた時間の割合

sysctl vm.xxx

ページキャッシュを制御するチューニングパラメーター。

パラメーター 意味
dirty_writeback_centisecs ダーティページのライトバック周期
dirty_background_ratio バックグラウンドでライトバック処理が動作開始するダーティーページの割合。この値を超えるとライトバック処理が始まる。
dirty_background_bytes バックグラウンドでライトバック処理が動作開始するダーティーページのサイズ。この値を超えるとライトバック処理が始まる。
dirty_ratio 同期的にライトバック処理が動作開始するダーティーページの割合。この値を超えるとライトバック処理が始まる。
dirty_bytes 同期的にライトバック処理が動作開始するダーティーページのサイズ。この値を超えるとライトバック処理が始まる。

/sys/devices/system/cpu/cpu{number}/topology/thread_sibilings_list

同じCPUコア内のハイパースレッドペアが記録されている。

7章 ファイルシステム

df

システムに存在するファイルシステムの一覧と使用状況を表示します。

$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
udev              474964       0    474964   0% /dev
tmpfs             100916    1024     99892   2% /run
/dev/sda2       10252564 4703284   5008764  49% /
tmpfs             504560       0    504560   0% /dev/shm
tmpfs               5120       0      5120   0% /run/lock
tmpfs             504560       0    504560   0% /sys/fs/cgroup
/dev/loop0         88704   88704         0 100% /snap/core/4486
tmpfs             100912       0    100912   0% /run/user/1000
/dev/loop1         89088   89088         0 100% /snap/core/4830
/dev/loop2         89088   89088         0 100% /snap/core/4917

/proc/{pid}

システムに存在するプロセスについての情報が格納されているディレクトリ。

$ ls /proc/$$
attr             cwd       map_files   oom_adj        schedstat     syscall
autogroup        environ   maps        oom_score      sessionid     task
auxv             exe       mem         oom_score_adj  setgroups     timers
cgroup           fd        mountinfo   pagemap        smaps         timerslack_ns
clear_refs       fdinfo    mounts      patch_state    smaps_rollup  uid_map
cmdline          gid_map   mountstats  personality    stack         wchan
comm             io        net         projid_map     stat
coredump_filter  limits    ns          root           statm
cpuset           loginuid  numa_maps   sched          status
ファイル名 格納されている情報
maps プロセスのメモリマップ
cmdline プロセスのコマンドライン引数
stat これまでに使用したCPU時間・優先度・使用メモリ量など、プロセスの状態

/proc

システムについての情報が格納されているディレクトリ。

$ ls /proc
1      14863  2      395   714  88         driver       locks         sys
10     14864  20     4     747  9          execdomains  mdstat        sysrq-trigger
1082   14901  21     407   748  97         fb           meminfo       sysvipc
11     14902  22     408   749  972        filesystems  misc          thread-self
114    14934  23     409   758  977        fs           modules       timer_list
12     15     23708  424   759  993        interrupts   mounts        tty
12360  15037  24     425   77   acpi       iomem        mtrr          uptime
12386  15038  25     426   771  asound     ioports      net           version
13     15059  26     427   773  buddyinfo  irq          pagetypeinfo  version_signature
13714  15076  27     442   776  bus        kallsyms     partitions    vmallocinfo
14     15090  272    449   777  cgroups    kcore        sched_debug   vmstat
14157  16     28     4710  78   cmdline    keys         schedstat     zoneinfo
14561  17     29     500   79   consoles   key-users    scsi
14598  178    30     507   790  cpuinfo    kmsg         self
14708  18     324    6     8    crypto     kpagecgroup  slabinfo
14709  19     325    610   80   devices    kpagecount   softirqs
14733  197    34     615   81   diskstats  kpageflags   stat
14805  198    35     7     82   dma        loadavg      swaps
ファイル名 格納されている情報
cpuinfo システムが搭載するCPUについての情報
diskstat システムが搭載するストレージデバイスに関する情報
meminfo システムのメモリに関する情報
sys以下のファイル カーネルの各種チューニングパラメーター

/sys

カーネルのプロセスに関するもの以外の雑多な情報が格納されているディレクトリ。

ディレクトリ名 格納されている情報
/sys/devices システムに搭載されているデバイスに関する情報
/sys/fs システムに存在する各種ファイルシステムに関する情報
/sys/fs/cgroup 1つ以上のプロセスから成るグループにかけられているリソースの使用制限に関する情報

8章 ストレージデバイス

iostat

ストレージデバイスへの読み書き情報を表示します。

$ iostat -x
Linux 4.15.0-23-generic (vb-ubuntu-server)      07/24/2018      _x86_64_        (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.56    0.13    0.25    0.09    0.00   98.97

Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
loop0            0.00    0.00      0.03      0.00     0.00     0.00   0.00   0.00    2.54    0.00   0.00    13.11     0.00   0.05   0.00
loop1            0.23    0.00      0.26      0.00     0.00     0.00   0.00   0.00    0.06    0.00   0.00     1.10     0.00   0.00   0.00
loop2            0.19    0.00      0.22      0.00     0.00     0.00   0.00   0.00    0.03    0.00   0.00     1.12     0.00   0.00   0.00
loop3            0.00    0.00      0.00      0.00     0.00     0.00   0.00   0.00    0.00    0.00   0.00     1.60     0.00   0.00   0.00
scd0             0.05    0.00      0.21      0.00     0.00     0.00   0.00   0.00    0.26    0.00   0.00     3.95     0.00   0.26   0.00
sda              0.68    1.29     18.81     65.87     0.03     2.40   4.09  64.93    1.39    2.24   0.00    27.73    50.90   0.75   0.15
フィールド 意味
rrqm/s 読み出し処理における1秒あたりのマージ数
wrqm/s 書き込み処理における1秒あたりのマージ数

2017年まとめ

読んだ本

会社でやったこと

  • 6人チームでリーダー
  • 担当プロジェクトのバージョン管理をSubversionからGitに移行
  • スクラム開発
  • ストーリーポイントとベロシティによるプロジェクトの終了日予測
  • プロダクトライン開発の基盤作り
  • GitLabのMergeRequestによるコードレビュー文化作り
  • GitLab wikiに情報を集約
  • 社内技術セミナーに登壇
  • include-what-you-use導入
  • GItLab+mattermost+jenkins+redmine連携
  • 新人教育にペアプロ導入

これから

3月からweb会社で働くことになりました。がんばります。

社内技術セミナーでチームビルドっぽい話をしたのでまとめ

先日、社内の技術セミナーに登壇してきました。セミナーの内容は「自社のソフトウェア開発の現状を知り、未来に向けて何をすればよいのか考える」と言う意識高めなもので、パネリストには最近行ったソフトウェア開発改善の取り組みを紹介せよとのお題が与えられました。技術レイヤーの話は他のパネリストがしてくれそうだったので、僕はチームビルドみたいな人とかチームに向けた取り組みの話をしてきました。当日話した内容と感想をざっくりとこのエントリにまとめておきます。

コンプライアンス的にアレなスライド・画像を除いた発表資料はこちら。

話したこと

話したことは4つ。

  1. スキルが伝播する仕組み作り
  2. プロジェクトの問題検知と解決の習慣化
  3. 主体的に動けるチーム作り
  4. 俺達駆動改善

始めの3つはここ1~2年で取り組んだ課題のこと。4つめは改善のモチベーションを上げる方法についての話。

スキルが伝播する仕組み作り

プリンシプルオブプログラミング読書会

このエントリで紹介した読書会の話です。 tomota-tar-gz.hatenablog.com

プリンシプルオブプログラミングは良いコードを書くために必要な原理原則を紹介してくれる本です。この本を題材に読書会を開催していますが、そこでは本を読む時間だけではなく、読んだ内容について周辺の知識と関連する経験を会話する時間を設けています。こうすることで知識と経験の伝播を狙っています。

全コードレビュー

チームの設計とコーディングのスキルを高める方法のひとつにコードレビューがあります。コードレビューを習慣化するために、バージョン管理ツールをSubversionからGitに移行、GitLabを導入してMergeRequestによる手軽なコードレビューができるようにしました。

プロジェクトの問題検知と解決の習慣化

このエントリの内容そのままです。 tomota-tar-gz.hatenablog.com

主体的に動けるチームを作る

Mattermost

メンバーが主体的に判断し行動できるためには、プロジェクトの情報がチーム内で適切に共有されている必要があります。情報共有のハードルを下げ、また速度を上げるためにSlackクローンのMattermostを導入しました。

タスクをアサインしない

メンバーが状況をみて柔軟に仕事の進め方を変えられる状態を目指そうとすると、固定化されたタスクアサインは行動を制限してしまうので邪魔になります。そのため、タスクはプールするだけにしアサインはメンバー各自で自身でするようにしてもらっています。この運用は「プロジェクトの状況を俯瞰できる」「状況をみて適切な行動を選択できる」スキルがチームに必要になるため「今やるべきでないことを自分にアサインしてしまう」ようなミスも起こります。このようなミスはデイリーミーティングで互いにフォローするようにしています。

俺達駆動改善

俺達駆動開発は改善のモチベーションを上げるための方法です。やり方は簡単で不満の主語を「俺達」に変えるだけ。こうすることで自己肯定感を失う代わりに強い当事者意識を得ることができます。例えば

  • あいつの書くコードはクソ!
  • 上司が技術的負債の返済に消極的!

みたいなものはこうなります。

  • 俺達の書くコードはクソ…
  • 俺達は技術的負債の返済に消極的…

とても辛いですが、同時に「やらなきゃ」「やれるかも」という前向きな気持ちも湧いてきます。半分ふさげた方法ですが効果がある人もいるかと思うので是非試してみてください。

感想

  • モチベーションが上がったと伝えてくれた人が何人かいた
  • 偉い人がGitLabやらMattermostの全社運用を考えて動き始めてくれた

など収穫があったみたい。よかった。後者はセキュリティにビビらずGitHubとかSlackとかクラウドなサービスを使わせてもらえると昼休みに鯖管業務しなくてすm(ry