4/30 LINEヤフー最終出社
↓
5/1 ~ 6/17 有給消化
↓
6/18 ~ 6/30 無職期間
↓
7/1 株式会社ヘンリーへ入社
gigetはまだfile:///をサポートしてないので、作ったテンプレートを試したかったらアップロードするしかない。そこで、ローカルにtarballを返すサーバーを立てるようにした。その紹介の記事。
node server.js {テンプレートディレクトリ}npx giget@latest http://localhost:3000/template.tar.gz my-app --installこれだけ。シンプル。
サーバーは動的に生成するtarballと静的に生成したtarballの2種類を返す。用途に合わせて適切な方を選んで使おう。
マネージャーからおすすめされた本。でも買ったまま2年くらい積んでしまっていた。マネージャー、すみませんでした…
タイトルにある通り、アイデアを組織に広めるための48のパターンについて紹介する本。
構成としては大きく3部に分かれている。
1部は48パターンが網羅されるようにストーリー仕立てで書かれており、2部は実際にあった様々な事例についてのレポートになっている。
忙しい場合、 第1部を読むだけでも十分に価値がある。 「確かにこういうやり方ならうまくいきそうだな〜」とか、「自分がやってたこれってこういうパターン名がつくんだな」という発見がある。パターンの詳細は3部にしか書いていないが、パターンの命名がわかりやすいので雰囲気でだいたいわかる。もしわからなければ、そこだけ先に読むのも良いと思う。
この本はタイトルが示す読者層より、 かなり広い層がターゲットになっている。
布教活動、改善活動などをしている人 にはぜひ読んでほしい。
あと、意外と プログラミングの設計に通ずる箇所も多かった。 「空間を演出する: 思い出すきっかけがなければ、新しいアイデアは忘れ去られてしまう」はドキュメントの管理に通ずるし、194ページの「技術を売るな、仕事上の解決を売りなさい」はプログラマが技術選定でよくやらかすミスだ。
以下は読んでて面白いと思ったところなどの感想。
小さく試して、成功したらそれを祝い、失敗したら反省して次の糧にしていこう、未来は不確実でアンコントローラブルでどこに辿り着くかは誰にもわからないから、まずは小さくトライしていこうというのはその通りだなと思った。タイトルにある「アジャイルに効く」という部分がそれを表しているが、本当に大事。
成功の確率は助けを求める能力に比例しているものだ (128ページ)
この言葉、めっちゃ良い。実際そう。ひとりでタスクを抱え込んでいては進むことはない。
俺がよく唱えてる「仕事の恥はかき捨て」とだいたい同じことも書いてあってびっくりした。
あなたの最高な武器のひとつは、恥をかくのを恐れないところだ (236ページ)
改善活動をしていると、大なり小なりコミュニティを作って活動していくことになると思うが、その時に「メンバーに自分ごとと思ってもらうことが大事」って書いてあって確かにな…ととても思った。あんまりできてなかったと思う。独善的に1人で全部コントロールするんじゃなくて、ちゃんと協力してもらうの大事。
ハマって1時間半くらいかかったのでメモ
source-fileを使ってtmux.confを分割するのはよくあるパターンだと思います。
source-file "$HOME/dotfiles/tmux/plugins.conf"
# ~/dotfiles/tmux/plugins.conf set -g @plugin 'tmux-plugins/tpm' set -g @plugin 'tmux-plugins/tmux-sensible'
しかし、set -g @plugin しているファイルをsource-fileするときに、パスにHOME以外の環境変数があるとtpmが動かなくなります。
# 指してるファイルは同じなのにDOTDIRの方は動作しない source-file "$HOME/dotfiles/tmux/plugins.conf" source-file "$DOTDIR/tmux/plugins.conf"
tpmはインストール対象のプラグインを、以下のようにして集めます
set -g @plugin をtmux.confから探して列挙する
(コード)このように、tpmはプラグイン一覧を取得するために、 tmuxを介さずに手動で静的にtmux.confを解析するという荒業 をしています。 (昔のtpm_pluginsでの指定がdeprecatedになってるのを見るに、こうしないといけない事情があったのでしょうが…)
というわけでまとめると以下になります。
set -g @plugin はtmux.conf側で行うtpmのコードを読まないと読み解けない仕様でそこそこ手こずりました…
本ガイドラインの目的外のこと: リファクタしやすくなるようにテストファイルを整備する。QAの代替を目指す。 (level2として書くかも)
テストは以下の流れに沿って書く。
特に テスト分析を実施すること。 いきなりテストの実装から始めない。
テストの確認事項は 「手動でQAするとしたら何を調べるか?」を基準にまず考える。 そして、それを自動化できるようなソフトウェアテストを作る。
確認事項の悪い例:
確認事項の良い例:
悪い例は手動QAするのが難しい。 例えば「返り値が正しいか?」は、具体的にどうなれば正しいのか分からず、手動QAできない。
また、 悪い例のほうはテストがパスしても得られる情報が少ない。 たとえば「青森県の場合」というテストケースがパスしたという情報にどういう意味があるかは、テスト実装を確認しなければ分からない。
良い例のように、テストが何を確認しているのか、テストがどういう挙動を保証するのかを明確にして、情報量を増やすべき。
参考: テストコードにはテストの意図を込めよう #vstat
1つのテストケースで確認する項目は、原則として1つとする。確認項目を絞ると様々なメリットがある(テスト実装が短くなって読みやすくなる、テストを修正しやすくなる、テストを追加するのが容易となるなど)。
例として、ひらがなをローマ字に変換する関数(transformToRoman)のテスト項目を考える。
悪いテスト項目:
良いテスト項目:
悪い例は観点の粒度が大きく、複数の仕様が包含されている。 良い例では、これを細かい仕様に分割している。
良い例は粒度が細かく、 ローマ字変換の仕様についても明確に読み取ることができる。
(参考: リーダブルコード p.190)
期待値は「正しいか」や「問題ないか」ではなく、具体的に書く。 「正しいか」「問題ないか」は期待結果が曖昧である。
期待結果があいまいだと、異なる解釈をされる可能性があり、テストコード修正時やテスト失敗時に困る。
transformToRoman は正しい返り値を返しているか? → 関数に期待している挙動がわからないtransformToRoman はアルファベットが続く場合に"っ"をxtuに変換するか? → 関数に期待する挙動が明確。またそもそも、テストがpassする条件が揃ったときに結果として「正しい」のである。そのため、 「正しいか」という確認事項は何も言ってないのと同じである。
基本的にメソッド名は、テスト項目を英訳した文章をつける。たとえば「東北地方の場合送料が1000円か?」をメソッド名にすると「calcPostage returns 1000yen for Tohoku region」となる。
describe('calcPostage()', () => { // 東北地方の場合送料が1000円か? it('returns 1000yen for Tohoku region', () => { }); });
このようにすることで、 メソッド名を読むだけで、コードがどういう仕様を満たせているかすぐに分かる。
テスト実装は、テスト分析の際に決めた確認したい事項を確認できるように書く。
気をつけるポイント:
たとえば以下のテストはカバレッジ100%だが重要なアルゴリズムのミスを見落としている。
// スターリンソート(前から見ていってソートされてない要素を粛清する) const sort = arr => { const acc = []; for (const x of arr[i]) { if (acc.length === 0 || acc[acc.length - 1] <= x) { acc.push(x); } } return acc; }; // 小さい順に並んでいるか? test('sort() orders elements from smallest to highest', () => { const result = sort([0, 1, 3, 2, 4]); expect( result.every((val, idx) => idx === 0 || result[idx-1] < val ) ).toBe(true); }); // ほんとは「ソート前後で要素数が変化してないか?」も必要 // test('sort() preserves number of given array', () => {
このように、カバレッジが100%でも満たしてほしい仕様を網羅できてないことがある。 そのため、カバレッジを上げる際には気をつける (カバレッジはテストされてない領域を探すためにしか使えない!)
参考: ソフトウェアテストの7原則とは? (テストでは欠陥があることしか示せない)
実際にテストをするのも大事だ。
たとえば、ソフトウェアが壊れているときにテストが成功しないようになっているか(false negativeになっていないか)を確認してみる。コードを壊してもテストが通ったら確認事項が漏れている。参考: Make Your Test Fail
また、テストケースの順序を入れ替えたときに破綻しないかも確認する。もしテストケースを入れ替えたときにテストがパスしなくなった場合、テスト後のクリーンアップができていない可能性が高い。テスト後に環境が元通りになるようにしておくこと。