トレタ開発者ブログ

飲食店向け予約/顧客台帳サービス「トレタ」、モバイルオーダー「トレタO/X」などを運営するトレタの開発メンバーによるブログです。

シリコンMacへの開発環境移行体験談

はじめに

こんにちは、サーバーサイドエンジニアの@shiroemonsです。

こちらはトレタAdventCalendar2023 19日目の記事です。

この記事では、開発用PCをインテルMacからシリコンMacに移行した際の経験を共有します。

背景

私の開発PCは、頻繁ではないですがフリーズやパフォーマンスの低下を経験していました。

特に、Google Meetでの会議中のフリーズは、作業の妨げになっていました。

そんな中、M3チップを搭載したMacBook Proの発表があり、これを機に新しいMacBook Proへの移行を決意しました。

12月9日に新しいMacBook Proが届いたことで、移行のプロセスが始まりました。

スペックの変化

移行前後のPCのスペックを比較すると、大きな変化がありました。

メモリが増えたことにより、複数の開発ツールやアプリケーションを同時に動かしてもスムーズに作業できるようになりました。

旧PC 新PC
種類 13インチ, 2019, Thunderbolt 3ポート x 4 14インチMacBook Pro
仕上げ スペースグレイ スペースブラック
メモリ 16GB 36GB
ストレージ 512GB SSD 512GB SSD
プロセッサ 2.8 GHz クアッドコアIntel Core i7 1コアCPU、14コアGPU、16コアNeural Engine搭載Apple M3 Proチップ

移行アシスタントを使用しない理由

新しいMacBook Proへの移行にあたり、私は意図的に移行アシスタントの使用を避ける選択をしました。この決断に至った理由は以下の通りです。

同僚の経験からの学び

私の前にインテルMacからシリコンMacへ移行した同僚から、移行アシスタントを使用した際の経験を聞きました。彼らの体験によると、移行アシスタントを使用しても、チップの違いにより多くのアプリの再インストールが必要でした。

再インストール vs 新規インストール

移行アシスタントを使用する場合と同様にアプリを再インストールする必要があることから、新規インストールの方が状況に応じてより柔軟で、手軽な方法と考えました。

クリーンな環境の維持

移行アシスタントを使うことにより、必要のない古いファイルや使用していないアプリが新しいPCに転送される可能性がありました。新しいPCをできるだけ「クリーン」な状態に保ちたいという思いから、手動での移行を選択しました。

このように、移行アシスタントを使用しないことで、必要なアプリやファイルのみを選択し、新PCを最適化された状態で使い始めることができました。

移行方法

新しいMacBook Proへの移行は、移行アシスタントを使用せず、手動で行いました。以下は、移行プロセスの主なステップです。

必要なアプリのインストール

  • プロセス: 私はまず、旧PCから新PCで使用するアプリのリストを作成しました。次に、このリストに基づいて新PCに必要なアプリを一つずつインストールしました。
  • 目的: 新しい環境にのみ必要なアプリを選び、不要なものは除外することで、新PCを最適化しました。

ファイルの共有

  • 方法: 重要なファイルやローカル環境の設定ファイルなどは、AirDropを使用して新PCに転送しました。
  • 利点: AirDropの使用により、ファイルの移行を迅速かつ簡単に行うことができました。

進捗管理

  • ツール: 移行作業の進捗は、Notionに記録していきました。
  • 効果: これにより、作業の進行状況を把握し、計画的に進めることができました。

認証情報の管理

  • ツールの利用: 移行の際、同僚からのアドバイスに従い、認証情報やログインデータは1Passwordで一元管理しました。
  • 成果: この方法により、移行中のログインや認証プロセスがスムーズに行われ、特に大きな問題は発生しませんでした。

このような手動での移行プロセスは、新しい開発環境を清潔かつ整理された状態で維持することに役立ちました。 また、必要なアプリやファイルのみを移行することで、効率的かつ最適化された作業環境を実現しました。

開発環境の変更点

Shellの変更:fish shellからzshへ

今回のPC移行に伴い、Shellをfish shellからzshに変更しました。

fish shellの使用経験

fishshell.com

  • 使用感: 旧PCでfish shellを使用していた期間は、概ね満足していました。特に、ユーザーフレンドリーなインターフェースや豊富な機能は高く評価しています。

POSIX非互換の問題

しかし、fish shellの最大の欠点はPOSIX非互換であることです。 これにより、一部のスクリプトやコマンドが期待通りに動作しない場合があり、開発効率に影響を与えることがありました。 実際、私と同様にこの問題に直面し、zshに戻る開発者も多く見かけました。

zshへの回帰

  • 理由: POSIX互換性の重要性を再認識し、より一般的なシェルスクリプトやツールとの互換性を高めるために、zshへ戻ることを決めました。
  • 結果: zshに戻ってからは、互換性の問題に悩まされることなく、スムーズな開発が可能になりました。

この変更は、開発環境の安定性と互換性を考慮したものです。 POSIX互換性は、多様な開発環境やツールとの互動において重要な要素であり、これによりより幅広い開発作業を効率的に行えるようになりました。

ターミナルの変更:iTerm2からWarpへ

開発環境の改善の一環として、私はターミナルアプリケーションをiTerm2からWarpに変更しました。

Warpとは

www.warp.dev

  • Rust言語ベース: WarpはRustで開発されており、高速で安定したパフォーマンスを提供します。
  • スタイリッシュなUI: モダンで直感的なユーザーインターフェースが特徴です。
  • 動作環境: 現在WarpはmacOSでのみ利用可能です。
  • 登録が必要: Warpを使用するには、事前にサインアップが必要です。

Warpの機能

Warpには機能が多く搭載されていますが、詳細な紹介は省略します。

公式のDemoがありますので、興味がある方はご覧ください。

youtu.be

bindkeyの非対応

Warpの主な注意点として、bindkey コマンドの未対応が挙げられます。 これはGitHubのIssueでも取り上げられています。 私は、ghqfzf を使ったリポジトリ検索に bindkey を使用していましたが、以下の関数を用意することでこの問題を回避しました。

# fzf + ghq を使用したリポジトリ検索
fg() {
  local repo_name="$(ghq list | fzf-tmux --reverse +m)"
  if [[ -n "$repo_name" ]]; then
    cd "$(ghq root)/$repo_name"
  fi
}

この関数により、ghq で管理しているリポジトリを fzf で効率的に検索し、選択したリポジトリへ素早く移動できるようになりました。

移行完了と感想

新しいMacBook Proの開発環境でのビルドやテストを実行して確認し、無事移行作業を完了しました。

移行アシスタントを使わない選択は、大正解だったと感じています。

開発パフォーマンスも向上したと感じます。特にDockerの起動速度の向上は感動しました。

この記事が皆さんのPC移行の参考になれば幸いです。

終わり

トレタでは一緒にチームで働いてくれるエンジニアのメンバーやプロダクトマネージャーとして活躍してくれる人を求めています。飲食店の未来をアップデートする事業に興味のある方はお気軽に話を聞きにきてください。

corp.toreta.in

仕様書を書くしごと

こちらはトレタAdventCalendar2023 18日目の記事です。

qiita.com

こんにちは、トレタでトレタO/Xという飲食店向けモバイルオーダーのプロダクトマネージャーを行なっている北川です。

前回の記事で私がプロダクトマネージャーとして日頃行っている仕事内容について書きましたが、今回はプロダクトマネジメントの仕事の中で半分くらいの割合を占めている仕様書を書くというドキュメンテーションについてまとめたいと思います。

とはいえ、今のやり方がベストプラクティスとはまだ考えておらず日々アップデートをしつづけている最中です。ドキュメンテーションのやり方は組織や人によって千差万別だと思うので、あくまでも一つの例としてドキュメントライティングをしている人の参考になればと思います。

toreta.in

TL;DR

この記事では以下の内容について記載しています。

  • 合意形成のために書く仕様書の内容
  • 開発チームに伝える仕様書の内容

仕様書の粒度

おおまかな開発プロセスは前回の記事で書いた通りで、主に要件定義のフェーズと開発フェーズの2つのフェーズに分けられますが、仕様書を作成するのは基本的には要件定義のフェーズで行います。

要件定義フェーズで作成する仕様書はプロダクトのステークホルダー(プロダクトオーナー、セールスメンバー、リードエンジニアなど)との合意形成を行うための「機能仕様書」と、決まった仕様から各開発チーム向けに詳細を記載した「ユースケース仕様書」の2種類に分けています。

これはそのドキュメントの想定する読者と記述の粒度が異なるために分けています。 それぞれについて説明していきます。

tech.toreta.in

機能仕様書

機能仕様書では、ロードマップやユーザーFBなどのバックログにあるイシューから具体的にどう実現するかを仕様として記述したものです。

多くの場合はこの仕様書をもとにステークホルダー(プロダクトオーナー、セールスメンバー、リードエンジニアなど)を集めたミーティングを開催し、仕様として問題がないか、スケジュールとしていつ頃着手するのか、などの内容を決定し合意形成を行います。

そのため、作成段階ではタイトルに[Draft] と付けてまだ仕様としてFixしていないことを表します。

定形のフォーマットは定めていませんが、主に以下の内容を記載します。

概要

要件
    機能要件
    非機能要件

対応案
  影響範囲
 比較表
  
議事録

目的と結論を冒頭にまとめる

今回の記事でもTL;DRを書きましたが、先頭にその仕様書の目的をまずは書きます。これは弊社で技術顧問を行っていただいているRyosuke Iwanagaさんのやり方を参考にさせていただいています。

仕様書として細かく書いても全員が隅から隅まで読んでくれるとは限りません(大抵の人は流し読みします)。なので冒頭にこの仕様書は何を解決するための内容で、結論としてどういった仕様にしようとしている、というのをなるべく簡潔に書くように心がけています。

blog.riywo.com

非機能要件も忘れずに

何を解決したいのか、達成したいかを要件としてまとめて箇条書きなどで書くことで、議論が発展して脱線仕出した時に、そもそも解決したいことって何でしたっけ?と振り返るときに有用です。

この時に考慮が漏れがちなのが非機能要件です。機能要件はユーザーからのフィードバックなどの基のイシューから導出しやすいですが、非機能要件は顕在化されていない場合があります。

例えば、将来的に似たような問題が発生したときも考慮すべきかといった拡張性やメンテナンス容易性であったり、個人情報などを含まないかなどのセキュリティの面などを洗い出しておく必要があります。

松竹梅の比較表を設ける

実施工数や拡張性をどこまで重視するかで対応案が複数になるケースがあります。その場合はPros/Consをまとめた比較表を作り最終決定者が選択しやすいようにいわゆる松竹梅の3プランにまとめます。ここでのポイントは、中間の竹プランが選ばれやすいので誘導したいプランを軸にして松と梅を添えます。これはアンカリングと呼ばれる認知バイアスを利用した手法です。

割れ窓を取り急ぎ塞ぐ程度の場当たり的な対応は梅プラン、あまり負債も作らずに最小限で達成できる対応を竹プラン、たっぷり工数をかけて将来性含め完璧に対応するのを松プラン、といった形です。

意思決定の経緯を残す

仮に仕様書がなかったとしても、仕様を基にアウトプットされたアプリケーションコードなどから仕様を逆引きすることはできますが、なぜその仕様になったのかを探ることは難しいです。

どのような議論が行われ、どのような意思決定が行われたのかを議事録として記述または議事録のリンクを貼ります。

ユースケース仕様書

ユースケース仕様書は、前述の機能仕様書から各チーム向けにブレイクダウンした内容の仕様書です。名前の通りユースケースの粒度で作成しているので、「ユーザーが商品を新規登録する」などのタイトルの仕様書になります。画面仕様書ではなくユースケース単位にすることで、ユーザーはどういった目的をもっていて、どういったUIを操作し、システムはどうふるまうのか、といった一連のUXをまとめることができます。

ユースケース仕様書は、開発チーム内のメンバーの認識を一定に揃えるために記述します。読者としてはエンジニア、QAエンジニア、カスタマーサクセスのメンバーを想定しています。それぞれのメンバーは仕様書を基にアプリケーションコードやテスト計画書、ユーザーマニュアルをアウトプットとして作ります。それぞれのアウトプットに齟齬が生まれないように、誰が読んでも同じ理解ができることを意識して仕様書を記述します。

ユースケース仕様書はユースケースの分だけ書くことになり量が多いため、書式はテンプレート化しています。テンプレート化はかなり試行錯誤して改良を重ねていますが、一つ参考にしたのは「UI Spec」という書式です。こちらも同様にユースケースをベースとした書き方となっています。

goodpatch.com

ユースケース
要件
画面仕様
    Figmaへのリンク
    画面デザイン
    遷移元
表示形式/入力形式
インタラクティブ項目
バリデーション

ユースケース

「誰」が「何」を「どうする」を記述します

例. ユーザーが商品を新しく登録する

要件

どういったアウトプットが期待されるかを記述します。E2Eテストの各シナリオのような記述をします。(テストコードでそのまま”describe”と”it”になると理想的)

例.

  • 商品を登録できること
  • 不正な入力をすると商品が登録されないこと

画面仕様

Figmaのデザインのリンクとスナップショットを貼りつけます。

リンクだけではなくなぜスナップショットなのは、常にFigmaと完全に同期が取れない可能性があるからです。 この仕様書は仕様変更があった際に随時アップデートしていく仕様書です。理想的にはFigmaと同時に更新されるべきですが、どうしても片方が更新漏れになってしまうこともあります。

そのため仕様書内の記載で齟齬が起きないようにスナップショットを添付しています。

表示形式・入力形式

Figma内で記載しきれない細かな内容を記述します。

  • 参照データ:データモデルとのマッピング情報
  • 表示条件:非表示にする場合があれば、データモデルの値と条件式

一覧表示であれば、

  • 表示順、ページネーション有無、表示件数

入力形式であれば、バリデーションの内容を記述します。

  • 必須項目であるか
  • 最小値/最大値があるか
  • 正規表現などのフォーマット制限があるか

インタラクティブ項目

ボタンクリックなどのユーザーインタラクションによってどのような振る舞いをするのかを記述します

例.

  • 保存ボタン: 登録を行い、一覧画面へ遷移する
  • キャンセルボタン:一覧画面へ遷移する

バリデーション

上記の入力形式で記載した以外のバリデーション内容があれば記述します。主にサーバーバリデーションに近い内容となります。

例.

  • 名前などが重複して登録できるか
  • 登録件数の上限があるか

さいごに

このように私が業務で書いているドキュメントの書き方的な部分を紹介しましたが、冒頭でも書いたようにまだ自分でもこのやり方がベストプラクティスではないと思ってますし、まだまだ書式や運用方法を磨かなければいけないと思っています。

例えば今はNotionを使って書いていますが、Notionでは履歴管理の機能が足りないと感じていて追記した部分のみを伝える手段がなかったり、修正依頼を承認して反映するような運用が難しいのでGithubに移そうかと検討したりしています。

より良い開発手法の探究やプロダクト開発に興味がある方をお待ちしています。

corp.toreta.in

トレタでの開発プロセスとプロダクトマネージャーのしごと

こちらはトレタAdventCalendar2023 10日目の記事です。

こんにちは、株式会社トレタでモバイルオーダーアプリ・トレタO/Xのプロダクトマネージャーをしている北川です。 toreta.in

年月はあっという間に過ぎ去るもので、プロダクトマネージャーという肩書きをいただいてからもうすぐ2年が経ちます。 手探りで始めたプロダクトマネジメント業務も少しは板についてきたと思うので、この記事では自分がトレタで行なっているプロダクトマネジメントの仕事についてまとめようと思います。

他のプロダクトマネージャーやトレタでの開発プロセスに興味のある方の参考になれば幸いです。

プロダクトマネジメントとは

まず「プロダクトマネジメント」という定義は一般的にも曖昧です。プロダクトマネジメントの定義はプロダクトマネージャーの数だけある、ということが「プロダクトマネージャーのしごと」という本にも示されています。

www.oreilly.co.jp

私がプロダクトマネージャーになってまず手にとった「プロダクトマネジメントのすべて」という本にはプロダクトマネージャーがやるべきことや必要なスキル、知識などが幅広く紹介されています。 これをすべてやるなんて超人すぎる…と途方に暮れたものです。

  • プロダクトマネージャーの仕事・・・プロダクトを育てる、チームビルディング、ステークイホルダーとのコミュニケーション等
  • プロダクトマネジメントの必要とされるスキル・・・発想力、計画力、実行力、仮説検証力、リスク管理力、チーム構成力等
  • プロダクトマネジメントに必要とされる知識・・・ビジネス、UX、エンジニアリング等

www.shoeisha.co.jp

トレタでのプロダクトマネージャーはその本にあるようなミニCEOほどの権限はなく、そこはプロダクトオーナー(PO)が担っています。また、トレタでPM という職種にもプロダクトマネージャー(PdM)とプロジェクトマネージャー(PjM) の2つがあります。

プロダクトオーナー(PO) プロダクトのアウトカムに責任を持つ人
プロダクトマネージュー(PdM) プロダクトをどう作る考える人
プロジェクトマネージャー(PjM) プロジェクトの進行管理をする人

なのでプロダクトマネージャーとしては、エンジニアリングの視点としてやりたいことに対してシステムとしてどう作るか、そのためのチームをどう構成にするか、という範囲が責務になります。

もう一つ、自分がプロダクトマネージャーの定義として大事にしているのは「Executionに責任を持つ人」ということです。この言葉はVPoE handbookという記事から引用したものです。 note.com

とにかくプロダクトを成長させるため、事業を前に進めるためなら何でもする、ということです。

チームがなければ作る、人が足りなければ採用を強化する、チームやメンバーが進む道を阻む障害があれば取り除くということを小さいことでも何でもやります。ボールが落ちていたらとりあえず拾う、というのをプロダクトマネージャーの仕事として大切にしています。

普段の開発プロセス

日々の業務としては基本的に開発プロジェクトに沿って動きます。

通常のイシューまたは機能単位での開発の流れは以下の様に行なっています。プロダクトマネージャーとして一番関わるのは要件定義と仕様作成の部分です。

要件定義フェーズは「Why」を深掘り「What」と「How」を決める工程です。

開発項目としてやることが並べられたプロダクトバックログは、期初に定めたプロダクトロードマップのイシューと、ユーザーから届くフィードバックのイシューで構成されています。 そこからユーザーが本当に欲しいものは何か、本当に必要とされている機能は何かを深掘りし、どういった形でいつのタイミングで提供するのかを以下のメンバーで決めていきます。

UX/UIデザイナー 要求に対してユーザーにどういった体験を提供するかのUXおよびUIの提案を行う。アウトプットとして画面デザインを作る。
プロダクトマネージュー(PdM) エンジニアリング視点でシステム上どう実現するかを提案する。アウトプットとしてシステムの全体設計と、システム内のふるまいを仕様として定義する。
プロジェクトマネージャー(PjM) 各チーム内のタスクリストや稼働状況を照らし合わせてどのタイミングで行い、いつリリースするかのスケジュールを提案する。
プロダクトオーナー(PO) プロダクトバックログの優先順位を決め、各要件の最終決定を行う。

質とスピード

我々が顧客としている飲食店のユーザー属性やユースケースは多種多様です。チェーン店や個店などの規模感の違いや、居酒屋やカフェなどの業態の違いなど店内オペレーションは店舗ごとにまるで異なります。それらすべてを満たすための仕様や設計にまとめるのは難しさがあり、すべてはトレードオフになります。トレードオフのレバーのどれを押すか、どう設計するかに迷ったときの判断軸はしばしば会社のバリューに頼ります。

note.com

トレタでは行動指針として6つのバリューが示されています。その中でも特に意識するのは「速攻」と「圧倒的品質」です。相反する2つに思われますが、デリバリーの速さと品質の両方を両立できるが最善です。

有名なt_wadaさんの「質とスピード」という話は弊社の開発現場でも浸透していて、これはまさに品質とスピードの両方を両立しましょうという話です。

質とスピード(AWS Dev Day 2023 Tokyo 特別編、質疑応答用資料付き) / Quality and Speed AWS Dev Day 2023 Tokyo Edition - Speaker Deck

これはコーディングだけではなく、設計や仕様を作る場面においてもこのエッセンスはあてはまると自分は考えています。 ここでは「質」とは「保守性」と語られています。つまり、スピードを重視することで中長期的な保守性を下げるような仕様や設計にすべきではありません。

たとえば、特定の店舗だけ機能を分岐させたいというようなカスタマイズの要望があったとします。それを実現するために店舗情報に専用のフラグを新しく足してアプリケーション上で分岐処理をさせよう、というやり方が1つ考えられます。

ただしその場合、他の条件が今後出てきて絡みあったときに複雑さは増し、QAコストも跳ね上がるため保守性は下がっていきます。フラグを持たせずに他の状態で分岐条件を判断させることはできないか、フラグを持たせるにしても将来的に2値でいいのか、などよりシンプル(疎結合)で将来的にも負債になりづらい方法がないかを常に模索する必要があります。そしてそのやり方の方が多少のデリバリーの遅れがあるとしても、質が下がりにくいのであればそちらを採用します。

スピードに関しては「スコープを削る」ことをよく行います。ただ、スコープを削るだけではなくその機能で果たしたい最終的なあるべきゴールを描いてからフェーズを分割します。その上で1stリリースとして要件を最低限満たすミニマムな部分はどこかを探り短い開発期間でリリースできるようにします。これのいいところは、将来を見据えることで場当たり的ではない仕様にしやすくなるという点です。

終わりに

前述したとおりプロダクトマネージャーの仕事は幅広いので、今回書ききれなかった内容は山ほどあります。そちらは追って別の記事で書きたいと思います。

また、トレタでは一緒にチームで働いてくれるエンジニアのメンバーや自分と同じくプロダクトマネージャーとして活躍してくれる人を求めています。飲食店の未来をアップデートする事業に興味のある方はお気軽に話を聞きにきてください。

corp.toreta.in

© Toreta, Inc.

Powered by Hatena Blog