UUUO Tech Blog

水産流通のDXや業務効率化を実現するアプリケーション「UUUO」「atohama」を開発・展開している株式会社ウーオのテックブログです。プロダクトにまつわる様々な情報発信を行います。

ウーオにソフトウェアエンジニアとして中途入社して3か月でやってみたこと

はじめまして、山中です。
入社から3か月が経ち、プライベートでは魚を捌くことと業務ではRuby on Railsに少しずつ慣れてきました。少し遅いですが入社エントリとして、これまで取り組んできたことや学びについてお伝えします。

中途入社ですが、スキルセットとして即戦力とは言えません(詳しくは後述)。その中で、どうすればチームや会社に貢献できるかを考え、実行してみました。
転職直後の人にはどんなことができるのか?そんなことを考えている山中をウーオはどう受け入れてくれたのか?ということを紹介します。

自己紹介

あらためて自己紹介です。

プロダクトチームに2024年9月に入った山中といいます。

前職は小売業の会社で主にECサイトのバックエンドの運用保守をしていました。
具体的には、ECサイト用のWebAPIと、そのWebAPIが参照するDBや検索システム、DBや検索システムを更新するバッチを担当していました。
担当システムのミドルウェアやOSのアップデート、システムリプレースをするときにアプリケーションが正常に動くように修正して、テストをすることが多かったです。
EOL対応を数年連続していたので直近は、半分冗談半分本気で「俺がEOL対応エンジニアだ」とか言ってました。

メインで使っていたプログラミング言語Pythonです。

経歴を見直すと、新卒のときから今まで携わってきたプロダクトはすべて、作られてから10年以上のものでした。
開発スピードを維持しながら長くサービスを提供するうえで、ソフトウェアも運用作業も設計とテストは大事であり、そこはさらに磨いていきたいスキルだと考えていました。
加えて、まだまだ新しいことにも挑戦したいと思って転職することにしました。そのうえで、ウーオの事業や考え方が好きだったので、面接をお願いして今に至ります。

入ったばかりの場所でどう貢献するか?

さて、こんな私ですがウーオでなにをすることになったのかというと、Ruby on Railsで作られているプロダクトのバックエンドで機能開発を主にすることとなりました。

水産業の市場で例えるなら、以前は魚の売買に携わっていたのが、しばらくは冷蔵設備の入れ替えや間接資材の整理などの業務に専念しており、今回久しぶりに魚の売買を再開する状況でしょうか。

ごめんなさい、この例えはわかりにくいかもしれませんが、ご容赦ください。(言ってみたかったのです。)
つまりはソフトウェア開発という仕事の流れはおおよそわかっているが、詳細なところは慣れがないという状態です。
機能開発も数年ぶりです。
RubyRuby on Railsも業務経験はなく、入ったばかりのときは業務で使えるレベルではなかったため、他のメンバーからたくさんサポートをもらいました(これは本当に感謝)。また、業界が変わったため、ドメイン知識も不足しています。

中途採用でここまでガラッと変わる人はあまりいないかもしれませんが、多少は変化があってパフォーマンスや成果を出しにくい人は多いと思います。
一方で何もできないのかと考えると、そうではなく、できることがあって実施してよかったことを紹介します。

ポイントとして、以下の3つのステップで取り組んでいくとよかったです。

  1. 簡単で実績がある方法を導入してみる
  2. 途中から入ったからこそ見えたことを伝える
  3. 少しストレッチして実績がある方法を導入してみる

入って3か月間でやったこと

【ステップ1】簡単で実績がある方法を導入してみる

Slack絵文字にネコチャン絵文字を導入する

ウーオではSlackを使っています。前職でSlackやDiscordで使えるネコチャン絵文字が使われていて、コミュニケーションがいい感じになっていたので、入れました。

絵文字を入れたことを共有

これは今思うと勢いで入れた感じはありますが、振り返ると、良い成果が得られたと感じています。
ウーオは常に皆がオフィスにいるわけではありません。
リモートで働くときもあれば、市場や営業先にいくこともあります。オフィスにいることが多い人もいます。
そのため、少しでもテキストコミュニケーションが良い感じになったのはよかったと思います。

1on1を総当りでやってみる

水産業界では、漁師さんから消費地市場を経由して消費者に届くまででいろいろな職種の人が関わります。
ウーオ社外だけではなく社内にもさまざまな仕事をしている人がいます。
人によっては仲買人さんや荷受けさんと主に接したり、小売・飲食店と主に接する人もいます。
入社前にウーオのブログ水産流通のしくみ を読んでいたのですが、それでもわからないことが多かったです。

どうキャッチアップしていくかと考えていたときに、以前読んだブログの記事オンラインでも一人目職種のオンボーディングを成功させる知見を紹介しますを思い出しました。
わたしは一人目職種なわけではないのですが、

仕事の話をしようにもお互い「知らない人」だとうまくコミュニケーションを取れないことが多いので、1on1で人となりをまず知る / 知ってもらうことが大事です。

という点は同じだと考え、やってみました。

ちょうど入社して2週間目に広島本社出張があって、対面でできる方とは対面でリモートや東京本社の方々とは、オンラインで実施しました。どの方も当初予定の時間45分オーバーするくらい話をしてもらえて、どういうところで連携できそうか、新しく入った山中というやつはどんなやつかっていうのをざっくり知ってもらえました。
また、自分自身も他の人の業務の具体や、考え方を知ることで、MTGで顔を合わせて話しかけるときの心理的なハードルは低くなったと思います。

パラメータ化テストを書く

さて、ようやくここから、ソフトウェアエンジニアっぽいことの紹介をします。

別にそうやらなくても困らない、けど知っているとちょっと楽というものはあります。
細かいところで言えば、なにかのショートカットコマンドやシュガーシンタックスなど。ウーオはテストコードを書く習慣があって、テストケースも充実しています。
ただ、意外にも以下のように書いているテストコードがありませんでした。

    [
      %w[SendGridがJSONのTOPレベルから仕様と異なるものを送ってきたとき SendGridの署名が有効なとき],
      %w[SendGridが仕様通りのパラメータを送ってきたとき SendGridの署名が無効なとき],
      %w[SendGridがJSONのTOPレベルから仕様と異なるものを送ってきたとき SendGridの署名が無効なとき]
    ].each do |event_type, signature_type|
      context '異常系のとき' do
        include_context event_type
        include_context signature_type
        it '400を返す' do
          post webhooks_sendgrid_path, params: send_grid_request_param, headers: stub_headers
          expect(response).to have_http_status(:bad_request)
        end
      end
    end

別にこれは、以下のように書いても大きな問題になりません。

     context '異常系のとき1' do
      include_context 'SendGridがJSONのTOPレベルから仕様と異なるものを送ってきたとき'
      include_context 'SendGridの署名が無効なとき'
      it '400を返す' do
        post webhooks_sendgrid_path, params: send_grid_request_param, headers: stub_headers
        expect(response).to have_http_status(:bad_request)
      end
     end
     context '異常系のとき2' do
        include_context 'SendGridが仕様通りのパラメータを送ってきたとき'
        include_context 'SendGridの署名が無効なとき'
        it '400を返す' do
          post webhooks_sendgrid_path, params: send_grid_request_param, headers: stub_headers
          expect(response).to have_http_status(:bad_request)
        end
      end
      ...

この書き方はライブラリを入れずとも導入できるコストの低いことであり、 テストコードが見やすくなると言っても少しずつです。それでも大事だろうと考え、書いてPRをだしたら、すっと承認されてちらほらと他にも同じ書き方のコードが見えたのは嬉しいところでした。

【ステップ2】途中から入ったからこそ見えたことを伝える

言葉の認識合わせをしていく

プロダクト開発に何年か携わっている人であれば「アジャイル開発のスクラム」と言うと、おおよそどんなことをやるのかイメージは一致すると思います。

ある言葉や、やり方が組織内で使われるうちに、もとは一般的な意味だったのに徐々に別の意味に変わることがあります。
これは必ずしも悪いことではありませんが、同じ言葉でも指すものが異なるとコミュニケーションに支障が出ることがあります。とくに新しい人が入ったときに問題になりやすいです。

そういったことを解消していくためにも、違和感があったら

というのは確認していくようにしました。
自分自身もチームに馴染めるように理解を深めるのと、チームの人にもなにかしらプラスになると思うので進めていきました。

前職での事例を紹介する

業界が違うと言っても、大きな括りで言うとeコマースに関わる仕事という点では同じです。

たとえば振り返りとしてこんな取り組みをしていたということを以下のように共有しました。

実践したことがある振り返り手法を共有

ちなみに前職でやっていた事例を紹介するときに、どこまで話していいかは法務にくわしいコーポレートチームに相談してから、共有しました。

分報チャンネルで悩みをポツリと呟いていたら、スッとコーポレートチームのメンバーが現れて相談に載ってもらえました。ありがたかったです。

【ステップ3】少しストレッチして実績がある方法を導入してみる

GitHub Copilotを導入する

最後は、少しストレッチして実績がある方法を導入してみた例の紹介です。

GitHub Copilotは前職でも学ぶのにも業務を進めるにもすごく便利でした。前職では、GitHub Copilotを導入すると受けられる恩恵のポイントをスーパーなエンジニアの人がサッとまとめて、あっという間に導入してくれました。

正直当時の自分ではそんなにうまくはやれないと思います。
ただ、今の自分なら少しスキルはあがっているし、導入先の組織や状況は違いますがそれをお手本とできます。自分も他のメンバーも業務効率改善にもなるため、これならば頑張ればいけそうだと考えてメンバーにアンケートをSlackで取って、CPOの土谷さんに相談してお試しで導入しました。2か月ほど試用してもらい、アンケートをとり、(厳密に時間を測ってはないですが体感で)平均1日30分以上は作業時間の短縮ができたとアンケートで回答をもらえて、それならばOKということで導入できました。

こういうのは、転職して働く場を変えたときだからこそできることだと思います。
企画、導入、検証までの1サイクルを体験できるのは、個人としてもスキルアップにいいです。
また、新しい環境で一連の流れを実施するにはどんな感じで進めるのかを知る良い機会にもなるので、転職したての方はなにかしら、やってみるチャンスだと思います。

振り返りと感謝

たった3か月、されど3か月。

上記以外にもいろいろとチャレンジさせてもらえました。 転職したばかりだからできるチャレンジがけっこうできて、充実した3か月を過ごせました。

これは決して自分の力だけではなくって、そういうチャレンジを受け入れてくれる環境がウーオにあるからできたのだと思っています。 わかりやすいところだと、1on1とかアンケートは絶対に独力ではできません。 それ以外も全部自分で考えたのではなく、アドバイスを適切にもらえたので実現できました。

チャレンジしたいことを詰め込みすぎて、混乱を招いたところもあります。(1on1で予定いっぱいになった日とかあったり・・。) そこは優先順位の付け方で大いに反省すべきところなので、冷静に見直しつつ、メイン業務でも貢献できるようにします!

まとめ

入ってから3か月間で何をしてどうなったのか?ということで、自分自身が今まで周囲の人から学んだことや良いと思ったことを実践したことを紹介しました。

ポイントは、導入・実施コストやリスクが低いものからしていくことです。 個人としてはなにかを導入するファーストペンギンとなる経験を積めます、 周囲のメンバーに効果は低いかもしれませんがマイナスになりにくいです。

これは、ウーオのValuesの「まずは小さな1ケース」に近いと思っています。

これからケースをたくさん積んで、成果が出せたときにはまた記事を書きます!

最後に最近作った魚料理です。富士山サーモンを自分で捌いてパン粉焼きにしました。めちゃくちゃおいしかったです!

捌いたサーモンをパン粉焼きに

飲食店の皆様!サーモンの仕入れは こちら から!(※現在個人でのウーオのご利用はできません)

app.uuuo.jp

Rails6.1のままRuby3.0からRuby3.2にアップグレードしました

こんにちは!

はじめまして。ウーオのソフトウェアエンジニアの毛利(@morieeeenyo)です。6月に入社しました。

初回なので簡単に自己紹介させていただければと思います。

1996年、広島県生まれ。3歳〜18歳まで岡山で育った生粋の瀬戸内っ子です。

営業やバックオフィスなどエンジニア以外の職種を経験してからエンジニアになり、 DX支援を行う会社で教育・人材領域を中心にWebアプリの新規開発をしたり、グロースフェーズの社内ベンチャーに参画してスクラムによるアジャイル開発をしたりしていました。地元瀬戸内の企業で働けること、エンジニアがビジネスチームやエンドユーザーと接しながら裁量高く働ける環境に魅力を感じ入社しました。

これからよろしくお願いいたします!

今回の記事ではウーオのRubyアップグレードについて書かせていただければと思います。

Rubyアップグレードを行った背景

Rubyのアップグレードを行なった背景としては、インフラのアップグレードに伴いRubyのバージョンも一緒にあげよう!となった形になります。アップグレード先のRubyのバージョンとしてはYJITが使える最低限のバージョンということで3.2を選びました。RailsについてはRails7ではWebpackerが廃止されるなど大きく変更が必要そうであったことを鑑みて今回のアップグレード作業のスコープからは外し、今後段階的にアップグレードしていくことにしました。

なお、Rubyアップグレードを任された当時、私は入社2週間も経っていない頃。まだキャッチアップすべきことだらけで右も左もわからない中、突然メンションが飛んできました。

とんでもないメンションが飛んできたぞ・・・と面食らったのをよく覚えています。 正直Rubyのアップグレードは他の人のPRをレビューしたことがある程度で、自分でゼロからやったことは無かったのですが、ドメイン知識に依らない技術的な課題解決は入社まもない自分にとってチームに貢献する数少ないチャンスだ!と思って手を挙げてみることにしました。

Rubyアップグレードの進め方

ウーオのプロダクトチームでは「開発・プロダクト品質向上タイム」という時間を2週間に一度設けています。 これは機能開発以外の不具合の修正やリファクタリング、社内ドキュメントの整備など緊急ではないが重要なことに使う時間で、定期的に枠を設けることによって強制的に品質向上に時間を使えるようにするために実施しています。 今回のRubyアップグレードもこの時間を活用して進めました。

丸一日時間を使えるとはいえ集中して時間を使えるのは2週間に一度しかないため限られた時間でなるべくリリースReadyな状態を作ることを意識して進めました。

具体的には

  • アプリが正しく動作すること
  • デザイン崩れを起こしていないこと
  • CIが通ること
  • ローカルの開発に支障ないこと

を優先的に達成できるようにし、gemやnpm packageのバージョンに起因するWARNINGの解消などは後に回すようにしました。

具体的な作業内容

ここからはRubyをアップグレードするために具体的に行った作業を記載していきます。

Ruby3.1へのアップグレード

Ruby3.2にアップグレードするにあたり、3.0→3.1→3.2と段階的にアップグレードするようにしました。具体的にはmasterブランチからRuby3.1アップグレード用のブランチを切り、そこからさらに3.2にアップグレードするためのブランチを切るという形にしました。これにより、修正内容がRuby3.1へのアップグレードによるものなのか3.2へのアップグレードによるものなのか特定しやすくなります。

1. Dockerのビルドを通せるようにする

ウーオではバックエンドをDockerを用いて開発しています。

そのため、まずはDockerで使うRubyのイメージを変更してビルドを通すところから始めました。

- FROM ruby:3.0.3-alpine3.14
+ FROM ruby:3.1.6-alpine3.20

Dockerで使えるRubyイメージはDockerのOfficial Imagesのサイトから探しました。

イメージを変更したら以下を実行します。

docker compose build --no-cache

するとビルド時のコマンドのどこかしらでエラーが発生するのでこれをひたすら直していきます。

今回のアップグレードでは具体的には以下の2点を修正しました。

  • Node.jsのバージョンアップ
  • python2→python3への変更

Node.jsのバージョンアップを行なったのは当時採用していたNode.jsのバージョンがalpine3.20では使えなかったためです。またNode.jsをアップグレードする際にpython2→python3へのアップグレードが必要になったので併せてアップグレードしました。

使用するNode.jsのバージョンは他のパッケージとの依存関係的に20.13.1を使うのが都合がよさそうだったので、yarn installを通すのに苦戦しない限りはそれを使おうと考えました。

Node.jsのバージョン変更の結果として、yarn installでWebpackerの依存関係のエラーが出たので Webpackerのバージョンアップを行いました。メジャーバージョンを変更しないのであれば大きくは挙動には影響しないはず、という考えから当時使用していた5系の最新版(5.4.4)にアップグレードしました。

ここまで対応した段階でDockerのビルドが通りました。

2. ローカルで動作確認

Dockerのビルドが通った後、軽くローカルで動作確認を行いました。

Webpackerをアップグレードした影響でCSSが正しく当たらなくなったので調査しました。

具体的にはアプリケーションコンテナの中で以下のコマンドを実行し、出てきたエラーを解消していきました。

bin/webpack-dev-server

するとSCSSファイルのインポートでエラーが発生していることが確認でき、修正を実施しました。

3. RuboCopのTargetRubyVersionを上げる

ローカルで問題なく動作してそうなことを確認したので、次にCIを通します。

CIを通すためにまずはRuboCopのTagetRubyVersionを上げました。

.rubocop.yml

- TargetRubyVersion: 3.0.3
+ TargetRubyVersion: 3.1.6

RuboCopでは以下の二つのルールに引っかかりました。

  • Style/HashSyntax
    • EnforcedShorthandSyntax オプションが導入され、デフォルト値alwaysを用いる場合キーワード引数のKeyとValueが同じ名前の場合にValueが省略されます
    • .rubocop.yml の設定でValueを省略しないことを強制することもできます
  • Layout/MultilineOperationIndentation
    • 一つの処理が複数行にまたがる場合にインデントを揃えてくれます

これらはいずれもauto-correctableとのことで、作業が複雑にならずホッとしました。

4. RSpecを通す

ウーオのCIではRuboCopの他にRSpecも実行しています。

Ruby 3.1.6へのアップグレードでは特にRSpecでのエラーは発生しませんでした。

Ruby3.2へのアップグレード

3.1で動作やCIの実行結果に問題ないことを確認したのち、3.2へとアップグレードしました。

3.2でも1~4の手順を行います。

3.1へのアップグレードとの違いとして、RuboCopのTargetRubyVersionに3.2.4を指定するためにrubocop gemのアップデートが必要になったのでアップデートしました。

また、Ruby3.2のscopeでキーワード引数の扱いの変更され、scopeでキーワード引数を使うとArgumentErrorが出るようになってしまいました。

具体的には以下のようなスコープを実行すると wrong number of arguments (given 1, expected 0; required keywords:role) (ArgumentError) というエラーになりました。

class User
   scope :with_role, ->(role:) { where(role: role) }
end

User.with_role(role: :admin)
=>wrong number of arguments (given 1, expected 0; required keywords:role) (ArgumentError)

そのため以下のようにキーワード引数を使わない実装に変更しました。

class User
   scope :with_role, ->(role) { where(role: role) }
end

User.with_role(:admin)

RSpecでこれが原因で多くのエラーが発生したのですが、こちらのissue等を見るとこのエラーはどうもRuby3.2 + Rails6.1.7の組み合わせで起こり、Railsをアップグレードしないと解消されなさそうでした。そのため、キーワード引数を使っているscopeをgrepしては修正して、を繰り返しました。(これは結構骨が折れました…あとテストコードをちゃんと書いてて良かったと思いました)。

grepする際は 以下のコマンドでリポジトリを検索しました。

git grep -E "scope :.*:.*(\{|do)"

5. リグレッションテスト

Ruby 3.2でCIが通ったら実際にデプロイします。

Rubyアップグレードはアプリ全体に影響があるため、QAエンジニアによるリグレッションテストも行いました。ウーオではリグレッションテストの項目をNotionのテンプレートを用いて管理しており、変更の影響範囲に応じて誰でもリグレッションテストを実施できる仕組みを構築しています。

6. 無事にリリース

リグレッションテストで発見したバグの修正完了後、無事リリースを迎えることができました。

まとめ

今回はウーオのRubyアップグレード対応についてまとめました。

実装開始から1ヶ月でリリースを迎えることができましたが、機能開発と並行して進めていたことを考えるとスピード感を持って対応できたのではないかと思います。影響範囲が広く開発着手時は不安な点もありましたが、CIによる自動テストやリグレッションテストのおかげで安心してリリースを迎えることができました。

ウーオのプロダクトチームでは「技を磨き、持続可能なものづくりを追求しよう」というValueを掲げており、今後も持続可能な開発のためにテストの拡充やライブラリのアップデートを積極的に行っていきたいと思います 💪

※プロダクトチームのValueについては以下の記事をご覧ください! tech-uuuo.hatenablog.jp

最後までご覧いただきありがとうございました!

ウーオでは水産流通を革新するため、プロダクトを通じてあらゆるアプローチをしています。ウーオの事業やプロダクト開発にご興味がある方は、ぜひ下記を覗いてみてください。👇

水産流通を革新する自社プロダクトを開発!サーバーサイドエンジニアを募集! - 株式会社ウーオのWebエンジニアの採用 - Wantedly

水産の新しいインフラを作る、フロントエンドエンジニア募集! - 株式会社ウーオのWebエンジニアの採用 - Wantedly

水産業の課題解決をユーザー目線のUI/UXでリードするデザイナー募集! - 株式会社ウーオのUI/UXデザイナーの採用 - Wantedly

Flutterで水産DXアプリ開発!iOS/Androidエンジニア募集! - 株式会社ウーオのモバイルエンジニアの採用 - Wantedly

1日2時間〜遠隔での対応歓迎!水産流通DXを実現するアプリのテスター募集! - 株式会社ウーオのQAエンジニアの採用 - Wantedly

ウーオ プロダクトチーム Values を策定しました

このブログは、2024年8月1日に note に投稿した記事を転載したものです。 note では技術記事以外にも多くの記事があるので、是非ご覧ください!

note.com


こんにちは!

ウーオに入社した2019年から毎年「ワタリガニ仕入れてカンジャンケジャンを作りたい」と言い続けて、先日やっと実現できて嬉しい、土谷(@ta1haku)です!🦀

ブログの"オープニング"カンジャンケジャン

ワタリガニ、かわいい

あっという間に8月ですね!今回は、2019年にエンジニアとして私が入社してから、現在は総勢17名にもなるプロダクトチームにおいて、今年の5月以降取り組んでいたプロダクトチームの行動指針、通称プロダクトチーム Values の策定について、そのプロセスや策定した7つの Values についてご紹介します。

プロダクトチーム Values 策定の背景

先ほども紹介した通り、ウーオの開発チームは今業務委託の方を合わせると総勢17名です。また、職種もバラバラでエンジニア、デザイナー、PdM、QA等。当然ですがいるメンバーの出身組織もWebの制作会社、メガベンチャーSIer、スタートアップ、と規模も違えば業界やいるメンバーの職種も異なります。

そうした中、開発プロセスの中で意思決定をする際の判断基準が人によって異なってくることも多々出てきました。例えば一部を紹介すると、この機能は価値検証フェーズなのでリリースを最優先でするのか、既存のユーザの体験を守るためにリリースを先延ばしにして細かくQAしていくべきなのか、この機能をつくるべきか、そもそも作らずに検証できないものかまず模索しよう、等です。

ウーオで初めて一緒にプロダクト開発をするメンバーばかりですし、組織が大きくになるにつれ、こういう衝突はあって然るべきだと思います。そんな中、ウーオでのプロダクト開発において大事にしたいこと、を再定義していこうという動きをとることにしました。当時は、 バリューなのか行動指針なのか、曖昧でしたが、今ある会社の Values よりもう一段階具体度をあげた行動指針にしようと決めて動き始めました。

最終的には、「ウーオのプロダクト開発で大事にしていること」を言語化しておくことで、開発をする際の各プロセスで個々人が意思決定すべき時の拠り所だったり、判断する際の指針を組織に提供したいと思っていました。

ウーオの Values

進め方

下記のような進め方で、バリューを策定していきました。1-2のプロセス、割と日頃から開発の振り返りなどで利用しているKPT(Keep, Problem Try)の議論フォーマットのように進めました。

  1. 各メンバーが大事にしていることを付箋で共有していく
  2. 似たような内容はまとめて、グループ化する
  3. 特定メンバーで特に大事にしたい内容を取捨選択し、ワーディングする
  4. メンバーに共有しレビューをしてもらい、清書する

1-2のプロセスでのアウトプットの様子
普段リモートで働いていますが、ちょうど全社の合宿で集まる機会があり、合宿の翌日に疲れた身体に鞭を打ち広島オフィスでバリューについて考えました。

3に関しては、各メンバーに出してもらった内容を踏まえ、今のフェーズで果たして必要なのか、少し具体的すぎてバリューや行動指針としてはフィットしないのではないか等を議論してなるべく多くなりすぎないよう削ぎ落としていきました。

3のプロセスはFigJamを使って。

4に関して、言葉のニュアンスからそもそもの内容についてもレビューコメントをもらい、違和感なく言葉の意図が伝わるようにチューニングします。

メンバーから言葉遣いやニュアンスを中心にレビューをもらう

7つの Values

結果的に、この7つのプロダクトチーム Values が出来上がりました。

“あの人“にとって、なくてはならないをつくろう

今作ろうとしているものは、「誰のためのもの」なのか、自分がいま作ろうとしているものでその人は助かるのか、実際のユーザを想像しよう。

パソコン閉じて、市場に行こう

百聞は一見にしかず。誰かから聞いた情報だけで考えるのではなく、まずは自分の五感で現場を感じて一次情報を得よう。

オーナーシップを持とう

いわれた・決められているからやる、のではなく、また、誰かが答えをつくってくれるのを待たず、積極的に意見を伝えていこう。自分の想いを込めたプロダクトで価値を届けよう。

越境し、巻き込み合おう

自分やメンバーの強みを把握し、デザイン、開発、ビジネスなどお互いの領分だけに閉じず、強みを掛け合わせて1人では作れないものを作っていこう。周りを巻き込み、自らも巻き込まれよう。

小さな投資で、大きな学びを得よう

素早く、小さく試して、価値検証サイクルを回そう。速く学びを得て次の検証に繋げることは、爆速成長につながる。 どうすれば最速で学びを得られるか、模索しよう。

プロダクトの価値を高めるために、引き算を恐れない

機能が多い状態は時にユーザを迷わせる。価値から逆算して優先順位をつけ、仕様の複雑化を避けよう。初めて開いたユーザが迷わずやりたいことが理解できるプロダクトを目指そう。

技を磨き、持続可能なものづくりを追求しよう

今できるベストを尽くして、提供する価値の質をあげていこう。自らのスキルをアップデートし続けて、プロダクトの持続的な成長を実現しよう。

改めてざっと眺めてみると、非常にウーオらしいいいバリューができたなーと思うと同時に、プロダクトと組織が大きく成長しているんだなと感じました。例えば「パソコン閉じて、市場に行こう」は市場や港といったユーザの現場へ出向いてのヒアリングの機会が多くあるウーオらしいものですが、最近はUUUOとatohamaという複数プロダクトの開発チームがあること、また各プロダクトの中でもユーザの業態(例:飲食店向け等)によってチームが分かれているので、チーム間の連携について言及したものがあるのも特徴的です。また、プロダクトの機能や検証したい価値や体験も多岐にわってきたため、価値を見直して優先順位をつける意識や、ユーザ基盤も増えてきたため、より自分たちの技術的な成長に視点があるバリューもあります。

浸透させる

今回のプロダクトチーム Values は具体的な行動がイメージできるように作ったので文字数も多いため、各メンバー空で言えるくらい覚えていってもらう仕掛けも必要です。今ここは絶賛調整中ですが、Slack等での日々のコミュニケーションの中で触れる機会を増やしたいということで、早速@morieeeenyoがバリューに沿った行動が流れてくるSlackチャンネルを作ってくれたり、@misaaa09が振り返りなどで使うFigJam上にスタンプを作ってくれたりと気づいたら進めてくれていました。

リアクションすると転送されるプロダクトチーム Values のチャンネル

FigJamのお手製スタンプ

よりよい開発チームを目指して

今回は、ウーオメンバーが大事にしていることや、その言語化のプロセスについて方法について紹介しました。

いいプロダクトを作ることといい組織づくりは密接に関連していると思います。また、今回言語化したプロダクトチーム Values は、今と今後の組織において大事にしたいことのスナップショットです。ウーオは、「すべての街を、美味しい港町に。」するために各メンバーがオーナーシップを持って自発的に組織をよりよくしていくのが大事と思っているチームです。今の規模からさらに大きくなったり、いろんなバックグラウンドのメンバーがさらに増えて組織が成長するにつれ、どんどんアップデートしていければと考えています。

特に、今回の記事で、ウーオの大事にしたいこと、に共感された方や、実際の開発での活用など気になる方、ウーオのプロダクト開発に興味がある方はぜひ下記を覗いてみてください。

水産の新しいインフラを作る、フロントエンドエンジニア募集! - 株式会社ウーオのWebエンジニアの採用 - Wantedly

水産流通を革新する自社プロダクトを開発!サーバーサイドエンジニアを募集! - 株式会社ウーオのWebエンジニアの採用 - Wantedly

水産業の課題解決をユーザー目線のUI/UXでリードするデザイナー募集! - 株式会社ウーオのUI/UXデザイナーの採用 - Wantedly

Flutterで水産DXアプリ開発!iOS/Androidエンジニア募集! - 株式会社ウーオのモバイルエンジニアの採用 - Wantedly

1日2時間〜遠隔での対応歓迎!水産流通DXを実現するアプリのテスター募集! - 株式会社ウーオのQAエンジニアの採用 - Wantedly

最後に、この時期は夏枯れ*1で魚が少なくなってきていますが、7月はじめに捌いて食べた宮城のカツオが美味しすぎたので紹介しておきます。また次のブログをお楽しみに!

ブログのエンディングカツオ

*1:水産業では、本格的な真夏の暑い季節に魚があまり獲れなくなる事を【夏枯れ】と呼びます

Flutter の Expanded と Flexible の使い分け

こんにちは。最近はずっと Flutter を触っている石田 (@geckour) です。

今回は Flutter を触っている人なら誰しも一度は思ったことがある (と思っている) 「ExpandedFlexible ってどう使い分けるんだ?」について考えていこうと思います。

続きを読む

2021年〜2024年前半の担当施策振り返り

こんにちは! ウーオのソフトウェアエンジニアの井草です。 私事で恐縮ですが、産休でしばらくお休みをいただくことになりました。今回のブログでは、入社した2021年後半から現在まで私が関わった施策をメインとした振り返りをしていきます。

タイムライン

2021年

アプリ「Maehama Cloud」リリース

現在まで続く魚を仕入れるためアプリ「UUUO」の他、全国の水揚げ情報を配信するアプリ「Maehama Cloud」の開発を開始し、2021年7月にリリースしました。 水揚げについてはリリース以前もLINE公式アカウント上で案内していましたが、取引先産地が増えるにつれテキストでの配信に限界があり、アプリでの情報発信へと切り替えました。

アプリでは魚種ごと・産地ごとで水揚げが見れる他、過去その魚がどのくらい獲れていたかも見れるようになっていました(※現在は水揚げ情報の配信を停止しています)。

漁獲情報は各産地のLINEグループからの情報やHPから取得しているのですが、配信のためのオペレーション改善については↓で記事化されています。

note.com

kg売り出品

UUUOアプリではそれまでケース売りでのみ出品可能でしたが、kg売り出品に対応しました。その対応により、出荷する段階まで合計kg数が分からず金額が確定しない商品についても出品することが出来るようになりました。

出荷タブ

出品者向けアプリ「UUUO Sellers」にて、受注したものを表示する購入一覧タブに加えて出荷タブを追加しました。 出荷便ごとの表示に対応し、商品を何時の出荷便で出荷するのか分かりやすくなりました。

2022年

アプリ統合

前年にMaehama Cloudをリリースし、発注用のアプリUUUO(+出品者向けアプリUUUO Sellers)と並行して開発を進めてきましたが、検証を重ねた結果水揚げ情報機能をUUUOアプリに体験を統合する流れとなりました。

アプリの統合の経緯について👇

note.com

リクエスト出品

水揚げ日前日に事前注文を取りたいという要望に応えて、リクエスト出品機能を追加しました。 「セリ前商品」という名前に変わって現在も活用されています。

鮮魚BOX内訳表示

鮮魚BOXの取り扱いが増えるにつれ中に入っている魚種が多様になったため、魚種の内訳を入力しやすくし、アプリ上の表示も分かりやすく改善して出荷ミスが起きにくいように対応しました。

販売時間ごとの出荷便の締切時間改善

それまでは各出品に紐づく販売時間で登録されている締切時間によって各ユーザーが購入できる期間を一律で管理していましたが、出荷便の締切時刻に合わせたり、その日によって締切の時刻を変えられるようにして柔軟に締切時間を設定出来るようになりました。

この頃開催したイベントで登壇する機会があり、この施策について触れています👇

speakerdeck.com

荷口番号対応

2022年12月1日、違法に採捕されたアワビ・ナマコの流通を防止するために施行された水産流通適正化法により、荷口番号(漁獲番号)という取引の際に発行された番号の伝達・管理が義務付けられました。アプリ上でも施行に合わせて荷口番号を管理できるように対応しています。

2023年

️タイムライン

出品以外の形で情報発信を行うことで売上の向上につなげるため、タイムライン機能を追加しました。 現在はオススメタブの中で出品者からの投稿を確認する事が出来ます。

️クレカ決済 / ヤマトクール便対応

新規顧客層の飲食店の利用シーンに合わせ、クレジット決済機能・ヤマト便で受け取れる機能をリリースしました。 それまでは支払いは銀行振込、発送は市場便(産地と市場間を輸送する専用の便)のみでしたが、飲食店ユーザーでも購入ができるようにインフラ整備を進めました。

tech-uuuo.hatenablog.jp

出品コピー

以前出した魚種と同じような商品を出品する際、一から作成する必要があり出品作業に時間がかかる問題がありました。 過去の出品をコピー出来るようにする事によって出品時間が減り作業効率が上がりました。

加工対応

加工オプションの設定を追加し、出品者が対応できる場合は内蔵処理等の加工をした状態で商品を提供出来るようになりました。 商品によって加工賃の設定を変更出来るため、対応の手間の違いから適切な価格で販売出来るようになっています。

Algoliaによる検索機能の改善

UUUOアプリの検索機能は2021年時点でありましたが、魚種名での検索しかできませんでした。「産地や漁法、食べ方などで検索し、意図した商品を見つけたい」という要望に応えるべく、検索機能改善を行っています。

tech-uuuo.hatenablog.jp

出品アプリのWeb対応

商品の発注はUUUOアプリを使用してのみ行う事が出来ていましたが、アプリをインストールしなくても発注が出来るようにWeb版の立ち上げを行いました。 Next.jsを採用しています。

tech-uuuo.hatenablog.jp

リリースしたWeb版はこちら👇

https://app.uuuo.jp/commerces

2024年

産直表示

UUUOアプリでは産直品の取り扱いがメインでしたが、市場入荷品(入荷量が多く供給が安定しているため安価な商品)が増えた事で一見して商品の区別がつきにくい課題がありました。アプリ上の表示を改善し、産直品/市場入荷品が分かりやすいように変更を加えました。

おわりに

今回は、私が関わってきた施策についてまとめました。
入社してから3年弱も経っていることに驚きですが、振り返ると色々なことをやってきたなと感慨深い気持ちになりました笑
今年に入って約3割が経ちましたが、その間に私が関わった施策以外にもおすすめ商品の提案等、大きめの機能がリリースしていて勢いを感じます。 この勢いに乗り遅れないよう、復帰した際には今まで以上に頑張ります💪

ウーオでは水産流通を革新するため、プロダクトを通じてあらゆるアプローチをしています。ウーオの事業やプロダクト開発にご興味がある方は、以下をぜひご覧ください 👇

uuuo.co.jp

◆カジュアル面談はこちらから◆ / 株式会社ウーオ

各ポジションの募集要項はこちら

<業務委託スタート可>ソフトウェアエンジニア(Mobile Application/Flutter) / 株式会社ウーオ

<業務委託スタート可>ソフトウェアエンジニア(Frontend/Flutter on the Web) / 株式会社ウーオ

<業務委託スタート可>ソフトウェアエンジニア(Backend/Ruby on Rails) / 株式会社ウーオ

鮮魚バイヤー向けおすすめ提案のアプリデザイン

このブログは、2024年2月29日に note に投稿した記事を転載したものです。 note では技術記事以外にも多くの記事があるので、是非ご覧ください!

note.com


こんにちは!株式会社ウーオでUI/UXデザイナーをしている久保坂(@misaaa09)です。

先日水産流通マーケットプレイス「UUUO」でユーザーに合った商品提案を行う「オススメ提案機能」をリリースしました。

オススメ提案機能の画面イメージ

約6ヶ月で構想からリリースまでを行い、その中で様々のメンバーを巻き込みながら進めたプロジェクトでした。 今日は具体的な開発フローの紹介とともに、周囲を巻き込みながらデザインしていくうえで工夫しているポイントをお伝えしたいと思います。

構想〜リリースまでの半年間のタイムライン

続きを読む

OCR/AI を用いた FAX の読み取りによる商品掲載自動化の仕組みづくり

こんにちは! ウーオのソフトウェアエンジニアの髙橋(@yt_hizi)です 👋 今回は OCR/AI のプロダクトへの適用事例について紹介します。

tl; dr

  • 入荷案内の PDF は毎日複数社から届き、これを入力するのに大変な時間がかかる
  • Azure の Document Intelligence を用いて入荷案内情報を OCR で解析し効率化した
  • OCR をプロダクトに組み込む際は、業務に沿った形でデータを変換することがプロダクトの価値になる

ウーオは日々の入荷案内を全国に届ける

市場では日々、さまざまな魚が取引されています。日によって市場にある魚の種類が違えば量も違います。 そういった情報を、市場の事業者は「入荷案内」という形で1つのドキュメントにまとめて、取引先に入荷情報を伝えます。 取引先は、入荷情報を見てどの魚をどれだけ買おうか、というのを日々判断して購入し、これが最終的に私たちの食卓に届くわけです。

そんな入荷案内は、市場の事業者の取引先であるウーオにも日々届きます。 ウーオは各社から届く入荷案内に載っている情報を、市場の事業者の代わりに水産マーケットプレイスである「UUUO」に掲載し、全国のお客様が買えるようにしています。

これだけでも全国のお客様にとっては大きな価値となりうるのですが、日々入荷案内は複数社から届き、各社の入荷案内には約50商品ほどが掲載されています。

これら全てをアプリに掲載するために人力で入力すると、毎日数時間をこのために使うことになってしまいます。これでは効率が良くないので、なんとかしようというのが今回のプロジェクトです。

続きを読む