2026-06-04

株式会社 kubell を退職しました

はじめに

株式会社 kubell を 2026-05-29 (金) に退職しました。 2014-04-01 (火) に入社したので、12 年近く働いたことになります。

kubell は、ビジネスチャット・サービス Chatwork を開発・運営する会社です。 入社当時は ChatWork 株式会社という社名で、2018 年 11 月に Chatwork 株式会社 (Work の W の文字が小文字に)、2024 年 7 月に株式会社 kubell に社名を変更しました。 私はそこで iOS アプリエンジニアとして働いていました。

kubell 在籍中、印象深かったイベントがいくつもあります。 いくつかをピックアップしてふりかえることで、退職エントリーとします。 なお、本エントリーで触れているコードネームや内部事情については、会社ブログや YouTube で既に言及されているものばかりで、社外秘情報はありません。

2014-04 入社

2014-02-14 (金) は体験入社二日目。 技術部メンバーの前でプレゼンが予定されていました。 ところがその日は東京大雪。 まさかのリモート・プレゼン。

手元にあるのは小さな個人所有の MacBook が一台。 外付けディスプレイはなし。 画面共有を開始すると、ビデオ通話側の画面を隠さないとスペースが確保できません。 画面先のエンジニアの反応が全く分からない中、プレゼンを行い、運良く合格をもらうことができました。

入社初日の 2014-04-01 はなんとオフィス移転日。 池尻オフィスから合羽橋オフィスへの引越作業を、右も左も分からないまま手伝いました。 というわけで池尻オフィスで働いた (?) のはたった一日。 二日目からマシン設定等を始めて、私の新天地での仕事が始まりました。

2014-04〜2014-06 Eiger 開発

2014 年当時、Chatwork iOS アプリは Titanium SDK で実装されていました。 Titanium は JavaScript で iOS/Android のクロスプラットフォーム・アプリを作れる SDK です。

この手のクロスプラットフォーム開発用 SDK は、シンプルな画面を作るだけなら高速な開発成果が得られてとても良いものですが、iOS 特有の機能を使おうとしたり、少し手のこんだ仕様を実現しようとしたり、デバッグを行うとすると躓くポイントがたくさんあって、逆に開発スピードが遅くなってしまうことがありました。

Chatwork iOS アプリもその問題に直面し、Objective-C によるネイティブ実装に舵を切ります。 開発コードネームは Eiger。 アルプスの三大北壁の一つ、アイガー北壁を持つ山 Eiger です。 「難易度の高いアイガー (北壁) を攻略しよう」。 そんな意気も込めてのコードネーム設定だったと聞きます。

私はコードネームが決まって、開発が始まる直前にモバイルチームにジョインしました。

Chatwork iOS アプリの開発経緯などは、技術イベントで軽く触れられているので興味があれば見てみてください。

2014-05 シリコンバレー研修

iOS アプリ刷新プロジェクト推進の裏では、サーバーに刷新プロジェクトも動いていました。 イケイケです。 そんなことも追い風になったのでしょうか? 社員にシリコンバレーの雰囲気を知ってもらいたい、と言う話が出てシリコンバレー研修の予定が組まれました。

とは言っても社員全員が一勢に行くわけにもいかず。 いくつかのグループに分かれて向かうことになりました。 最初は○○チーム、3 番目は□□チームという具合です。

私たちモバイル開発チームは 2 番目に出発。 チームメンバーは私を含めて 4 人でした。

当時の ChatWork 社はアメリカに支社を持っていて、社長の山本敏行氏はシリコンバレー・オフィスを拠点にしていました。 時々日本には帰国していたものの、彼の主戦場はアメリカでした。 なので、私にとっては初めて社長に会う旅でもありました。

シリコンバレー研修。 一緒に行ったメンバー、ChatWork US 支社で会ったメンバー。 全員、もう辞めてしまいました。 ちょっと淋しいです。

2015-08〜2015-12 Scala を触る

先にも少し触れましたが、Eiger 開発と並んでサーバーの刷新プロジェクトも進んでいました。 PHP で書かれているサーバーのソースコードを、Scala で書き直そうというビッグ・プロジェクトです。 Eiger もこの Scala 版新サーバーで動くことを前提に実装が進みました。

Scala 選定に関しては、私の入社前に決まっていました。 開発合宿をやって決めたそうですよ。

そんな Scala サーバーですが、どうやら開発が遅延気味。 相談が持ちかけられたのは、たしか 2015 年 8 月の後半だったように思います。 上長がミーティングをしたい、と言ってきました。

しかし、オフィスのミーティングルームは全て埋まっています。 上長は大阪オフィス在籍で、なにかの用事で東京は合羽橋オフィスに来ていました。 つまり、大阪に戻る新幹線の時間があります。 悠長に会議室が空くまで待つわけにもいきません。

仕方がないので、近くの喫茶店で話すことになりました。 合羽橋に来たことがある方ならご存じと思いますが、合羽橋には喫茶店がほとんどありません。 そんな私たちの光明が喫茶店・合羽橋珈琲 (2016 年 8 月閉店)。 テーブルとテーブルの間が少し離れているので、ちょっとした小話程度なら良い感じにできるお店です。 ところが、その日に限ってお店は満席。 上長の新幹線の時間が迫ってきます。

8 月の日差しの中、トボトボ歩く二人。

道の先に見える自動販売機。

二人で缶コーヒーを買い、道の縁石に座って…

「サーバーが遅れてるんだよね。プッシュ通知回りの実装でヘルプに行ってもらえる?」

「モバイルチームで Scala を新しく学んでサーバーのコードを書けそうな人間、ぼくくらいしかいないですねぇ。行きます。」

それで Scala の最低限の勉強をして、サーバーのコードを書くことになりました。 あ、でも、もう 10 年近く前のことなので Scala の書き方はきれいさっぱり忘れてしまいましたね。

2016-01 サーバープロジェクト・キャンセル

サーバーの完成も近づいた 2016 年 1 月。 初めての iOS アプリとサーバーの疎通確認が行われました。

そして、上手くいかなかったんですね。

いろいろと手を尽くしたと思うのですが、無念のサーバープロジェクト・キャンセルとなりました。 サーバーのあれこれ顛末については、Podcast で放送されています。 もしお時間があれば、聞いてみてください。

サーバーキャンセル。

つまり、私が半年近く関わった Scala のコードも土に帰りました。

ショック。

開発を続けていればそういうこともあります。 一応、仕様とかフローチャート図とかは PHP の開発チームに引き継がれて実装が行われました。

2016-06 Eiger リリース

サーバープロジェクトはキャンセルされましたが、Eiger プロジェクトは止まりませんでした (ホッ)。

4 月末にはプッシュ通知回りの最終テストを実施。 バグが見つかって、ゴールデンウィーク返上でバグ修正。

iOS アプリ側でバグがないことを確認したので、PHP のソースコードを確認。 2 つのバグが相補的に不具合を引き起こしていたことを突きとめた時には、PHP エンジニアと一緒になって喜んだものです。

これが最後の大きなバグでした。 最終結合テストを経て 2016 年 6 月、ネイティブ版 iOS アプリがリリースされたのでした。

2016-12 メッセージID 枯渇問題

2016 年 12 月 29 日。 真夜中に 7 時間かけてサーバーのメンテナンスが行れました。

32 bit だったメッセージ ID の型を 64 bit に拡張するためのメンテナンスです。 このプロジェクトはサーバーチームが半年以上の入念な準備を整えて行われたものです。

なので、iOS エンジニアである私はほとんど関わっていません。 ただ、メンテナンス終了後の動作確認。 これは各クライアントチームが行う方が良い、ということで最後だけ参加することになったのでした。

東京在住のエンジニアで集まれる人は全員、当時の合羽橋オフィスに集合。 午前 0 時からの経過を見守り、少しトラブルはあったものの、最終的には無事リリース完了。 各クライアントチームが検証を行い、全てのテストをパスして、メンテナンスは終了となりました。

真夜中にオフィスに集まって、サーバーチーム・クライアントチームが混合で作業をした経験は、12 年の在籍期間中、後にも先にもこの一回限りです。 それだけに、とても印象深く記憶に残っています。

2017-11〜2018-05 Mauna Loa 開発

Eiger リリースでフルネイティブ化した Chatwork の iOS アプリですが、保守状況は必ずしも順風満帆というわけには行きませんでした。 その要因の一つは、サーバープロジェクト・キャンセルによる API 変更が上げられるかと思います。 Scala で用意された新 API を使う予定だったのに、急遽 PHP サーバーの旧 API を使うことになったため、Eiger 開発の終盤では腐敗防止層を導入して API の変換を行う仕組みを導入しました。 この腐敗防止層のおかげで Eiger リリースは最小の変更期間でリリースができたわけですが、その代わり新規開発への技術的負債になってしまいました。

折しも Swift 言語が iOS 業界でもメジャーになっていた頃。

Swift 化とリアーキテクチャーを行うプロジェクトが始まりました。 それが Mauna Loa。 Mauna Loa はハワイにある山の名前です。

Chatwork の iOS アプリには「山の名前」のコードネームを付ける、という伝統がありました。 ルールは一つ。 新しいコードネームには、より高い山の名前を付けること。

チームメンバーで Eiger より高い山をリストアップし、あれでもないこれでもないと話し合いをしました。 その中で持った共通認識が一つ。 Eiger より登りやすい山を選ぼう。

Eiger 北壁は難度が高すぎました。 Eiger の開発はその難度の高さから、iOS エンジニアの心を折っていたのです。

そこで選んだのが Eiger (標高 3,970 m) より 199 m 高いハワイの Mauna Loa (標高 4,169 m) でした。 画像検索ができるようなら是非 Mauna Loa を見て欲しいのですが、Eiger より高い山だというのになだらかな山だと思いませんか? これなら登れるよね?! という期待を込めて、コードネームが決定したのでした。

後日、Android エンジニアの方が Mauna Loa のアイコンを作って下さったのですが、なぜか Mauna Loa から溶岩が流れていました。 さすがに噴火中の Mauna Loa には登れませんよ? と思ったのはここだけの秘密です。

2018-11〜2021-04 AST プロジェクト

Chatwork の iOS アプリ開発プロジェクトの中で、「iOS 担当が私一人」なプロジェクトのうち「最長」の開発期間だったのが AST プロジェクトです。 2018 年末からコードを書き始めて、途中準備待ちとか別プロジェクトへの緊急ヘルプとかで開発が休止することもあったのですが、約 18 か月開発に費やしリリースにこぎつけました。

内容は Chatwork 内で使われる独自記法 (Chatwork 記法) を iOS・Android・Web で統一仕様にしようという試みです。

まず Chatwork 記法のパーサーを赤津氏が開発。

そして、パーサーが出力する AST (抽象構文木) に対して、タイムライン表示用の描画・メッセージ入力欄での編集用描画・コピー & ペーストの対応を私が行いました。 表示用の描画だけでコーディングに半年かかったのですが、その内 info トークンの描画実装についてはブログ記事に起こしています。

このプロジェクトを進めるに当たって、Chatwork 記法描画・編集・コピペの設計をほぼ一からやり直しました。

開発中、私は自分に一つ縛りを設けました。 それは「旧設計での描画」と「新設計での描画」の違いにユーザーがなるべく気づかないようにする、ということです。

Chatwork 記法の見た目の仕様を変えるプロジェクトではないので、ユーザーに気づかれないことが好ましい。 そんなちょっと変わったプロジェクトでした。

もちろんそれは表向きのことです。 細かな所に目を向ければ、行間が大きかったり小さかったりでガタガタした見た目が直っていたり、引用線が無駄に長かったのが短くなっていたり、絵文字の位置調整が正確になっていたり、長〜いメッセージへのケアが入っていたり、メッセージの範囲選択にあった諸々のバグが修正されていたり。 山のような改善と不具合修正が入っています。

言い換えると、「何が変わったのか分からないけど、何か使いやすくなった」と言ってもらえることを目指して開発しました。

リリース後、全くバズりませんでした。 狙い通りと言えば狙い通りなのですが、それはそれでモヤっとするのは私の器の小ささでしょうか?

2020〜 コロナとリモートワーク

2020 年にコロナが流行して、会社はフルリモートワークに舵を切りました。

この頃、kubell の社員数は 100 人を越えるくらい。 入社時点で 30 人程度しかいなかったこ とを考えると、社員数が急拡大していました。

採用するエンジニア層も即戦力の中途採用オンリーから、ジュニア・エンジニア、第二新卒、そして新卒受入れへと幅が広がりました。

結果、新入社員のサポート的な仕事も増えました。 と言ってもリモートワークが推進される時分です。 机を並べてサポートするわけにも行きません。

この頃、個人的な試みで成功したなぁと思ったのが、「Google Meet 繋ぎっぱなし」作戦です。

  1. 私が特定の Google Meet に入りっぱなしにしておく (マイクとカメラはオフ)
  2. 新入社員が質問なり相談なりしたくなったら、その Meet に入って声をかける
  3. 声が聞こえたら、私の方でマイクとカメラをオンにしてお話をする

こんなシンプルな仕組みです。

質問・相談があればチャットで投げれば良い。 文章コミュニケーションで足りなければ、改めて Google Meet で話せば十分。 という反論も聞くのですが、新入社員にはその最初のチャットを書くハードルが高い? 質問・相談内容が明確なら良いのですが、新入社員だと、何が分からないのかが分からない状態だったりもするようで。

オフライン・コミュニケーションだと隣にいる先輩の手が空いていそうなら、すいませんと声をかけるところでしょう。 その気安さがリモートワークだと作りづらい。

「Google Meet 繋ぎっぱなし」作戦は、リモートワークに少しだけオフライン・コミュニケーションの気楽さ・気安さを取り込めた良い試みだったと思っています。

この試みは、バーチャルオフィス・サービスが会社に導入されたことで、そちらで続けることになりました。

2026-05 退職へ

色々思うところがあって、2026 年 5 月 29 日付をもって株式会社 kubell を退職をしました。

写真は最終出社日に撮影したオフィスビルです。

転職先はまだ決まっていません。 iOS エンジニアとして働き続けたいと思っています。 もし私に興味のある企業さんがいらっしゃいましたら @at_aka に DM 頂ければ幸いです。