Upgrade to Pro — share decks privately, control downloads, hide ads and more …

カオスに立ち向かう小規模チームの装備の選択〜フルスタックTSという装備の強み _ 弱み〜/Ch...

カオスに立ち向かう小規模チームの装備の選択〜フルスタックTSという装備の強み _ 弱み〜/Choosing equipment for a small team facing chaos ~ Strengths and weaknesses of full-stack TS~

登壇者名:佐藤 拓人
登壇したイベントタイトル:カオスに立ち向かう小規模チームの装備の選択〜フルスタックTSという装備の強み / 弱み〜
登壇したイベントのURL:https://toggle.connpass.com/event/349725/

More Decks by 株式会社ビットキー / Bitkey Inc.

Other Decks in Programming

Transcript

  1. 2 Copyright © 2025 Bitkey Inc. All right reserved. 目次

    1. TypeScriptの利用状況 2. 事業特性の説明 3. 強み (メリット) 4. 弱み (困っていること / 改善したいこと) 5. おまけ
  2. 3 Copyright © 2025 Bitkey Inc. All right reserved. 自己紹介

    佐藤 拓人 Sato Takuto 2015.04 2019.05 2020.01 大学(建築学専攻)卒業後、 株式会社ワークスアプリケーションズに入社 会計システムのソフトウェア開発を担当 特に財務会計の仕訳関連 ビットキーへ参画 ECサイトの開発 / 保守、社内システムの開発 TaKuTyの開発 今のHome事業の前身となるResidenceチームに配属 スマートロックを扱う管理画面やバックエンド、スマ ホアプリの開発に従事 Now Home事業のプロダクト責任者 複雑な事象を読み解いて構造化し、抽象化 / 汎用化で きるように設計し、低コストで多くの価値をだせる開 発をすることを好む
  3. 4 Copyright © 2025 Bitkey Inc. All right reserved. 自己紹介

    佐藤 拓人 Sato Takuto はまっていること:健康 ・運動 毎日出勤前に会社近くのジムで筋トレ (もちろん今日も筋トレしました! ) ・食事 毎日栄養素を考慮して食事をほぼ固定 ・睡眠 1日平均で +2時間睡眠取るように → 9ヶ月で約25kg減量!
  4. 7 Copyright © 2025 Bitkey Inc. All right reserved. 1.

    TypeScriptの利用状況 創業当初
  5. 8 Copyright © 2025 Bitkey Inc. All right reserved. 1.

    TypeScriptの利用状況 創業当初
  6. 9 Copyright © 2025 Bitkey Inc. All right reserved. 1.

    TypeScriptの利用状況 創業当初 4人
  7. 12 Copyright © 2025 Bitkey Inc. All right reserved. 1.

    TypeScriptの利用状況 現在 4人 5人
  8. 14 Copyright © 2025 Bitkey Inc. All right reserved. 2.

    なぜTypeScript? Why? 少人数で一連のプロダクトを迅速に実現をする 責務を機能で提供価値にフォーカスしたい
  9. 15 Copyright © 2025 Bitkey Inc. All right reserved. 1.

    TypeScriptの利用状況 創業当初 4人
  10. 16 Copyright © 2025 Bitkey Inc. All right reserved. 2.

    なぜTypeScript? 創業当初 4人で Web / Mobile / サーバーを実装してリリース ※ スマートロック設置、解施錠、友達追加、チケット配布、管理会社向け管理機能...など
  11. 17 Copyright © 2025 Bitkey Inc. All right reserved. 1.

    TypeScriptの利用状況 現在 4人 5人
  12. 18 Copyright © 2025 Bitkey Inc. All right reserved. 2.

    なぜTypeScript? 現在 (homehub) 広範囲の Web / サーバーを保守しながら新規開発も...! ※Mobileは別チーム  
  13. 19 Copyright © 2025 Bitkey Inc. All right reserved. 2.

    なぜTypeScript? 現在 (homehub) 広範囲の Web / サーバーを保守しながら新規開発も...! ※Mobileは別チーム   昔も今の限られたリソースで 事業を拡大させてきた!!
  14. 21 Copyright © 2025 Bitkey Inc. All right reserved. 3.

    強み (メリット) 最初のねらい 少人数で一連のプロダクトを迅速に実現をするため 責務を機能で分割せずに提供価値にフォーカス
  15. 22 Copyright © 2025 Bitkey Inc. All right reserved. 3.

    強み (メリット) 最初のねらい 少人数で一連のプロダクトを迅速に実現をするため 責務を機能で提供価値にフォーカスしたかったから 達成できた??
  16. 23 Copyright © 2025 Bitkey Inc. All right reserved. 3.

    強み (メリット) 少人数で一連のプロダクトを迅速に実現をする → 達成できた! ・特に創業当初はガンガン機能リリースをゴリゴリに実施していた ・1人で全て賄えるため、かなり早いスピード感を持ってプロダクトの実現をやりき てれたと思う。 ・一方で属人化が進む要因でもあった ・サーバーサイド側の不都合を、フロント側でいい感じで吸収することでなんとか 首が繋がっている状況... 最初のねらい
  17. 24 Copyright © 2025 Bitkey Inc. All right reserved. 3.

    強み (メリット) 責務を機能で分断せずに提供価値にフォーカス → 達成できた!& TypeScriptが一定寄与できた...はず! ・元々何をやるか...ではなくてなぜやるか...を重視する組織文化ではあった ・創業当初は、個人の裁量に委ねられるシチュエーションが多く個人で価値提供ま で一貫して実現できる下地は意味があった ・プロセスが型化されていく過程で、ここのメリットは薄れていった ・リファインメントなどの場で事前に議論をする場が用意されるなど、提供価値に フォーカスした場が適宜組まれる仕組みとすることができたため ※ =フルサイクル開発者 最初のねらい
  18. 25 Copyright © 2025 Bitkey Inc. All right reserved. 3.

    強み (メリット) 責務を機能で分断せずに提供価値にフォーカス → 達成できた!& TypeScriptが一定寄与できた...はず! ・元々何をやるか...ではなくてなぜやるか...を重視する組織文化ではあった ・創業当初は、個人の裁量に委ねられるシチュエーションが多く個人で価値提供ま で一貫して実現できる下地は意味があった ・プロセスが型化されていく過程で、ここのメリットは薄れていった ・リファインメントなどの場で事前に議論をする場が用意されるなど、提供価値に フォーカスした場が適宜組まれる仕組みとすることができたため 最初のねらい 他の観点ではどう?
  19. 26 Copyright © 2025 Bitkey Inc. All right reserved. 3.

    強み (メリット) その他 プロダクト全体の理解が深まりやすい 高いアジリティを維持しやすい 問い合わせ / 調査を迅速に完結させやすい モブやペアでタスクを組みやすい / 進めやすい
  20. 27 Copyright © 2025 Bitkey Inc. All right reserved. 3.

    強み (メリット) プロダクト全体の理解が深まりやすい → じわじわとボディーブローのように効いてくるヤツ ・Webアプリ / サーバーサイドの両方を触るためアーキテクチャの構成や動作する 仕組みなど理解しやすい ・サーバーサイド側に重要なロジック (ドメイン知識) が集約されがちだが、全員が 同程度の理解でプロダクトの実装ができる点で特に良い その他
  21. 28 Copyright © 2025 Bitkey Inc. All right reserved. 3.

    強み (メリット) 高いアジリティを維持しやすい → 運用やタスクに対する意識において良い影響があるはず ・チーム全員の技術スタックがTypeScriptで得手不得手はあるものの、基本的には Webアプリ / サーバーサイドの両方が対応可能であるため、アサインなどで技術ス タックを考慮する必要がない ・そのため何ができるか?...ではなく何を実現するべきかで優先度を判断しやすい その他
  22. 29 Copyright © 2025 Bitkey Inc. All right reserved. 3.

    強み (メリット) 問い合わせ / 調査を迅速に完結させやすい → これは普通に嬉しいやつ! ・Webアプリ / サーバーサイド の両方を常に開発しているのでほとんどの問い合わ せを単独で解決できる ・実際にはデバイス (Firmware) の観点や、Mobileアプリ / 認証認可のプラット フォーム...なども絡んでくることもあるので単独で解決できないことも稀にある その他
  23. 30 Copyright © 2025 Bitkey Inc. All right reserved. 3.

    強み (メリット) モブやペアでタスクを組みやすい / 進めやすい → これが一番おいしかったかも!! ・チームでタスクを進める際に、モブやペアでの進め方を積極的に採用しているが チーム全員の技術スタックがTypeScriptであるため、内容や理解度に応じて組み合 わせを変えて実施しやすい ・モブ / ペアでのタスクを進めやすいために比較的負荷を低く属人性の排除を実現 できたように感じる その他
  24. 31 Copyright © 2025 Bitkey Inc. All right reserved. 4.

    弱み (問題となったこと / 困っていること)
  25. 32 Copyright © 2025 Bitkey Inc. All right reserved. 4.

    弱み (困っていること / 改善したいこと) 創業当初の代償
  26. 33 Copyright © 2025 Bitkey Inc. All right reserved. 4.

    弱み (困っていること / 改善したいこと) Any大量発生 → リリースを最優先させていたため、よくわからずとりあえずAnyを使用していた ・リリース最優先であり、当時は開発全メンバーが初めてTypeScriptを使用したこ ともあり、型の仕組みの理解が甘くうまく型解決できずにAnyを使っていたケース が多かった ・当時はそこまで問題なかったものの、新しいメンバーが入ってきて既存機能の改 修をする際などに多大な代償を払うこととなった 創業当初の代償
  27. 34 Copyright © 2025 Bitkey Inc. All right reserved. 4.

    弱み (困っていること / 改善したいこと) 属人化推進 → 全部自分がわかっていれば対応できるからドキュメントなどはない ・フロント / サーバーの両方を1人で賄って実装を進め他ため、仕様が個人の頭の 中に閉ざされていてもなんとかなっていた ・自身でフロントも実装するためAPI仕様書がなくても困らなかった  (頻繁に機能追加 / 仕様変更があり変更コストが高かった背景もある) ・スケールした際に問題が露見...多大な代償を払うこととなった 創業当初の代償
  28. 35 Copyright © 2025 Bitkey Inc. All right reserved. 4.

    弱み (困っていること / 改善したいこと) 属人化推進 → 全部自分がわかっていれば対応できるからドキュメントなどはない ・フロント / サーバーの両方を1人で賄って実装を進め他ため、仕様が個人の頭の 中に閉ざされていてもなんとかなっていた ・自身でフロントも実装するためAPI仕様書がなくても困らなかった  (頻繁に機能追加 / 仕様変更があり変更コストが高かった背景もある) ・スケールした際に問題が露見...多大な代償を払うこととなった 創業当初の代償 今でも困っていること
  29. 36 Copyright © 2025 Bitkey Inc. All right reserved. 4.

    弱み (困っていること) 困っていること ランタイムでの型チェックがない サーバーサイドのデファクトスタンダードがない… 様々な実装の仕方ができてしまう
  30. 37 Copyright © 2025 Bitkey Inc. All right reserved. 3.

    強み (メリット) ランタイムでの型チェックがない → 型があるのに型を信じきれない... ・TypeScriptは静的型付け言語であり、コンパイル時に型チェックする。しかし、 コンパイル後はJavaScriptに変換されるため、実行時に型チェックが行われない。 ・実行時に型チェックがなく、定義した型とは異なる型を持つ値が紛れ込むリスク がある。これにより、予期しない動作やバグが発生する可能性がある。 ・「any型」を使用すると、型チェックを回避することができ、どんな型の値でも 受け入れる...。これにより、型安全性が失われ、コードがカオスな状態になるリス クがある その他
  31. 38 Copyright © 2025 Bitkey Inc. All right reserved. 3.

    強み (メリット) サーバーサイドのデファクトスタンダードがない… → これに倣っていればとりあえずOK!...ってのがない ・TypeScriptをサーバーサイドで使用する際、ExpressやNestJS、Honoなどのフ レームワークが存在しますが、特定のフレームワークがデファクトスタンダードと して広く認識されているわけではない...と感じている(個人的にはEffectが好き) ・多くの選択肢があるため、プロジェクトに最適なフレームワークやライブラリを 選ぶのが難しく、開発者間での意見の相違が生じることがある。 ・サーバーサイドでのTypeScriptの使用に関するベストプラクティスが明確でない ため、プロジェクトごとに異なるアプローチが取られることが多く、コードの一貫 性が失われる可能性があります。 その他
  32. 39 Copyright © 2025 Bitkey Inc. All right reserved. 3.

    強み (メリット) 様々な実装の仕方ができてしまう → 気を抜くと無法地帯になるリスク ・TypeScriptは、関数型やオブジェクト指向など様々なスタイルで実装が可能で す。他言語と比較して制約が少なく開発者は自由に設計できてしまいます。 ・この柔軟性により、実装者の個人的な好みがコードに反映されやすく、結果とし て一貫性のないコードスタイルが混在することがあり、視認性や保守性に影響を与 える可能性があります。 ・統一されたコーディング規約がない場合、異なる実装スタイルが混在し、コード の一貫性が失われるリスクがあります。これにより、コードレビューやメンテナン スが困難になることがあります。 ・既存のオブジェクトを破壊することなどもできてしまいます... その他
  33. 40 Copyright © 2025 Bitkey Inc. All right reserved. 4.

    弱み (困っていること) 困っていること ランタイムでの型チェックがない サーバーサイドのデファクトスタンダードがない… 様々な実装の仕方ができてしまう
  34. 41 Copyright © 2025 Bitkey Inc. All right reserved. 4.

    弱み (困っていること) 困っていること ランタイムでの型チェックがない サーバーサイドのデファクトスタンダードがない… 様々な実装の仕方ができてしまう 良い方法あれば ぜひ教えて欲しい ...!!! (切実)
  35. 42 Copyright © 2025 Bitkey Inc. All right reserved. 良かったこと

    ・プロダクト全体の理解が深まりやすい ・高いアジリティを維持しやすい ・問い合わせ / 調査を迅速に完結させやすい ・モブやペアでタスクを組みやすい / 進めやすい 特に初期フェーズにおいて迅速にリリースするための選択して してはよく機能した! 3. 強み (メリット) まとめ
  36. 43 Copyright © 2025 Bitkey Inc. All right reserved. 辛かったこと

    ・Any大量発生 ・属人化推進 ・ランタイムでの型チェックがない ・サーバーサイドのデファクトスタンダードがない… ・様々な実装の仕方ができてしまう 特に初期フェーズでは全部個人でできてしまうためにスケール 時のプロセスの軌道修正は大切と感じる 3. 強み (メリット) まとめ
  37. 45 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 TSKaigi 2024 こんなTypeScriptは嫌だ!...みんなの声
  38. 46 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜
  39. 47 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 1. 世界が ”any” で溢れている
  40. 48 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜
  41. 49 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜
  42. 50 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜
  43. 51 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 「なにか」ってなに?
  44. 52 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 ・コードが説明責任を放棄している ・チーム開発する気なし...と思われうる ・AIのサポートも受けづらくなる
  45. 53 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 ・noImplicitAny:true (tsconfig.json) ・コードが説明責任を果たすか気か掛ける (1年後の自分が理解/保守可能か) ・モブプロ / ペアプロ を積極実施
  46. 54 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 TypeScriptを使って 「わかる」状態にしよう!
  47. 55 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 2. 外界からくる「値」が「型」と乖離している
  48. 56 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 ・APIの呼び出す処理、APIの定義、DBの参照など...
  49. 57 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 型を信じられなければ なにを信じれば良い!?
  50. 58 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 ・普通に実装していたらバグる ・疑心暗鬼になる ・いろいろ気にしだして変更できなくなる
  51. 59 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 ・外界との境界でチェックする ・定義から自動生成するツールを利用する (Prismaなど)
  52. 60 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 型を信頼できる状態にしよう!
  53. 61 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 3. 配列の要素のundefined考慮
  54. 62 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜
  55. 63 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 undefinedが考慮され ない
  56. 64 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 これって本当に大丈夫?
  57. 65 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 ・TypeScriptに身を任せることができない ・常にケアし続けなければならない
  58. 66 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 ・noUncheckedIndexedAccess:true (tsconfig.json)
  59. 67 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 意図せぬミスを事前に潰そう!
  60. 68 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 4. 列挙型の追加に追従できない
  61. 69 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 ・before ・after どこが修正必要か考えなきゃ...
  62. 70 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 ・修正が必要な箇所を機械的に洗い出すことが できない
  63. 71 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 ・switch文でneverを利用する ・switch-exhaustiveness-checkを利用
  64. 72 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 TypeScriptとうまく付き合って 保守しやすくしよう!
  65. 73 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 5. 型のパターンと具体的な値との狭間
  66. 74 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 みんな大好き Prisma
  67. 75 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 みんな大好き Prisma include区の指定に基づいて 取得される値にも 動的に型が付与される
  68. 76 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 みんな大好き Prisma include区の指定に基づいて 取得される値にも 動的に型が付与される 型としても実態としても 値が取得される 型としても実態としても 値が取得されない
  69. 77 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 Include句を切り出し
  70. 78 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 Include句を切り出し trueではなくboolean扱いとなる
  71. 79 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 Include句を切り出し trueではなくboolean扱いとなる include句がboolean扱いのため 取得されるか未確定の扱いとなる
  72. 80 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 as const を利用
  73. 81 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 as const を利用 as const のみだと trueは維持されるが 中身に誤りがあってもここでは気付けない ...
  74. 82 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 利用する箇所で 取得できていないことに気づく as const を利用 as const のみだと trueは維持されるが 中身に誤りがあってもここでは気付けない ...
  75. 83 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 ・実装ミス時に、ミス周辺で気付けない ・問題の検知が遅れ、問題の解消が煩雑に
  76. 84 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 ・satisfiesを用いる
  77. 85 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 ・satisfiesを用いる true扱いで型が渡されるので 型としても取得される前提となる
  78. 86 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 ・satisfiesを用いる 指定の仕方に誤りがあれば即時に気づけて 補完のサポートを受けながら修正できる true扱いで型が渡されるので 型としても取得される前提となる
  79. 87 Copyright © 2025 Bitkey Inc. All right reserved. 5.

    おまけ TSKaigi 〜こんなTypeScriptは嫌だ〜 型の仕組みを上手く使って より簡単に実装できる工夫を!