Findy Engineer Lab

エンジニアの"ちょい先"を考えるメディア

チャンスは待たずに自分で作る ─ ソフトウェアエンジニアが「好きな技術」で生きていくための技術とは

好きな技術で生きていく技術

Go Conferenceなどを運営する一般社団法人Gophers Japanで代表理事を務める上田拓也(@tenntenn)です。学生時代にGoと出会って以来、10年以上Goコミュニティの運営に関わっています。

読者のみなさんはソフトウェアエンジニアだったり、ソフトウェアエンジニアを目指している方が多いでしょう。そのため、普段使ってるプログラミング言語やエディタ、開発環境、OS、クラウドベンダーなどにはお気に入りがあるかと思います。しかし、いくらお気に入りだからといって、最初からその技術を極め、仕事にして人生を賭けようとはなかなか思わないでしょう。筆者もそうでした。

本稿では、筆者がどのように好きな技術(Go)と出会い、コミュニティ活動を行いながら、仕事として活動できるようにしてきたのかを紹介します。読者のみなさんに、ソフトウェアエンジニアとして「好きな技術を突き詰める道もあるんだな」と感じてもらえれば幸いです。

※巻頭写真:Fukuoka.go#11における筆者/提供:deeeet

好きになった技術の道を切り開く

今でこそGoのイメージが強い筆者ですが、大学院に入るまではJavaが最も得意なプログラミング言語で、エディタはEmacsを使っていました。研究室に配属されてからも、研究で使用するシミュレータをJavaを使って書いたりしていました。

大学院に進み、シミュレータの速度を改善するためネイティブコードで出力できる言語を探し、その当時開発が盛んだったD言語と出会いました。D言語はJavaをやってきた筆者にとってとても相性が良さそうに思えたので勉強を始めましたが、まだ開発中だったり、筆者の技量も足りていなかったせいか、シミュレータの開発に安定して生かすことはできませんでした。

そこで別の言語を探し、Googleが開発しているGoに出会いました。まだ正式リリースはされていませんでしたが、面白そうだったことと、参加したGoogleのイベントでGoを使ったコーディング問題などにチャレンジしたことなどもあって、Goが好きになっていきました。

なお、その頃にはシミュレータの書き換えは諦めてJavaを使っていました。

Goを知る人もあまりいない中で勉強会を主催

Goを学び始めた当初、筆者の周りにGoを知る人はあまりいませんでした。2010年ごろに出会ったGoですが、2016年にメルカリに入社するまでは趣味で学んでいる技術でした。

筆者は大学院生でGoを始めました。愛知県豊橋市の大学に所属していたため、大学の周辺にはGoはおろかIT系の勉強会もまったくありません。片道1時間くらいかけて名古屋の勉強会に顔を出していました。

名古屋や東海地方でGoogle系の技術を扱うコミュニティに、GDG(Google Developers Group)名古屋があります(旧・東海GTUG)。始めは筆者もただの参加者でしたが、仲間を増やしたくてGoの勉強会を主催するようになりました。1回目のGDG名古屋主催のGo勉強会は、奇しくもGo Conferenceの前身となる勉強会が東京で開催された同日だったのを覚えています。

大学院の博士後期課程を満期退学(単位を取り、学位を取っていない状態)し、2013年に最初の企業に就職しました。そのころは、Goの正式版は出たものの採用している企業はほとんどなく、Goで就職できるイメージは全くありません。それでも学習は続けました。2016年ごろまでGoの勉強会はあまり多くなく、参加できるものにはほとんど参加していました。

仕事でメインに使用しない言語を学び続ける

新卒で入社した企業では、PHPやJavaScript、Lua、C++、Objective-CやC#(Unity)といった言語が仕事で必要になりました。Goはまだコミュニティ活動で学ぶもので、仕事にメインで使用する言語ではありません。ただ、開発ツール類はひっそりとGoで書いてみたりもしました。

メインの言語として仕事に利用できなくても、学習の方法はいくつかあります。たとえば、標準パッケージなどのコードリーディングです。Go研という勉強会では少人数が集まって、担当者が自分の読んできた範囲の標準モジュールを解説するというスタイルで開催していました。これにより標準パッケージの使い方だけでなく、仕組みまで理解することができました。

Goは2012年の正式リリース当初から、公式ドキュメントやGoチーム(GoogleでGoを開発しているチーム)の登壇資料といった1次情報が、豊富にありました。英語で書かれたものがほとんどですが、英語が得意とはいえない筆者でも翻訳サービスを使えば苦ではありませんでした。

また、画像変換ツールや開発向けのツールなどは、クロスコンパイルとシングルバイナリになる利点を生かして、Goで開発していました。こういったツールで、現場のエンジニアにおける技術選定の裁量が大きく、プロダクトへの影響範囲が小さいものは、好きな技術を積極的に採用するとよいでしょう。ただし、後で保守をする人のことも意識して、チームメンバーやマネージャの了承を取っておく必要があります。

継続した学習がやがて仕事につながる

筆者は、継続以上に学習効果を高める手段はないと考えています。継続した学習は複利的に働き、学習した知識が新しい知識を築きあげます。好きな技術は、業務で利用しなくても学習を続けましょう。

1次情報を使ってコツコツと学習を継続し、Goを利用できるチャンスがあれば積極的に使うことで、業務利用していると呼べる規模でなくとも、勉強会やGo Conferenceに登壇し続けることができました。その頃はGo Conferenceが年に2回あり、筆者も2013年春の第1回から登壇していますが、仕事で利用する人が少ないため、標準パッケージや言語機能について内部実装を調べて解説する発表が多かったようです。

そうして学習を継続していると、業務に利用できる機会も生まれるかもしれません。筆者自身はその機会がないままでしたが、勉強会やGo Conferenceの運営を通して、Goで仕事する人が増えるように活動してきました。2016年ごろには、日本でも徐々にGoを採用する企業が増えてきました。

そして、2016年9月に筆者もメルカリに入社しました。もちろん、Goを使った開発が行えるバックエンドエンジニアとしてです。

Google I/O 2016で渡米した際の筆者

Google I/O 2016で渡米した際の筆者

好きな技術の居場所を作る

筆者はバックエンドエンジニアとして、Goをメイン言語として開発するチームに配属されることを期待してメルカリに入社しました。実際に配属されたのは、ソウゾウというグループ会社のエキスパートチームでした。ソウゾウは新しいアプリを次々に開発していた会社で、当時のメルカリとは別のチーム体制で開発や技術選定を行っていました。

エキスパートチームは、筆者の入社時に設立された新しいチームです。筆者のミッションは、自身だけでなくソウゾウ、そしてメルカリグループ全体のバックエンドエンジニアが持つGoの知識を深めるというものでした。開発チームとともにバックエンドエンジニアとして働きながら、他のエンジニアにGoに関する知識を共有しました。

社内外でGoを活性化させることがミッション

メルカリのバックエンドはもともとPHPで記述されていましたが、入社してしばらくしたころ、マイクロサービス化にあたって一部をGoに移行することになりました。そのため一部のPHPエンジニアがGoエンジニアに転向する必要があり、その研修を筆者が務めることになりました。

エキスパートチームのミッションは社内教育だけではありません。コミュニティへの貢献も、50%以上の工数をあてて行いました。具体的には、カンファレンスや勉強会の運営のほか、社外向けにも研修を実施しました。メルカリグループがGoを使い始めたころでも、国内でGoを導入している企業はまだ多くありません。筆者はコミュニティ活動を仕事とし、Goコミュニティの活性化に力を入れました。

社外向けの研修には、チームごとメルペイに異動した後で始めた「Gopher道場」があります。これは仕事でGoを活用する人が増えることを目的として、Go以外のプログラミング言語で業務経験があるソフトウェアエンジニアを対象にGoの講義を行いました。

そのころGoの求人は増えていましたが、転職市場にGoエンジニアは少なく、どの企業も採用を強化していました。数少ないGoエンジニアを企業同士で採用合戦してしまっては、業界やコミュニティの今後によくありません。そのためGoエンジニアの数を底上げする施策として始めたのです。

Gopher道場を通してGoを学習した人は徐々に増え、Slackの参加人数だけでも3,000人を超えています。

コミュニティ活動を仕事にするために

Gopher道場には、筆者が所属していたメルペイの業務時間を使っており、他のイベントと比べて採用効果も高めでしたが、採用の案内はアンケートでメルペイに興味があると希望した方だけにしていました。多くの参加者はGoを学びに来たのであって、メルペイ自体に興味があるとは限らないからです。

また、ただ講義するだけでなく、メルカリグループにおけるGoの事例を紹介したり、その関連講義を社内のエンジニアに担当してもらったりもしましたが、そのときも採用の案内より、参加者が聞いて楽しい講義を作るように心がけました。LT大会や懇親会など、社内エンジニアと交流できる場でも同様です。

企業の利益だけを追求し、スポンサーという立場で無理を言って参加者や運営者のモチベーションを下げてしまっては、コミュニティや業界の衰退につながってしまいます。

一方で、コミュニティ活動を仕事で行うのであれば、無償の奉仕が必要な場面も多くありますが、やはり企業の利益につながる活動でなくてはなりません。自分だけが得をする、あるいはコミュニティの利益だけを追求する活動では、なかなか継続が難しいでしょう。

採用とコミュニティ活動は、テレビ番組におけるCMのようなものかもしれません。視聴者(参加者)にとって邪魔に感じられることもありますが、その分野で仕事が増えることは技術コミュニティにとっても悪いことではありません。事例が増えれば知見も増えます。OSSならバグが報告され、修正されて安定性が増すかもしれません。

参加者と企業とコミュニティを「三方よし」の関係に

このようにコミュニティ活動を仕事にすることは、一見するとハードルが高く、会社への貢献も少なそうに思えます。しかしうまく実施すれば、自分にも会社にもコミュニティにもよい効果が得られる三方よしの状態が築けます。

コミュニティ、参加者、企業が三方よしになる施策は、よく設計すればそこまで難しいものではありません。たとえば社内研修などを公開し、コミュニティに知見を提供しましょう。ほとんど研修の工数だけでコミュニティにも貢献できます。より採用への効果を期待するのであれば、研修資料を公開するだけでなく勉強会として公開すれば、参加者に企業をより身近に感じてもらえるでしょう。

三方よしの構図が作れないと、誰かがフリーライドしやすい環境になってしまいます。たとえばエンジニアがプライベートで海外のカンファレンスに登壇したときに、費用を出していない所属企業が会社の技術ブログに記事を書くよう強要することは、企業が個人の活動にフリーライドしていると言えるでしょう。

また、エンジニア個人の時間だけでコミュニティ活動を行うには、家族やプライベートとの兼ね合いで時間が取れない場合もあります。継続的にコミュニティ活動を行うには仕事として活動できるとよいのですが、そこから採用効果を生むなど、企業としても応援しやすい環境が作れるとよいでしょう。

個人も企業も、フリーライドしてしまってはどちらかが疲弊し、継続しなくなります。

Mercari Tech Conf 2017における筆者

Mercari Tech Conf 2017における筆者/写真提供:deeeet

1つの技術から世界が広がる

1つの技術だけを熱心に学習していると、他の技術がおろそかになってしまうのでは? と考える方もいるでしょう。しかし、1つの技術を深く学習することは、学ぶ本人が最初に想像する以上にさまざまな知識を得ることにつながります。

たとえば、Goというプログラミング言語を1つとっても、学べることはたくさんあります。まず、プログラミング言語をコンパイルするコンパイラはコンピュータサイエンスの集大成と言えますし、周辺ツールからも多くの知識を得られます。go vetという静的解析ツールでは、構文解析、型チェック、静的単一代入(SSA)形式など、コンパイラで培われた技術が利用されています。

プログラミング言語とコミュニティのあり方から学べることも多いでしょう。Goチームがどのようにコミュニティの意見を取り入れ、改善していくのか。新しい機能はどのように提案され、どのようにデザインされ、どう実装され、どうリリースされるのか。Goでは開発者が安心して安定的に開発できるように、後方互換に気を使いながら新しい機能を作っています。これは普段の開発にも生かせる考え方です。

一緒に学習する仲間を増やす

何かを学習するときに、一緒に勉強できる仲間がいると、モチベーションを維持し、相談や情報交換ができるといったメリットがあります。何より楽しいです。

学習する仲間がいなければ、自分でコミュニティを立ち上げ、集まりやすい環境を作るとよいでしょう。仲間は最初からいるわけではありませんから、自分で募るしかありません。あまり知られていない技術であれば、自分で情報を集め、発信することが必要です。コミュニティは一朝一夕にできません。コツコツと情報発信していくことが大切です。

始めから勉強会を開催したり、登壇したりするのはハードルが高いかもしれません。最初の一歩を後押しするため、筆者はゆるくて小さな勉強会が集まった「ごーふぁー荘」という複合型のコミュニティを行っています。こうした場があれば、興味関心が近い人たちが集まってわいわいしているうちに、自ずと独立した勉強会に発展するかもしれません。

静的解析を学習する仲間を集めるために実施したこと

筆者が大好きな技術の1つに、静的解析があります。特に、Goの静的解析が好きです。静的解析はソースコードを解析して、バグや脆弱性を見つけたり、またはコード生成などを行う技術です。Goは最初のリリースから、静的解析のパッケージを標準ライブラリとして提供しています。

筆者がGoの静的解析を学習し始めたころ、国内で情報発信をしている人はほぼ一人しかいませんでした。英語での情報も非常に少なく、ソースコードを読んで理解する必要がありました。その当時でGoの経験が7~8年はあった筆者でも、静的解析の学習には2年ほど要しました。誰に相談してもあまり分かってもらえず、調査論文を読んでアルゴリズムを理解したり、他の言語の情報を調べたりもしました。

Goそのものと同様に、Goで静的解析を学ぶ仲間がほしかった筆者は、日本語で情報をまとめ、300ページ以上あるスライドを作り、カンファレンスや勉強会で登壇して発信に努めました。skeletonなど学習ハードルを下げるOSSを開発し、気軽に入門できる環境を整えたりもしました。

中でもメルペイで2020年に行ったサマーインターンシップでは、40名を超える学生がGoによる静的解析を学び、さまざまなツールを開発し、OSSで公開しました。

他分野のエキスパートや他社の開発に出会う

1つの技術を深く学んで専門性を高めると、自ずと他の分野を含めたエキスパート(専門家)と知り合う機会が増えます。たとえば、筆者はクラウドについてそこまで詳しくはありませんが、GCPUGというユーザグループに参加すれば、GCP(Google Cloud Platform)のエキスパートと議論や情報交換ができます。新しい分野の知識が得られますし、筆者から提供できるGoの知識やノウハウもたくさんあります。

また、筆者はセキュリティの専門家ではありませんが、2022年のセキュリティ・キャンプでは講師を務めました。Goを学習する中で学んだ静的解析の技術を、脆弱性の発見に利用するという講義を行いました。セキュリティについては、メルカリのセキュリティチームと情報交換する中で得た知識が中心です。他分野のエキスパートからの知識と、自身の知識を融合して、専門外の分野に貢献できました。

さらに、1つの技術の知識を深めると、副業として他社の開発に関わることもできます。1つの企業の開発では得られない事業領域や、開発チームの特性、経験したことのない技術的なチャレンジに関われるかもしれません。とくに技術顧問やアドバイザーという形で他者に教える経験は、知らないことも調べてともに考えることで、知識を深めて確かなものにすることにつながります。筆者は、さまざまな事業領域におけるサービスのソースコードを読む機会を得たことで、Goや静的解析に関する知識が増えました。

1つの技術を学ぶことで、その他の技術を学ぶことができないわけではありません。専門性を深めれば、実はさらにそこから知識が広がるかもしれません。

誰もやってないことにチャレンジする

前例がないことにチャレンジするのは、とても難しいように思えます。しかし、やってみたら、案外これまで誰もやってなかっただけで、難しいことではない場合もあります。

たとえば、ProgateにおけるGoコースの開設は、筆者が運営会社に直接問い合わせて実現しました。日本のオンラインのプログラミング学習サービスでGoを扱っている企業がなかったため、あったらいいなと考え、行動を起こしました。

大学での講義も、周囲に「やってみたい」と話していたところ、知人経由で法政大学を紹介してもらい、執筆時現在も毎年講義を続けています。講義を履修した学生がスタートアップでインターンシップをしたり、カンファレンスに参加や登壇をするようになっており、チャレンジしてよかったと感じています。大学での講義のほか、学生向けにはイベントなど前例のないチャレンジを行ってきました。

ほかに、国内外のカンファレンス参加を目指す学生を増やすため、Step up Goというイベントを2019年に始めました。海外カンファレンスに参加ができる学生向けのスカラーシップを検討していたところ、学習とセットになっているとより効果的だと考え、半年以上の講義を行った後にスカラーシップへの申し込みと選考を行うようにしました。これまで多くの学生が参加し、コロナ禍で海外カンファレンスへの参加は難しくなりましたが、講義については継続しています。

未開拓の領域を切り開くことは、自身の居場所を広げ、好きな技術で生きていく力をつけます。誰もやっていないことを始めるのに、チャンスを待つ必要はありません。自分でチャンスを作ればよいのです。自分が改善したいことを考え、その方法に前例がなくても気にする必要はないでしょう。

Go 1.11 Release Party in Tokyoにおける筆者

Go 1.11 Release Party in Tokyoにおける筆者/写真提供:deeeet

新しいチャレンジはさらに続く

継続することは大切です。しかし、同じことの繰り返しでは、モチベーションが維持しにくくなるでしょう。新しいことを始めてみましょう。筆者は新しいことを始めるのが好きです。今年(2022年)は、一人カンファレンスや一人イベントを始めました。また、有料講義や、転職して新しい企業にもチャレンジしています。

たいへんだが自由度が高い一人カンファレンス

一人カンファレンスとは、企画・運営・登壇などのカンファレンスの運営に関わるすべてを一人で行うイベントです。カンファレンスなので朝から夕方まで複数のセッションを行い、LT大会も一人で行います。司会も発表もすべて一人です。たとえば、筆者が行っているtenntenn Conferenceがそれにあたります。

Go Conferenceや他の勉強会を運営していると、当日までの忙しさで登壇が遠ざかっていました。また、本業以外で得た知見をまとめて発信する場がありませんでした。一人カンファレンスであれば、すべて自分の好きなように設計できます。一人ですべてを行うのでたいへんですが、その分自由度が高いです。

講義スタイルで有償の勉強会を個人活動で提供

コミュニティで開催するイベントや講義は、基本的に無償で提供しています。無償である理由は、本業の稼働時間を使っていることが主な理由になります。講義スタイルの勉強会やイベントは、一緒に学習するというよりも、学ぶ場を提供することが主な活動になるため、個人の時間だけを使って行うには、時間と労力の負担が重くなってしまいます。

また、土日祝日をコミュニティ活動にあてるには、家族に無理を聞いてもらう必要が出てきます。業務としての活動であれば、対価や振休が発生するため、家族も納得しやすくなります。そのため講義スタイルのイベントは、本業以外の個人的な活動で行うことが難しいと筆者は考えていました。何より、家族との時間を納得が得られないまま使ってしまっては、継続性が危ぶまれます。

そこで個人で活動するにあたって、Gopher塾という講義スタイルの勉強会を有料で提供する、ということを始めてみました。個人の参加者からお金を集めて、土日祝日に行います。価格設定や内容は手探りでしたが、第1回と第2回は満員となり、一定の需要があることが確認できました。

スタートアップに転職

2022年は、本業についても新しいことを始めることになりました。6年間務めたメルカリグループを退職し、ナレッジワークというスタートアップ企業で働くことにしました。

ナレッジワークでは、これまでと同じようにGoエンジニアが業界で活躍できるようにイネーブルメントを推進しつつ、これまで以上にサービス開発にも力を入れていく予定です。サービス開発を通して、コミュニティ活動や技術顧問だけでは得られない、自分の手を動かして得られる知見を増やしていきたいと考えています。そして、得られた知見をGoコミュニティに還元していきます。

新しいことを始めると、継続してきたことにプラスになることもあります。たとえば、一人カンファレンスで得られた知見は、Go Conferenceの運営に生きていくでしょう。また、サービス開発で得られる知見は、登壇や技術記事の執筆に役立つでしょう。新しいことを始めることがエンジンとなり、これまで行ってきた施策がより強化されます。そして、そこからさらなる新しいアイデアにつながります。

継続とチャレンジで仕事とコミュニティを作る

自分の好きな技術で生きていくには、継続とチャレンジを繰り返しながら、自身で居場所や仕事を作り、それを広めて仲間を集めることになります。何よりコツコツと継続することが、一番の力になります。そして継続のためには、自分が一番楽しいと思える活動のあり方を模索することが大切になるでしょう。

筆者は「仕事でGoを使いたい」という気持ちと「Goコミュニティを活性化したい」という気持ちの両方を、仕事を通して実現してきました。紹介したGopher道場のほか、大学での講義、学生向けのイベントやインターンシップなどさまざまな施策を自身で企画し、実施してきました。

もちろん周囲の助けも大きかったのですが、自分が正しいと思ったことを、思い切って進めてきました。こうしたGoコミュニティへの考え方は「人類Gopher計画」というドキュメントにまとめています。みなさんの参考にもなれば幸いです。

制作:はてな編集部