Quantcast
Channel: Sider Blog
Viewing all 182 articles
Browse latest View live

Sider スペシャルインタビュー ー RuboCopの生みの親Batsov氏に、RuboCopとRuby Style Guideについて直接聞いてみました

$
0
0

f:id:sideci:20180601192336j:plain (編集者より:この記事は、SiderのMediumに2018年6月28日に公開された英語記事を翻訳し、加筆したものです。)

Siderは、2018年8月よりRuboCopのスポンサーになりました。コードレビュー自動化サービスであるSiderを利用すると、さまざまなプログラミング言語や環境で、色々な種類の解析器をご利用いただけます。Siderではさまざまなオープンソースプロジェクトを活用しながらプロダクト開発を進めており、コミュニティへの貢献を大切にしています。このスポンサー活動を通して、RuboCopのさらなる発展に協力できれば幸いです。

今回はこれを記念して、RubyKaigi 2018にて実現した、RuboCopの生みの親である@bbatsovことBozhidar Batsov氏への独占インタビューの日本語版を公開いたします。SiderのCTOである松本宗太郎 (@soutaro) とRuboCopコミッターでありSirderの技術顧問のpocke (@pocke) の前で、Batsov氏はRuboCopやRubyスタイルガイドに関するご本人の考えを、とても気さくに語ってくれました。 

RubyスタイルガイドからRuboCopができるまで

Soutaro:
最初に、RuboCopの開発に至るまでの動機について聞かせてください。RuboCopを通じて、どんな問題を解決しようと思われたんですか?

Bozhidar Batsov:
私は、Rubyで開発するようになる前はJavaで開発をしていました。Javaも色々な問題があるものの、Java用の良いLintツールが沢山あります。以前わたしの勤めていたのはコンサルティング会社で、様々なプロジェクトに取り組んでいました。チームメンバーはプロジェクト間を行ったり来たりする必要があり、全てのプロジェクトに対して統一されたコーディングスタイルを持つことが非常に重要でした。そうしないと、プロジェクトを異動した際に「あれ、このチームではこのやり方だけど、あっちのチームでは別のやり方だったぞ」というように、混乱してしまいます。

仕事でRubyを扱うようになって最初に取り組んだ問題は、統一されたコーディング規約を作ることでした。Javaではこういう問題はありませんでした。Sun公式のコーディング規約や、非公式だけど人気があるGoogleによる規約などがあり、皆がそのどちらかを利用していたからです。コードベースも一貫していたので、プロジェクトの移動もとても簡単でした。「タブとスペースどっちにする?どこに括弧つけるんだっけ?」みたいな話は滅多にしなくてよかったので、楽でしたね。

それから、ある企業でRubyの開発者として新しい仕事を始めたのですが、Rubyが分かるのは私一人だけでした。その会社は、ブルガリアで二番目にRubyを企業として利用した会社で、沢山のプロジェクトを作ろうとしていましたが、その頃はまだRubyは広く使われているプログラミング言語ではなく、開発者はそれぞれが違う言語のバックグラウンドを持っていました。10年以上前の話ですね。チームのメンバーは優秀でしたが、みんなPHPやPython、Javaの開発者でした。なので、コードレビューの半分は、Rubyの基本的なスタイルの問題の指摘でした。

そこで、まず私は社内用に、Matzの本やピッケル本などを参考にしてRubyのスタイルガイドを書きました。良いとされているものを全て盛り込みました。本によっては違うスタイルを推奨していたので、自分で判断をする必要もありました。いくつかの有名なプロジェクトのコードも参考にしました。Railsのコーディング規約は参考にしませんでした。かなり独特で、Rails開発者ですらRails以外ではそのスタイルを採用しないことがあるからです。

その後、Ruby Style Guideの最初のバージョンが出来上がり、公開を決めました。そうしたら人気が出て、フィードバックを色々もらうようになりました。あるチケットには「これ、すごく良いんだけど内容が多すぎて全部のルールを覚えられないから、PythonのPEP8みたいにスタイルガイド文書とそれを検査できる公式ツールがあったらいいのに。」というコメントがありました。そこで、やってみようと思ってRuboCopの開発を始めて、今に至ります。これが動機でした。

Soutaro:
スタイルガイドが長すぎて、自動でチェックできるツールが必要だったんですね。

Bozhidar Batsov:
そうです。RubyのコミュニティにはそうしたガイドやLinterがないことにびっくりしました。こういうことをやりたかった、というより、やらざるを得なかった。その頃にもスタイルガイドは不完全ながらいくつかありましたが、Linterは非常に原始的なものばかりでした。

Ruby 1.8から1.9への移行を覚えている人がどれくらいいるかわかりませんが、ほとんどのLintツールが構文解析にSeattle.rbのruby_parserを使っていました。そして、ruby_parserの1.9対応には時間がかかっていました。これが、初期のRuboCopがRipperを使っていた理由です。Ripperも大変でしたが、1.9で動くのは本当にそれしかなくて、ものすごく辛かったです。1.8から1.9への移行は、当時いくつかあったRubyのLintツールにとって逆風になったと私は考えています。

コミュニティがRuboCopを育てた

Soutaro:
今、RuboCopはとても人気ですよね。最も使われているRubyのLintツールの一つだと思うのですが、RuboCopが人気になったマイルストンはありましたか?

Bozhidar Batsov:
まあ、私がとてもチャーミングだから皆が信じてくれたのかな、と(笑)。冗談はさておき、(RuboCopができる以前はこういうツールが存在せず)皆が必要としていたので、最初にツールを作った人が人気になるような、言わば真空状態のような状況だったんだと思います。当時はここまではっきり思いませんでしたが、今はそう確信しています。沢山の人が全然機能がない初期のリリースを熱烈に歓迎してくれましたし、リリースの度に発生する破壊的な変更を受け入れてくれました。新しい機能を追加するたびに、誰かのビルドが壊れていました。おそらくご存知だと思うんですけど。とにかく、誰かが埋めなきゃいけない穴があったんです。そして、RuboCopがその穴を埋めた。もしそうでなくても、次に出てきた別のLintツールがその穴を埋めていたと思います。だから私たちが特別な何かを作ったとは思っていません。もし何か特別なことがあったとしたら、わたしがコミュニティからのフィードバックを積極的に受け入れたことだったのかなと思います。

私はRuboCopをそこまで柔軟なものにするつもりは全然ありませんでした。Rubyスタイルガイドが守られるような何かが欲しい、とは思っていました。皆さんが抱えているユースケースの多くは私が当初は想像しなかったものでした。プラガブルなアーキテクチャを設計したり、設定を継承できるようにすることなんて考えてもいませんでした。初期バージョンはスタイルガイドを守るためのものだったので、設定は存在しませんでした。

コミュニティと連携したことと、たくさんの人が助けてくれたことが、私たちの成功の秘伝のタレなんだと思います。一人で大きなことをやり遂げることはできません。RuboCopの成功に大きく貢献してくれた人は、少なくとも10名はいます。これは本当に重要なことです。チームが無くては、そしてコミュニティが無くては、どんなことでも絶対に成功できないからです。

bbatsov自身のRuboCopの設定とは?一貫性は個人の嗜好よりも大切

Soutaro:
ありがとうございます。次の質問に移ります。 ご自身のチームでもRuboCopを使ってらっしゃるんですよね?

Bozhidar Batsov:
もちろん。

Soutaro:
チームでのRuboCopの設定はどんな風にされてますか?デフォルト?

Bozhidar Batsov:
いや、デフォルトではないです。全然違います。

私はToptalのVP of engineeringなのでデフォルトを使うよう指示することもできますが、民主主義を重んじる上司として、チームの皆に投票をしてもらって決定を委ねています。ただ、色々な困難もありました。

うちの会社では、Ruby開発者が「スタイルガイド更新会議」なるものを6か月ごとに開催して、そこでオフィシャルのRubyとRailsのスタイルガイドからフォークする作業を行っています。チームが小さかった初めの頃は私も会議に参加していたんですが、議論がとても白熱していてたので、干渉しない方が良いなと思い直しました。この会議では、どのルールを見直したいかアジェンダを作って投票をするのですが、一部の開発者は熱が入るあまり偽のアカウントまで作ってチートしようとした人もいましたね。40名が参加した会議に、60票の合計票が集まってびっくりしたことがありました(笑)。

たくさんの方がRuby Style Guideが私個人の嗜好を表していると思っているようなのですが、これは事実とはかけ離れている、ということを胸を張ってお伝えします。私個人としては真逆の意見を持っていて、一方で大勢の方が良いアイデアだと考えていてRubyのコミュニティで広く使われているような、そういう項目もあります。私はそれで構いません。

このインタビューの前に、 SiderのMatz氏松田明氏とのインタビュー記事を読んだのですが、Matz氏もRubyのスタイルガイドの中の多くの部分に同意してはいないと言っていたのが興味深いなと思いました。具体的にはどの部分なのか、ぜひ聞いてみたいですね。皆が喜ぶようなものは作るのは不可能だし、どこかで妥協をしなければいけない、と私は思います。最終的には、自分自身が何に同意するかよりも、何かに同意したら一貫してそれに従うことのほうがずっと重要なことでしょう。

一貫性というのはスタイルです。主観的には、良いスタイルとひどいスタイルがありますが、スタイルというものに意識を向けて、一貫した形の中で作業することの方がもっと大切なことだと思います。この考えに同意しない人がいることは知っています。「インタプリタがコードを受け付けるのであれば、もうそれで十分。コードの挙動だけ気にすれば良い」と考える人もいます。ですが、このことで誰かが行った仕事やオンボーディングプロセスなどが妨げられているのを日々見ていると、やっぱりそれは想像上の問題ではないことが明らかだと思います。これは実際に起こっている問題なのです。現状、Rubyの内部コードはぐちゃぐちゃなので、新しくコミッターになりたい人が貢献しにくくなっていると思います。「こっちのファイルみたいに書いたらいいのかな?それともこっちかな?どうしたらいいんだろう?」みたいに、結構な時間をかけて悩んでしまうと思うんですよね。 この定まらない部分を無くしていくことで、皆がやらなければいけないことに集中できて、魔法が起きるんじゃないでしょうか。

f:id:sideci:20180601190758j:plain

RuboCop 1.0 のロードマップ、そして新しいオーガニゼーションのゴールとは

ここで、同席していたSiderの技術顧問でありRuboCopコミッターであるPocke氏が、RuboCop 1.0についてBatsov氏について質問しました。

Pocke:
昨日(編集注:2018年5月31日)のRubyKaigiの発表で RuboCop 1.0について話してらっしゃいましたが、私は最後までお話を聞けなかったので、 RuboCop 1.0のロードマップについて詳しく聞かせてくれませんか?

Bozhidar Batsov:
ロードマップはまだ確定したわけではないのですが、RuboCop 1.0の一番大きなマイルストンは、Railsの機能を別のgemに抽出してrubocop-railsと命名することになるでしょう。まだ考えているところですが、おそらくパフォーマンスの機能も、MRIのバージョンに強く依存するので、別のgemに抽出することになります。正確に問題を検出できれば価値のあることだと思うのですが、人々を誤解させるようであれば、価値あるものとは言えないでしょう。Performance copについては、適用されるMRIのバージョンを指定できるようにするつもりです。それぞれのCopがMRIのどのバージョンで有効で、または無効なのかを指定できるようにして、一目で理解できるようにする。つまり、RuboCopのスコープを減らし、よりモジュラーにする必要があります。

拡張機能を作りやすくするために、より良いAPIを作る必要があります。今はちゃんと定義されたAPIが存在しないのですが、これは大問題です。RuboCop拡張のgemを持っている人が皆「これは多分publicで、これはprivate」と推測しなければいけないような状況はまずいですね。なので、良いAPIを作って、コミットしメンテナンスしなくてはいけません。そうすれば、RuboCopがあんまり壊れなくなっていくのではないでしょうか。

もう一つの1.0に関する問題は、安定してアップデートができるようなメカニズムです。RubyKaigiでも話した私の簡単なアイディアは、それぞれのCopに対して有効・無効の他に、もう一つステータスを追加することです。ここでは仮に“new”と呼びましょう。新しいバージョンのRuboCopを使い始めたときに、ステータスが“new”のCopが存在する場合には警告を出します。つまり、「ステータスがnewのCopが10個あります」というメッセージが表示されます。。そして、有効にするか無効にするかを決めるとこれらの警告が消えるようにするのです。すごく単純な機能ですが、アップグレードの煩雑さをぐっと減らしてくれると思います。それから、breaking changeが何かという定義をする必要がありますね。例えば、あるCopのデフォルトを変更することはbreaking changeなのか、non-breaking changeなのか。おそらくこれはbreaking changeだとは思います。breaking changeはメジャーバージョンアップでしか起きないようにしないといけません。

もう一つ1.0に期待することには、node matcherエンジンをRuboCopから抽出しプラガブルにすることがあります。Stripeの人が、C++でマッチャーを実装するアイディアを教えてくれたんですが、むちゃくちゃ速くなりそうです。彼らはRuboCopをprofileして、node matcherをC++で実装したらRuboCopが10倍速くなると言っています。これが本当かどうかは検証する必要がありますけど、教えてくれた方達のバックグラウンドを考えても、多分本当だと思います。これは、そこまでではないけど、重要なことですね。

そして、今後の全体的な一貫性を保証するために、私たちは、既存のCopの名前や設定を慎重に見直さなければいけません。全体のコードベースを通して名前に一貫性をもたせて、後になって名前を変更して回るような必要が生じないようにしたいのです。

また、デフォルトの設定についても、実際に皆さんに役立つものであり、変更しなくて済むようにしていく必要があります。GitHubのBigQuery APIを使ってRubyプロジェクトを検索するとか、昨日(RubyKaigi 2018のトーク)でお見せしたGemを使うとか、そういうことをやろうと考えています。正直に言って、私はどういうデフォルト設定が良いのか判断ができないので、こんな方法でやるのがいいでしょう。今のデフォルト設定は私にとっては理にかなったものですが、明らかに私の判断は偏っています。

今お話したようなことが主要ポイントになるかと思います。巨大なロードマップを1.0には持たせたくはないですね。数ヶ月内に実際に達成できるような何かを提示したいです。現実的には、Railsとパフォーマンスの分離だけが厄介な点だと思います。それでも、rubocop-rspecみたいな gemが既にあるわけで、似たようなことができるでしょうから、ものすごく面倒というわけではありません。

プロジェクトへの導入を補助するような機能があってもいいですね。初期設定時に、より賢い設定を生成するとか。これで、現行のものを置き換えられるかもしれません。

それから、マイナーなバージョン間で設定のmigrationが必要なくなるといいなと思っています。つまり、メジャーバージョンアップでのみ設定ファイルの修正が必要になるような形です。そのためには、より安定した開発サイクルにコミットすることになります。1.0の大事な部分はこんなところだと思います。

Pocke:
ありがとうございます。もう一つだけ質問があります。昨日、RuboCopのレポジトリーをbbatosvからrubocop-hqに移動しましたよね。このオーガニゼーション (rubocop-hq) は、rubocop-jp/issuesを移動するとか(編集中:2018年6月に移動済)、いくつかの目的があると思うのですが、オーガニゼーションの運用計画など、他にもあれば教えてください。

Bozhidar Batsov:
このオーガニゼーションのゴールは、コアのRuboCopに関連する活動全ての中心になることです。より大きなチームを私たちが作りあげていけたらと思っています。できれば、異なるプロジェクト間でより大きな同期ができるようにしたいですね。なぜかというと、現在RuboCopの拡張を書いてくれている人のことを、私はほとんど把握できていないからです。rubocop-rspecの人のことは多少知っています。一番大きくて複雑な拡張だから。でもRuboCop用のRuby gemを検索したら189個もあって、本当にびっくりしました。PockeさんのMryGryなどのgemも実際こうして見つけたんですけどね。RuboCopで一緒に仕事をしていても、これらのGemのことは知らなかった。古いgemの中にも、便利だけどメンテナンスされていないものがありますよね。

なので、情報の中心となるものがあれば素敵ですね。例えば、guard-rubocopのアップデートについて尋ねる人をよく見かけます。開発者であるYuji Nakayamaさんは忙しくて時間がないそうですが、でも彼がこのプロジェクトを移管してくれたら、rubocop-hqの中でメンテナンスしていけるかなと思います。私は皆さんにRuboCopはRubyコミュニティー全体のものだし、スタイルガイドも然り、ということを分かってもらいたいんです。これは既にわたしの個人的なプロジェクトではありませんし、もう長いこと、そういう状況だったと思います。これほど多くの方が使っていて、たくさんのことを行う必要があるならば、これはやはりコミュニティのものでしょう。

f:id:sideci:20180601191145j:plain
左 Bozhidar Batsov氏 右 Pocke氏

Siderの可能性

Soutaro:
弊社のサービスSiderをご存知だといいんですけど。Siderやコードレビューを行う他の同様のサービスが、RuboCopを使用する事でどうコードレビューを改善していけるか、Batsovさんの意見を聞かせてくれませんか?

Bozhidar Batsov:
この質問は「RuboCopがSiderなどのサービスに対して何ができるか」という意味でしょうか。Siderのようなサービスの価値は疑いようがないですが、エンドユーザーの役に立つにはその土台となるツールが必要です。

初めの頃は、重複した作業がたくさんありました。解析となると皆が自分のやり方でやっていて。でもここ数年は、RuboCopなどのツールやライブラリを内部で活用することに皆さんが賛成してくれるので、私は満足しています。つまり、サービスはエンドユーザーエクスペリエンスに注力するようになり、車輪を毎回再発明することをしなくなりました。

私の働く会社では、たくさんの同様のツールを使用しています。RuboCopに関しては、実はGitHubとの独自のインテグレーションが存在します。巨大なコードベースがあるので、我々の望むほどには簡単に移行ができないのです。実際、私たちが一緒に作業するようになるまで(※PockeがRuboCopコミッターになるまで)は、Siderについては知りませんでした。

ある意味では、RuboCopが必要な物を全て兼ね備えた良質なCIを提供できるようなところまで行くといいなと思っています。Siderにとっても、これをどうやって見せていくかというだけの問題になっていくでしょう。Siderのようなサービスに対して、RuboCopがプロファイルのサポートを提供していたら良いだろうなって考えていました。

デフォルトのスタイルが好きじゃなくてカスタムしたものを使いたければ、「GitHubのプロファイル」や「Stripeのプロファイル」を実行したい、というように設定するんです。これはそんなに手間がかかるものではない、数時間でできるんじゃないかな。エンドユーザーにとってすごくありがたいと思いますよ。設定の中にドロップダウンメニューがあって、魔法が起きる。たくさんの人に設定を色々いじる必要があって始めにくいとよく文句を言われますが、こちらがたくさんの設定を予め用意しておいてあげられたら、素晴らしいでしょうね。私は、これはSiderのようなサービスがやるべきことだと思っています。RuboCopではなくて。RuboCopはプロファイルの読み込みに対応する機能を提供し、各サービスがプロファイルを提供する。

それから、誰かが設定のヒエラルキーやオーバーライドを使用している場合、CIやUIがこれを表示してくれるようになると良いですね。いろんな人が違う.rubocop.ymlを別のフォルダに入れては忘れてしまうので、あのフォルダではこのオフェンスが検出されるのにこっちでは検出されない、なんてことが起きたりすることがよくあります。バグの報告を見て、「いくつ.rubocop.ymlがあるんだろう?」なんてこともあります。

inclusionexclusionsも同じです。ユーザーが何かを間違えた際に、「このinclusionで合っていますか?」なんて聞いてくれるUIを表示できたらすごく良いなと思います。exclusionsでも良いんですけど。最近、「RuboCopが.rb ファイルの処理を止めてしまった」というチケットがありました。これはまあ、file includesの中に*.rbがないからなんですね。RuboCopはこの警告をすべきなのかもしれませんが、ただの設定だし、ユーザーが設定を間違えただけなので、しないほうがいいでしょうね。

でも、Siderは、そうした部分を手助けできるのではないでしょうか。

わたしはそんな風に我々の関係を見ています。Siderのようなサービスには、ユーザーを喜ばせるために必要なものを教えてもらう。私たちがその基礎を一緒に作る。そして、Siderは、それを活用するための方法を共有し、Rubyの精神に乗っ取り、人々を喜ばせ、生産性を上げていく。

f:id:sideci:20180601190426j:plain

RuboCop 初心者へのアドバイス

Soutaro:
RuboCop ユーザーや、これからRuboCopを使おうとしている人たちに、コメントやアドバイスをお願いできますか?

Bozhidar Batsov:
マニュアルを読んでください (一同笑) 。私に寄せられる質問の多くや、バグレポートの多くはだいたいマニュアルの中に記載されているんですけど、誰も読んでないんです。

Copについての説明や、何が設定できるのかなど、もっと皆さんに読んでもらいたいですね。設定をいじれるCopがただ無効にされていて、使い方をわかってないんだろうな、という状況をしょっちゅう見かけます。様々なスタイルが設定できるCopなのに、単に無効にしておいて「これの一貫性には気を配らないのか」と言う。非常に問題だと思います。もし、個人や企業でRuboCopを使っていてCopを無効にする際には、.rubocop.ymlの中に説明を残しておいてもらえるとすごく助かります。私や他のRuboCop開発者は、GitHubを検索して何を改善すべきか洞察を得ているので。何も説明が残っていなければ、それが報告されていないバグなのか、何かよくわからないことがあって手助けが必要だったのか、私たちにはわかりません。ドキュメンテーションは完璧からは程遠いですが、そこまでひどくはないと思います。皆さんが少しだけ時間を投資してくださると、ものすごく助かります。

もう一つ、もっと多くの方に提案したいのは、「プロジェクトがそんなに大きくないのなら一気に直してしまう」ということです。警告を一度に全部修正してしまって、「この場合は警告だけどこっちの場合は出さない」というふうな複雑な設定をすることに時間をかけないほうが良いと思います。私の意見では、チーム自体にとっても、コードベースを一度にまとめて綺麗にするほうが良いと思います。コードが10万行以下のコードベースなら、みんなで集中すれば一日か二日で修正することができます。私たちToptalのようにたくさんのRubyプロジェクトとレガシーコードを残念ながら抱えている場合は、もう少し時間がかかると思います。でもそれですら、私たちも最後にはきれいに片付けることができました。違うコードスタイルをずっと切り込み続けることはできないと思います。いずれ、どこかで線を引いて「これはやめた」と言わなくてはならなくなるでしょう。私からのアドバイスは以上です。

Soutaro:
ありがとうございます。最後に、日本のユーザーに向けて、コメントをいただけないでしょうか。

Bozhidar Batsov:
そうですね。日本のユーザーのからの応援は、本当に嬉しいです。最も活発なコミッターの何人かは日本人ですし、もっとたくさんの日本のプロジェクトとか、オーガニゼーションなどに繁に参加してほしいです。日本はRubyコミュニティの中心ですし、RuboCopコミュニティの中心にだってなり得ると思います。

どんな形でもいいので手伝ってもらえることは本当に大歓迎です。日本ではシャイな人が多いようですが、私たち皆、気さくな人の集まりです。Genadi氏が言ったように、ブルガリア人はスラブの楽園に住んでいるので、ハッピーで、ウェルカムな人たちばかりですよ。

Soutaro:
あらためて、あたたかいコメントどうもありがとうございます。

Bozhidar Batsov:
嬉しいです。ありがとうございました。

f:id:sideci:20180601193344j:plain

インタビューのあとで、RuboCopコミッターでありRubyKaigiに登壇もしている伊藤 浩一氏も交え、夕食を一緒にとりました。おいしいお酒とともにRuboCopの話をできて、楽しい夜になりました。

f:id:sideci:20180905174440j:plain

Batsovさん、どうもありがとうございました。また日本でお会いできることをSiderメンバー一同楽しみにしております!


あなたのチームの開発効率向上に!
Siderの自動コードレビューを14日間の無料トライアルでお試しください!


エンジニアが作りたいものを本気で作るための起業という選択肢。起業、Pivot、レビュー支援サービスSiderの着想から現在、未来

$
0
0

第一回:起業、Pivot、そしてコードレビュー支援サービスが生まれるまで

作りたいサービスに全力を投球したいとき、起業は一つの選択肢です。その選択肢をとった開発者として、起業に至るまでのプロセスから現在、そして今後について語りながら、私の経験談・失敗談をお伝えします。起業に興味がある開発者の方や、「社長」という役職の人について知りたい方、技術的な話に疲れてちょっと休憩したい方などのお役に立てればと思い書きました。この秋、Siderが初めてGitHub Universeにスポンサーとして参加することをきっかけとして、私が1人だけでコードを書いていたところから、書かなくなり、CEOとして会社という組織を引っ張っていくようになるまでの物語を、3週に渡りお伝えしていきます。本記事では起業からコードレビューサービスの立ち上げまでを、中編ではSiderの歴史、そして後編では私が成功と失敗から学んだことなどに触れていきます。

はじめに

まずは私を知らない方に向けて、簡単な経歴を含めた自身の自己紹介をさせていただきます。

私は、『Sider』というコードレビュー自動化サービスを提供しているSider株式会社の代表取締役です。TwitterGitHubではsumyapp というハンドルネームで活動しています。元々はプログラマーで、iPhone 3G時代(2009年)にiOSアプリの開発を始めたのがコードを書く始まりでした。Railsは2010年頃にiOSアプリのサーバサイドアプリケーションの開発と、卒業論文用のソフトウェアの開発で触り始めました。初めて触ったRuby on Railsのバージョンは2.3だったと記憶しています。

経歴としては、学生だった2009年から、フリーランスとしてたくさんのiOS/Android/Webアプリを提供してきました。
翌2010年には、Matzさん(まつもとゆきひろ氏)が技術顧問を勤める(楽天ではフェローと呼ばれる)楽天株式会社に入社し、社会人としてのスタートを切りました。2011年からはCyberAgent(Applibot)、 デジタルアドバタイジングコンソーシアム(DAC)などで新規事業立ち上げに携わり、それぞれ企画〜開発〜サーバ保守運用までワンストップで行いました。
その後、株式会社アクトキャットを創業しました。アクトキャットは2度の社名変更を経て、現在はSider株式会社として事業を続けています。

Siderとは何か

Siderはコードレビューを支援する、開発者向けのWebサービスです。GitHubと連携し、Pull Requestが作成されたタイミングでコードを解析、様々な問題を発見し、GitHubに通知します。結果、人がレビューをする前にSiderが問題を見つける(レビューをする)ことで、人のレビューの時間を節約することができます。

Siderは日本発の開発者向けサービスですが、弊社サイトを通じた直接販売だけでなくGitHub Marketplaceでも販売しており、アメリカ、インド、スイス、アイスランド、ベトナムなどをはじめとした世界中の国々で、コードレビューを楽に、より良くするためのサービスとしてご活用いただいています。海外への進出といえば、先日GitHub Satelliteが東京でありましたが、SIder株式会社は10月にサンフランシスコで開催されるGitHub Universeへもスポンサーとしてブースを出しています。GitHub Universeに参加される方は、ぜひSiderブースに遊びに来てください!

SiderとRuby on Rails

SiderはRuby on Railsで作られています。ファーストコミットでは4.0.1rc3が使われていました。
そのため、RubyKaigiには2016年、 2017年、 2018年と3年連続でスポンサー参加しており、メンバーも登壇(2017・2018)するなど、Rubyコミュニティと比較的近い位置で活動しています。また、Siderのお客様に最も人気のあるフレームワークもRuby on Railsです。
Siderは今後もRails開発者の皆様のお力になれるサービスを提供できればと考えています。

f:id:sideci:20180910163048p:plain
Gemfile(Git first commit)

読者の皆さんへ

今回私がこの記事を書くに至ったのは、2014年にSider(元SideCI)の提供を始めて4年間が経過しており、多少は話せることもあるだろうと思ったことがきっかけです。開発者っぽい仕事から、代表っぽい仕事に自分の職務が移り変わってきていて、それはそれで嬉しいような、悲しいようなですが、だからこそ話せることもあるだろうと思っています。恥ずかしながら、いくつかの成功と、それ以上の失敗がありました。それらを経ての振り返りをしつつ、今後、もっと世界中で使われるサービスを目指していきます。
おそらく、ずっと開発者でいたい、かつ開発者でいる予定である方には、多くの学びはないかもしれません。その方々には単に面白さを感じてもらえればと思います。
もしあなたが起業したい方であれば、開発者が起業する場合に役に立つ話になっていると思う(願う)ので、ぜひ役立ててください。何か質問があればお気軽にご連絡ください。
なかには自社の社長が嫌いな方もいらっしゃるかと思います。そういった方々が、少しだけ、社長という役職の人の人生みたいなものを知って、今後ちょっと優しい目で接してあげられるようになってくれると良いな、という気もします。
それでは、起業の話を始めましょう。

起業への道

ソフトウェア開発者であった私が起業に至ったプロセス、起業してから起こったことなどを時系列で紹介します。

そもそも、なぜ起業?

そもそもなぜ私が起業したかについて触れます。起業のメリットは「会社に縛られない」ことだと思います。
私は自分の手でなにか新しいものを作るのが好きです。「プログラミング」よりも「モノを作ること」が好きです。それを育てることが好きです。
会社で新規事業の立ち上げをしていた際には、自分ではどうしようもないように思える制約条件が多いように感じました。予算の制約、人の縛り(社内のこの人とやる必要がある、発注するならこの会社に、など)、テーマの縛り、時期の縛り(新規事業をするタイミングは上から降ってくる)。どれも新規事業を成功させるためには、1つでもあったら失敗するのでは、ぐらいの大きな制約条件です。
その制約条件を限りなく少なくして、作りたいものを作るためには、自分でより多くをコントロールできる、起業という選択肢が良いと考えました。

Pivot,Pivot,Pivot

リリースしたプロダクトは以下のようなものがあります。順番にお話していきます。

  1. お願いカンパニー 2012年(事業譲渡済み)
  2. カットモデルマッチングアプリ 2012年(事業譲渡済み)
  3. プロトタイプを開発しては捨てるの繰り返し & 受託開発
  4. StudyTech / Spath School 2013年
お願いカンパニー 2012年(事業譲渡済み)

起業自体は「なにか新しいものを自分の手で制約なくいい感じに作りたい、育てたい」という動機で始めたことなので、実は当初は、特に「これをやりたい」というものは決まっていませんでした。
なので、1つ目のサービスは、ヤフー知恵袋にポイントが付いたようなものを提供していました。これは自分的にはアプリ名が完全に黒歴史なんですが、「質問に答えてポイントが貰えるQ&Aアプリ、お願いカンパニー」というアプリです。

「質問に答えてポイントが貰えるQ&Aアプリ、お願いカンパニー」
助けて稼ぐ!お願いカンパニー:招待、恋愛相談、質問・疑問へ回答で簡単にこづかい・ポイントが稼げるアプリ - Appliv

ちなみにこれもRuby on Railsで開発しました。
iOSとAndroidは「ガワだけネイティブ」というやつで、Push通知の機構以外は完全にWebViewでした。技術的には何も難しいことはしておらず、技術スタックは言語系はRuby on Rails、 HTML、CSS、jQuery、Objective-C、Android Javaなど。サーバサイドはHerokuとMySQL(Herokuアドオン)でシンプルな構成でした。
2012年当時はたくさんのポイントサイトやアプリがありましたが、どれも広告主が同じで、ポイントを貯めることが難しい時代でした。ポイントという通貨を増やすためには広告主を増やさなければならない、でも広告を出す法人は限られている。であれば個人が出せるようにして、ポイントという通貨の流通量を上げていこう、という目論見で始めました。
一般的にはweb上で何か質問すると、ヤフー知恵袋などの大きなサイトだと回答がつくまでに結構時間がかかりますし、回答も数件程度です。しかし「お願いカンパニー」では質問にポイントを付与したことにより、1時間で数百件の回答が付くようなアプリに仕上がりました。
私は開発当初、以下のような方々がこのアプリを使ってくれると想定していました。

  • ポイントが欲しい、稼ぎたい人
  • 質問に答えてほしい人
  • ネット上で他者と交流したい人

事前の広告費を300万円ほど投下し、「お願いカンパニー」はサービス開始1週間ほどでユーザを数万人獲得することに成功しました。しかしアクティブユーザーは1000人程度にすぐ低下し、その後もどんなに新規登録があってもなぜかアクティブユーザーは1000人程度に戻ってしまう、けれど1000人程度より著しく下がることもない、という謎の現象が続き、結局「お願いカンパニー」を事業譲渡することに決めました。
結果としては、こういうことだったんだと理解しています。 f:id:sideci:20180910163754p:plain

カットモデルマッチングアプリ 2012年(事業譲渡済み)

http://www.cutty.jp/

こちらは今も継続してサービスが提供されています。
どんなアプリかというと、カットモデルを探している美容師と、無料で髪を切りたい人のマッチングサービスです。mixi社が提供している「minimo」に似たサービスです。

「課題解決型のスタートアップがしたい」と思って始めたビジネスで、美容師さんのカットモデルを探す労力は本当に大変そうだな、と思ったのがきっかけです。東京では、カットの練習をさせてくれるカットモデルを探している美容師さんを沢山見かけます。無料で髪をカットしたい人は沢山いるはずなので、マッチングさせようと考えカットモデルを探されている美容師さんにヒアリングを行うと、100名カットがノルマ、200名がノルマ、終電までカットモデルを探している、などの苦労を耳にしました。この課題は非常に大きいと考え、サービス提供を始めました。リリースに併せて、TechCrunch Tokyo Startup Battleにも出場するなどしました。 https://jp.techcrunch.com/2013/11/15/tc-tokyo-2013-startup-battle/

さて、これはリリース後に発覚したのですが、実はカットモデルを探す文化は、東京とそのほか一部の都市に限定されるものでした。私の義姉の美容師に聞いたところ、地方都市ではこの文化はないそうです。
カットモデルのマッチングは東京のみの文化であるため市場が大きくなく、マネタイズが難しい。また、競合企業・サービスも多く、当社で継続してこのサービスに注力するのは難しい。このように判断し、こちらも事業譲渡に至りました。

プロトタイプを開発しては捨てるの繰り返し & 受託開発 2012年〜2013年

この期間はいろいろなアイデアを考え、ヒアリングをし、物によってはプロトタイプを作りました。しかしそれらは、市場がちゃんとありそうか、課題が明確にあるものか、自分がそれに取り組みたいかなどによって、すべて廃案になりました。
この間の売上は受託開発によって上げておりました。当時ご依頼いただいた方々には大変感謝しております。

ここで廃案になったプロトタイプの一つをご紹介します。効果計測が可能なデジタルサイネージアドネットワークのプロトタイプです。iPhoneとディスプレイを接続し、ディスプレイに動画広告などを表示し、同時にiPhoneのカメラから広告を閲覧した人数や時間を、顔認識によって算出します。従来のサイネージ広告では効果計測が出来なかったり、広告の変更に時間がかかったりする(張り直し)といった課題があったところを、iPhoneとディスプレイのみで効果計測・リアルタイムの広告配信・サイネージ広告のアドネットワーク化を実現しようとしたものでした。

f:id:sideci:20180910163903j:plain
顔認識技術を用いたデジタルサイネージアドネットワークのプロトタイプ

これは今考えると悪くないアイデアですが、検討当時いくつかのヒアリングを行ったところ、サイネージを設置する場所の方や広告キャンペーンを企画する人たちの間にそもそも効果計測に関するニーズがないことがわかり、プロダクト化を断念しました。

StudyTech / Spath School 2013年

コンシューマー向けのアプリの博打性の高さが辛くなったのと、ちゃんと人の役に立つことをしたいという思いから、次はオンラインプログラミングスクールをはじめました。2013年のことです。
これらはOnlabの6期DemoDayでも発表させていただいたプロダクトです。

参加企業は2倍の成長を遂げるOnlabシードアクセラレータープログラム・第6期Demo Dayを行いました! - Open Network Lab (オープンネットワークラボ) 次世代の起業家育成を行うOpen Network Labでは、2013年5月14日(火)に第6期シードアクセラレータープログラムの集大成として、Onlab Demo Day Spring 2013を行いました。…onlab.jp

当時はProgateはなくて、CodecademyがSeries Bの調達(累計125万ドル、1.4億円程)といった時期です。日本のプログラミングスクールとしては、比較的早い参入タイミングでした。
当時の既存のプログラミングスクールは次のような課題を抱えていました。それは「プログラミングスクールはたくさんあるけれど教材ありきで、エンジニアの方が生きたプログラミングを教えてくれるスクールは少ない」ということと、「スクールに通ってもプログラミングを教科書通り教わるだけで、実際にモノを作れるスクールがない」ということです。

これに対し、私は「エンジニアが教える」「モノを作れる」ことを目指して事業を始めました。 実際にサービスを提供した結果、次のような課題を感じました。

  • 教材を買っても勉強を開始しない人が9割である
  • 残りの1割の方は初めてのモノ(Webサイト、アプリなど)を作れるレベルまで到達できるが、手間暇がかかり、スケールしづらい
  • 毎日ずっとコードレビューするのがつらい

結局、「教材を買っても勉強を開始しない人から得た売上を顧客獲得コストとして使う」、といったマーケティング主体のビジネスモデルであり、このビジネスモデルが個人的にあまり好きではなかったため、上記の課題と合わせて、事業撤退を決めました。
もちろん、広告ではなく口コミによってユーザを獲得できるようにする道もありました。しかしそれには非常に多くの時間がかかるであろうことが見込まれ、、また、教材を買っても勉強しない人の割合を変えることはほとんどできないだろうと考え、やはり事業撤退をすることにしました。

人生の迷子と転機

ここまで何回もプロダクトを作って、譲渡なり撤退なりをしてきて、次は何をするべきか、会社を閉じる選択肢も含めて検討をする中で、自分を見つめ直しました。2013年11月頃のことでした。しかし1人で考えても結論が出ないので、先輩起業家の方々に相談することにしました。

5人ほどに相談してみたところ(アルファベットは仮のものです)、不思議なことに全員が、旅を勧めてくれました。
そこで、ふらっとサンフランシスコに1人、人生探しの旅に出ることにしました。

旅の中で見つめ直した自分

2013年12月、サンフランシスコを旅しながら、自分はいったい何をしたいと思っているのかを考え直しました。また、課題解決型のスタートアップとして、自分が想像できる、解決したい、身近な課題を見つけるために、自分が今まで何に時間を使っていたのかも見直しました。

その結果、自分がこれまで何をしたいと思って、色々なことに取り組んできたかというと、その根底にあったのは「人の成長に貢献したい」という思いでした。学生時代には講師の仕事をしていましたし、Spath Schoolの事業もプログラミング教室でした。そして、これまで自分がどのようなことに時間を使ってきたのかを振り返ったとき、毎日1時間はコードレビューをしていたことや、そのなかで、コードミスには設計上の問題もあるが、インデントのずれやブラケットの閉じ忘れなどの初歩的なものも多くあったことを思い出しました。

コードレビューを通じて、人の成長に貢献できるもの。それが答えのように見えました。そこで私は、「コードレビューを支援する事業を作ることはできないか」と考えました。

渡米中にSideCIの元になるアイデアを思いつく

当初思いついたアイデア発議は次のようなものです。
「『こう書いたほうが良いよ』とコードに対して自動的にサジェストしてくれる、ルール(辞書)のようなものを作り、それをレビューに活かす、もしくはレビュー前に機械的に修正もしくは修正提案をする」

このアイデアは起業家向けのイベント、Incubate Campで「コードキャット」として発表されました。
http://thebridge.jp/2013/12/incubate-camp-6th-2nd-day

裏話としては、当初このサービスは「CodeMagica」という名前になる予定でした。しかし、とある有名な魔法少女アニメを連想させるとの意見がありボツ案となり、結局その時点での社名だったアクトキャットにちなんで、「コードキャット」と名付けられました。

ただしコードキャットはドメイン名などが取れなかったことから、.comドメインが取得可能で、短く覚えやすい名前として、すぐに「SideCI」という名前に変更を行いました。SideCIのネーミングの由来として、過去の社内ドキュメントで次のように記載しています。

SideCIの "Side"の意味

Sideはいつも開発者さんの隣でお力になれるよう見守ってます。何か間違ったことをしそうになったらそっとそれに気づかせたり、教えたり。逆に、皆さんから教わることも多々あります。Sideは教えてもらったことをずっと忘れずにいて、それを活かせる機会が訪れたら、また私はそれを開発者さんに気づいてもらうために使うのです。

CircleCIやWerckerCIさんなどは「開発者の代わりに」仕事をするために産まれたのかもしれません。SideCIは他の方とは違って、開発者の隣でお役に立てる、メンターのような、パートナーのような、同僚のような、そんな存在になるために産まれたのだと考えています。

その後、2018年6月にSideCIから「Sider」へと名前を変えることになりました。これらが2013年12月頃の、コードレビュー自動化ツール『Sider』の始まりの物語です。
2014年1月からはプロトタイプをともに、ユーザヒアリングに明け暮れました。

Siderが始まった後、どのようにコードレビューサービスのプロダクトを育ててきたかについては、次週9月20日に公開する中編でお話していきます。


あなたのチームの開発効率向上に!
Siderの自動コードレビューを14日間の無料トライアルでお試しください!

エンジニアが作りたいものを本気で作るための起業という選択肢。起業、Pivot、レビュー支援サービスSiderの着想から現在、未来

$
0
0

第二回 コードレビュー支援サービスSiderの歴史

この秋、Sider株式会社が初めてGitHub Universeにスポンサーとして参加することを記念して、事業立ち上げから、コードレビューサービスであるSiderを提供する現在にいたるまでを振り返るシリーズ記事を三週続けてお届けしています。
先週公開した前編では、CEOである私がどのように起業を志し、最終的にSiderというサービスを立ち上げていったのかをお伝えしました。今回は、Siderの歴史について書いていきたいと思います。

先週までのあらすじ

学生時代からのアプリ開発経験、そして会社員時代にはプロジェクト立ち上げなどを経て、課題解決型のスタートアップを起業することに決めた私は、コードレビューを支援する事業を立ち上げることを決めました。以前の名前のSideCI、そして現在のプロダクト・社名のSiderにも含まれる「side」というのは、いつも開発者さんの隣でお力になれるよう見守る、開発者の隣でお役に立てる、メンターのような、パートナーのような、同僚のような、そんな存在になれるように名付けました。

SideCI プロトタイプ 開発スタート 2014/1

紆余曲折を経て2013年12月頃にアイデアを発議したコードレビュー自動化ツール『SideCI』(現在のSider。前編参照)は、2014年1月から実際の開発に進みました。CTOの友人たちへのヒアリングのおかげでコードレビューのプロセスに課題があることが明らかになってきたため、課題を解決するプロトタイプの開発に乗り出しました。
ちなみにこの時のメンバー構成は、自分を含めた計3名の開発者がいるだけで、開発以外の業務は全て自分のみでカバーしていました。

プロトタイプの機能は、ユーザーがZipでアップロードしたソースコードをSideCIがサーバサイドで解凍し、rails_best_practices gemで解析した結果をHTMLで表示する、というものでした。今思い返すと、当時の自分はなぜこれがMVP(Minimum Variable Product)だと思っていたのか全く理解ができません。明らかに手元のPCのコマンドラインでgemを実行するのとほとんど変わらない、もしくはコマンドライン実行の方が便利そうです。

f:id:sideci:20180910165443p:plain
(プロトタイプの画面)

しかし開発当初は、このプロトタイプをもってユーザヒアリングを進めていました。

SideCIベータ版リリース 2014/4

コードレビューをどのようにしているのか、このMVPでコードレビューが楽になるかといったことをヒアリングさせて頂いたところ、多くの方がGitHub Pull Request上でコードレビューをしている、Zipでアップロードするのは面倒でやらないだろう、といった意見が多く、GitHub Pull Requestと連携するのがシームレスだろうと考えました。そのため、GitHubと統合した形でSideCIベータ版の開発を行いました。
ベータ版は、『コードレビューの自動化』をコンセプトとしてすべてのコミットを静的解析器で解析し、結果をGitHub Commit Comment APIでコメントするものでした。解析部分の実装はHeroku上でgit cloneを行い、rails_best_practices gemなどの解析器をKernel.#systemで呼び出す形です。

しかしこのベータ版は大きな2つの問題を抱えていました。一つは、Herokuでのコードの解析には当時のHerokuの最大スペックのPX Dyno(8コアマシン)でもメモリが足りないということ。もう一つの問題はrails_best_practicesが親プロセス(Railsアプリケーション層)ごと巻き込んで死ぬことがたびたびあるということ。つまり、本当にシステムが安定しなくてダメでした。

そのほか、密結合なマイクロサービスアーキテクチャを取っていたため、最小のサーバ構成がHerokuのPX Dynoが4台であり、毎月$2000が必要でした。売上がないベータ版の状態でこの費用は大きすぎました。
またプロダクトの機能面でも、すべてのコミットを解析してコメントしてしまうため、非常にうるさいサービスでした。そこでベータ版リリース後、Pull Requestの作成と更新のタイミングでのみコメントを行うように仕様を変更しました。 f:id:sideci:20180910165538p:plainhttps://web.archive.org/web/20140812205202/https://www.sideci.com/

f:id:sideci:20180910165625p:plain
(ベータ版のリリース記事)

https://jp.techcrunch.com/2014/04/30/%E3%82%A2%E3%82%AF%E3%83%88%E3%82%AD%E3%83%A3%E3%83%83%E3%83%88%E3%81%AE%E3%80%8Csideci%E3%80%8D%E3%81%AF%E3%80%81%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%82%92%E8%87%AA/

Dockerベースに移行 2014/9

SideCIベータ版の「HerokuでKernel.#systemを呼び出して実行する」という形は不安定であり、また、並列実行する際にはセキュリティ上の懸念がありました。そのため、アーキテクチャをDockerベースに変更しました。具体的にはHerokuからAWSにシステムを移行し、EC2上にDockerコンテナを起動し、そのコンテナにSSH接続を行ってコンテナの中でgit cloneや解析器の実行をするという形です。
この形を採ることで、Herokuで動かしていたベータ版よりは動作がマシになりました。ただし、時折Dockerのインスタンスが残ってしまったり、コンテナ内で暴走したプロセスをきちんと終了できなかったりといういくつかの問題があり、残念ながら不安定な状態が続いていました。

f:id:sideci:20180910165834p:plain

https://web.archive.org/web/20141230072517/https://www.sideci.com/

最初の危機 2014/11

f:id:sideci:20180910170305j:plain
(Paul Graham氏の提唱するスタートアップ曲線。出典:http://www.fastcompany.com/1825877/5-things-i-learned-about-entrepreneurship-y-combinators-paul-graham

スタートアップ企業は往々にして、「愚かさがクラッシュ」(Paul Graham氏の提唱するスタートアップ曲線の中での、The Crash of ineptitudeと呼ばれる停滞期の後にくる事業が落ち込む時期のことを指す)するタイミングがあります。Siderは2014年の11月、この「愚かさのクラッシュ」、つまり最初の危機を迎えました。

不安定なシステムと合わせてメンバー間の仲も不安定になりました。結果、一度チームは崩壊を迎え、私がCEOとCTOとそのほか全部を兼任する、1人体制になりました。

設計をゼロからやり直し。再リリース 2015/2

チームが崩壊した後、メンバー構成は 暫定的に、私とフリーランス1人の2人体制になりました。そこでまずはシステムの不安定さを根本的に解決するため、アーキテクチャの根本的な見直しをはかりました。具体的にはSSHでDockerコンテナに接続する形を廃止して、docker exec rubocop –R dirnameといったコマンドをSidekiqのWorkerプロセスから呼び出す形に変更し、WorkerプロセスやDockerコンテナが暴走した場合にはKill、そこにRailsアプリケーションと、解析器の間に中間層のような構造を導入しました。それに合わせて各静的解析器の解析結果を共通の形式に変換し、GitHub APIに送信する形にも変更しました。
その後、SideCIに一瞬テスト&デプロイ機能が付いたこともありました。 2015年3月のことですが、文字通り、Side「CI」に一瞬なったわけです。この変更により、コードレビューの自動化サービスから統合的なCIのサービスに進化(?)しようとしたのですが、「TravisCIやCircleCIでやるからその機能は要らない」という意見が多く、すぐに撤退することになりました。

f:id:sideci:20180910170431p:plainf:id:sideci:20180910170518p:plainhttps://web.archive.org/web/20150322061315/https://sideci.com

Ruby以外の言語のサポートを開始 2015/7

結局SideCIがCIであったのは短い間でしたが、Dockerコンテナをベースとし、解析器の出力結果の取り扱いを共通形式に変更したことによって、新しい解析器のサポートが容易になる、といういい面もありました。新しい解析器の追加によって、様々なプログラミング言語をサポートすることも可能になったため、2015年夏頃からはRuby以外の言語のサポートを開始しました。SideCIから名称を変更した現在のSiderは20以上の解析ツールに対応していますが、これはその第一歩とも言えます。また、テスト機能を廃止したことで、レビューのみに再度フォーカスしようということになりました。レビューの自動化を集中して扱うサービスにしようという動きが本格化したのもこの時期です。

f:id:sideci:20180910170535p:plainf:id:sideci:20180910170706p:plain

https://web.archive.org/web/20160207112639/https://www.sideci.com/

1人→3人に 2015/11

新しい道を歩みだしたSideCIの元に、少しずつ新しいメンバーも集ってくれました。一人目はPockeです。SideCIについてエゴサーチしていた際に、TwitterでPockeのつぶやきを発見したことが縁となり、2015年10月、学生アルバイトとして迎えることになりました。PockeはSideCIを作っていく中でOSSのRuboCopにコミットを続け、RuboCopのコアコミッターとなり、2018年4月には当社の技術顧問に就任しています。さらにその後、2015年11月にはVPoE・取締役に就任する開発者も入社し、株式会社アクトキャットは3人体制になりました。

資金調達(4度目) 2016/3

その後順調にメンバーも増え、プロダクトも安定して動作するようになったので、事業拡大のために4度目の資金調達を実施しました。この頃はSideCIには指摘を修正するPullRequestを自動的に作成する機能も提供されていました(現在は廃止)。そして2016年4月、SideCIはついに「正式版」としてローンチします。

負債カンバン機能をリリース 2016/8

続いて、技術的負債を可視化する『負債カンバン』という機能をリリースしました。これは「技術的負債を返したい、けれど返せていない」という課題を解決する機能です。スタートアップのフェーズなどでは、コードの善し悪しは気にせずとにかく機能をリリースして、「技術的負債」の名前の通り、先に作った負債を後で返済する(リファクタリング)、といったことが多くあります。負債カンバンは、その「後に返済する」ことを支援するために作られました。裏側は静的解析器を使っており、解析結果にファイルの修正頻度などを加味してSider側で優先度付けをし、それをトヨタ生産方式やアジャイル開発で有名なカンバン形式で表示したものでした。

f:id:sideci:20180910170813p:plain
(出典:TechCrunchで紹介された際の記事https://jp.techcrunch.com/2016/08/31/sideci-introduces-technical-debt-kamban/

受賞 & 再度、愚かさがクラッシュ 2016/12

こうして軌道に乗り始めたSideCIは、2016年の末には、「コードレビューの支援」という製品の性質や製品自体、Rubyコミュニティへの貢献などを評価され、Ruby biz grand prix 2016 special prizeを授与していただきました。

f:id:sideci:20180910170914j:plain
(Ruby biz grand prix 2016 授賞式)

しかしここで「愚かさのクラッシュ」が再来しました。Ruby biz grand prix 2016授賞式のわずか数日後、VPoEから退社したい旨の相談を受け、実際に退社することとなりました。この頃は資金調達の活動中であり、また、VPoEが取締役に就任してからまだ4ヶ月という時期でした。突然の事態に私やチームは驚きでいっぱいになり、開発チームに再び混沌が訪れてしまいました。
VPoE退社への応急処置として、翌2017年の1月から新人事とスクラム制の導入を行いました。当時、前職でもCTOを長く務めていたsoutaroが社内にいたため、VPoEに代わり、急遽CTOに就任してもらうことにしました。また、VPoEが抜け、かつCEOは資金調達で忙しいことからプロダクトマネージャーが不在がちになってしまうという問題に対しては、スクラム制を導入しました。こうしてなんとかCEOが製品開発の優先度付けだけはできるように体制を整え、SideCIの2017年が幕を開けました。

SideCIのレビューフローを「コメント」からWebUIへ変更 2017/1

それまでのSideCIは発見したコードの問題をGitHubのPull Requestにコメントしていました。これには指摘が読みやすく、GitHub上で完結するというメリットがある一方で、指摘が多くなるとPull Requestのページが開けなくなることや、開くのに時間がかかること、SlackとGitHubが連携している場合にSlackがNoisyになること、などの様々な問題がありました。この問題を解決したいと考え、ユーザ体験の変更に着手しました。
ここでSideCIは、WebUIで指摘を表示する形に変更されました。さらに、SideCIが提示した指摘を無視することもできるようにしました。この変更にはSideCIの指摘が有用なのかどうかや、ユーザが指摘をどう判断しているのかを知りたいという意図もありました。それが判れば、SideCIが提供した指摘が「誰にとっても有益な指摘」「そのプロジェクトでだけ有益な指摘」「誰にとっても無益な指摘」のどれだったのかを知ることができます。この非常に有益な情報を元に、レビューの品質や量、誤検知率などの改善を繰り返してきました。

f:id:sideci:20180910171444p:plain

https://blog-ja.sideci.com/entry/abyssinian_beta_release

資金調達(5回目。累計調達は3億円超に) 2017/4

この時点でエクイティファイナンス及び長期のデットファイナンスの累計額は、3億円を超えました。この頃にはお客様の解約率も低く、また新しいお客様も日々オーガニックに入ってくるようになっていました。SideCIはプロダクトマーケットフィットに到達したと考え、継続的な製品開発並びに販売拡充のために新たに資金の調達を行いました。会社としても新たなフェイズを迎えるための準備が再び始まりました。

人事についても見直しました。2016年12月のVPoE退職から、開発体制は私をプロダクトオーナー(PO)としたスクラム開発になったままでしたが、この機会に自分をCEOとしてセールスやマーケティング、採用の核となるため、POをSoutaroに委譲しました。Soutaroはプログラムの解析の有識者で、プログラミング言語の型解析の論文などによりPh.Dを取得しており、Ruby3x3プロジェクトの一つである静的型推論の実装steepの開発者でもあります。
元からSideCIは静的解析を用いたコードレビューの自動化や支援に集中していたため、RuboCopやReekのコアコミッター、コミッターがメンバーとして在籍しておりました。SoutaroのPOへの就任はこの方針をより強化しました。結果、SideCI株式会社はレビューできる範囲を広げるための新しい解析器やQuerly(Ruby)、Goodcheck(全言語)の提供や、それに合わせたWebUIの提供などに集中できるようになりました。

参考: 誤検知を増やしても良い、増やせるようにし、レビュー範囲を広げる
https://blog-ja.sideci.com/entry/2017/04/07/161025

合わせて、機能を取捨選択し、ユーザにとってより使いやすいサービスにするため、「負債カンバン」などのコードレビューに直接的な関連性の薄い機能は廃止されることになりました。

参考: クラシックモードを廃止し、開発リソースをコードレビュー自動化カバレッジの向上により集中
https://blog-ja.sideci.com/entry/2017/09/06/160514 Styleint, Java, Misspell, Flake8プラグインサポートなどを追加したのもこの時期です。より多くの人に、より充実した内容のコードレビューを提供できるSideCIになれるよう製品改善を進める姿勢は、現在も大切にしています。

マーケティング & セールスへの集中

製品の質を高める一方で、より多くの方にSideCIを使っていただきたいという思いが大きくなりました。そこで2017年からは製品を世界中へ拡大させるために、イベントへのブース出展や登壇による認知度の拡大を図っています。以下はその一例です。

  • RubyBusiness User Conference
  • RubyKaigi2018
  • RubyConf Taiwan
  • Rails Developers Meetup
  • GitHub Satellite 2018 Tokyo
  • Code Review Meetup(自社にて4回開催)

SideCIからSiderに名称変更 2018/6/13

2014年リリース当初から約4年間ほど「SideCI」という名称でサービスを提供してきました。おかげさまで新規のお客様も途切れることなく、日本の開発者の方々の中では「SideCI」の知名度は高いと考えています。
一方、アメリカや台湾などの海外では、SideCIの話をするたびに、「テスト&デリバリー(CI)のためのサービスと何が違うのか」「テスト&デリバリー(CI)はもう使ってるからSIdeCIは必要ではない」といった話を聞く機会が多くあり、「CI」がサービス名に含まれていることの弊害を感じることも多々ありました。「SideCI」という名称のままでは今後も同様の状態が続くだろうと考え、製品名の変更を決定しました。GitHub Satellite 2018に登壇した際にアナウンスを行って以降、「Sider」として製品の提供を続けています。また、2018年8月31日時点ではまだ当社からのアナウンスは行われておりませんが、GitHub Enterpriseに対応したSiderの提供を開始しました。結果、様々な大手企業にもSiderの導入が進むようになりました。

参考: https://githubsatellite.com/

Siderはこのように着想から色々な困難を乗り越えてリリースされ、約4年間皆さまからいただいたフィードバックとともに歩みながら、いまお届けしているSiderになりました。Siderは、これからも皆さまの隣に寄り添う「Sider」であり続けます。

これから

今後Siderをより多くの人々に広めていくため、2018年10月16日、17日にサンフランシスコで開催されるGitHub Universeという大型イベントのスポンサーやブース出展を行います。もし機会がございましたら、ぜひブースに遊びに来てください。様々なノベルティをご用意して、皆さまのご来場をお待ちしています。

f:id:sideci:20180910171759p:plainhttps://githubuniverse.com/


あなたのチームの開発効率向上に!
Siderの自動コードレビューを14日間の無料トライアルでお試しください!

エンジニアが作りたいものを本気で作るための起業という選択肢。起業、Pivot、レビュー支援サービスSiderの着想から現在、未来 (3/3)

$
0
0

最終回: 失敗と成功を重ね実感した、エンジニアの起業の強み

この秋、Siderが初めてGitHub Universeにスポンサーとして参加することを記念して、事業立ち上げから、コードレビューサービスであるSiderを提供する現在にいたるまでを振り返る、記念シリーズを三週続けてお届けしています。前編ではCEOである私がどのように起業を志しSiderを立ち上げたか、中編ではSiderの歴史についてをお伝えしました。 シリーズ最終回となる今回は、Siderの成功と失敗から学んだこと、エンジニアの起業がなぜ有利なのかなどについて、書いていきたいと思います。

Siderを作っていく中で学んだこと

私がSiderを作っていく中で学んだことを大きく分類すると、次の3つが非常に大きいポイントだったと思います。

  1. ソフトウェア開発は難しい
  2. デザインは大事
  3. 現金や売上は大事

ソフトウェア開発は難しい

当たり前のことに感じるかもしれませんが、ソフトウェア開発は難しいです。プロダクトの種類によって、必要とされるリソースや技術は異なるうえに、Siderというプロダクトの性質上、専門的スキルが必要とされました。

求められるリソースの違い

Siderを始める以前に開発していた製品の開発工数は、短いもので1人日、長いものでもiPhone・Android・サーバサイド全部含めて6人月程度と、比較的小さいものでした。そのため、Siderのプロトタイプやベータ版の開発にも同等の工数を見込み、4人月程度の工数を掛けました。

ただし、これではSiderは全く正常に動作しませんでした。インフラの不安定性、最良ではないユーザ体験、継続的な機能追加の難しい設計、高いサーバコスト、沢山の問題がありました。改修には多くの時間を要しました。

実際に開発して提供する製品・ソフトウェアの種類によって、必要となる開発リソースは大幅に違います。日本のスタートアップ企業では開発リソースにそれほどの工数を必要としないものを提供している企業も多いかと思います。その経験や前提で走り始めると、必要なリソースを見誤ります。ソフトウェア開発の難しさの一つです。

求められる技術セットの違い

「必要なリソース」は人数の話だけではなく、開発者の技術セットについても当てはまります。iOSのアプリケーションを作ることと、Job Queueを用いてDockerのコンテナをコントロールするインフラ・アプリケーション基盤を作ることは、必要となる技術スキルが全く異なります。

「フルスタックエンジニア」という肩書き、役割、職能の方はスタートアップ企業において非常に重宝されます。企業のバーンレート(毎月の支出)を低く抑えながらプロダクトを提供していくためには、フルスタックエンジニアが必要です。私もUIの簡単なデザイン、プロダクトの導線の設計などの企画面、iOSやAndroidなどのスマートフォンアプリケーション、Ruby on Railsを用いたサーバサイドの開発(もちろん他のWebフレームワークも使えますが)、AWSなどのIaaSを使ったサーバの運用など、一通りのことが行える、いわゆる「フルスタックエンジニア」です。

ただし、私のスキルだけでは、Siderを安定稼働させることや、拡張性の高い良い設計にすることなどはすぐには行えませんでした。学びながら進めていくことはできますが、それでは開発が思うように進まず、時間が掛かってしまいます。

「すべてのことを知っている開発者」になることは非常に難しいです。だからこそ、「この製品に必要なこの技能を有している開発者」をメンバーに迎え、チームを作っていくことが必要です。

専門的なスキルの要求

Siderは静的解析を軸にコードレビューの自動化を提供しています。そのために静的解析器への積極的なコントリビューション(RuboCopなど)を業務として行っていますし、Siderの開発のために、それらのコードをよく読み、お客様からの問い合わせの際に静的解析のライブラリを読んだ上でのサポートなども行っています。

また、より広い範囲、より多くの内容、より役に立つ内容をSiderのコードレビューで提供していくため、自社製のコードの解析器の開発も行っています。 例: Querly、Goodcheck、PHPQuerly

これらにはソースコードを解析するためのプログラムを書く技能が必要であり、非常に専門的な技能が要求されます。サービスの独自性、高い価値を提供していくためには、尖った・突き抜けた、高い技能が製品のコアとなる部分に必要とされます。 もちろんサービスを提供しながら、作りながら、学習していくことも多くあると思います。ただし事業によっては、それでは速度が間に合わないため、初めから高い専門技能を持った開発者が必要です。

ソフトウェア開発は本当に難しいのです。

2.デザインは大事。

良い製品には良いデザインが不可欠です。見た目の面・ぱっと見の印象の良さも必要ですし、良いユーザ体験のためにも必要です。初期のSiderはエンジニアのみで開発していたため、見た目は非常にダサかったです。(初期のデザインについては前章のブログ記事をご覧ください。) ぱっと見の印象で、「モダンなイケてるサービス」かそれとも「趣味で作っているサービス」か、といった製品そのものの価値に対する印象まで変わります。Slackが一気に普及したのも、機能面についての要因もありますが、デザイン、ユーザ体験の面も大きな理由かと思います。

また、スタートアップの初期はユーザへのヒアリングが重要です。もちろんCEO、CTOも行いますが、ユーザに寄り添えるデザイナーがいることは大変貴重だと思います。特に法人向けのサービスの場合、展示会などへの出展なども多くする必要があり、ブースのデザインやノベルティグッズのデザインをメンバーとして一緒に取り組んでくれるデザイナーの存在は非常に重要です。

f:id:sideci:20180919133643j:plain
(ブースの一例)

3.現金や売上は大事

現金や売上は選択肢を増やし、心に安寧をもたらす

現金や売上は選択肢を増やし、心に安寧をもたらす 当たり前のことですが、会社に現金があることや、売上があることは重要です。 売上があると、会社が長く走り続けられるようになる、もしくはずっと黒字経営で無理せずに事業を展開していくことができます。心の安寧が得られます。

また、現金が多くあれば多くの選択肢を得ることができます。開発者を多く雇い、機能開発への積極的な投資や、販売活動への投資など、多くのことが可能になります。当然ではありますが、現金は重要です。

創業社長エンジニアはエンジニアではなくなる

資金調達は社長の時間を多く必要とします。社長がエンジニア業務も兼任している場合、資金調達のタイミングではコードを書く時間が無くなり、サーバの運用保守に当てられる時間も少なくなるので、それまでにそのほかの開発者の方をチームに加える必要があります。

その後はチームをスケールするための仕事などが多く待っているので、社長がコードを書くことができる時間は減っていきます。そですから、コードを書き続けたいエンジニアの方には、社長というポジションは残念ながらおすすめできません。

正しい事業計画が必要

ビジネスの成長のためには多くのリソースを必要です。開発、販売、認知、様々なことに成し遂げるためには、人とお金が不可欠です。開発者を主として構成されたチームの場合には、受託開発などを行いながらサービスを作っていくという手段もありますが、そうでない場合や、競合企業が多くあるマーケットに製品を展開している場合、受託開発をしている時間はありません。

製品開発の際に必要な時間・工数は少なく見積もられがちですが、事業計画、必要な資金額などについても、経営者は甘く見積もりがちです。事業を継続的に成長させていくためには、正しい事業計画が必要です。エクセルやGoogle Spreadsheetと向かい合うことはエンジニア社長にとっては退屈な作業ですが、非常に重要な仕事であり、欠かすことはできません。

エンジニア起業家の良い点

失敗しても、生きていける。生きている。

多くのスタートアップ企業は1年以内に、「チームが崩壊する」「現金がなくなる」等の理由によって、解散や冬眠に追い込まれます。しかし、エンジニア起業家(エンジニア社長)の良いところの一つとして、「生きていける」ということがあげられます。

褒め言葉かどうか微妙ですが、私は、同じ頃に起業した友人や、株主の方からは「サバイバー」と呼ばれています。創業からすでに6年以上が経過しているのですが、創業してからの2年間である2012年5月〜2014年2月の間には、初回の100万円の資金調達だけしかしていませんでした。少ない資金調達でこれだけ長い期間サバイブ(生存)することができたのは、受託開発などによって日銭を稼げたからであり、開発者主体であることが寄与しています。

また、社長がエンジニアなら、会社がたった一人になってしまった場合でも、製品開発と受託開発により、会社を存続しながら、事業を作っていくこともできます。「社長一人で製品を作りながら受託開発をする」というのはあまり幸せなストーリーではありませんが、その選択肢を選ぶことができること、作りたい事業を作れることは幸せなことです。

エンジニアであることは投資家からも評価される

エンジニア起業家は投資家から高い評価を受けやすいです。多くの起業したい方はまず「プロダクトが作れるのか」という初期の壁にぶつかりますが、社長が自分自身でプロダクトを作れるならば、その壁にぶつかることはありません。そのため、エンジニア起業家は投資家からも相対的に高い評価を得られます。私も初期の資金調達は、「アイデアはないがプロダクトを作る能力はある」というだけで行っていました。

起業することなく、資金を必要とせず、事業を作れる

会社で働きながらプロダクトを作ることがエンジニアならできます。最近は起業と同時に資金調達をする企業が多いですが、昔の日本ではあまりその手段を取れず、会社に勤めながら事業を進める方が多かったと思います。様々な意見がありますが、会社で働いて安定的な収益を得ながら、業務時間外に製品を作り、事業が成長してきた(プロダクトマーケットフィットに到達した)タイミングで法人化することは、非常に合理的だと考えます。

社長が非エンジニアの場合には、誰かコードを書いてくれる人を探したり、技術的に可能かどうかを調べてくれる人を探したりするところから始めることになり、非常に難しいですが、エンジニアの方であれば、プロダクトマーケットフィットやもしくはその近くまで、一人でサイドプロジェクトとして進めていくことができます。

おわりに

この記事に書いたように、エンジニアが起業することは、ビジネス系の方が起業するのに比べていくつかの大きなメリットがあります。作りたい製品や世界がある方は、挑戦してみてはいかがでしょうか。

これにて、SiderのてGitHub Universeスポンサー記念の3週連続投稿ブログ記事はおしまいです。もし追加で聞いてみたい話などがあれば、サンフランシスコで10月16日、17日に開催されるGitHub Universeのブース会場でお会いしましょう! ここで、これからGHUの参加券を購入する方に向け、Siderが特別に優待クーポンをご用意いたしました!ご参加をご検討の方はぜひこちらの20% OFF クーポンコード: 『GHU18SideCI20』 をご利用ください。

「USAまで行けないよ!」という方もご安心ください。Siderはそのほかにもイベントを多く開催しています。直近では9月13日にCircleCIとの合同イベント、9月27日にRuboCopのコミッターの方などを招いたCode Review Meetupを主催しました。これらのイベントレポートも順次発表していく予定ですので、ご興味のある方はぜひご覧ください。また主催だけでなく、Siderのメンバーはいろいろなイベントに参加しています。見かけた際にはぜひお気軽にお声がけください。 Siderをご利用いただいた上でのフィードバックなども頂ければ、とても嬉しいです。

Siderは今後もより便利なコードレビュー支援サービスを目指して、機能拡充を続けます。世界中で使われるように、世界中への販売活動に注力しています。これからも応援のほど、よろしくお願いします!


あなたのチームの開発効率向上に! Siderの自動コードレビューを14日間の無料トライアルでお試しください!

外部コラボレーターへのシート割り当て機能を改善しました

$
0
0

こんにちは。プロダクトチームの木庭(@ybiquitous)です。

Siderでは、オーガニゼーションオーナーはプライベートリポジトリの解析結果を閲覧するユーザーに対して、シートを割り当てる必要があります。 従来はオーガニゼーションのメンバーのみにシート割り当てが可能でしたが、今年の8月から外部コラボレーターへのシート割り当てに対応しました。

しかし、一部のユーザーに混乱を招くUIであったため、改善されたUIをこのたび9月14日にリリースしました。

こちらが古いUIの一例です。“Outside collaborators”の下にコラボレーターがずらっと並んでおり、情報過多の印象を与えます。

古いUIの一例
古いUIの一例

今回のリリースでは、Siderユーザーの検索ボックスUIが追加され、外部コラボレーターを簡単に検索できるようになっています。 そして、未割り当てのコラボレーターは初期状態では表示されなくなりました。これにより、視認性が向上しています。

コラボレーター検索
コラボレーター検索

このUIを試すには、以下のステップが必要です(シートプランを購入済みのオーガニゼーションに限ります)。

  1. Siderダッシュボードにアクセス。
  2. 管理者権限をもつオーガニゼーションのリンクをクリックし、オーガニゼーションページに移動。
  3. “Users”タブをクリック。
  4. Siderにサインアップ済みの、そのオーガニゼーション関連ユーザーが1人でも存在すれば、検索ボックスが表示されます。

これにより、そのオーガニゼーションのメンバーでなくとも、コラボレーターとして任意のユーザーにそのオーガニゼーションのシートを割り当てることができます。

今後もSiderプロダクトチームはUIを定期的に改善していく予定です。

フィードバックやご不明点がございましたら、お気軽にSiderの右下のチャットボタンよりお問い合わせください!


あなたのチームの開発効率向上に!
Siderの自動コードレビューを14日間の無料トライアルでお試しください!

CircleCI×Sider 合同 Meetupを開催しました!

$
0
0

去る9月13日、GINZA SIX10階にある株式会社プレイドのオフィスにて、CircleCI/Sider合同Meetupを開催しました。

CircleCI、そしてSiderを普段ご活用いただいている企業四社の担当エンジニアのかたより、各社におけるSiderやCircleCIの活用法について、様々なお話を聞かせていただきました。

当日の会場提供にご協力いただいた株式会社プレイドの真新しいオフィスは、室内に芝生などがあり、とてもおしゃれで広々とした空間でした。

f:id:sideci:20181001184553j:plain
(サッカーボールもある!)

まず最初にご登壇いただいたのは、会場ホストでもあった株式会社プレイドの駒崎幸之氏。 ITベンチャー企業にてフロント、DB、インフラ、開発環境改善業務を経て、2017年6月より株式会社プレイドでKARTEの開発に携わさる駒崎氏は、『PLAIDにおけるCI/CD環境 (スライドURL: https://speakerdeck.com/komukomo/development-and-deployment-at-plaid)』 というタイトルで発表してくださいました。メインとなる開発言語がJavaScriptのプレイドさんでは、開発フローでGitHubやCircleCIを活用していること、またリリースフローではNetflixのOSSであるSpinnakerを利用していることなどをご説明いただきました。

f:id:sideci:20181001184645j:plain
プレイドのリリースフローを表すスライド

二人目の登壇者はGVA TECH株式会社のCTOである本田 勝寛氏。主にスタートアップにてソーシャルゲーム・アドテク・シェアリングエコノミー領域に携わった後、2017年9月、契約書のAIによる判定サービスや、契約書の雛形ダウンロードや作成サービスを提供するGVA TECH株式会社のCTOに就任された本田氏は、『Siderで運用コスト下げて創業フェーズを乗り切る(https://www.slideshare.net/KatsuhiroHonda/sider-114364294)』というプレゼンタイトルそのままに、自動コードレビューツールであるSiderを利用してコーディング規約をチームメンバー間で統一していることや、プロダクトを個別ではなく全体的な最適化を図っていることなどについてお話いただきました。

f:id:sideci:20181001184944j:plain
(このプレゼンを凝縮したかのようなスライド)

つづいては、日本だけでなく海外進出もはかるフリマアプリを提供する、株式会社メルカリより鈴木祥真氏がご登壇。2016年よりメルカリで1人目のSoftware Engineer in Test を務められ、現在はマイクロサービス化方面で奮闘なさっているという鈴木氏は、『ソフトウェア開発のフィードバックループ( https://speakerdeck.com/shomas/feedback-loops-in-development )』をテーマに話してくださいました。デザインレビュー、コンパイル、コードレビューなど開発のサイクルのさまざまなステージで発生するフィードバックとその時間やコストなどについてお話しいただいたのですが、中でも印象的だったのが『HRT原則』です!鈴木氏はコードレビューの際に「Humility (謙虚)」「 Respect (尊敬)」Trust(信頼)」という3つの要素からなる『HRT原則』を大事にされていて、問題が発生したときは「チーム対問題」として捉え、人格攻撃をしないように心がけている、ということでした。これは開発者だけでなく、あらゆるチームに活用できる考えではないでしょうか。

f:id:sideci:20181001185047j:plain
デザインレビューについて説明する鈴木氏

そして、この夜のトリを飾ってくださったのは、株式会社クラウドワークスの五十嵐 英樹氏でした。「より快適に開発がしたい」をモットーに、インフラからCI/CD、ChatOps、開発プロセス改善まで幅広く活動されてきた五十嵐氏は、2015年より株式会社クラウドワークスにてメインサービスである日本有数のクラウドソーシングプラットフォーム、CrowdWorksの開発に取り組んでらっしゃいます。本Meetupでは、『CrowdWorksにおけるCircleCIとSiderの活用法 ( https://speakerdeck.com/hideki/how-to-use-circleci-and-sider-in-crowdworks )』について講演していただきました。CircleCIに関しては、GitリポジトリをShallow Cloneして速さの改善を行っていることや、キャッシュを一斉にクリアするための戦略、CircleCI 2.1で可能になる機能などをレクチャー。続いてSiderの活用事例として、五十嵐氏は現在各リポジトリ言語の主要Linterを有効にされているそうなのですが、そのうえでRuboCopやQuerly、Misspellなどをどのようにカスタマイズして活用しているかという具体的な例を紹介していただきました。

f:id:sideci:20181001185138j:plain
Sider内でのRuboCopのカスタマイズ方法について話す五十嵐氏

以上、四つのプレゼンすべてが内容の濃いものだったにもかかわらず、休憩も挟まずマラソンのように駆け抜けた本Meetupでしたが、総勢24名の参加者の皆さんからは意欲的な質問が活発に飛び交い、非常に盛り上がった会となりました。また、会終了後の懇親会でも、ピザを片手に、参加者の皆さんが登壇者のかたを囲み、さらに熱心にお話されている様子も見受けられました。

ご来場いただいたみなさま、登壇者のみなさま、会場提供くださった株式会社PLAIDさん、Meetup共同開催にご協力くださったCircleCI Japanさん、どうもありがとうございました! Siderでは今後もMeetupを開催していきますので、弊社のDoorkeeperConnpassもぜひフォローしてみてください。

f:id:sideci:20181001185225j:plain
左から: 駒崎幸之氏(株式会社プレイド)、角幸一郎(Sider)、金洋国氏(CircleCI Japan) 、 野田陽平氏(株式会社プレイド)

またこの日、9月からの新ノベルティグッズとして、Siderロゴの入ったキューブタイマーがお目えしました!こちらのタイマーは、今後のMeetupやGitHub Universeなどでも随時プレゼントしていく予定です。ぜひゲットしてくださいね! f:id:sideci:20181001185304j:plain

(お知らせ:Siderでは毎週木曜日に新着コンテンツをお届けしていますが、次回の投稿はGitHub Universeの関連で、10/15の月曜日を予定しています。ぜひチェックよろしくお願いします!)


あなたのチームの開発効率向上に!
Siderの自動コードレビューを14日間の無料トライアルでお試しください!

新しい解析結果ページをリリースしました

$
0
0

こんにちは。プロダクトチームの渡邉です。Siderでは、プルリクエスト上で発生した警告を確認し、その重要度に応じて、ユーザーが対応、未対応の選別ができる解析結果画面を提供しています。

この度、この解析結果ページのデザインをリニューアルしましたので、ご紹介します。

f:id:sideci:20181004181752j:plain

新しい解析結果ページでは、いくつかのレイアウトの変更を行っておりますが、機能に変更はありません。Siderではより快適なユーザー体験を提供するために、今後とも継続的にデザインの変更を行っていきます。

新しい画面についてフィードバックなどございましたら、お気軽にSiderの右下のチャットからお問い合わせください。


あなたのチームの開発効率向上に!
Siderの自動コードレビューを14日間の無料トライアルでお試しください!

GitHub Universe開催記念!Sider30日間無料トライアルキャンペーンのおしらせ

$
0
0

f:id:sideci:20181004160247p:plainこの秋、Siderが初めてGitHub Universeにスポンサーとして参加することを記念して、通常14日間の無料トライアルを30日間に延長する、スペシャルなキャンペーンを行います!この機会にぜひ、Siderの自動コードレビューをじっくりお試しください!

キャンペーン詳細

適用期間:

2018年10月15日 0:00 PST(日本時間 2018年10月15日 16:00)
から
2018年10月21日 23:59 PST(日本時間 2018年10月22日 15:59)
まで

手順:
  1. SIderのウェブサイトのトップにある『GitHubでサインイン』ボタンをクリック!

  2. Siderを利用するプライベートリポジトリを選択してください!GitHubアカウント上にパブリックリボジトリしかなかった場合、30日間無料トライアルキャンペーンは適用されません。なお、パブリックリポジトリに関しては、Siderは通年無料です。

この無料トライアル30日間延長キャンペーンは、適用期間内に「Siderにサインアップ」したうえで「プライベートリボジトリを作成する」という、2つの条件をクリアした時点で自動的に付与されます。サインアップだけでは適用されませんので、くれぐれもお気をつけください!

Happy coding!
Siderチーム


あなたのチームの開発効率向上に!
Siderの自動コードレビューを14日間の無料トライアルでお試しください!


10月分の解析ツール更新を行いました

$
0
0

Siderは毎月解析ツールのバージョンを見直しております。このたび、10月分のバージョンアップデートを行いましたのでお知らせいたします。

現在のバージョンについてはドキュメントもあわせてご確認ください。

なお、RuboCop, ESLint, stylelintに関しては、それぞれ任意のバージョンをSider上で動作させることが可能なため、上記のアップデートはデフォルトバージョンの更新になります。詳しくはドキュメントの各解析ツールの設定をご覧ください。

何かご不明点がございましたら、お気軽にSiderの右下のチャットからお問い合わせください。


あなたのチームの開発効率向上に!
Siderの自動コードレビューを14日間の無料トライアルでお試しください!

GitHub認証のスコープの更新

$
0
0

先日、@rmariuzzoの報告によって、SiderがGitHub認証でアカウントの更新に関する権限を要求していることが判明しました。この権限はSiderの動作には不要なもので、平たく言えばバグです。

Siderはリポジトリへの更新権限はWebhookの設定、Pull Requestへの解析結果の送信、コメントの送信などに必要です。一方で、Siderはアカウントの更新をしませんので、更新の権限は必要ありません。

Siderでは、アカウントの更新に必要な権限を要求しないようになりましたので、アナウンスします。

ユーザー体験

ユーザーは次回Siderにサインインするときに、GitHubから権限の確認をするように求められます。これは、Siderがユーザーのメールアドレスという新しいリソースへのアクセスを要求するようになったためです。技術的には、これまで要求していたアカウント更新の権限が、既にメールアドレスへのアクセスを許していたため、この警告には意味がありません。ユーザーの情報の読み取りの権限には、なぜかメールアドレスへのアクセスが含まれていないため、新しく要求する必要がありました。

メールアドレスは、ユーザーの識別やSiderから送信するメールの送り先などに利用されているため、これを要求しないように変更する予定はありません。

権限の更新

この修正によって、新しくサインアップするユーザーにはアカウント更新の権限を要求しなくなりましたが、既存のユーザーに対しては以前に要求されたアカウント更新権限が付与されたままになってしまいます。

既に認可されてしまっているアカウント更新権限を取り除くためには、Siderにログインして操作を行ってください。

アカウント設定ページに「認証のリセット」という項目を追加しています。ここから再度の認可をリクエストし、不要な権限を取り除くことができます。「リセット」ボタンをクリックすると、再度サインインするように要求されますので、サインインしGitHubの認証を行ってください。Siderが要求する権限が更新され、必要最小限の権限のみが認可されるようになります。

GitHubでSiderへの認可をrevokeし、再度Siderにサインインすることでも、権限の更新が可能です。

まとめ

Siderから要求されるGitHub認証の権限を最小化しました。既に認可してしまった権限を更新するためには、アカウント設定ページからリセットの操作をする必要があります。

Siderの挙動でなにかおかしなものを見つけたり質問がある場合は、お気軽にお問い合わせください

Sider Code Review Meetup #4 レポート

$
0
0

f:id:sideci:20181019121715j:plain

9月27日、Sider主催による『Code Review Meetup #4 ~Code Reviewで集まろう~』が代官山のOpen Network Spaceにて開催されました。コードレビューをテーマにした本Meetupも今回で4回目。この夜は予約段階で満員・キャンセル待ちも発生するなどの注目をいただき、最終的に30名以上の方々のご参加となりました。この日ご登壇いただいた4名のスピーカーの皆さまからは、コードレビューをテーマにそれぞれ独自の切り口でお話を聞くことができました。

RuboCopコミッターである株式会社永和システムマネジメントの伊藤浩一氏 ( @koic )は、「コードレビューしぐさ」(スライド: https://speakerdeck.com/koic/for-whom-the-quality-exists )と題し、コードレビューがなぜ重要か、また多様なメンバーでプロジェクトを進めるとき、それぞれの環境、関係などで、どんなコードレビューが望ましいかなどを話してくださいました。伊藤氏によると、どのようなメンバー構成でプロジェクトを進めるのであれ、コードの質の期待値に対し共通の認識をもつことが大切とのこと。また、Linterツールによるレビューと人間によるレビューとを比較し、人間の行うレビューにおいて機械にはできない領域のレビューを行うための知識を受け渡していくことの重要性に触れ、一方Linterツールを使用することによって、新しいメンバーに既存のルールを共有しながら、どの部分を機械に任せ、どの部分を人間の手でレビューするかを判断しやすくなる、という大変わかりやすいご説明をいただきました。

f:id:sideci:20181019121739j:plain
コードレビューしぐさのタイトル通り、哲学を聞かせてくださった伊藤氏

続いての登壇者は、株式会社ビットジャーニーのGoro Fuji ( @gfx )氏。gfx氏は、「コードレビューを自動化するために『Querly』(注釈:Siderが提供しているツール)を使用する」というテーマにもとづき、「歴史的経緯の説明 as code」(スライド: https://speakerdeck.com/gfx/li-shi-de-jing-wei-falseshuo-ming-as-code )を会場と共有してくださいました。Querly DSLの例や株式会社ビットジャーニーの提供するサービスKibelaの事例などに加え、LinterとQuerlyの違いとして、「Linterは一般的なルールをチェックするものであるのに対し、Querlyはプロジェクトごとのルールをチェックすることで『歴史的経緯』をコードとして形に残すものである」ということを非常にわかりやすく説明していただきました。 この解説に、参加者さまより「今まで知らなかったけど、Querlyを使ってみたい。他社の事例や一般的なルールを知りたい」というお声も頂戴したので、Siderの中の人の我々も、もっと上手にQuerlyの良さを皆さんに伝えなくては!と感じました……!

f:id:sideci:20181019121827j:plain
こうした生の声の要望はとてもありがたいです。

三番目のスピーカーであるTakeru Yasumoto ( @seteen )氏は、コードが長くなりレビューしづらいこともあるRSpecを短く書けるように、RSpecを拡張したGem、RSpecZの使用法について、「レビューしやすいテストを目指して RSpecZ」(スライド: https://www.slideshare.net/ssuser7aa1e3/code-review-meetup4-rspecz ) というタイトルでお話しいただきました。

f:id:sideci:20181019121859j:plain

上の写真のスライド画面にも現れているように、RSpecZを使用するとコードの長さが半分くらいになるそうです。視覚的にも「これはコードレビューしやすくなりそうだな」というのが非常にわかりやすい発表でした。

そして、この夜のトリを務めました弊社エンジニアのKazuma Watanabe ( @wata727 )は、 「快適なコードレビューを目指して」(スライド: https://speakerdeck.com/wata727/for-a-comfortable-code-review )と題し、コードレビューを行う様々な目的のなかから「問題を防ぐこと」と「知識の共有」に的を絞り、それぞれに対して、弊社にて新しくリリースしたPhinderを使った効果的なレビューの方法について説明しました。Phinderを使うことで、コードの臭いを感じるパターンに対し、過去に発生した問題や懸念事項を提示することができます。また、レビュー時に確認するべき項目を自動でリストアップできます。発表の中には、「人間によるレビューの知識を共有していくために経験をYAMLに書き出す」という、gfx氏のお話と共通する話題もありました。

f:id:sideci:20181019121917j:plain

その後、各プレゼンテーション終了後に開催された懇親会では、軽食を囲みながら参加者の皆さんが熱心に登壇者の方々に質問をされている姿があちこちで見受けられました。 コードレビューをテーマとしているMeetupはまだまだ少ないようですが、より快適な開発や、よりスムーズなコーディングに欠かせないコードレビューを、SiderもブログやMeetupを通じて広めていくお手伝いをしこうと考えています。これからもコードレビューに関わる皆さんの勉強のお役に立てれば嬉しいです。

現時点では次回のコードレビューMeetup開催予定は未定ですが、ConnpassやDoorkeeperでは随時Meetupの情報をお知らせしています。今後のMeetup参加に興味のある方は、ぜひ弊社ConnpassまたはDoorkeeperよりSiderコミュニティをフォローしてください!

ーーー

あなたのチームの開発効率向上に!
Siderの自動コードレビューを14日間の無料トライアルでお試しください!

リポジトリページのデザインリニューアル

$
0
0

こんにちは。プロダクトチームの木庭(@ybiquitous)です。 このたび、リポジトリページのデザインをリニューアルしましたので、ご紹介します。

f:id:sideci:20181031171038g:plain

上のデモ動画にあるように、解析結果ページのヘッダーにあるナビゲーションリンクから、今回リニューアルされたリポジトリページへ移動することができます。 変更点については、次の通りです。

  • 左側にあったサイドメニューをなくし、ナビゲーションをヘッダーにまとめました。
  • 解析結果ページと同じページレイアウトを採用しました。

ページの機能自体に、大きな変更はありません。 Siderではより快適なユーザー体験を提供するために、今後とも継続的にデザインの改善を実施していきます。 デザインリニューアルについてフィードバックや疑問点などがございましたら、お気軽にSiderの右下のチャットボタンからお問い合わせください。


あなたのチームの開発効率向上に!
Siderの自動コードレビューを14日間の無料トライアルでお試しください!

リポジトリの追加フローが新しくなりました

$
0
0

こんにちは。プロダクトチームの渡邉です。この度、Siderにおけるリポジトリの追加フローが新しくなりましたので、ご紹介します。

従来のフロー

従来のフローでは、以下のような手順で、すべてのオーガニゼーションから追加するリポジトリを探し、選択する必要がありました。

  1. サインイン後、ダッシュボードにアクセス
  2. リポジトリ追加ボタンをクリック
  3. すべてのオーガニゼーションのすべてのリポジトリから追加するリポジトリを選択

f:id:sideci:20181113115407g:plain

新しいフロー

新しいフローでは「オーガニゼーションの追加」と「リポジトリの追加」を別のステップとして分けています。まだSiderに登録されていないオーガニゼーションのリポジトリを追加する場合には、以下の手順で、まずオーガニゼーションを登録します。

  1. サインイン後、ダッシュボードにアクセス
  2. オーガニゼーション追加ボタンをクリック
  3. 追加するリポジトリのオーガニゼーションを選択
  4. オーガニゼーションのリポジトリ一覧から追加するリポジトリを選択

f:id:sideci:20181113115702g:plain

既に追加されているオーガニゼーションのリポジトリを追加する場合には、オーガニゼーション設定画面から、以下の手順でリポジトリを追加します。

  1. サインイン後、ダッシュボードにアクセス
  2. 追加したいリポジトリがあるオーガニゼーションをクリック
  3. リポジトリ追加ボタンをクリック
  4. オーガニゼーションのリポジトリ一覧から追加するリポジトリを選択

f:id:sideci:20181113115848g:plain

新しいリポジトリ追加フローについて、フィードバックなどございましたら、お気軽にSiderの右下のチャットからお問い合わせください。

11月分の解析ツール更新を行いました

$
0
0

Siderは毎月解析ツールのバージョンを見直しております。このたび、11月分のバージョンアップデートを行いましたのでお知らせいたします。

現在のバージョンについてはドキュメントもあわせてご確認ください。

なお、RuboCop, ESLint, stylelintに関しては、それぞれ任意のバージョンをSider上で動作させることが可能なため、上記のアップデートはデフォルトバージョンの更新になります。詳しくはドキュメントの各解析ツールの設定をご覧ください。

RuboCopでのオプションの新規サポートについて

Siderでは、RuboCop 0.60.0 より新たに追加された--safeオプションをサポートしました。このオプションが有効になっていると、RuboCop実行時、Enabled: trueかつSafe: trueとなっているCopのみを解析対象とします。 Siderでの利用方法はこちらのドキュメントをご覧ください。

このオプションについての詳細は、RuboCopのこちらのissueを併せてご確認ください。

何かご不明点がございましたら、お気軽にSiderの右下のチャットからお問い合わせください。


あなたのチームの開発効率向上に!
Siderの自動コードレビューを14日間の無料トライアルでお試しください!

KDDIさまの導入事例をリリースしました

$
0
0

この度、Siderの導入事例ページに新しく、KDDI株式会社の導入事例が追加されました。日本の大手電気通信事業であるKDDIさまの数ある部署のうち、ポータルアプリを開発している「新規ビジネス推進本部システム統括部アプリケーションG」さまでは、現在Objective-CやSwift、Java、Kotlinを使った開発環境でSiderをご利用になっています。

コードスタイルの違いが日常的に問題を生んでいたKDDI・新規ビジネス推進本部システム統括部アプリケーションGさまが、Siderの導入で得た意外なものとは……。管理者サイドにも参考になる導入事例を、ぜひご覧ください!

KDDIさま導入事例ページはこちら
https://sider.review/ja/customer_stories/kddi


あなたのチームの開発効率向上に!
Siderの自動コードレビューを14日間の無料トライアルでお試しください!


翻訳機能廃止のご案内

$
0
0

Siderにて2017年1月から提供してきました「解析結果の翻訳」機能ですが、2018年12月17日をもって廃止とさせていただきます。ユーザーのみなさまには、ご不便をおかけすることになってしまいますが、ご理解いただけますようお願いします。

廃止の背景

Sider(旧SideCI)は、オープンソースLintツールをSaaSとしてご利用いただけるサービスとして開始し、ツールの出力を日本語に翻訳して表示する機能を2017年1月から提供してきました。Lintツールの出力する警告は通常英語で表記されており、日本語翻訳機能は日本語話者の利便性を向上するものとして、欠かせないものであると当時は認識をしていました。

しかし、実際に機能を提供して判明したこととして、次の様な問題があります。

  1. 翻訳カタログのメンテナンスにかかるコストが大きい
  2. 出力されるメッセージの意味がオプションで真逆になることもあり、翻訳の提供が難しいケースがある

1については提供前からある程度は判明していたことですが、2については完全に我々の想定から漏れており、対応が困難となっています。これは、例えばRuby向けLintツール「RuboCop」の「ClassAndModuleChildren」が該当します。これはcompactnestedの二つのスタイルが選択でき、選択されたスタイルによって全く逆の警告メッセージを表示するというものです。このようなルールは、Siderの翻訳機能では上手く取り扱うことができず、現在は「メッセージを翻訳しない」という対応になってしまっています。

これらの問題はずっとあったのですが、Siderとして「オープンソースLintツールのSaaS提供」ではなく「プロジェクト固有の知識の共有を支援」が重要な価値であると認識を改めつつあり、Lintツールの翻訳機能はずっとアップデートされずに来ていました。(ちなみに、ご存じの方がどのくらいいらっしゃるかはわかりませんが、2018年4月以降、我々は翻訳メッセージの追加を行っていません。)

さらに、オンプレミス環境で動作する「Sider Enterprise」の提供も本格化しており、翻訳機能のメンテナンスは一層困難となってきています。

以上の背景から、翻訳機能は廃止とすることに決定いたしました。

廃止までのスケジュール

翻訳機能は、2018年12月17日に廃止をいたします。以降は、翻訳についての設定項目は消え、日本語を選択されているリポジトリについても英語のみが表示されます。

支払い担当者を登録できるようになりました

$
0
0

このたび、支払い担当者の登録機能をリリースしました。この機能により、GitHubアカウントおよびSiderアカウントをもたない人でも、支払いに関する通知(領収書など)を受け取れるようになります。

機能の説明

  • オーガニゼーションページの「アカウントと支払い」タブからアクセスできます。
  • オーガニゼーション1つにつき、支払い担当者を1人登録できます。
  • 登録にはオーガニゼーションの管理者権限が必要です。
  • 登録に必要な項目は、Eメールアドレス・名前・言語のみです。
  • 登録されたEメールアドレス宛に、Siderから支払いに関する更新通知メールが送られます(例.毎月の領収書)。

デモ

f:id:sideci:20181206150008g:plain
支払い担当者登録のデモ

重要なお知らせ

2018年04月30日以前からご契約いただいているお客様には、現在StripeからSiderの領収書をお送りしておりますが、2019年01月31日をもってこの領収書送付は終了いたします。


何かご不明点がございましたら、お気軽にSiderの右下のチャットからお問い合わせください。


あなたのチームの開発効率向上に!
Siderの自動コードレビューを14日間の無料トライアルでお試しください!

SiderがGitHub Appsとしてインストールできるようになりました

$
0
0

この度、SiderがGitHub Appsとしてインストールできるようになりましたのでお知らせします。

GitHub Appsとは?

GitHub AppsはGitHubが提供する新しいインテグレーション方式です。GitHubは詳細なアクセス権限の管理のために、GitHub Appsへの移 行を公式に推奨しています。これまでSiderはOAuth Appsというインテグレーション方式でサービスを提供してきました。

2つのAppの違いについての詳細はこちらをご覧ください。

GitHub Appsでできること

より制限された権限

GitHubはGitHub Appsにおいて、より詳細な権限の選択を提供します。 OAuth Appsの場合、Siderはユーザーがアクセス可能なリポジトリすべてに対する参照が可能です。 もちろん、Siderは不必要にリポジトリにアクセスすることはありません。 一方、GitHub AppsにおいてはSiderはユーザーやオーガニゼーションが許可した リポジトリにしかアクセスできません。 つまり、ユーザーはSiderに対して柔軟に権限を制御することができます。

Sider Botの提供

OAuth Appsは、GitHubにアクセスするときにユーザーとして振る舞いますが、 GitHub Appsインテグレーションはボットアカウントとしてアクセスします。 このことはGitHub Appsの場合には自身で管理するボットアカウントが不要なことを意味します。

f:id:sideci:20181210111310p:plain
Sider Bot

移行方法

新しくオーガニゼーションを追加する際には、GitHub Appとしてインストールする必要があります。 既にオーガニゼーションを登録済みの場合は、オーガニゼーション設定ページからGitHub Appsに移行することができます

f:id:sideci:20181210111413p:plain
GitHub Apps Migration

GitHub Appsへ移行する際にはSiderで追加済みのリポジトリが含まれるようにリポジトリを選択するようご注意ください。

最後に

GitHub AppsによってSiderは、より信頼性があり洗練されたサービスを提供することが可能になります。 今後も、SiderはGitHub Apps を使ってサービスの改善に努めてまいります。 この機会にぜひGitHub Appsへの移行をご検討いただければと思います。 なお、移行後はOAuth Appsに戻すことはできません。

何かご不明点がございましたら、お気軽にSiderの右下のチャットからお問い合わせください。

ユアマイスター株式会社さまの導入事例をリリースしました

$
0
0

Siderブログをご覧いただいているみなさま、こんにちは!
今週末はPHPユーザの祭典、PHP Conference 2018が開催されますね。

PHP Con直前ということで、本日はSiderのホームページに追加されたばかりのユアマイスター株式会社さまの導入事例をご紹介します。
プロの職人たちとモノを大切にしたい人をつなぐサービス「あなたのマイスター」などを手がけるユアマイスター株式会社さまは、インターンを多く受け入れているのが特徴で、CakePHPやWordPressを使用した開発環境でSiderをご利用になっています。
開発現場で特にご好評をいただいていたのは、以前英語版ブログでも紹介したPHP向けツール「Phinder」でした。発生した障害や問題の記録をPhinderのルールとして残し、「経験を目に見えるかたちで活かす」という考え方で人材とプロダクトを育成されているそうです。
ユアマイスター株式会社の星さまは、週末のPHP Conに『レビューで初心者インターンを一人前に育てた話』というテーマでご登壇なさいます。ここでもPhinderの話が登場するかも?Phinderの導入を検討されている方は、ぜひあわせてご覧ください!

ユアマイスター株式会社さま導入事例ページはこちら
https://sider.review/ja/customer_stories/your_my_star

なお、今年のPHP Conference 2018ではSiderもゴールドスポンサーとしてブース出展するほか、今年は開発部の渡邉一真が『PHPを検査するPHPを書く』というテーマで登壇いたします。ブースではSiderのデモをご覧いただけるほか、渡邉へ直接質問もできますので、ご参加の方はぜひお立ち寄りください!

それでは今週末、PHP Conference 2018でお会いしましょう!みなさまのご来場をお待ちしております。


あなたのチームの開発効率向上に!
Siderの自動コードレビューを14日間の無料トライアルでお試しください!

12月分の解析ツール更新を行いました

$
0
0

Siderは毎月解析ツールのバージョンを見直しております。このたび、12月分のバージョンアップデートを行いましたのでお知らせいたします。

現在のバージョンについてはドキュメントもあわせてご確認ください。

なお、RuboCop, ESLint, stylelintに関しては、それぞれ任意のバージョンをSider上で動作させることが可能なため、上記のアップデートはデフォルトバージョンの更新になります。詳しくはドキュメントの各解析ツールの設定をご覧ください。

何かご不明点がございましたら、お気軽にSiderの右下のチャットからお問い合わせください。


あなたのチームの開発効率向上に!
Siderの自動コードレビューを14日間の無料トライアルでお試しください!

Viewing all 182 articles
Browse latest View live