Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
新規事業におけるWebAPI開発をよしなにリードする方法
Search
shibadog1121
July 30, 2020
Programming
9
3.2k
新規事業におけるWebAPI開発をよしなにリードする方法
新規事業×WebAPI開発に立ち向かう話
よしなに
@shibadog39
shibadog1121
July 30, 2020
Tweet
Share
More Decks by shibadog1121
See All by shibadog1121
新規サービスのWebAPI開発でスキーマ駆動開発を目指してみた話
shibadog1121
3
12k
Other Decks in Programming
See All in Programming
Creating a Free Video Ad Network on the Edge
mizoguchicoji
0
130
subpath importsで始めるモック生活
10tera
0
340
WebAssembly Unleashed: Powering Server-Side Applications
chrisft25
0
360
Figma Dev Modeで変わる!Flutterの開発体験
watanave
0
180
よくできたテンプレート言語として TypeScript + JSX を利用する試み / Using TypeScript + JSX outside of Web Frontend #TSKaigiKansai
izumin5210
7
1.8k
Enabling DevOps and Team Topologies Through Architecture: Architecting for Fast Flow
cer
PRO
0
370
[Do iOS '24] Ship your app on a Friday...and enjoy your weekend!
polpielladev
0
120
最新TCAキャッチアップ
0si43
0
220
TypeScript Graph でコードレビューの心理的障壁を乗り越える
ysk8hori
3
1.2k
watsonx.ai Dojo #4 生成AIを使ったアプリ開発、応用編
oniak3ibm
PRO
1
230
romajip: 日本の住所CSVデータを活用した英語住所変換ライブラリを作った話
sangunkang
0
400
TypeScriptでライブラリとの依存を限定的にする方法
tutinoko
3
740
Featured
See All Featured
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
Designing on Purpose - Digital PM Summit 2013
jponch
115
7k
RailsConf 2023
tenderlove
29
910
Fireside Chat
paigeccino
34
3k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
329
21k
The Art of Programming - Codeland 2020
erikaheidi
52
13k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
What's new in Ruby 2.0
geeforr
343
31k
The Pragmatic Product Professional
lauravandoore
31
6.3k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
10 Git Anti Patterns You Should be Aware of
lemiorhan
655
59k
Transcript
新規事業におけるWebAPI開発を よしなにリードする方法 2020/07/30 リードエンジニアから学ぶ MedPeerのプロダクト開発 Takahisa Sakurai
Rails Engineer • [2019/01~] MedPeer • [2020/05~] kakari for Clinicのリードエンジニア
• ミーハーです。梨泰院クラスにハマっています。 Takahisa Sakurai @shibadog39 shibadog39
オンラインでの医師と患者の繋がりを支援する かかりつけクリニック支援サービス 2020年9月末リリース予定 患者が利用するモバイルアプリとクリニックが 利用するWebアプリ 大手ジェネリック医薬品メーカーの 日医工株式会社との共同事業 kakari for Clinic
kakari for clinicの機能と提供価値 クリニックPR 待ち時間負担 二次感染リスク の削減 診療予約 双方向の繋がり (かかりつけ)の提
供 双方向チャット 集患支援 アプリ・HP双方から時間帯予約 が出来る機能の提供 予約の変更や予約前日通知もア プリ経由で可能に クリニック受付と患者さんを双 方向で繋ぐチャット機能の提供 これまで電話で行っていた各種 問い合わせをチャットで効率化 これまでHPから行っていた情 報発信をより機動的に実施 PUSH通知を伴ったお知らせ配信 等で、確実に患者さんに情報を 届ける
kakari for Clinicの構想 クリニック 薬局向けかかりつけ薬局化支援サービス「kakari」と連携し、 診療から服薬フォローまで一気通貫で支援する kakariを通じて医療体験を変える! • 診療予約 •
双方向チャット • クリニックPR • オンライン診療 • 処方せん送信 • 双方向チャット • 服薬フォロー • オンライン服薬指導 薬局
利用技術とチーム構成 クリニック用Webフロント 患者用モバイルアプリ Android/iOS 2人ずつ 計4名 2名 3名 APIサーバー
(様式美) We’re hiring!!
新規事業におけるWebAPI開発を よしなにリードする方法 ここから本編
新規事業におけるWebAPI開発を 「よしな」にリードする方法
よしな = 「いい感じ」
リードエンジニアとして何がいい感じになると嬉しいか • 開発スピード • 開発品質 • 開発継続性
新規事業 • 不確定事項が多く仕様の流動性が高い • 開発スケジュールがタイトになりがち • 自分にとっては初のリードエンジニアポジション • はじめましてのメンバーもいる WebAPI開発
• 協働が前提 • 開発スピードが上がりにくい • 仕様変更コストが大きい フルリモート • コミュニケーションコスト増 • 心理的安全性の醸成難易度高 「よしな」の実現がハードモードな状況 この状況にいかに立ち向かったかの話
発表のターゲット • これからAPI開発に携わることになりそうな人 • 現状のAPI開発フローを改善したいと思っている人 • スキーマ駆動開発興味あるけどどうデビューしたらいいかわからない人
個人的に設定している裏Goal この発表を聞いてスキーマ駆動開発はじめてみたというtweetを1ヶ月以内に観測すること @shibadog39
01 02 03 いい感じのAPI設計 いい感じの開発フロー いい感じのRails実装 -スタンダードを知る -巨人の肩に乗る 新規事業における WebAPI開発を
よしなにリードする方法 -スキーマ駆動開発とは -明日からはじめるスキーマ駆動開発 -実践編:具体的な開発フロー -json serializer 選定 -言語の命名規則の壁を乗り越える
01 02 03 いい感じのAPI設計 いい感じのAPI開発フロー いい感じのRails実装 -スタンダードを知る -巨人の肩に乗る 新規事業における WebAPI開発を
よしなにリードする方法 -スキーマ駆動開発とは -明日からはじめるスキーマ駆動開発 -実践編:具体的な開発フロー -json serializer 選定 -言語の命名規則の壁を乗り越える
01 いい感じのAPI設計 • これまでの自分:先輩エンジニアの見よう見まねのAPI設計 • 「かくあるべき」というAPI設計の基礎知識が粗いと設計意図の言語化がうま くできず、リードとしてイケていない • 「戦略の失敗は戦術で補うことはできない」よろしく、設計の失敗を実装で 補うことは難しいのでまずは設計をいい感じにする
01 いい感じのAPI設計 1. スタンダードを知る 2. 巨人の肩に乗る
スタンダードを知る 01 いい感じのAPI設計 スタンダードを知る レスポンス設計 変更への柔軟性 エンドポイント 設計 RESTful リソースの命名
リクエスト設計 API設計 XSRF JSONハイジャック セキュリティ関係のHTTPヘッダ セキュリティ 検索とクエリパラメータ ページングとクエリパラメータ クエリ/パスパラメータの違い フラットにするべきか 配列の返し方 日付のフォーマット エラーの表現 モバイル/SPAでの考え方の違い APIのバージョン管理
スタンダードを知る 01 いい感じのAPI設計 スタンダードを知る これを読むのがよい エッセンスをサクッと読める Web API: The Good
Parts: https://www.oreilly.co.jp/books/9784873116860/
巨人の肩に乗る 01 いい感じのAPI設計 巨人の肩に乗る • 困ったら偉大な先人の設計をパクるのがよい • 広く認められているサービスなら、大きくハズレた設計はしていない
巨人の肩に乗る 01 いい感じのAPI設計 巨人の肩に乗る github twitter slack trello gmail https://docs.github
.com/en/rest https://github.com /github/rest-api-de scription https://developer.t witter.com/en/docs https://api.slack.co m/methods https://github.com /slackapi/slack-api- specs https://developer.a tlassian.com/cloud/ trello/rest/api-grou p-actions/ https://developers. google.com/gmail/a pi/v1/reference 身近な巨人たちのAPI定義
巨人の肩に乗った例 01 いい感じのAPI設計 巨人の肩に乗る 仕様:リストの並び替えをドラッグアンドドロップで行うことができる 1: item_a 2: item_b 3:
item_c 4: item_d 1: item_b 2: item_c 3: item_a 4: item_d e.g. item_aを移動 【まっさきに思いついた案】 item_aのidと並び替え後の番号(例の場合:3)をリクエストに送る その上で順番がずれ込むitemすべての順番を更新する
1: item_b (position: 131070.0) 2: item_c (position: 196605.0) 3: item_a
(position: 229372.5) 4: item_d (position: 262140.0) 巨人の肩に乗った例 01 いい感じのAPI設計 巨人の肩に乗る 仕様:リストの並び替えをドラッグアンドドロップで行うことができる 1: item_a (position: 65535.0) 2: item_b (position: 131070.0) 3: item_c (position: 196605.0) 4: item_d (position: 262140.0) e.g. item_aを移動 item_aの新しいposition = (c_pos + d_pos)/2 【trelloはどうやっているか】 要素の位置を浮動小数点で表現することで解決 https://developer.atlassian.com/cloud/trello/rest/api-group-cards/#api-cards-id-put Ref: https://qiita.com/gypsy/items/7bd2a4aeb1b419ce8914
01 02 03 いい感じのAPI設計 いい感じの開発フロー いい感じのRails実装 -スタンダードを知る -巨人の肩に乗る 新規事業における WebAPI開発を
よしなにリードする方法 -スキーマ駆動開発とは -明日からはじめるスキーマ駆動開発 -実践編:具体的な開発フロー -json serializer 選定 -言語の命名規則の壁を乗り越える
02 いい感じの開発フロー • API開発=協働が前提 • スムーズに協働できるフローを目指すと良い ◦ 認識の齟齬が少ない ◦ 並行して稼働できる
1. スキーマ駆動開発とは 2. 明日からはじめるスキーマ駆動開発 3. 実践編:具体的な開発フロー 02 いい感じの開発フロー
スキーマ駆動開発とは 02 いい感じの開発フロー スキーマ駆動開発とは • API開発手法のひとつ • API記述言語※を用いてスキーマ(=API定義)を表現 ◦ ※OpenAPI
/ API Blue Print / RAML 等が有名どころ • スキーマを開発の中心に据えて進める
02 いい感じの開発フロー スキーマ駆動開発とは スキーマを中心に据えて。。?
02 いい感じの開発フロー スキーマ駆動開発とは WebAPI開発なんだから API定義が中心なのは当たり前では?
思い当たることありませんか 02 いい感じの開発フロー スキーマ駆動開発とは • API定義のドキュメント準備していたがメンテナンスがいつからかストップ • 仕様変更が一部の人にしか伝達されておらず、定義にも反映されず 結合テストでバグとなり発見される •
? 「実装見ればわかるっしょ」
02 いい感じの開発フロー スキーマ駆動開発とは API定義は置いてけぼりにされがち
スキーマを書くこと=開発行為の一環 いつだってスキーマを書くことから開発がはじまる 一環というよりは要となる 02 いい感じの開発フロー スキーマ駆動開発とは スキーマを中心に据えた開発
02 いい感じの開発フロー スキーマ駆動開発とは スキーマを中心に据えた開発 スキーマから • ドキュメントの自動生成 • コードを自動生成する •
モックサーバーを立ち上げる • 単体テストのバリデーションを行う
スキーマ駆動のAPI開発 02 いい感じの開発フロー スキーマ駆動開発とは クライアントサイド サーバーサイド API定義を 一緒に決める リリース エンジニアによる
結合テスト QAテスト 実装 実装 モックの提供 コードの自動生成 スキーマによる 単体テスト補強
これを読むのがよい エッセンスをサクッと読める WEB+DB PRESS Vol.108 https://gihyo.jp/magazine/wdpress/archive/2019/vol108 スキーマ駆動のAPI開発 02 いい感じの開発フロー スキーマ駆動開発とは
明日から始めるスキーマ駆動開発 02 いい感じの開発フロー 明日から始めるスキーマ駆動開発 OpenAPIを知る みんながスキーマに アクセスできる状態 にする スキーマを頑張って書く 01
02 03 まずはこれだけやれば大丈夫 簡単3ステップ
明日から始めるスキーマ駆動開発 01 OpenAPIを知る • 何なのか:スキーマを記述するフォーマット ◦ 公式 ◦ ぐぐると出てくる各社のテックブログ ◦
(再掲) WEB+DB PRESS Vol.108 • 周辺ツール ◦ ドキュメント生成、コード生成、モックサーバー等 ◦ ここにまとまっている 02 いい感じの開発フロー 明日から始めるスキーマ駆動開発
明日から始めるスキーマ駆動開発 スキーマを頑張って書く • エンドポイント/リクエスト/レスポンスの定義をひたす ら書く • OpenAPI Specification ここを見ながらひたすらに •
json/yamlが辛ければ周辺ツールを利用するのもあり ◦ e.g. Stoplight 02 02 いい感じの開発フロー 明日から始めるスキーマ駆動開発
明日から始めるスキーマ駆動開発 みんながスキーマにアクセスできるようにする • Chrome拡張の swagger-viewer を入れてもらう • github上でSwaggerUIを開くことができる • e.g.
公式のexample 03 02 いい感じの開発フロー 明日から始めるスキーマ駆動開発
明日から始めるスキーマ駆動開発 OpenAPIを知る みんながスキーマに アクセスできる状態 にする スキーマを頑張って書く 01 02 03 ぜひはじめてみては!
02 いい感じの開発フロー 明日から始めるスキーマ駆動開発
実践編:具体的な開発フロー 02 いい感じの開発フロー 実践編:具体的な開発フロー 実務ではどのようにスキーマ駆動開発を進めているのか 定義設計フェーズ 200 1 実装フェーズ テストフェーズ
クライアントサイド サーバーサイド API定義を 一緒に決める リリース エンジニアによる 結合テスト QAテスト 実装 実装
モックの提供 コードの自動生成 スキーマによる 単体テスト補強 02 いい感じの開発フロー 実践編:具体的な開発フロー 定義設計フェーズ 実装フェーズ テストフェーズ 実践編:具体的な開発フロー
実践編:具体的な開発フロー 02 いい感じの開発フロー 実践編:具体的な開発フロー 定義設計フェーズ 200 1 実装フェーズ テストフェーズ
定義設計フェーズ 02 いい感じの開発フロー 実践編:具体的な開発フロー • 1人がたたき台を作成の上、全関係者を集めその場で修正 • クライアントサイドの事情・サーバーサイドの事情を顧みた設計にできる • もともとはスキーマファイルを書くところから、モブプロ的にやっていたが
yamlを書く作業時間の待ちがもったいないのでこの形に
定義設計フェーズ 誰がたたき台をつくるべきか? • dbのカラム名とAPIのプロパティ名はなるべくあわせたい → サーバーサイド? • 画面表示・制御と密なのだから →フロントサイド? 基本的にサーバーサイドが作成、複雑な画面に関しては相談しながら作っていく
事が多い 02 いい感じの開発フロー 実践編:具体的な開発フロー
実践編:具体的な開発フロー 02 いい感じの開発フロー 実践編:具体的な開発フロー 定義設計フェーズ 200 1 実装フェーズ テストフェーズ
実装フェーズ 02 いい感じの開発フロー 実践編:具体的な開発フロー 1.スキーマへのアクセス容易さ 2.コスパの高い形でモックを提供 重要なことは4つ 3.スキーマ通りの実装になっていることを 技術で担保 4.機能群の優先順位の認識を揃えること
• API定義を簡単に参照できること • リクエスト • レスポンス • 並行して稼働するためにまずはモック を提供 • 機能群ごとに結合テスト実施のマイル ストーンを決める
1.スキーマへのアクセス容易さ 02 いい感じの開発フロー 実践編:具体的な開発フロー • Chrome拡張の swagger-viewer で実現 • なにか確認したいことがあるときにAPI定義をお互いに見ながら議論
2.コスパの高い形でモックを提供 02 いい感じの開発フロー 実践編:具体的な開発フロー • 開発スピードを上げるためにはモックの提供は必須 • とはいえ本実装に置き換わるまでの一時的なものなので少ない労力で実現す ることが重要
2.コスパの高い形でモックを提供 02 いい感じの開発フロー 実践編:具体的な開発フロー mockの実現方法3選 A. mockサーバー立ち上げる B. controllerにjsonべた書き C.
クライアントサイドで準備
2.コスパの高い形でモックを提供 02 いい感じの開発フロー 実践編:具体的な開発フロー A . mockサーバー立ち上げる • Toolがいくつかある ◦
本家 openapi-generator ◦ Sprout ◦ Prism • スキーマ駆動開発ぽくてかっこいい • スキーマファイルに値を書いていくことになるので柔軟なことはそこまでで きない&スキーマファイルが冗長になっていく
2.コスパの高い形でモックを提供 02 いい感じの開発フロー 実践編:具体的な開発フロー B . controllerにjsonべた書き • Swagger UIに表示されるexampleをもとにrailsのcontrollerにベタ書き
• 楽 • やろうとすれば分岐も柔軟に対応できる • スキーマ駆動の自動生成感は薄れる
2.コスパの高い形でモックを提供 02 いい感じの開発フロー 実践編:具体的な開発フロー C . クライアントサイドで準備 • クライアント側がスキーマをもとに勝手に準備する •
欲しいデータをクライアント側が作成するので柔軟性はとても高い • スキーマ駆動の自動生成感はとても薄い • クライアントサイドのsnapshotテスト等でも使い回すとしたらクライアント 側で作成するのがコスパがよくなる
2.コスパの高い形でモックを提供 02 いい感じの開発フロー 実践編:具体的な開発フロー • もともとは「A . mockサーバー立ち上げる」方法をとっていたが、 今は「B .
controllerにjsonべた書き」、「C . クライアントサイドで準備」 をメインで進めている ◦ ちょっとした調整がしたい場合が多いため ◦ クライアントサイドのsnapshotテストを考慮 • どの方法が適しているかは、チームで話し合って決めるのが良い • 個人的なおすすめは「B . controllerにjsonべた書き」
3.スキーマ通りの実装になっていることを 技術で担保 02 いい感じの開発フロー 実践編:具体的な開発フロー • リクエスト: スキーマからクライアントライブラリを自動生成 ◦ Web側の実装ではopenapi-generatorを利用してtypescriptのコードを
自動生成して利用している • レスポンス: スキーマ通りかのバリデーションをrspecで実施 ◦ Committee / committee-rails を利用している • 詳細はぐぐるとたくさん出てくると思うので割愛
4.機能群の優先順位の認識を揃えること 02 いい感じの開発フロー 実践編:具体的な開発フロー • サーバー・クライアントの両者の実装が完了した機能群から順次結合テスト を実施していく • 両者の着手する順番がバラバラだといつまでも結合テストに進めないことが 起きうる
• 機能群ごとに、結合テスト実施日のマイルストーンを決めておいて日々の開 発では次のマイルストーンに向けて実装を進める
実践編:具体的な開発フロー 02 いい感じの開発フロー 実践編:具体的な開発フロー 定義設計フェーズ 200 1 実装フェーズ テストフェーズ
テストフェーズ 02 いい感じの開発フロー 実践編:具体的な開発フロー • 結合テストに先んじてデザイン・UIレビューを実施する ◦ どうしてもサーバー側の実装が遅れてしまう事が多い。 ◦ mockによるクライアントサイドの実装が先に完了した場合は、デザイン・UI
だけのテストと称して画面をディレクターにテストしてもらう ◦ デザイン系の指摘事項を先に上げてもらうことが可能 • 結合テストはサーバー・クライアントで一緒に行う ◦ 考慮もれを防ぐ
01 02 03 いい感じのAPI設計 いい感じの開発フロー いい感じのRails実装 -スタンダードを知る -巨人の肩に乗る 新規事業における WebAPI開発を
よしなにリードする方法 -スキーマ駆動開発とは -明日からはじめるスキーマ駆動開発 -実践編:具体的な開発フロー -json serializer 選定 -言語の命名規則の壁を乗り越える
03 いい感じのRails実装 サーバーサイドの実装にしぼってtipsを紹介
json serializer選定 03 いい感じのRails実装 json serializer選定 • 絶対的正解はない印象 • kakari
for clinicではjsonapi-serializer (fork of fast_jsonapi)を使用 • Kakariという前任のサービスでも利用していたことから ◦ 開発チームとの親和性が高いこと ◦ Serializerごとにテストを書くことができるtestability • 「JSON APIとサービス高速化」という大変興味深いテーマの話が自分の発表 の後すぐに聞けるのでお楽しみに!
サーバーサイド • Ruby: snake_case 言語間の命名規則の壁を乗り越える 03 いい感じのRails実装 言語間の命名規則の壁を 乗り越える 不用意なバグが起こりがち
はしわたしをいい感じにしたい!! • レスポンスのプロパティ名を snake_case→camelCaseに変換 • リクエストのプロパティ名を camelCase→snake_caseに変換 クライアントサイド • JavaScript: camelCase • kotlin: camelCase • swift: camelCase
レスポンスのプロパティ名を snake_case→camelCaseに変換 03 いい感じのRails実装 言語間の命名規則の壁を 乗り越える • Jsonapi-serializerのkey-transforms機能 を使えば一瞬
リクエストのプロパティ名を camelCase→snake_caseに変換 03 いい感じのRails実装 言語間の命名規則の壁を 乗り越える • 変換しないと `params.permit(:someKey)` みたいに書くことになる
• rubyの世界にcamelCaseが混じるのは避けたい • 各controllerで `params.transform_keys(&:underscore)` としてもいいけど冗長
リクエストのプロパティ名を camelCase→snake_caseに変換 03 いい感じのRails実装 言語間の命名規則の壁を 乗り越える 1. ActionController#Parameters にパッチをあててメソッドを追加する 2.
before_actionで`params.deep_snakeize!` を呼ぶようにする
リクエストのプロパティ名を camelCase→snake_caseに変換 03 いい感じのRails実装 言語間の命名規則の壁を 乗り越える • ActionController::Parameters#deep_transform_keys!がRails 6.1でリリース 予定
• 6.1リリース後はパッチを当てずとも params.deep_transform_keys!(&:underscore)のように対応可能になる予定 https://github.com/rails/rails/issues/39081
01 02 03 いい感じのAPI設計 いい感じの開発フロー いい感じのRails実装 -スタンダードを知る -巨人の肩に乗る 新規事業における WebAPI開発を
よしなにリードする方法 -スキーマ駆動開発とは -明日からはじめるスキーマ駆動開発 -実践編:具体的な開発フロー -json serializer 選定 -言語の命名規則の壁を乗り越える
まとめ 「よしな」は1日にしてならず 設計論 便利なツールの導入とチームへの浸透 開発フローの策定と改善 技術選定と実装上の工夫
CREDITS: This presentation template was created by Slidesgo, including icons
by Flaticon, and infographics & images by Freepik. Thanks! Please keep this slide for attribution.