(翻訳)フィーチャーファクトリー(機能を作る工場)になってる兆候リストをまとめてみる

概要

フィーチャーファクトリー(機能を作る工場)という記事で、機能を作る工場となってしまっている兆候が記載されていました。 こちらをチェックリストに起こしてみます。

どれくらいチェックがついてしまうかで、自分たちの健康状態が測れそうですね。

チェックリスト

基本的には記事の翻訳です。6, 7あたりは自信ないです…。

元タイトル タイトル訳 概要(意訳)
Sprint Reviews are just demos. スプリントレビューは単なるデモ リリースした機能によるビジネス影響をディスカッションせず、デモをして終わっている
Velocity worship. ベロシティ史上主義 速度が最重要とされ、デリバリーしたものの価値が議論されていない
Teams work without Sprint Goals. スプリントゴールが存在しない スプリントで計画されたものが全て提供対象となっている
Scrum Teams are inflexible towards each other. スクラムチーム同士で柔軟に行動できない 全てのチームがスプリントの全ての機能の完成を優先しており、他チームを助けた方がビジネスメリットがあっても考慮されない
During retrospectives nobody ever talks about the customer or value delivered to the business. ビジネス的価値について振り返りできていない 機能のデリバリーにフォーカスがあたっていて、顧客にどんな価値があったかは議論されていない
Refinement is focused on building the thing right. バックログが明確であることを求める 正確な見積もりができるように、バックログが明確であることを求める
Eternal time spent in Sprint Planning. スプリントイベントの時間が長い スプリントイベントに長い時間を費やし、スプリント内で提供できる自信が増すようにしている
Development Teams do not understand what value they are contributing to the customer or the business. 開発チームは顧客へもたらす価値を理解していない 機能のデリバリーのために存在し、顧客に価値をもたらすことはチーム外の人が考える
Product Backlog is refined and estimated many months ahead of time. 何ヶ月も前にバックログが見積もられている 何ヶ月も前に見積もりがされており、目がくらむレベルになっている
Feature-based roadmap with specific timelines and a horizon greater than 6 months. 半年を超えるロードマップがある 顧客に提供する価値について考えず、機能を作成することを重要視しているため、半年先の提供機能も決まっている
Development Teams are excluded from Discovery work. 開発者は顧客理解の時間を取れない コーディングを優先し、顧客やビジネス理解の時間を取れない
Technical debt gets swept under the rug. 技術負債に目を向けない ステークホルダーは技術負債について認識しない。チームは期限通りに機能実装をするために必死になり、リファクタリング等の負債返却の余裕がない
No room for learning. 学ぶ余裕がない 事前に全てが計画されており、スプリント内で学ぶ余裕がない
Features never get removed and polish rarely gets added afterwards. 機能の削除が検討されない 機能追加後は新しい機能追加を行い、提供した機能の改善をしない

まとめてみて感想

チェックリストをまとめることで、スクラムがどんな価値を重視しているかわかった気がします。 特にビジネス的な価値をチームで検討することを重要視しており、度々出ているなという印象です。

ここでNGとして出た項目は、新しいスクラムガイドでも変更として取り込まれているので、そちらも確認してみてください。

参考資料

Packerハンズオンをやってみた感想

概要

自分の携わっている開発でPackerを使っているので、共有も兼ねてハンズオンをやってみました。

作成した資料はGitHubに置いてあります。

感想

勉強会を開催してみると、色々と自分の勉強になり良い体験でした。

チームで使ってはいますが、自分で構築したわけではなかったので、改めて1からPackerについて調べ、資料とサンプルを作りました。

この時点でも十分に勉強になる上に、知らない人に向けて話すことを意識するため、自分の理解度を推し量ることもできました。

また参加者からのフィードバックから、刺激を得ることもできました。 「Packerを使ってデプロイフローを組むならどうする?」 「EC2 Image Builderで連携しやすいなら置き換えありじゃない?」 といったディスカッションができ、かつ次の学習ネタをもらえた気分でした。

まとめ

自身の知識を人に還元でき、還元した人からフィードバックを得ることで、自身にも返ってくる。

「情けは人の為ならず、自分のためである」ですね。

#マンガでわかるサーバー監視入門 の感想

目的

監視について、ベストエフォートで学習してきた。 ちゃんと入門したことがなかったので、技術書展を機会に読んで見る。

ピックアップ

1章 そもそも監視って何?なぜ必要なの?

監視が必要な理由について解説されている。

基本的な内容かもしれないが、監視をする目的はちゃんと理解しておくと良いと思った

ユーザに価値を提供するため

また vmstat の項目の見方やロードアベレージとはなにかが記載されており、詳しくなかったので勉強になった。

2章 進化する監視 - クラウド時代の監視とは

この章は監視というよりは、クラウドネイティブについての解説が主。 良く聞く「家畜かペットか?」という話。

自分たちのサーバをペットにするには、クラウドサービスを使うだけでは不十分だと理解する。

4章 統計の基本を学ぼう

ここは一番参考になった。 中央値やパーセンタイルの話。

普段監視ツールをみたときに、p90やp100の違いが理解できていなかったが、この章を読んで理解できた。

これがわかると、監視ツールの表示を見る目も変わる。

総評

マンガになっているので読みやすい。 それでいて、内容はしっかりしている。(はてなの人が監修に入っている)

監視に詳しくないサーバサイドエンジニアは元より、他の職種の人も読める内容なので、みんな一度読んでみると良いと思った。

技術書展9の終了後はBOOTHで売っているらしい。

booth.pm

AWS Copilotを触ってIAMで躓いた話

概要

先日、ECSの環境構築を簡略化できる AWS Copilot というCLIツールが発表されました。 使用感の確認がてらチュートリアルを行おうとし、躓いた箇所を記載します。

手順と躓き

事前に今件で使うIAMユーザを作成しました。 Classmethodさんの記事を参考に、ポリシーを割り当てていきました。

作成したユーザの情報をクレデンシャルに、セットしチュートリアル通りに、コマンドを実行しました。

copilot init --app demo \
--svc api \
--svc-type 'Load Balanced Web Service' \
--dockerfile './Dockerfile'  \
--deploy

すると下記エラーが発生し、デプロイに失敗しました。

✘ deploy service: describe stack demo-test-api: AccessDenied: User: arn:aws:iam::ユーザ名 is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::hoge:role/demo-test-EnvManagerRole

エラーを見るに利用したユーザが demo-test-EnvManagerRole のロールの切り替えに失敗したようでした。

作成したIAMユーザには、IAMをフルアクセスしているのですが…。

やむなく、 demo-test-EnvManagerRole の信頼関係で、IAMユーザを定義して、エラーを解決させ、無事デプロイに成功しました。

まとめ

IAMの奥深さと、自分の理解の浅さを痛感しました…。 誰か原因がわかったら教えて下さいm( )m

Mackerelプラグインを使ってmemcachedのメトリックを取得する

はじめに

社内wikiに2017/12/12に書いたものを移植したものです。

対応

基本はMackerelの中の人の記事→mackerel-plugin-memcachedを参考に進めていきます。

## memcached 通常通りインストールして、立ち上げておきます。

$ ps aux | grep memca
memcached -d -p 11211 -u memcached -m 64 -c 1024

公式プラグイン集をインストール

個別にプラグインを落として来てビルドすることもできますが、今回は他のプラグインを試すためプラグイン集をまとめて取得します。

yum install -y mackerel-agent-plugins

プラグインの設定

落としてきたプラグインを読み込ませるために、Mackerelの設定ファイル(mackerel-agent.conf)を編集します。 localhostの11211を監視する場合は、[]内のオプションは付与です。

[plugin.metrics.memcached]
command = "mackerel-plugin-memcached [-host=host] [-port=port番号]"

設定が完了しましたら、Mackerelを再起動します。

sudo service mackerel-agent restart

memcachedメトリクス1
memcachedメトリクス1
memcachedメトリクス2
memcachedメトリクス2

参考資料

公式ドキュメント mackerel-plugin-memcached

memcachedの監視 ~ mackerel-plugin-memcachedを読み解く - そーだいなるらくがき帳

Mackerelプラグインを使ってApacheのメトリックを取得する

はじめに

社内wikiに2017/08/19に書いたものを移植したものです。

対応

基本はmackerel-plugin-apache2を参考に進めていきます。

## Apache Apacheは通常通りインストールし、httpd.confに下記の設定を行っていきます。

Listen 1080
ExtendedStatus On
<VirtualHost 127.0.0.1:1080>
    <Location /server-status>
        SetHandler server-status
    </Location>
</VirtualHost>

公式プラグイン集をインストール

個別にプラグインを落として来てビルドすることもできますが、今回は他のプラグインを試すためプラグイン集をまとめて取得します。

yum install -y mackerel-agent-plugins

プラグインの設定

落としてきたプラグインを読み込ませるために、Mackerelの設定ファイル(mackerel-agent.conf)を編集します。

[plugin.metrics.apache2]
command = "/usr/local/bin/mackerel-plugin-apache2 -p 1080"
type = "metric"

設定が完了しましたら、Mackerelを再起動します。

sudo service mackerel-agent restart

apacheのカスタムメトリクス
apacheのカスタムメトリクス

躓いたところ

メモ程度に躓いたところと解決策を記載します。

  • 公式ドキュメントではGo言語でビルドすることを想定しており、Go言語の知識がないため苦戦した
    • yumプラグイン集を一気にインストールできたのでそっちに切り替えた
  • メトリックを設定したが更新されず、ログをみると404となっていた
    • conf で設定する際にポート番号を忘れていた
  • メトリックを設定したが、ApacheのカスタムメトリックがMackerelに一向に出てこなかった
    • Apacheの設定でListenの記載が漏れていた

参考資料

公式ドキュメント
mackerel-plugin-apache2

Mackerelのapache2プラグインを使いカスタムメトリクスを投稿する
http://qiita.com/tyn-iMarket/items/746bcd91242e45a66d36

Laravelのpaginateで0を投げると15になる

概要

LaravelでAPIを作成しており、ページネーションの処理を実装しようとしてました。
DBから取ってくるデータを使うので、Eloquentのpaginateを使いました。

そこで、試しに0のパラメータを渡したところ、15件が返ってきたので、その調査をしました。

TL;DR

  • Modelで perPage を設定していないと、デフォルトの15が適用される

調査

PhpStorm を駆使して、該当のプログラムに辿り着きました。

Illuminate/Database/Eloquent/Builder.php
https://github.com/laravel/framework/blob/a81f23d0ccd2fefa7fa9b79649ab23811631d9bf/src/Illuminate/Database/Eloquent/Builder.php#L708
public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)
{
    $page = $page ?: Paginator::resolveCurrentPage($pageName);

    $perPage = $perPage ?: $this->model->getPerPage();

    $results = ($total = $this->toBase()->getCountForPagination())
                                ? $this->forPage($page, $perPage)->get($columns)
                                : $this->model->newCollection();

    return $this->paginator($results, $total, $perPage, $page, [
        'path' => Paginator::resolveCurrentPath(),
        'pageName' => $pageName,
    ]);
}

perPage が 0の場合は、 $this->model->getPerPage(); が呼ばれます。modelperPage は設定していないと、 $perPage = 15; が適応され、15となっていました。

備考

$perPage を0で定義すると、 Illuminate/Pagination/LengthAwarePaginator.phpErrorException : Division by zero と怒られました。

参考