- Hirotaka Miyagi | 宮城 広隆
- Experience
- 株式会社タイミー(2022/4~2022/10)
- 株式会社ビットジャーニー(2021/9〜現在)
- ProseMirrorを利用したリッチテキストエディタの開発
- フルサイクルな機能開発
- リリース7年が経過するRails + Reactアプリケーションのモダン化
- 株式会社リゾートワークス(2020/12〜現在)
- インフラ構築の0→1に伴う技術選定と構築
- チケットベースでのチーム開発
- 企画LPサイトの構築
- 株式会社タイミー(2018/07〜2021/09)
- PjM/PdM/バックエンドエンジニア (2020/08〜2021/04)
- 当時の課題
- メンバー構成
- やったこと
- 新規事業 PjM/バックエンドエンジニア/フロントエンドエンジニア (2021/04〜2021/08)
- メンバー構成
- 役割
- 技術選定・初期設計
- 決済機能の要件定義・技術選定・Stripe APIの実装/運用
- スキーマ駆動開発の導入・運用
- SRE (2021/01〜2021/04)
- 当時の課題
- メンバー構成
- やったこと(公開情報)
- バックエンドエンジニア (2018/07〜2020/01)
- メンバー構成
- 役割
- やったこと
- 業務外活動
- オープンソース貢献
- 登壇
Hirotaka Miyagi | 宮城 広隆
- 開発チームがぶつかる壁に対して自分ごととして捉え、フルサイクルに向き合うことを大事にしています。
- 開発とBizを巻き込んだプロジェクト進行など、不確実性を排除しながら前に進む動きが得意です。
- 開発者体験の向上 / レガシーコードからの脱却 / 4 keys / 変化圧の強いフロントエンドの動向 などに興味があります。
- 「人が本質(価値・幸せ)に向き合う時間を増やすために、それ以外を技術で解決する」を人生で取り組みたいと思っています。
Experience
株式会社タイミー(2022/4~2022/10)
業務委託として開発プラットフォームチームに所属し、Rails/Next.jsでのGraphQLの導入・初期設計・各種オンボーディングを担当しました。
株式会社ビットジャーニー(2021/9〜現在)
業務委託として https://kibe.la/ の開発チームに参画し、フロントエンドをメインにフルサイクルに開発を進行しました。
ProseMirrorを利用したリッチテキストエディタの開発
- ProseMirrorの木構造⇄DOM⇄markdown textの相互変換により、リッチテキストエディタで記入したテキストを即座にmarkdownに変換させる
- ユーザーフレンドリーなテーブル記法の入力UIの実装
- 列・行・セルの選択や追加、削除などを直感的に行えるように
ProseMirrorはユーザーのイベント(keydown, mousemove)ごとにDOMを再構築します。Reactのように差分更新するアルゴリズムはあるものの、テーブル操作中は各種ボタン等含めテーブルの全てのDOMが再構築されることとなり、キーリピート等がチラつくほどにパフォーマンスが劣化する問題がありました。
そのため簡易的なReact.memoのようなアルゴリズムを実装し、特定の条件下のみ特定のDOMを更新することで全体の再構築を防ぐ仕組みを作りました。
フルサイクルな機能開発
- DB設計・RailsのMVC設計・GraphQLインターフェース・Reactコンポーネント・Redash/GA4での分析までを一貫して担当
- GitHub Actionsの導入と開発プロセス中のトイルの自動化
リリース7年が経過するRails + Reactアプリケーションのモダン化
- Sassの@import非推奨によるsassc-railsからcssbundling-railsへの移行
- webpack.config.jsの最適化
- Sass →CSS in JSへの移行のための技術選定
- jQueryからの安全な脱却ロードマップの策定・進行(進行中)、ES5を上げていくためのリスク評価、古いpolyfillの削除等
株式会社リゾートワークス(2020/12〜現在)
ワーケーションを通じて働く人の“創造性“を刺激する福利厚生サブスクリプションサービス ResortWorx で、インフラ/バックエンドエンジニアを担当しました。
インフラ構築の0→1に伴う技術選定と構築
プロダクトローンチ初期に求められる最低限の構成で、ランニングコストの抑制とエンジニアがキャッチアップできるようなドキュメンテーションを心がけました。
- Nuxt.js + Rails API の利用者向け Web アプリケーションと、Rails SSR による管理画面のホスティング
- Route53 → ALB → ECS / RDS の一般的な Rails のホスティング
- GitHub Actions による CD 環境、 SSM を利用した ssh(rails c 等)実行環境
- CloudWatch によるロギングとアラート、AWS Chatbot による Slack 通知
- S3 + CloudFront による SPA のホスティング、GitHub Actions による CD, workflow dispatch を利用したブランチ指定のデプロイ
- のちに Nuxt の SSR も必要になったため Vercel へ移行
- 上記の AWS リソースを terraform で IaC 化、draw.io + VSCodeによるアーキテクチャ図の記載、その他オペレーションをドキュメント化
チケットベースでのチーム開発
- Rails, Nuxtでの機能追加
- CloudWatch Logs Insights で可視化・検索ができるよう Rails のログの JSON 化
企画LPサイトの構築
- Nuxt.js(composition API), Tailwind CSS, Vercelによる0→1を一人で担当
- デザイナーとFigma上で会話しながら背中合わせで進行
- Lighthouseの点数をほぼ100点に
株式会社タイミー(2018/07〜2021/09)
サービスローンチの 1 ヶ月前にジョイン、初期は1人サーバーサイドとして Rails をメインに、プロダクト/会社の成長とともに幅広い業務を担当しました。
PjM/PdM/バックエンドエンジニア (2020/08〜2021/04)
当時の課題
会社の成長に伴いガバナンスを強めていく必要性があり、プロダクト「タイミー」における社内オペレーション改善や、コーポレートエンジニアリングの領域で開発を進行しました。
メンバー構成
プロジェクトの開発メンバーとしては 2 名で、関係部署にヒアリングしながら遊軍のように活動しました。
- 自身: プロジェクトマネジメント/ 要件定義/ Rails や Go での実装
- チームメンバー: 元 iOS エンジニア(Rails はビギナー)/ 要件定義/ Rails や Go での実装
- 関わる部署: 経理財務、 CS
やったこと
ヒアリングや SaaS の選定、スケジューリングや開発着手、リリースまで一気通貫で担当しました。(NDAレベルの業務が多く少しぼかしています)
- CRM ツール HubSpot の API 連携
- 経理・財務業務 SaaS との API 連携
- 内部統制に伴う各種機能開発の進行(職務権限規定に沿った権限管理・与信・反社チェックなど)
- 社内業務のオペレーション改善
- Mac にインストールし deamon で常駐起動するソフトウェアを Go で開発
- 主に非機能要件であるリリースパイプラインの設計を担当 死活監視、バイナリのセルフアップデート機構、リトライ制御など
- チームメンバーに Rails を指導 コードレビューやキャッチアップのための順序立てたタスク振りなど
新規事業 PjM/バックエンドエンジニア/フロントエンドエンジニア (2021/04〜2021/08)
メンバー構成
- 開発チーム: iOS 担当 1 名、 デザイナー1 名、 Web フロントエンド&バックエンド API2 名
- 関わった部署: 経営, Sales, CS, 経理
役割
- プロジェクトマネジメント・技術選定・設計・実装(Rails, Vue.js)を担当
- チームのエンジニアは それぞれ iOS と Rails に強いメンバーとのプロジェクトだったため、それぞれの強みを活かしてもらいつつ取りこぼしがないよう拾う立ち回りに努めた
- Biz サイドとの折衝、サポートや経理とのオペレーション構築など
- エンジニアリングとしてはコアドメインのモデリングや Stripe を利用した決済周りの設計実装を主に担当した
技術選定・初期設計
- Vue.js/vue-router を使った SPA の実装
- 一般的な Rails の環境構築(annotate/rails-erd/bullet/rspec/rubocop)
- 監視/ロギング/CI/CD の導入(Datadog, Sentry, lograge を利用したログの JSON 化、 CircleCI)
- 商品情報登録・在庫管理・注文・決済履歴などのドメインの境界を意識したモデリング
- Rails プロジェクトでの行動指針決め
- 原則テストコードを書く、書けないなら書けるよう責務を分割する
- トランザクションやロックなど SQL を適切に書く
- シンプル・ミニマルに
決済機能の要件定義・技術選定・Stripe APIの実装/運用
スキーマ駆動開発の導入・運用
SRE (2021/01〜2021/04)
当時の課題
プロダクトの成長は進みテレビ CM を打つことになり、現状のスケールしない EC2 によるインフラでは耐えられないだろう、という課題がありました。ただひたすらこなしていた開発業務についてもメンバーが増えスクラムを回せるようになり、組織化が進んで自身の属人性は剥がれてきていました。運よくシニアレベルの SRE の方が採用できたこともあり、その方と主に SRE チームを立ち上げ AWS のアーキテクチャから作り変えるプロジェクトを始め、キャッチアップしつつインフラの移行を進めていきました。
メンバー構成
SRE: 2 人(シニアメンバー, 自身)
やったこと(公開情報)
バックエンドエンジニア (2018/07〜2020/01)
サービスローンチの 1 ヶ月前にジョイン、初期は 1 人サーバーサイドとして保守運用を担当Rails をメインに、プロダクト/会社の成長とともに幅広い業務を担当しました。
メンバー構成
- リリース前: iOS…5 人、 サーバーサイド 4 人
- リリース後〜半年程度: iOS…2 人、 サーバーサイド 1 人、 技術顧問数人
- 徐々にメンバーは増えていきました
役割
スタートアップのシード期なので、通常の機能開発や運用はもちろん、経営・CS・経理・営業チームからの要望対応も全てバックログに載せただひたすらにこなしていました。
やったこと
- 0→1 の開発・0→1 後のサービスの保守運用・負債解消
- RSpec, Rubocop, OpenAPI3 の導入
- Ruby/Rails のバージョンアップ業
- API のバージョニング、Serializer のスキーマ分割
- サービス固有の強いドメインを持つ機能の設計、実装
業務外活動
オープンソース貢献
日常的に行なっています。いくつかリンクを紹介します。
- ProseMirrorコミュニティでの活動
- Pull Requests
- add serializer option to set custom regexp for escaping https://github.com/ProseMirror/prosemirror-markdown/pull/68
- declare Builders type for builders() https://github.com/ProseMirror/prosemirror-test-builder/pull/9
- Fix types for cellSelection https://github.com/ProseMirror/prosemirror-tables/pull/160
- フォーラムでのバグ報告や知見共有
- ガイドを和訳し公開: https://zenn.dev/mh4gf/articles/d25ef1ff30b5a6
- feature(plugin): add alternative implementation for mermaid.js reporter plugin https://github.com/sverweij/dependency-cruiser/pull/599
- dependency-cruiserというJS/TSプロジェクトのディレクトリ構造のビジュアライズツールで、mermaid.js構文での出力を可能にする実装を追加
- feat: add generatorLibrary options and allow faker to select https://github.com/ardeois/graphql-codegen-typescript-mock-data/pull/93
- [ExtractType]: add
has
prefix to default values for config https://github.com/DmitryTsepelev/rubocop-graphql/pull/89
登壇
社内外の勉強会・カンファレンスで発表を行っています。