About Me
「人間は人間がやるべき仕事に集中しよう」が最近のコンセプト
Whois
フリーランスで活動しているバックエンドエンジニアです。メイン言語は Go で生産性への寄与が好物です。
ドメイン駆動設計やコード生成技術を軸に、ビジネスへの高い駆動力と高い生産性を両立することを強みとしています。
最近は個人でシステムトレード開発をしていることもあり、公私ともにサーバレスなデータパイプラインの構築などを行うことが増えています。
- 氏名:堀 良太(Ryota Hori)
- Twitter:https://twitter.com/hori_ryota
- GitHub:https://github.com/hori-ryota
- ブログ:Hori Blog ( https://hori-ryota.com/ )
- YOUTRUST:https://youtrust.jp/users/hori
スキル
Go
2015 年くらいからメイン言語として活用しています。
最近は機能開発よりも初期構築や開発フロー周りに注力し、開発生産性に寄与することを好んでいます。
複雑になりがちな非同期処理を Go の特性を活かしてシンプルに表現することも得意分野なので、高パフォーマンスが必要な機能や複雑化したフローに携わることも多いです。
非同期処理で荒れがちな channel の使い方や、sync 系パッケージについて
アプリケーション開発以外で面白そうな経験だと、動画系サービスの開発で必要になりプロトコルレベルの実装を RFC を読みつつ行っていました。
内容は非公開なので言及できませんが、その後も RFC から実装を起こす業務は何度か行っています。
デファクトスタンダードである RTMP(動画のプロトコル)と H.264(動画のコーデック)で実用レベルの実装がなかったため自作。(README の整備をサボっていますが本番導入済み)
Go でのアプリケーション開発は「手が疲れる」と表現することが多いのですが、記述量が増える傾向にあります。Go の思想による恩恵とのトレードオフではあるのですが、記述量の多さから妥協の誘惑に駆られ、トレードオフの比重が設計の妥協に寄りがちな場合もあるかと思います。
開発生産性の向上に寄与する一環として、定義やディレクティブを元にしたコード生成、protoc のプラグイン整備によるコード生成、など「手が疲れる」ところのシステム化を図ることも得意です。
generator 芸の一部
TypeScript
最近は UI も含めた少人数での monorepo 開発などの機会が増え、TypeScript を利用することが多くなってきました。
内部システムなど開示できない話が多いですが、出せる範囲で記載します。
SSG による高パフォーマンスな Web サイト構築
Node.js によるデータパイプライン構築
- Stream を利用してメモリ使用量に配慮したパイプライン
- AWS Lambda を活用した可用性の高いサーバレス構成
- Step Functions や DynamoDB を活用した AWS の無料枠での超低コストデータ基盤
Next.js を使用したアプリケーション構築
- Server Components, Server Actions など最新(2023-07-13 時点)の技術を活用したアプリケーション構築
- AWS Lambda を活用した可用性の高い超低コストサーバレス構成
- Amazon Congnito などによる認証認可管理
- UI Framework を使用した「使いやすい」管理画面
- 最近は Mantine を好んでいます
データのビジュアライズ
- Highcharts によるグラフ化
基本的な思想として Zod でスキーマ定義をし型安全に寄せることを好んでいます。
デザイン及び UI 周りはほぼ触らないです。UI Framework を利用するか、他の人に協力してもらいます。
Python
株のシステムトレード開発を趣味としていることもあり、ML モデル開発やデータ分析にちょこちょこと利用しています。
AWS
最近はサーバレス系を扱うことが多く、Step Functions や Lambda、DynamoDB、S3 らへんを活用することが多いです。データパイプラインの構築では Kinesis Stream や Event Bridge もよく利用します。
大規模なデータ処理では Batch や Fargate も使用しています。基本的には運用負担を最小限にしやすい(状態を長期的に持たない、冪等性を保ちやすい、など)ものを優先して活用するように意識しています。
ライブ配信サービスを開発していた時代は Aurora、ECS、EC2、CloudFront などもそれなりの規模で扱っていたと思います。
GCP
基本的には AWS を用いることが多いのであまり知見はないです。業務先で使っていることも度々あり、また機械学習で TPU を用いたい場合は利用しています。
Cloudflare
で使用しました。
開発環境に認証機構を設けやすいのが便利なので、UI を提供する Web サイトやアプリケーションでは今後も積極的に利用する予定です。
Terraform
プロビジョニングツールは Terraform を用いることが多いです。
プラットフォームを横断して管理できること、CloudFormation 等に比べアプリケーション用リソースの管理がしやすい(ソースコードと併せて凝集度を高めやすい)のが多用していた要因でしたが、最近は CloudFormation 等も使い勝手が良くなってきたのでこだわりは薄くなってきました。
コンテナ技術
2015 年〜2019 年ごろはライブ配信サービスを全てコンテナ化して運用していたのでそれなりに使い込んでいたと思います。2018 年ごろに ECS から Kubernetes への移植も行ったのでそれなりに色々と理解できているはず。
一方で、当時は挑戦的に活用していたものの最近は Kubernetes の運用負担が見合わないプロジェクトに携わる事が多く、コンテナ技術は必要に応じてスポットで活用(AWS Fargate や Cloud Run など)するくらいに留まっています。
キャッシュを CI で効くようにする、などの生産性向上の施策は需要も多いのでそこそこ触っています。
アーキテクチャ設計
「人間は人間がやるべき仕事に集中しよう」を掲げ、本質的な関心の領域と追従するその他の領域を明確に区別することを好みます。本質に集中できるアーキテクチャの設計と構築を妥当な範囲に収束させつつ常に改善を図るのを強みにしています。
思想としてはドメイン駆動設計に則り、概念をコードで表現することを最重要視する設計にすることが多いです。
チームの思想により比重は調整しますが、本質的でない単調な実装についてはコード生成を取り入れることも多いです。トレードオフのある手段なので、バランスを取りながら開発生産性を高く保ち、ビジネスへの高い駆動力と高い生産性を実現できるよう常に試行錯誤しています。
職務経歴
フリーランスとして活動開始(2019/06 - 現在)
2019 年 5 月末を最終出社として株式会社サイバーエージェントを退職し、フリーランスとして活動を開始。
5/31を最終出社としてサイバーエージェントを退職します。
— hori (@hori_ryota) May 31, 2019
某子会社立ち上げ、FRESH立ち上げ、新規ライブ配信サービス立ち上げ、OpenSaaS Studio、全社施策、色々と経験を積めました。
今後はアーキテクチャ設計を強みとしてフリーランス的に活動していく予定です。今後ともよろしくお願い致します。
2022 年 12 月まで Japan Digital Design 株式会社での勤務と兼業していたが、2023 年より専業。
サービスドメインは何でも楽しめる性分なのでこだわりは薄く、どちらかといえば得意とする開発生産性の向上に貢献できそうなものを優先することが多い。
過去の案件のドメインは子育て支援系、フードテック系、金融系、美術系、旅行系、教育系など。
業務内容は既存プロジェクトへの参画、初期構築、データ基盤構築、開発生産性の向上施策など。Go を用いるプロジェクトに開発業務を中心に携わることが多いが、合意の上で Go 以外の領域にも手を出すことが多め。
まずはざっくばらんに困っていることを相談していただき、費用対効果の高いところから手を付けつつ中長期的な携わり方を探っていくスタイルを好んでいる。
Japan Digital Design 株式会社:(2019/06 - 2022/12)
2019 年 6 月より業務委託で稼働開始、2019 年 8 月より入社。週の半分前後の稼働でも入社可としていただいたので、フリーランス活動と兼業で入社させていただいた。
初期は Go でのサービス開発を行っていたが、途中からはデータサイエンティスト等と連携することが多く、また様々な事情もあり TypeScript や Python を用いることが多かった。
公開していないプロジェクトばかりなため詳細は省略。
株式会社サイバーエージェント:OpenSaaS Studio(2019/03 - 2019/05)
「人間がやるべき本質的作業だけに注力しよう」を広く展開すべく、OpenSaaS Studio に参加。
参考:OpenSaaS Studio - 強い SaaS を作り続ける OpenSaaS Studio の挑戦 - Speaker Deck
「Development Productivity Team」にて、Slack Bot システムなどを制作。「モチベーションを表現すれば Slack、CLI、AWS Lambda、API といった各種インターフェース層などが自動生成される仕組み」など。
株式会社サイバーエージェント:新規ライブ配信サービスプロジェクト(2018/10 - 2019/02)
テックリードとして新規ライブ配信サービスプロジェクトに参加。最終的には方針転換に伴い開発中止となった。
拡張性や可変性も高い巨大プロダクトを少人数かつ短期間で作成する必要があるため、開発方針は「人間がやるべき本質的作業だけに注力しよう」 とし、DDD、Kotlin Multiplatform、自動生成技術などを採用した。
下記のような「熟慮したい高価値な本質的作業」のみをモチベーション通りに実装していけば、他の関心が薄い実装(やドキュメント)は自動生成する見込みだった。
- ドメイン概念の表現
- アプリケーション概念の表現
- View 層(UI とそれに伴う柔軟な取得処理)
- ビジネス価値の高い技術的詳細(動画プロトコルの実装など)
参考:成果物の一部
- DDD がしたいので Go の Accessor を go generate する go-genaccessor を作った - Hori Blog
- DDD するのに Go でも required を表現したくて go-genconstructor を作った - Hori Blog
- 表現力の高い Go の Error 群を go generate する go-generror を作った - Hori Blog
- hori-ryota/go-genappevent
とにかく「人間がやるべき本質的作業だけに注力しよう」「実装=モチベーションを自然に表現するだけ」にこだわり抜き、高い生産性を実現していた。
株式会社サイバーエージェント:FRESH LIVE(ライブ配信サービス)(2015/04 - 2019/05)
2015 年 4 月よりライブ配信サービス立ち上げに初期メンバーとして参加。最初期のミッションとして配信フロー構築を行い、その後も主担当として運用していた。
2015 年時点では業界内でもインターネット生放送の知見が少なかったこともあり、検証や実装とともに積極的な情報公開なども実施した。
参考:やんちゃな HTTP Live Streaming トラブルシューティング集 - Speaker Deck
初期構築後は動画周りの拡張に主軸を置きつつ、横断的に全バックエンド領域への遊軍的な特務ミッションを実行することが多め。
ECS から Kubernetes への全移植や動画サービスならではの技術的課題解決を通し、特に Go 言語、Kubernetes、動画技術周りはそれなりの経験を積めたと自負している。
2018 年の秋頃より開発リーダーを引き継ぐ。
株式会社サイバーエージェント:バイラルメディア開発(2014/04 - 2015/03)
新卒 5 人によるサービス及び子会社立ち上げに技術リーダーとして参画。 バイラルメディアの新規立ち上げでは CMS や各種ツールなども自作で行い、三週間での短期リリースを行った。
インフラレイヤーの構造はシンプルだったため、RethinkDB を使うなど適度な技術的挑戦を行った。
子会社の方針転換に伴いサービス終了、技術チーム解散。
株式会社サイバーエージェント:ファッションアプリ開発(2013/06 - 2014/03)
内定者 5 人による画像投稿型のファッション SNS アプリの開発。 入社に伴い運営終了。
株式会社サイバーエージェント:人事システム開発(2013/03 - 2013/06)
Geppo という HR テックサービスを開発リーダーとして初期リリースまで担当。
やっていきたいこと等
志向について
技術的なスペシャリストとして百人力、千人力となれるよう追求していきたい。
腰軽くプロトタイプを作るよりは重量級のアーキテクチャ設計の方が得意。継続的に価値を生める仕組みに興味が強い。
価値を提供したい人の障壁を可能な限り取り除き、武力を提供したい。
チームマネジメント等について
基本的にはマネージャーではなくスペシャリスト志向。周りへのポジティブな影響やチーム成果への意欲は強く、自発的に行動する性分だが、マネージャーという職務で責任を負うことへの意欲は薄い。特にネガティブな人の成果や成長にまで責任は負わない方針。
あくまで自発的な振る舞いとしては積極的に価値提供を図っていきたい。
懸念事項
- 英語は弱い。ドキュメントを読んだり翻訳ツールの補助を借りてのやり取りはできるが、チャットや口頭でのコミュニケーションは厳しい
- 記憶力と想起力が弱めなので即答でのコンサル業は苦手。下調べや確認の時間をいただいた方が効率よく価値提供が可能