朝会をもっと良い感じに
朝会をもっと良い感じに
朝会に漫然と参加してしまっている気がする。もっと良い感じに活用するための策を考える。
朝会の目的
アジャイルサムライによると朝会は次のようなものらしい。
デイリースタンドアップは、重要な情報をチーム内ですばやく共有することを目的にした集まりだ。あらゆるミーティングを無くすための究極のミーティングがデイリースタンドアップだ。 . . . この場で報告する内容は、基本的には自分の作業の最新状況だ。チームメンバーに知っておいてもらいたいことがあれば、それもこの場で共有する。
毎日、チームのみんなに「今日、私はこれをやります」とコミットメントを表明するんだ。これを続けていけば、自分でもびっくりするぐらい実際に仕事をやり遂げられるようになっていくはずだ。
つまり、朝会の目的は以下のふたつ。
- 重要な情報をチーム内にすばやく共有する
- 各メンバーが今日やることを宣言する
現状
チームの朝会では3つの情報を共有している。
- 昨日やったこと・今日やること・困っていること
- 溜まっているレビュー
- 連絡事項
目的を照らし合わせると次のことが課題に思える。
- チームメンバーに知っておいてもらいたいことをすべて報告できていない
- 今日やることがコミットになっていない
チームメンバーに知っておいてもらいたいことをすべて報告できていない
昨日やったこと・今日やること・困っていることは共有できているはず。それ以外でチームメンバーに知っておいて欲しいことは連絡事項として共有すべきだが、連絡事項として話しているのは有休やリモートの取得、日報や勤怠の登録締切だけになっている。プロジェクトの最新状況やリリースまでの残り日数など、他にもメンバーに知っておいてもらいたいことがあるはず。
今日やることがコミットになっていない
- 今日やることを具体的に伝えていないことがある。例えば「かんばんから取れそうなやつをとる」とは具体的になにをやろうとしているのだろう?
- 終わらせなくても着手すれば良いと思っている。
- 1日の終わりにはチームに伝えた今日やることを忘れてしまっている。宣言を守れたかどうか判断できないし、誰も覚えていない約束なら守る必要もない。
トライ
- 今共有していること以外にも、チームに知っておいて欲しいことがあれば連絡事項として共有する。
- 今日やることではなく、今日終わらせることを朝会で宣言するようにする。
- 宣言した今日終わらせることをチームの目にふれる場所に記録しておき、1日の終わりに完了できたか確認する。
- チームに無用なプレッシャーをかけたくないので、まずは個人的な活動として行う。
やってみよー。
syntax offっぽいvimのカラースキーム kuro.vim を作った
2018.前半まとめ
読んだ
- スッキリわかるJava入門
- 試して理解 Linuxのしくみ
- 暗号技術入門
- OpenSSH 実践入門
- スターティングGo言語
- 文章読本
- 語彙力を鍛える
- 文章は接続詞で決まる
- 考える技術書く技術
- 知的戦闘力を高める 独学の技法
- OKR
- エンジニアリング組織論への招待
- ファシリテーション・ベーシックス
読んでる
積んでる
作った
書いた
雑感
- 月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年まとめ
読んだ本
- コンピューターの構成と設計 上巻
- エンジニアのためのGitの教科書
- ピープルウェア
- Team Geek
- 達人プログラマー
- 6日間で楽しく学ぶLinuxコマンドライン入門
- GO言語によるWEBアプリケーション開発
- プリンシプルオブプログラミング
- 知識ゼロから学ぶソフトウェアテスト
- テストから見えてくるグーグルのソフトウェア開発
- アジャイルな見積もりと計画作り
- アジャイルサムライ
- レガシーソフトウェア改善ガイド
- 実践Vim
会社でやったこと
- 6人チームでリーダー
- 担当プロジェクトのバージョン管理をSubversionからGitに移行
- スクラム開発
- ストーリーポイントとベロシティによるプロジェクトの終了日予測
- プロダクトライン開発の基盤作り
- GitLabのMergeRequestによるコードレビュー文化作り
- GitLab wikiに情報を集約
- 社内技術セミナーに登壇
- include-what-you-use導入
- GItLab+mattermost+jenkins+redmine連携
- 新人教育にペアプロ導入
これから
3月からweb会社で働くことになりました。がんばります。
社内技術セミナーでチームビルドっぽい話をしたのでまとめ
先日、社内の技術セミナーに登壇してきました。セミナーの内容は「自社のソフトウェア開発の現状を知り、未来に向けて何をすればよいのか考える」と言う意識高めなもので、パネリストには最近行ったソフトウェア開発改善の取り組みを紹介せよとのお題が与えられました。技術レイヤーの話は他のパネリストがしてくれそうだったので、僕はチームビルドみたいな人とかチームに向けた取り組みの話をしてきました。当日話した内容と感想をざっくりとこのエントリにまとめておきます。
コンプライアンス的にアレなスライド・画像を除いた発表資料はこちら。
話したこと
話したことは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