Pull Requestから社内全チームの開発パフォーマンス指標を可視化し、開発チーム改善に活かそう

こんにちは。id:shiba_yu36です。MackerelチームでWebアプリケーションエンジニアをしています。最近の開発合宿で、id:syou6162id:polamjagと一緒に、社内の全チームの開発パフォーマンスを表す指標をGitHubのPull Requestから可視化し、開発チームの改善に活かせるようにしました。今回はその紹介をします。

説明するサンプルコードは、次のレポジトリで公開しているので参考にしてください。ここではGitHubのhatenaオーガニゼーションで集計していますが、forkして少し手直しすれば、別のオーガニゼーションの集計も可能になっています。

hatena/pull-request-analysis-sample

開発チームの改善におけるいくつかの課題感

僕は昔から開発チームの改善に興味があり、これまでさまざまなチームに所属するたびに、チームの改善を提案して実施するという活動を続けてきました。例えば、はてなブログチームでGitHubを使った開発フロー改善新機能開発時に細かく開発ブランチにマージしていこう活動レビューがスムーズにいく通知グッズ作りなどです。

しかし、このような改善を実施するとき、次のような課題を感じていました。

  • 問題の改善が、実際に中長期でパフォーマンスに貢献しているか分からない
  • 改善にあたって、個々人がそれぞれ考える「やりやすさ」を言い合うだけになり、水掛け論になることもある
  • 改善したい課題がたくさんあるときに、その優先度の決め方が分からない

そこで、開発チームのパフォーマンスをトラッキングできる定量的な指標を決め、その指標を元にデータドリブンで開発チームの改善を進めていくことで、これらの課題を解決できるのではないかと考えました。

開発チームのパフォーマンス指標に何を使うか

開発チームのパフォーマンスを測る指標はさまざま議論されていますが、今回僕は書籍『LeanとDevOpsの科学』で言及されている指標を利用することに決めました。これによると開発チームのパフォーマンスを測るには、次の4指標をトラッキングすべきとされています。

  • 変更のリードタイム: first commit〜そのcommitが本番にリリースされるまでの時間
  • デプロイの頻度: 本番環境へのデプロイの回数
  • MTTR(平均修復時間): サービスダウン〜復旧までの時間
  • 変更失敗率: 本番デプロイ時のサービスダウン発生率

詳細については当該書籍や、Google Cloud blogの記事「エリート DevOps チームであることを Four Keys プロジェクトで確認する」を参考にしてください。

4つの指標のうち何からまず集計するか

これで開発チームのパフォーマンスを測る4つの指標は決まりました。しかし、始めから全ての指標を定義通り集計できるようにするのは大変です。そこでまず、開発チームのパフォーマンス指標を測る第一歩として、次の2つを集計することにしました。

  • 「変更のリードタイム」の一部
  • 「デプロイ頻度」

この2つの指標は、現在のはてなの開発フローにおいて、GitHubのPull Requestデータから集計しやすいのです。

変更のリードタイムの一部を可視化する

「変更のリードタイム」を集計するには、あるcommitがいつリリースされたかまで追う必要があり、1チームで複数レポジトリ運用をしていたり、レポジトリごとにデプロイ方式が違ったりすると、集計にかなり手間がかかります。

そこで定義通りの集計にとらわれすぎず、次のように「変更のリードタイム」をもう少し集計しやすい形に分解して、その一部を可視化してみようと思います。

変更のリードタイム = first commit〜Pull Requestのマージまでの時間 + Pull Requestのマージ〜デプロイまでの時間

このようにすれば、前者の「first commit〜Pull Requestのマージまでの時間」に関しては、Pull Requestのデータから簡単に集計できそうです。これを「Pull Requestのプロセスタイム」と呼称し、次の手順で可視化してみます。

  1. Pull Requestのデータを定期的にBigQueryにインポートする
  2. 指標に応じたSQLを書き、viewとして保存する
  3. viewをデータポータルで可視化する

データポータルは「Google マーケティング プラットフォーム」に含まれるツールで、以前は「Google Data Studio」とも呼ばれていました。

データを定期的にBigQueryにインポートする

まず、Pull Requestのデータを定期的にBigQueryにインポートします。このとき後からSQLを工夫すればさまざまな集計ができるように、できるだけ生のデータを送ります。定期的に投げ込む手段として、GitHub Actionsを利用しました。

GitHubからデータをインポートするスクリプトは、前述したサンプルレポジトリにある次のファイルを参照してください。

script/import-pull-request.ts

このスクリプトは、上部で定義しているGITHUB_ORG_NAMEに指定したオーガニゼーションの全てのレポジトリのPull Requestを、GCP_PROJECT_IDのBigQueryにインポートします。

RateLimitへの対処やインポート速度の向上のため、多少は見通しが悪くなっていますが、基本的にはPull RequestのデータをGraphQL APIから取ってきて、BigQueryに投げ込むだけです。

実行例は次のようになります。

GITHUB_TOKEN=... GOOGLE_APPLICATION_CREDENTIALS=/path/to/keyfile.json START_DATE=2020-10-05 END_DATE=2020-10-12 yarn --silent ts-node script/import-pull-request.ts

次で説明するように自動実行を想定したスクリプトですが、このようにSTART_DATEEND_DATEを指定して、手動で起動することも可能です。

GitHub Actionsのcronで定期的にインポートする

GitHub Actionsのcronを使った定期的なインポートは、サンプルレポジトリの次のファイルで設定しています。

.github/workflows/import-pull-request.yml

前述のスクリプトが毎日起動され、前日にマージされた分のPull RequestをBigQueryにインポートします。

レポジトリのシークレットで、Google Cloud Platformのサービスアカウントの鍵の設定(GCP_SA_KEY_FOR_GITHUB_IMPORTER)と、Pull Requestのデータを取得するためのGitHubトークンの設定(TOKEN_FOR_GITHUB_IMPORTER)が必要です。

また、GitHub ActionsからBigQueryにインポートするため、Google Cloud Platformのサービスアカウントの発行が必要です。これは、サンプルレポジトリでは次の設定ファイルに従って、Terraformで管理しています。

terraform/main.tf(24行目〜43行目)

以上で、特定のオーガニゼーションにある全てのPull Requestのデータを、BigQueryへ定期的にインポートできるようになりました。BigQuery側のPull Requestデータスキーマは、最終的にこのようになりました。

フィールド名 タイプ モード
labelNames STRING REPEATED
headRefName STRING NULLABLE
baseRefName STRING NULLABLE
deletions INTEGER NULLABLE
author RECORD NULLABLE
author. typename STRING NULLABLE
author. login STRING NULLABLE
firstCommittedAt TIMESTAMP NULLABLE
id STRING NULLABLE
additions INTEGER NULLABLE
reviews RECORD NULLABLE
reviews. totalCount INTEGER NULLABLE
mergedAt TIMESTAMP NULLABLE
repository RECORD NULLABLE
repository. nameWithOwner STRING NULLABLE
number INTEGER NULLABLE
title STRING NULLABLE
createdAt TIMESTAMP NULLABLE
url STRING NULLABLE

Pull Requestのプロセスタイムを可視化する

上記を実行して、オーガニゼーションの全てのPull RequestデータがBigQueryに入りました。続いて「Pull Requestのプロセスタイム」を抽出するSQLを書いて、BigQueryにviewとして保存します。

1日ごとに集計すると誤差が大きく分析しづらいため、Pull Requestのプロセスタイムの中央値を、4週間のスライディングウインドウでプロットします*1。そのためSQLはけっこう複雑で、次のようになりました。

bigquery/mart/process_time_history.sql

このSQLでは可視化しやすいように、botのPull Requestを除外して人間が作ったもののみを対象にしたり、単位をhourに変換したりといったことも行なっています。

これをBigQueryのviewとして保存し、データポータルで「Pull Requestのプロセスタイム」の時系列データを可視化します。

オーガニゼーション全体のPull Requestデータなので、これだけで分析するのは難しいですが、次のようなちょっとした仮説や疑問ならこれを見るだけでも立てられそうですね。

  • 新型コロナウイルスにより在宅勤務推奨になった4月くらいから指標がいったん悪化したが、6月後半に戻ってきている。つまり、慣れてくれば在宅でもパフォーマンスが非常に下がるということはないのではないか?
  • 6月末から指標が徐々に悪化しているが、これは何が原因だろうか?

デプロイの頻度を可視化する

続いて、上記と同じ手順で「デプロイの頻度」を可視化してみます。

現状、はてなではgit-pr-releaseを使って、developブランチからmainブランチへPull Requestを作り、マージしたらリリースするというフローになっていることが多いです。このようなPull Requestを数えることで、デプロイ頻度を可視化できそうです。

こちらも1日ごとでの集計だと誤差が大きいため、4週間の移動平均を出してみます。

bigquery/mart/deploy_count.sql

このSQLを書くだけで、全社のデプロイ頻度の時系列推移を次のようにデータポータルで可視化できました。

指標をチームごとに集計する

ここまでPull Requestデータを使って「Pull Requestのプロセスタイム」や「デプロイ頻度」を可視化してきました。しかし、実際にチームの改善に利用するには、これらの指標をチーム単位でトラッキングしたいはずです。そこで、続いてチームごとに可視化していきます。

はてなでは、GitHub Teamsを使ってチームのレポジトリ一覧を管理しているため、この情報を使えばチームごとに集計できます。次の3ステップで行います。

  1. 定期的にGitHub Teamsの情報をBigQueryにインポートする
  2. チーム情報を使いやすいように加工しておく
  3. SQLでチームごとの時系列推移を可視化する

GitHub Teamsの情報を定期的にインポートする

GitHub Teamsの情報も、Pull Requestデータと同様の方法でBigQueryにインポートします。

これでGitHub Teamsの情報が次のスキーマでBigQueryにインポートできました。

フィールド名 タイプ モード
repositories RECORD NULLABLE
repositories. nodes RECORD REPEATED
repositories.nodes. nameWithOwner STRING NULLABLE
name STRING NULLABLE

チーム情報を使いやすいように加工しておく

インポートした生の形式だと集計時に扱いづらいので、もう少し加工しておきます。

チームごとの時系列推移を可視化する

最後に、SQLを工夫して「Pull Requestのプロセスタイム」や「デプロイ頻度」の時系列推移をチームごとに出力します。Pull Requestデータと、使いやすいように加工したチーム情報を結合することで可視化できます。

次のSQLで、チームごとの「Pull Requestのプロセスタイム」の時系列推移が出ます。

bigquery/mart/process_time_history_by_team_name.sql

このSQLではいろいろ可視化できるように、さまざまな指標を出しています。これを使えばチームごとに1本ずつ線ができ、チームごとの「Pull Requestのプロセスタイム」が可視化できます。

チームごとの「デプロイの頻度」の時系列推移を出すのは次のSQLです。

bigquery/mart/deploy_count_by_team_name.sql

こちらもチームごとに1本ずつ線ができます。

これで「Pull Requestのプロセスタイム」と「デプロイ頻度」の時系列推移をチームごとに可視化し、比較できるようになりました。チームごとに集計することで、チーム単位で課題を分析して改善に取り組んだり、上手く改善できてそうなチームを見つけてヒアリングしたりといったことができそうです。

おわりに ── 今後の展望

この記事では、開発チームの改善に活かすためPull Requestデータを使って、開発のパフォーマンス指標から「変更のリードタイム」の一部である「Pull Requestのプロセスタイム」と「デプロイ頻度」を可視化する事例を紹介しました。

前述のようにサンプルコードも公開しましたので、自社の開発のパフォーマンスを可視化する参考にどうぞご利用ください。もし環境にGoogle Cloud Platformを使っているなら、Four Keysのようなツールも使えるかもしれません。

今回は開発パフォーマンス指標のうち一部の可視化にとどまりましたが、今後は以下のようなこともやっていきたいと考えています。

  • MTTRや変更失敗率も集計し、1つのダッシュボードで開発パフォーマンスの指標を可視化し、チーム全体で同じ方向を向いて改善を行えるようにする
  • 他チームと比較することで自分たちのチームの課題を発見し、その課題について一番うまく対応できてそうなチームを指標から見つけ、助言を聞きつつ改善する

参考: 合宿で作ったその他の可視化例

データポータルはかなり柔軟に可視化できるので、合宿では次のような可視化もしてみました。

「Pull Requestのプロセスタイム」の25パーセンタイル、50パーセンタイル、75パーセンタイルと、Pull Requestの数を可視化。

d/d/d(deploys / developers / days)*3の可視化。

ただし、単純にPull RequestのAuthor数で出すと「けっこう厳しく出るね」と会話していて、実際の人数で見るともう少し高くなるかもしれません。

【PR】一緒にデータ駆動でチーム改善しませんか!

はてなでは、データ駆動でのチーム改善に興味のあるエンジニアを募集しています。新卒・中途、東京・京都を問わずぜひご応募ください!

エンジニア採用 - 採用情報 - 株式会社はてな

*1:ある日にプロットされる値は、その日から過去28日以内にマージした「Pull Requestのプロセスタイム」の中央値になっている

*2:レビューのためのGitHub Teamsなど、開発チームよりさらに小さい単位のチームが大量にあるため

*3:1日あたりのデプロイ回数を開発者数で割ったもの。詳細は https://twitter.com/hiroki_daichi/status/1100381137929625600 など

id:shiba_yu36

柴崎優季。チーフエンジニア兼Mackerelアプリケーションエンジニア。アルバイトから2012年に新卒入社し、はてなブログのアプリケーションエンジニアなどを経て、2017年8月より現職。

Twitter: @shiba_yu36
GitHub: shibayu36
blog: $shibayu36->blog;

OSSへの貢献をさらに良い形にしたい | はてなで働く itchyny にアンケート [#13]

はてなで働くエンジニアにアンケートシリーズ第13回は、ブックマークチームのWebアプリケーションエンジニア、id:itchynyに話を聞きました。

はてなidはかぶらないように適当に付けた
Haskellが得意な自分ならScalaも書けるだろうと思って
チーム間で協力しながら新しいAPIの仕様を策定
TLとして、チーム横断での依頼の窓口にも
夕方から深夜にかけて頭が冴える
より戦略的にOSSへ貢献する体制作りをしたい
スプリントごとに常に方…

Google Cloud の IAM で、開発体制や組織の文化に合わせて検討したこと

システムプラットフォーム部で SRE をやっている id:nabeop です。システムプラットフォーム部を一言で表すと、基盤を横断的に見る部署という感じです。

過去の発表などでもたびたび言及していますが、はてなのいくつかのサービスは AWS 上で構築されており、これまで「クラウドに構築する」は「AWS で構築する」とほぼ同義な世界でした。

ただし、AWS 以外も全く使っていなかったわけではなく、小さなプロジェクトや個人では Google Cloud の利用もありました。また最近は、各サービスで技術選択の多様化が進み「Google Cloud 上でサービスを構築する」という選択肢も十分ありえる状態になってきました。

このため、各サービスで Google Cloud の利用が本格化する前に、安心して使えるように IAM (Identity and Access Management) など環境を整備する必要が出てきました。

今回は、複数の開発チームが性質の異なる複数のサービスを Google Cloud で展開するにあたり、開発速度を落とさずに安心して利用できるような枠組みを考える過程で得られた知見をまとめてみようと思います。

はてなにおける開発体制と文化からの要件

はてなでは、toB 向け、toC 向け、受託開発など性質の異なる複数のサービスを、複数のチームが開発・運用しています。ここで注意することは、例えば A というチームでは X と Y というサービスを開発するなど、必ずしも開発チームとサービスが1対1で対応するわけではありません。

また、はてなで働くエンジニアにアンケートシリーズの僕のエントリにもあるように、オープンネスな文化も大事な要素です。

例えば、あるサービスで使われている技術は、実際に動いている様子も含めて、誰でも参照可能な状態になっています。そこから異なるサービスに技術が輸出され、さらに洗練されていくことは、よく目にする光景です。

さらに、はてなでは各チームに技術選択の裁量と責任が任されており、自身のサービスで最適と思われるサービスや技術スタックを選択できるようになっています。

こういったことを考えると、Google Cloud の環境を整備するにあたっては、以下の3点を実現できることが重要になります。

  • 各開発チームの技術選択を妨げず、自主的に運用できる状態にする
  • 他の開発チームのリソースについて、変更はできないものの、様子を観察できる
  • 案件の性質によっては、限られたメンバーのみがアクセスできるリソースが存在することを考慮する必要がある

Google Cloud における権限の考え方

Google Cloud では、リソースなどのアクセス制御は Cloud IAM で実現されています。こういったリソースへのアクセス権限などについて、企業におけるベストプラクティスが以下のドキュメントで公開されています。

エンタープライズ企業のベスト プラクティス | ドキュメント | Google Cloud

ここで紹介されているように、基本的に Google Cloud では組織を頂点とした以下のツリー構造で、リソースが配置されます。

組織 -> フォルダ -> プロジェクト -> GCE などのリソース

このとき各種権限では、基本的に上位のリソースで設定されているロールを引き継ぎます。例えば下記のようなツリー構造になっている場合、example.com 組織で設定されているロールは、Project X にあるリソースにも適用されます。一方で、Folder B に設定されているロールは Project X には適用されません。

リソースツリーの例
リソースツリーの例

Google Cloud では、このロールの継承関係を利用することで、各リソースの権限分離を実現できます。

ただし権限によっては、設定できるリソースレベルが限られていることに注意が必要です。例えば「組織のロール管理者 (roles/iam.organizationRoleAdmin)」は組織のレベルでしか設定できませんが、「ロール管理者 (roles/iam.roleAdmin)」はプロジェクトレベルまで設定できます。

要件を満たすリソースツリーと権限分離

Google Cloud には「ロールの継承」という概念があり、そのロールはフォルダ単位で付与できることがわかりました。この性質を利用することで、次のようなツリー構造を作成できます。

  • あるフォルダに設定した権限は、そのフォルダ以下のプロジェクトやフォルダに同じロールが適用される
  • 下位のフォルダでさらに強い権限を設定することで、特定の階層から上は参照のみなどの弱い権限でアクセスができる

リソースツリーの中で適切なフォルダに適切な権限を設定することで、「はてなにおける開発体制と文化」の最後に述べた3つの要件は満たせそうです。

ここで問題になってくるのは、Google Cloud におけるリソースのツリー構造の中で、「開発チームと管理者の責任境界をどのように置くか」という点でした。

リソースツリーに責任境界を置く

最終的には下記のようなツリー構造にすることで、前述した3つの要件を満たせると考えました。

リソースツリーの様子
リソースツリーの様子

このツリーでは、ロールを以下のように設定することが想定されています。

  • 組織のレベルでは、組織を管理するロールのみを設定する
  • 公開可能フォルダでは、基本ロールの「閲覧者 (roles/viwer)」をプロジェクトに対して設定する
  • 秘匿性の高いプロジェクトは、組織の直下に配置する (図の「秘密の案件 A」)
  • 各開発チームに強いロールを設定して、責任境界とする (図のオレンジ色の部分)

オレンジ色の階層に作成するフォルダを「チームフォルダ」と名付け、各開発チーム向けに払い出します。

開発チームは「チームフォルダ」以下のオーナーに

上記のロールを設定することで、責任境界となる「チームフォルダ」より下位のリソースは開発チームがオーナーシップを持ちつつ、先に挙げた3つの要件も満たせます。

開発チームがリソースのオーナーシップを持つということは、具体的には以下を実行できると想定しています。

  • リソースに対して必要なロールが設定できる
  • 必要に応じてフォルダやプロジェクトを含むリソースを作成できる
  • サービスアカウントを管理できる

責任境界になるチームフォルダに付与したロール

チームフォルダには、具体的に下記のロールを付与しています。

  • 事前定義ロール
    • サービスアカウント管理者 (roles/iam.serviceAccountAdmin)
      • フォルダ管理者 (roles/resourcemanager.folderAdmin)
      • プロジェクト IAM 管理者 (roles/resourcemanager.projectIamAdmin)
    • プロジェクト作成者 (roles/resourcemanager.projectCreator)
    • プロジェクト削除 (roles/resourcemanager.projectDeleter)
      • プロジェクト移動 (roles/resourcemanager.projectMover)
  • 基本ロール
    • オーナー (roles/owner)

Google Cloud のドキュメントでは、基本ロールを極力使わないで、事前定義ロールもしくはカスタムロールを使うことが推奨されています。

しかし、それで開発チームが十分なオーナーシップを持てるのか、いまひとつ自信がなかったため、あえて基本ロールのオーナーを付与しています。これはある程度の運用知見がたまり、本当に必要とされるロールの組み合わせが分かってきたら置き換えることを想定しています。

ロールは Google グループに付与する

ロールを設定する対象は、主に以下の5つから選択することになります。

  • Google アカウント
  • サービスアカウント
  • Google グループ
  • Google Workspace ドメイン
  • Cloud Identity ドメイン

はてなでは、全社員に Google アカウントが付与されているため、上記のうち Google アカウント、サービスアカウント、Google グループから選択することになります。

とくにチームフォルダでは、各ロールを付与する対象は個人に紐付いている Google アカウントではなく、開発チームが管理している Google グループを使います。チーム移動などで構成メンバーに変更があった場合に、開発チーム側で Google グループの構成メンバーを変更することで、双方の管理の手間を減らす目的があります。

最後に

今回は、複数のチームによる複数のサービス構築を見据えて、Google Cloud で権限分離を検討したときに考えたことを紹介しました。Google Cloud の運用知見がない状態で検討したので、この内容が正解かどうかに確かな自信はないのが正直なところです。実際に運用することで問題点を洗い出し、より適切な形にしていきたいと思います。

Google Cloud の環境整備では、今回の権限分離のほかに次のような話題もあります。

  • 他の内部ネットワークとの繋ぎ込み
  • ネットワーク資源の管理
  • 費用管理

このあたりも機会があればエントリにしたいと思っています。

一緒に基盤整備してくれる仲間を募集中!

はてなの SRE では、

  • 複数の異なる性質を持つサービスが使っている全社的な基盤を、よい感じに改善して、各サービスの開発速度を最速にしたい!!
  • 1つのサービスに集中して基盤や運用形態をよい感じに改善して、開発速度を最速にしたい!!

ということを考えて、よりよい基盤構成の検証などをやってます。

我こそは!! という人の応募を待っています。

はてなでは、サービス開発の道標となるSREの仲間を募集しています

SRE(Site Reliability Engineer)職 転職・中途 – 採用情報
SRE(Site Reliability Engineer)職の新卒採用 – 採用情報

id:nabeop

渡辺道和。インターネットサービスプロバイダにおける大規模コンテンツ配信サービスなどを経て、2018年3月にシステムプラットフォーム部のWebオペレーションエンジニアとして入社。現在は同部SRE。AWS Summit Online 2020では「はてなにおける AWS Transit Gateway の導入と活用」で登壇。

Twitter: @nabeo
GitHub: nabeo
blog: nabeo がピーしているブログ (仮)

開発合宿でのレコメンドシステム開発をうまく本番導入へ | はてなで働く kouki_dan にアンケート [#12]

はてなで働くエンジニアにアンケートシリーズ第12回は、マンガサービスのiOS/Androidアプリエンジニア、id:kouki_danに話を聞きました。

本名とハンドルネームの組み合わせでユニークなIDに

── Q1. はてなidとその由来を教えてください

id:kouki_dan です。
本名のkoukiとゲームなどで使っていたハンドルネームのdanを組み合わせて付けました。どちらも片方だけではユニークさが足りなかったので、合わせることでどこでもユニークなIDを取得できるようにしました。


2019年7月撮影。京都オフィスでの様子

アンダースコアでつないでしまったため、IDが取得できないサービスがあったり、ドメインが取れなかったりするのが悩みです。_が使えないGitHubではkouki-dan_-も使えないDocker Hubではkoukidanになっています。

入社を決めたのは面接が圧倒的に楽しかったから

── Q2. いつどんなきっかけで入社されましたか?

新卒で入社した会社で4年ほど働いた後、「そろそろ転職をして他の会社を見てみるのもいいかもしれないな」と思って、転職活動を始めました。あまりない機会なので、大手転職サイトから、エンジニアに特化したエージェントまでさまざまな方法を使ってみました。はてなは、エンジニア特化のエージェントの方にご紹介いただきました。

はてなに入社を決めた理由は、面接が圧倒的に楽しかったからです。はてなに限らず、エンジニアの面接は社員の方と技術的な話をできて楽しいことが多いと思うのですが、その中でもはてなの面接は技術的に深く話すことが多く、ディスカッションも楽しくできました。この感じで仕事を進められるなら普段の仕事も楽しく行えると思い、入社を決めました。

iOSアプリのみ→Androidアプリの開発にも携わる

── Q3. 現在の仕事を教えてください

受託開発を担当するグループで主にマンガサービスのスマートフォンアプリを作っています。入社時点ではiOSアプリしか書いたことがありませんでしたが、現在はAndroidアプリの開発にも携わっています。社内では技術の幅を広げていくことが推奨されており、チームのAndroidエンジニアの協力もあって、勉強を始めるところから一人でPRを出せるところまでスムーズに実践できました。

エンジニアと他の職種との橋渡し役

── Q. チーム内の立ち位置を教えてください

マンガアプリチームのテックリードとして働いています。はてなのテックリードの役割は以下の記事でも説明されています。

developer.hatenastaff.com

僕はエンジニアとそれ以外の職種の橋渡し役となり、エンジニアもエンジニア以外の人も快適に働けることを目指しています。チームメンバーとの1on1を通してチームの様子を把握したり、後述するGraphQLなどの新しい技術を試す機会を増やしたりしています。もちろんエンジニアとしてコードを書く時間もあります。

チームでお茶会を開いた時の様子
チームでお茶会を開いた時の様子

デザイナーと共にデザインを学ぶ時間をとる

── Q. 1日の仕事の流れを教えてください

たいてい毎朝10時に仕事を開始します。まずはてなブックマークのテクノロジーカテゴリーの人気エントリーを見て、最近話題になった技術をチェックしています。

午前中は主にコードレビューや実装、ドキュメント整備など一人で行うタスクを進めることが多いです。

お昼ご飯を食べて、昼過ぎにはチームの昼会があります。昼会では30分ほど毎日集まり、コミュニケーションと情報共有を行っています。午後は午前中の続きや、ペアプロ(ペアプログラミング)をすることもよくあります。

定例のミーティングはほぼありませんが、週に1回30分チームのデザイナーとエンジニアで、デザインについて勉強する時間をとっています。Human Interface GuidelinesMaterial Designについて学んだり、最近はOOUIの本『オブジェクト指向UIデザイン』の輪読会をしています。

この先のリモートワークとチームの規模拡大

── Q. 最近うまくいっていないと感じることは何ですか?

最近よく考えていることは、リモートワークでコミュニケーションをどのように取るべきかということです。

現状ではチームメンバーが少人数で、そのメンバーともリモートワーク前から一緒に働いていたので、喫緊の課題というわけではなく、うまくいっていないということもありません。

はてなでは2022年10月まではフレキシブルワークスタイル制度を導入し、その間はリモートワークが行われることになっています。その中でこの先新しいメンバーが増えたり、チームの規模が大きくなっていったりした時に今の状態そのままでうまくワークするかについては自信がなく、考えて準備しておかなければと感じています。

開発合宿でレコメンドシステム開発、検証期間を設けてのGraphQL導入

── Q. 最近うまくいったことは何ですか?

3日間業務を離れてあるテーマに沿った開発を行う開発合宿で、BigQuery MLを用いたレコメンドシステムの開発を行いました。夏頃の合宿で小さく検証を行い、先日のサービスリリースまで、うまく実現することができました。

「機械学習の民主化検証チーム」として機械学習をこれまでやったことのないエンジニアがチームを組み、 id:syou6162 さんの助けも借りながら、Firebase Analyticsにあるデータを使って、BigQuery MLを使ったレコメンドシステムの実装と検証をしました。その後、合宿で作ったシステムを本番に導入することになり、本番向けのレコメンドシステムを開発して先日リリースしました。

また、最近うまくいったことはアプリへのGraphQL導入です。ネイティブアプリとサーバー間の通信は、これまでRESTで行われてきました。RESTでは表示したい要素が変更された時に毎回APIスキーマの変更とサーバーサイドの実装が必要になる、複雑な画面を構築するために複数のエンドポイントの結果をまとめる必要があるなど、複雑になりがちでした。これを解決するために社内ではWeb方面でよく使われているGraphQLを使えるかもしれないと思っていたのですが、なかなか導入に踏み切れずにいました。

GraphQLで実際にこれらの課題を解決できるのか、また、ネイティブアプリに導入する上で障壁になるものはないかを確かめるために、2週間の検証の時間をもらい、サーバーサイドのメンバーと一緒にGraphQLに取り組みました。その期間でサーバーサイド、ネイティブアプリ共に検証を行え、その後導入が決定し、今はGraphQLを使って快適にアプリの開発ができています。

その時の様子は、id:hitode909 さんがブログにも残してくれています。

blog.sushi.money

f:id:hatenatech:20210121162956j:plain
id:hitode909 と。2019年12月撮影

仕事だけでなく勉強、生活でも「長期的な目線で」

── Q. 普段大切にしていることは何ですか?

「チームで成果を最大化していくこと」と「長期的な目線で考えること」です。

もともとチームで仕事をするのが好きだったのですが、テックリードになってより意識をする機会が増えました。チームメンバーそれぞれで得意不得意があるので、互いに補って業務を進められるように心がけています。

長期的な目線で考えることは仕事だけではなく、勉強や生活などさまざまなところで昔から大切にしたいと思っていることです。たいていの場合、今わかっていることや、わからないことでも表面的な部分だけを組み合わせて実現していくことが短期的には早く成果を出すことにつながりますが、全く新しい概念を学んだり、表面的ではなく深く学ぶことで、長期的にメリットを最大限享受できると考えていて、実践しています。

より良い方向へ変化していく会社

── Q. はてなはどんな会社ですか?

入社してまず思ったのは「情報が広く共有されているな」ということでした。チーム内に閉じている情報はほぼなく、誰でもアクセスすることができますし、売上に関する共有会も毎月行われています。

それ以外では、はてなが好きな人が集まっていると感じます。「はてなが好き」ははてなバリューズの一つです。はてなが好きな人たちが集まって、はてなを一緒に良くしていきたいとみんなが思っています。はてなスタッフそれぞれの行動もそれに基づいており、より良い会社へと変化していく会社だと思います。


はてなのスマートフォンアプリ開発は挑戦の連続です。誰にとっても身近なスマートフォンですが、開発環境も利用者にとっての位置付けも日々変容しています。より良いアプリの提供を目指し、今ある技術だけでなく、これから先の技術に積極的な仲間を募集しています。ご連絡をお待ちしております!

iOS、Androidアプリエンジニア職 転職・中途採用 – 採用情報
iOS、Androidアプリエンジニア職の新卒採用 – 採用情報

はてなでは、今の技術・この先の技術に積極的な仲間を募集しています

はてなで働くエンジニアにアンケート カテゴリーの記事一覧 – Hatena Developer Blog

【追記あり】 2月〜3月に、はてな2022年新卒エンジニア向け オンライン会社説明会 を実施します!

株式会社はてなでは、昨月から2022年入社の方向けの新卒採用募集を開始しております。

developer.hatenastaff.com

引き続き絶賛募集中ですが、より多くの方にはてなについて知ってもらうため、今年はオンラインでの会社説明会を実施します!

開催日

2月〜3月に複数回開催予定です。現在決まっている日程は以下の通りです。

2021年2月5日(金)12:00〜13:00 → https://hatena.connpass.com/event/202598/
2021年2月10…

データ活用の知見や困り事を共有する「突撃! 隣のダッシュボード」会をやっている話

こんにちは。MackerelチームにおいてCRE(Customer Reliability Engineer)をしているid:syou6162です。主にカスタマーサクセスを支えるデータ基盤の構築や、データ分析を担当しています。

最近、はてな社内のさまざまなチームでデータ活用が進んでいます。しかし、そういったデータ活用の知見は、それぞれのチーム内でとどまってしまいがちです。この記事では、チームを横断したデータ活用を推進するため、昨年の秋から開催している「突撃! 隣のダッシュボード」という会の企画を紹…

Hatena Engineer Seminar #15 をオンラインで開催しました #hatenatech

こんにちは! Web アプリケーションエンジニアの id:KGA です。

2020年12月23日(水)に Hatena Engineer Seminar #15 を開催しました。今回も前回に引き続きオンライン配信による開催になりました。参加してくださったみなさま、ありがとうございます!

このエントリーでは当日配信された動画のアーカイブとともに、それぞれの発表の概要や公開資料をお届けします。

#15は2020年新卒入社メンバーによるトーク

Hatena Engineer Seminar は、はてなのサービスを開発する上で、エンジニアがどのようなことを考えているのか、どのような働き方をしているのかを語るイベントです。

今回は2020年に新卒入社した3名のメンバーによってトークを行いました。それぞれ、チーム開発における体制づくりやフロントエンドのツールチェーンにフォーカスした話、タスクの計画とその実施内容など、はてなのエンジニアの業務内容について幅広く知っていただける内容となっています(告知記事)。

この記事で全3プログラムの概要や資料を紹介していきますが、配信のアーカイブ動画もYouTubeでご覧いただけます。動画の概要や以下の説明で、各トークの開始時間にもリンクしていますのでご利用ください。

Webフロントエンドの秩序を維持する体制を作る

id:mizdra による発表です。

はてなでは「少年ジャンプ+(集英社様)」など、計11のWEBマンガサイトに導入されているWebマンガビューワ「GigaViewer」を開発しています。しかしながらGigaViewerのWebフロントエンドでは属人化が進んでしまい、フロントエンドの面倒を見れるメンバーが限定されてしまう、といった問題がありました。本発表ではその問題に対処するべく行ったフロントエンドの秩序を維持する体制作りについて紹介します。

発表資料を以下で公開しています。

配信アーカイブの該当部分は、6分16秒からです。

はてなブログのフロントエンドに秩序はもたらされたのか

id:nanimono_demonai による発表です。

はてなブログに新機能の実装をしやすくするために、フロントエンドで使われるツールチェーンのアップデートを実施しました。まずは、2種類もあったAltJS(Flow, TypeScript)をTypeScriptに統一することでBabelをシンプルにし、BroweserifyからWebpackに移行させることに成功しました。また、テストのフレームワークもKarma+PhantomJSからJestに移行し、新機能の開発をモダンなやり方で実施するようになりました。フロントエンドの秩序に対して新しい風を吹かせた話をします。

配信アーカイブの該当部分は、31分4秒からです。

はてなブログチームでの働き方

id:YaaMaa による発表です。

はてなブログチームで画像の移行タスクを担当することになり、全体計画、データベースのテーブル設計、データ移行処理の実行などを行ってきました。これらの流れやその中での失敗談などを、はてなブログチームでのエンジニアの働き方がイメージできるようお話しします。

配信アーカイブの該当部分は、50分27秒からです。

さいごに

平日の夜にも関わらずご参加いただき、誠にありがとうございました。はてな技術グループではこのようなセミナーをほぼ年に2回のペースで開催しています。

Hatena Engineer Seminar #14 〜魔法のiらんど編〜 をオンラインで開催しました #hatenatech
Hatena Engineer Seminar #13 を開催しました #hatenatech
それ以前を含む過去の Hatena Engineer Seminar の様子

次回の Hatena Engineer Seminar にもご期待ください。

はてなでは新卒・中途、東京・京都を問わずエンジニアを募集しています。今回のセミナー内容に少しでも興味をお持ちなら、ぜひともご応募ください!

エンジニア採用 - 採用情報 - 株式会社はてな

はてなエンジニア Advent Calendar 2020完走しました!

こんにちは!
id:yutailang0119 です。
今年も無事 はてなエンジニアAdvent Calendar 2020 を完走することができました!

これまでのまとめ

表彰

最多ブックマーク賞

今年の最多ブックマークエントリは、12/06担当 id:stefafafan
stefafafan.hatenablog.com

でした! (2020/12/29現在)

🎊おめでとうございます🎊

感想戦

今回は id:KGA id:nabeop id:onk id:shallow1729 id:yutailang0119 の5人で、感想戦をしていきます!!!

まだ見ていないエントリがある方は、ぜひ年末年始にご覧ください!
それでは良いお年を🐄

id:yutailang0119

アプリケーションエンジニア。2018年中途入社。自社スマートフォンアプリのテックリード。

Twitter: @yutailang0119
GitHub: yutailang0119
blog: がんばってなんか書く

異常なオープンネス文化が特徴的 | はてなで働く nabeop にアンケート [#11]

はてなで働くエンジニアにアンケートシリーズ第11回は、システムプラットフォーム部のSRE、id:nabeopに話を聞きました。

なんとなくpをつけてみました
求人があると聞いて飛びついた
サービス横断でスムーズな開発運用を
新しい技術を取り込む「斬り込み隊長」
バディ単位で困りごとを共有
リモートでの知見共有に課題意識
知見共有の時間を設けて議論の場へ
技術の裏にある考え方を知る
オープンネス文化はミッションに通じる

な…