八発白中

はてなブログに引越しました。

近況

ポケットチェンジに入社して2ヵ月が経ちました。

日々Common Lispは書いているものの、なかなか内容をブログという形式にまとめられず、かと言ってこのまま更新せぬのもつまらないので近況報告という形で残しておきます。

Lisp Meetup

3/27にサイボウズスタートアップスさんに会場をお借りしてLisp Meetupがありました。

そこで私が発表した内容自体が、私がポケットチェンジで何をやっているかになっています。

ElectronとCommon Lispを使い、その他デバイスJSON-RPCで非同期双方向通信を行うという変わったGUIアプリケーションです。

通常のWebアプリならばインターフェースはブラウザだけなのでブラウザイベントだけを考えていればよいのですが、コインを投入したり管理者が筐体のドアを開けたりなどのイベントも来るのでやや複雑なプログラム構成になっています。

こういうベストプラクティスのない複雑なプログラムはCommon Lispの得意とするところです。

Windows

苦労している点としては、実行環境がWindowsであるというところでしょうか。

IC Card Readerなどの一部のデバイスWindowsにしか対応しておらず、やむなくWindowsを使っています。

Common Lispという言語は処理系、ライブラリともどもWindowsへの対応は遅れがちで、その点も問題となることが多いです。その場合はそれぞれPull Requestを投げたりしています。

プログラムを書く以外のお仕事

プログラムを書く以外の仕事もあります。

ポケットチェンジは物理的な端末を空港などに設置するため、そのメンテナンスのために羽田空港に行ったりします。筐体ファームウェアの更新や、硬貨が詰まってしまうなどの端末トラブル、レシート用の紙の交換や、投入された硬貨の金庫ボックス交換などがあります。

自分はポケットチェンジの開発には全く関わっていないので、この手の仕事はやらない (というか中の仕組みに詳しくないから役に立たない) のですけど、「プロダクトを作る」というときにプログラム開発の占める割合なんてごく一部分でしかないのだと実感させられます。

「お前はなにができる」
 といった。
 技能のことである。単に山賊として地上に存在している、ということではなく、なんの機能で山賊として存在し得ているか、ということであった。
「男はそれが肝心なのさ。女は子を生む、それだけで地上に存在しうる、暮らすこともできる。男はそうはいかぬ」
 藤左は、手ばなをかんだ。
「技能(わざ) が要るのさ。これあってはじめて神様から地上で暮らすゆるしを得る」

ひと際不器用な僕は、せめて良いプログラムを書かねばなあ、と毎日背筋が伸びる思いで (実際は猫背に立て膝で) 開発に励んでいます。

まとめ

元気にやっております。

ちなみにポケットチェンジは積極採用していませんが、一応採用はしています。

人手が欲しいというよりもビジョンを共有できる才能ある人を採用するというポリシーのようです。なのでコネ入社が多いです。

「IT健保にしないんですか」
「したいんだけど人数が10人以上じゃないと加入できないんだよね」
「今われわれ何人ですか」
「えっと…フルタイムは6人くらい?」

早く社員が10人欲しいですね。

ポケットチェンジに入社しました

こんにちは。深町です。

年末に著しく体調を損なっていたこともあって方々に年賀の挨拶の機会を失ったまま過ごしています。旧暦では1月28日が元日だったようなので普段は旧暦で生活しているということにすると辻褄も合いそうです。明けましておめでとうございます。

さて、去年の12月に月末の退職から雇用先の募集をしました。

働く側ではなく雇う側をスコアリングするというのが上から目線で豪胆だと評価されたのか、私の交友範囲を大きく越えて見ていただいたようです。

最終的に2週間で31社からメールをいただき、数社に訪問して話をしました。

そして縁あってポケットチェンジという企業で働くことになり、2月1日に入社となりました。

ポケットチェンジとは

海外旅行をしたときに余る外貨を帰国後に電子マネーやギフト券に交換できるサービスを提供する会社です。

f:id:nitro_idiot:20170202002339p:plain

http://www.pocket-change.jp より

空港などに設置された専用のキオスク端末を使って交換できます。端末は緑色で、なか卯の券売機のようなタッチパネル式で操作するものです。

prtimes.jp

先月のRebuild.fm (Aftershow 171: Muscle Memory)でmiyagawaさんとnaoyaさんが「日本に帰ったときに日本硬貨があまる」みたいな話をしていて、「あ〜ポケットチェンジだ〜」と思っていました。

まだ従業員数が10人ちょっとのこの会社ではこのキオスク端末から設計しており、そういう意味ではハードウェアの会社です。開発当初の試作機のマザーボード3Dプリンタで作った硬貨仕分けの機構なども見せていただきました。

私が今まで働いていたWebサービスを提供する会社とは毛色が異なります。大量のリクエストをいかに高速に捌くかを課題としていたWooの開発とも違いそうです。

求職の過程

それではどうしてポケットチェンジに入社しようと思ったのか。

私が通常の採用応募ではなく雇用先の募集を行ったのは、ぶっちゃけて言うなら自分が何をやりたいのかわからなかったからです。こちらから企業に応募するというのであれば自分の知っている企業に偏りますし、前職や前々職の経歴に依ってしまいがちです。

そうではなくて、企業の大小、業種をあまり限定せずに自分が働きうる場所を知りたかったのです。そのために「こういう人材だけど、仕事ある?」というスタイルになったのです。

私が働くか決める基準は漠然と以下の3つに集約できます。

  • 仕事が面白そうか
  • 自分が活躍できそうか
  • 自分を評価してくれるか

やる仕事が楽しい、挑戦的である、というのはフルタイムの仕事として大事なことです。Railsでデータを繋ぎ合わせて画面に出すみたいなものは作る前から予想がついて面白みがありません。

それでいて自分の強みも活かせて活躍できそうなこと。これは自分の30歳手前という年齢もあるのですが、何でもやります、というよりこれまでの経験を活かして専門性の高いことを行うことを立場上も求められるだろうという意識があるためです。

そして何より、自分を正当に評価する・する気があるところで働くという強い願望がありました。これはエンジニアとしての幸福を考えるならば非常に大事なことだと長年の転職経験から学んだことです。

31通のメールというと多いように思うかもしれませんが、そのほとんどがRailsであり、ちょっと小慣れたWeb技術者に来て欲しい、以上のことはないようなものがほとんどでした。そのような企業で働いて私はエンジニアとして評価されるだろうか、と考えていました。

メールからオフィス訪問まで

その中でメールを送ってきたポケットチェンジの代表の青山さんとはLisp Meetupで一度だけ話したことがありました。そのときにCommon Lispを使いたいんだけどというような話をしたようなしなかったような、正直言うと記憶にはほとんど残っていませんでした。

一方で青山さんのほうは私のことをよくご存知のようでした。

彼が送ってきた2000字を超えるメールはいただいた中で最も詳細で、何をする企業か、会社の規模、そして私が入ったときに手伝ってもらいたい点が明確でした。また、JVM言語ではないという私の制約に対して、一部プロジェクトにScalaの部分があると明かしており誠実でした。

それでも最初の私の印象は特別なものではありませんでした。手伝ってもらいたいという箇所の中に無視できないほどの組み込みCのプログラムがあり、私の経験から言って期待されているほどに適任とも思えなかったからです。

上記の基準の、

  • 仕事が面白そうか
  • 自分が活躍できそうか
  • 自分を評価してくれるか

の2つ目の「自分が活躍できそうか」に不安があるということです。

いただいたメールには「興味があれば一度オフィスに」と書いてありました。

それに対する私の返信は少し冷たく、サービスには興味あるがそれほど入社の温度感は高くなく、入る確率は10%程度だろうけれどもそれでもよければ、という内容でした。そして、それでよいので、ということで訪問しました。

メタ会社”コイル”

けれど一転して、オフィスに伺って話を聞いてみたあとには考えが変わりました。

ポケットチェンジの実機は予想通りで驚きはあまりありませんでしたが、一方で衝撃的で興味を惹かれたのは「ポケットチェンジは子会社であり、母体企業として『コイル』というものがある」という話です。

「コイル」というのは「会社をつくる会社」です。一般的なスタートアップのように一つのビジネスを立ち上げることを目的とした組織ではなく、いくつものアイデアをそれぞれ子会社として形にしていくことを目的としています。メタ会社です。

www.coilinc.jp

ポケットチェンジはその子会社の中の一つというわけです。

コイル (およびポケットチェンジ) には少人数ながら専門性の高い仕事をする人が多く所属しています。スキルもビジネス、インフラ、ハードウェア、サーバーサイド、クライアントサイドなど多岐に渡っています。メンバー間のスキルの補完が非常にうまく行っているのかなと予想しています。

これを聞いたとき、私は前に何かで聞いたデザインファームのことを思い出していました。デザイナーが多数所属するその企業は会社というより独立した専門家が多数所属する団体であり、請け負った仕事によって必要なメンバーを集め、プロジェクトを組んで取り組むというようなものです。

ポケットチェンジの彼らが優秀であることはたった一年でサービスが動く形になっており、実際に空港に置いてサービスインする目前まで来ているということで証明できていると思います。

それぞれのメンバーも起業や売却を経験している方も多く、大人ベンチャーとして確度の高いビジネスをやっていこうという話をされていました。

私が期待されていること

そういったチームの中でどのような立ち回りを深町さんに期待するか、という話がありました。

今のメンバーの弱みとして、技術者がビジネスに寄りすぎているということを心配していました。他の企業ではエンジニアが技術ばかりにこだわって結果に結びつかないというような話ばかり聴くのに、この大人な企業は逆の悩みなのです。

その結果として全体的にビジネスを中心に話が進むようになっている、その中で深町さんのようにCommon Lispという言語にこだわるような技術志向のエンジニアは意見が対立するかもしれないけれども議論をする上で良い相手になりうるだろう、ということ。組織にとって多様性が大事であるということをよくわかっての発言だと思われます。

さらに、ポケットチェンジはハードウェアから設計をする会社であり、コイルもどのようなサービスを今後提供するかわからない、そういう会社では既にあるものを組み合わせるのではなく何もないところから物を作り上げる能力が求められる。場合によっては独自言語の設計なども必要になるかもしれない。その点、深町さんはCommon LispのWeb開発環境をHTTPパーサーやWebサーバー、Webフレームワークまで一人で作った経歴があるためぴったりだろう、ということ。

最後に、今いるエンジニアはあまりオープンソース活動に積極的ではない。深町さんのように多くのオープンソースプロダクトを公開し開発するような人材を入れて刺激とし、社でオープンソース活動をする空気が作れれば、という話。

どれも私のことをよく知っており、いかに自社に必要かということが明確でした。これほどありがたい話はありません。

それから「少し考えさせてください」と保留してから、ポケットチェンジは良さそうだと考えを改めました。早速次の週に再び訪問の機会を持って細かい条件などもすり合わせました。

その段階で、ものは試しに「Common Lispで仕事がしたい」と言ってみました。

こういうとき他の企業は躊躇するものです。

「うーん、他のチームメンバーとの連携もあるし…」
「他に使っているところがありますか?」
「採用に不利なのでは?」

などの理由を挙げて曖昧な問答になります。未知のものは怖く、そのリスクを取って、中途採用の一人に利するより既存のコードや社内に抱えるエンジニアたちのほうが大事ということもわかります。けれどここで敢えて訊いたのは純粋にポケットチェンジの本気度を知りたかったからです。

すると「深町さんを雇うのにCommon Lispを書いてもらわなければ勿体無い」と予想以上の答えをいただきました。

その場にはコイルの代表である松居さん(ビジネス担当)もいらっしゃいました。「今ある部分を全部Lispで書き直すという必要もないだろうから、これから作る部分で強みの活かせるところやどちらでも良いようなところではどんどん使って行って欲しい」と彼自身の返答も曖昧さがなく、自社のエンジニアを信頼しているのだなと好感を持ちました。

寿司

余談ですが。

「この前のパーティで寿司屋呼んだんですよ」

は? …え? 寿司でなく?

「寿司屋に来てもらって、そこカウンターにして握ってもらったんですよ」

IT企業のパーティなどで寿司の出前を取るというのはよく聞きますが、寿司屋の出前は初めて聞きました。

またやりたいねー、と言っていた矢先、年末に内定者として呼ばれた締め会でも寿司屋が来てました。

f:id:nitro_idiot:20161228202218j:plain

確かにお金はかかるけれども、外部の人間も呼んでサービスを紹介して使ってもらったり、採用候補のエンジニアに声をかけて採用したりできるし、寿司は美味しいし、良いこと尽くめだそうで。変わってる。

入社してみて

まだほんの一日をオフィスで過ごしただけなので何もわかりませんけども。

私は前職が完全リモート制だったため、この2年ほど通勤というものをしてきませんでした。そのため今月からにわかに毎朝会社に行く通勤ということが当たり前になり新鮮です。

初日ということで担当部分の説明もありました。とりあえずはRustを書くことになりそうです。

先日ちょうど知人と「Rustの仕事を探してみたんですがありませんでしたね」「ないでしょうね」みたいな話をしていたのに、不意に社内のコードの説明で「この部分はRustで書いてます」とか言い出すので「まじかよ」と言わずにはおれませんでした。ここにありましたよ、Rustの仕事。

ハードウェア制御の部分は低レイヤーのコードが書けて環境依存性があまりないという理由でRustが選択されているようです。この点で言えばCかC++かRustかみたいな選択になるのでしょうか。

まだ決まったことは多くないですが、Common Lispが使えそうな部分が十分にあるのでRustに加えて再びCommon Lispを仕事で書くことになりそうです。

ええと。ポケットチェンジはエンジニアを募集しているはずです。けれどどういう人を求めているのかよく知りません。「Rustの仕事なんざWeb屋に任せずに俺が入って代わりにやってやらぁ」というような気概に溢れた人などはお声がけいただければ繋ぎます。そうすれば私はCommon Lispを書きます。ウィンウィンウィン。

さて、それでは二〇一七年もどうぞよろしくお願いします。

Day 25: Utopian

メリークリスプマス!

これは fukamachi products advent calendar 2016 の25日目の記事です。

今日はUtopianについて話します。

アドベントカレンダー最終日

このアドベントカレンダーも今日が最後ですが、テーマになっているプロダクトのリリース日がだいたい時系列になっていることに気づいていましたか。

CL-TEST-MOREから始まってClack、Cavemanなどのフレームワークがあり、途中にIntegralやWooなどもありました。

そして最後が今日のUtopianです。これはまだ開発中であり、そういう意味では未来の話とも言えるかもしれません。

未来はどこにあるか

2011年10月、Shibuya.lispのLTで「深町英太郎はどこへ向かっているのか」というトークをしました。

タイトルはネタっぽいですが5年前から向かうべき場所としてのUtopianが出てきています。

Utopianとは何か

アリエルで松山さんと働いていたときにClackとCavemanを作りましたが、それでもCommon LispでWebアプリケーションを作るには足りないものが多すぎました。DB周りはほとんど整備されてないし、テンプレートエンジンも心もとありません。Webサーバーも実績不足でどこまで実用に耐えうるのか疑問でした。

最終的にはRailsのようなフルスタックなWebフレームワークも欲しい。それはClackよりもCavemanよりも高い抽象度になるだろう。名前はどうする。薄いフレームワークが原始人だったから、厚いのは未来人? いや、そういう年代の違いではないだろう。もっと夢のような。じゃあ桃源郷? Utopianか?

そうして夢の話をしてるうちにその名がプロジェクト名としてしっかりとした重みを持ち始め、向かうべき象徴となりました。

そして、Utopianは長くGitHubの空のリポジトリとして放置されていましたが、ついに今年の2月にMitoを基幹としてUtopianの開発が始まりました。

「いつ完成するんですか」という質問をたまにされます。わかりません。まだまだ遠いような気もします。

おわりに

UtopianはGitHubで開発中です。

では皆さん、良いお年を。

Day 24: Mito

これは fukamachi products advent calendar 2016 の24日目の記事です。

今日はMitoについて話します。

Integralの失敗

11日目のIntegralの「抽象化の失敗」のところで取り上げましたが、Common LispのORMとして作られたIntegralはPostgreSQLのサポートに失敗し、サポートするには根幹部分から再設計が必要となりました。

その後dataflyを作ったりして、ORMよりももっと軽量なライブラリを好んで使っていました。けれどそれも、サムライトでIntegralを採用してから話が変わってきました。

いよいよ真面目にメンテナンスしないといけなさそうだけれども、Integralに手を入れ続けるのは限界がありそうです。そこで自信を持って使ってもらえるORMは必要だなと思って一から書き直したのが「Mito」でした。

Mito

Integralの経験を活かしてMitoでは慎重に抽象化を行いました。具体的にはdefclassCREATE TABLE文と紐付けるメタクラス層と、そのメタクラスをData Access Objectとして扱えるようにするメタクラス層で分離しました。

また、Integralではdefclass:typeRDBMSのカラム型に変換できる機能もあったのですが、Mitoではそこまでの高度な抽象化はしませんでした。そのため少し保守的な設計になっていますが、何よりちゃんと動くことが大事です。

最近は僕もいくつかのプロジェクトでMitoを使っており、マイグレーションも含めて問題なく動いています。

名前の由来

どうでもいいことなんですが、「なんでMitoって名前なんですか」とサムライトの社内ミーティングで訊かれました。

Mitoというのは京都市動物園にいるアジアゾウの「美都」からつけました。

これは猛暑真っ只中の写真で、飼育員さんに水浴びしてもらっているところです *1

f:id:nitro_idiot:20130817131454j:plain

飼育員さんがプールに入らせようと好物のりんごをプールに放ったのですが、プールが嫌いな美都は鼻を伸ばしてりんごだけ取っています。水こわいけどりんごは食べたい。

なぜアジアゾウの名前をつけたかというと。

昔、ElephantというCommon Lispのオブジェクトストアがありました。このAPIはよくできており、CLOSオブジェクトを永続化させるという高度な抽象化を行っていました。このElephantには問題も多かったのですが、目指した夢としての印象は僕にとっては強烈で、僕のORMにもその心意気は込めたいと思ったからです。あと愛着が湧くからです。美都かわいい。

まったく技術的な話ではありませんでした。

おわりに

MitoはGitHubで公開されており、現在Starは35ついています。

明日のアドベントカレンダーは最終日25日目のUtopianについてです。お楽しみに。

*1:写真は2013年当時のゾウ舎。今はゾウ舎が移築されて広くなっており、ゾウも4頭増えています。しばらく美都は奥のゾウ舎から出てこなくてまったく会えなかったのですが最近は見られるのでしょうか。

Day 23: Psychiq

これは fukamachi products advent calendar 2016 の23日目の記事です。

今日はPsychiqについて話します。

はてなでの経験

僕の経歴の中ではてなで働いていた時期はあまりOSS活動もせず、Common Lispを書いていませんでした。仕事がPerlということも理由の一つでしょう。

けれど直接的ではないにせよはてなでの経験は少なからず僕の活動には影響を与えています。Webアプリケーションのサーバーサイドからフロントエンドまで担当でき、どのようにWebアプリケーションを構成し運用するかを学ぶことができました。どこがボトルネックになりやすいのか、長期的に運用する上でどういう面が問題になるのかなどの生きた知見が得られました。

はてなではWebフレームワークから作ることもそう珍しいことではなく、その経験はCaveman2の開発にも活かせたり。

その過程でCommon Lispに足りないものもありました。それがメッセージキューでした。

メッセージキュー

メッセージキューはアプリケーションで実行に時間がかかりそうだが同期的にやらなくてもいいものを他のプロセスやスレッドに投げて非同期で実行できるミドルウェアです。

はてなではTheSchwartzを使っていました。サムネイル画像を作ったり動画の変換、通知やその他バッチ処理を走らせたりするのに使われていました。

最近だとAmazon SQSとか使ってるところが多いんでしょうか。

必ずしもすべてのアプリケーションで必要なわけではないですが、必要になったときにCommon Lispになければ導入が困難になるかもしれません。

Lesque

そこで2014年の1月に作ったのが「Lesque」です。

これはRubyのResqueを元に作ったメッセージキューでした。作ったタイミングとしてははてなを退職する少し前くらいで、それから新しいWebサービスを作るのに必要だと見越しての開発でした。

blog.8arrow.org

Psychiq

さて、Lesqueを使ったはいいものの当初の予定とはかなり違って、使う機会のないまま日は経ちました。

そして2年後、とうとうLesqueを使えるかもな、というタイミングで見てみると、そのコードは古いですしCommon Lispの環境にもついていけておらず継続して開発するのもためらわれるものでした。この2年でRoswellがスタンダードになったにも関わらずRoswellスクリプトが提供されていなかったり、Travis CIでのテストが行われていなかったり。

メッセージキューの世界でも世代交代がありました。Sidekiqという新しいプレイヤーが現れました。Resqueのプリフォークスタイルではなく、スレッドを使うため高速に動作し、シンプルなアーキテクチャであるということが売りのようです。

そこで新たにSidekiqをCommon Lispに移植することにしました。それが「Psychiq」でした。

blog.8arrow.org

落語Bot

とはいえPsychiqもそれからしばらく使うことはなかったんですけど、先日とうとう使う機会がありました。

11月の末にLINE Botの「落語Bot」をリリースしました。これは落語の定席や落語家のスケジュール検索ができるLINE Botです。現在、その落語会情報のクローリング部分にPsychiqを使っています。

Psychiqを使ってみてJonathanのバグを見つけたりCL-DBIの問題を見つけたりとかありましたが今のところ順調に動いています。

おわりに

PsychiqはGitHubで公開されており、現在のStar数は16です。

明日のアドベントカレンダーは24日目のMitoについてです。お楽しみに。