トレタ開発者ブログ

飲食店向け予約/顧客台帳サービス「トレタ」、超直前予約アプリ「トレタnow」を開発・提供するスタートアップ企業です。

トレタでエンジニアがワイワイやっている取り組みの紹介

はじめに

本記事はトレタ Advent Calendar 2020の 24 日目の記事です。

こんにちは、パパ iOS エンジニアのkentaroです。最近 Flutter やりはじめました。
(ちなみに2019 年2018 年も 12/24 に記事を書いていました。 )

トレタではテックトーク(LT 会)や勉強会等が行われています。
今回はそのようなエンジニアがワイワイやっている取り組みについての紹介です。

テックトーク(LT 会)

1 時間の枠で2〜3 人が自由に LT をする会で、週 1 回くらいのペースで実施されています。
社内でハードルが低いので、LT の練習の場としても役に立っていると思っています。

特にエンジニアに限定しているわけではなく、PM からプロジェクトマネジメントの話が聞けたりもして面白いです。

詳細はこちらの記事にまとまっています。 note.com

自分は Swift について話したりしました。
qiita.com

Go 勉強会

@tenntennさんが講師をしてくださっている、Go を基礎から体系的に学ぶことができる勉強会です。
隔週くらいのペースで実施されています。

Playground等を利用して実際のコードを交えて説明いただけるので勉強になります。
たまにクイズが出ますが、大体サーバーサイド石谷くんが指名されます。

RDB 勉強会

@lagenorhynqueさんが講師をしてくださっている、11 月からはじまった新しい勉強会です。
リレーショナルなデータの設計や各 DB 構造に落とす場合のコツとかを共有する場となっています。
こちらも大体隔週ペースでの実施です。

輪読会

読みたい本があるときに、週 1 くらいのペースで開催されています。
直近は『ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本』でした。
www.shoeisha.co.jp

正に DDD 入門にふさわしい良書だったのでオススメです。

次回は『Clean Architecture  達人に学ぶソフトウェアの構造と設計』を読もうかという話になっています。

輪読会についてはこちらの記事に詳しく書かれています。
tech.toreta.in

アドベントカレンダー

12 月は大体アドベントカレンダーやってます。

おわりに

得意な技術や担当するプロダクトの枠を超えて共に学べるのはとてもいいですね。
今回挙げたような取り組みが技術力向上にプラスになるのはもちろん、普段の仕事であまり接点がない人とも関わる機会にもなっていると思います。

トレタが気になる方は…

ぜひ遊びにきてください!
仲間も絶賛募集中です。
corp.toreta.in

HR 部門が note で発信していますので、そちらもぜひ御覧ください!
note.com

6年目エンジニアが1年間アウトプット駆動開発をしたら"圧倒的成長"した件について

本記事はトレタアドベントカレンダーの23日目の記事です。

始めに

皆さま、こんにちは!
念願のスプラトゥーンのサーモンランカンストを達成したハイカラスクエアのタコガール兼佐久間まゆちゃん・北条加蓮ちゃんのプロデューサーの@hiroki_tanakaです。
本記事では私が今年1年間実践してきたアウトプット駆動開発に関して振り返ります。
丁度1年前の自分がこんな記事を書いていたので、アンサーソング的な意味合いも込めて笑
tech.toreta.in

アウトプット駆動開発とは

私は2020年の目標に「インプットとアウトプットのスループットを良くする」を設定しました。
この目標を立てた理由はここ1~2年程全く外部へのアウトプットを怠っていた結果、エンジニアとしての成長曲線が止まってしまった感覚があり、その成長曲線を再度動かしたかったためです。
そこでアウトプットを自発的に増やすためにアウトプット駆動開発を導入してみました。
アウトプット駆動開発を一言で言うと、アウトプットする前提でインプットするというマインドセットです。

一般的なメリットとして、以下のようなことが挙げられます。

  • アウトプットを意識することで、注意深くインプットするようになり体系的な理解に繋がる。
  • アウトプットに対するフィードバックやコメントをもらうことで、より深く学ぶ事ができる。
  • 数年後の自分が簡単に振り返ることができる。

そのため、私は具体的には業務・業務外問わず学んだことはすぐに何らかの形でアウトプットして発信していくこととしました。
アウトプットの形は様々でトレタテックブログQiitaでの技術記事投稿から、社内勉強会での発表・社外勉強会のGotanda.rbでの発表という社内外での発表もありました。
他にもトリッキーなものだと読んだ本の書評をAmazonレビューを書いたり、資格取得をしたり、社外の友人と技術書典に合同誌を出品したりしました。

ただ、私はSNSを殆どやっていないのでそこからの発信は全くしていなかったです。
そのため、アウトプットの拡散力という意味では正直イマイチでしたが、バズることや有名になることが目的ではないのでそこはあまり気になりませんでした。
(今思い返すとSNSを効率的に活用した方がよりフィードバックは得られたかもです。)

実践したこと

そんな今年一年のアウトプット駆動開発の成果ですが、下記の通りです。

  • トレタテックブログの記事投稿:4記事
  • Qiitaの記事投稿:8記事
  • Amazonへの書評レビュー:9レビュー
  • 技術書典への出品:1冊
  • 社内勉強会での発表:5回
  • 社外勉強会での発表:3回
  • 資格取得:1資格

改めて数字として数えてみると「よくやったなぁ…」というのが率直な感想です笑

これらのアウトプットは勿論、どこかの月にまとめて行ったという訳ではなく、1年間を通じて満遍なく行ってきました。
強いてあげれば、上半期はQiita・トレタテックブログ・Amazonへの書評レビューといった記事投稿がメインでしたが、下半期は社外勉強会での発表がメインでした。
おそらく、これは最初は記事投稿といったある種、一方通行なアウトプットで満足していたのですが、 徐々にアウトプットした際に見てくださった方からのフィードバックというインタラクティブなコミュニケーションが恋しくなったためです。

発表に関してはネタがなくてもまず「発表します」と手を挙げることを常に意識していました。
挙手してからネタを考える方式だったので、発表1~2週間前は毎回「ネタどうしよう…」と悩んでいました。
今振り返るとこの挙手してからネタ考えるというのは、アウトプット駆動開発に非常にマッチしていました。

実践して感じたこと

1. 学んだ技術の深い理解

記事や発表共に何かしらのネタが見つかると色々試行錯誤しながら、記事や資料を作っていきます。
外部へのアウトプットを意識すると「外部に発信するのだから、下手なこと言えない…」という気持ちにもなり、丁寧に調べるようになりました。
そうすると自然と今まで自分が知らなかったことや曖昧なままの何となくの理解だった部分もしっかり理解出来るようになりました。

例えば、私は下記の発表をするまでRailsの権限管理に関して断片的な知識しかなかったのですが、まとめていく中で体系だった知識が身につきました。

また、よく言われることですが、勉強会は発表者が一番勉強になるということを身に沁みて実感しました。
下手でも聞く側にいるよりも発信する側にいる方が断然良いです。

2. わかりやすく説明できる力の向上

記事でも発表でも自分の学んだこと・経験したことを読み手や聞き手にわかりやすく伝わるように論理立ててまとめる必要があります。
勿論、普段の業務の中でも例えば、Pull Requestの概要や仕様のまとめドキュメントなどわかりやすく伝えるといったことを心がけることはありますが、
あくまでも社内の人は前提や背景を知った上で読み取ってくれる部分も正直、小さくはないです。

しかし、外部の人は前提や背景を一切知りません。
その人たちにわかりやすく伝わるように私は以下のことに気をつけました。

  • 「自分が知ってるのだから、相手は絶対知っている。」という思い込みを捨てる。
  • 言葉だけで説明せずに、サンプルコードを適度に使用する。
  • 記事で伝えたいことや発表で話したいことを最初に書くようにする。また、伝えたいことも最大3つまでに絞る。

このような工夫を行った下記の発表は「わかりやすかった」というフィードバックを頂けて、かなり嬉しかったです!

3. 高いモチベーションの維持

1人で粛々と勉強していてもモチベーションを維持するのはとても難しいです。
(勉強の最大の敵はモチベーションの維持だと思っています。)

しかし、外部にアウトプットすると記事の場合はLGTMやスターが・発表の場合は聴衆からのフィードバックが貰えるようになります。
これがモチベーション維持に役立ち、「自分の記事が誰かの役に立っているんだ!」や「発表後に活発な議論が起こったということは皆気になってたんだ!」と感じることが出来、かなり励みになりました!

また、アウトプットすると自分の理解が深まると同時に、自分の知らなかったことも見えてくるので次はこういうことを勉強しよう・やってみようと思い、それがまたモチベーションUPに一役買いました。

まとめと今後

総括するとアウトプット駆動開発を通じて、成長速度は2段階くらいギアが上がったように感じたので、やってみて本当に良かったです! そのため、来年もアウトプット駆動開発は続けていきます!

今年は上期は記事投稿中心・下期は発表中心のアウトプット媒体のバランスが悪かったので、来年は記事投稿と発表をバランス良く両立させていきたいです。
そして、外部での発表は社外勉強会だけではなくより大きなカンファレンスなどでも登壇したいです。
勿論、勉強会での発表も続けていきたいです!

また、自分が発表するだけでなく、他のエンジニアが発表出来る場も提供出来るようになりたいです!
(このアドベントカレンダーもその1つです!)

終わりに

正直に言うとアウトプット駆動開発はやっぱり、かなりしんどくて「休日なんだから、ダラダラしたい…」といった誘惑や「こんな記事書いても誰も見てくれないでしょ…」といったネガティブ感情に囚われたことは数え切れません。
ただ、業務と同じで発表(・ものによっては記事投稿も)は発表日という明確な締切があり、かなり強制力が働くのでかえって良かったのかなと思います。
おかげで継続する事ができ、1年間のアウトプット駆動開発を通じて圧倒的成長することが出来たと胸を張って言えます!
これからもこの2つの言葉を胸に来年も邁進していきます。

インプットは必要、でも差別化要因にならない。
しかし、アウトプットすることで差別化になる。
~@yukihiro_matz~


自分と同じくらいの能力がある人間はいくらでもいる。
学び続ける姿勢を止めればかつての恐竜と同じ末路をたどることになる。
~『プログラマが知るべき97のこと』~

プログラマが知るべき97のこと

プログラマが知るべき97のこと

  • 発売日: 2010/12/18
  • メディア: 単行本(ソフトカバー)

終わりの終わりに

トレタに少しでも興味を持っていただいた方がいれば、ぜひ遊びに来てくださいヾ(o・ω・)ノ
仲間も募集しています!

トレタにJOINして勉強になったRailsに関する3つを紹介

この記事はトレタ Advent Calendar 2020の22日目の記事です。

はじめまして。2020年3月からJOINしたサーバーサイドエンジニアをしている @shiroemons です。

Appleから AirPods Max が発表されて、SonyのWH-1000XM4を即購入して、ノイズキャンセリング機能と2台の機器に同時接続できるマルチポイント機能に感動している今日このごろです。 マイク性能に関しては、手持ちのAirPodsの方が良さそうなので、ビデオ会議の時は切り替えが必要なのが残念ポイントでした...

本日は、私がトレタにJOINして、勉強になったRailsに関する3つを紹介します。

config/routes.rb のファイル分割

1つ目は、巨大になりがちなルートファイル(config/routes.rb)を複数のファイルに分割するTipsです。

↓でconfig/routes.rbにdrawメソッドを追加することでルーティングの内容を別ファイルに分割できるようになります。

# config/routes.rb
class ActionDispatch::Routing::Mapper
  def draw(routes_name)
    instance_eval(File.read(Rails.root.join("config/routes/#{routes_name}.rb")))
  end
end

Rails.application.routes.draw do
  draw :admin
end

# config/routes/admin.rb
get :foo, to: 'foo#bar'

DHHのgistもあります。

こちらは、Rails 4.0がリリースする前に一度取り込まれた機能になりますが、revertされました。 ところが、最近リリースされたRails 6.1で、この機能が復活しました🎉

Rails 6.1からは、今回のTipsは不要になります。

# config/routes.rb
Rails.application.routes.draw do
  draw(:admin)
end

# config/routes/admin.rb
get :foo, to: 'foo#bar'

Rails Guidesもすでに用意されています。(日本語はまだかな)

guides.rubyonrails.org

ルートファイルを分割したい場合は、試してみてください!

APIドキュメントツール apipie-rails

ここ最近のRailsの役割は、APIで利用されることが増えてきました。 必要になってくるのは、エンドポイントは何で、どんなパラメーターが必要で、どんなエラーが発生するのかなどのドキュメントが大事になってきます。

そこで重宝されるのは、REST API向けのドキュメント生成ツールのapipie-railsです。

github.com

ここでは、設定方法などは省略します。設定方法などは、GemのREADMEをご参照ください。

コントローラーのメソッドの上部に、HTTPメソッドやエンドポイント、パラメーター、エラーなどの説明を記載することで簡単にAPIドキュメントが残すことができます。 学習コストが少なくすぐに利用することができます。

サンプルコード

class UsersController < ApplicationController
  before_action :set_user, only: [:show, :edit, :update, :destroy]

  api :GET, '/users', 'ユーザ一覧を返します'
  def index
    @users = User.all
  end

  api :GET, '/users/:id', '指定したIDのユーザー情報を返します'
  param :id, :number, require: true, desc: 'ユーザーID'
  error code: 404, desc: 'Not Found'
  example <<-EOS
  {
    "id": 1,
    "name": "hoge",
    "created_at": "2020-12-17T05:23:18.135Z",
    "updated_at": "2020-12-17T05:23:18.135Z",
  }
  EOS
  def show
    #...
  end
  
  #...

画面キャプチャ

f:id:shiroemons:20201221164343p:plain
サンプル画面

このような、ドキュメントが簡単に生成することができます。

apipie-railsは、Swagger形式(OpenAPI 2.0)のJSON出力が可能です。

rake apipie:static_swagger_json

GemのREADME にも記載があるので参照してみてください。

APIドキュメントの管理は、苦労したことがあるので簡単に生成できるのでとても感動したので、紹介してみました。

コールバッククラス

Railsを運用していくとどうしてもコールバック処理が煩雑かつ、複雑になりがちです。 そんな時は、Railsガイドにも載っているコールバッククラスを利用します。

railsguides.jp

サフィックスにDispatcherを付けてコールバッククラスを利用しています。 主な用途としては、複数のモデルから共通の非同期処理を行う Worker の呼び出しに使用しています。

以下は、店舗の席情報に変更が行われた際、非同期処理で席在庫を再計算するサンプルコードです。

# app/callbacks/restaurant_table_stock_manager_dispatcher.rb
class RestaurantTableStockManagerDispatcher
  def after_commit(record)
    rebuild_stocks_async(record)
  end

  private

  def rebuild_stocks_async(record)
    # 非同期処理(Worker)呼び出し
  end
end

# app/models/restaurant_table.rb
class RestaurantTable < ActiveRecord::Base
  after_commit RestaurantTableStockManagerDispatcher.new, on: [:update]
end

このようにafter_commit等のコールバックに対応するメソッドをパブリックメソッドとして定義します。 引数にはコールバックを呼び出すキッカケになったオブジェクトが渡されます。

コールバッククラスは、コールバック処理すべてをコールバッククラスにするのではなく、 複数のモデルで同一の処理を行う場合や、複雑な処理を行っているものなどの機能単位に切り出せるものに留めておくのが良いかと思います。

コールバッククラス自体は、目新しいものではありませんがバリバリ活用していたので、紹介したかったところです。

おわりに

1つ1つは、目新しいものではないですが、実際に利用し活用していますよという発信の意味を込めて紹介してみました。

トレタに少しでも興味を持っていただいた方がいれば、ぜひ遊びに来てください! 仲間を募集しています!

corp.toreta.in

© Toreta, Inc.

Powered by Hatena Blog