読者です 読者をやめる 読者になる 読者になる

is Neet

ネトゲしながら暮したい

ruby world conference 2016 2日目のSocial Codingに関する話のメモ

昨日に引き続きコレも本当にめも。
でもMSがどういう経緯でOSS活動を始めるに至ったか、最近のイケてるMS感がどうやって出てきたのかという話がされていて面白かった。
ソーシャルコーディングについての話もワクワクさせられたし、良いセッションだった。

githubの歴史とこれから

  • あるプロダクトを作ろうとした人々(別々の会社にいた)がソーシャルコーディングする術がなかったから作った
  • 創業2008年, 1500万+ユーザ, 3800rep, 600従業員, 1000大学
  • email, subversion,などの方法でかつてはOSSは存在していた
  • コミュニティーの運用も大変だった
  • 今日ではgithubでそれが一本化された。同じワークフローにすることができた
  • 世界中のダレでもOSSに参加できるようにする
  • コミュニティーをその周辺に作るかが重要である
  • 企業がOSS登録することもしはじめた. 企業にとっても大きな成功になった

edward thomsonさんの話

  • 6年MSで働いていた
  • MSの前はteampriseで働いていた。エンタープライズ用の製品を作っていた
  • 従業員は8名、devが4人
  • 4人だと全ての開発をすることが不可能だった
  • 色んなライブラリやOSSを活用することにした. それによって製品は成功し2009年にMSに買収された
  • 買収されると、まずは一番最初にデューデリが入る
  • 次に、ソフトウェアの監査がされる。MSに全て送ってクオリティのチェックがされる
  • teampriseの製品がOSSをかなり使っていた事に、MSは本当に驚いていた
  • 2009年MSはOSSが悪だと語っていた。GPLに合意しない
  • Linux is a Cancerだと語っている steve ballmer
  • MSからは修正してくれと言われたが私達は反対した
  • MSの買収から、製品を売らないという判断になった。OSSを懸念するあまり
  • 当時にMSは本当にOSSへの理解が足りなかった
  • 悪意のあるコードがインストールされるのではないかと思っていたが、実際にはOSSのコードはコードレビューをしっかりうけている
  • コードの品質は寧ろOSSの方が高い
  • MSに買収された後も、OSSを活用した製品作りや顧客へOSSを届けたい思いがあった
  • 顧問弁護士としっかり会話をした、OSSGPLの説明、どうやって説得しようかと考えていた。事実をしっかり伝えればいいと思った
  • 相談した結果弁護士から、考えるネタは沢山あるがアイデアはいいね、と言ってもらえた
  • 相談した弁護士が実は余暇を利用してコードを書いていた。githubも使っていた
  • その後は役員、steve ballmerの説得にいった。難しかったがDeveloperの事を愛している人ではあった
  • 彼はいつも興奮していて情熱を持っている人だった。Developerにとってのエコシステムの構築はMSにとってもいいという判断を最終的にはしてくれた
  • 製品マネージャーやPOや顧問弁護士があつまって、OSSを使うだけではなく最終的にはMSからもOSSの発信をしていこうとなった
  • それから色んな製品をOSS化していくようになった
  • ubuntuとかともコントリビュートを始めるようになった
  • 今はコントリビューターの人数の方がMS社員より多くなった
  • そしてそれだけではなく2016年、Inner Sourceについて検討が始まった
  • Inner Source = 企業内のOSS活動のこと
  • それまでは会社の中でそれぞれのチームが分かれていた、Windows, Visual Studio, Officeはそれぞれ分断されていた
  • 例えばVSのcompileに問題があったとしても、問題がなかったversionに戻して黙って使い続けているような状況だった
  • 問題があったからといって報告してくれるケースは稀で、だいたい黙って使い続けていた
  • それぞれの組織が銃を持ち合い牽制しあっているような組織だという比喩もある
  • Visual Studioチームの中ですら、牽制しあっている状況に実際あった
  • 他チームからの依頼で修正したりもしてたけど、ソーシャルコーディングしていると他チームも一緒に検討修正していけるようになった
  • 今では全てのコードがgitで管理されていてソーシャルコーディングできるようになってきた
  • Officeチーム、今ではiOSAndroidの開発もしている。その上でVSをいじる必要があったら、今ではOfficeチームが修正してpr出して終わりになった

ソーシャルコーディングのこれから

  • software is eating the world
  • 世界中のあらゆるものに影響を与えている
  • Uber, AirBnb、ソフトウェアをベースにしタクシーやホテル業界を大きく変えている
  • Netflixはフィジカルなビデオショップを全て潰してしまった、アメリカにはもうない
  • 日本でも食べログ、一休、cookpadがいろんなものを大きく変えている
  • 自動運転、世界中のどこにもソフトウェアが存在している
  • 全ての会社がソフトウェアの会社になってきている。ソフトウェアが世界を変えている
  • ソフトウェアの成長が会社の成長でもある
  • ソフトウェアの部門というのは会社にとっての必須の部署になっていく
  • Hadoopはいい例
  • ソーシャルコーディングが出る前は、MSような形で閉じられた形でやられていた
  • ソーシャルコーディングが始まってからは、色んな言語や会社が参加しコミュニティーとなり、発展していたった
  • ウォールマートやトラクターを作っている会社までが、何百というDeveloperを抱えている
  • NIKKEIも今ではソフトウェアの会社であると言える

日本経済新聞について

  • 電子版の開発をしている人の話
  • 280万部発行している
  • 2010/3月に創刊, 月3億PV, 毎日900本の記事を配信
  • mediaの価値というと、コンテンツにフォーカスされがちだけど、デジタルにおいてはソフトウェアそのものが価値だと言える
  • ユーザが接しているフロントは、各媒体に合わせてPDCAを回してブラッシュアップしていく必要がある
  • 外注の発注のコストが高すぎた。ボタンの追加一つとっても2週間使っていたりした
  • 5年前に2人で内製化をはじめた
  • 現在はコードが書けるDeveloperが10数人になっている
  • 電子版アプリは内製化によって1.9倍、評価も4くらいまであがった

質問: 他チームのコードをいじる時に、前提とする知識の共有をどうしたか

  • そもそも許可を得ることはしなくなった
  • OSSでもそうだが、まずコードを触ってみて質問をしていく
  • VSも本当に巨大で全てはダレも分からない
  • OSSのフローと基本的には同じだと思っている

質問: 重要度の判定はチームによるとおもうがどうControlしたか. 優先順位

  • お客さんからの要望に基いてバックログを整理する
  • お客さんのインプットベースで優先度を並べる
  • アジャイルなりスクラムなりのワークフローの中でやるのがよいのではないか

ruby world conference 2016 1日目のmatzさんの話のメモ

本当にただのメモ

冒頭

  • 過労死の話を海外でしてきた
  • 1週間のバカンスを取った話を海外でしてきたら、マジかよ働きすぎワロタみたいな反応だった
  • 家族をないがしろにしながらも、生きるために働くのではなく、働くために生きている人もいる

alpha syndrome

  • コンピュータは疲れたりしない、1週間1ヶ月でも連続して働ける
  • しかも計算が早い。エニアックは1秒に5000回計算していた。今は何百億の計算が出来ている
  • 集団の中でのリーダーの事をalphaと呼ぶ。群れの序列のトップがalphaという個体
  • 犬をずっと可愛がったら、この子のためなら何でも出来るという気持ちになってくる
  • あまり可愛がってたら犬はalphaだと思うようになるので、他人が来たら吠えたりする
  • ↑のように行儀が悪くなっていく事を、alphaSyndromeという
  • コンピュータと人間の関係性もそういうところがあったいする
  • コンピュータがやっている仕事を、コンピュータに問題が起きないように働く、みたいなシーンが出てきてしまう
  • コンピュータのために働いてしまう
  • 人間の中で、無意識にコンピュータをalphaだとしてしまう傾向が出てきてしまう
  • reverse ALPHA syndromeだと呼んでいる
  • 自分達がコンピュータ様のために働いているような
  • 忘れてはならないのは、コンピュータは道具であって、私達がコンピュータの主人である
  • そのためには働きすぎてはいけない、もっとlazyでないといけない

Rubyの哲学

  • 生産性、開発効率をあげたい、プログラマを幸福に、人間にフォーカスする

duck typing

  • 分類をしない
  • タイプチェックをしない
  • ただ、命令する。その結果アヒルのように振る舞えばそれでオッケー
  • 継承や内部データは気にしない
  • 何か命令した時に、どう振る舞うかだけが重要である
  • コンピュータに仕事を押し付けることに、duck typingの本質がある
  • できるだけコンピュータに働いて欲しい

DRY

  • 重複、冗長性、コピペを禁止
  • 有るコードが重複した時に、間違えていたらバグもコピーしてしまう
  • DRYが徹底されていれば、一箇所の修正で済むよね
  • なによりも私達はlazy
  • 全部保守するのって面倒だよね
  • できるだけ仕事を増やしたくない、出来ればコンピュータに仕事を押し付けたい

つまり

  • dtもdryも怠け者精神
  • spirits of laziness
  • 偉大なプログラマの3つの得、laziness, impatience, hubris
  • 怠けるためにはどんな苦労も厭わない
  • 怠惰: 自分の仕事を楽にするソフトを作るわけじゃなくて、沢山の人が同じ質問を繰り返すのもダルいので、ドキュメントを書く 怠惰の原則がなければ、プログラマは自発的にソフトウェアを作らない
  • 短気: コンピュータが怠けるのは許さない。自分の目的を達成するソフトを書くだけじゃなくて、自分のやりたいことを先回りしてやってくれるソフトを作りましょう より質の高いソフトを作るために必要な資質
  • 傲慢: 文句を言われないように良いものを作ってやろうという気質
  • 怠惰が最も重要な気質である
  • パールのラリーさん
  • 働きすぎるのはよくない。積極的に怠惰であろう
  • enjoy Programming !
  • rubyでは楽しい部分、クリエイティブな部分に集中できるようにしていきたい
  • rubyの4原則のために、プログラマに力が必要なのではないか
  • 一生懸命働かない。余裕をもってソフトウェアを作り上げたい。コンピュータは主人ではない、そうならないために個人個人の開発者が力を持たなければならない
  • ruby/rails give power
  • よりストレスが少ない形で、ソフトウェアを完成させる事ができる。それはすなわち力である
  • empowering Programmings

スパイダーマンみたいな話

  • 偉大な力には責任が伴う
  • rubyは社会に様々な良い影響を与えている反面、トロイの木馬rubyで書かれてしまった事もあった
  • もっとプログラマに力を与えたいと考えている

rubyの功績

  • より怠惰にした laziness
  • 生産性。より安く、より早く productivity
  • 開発者の幸せ development happiness
  • ecosystemの構築
    • resources 資産がある. railsやmruby,jruby,gems
  • 着実な進歩 steady progress
  • オープンソースの世界は、人々の集まりなので変化がないと退屈してしまう傾向にある
  • rubyは極端な変化はあまり起きない。が、着実によりよいrubyになるために継続的な努力を続けていくつもりである
  • コミュニティってなに?組織?入会金がいるもの?
  • rubyコミュニティの一員であると本人が思った瞬間にコミュニティメンバーであったりする。いいなと思った瞬間に取り込まれているようなもの。定義がない
  • コミュニティのなかで文化を作ってきた功績もある
  • first ruby conf
    • フロリダで行った。出席者は38人だった
  • first ruby kaigi
    • 最初は日本人のための会議だった
    • 今では国際的なものになってきた
    • 日本人の発表には通訳がつく、英語の発表には通訳がつかない
    • 日本人はヒアリングするしかない
  • 国際化を推し進めていった功績も有る

今後の怠惰に関して

  • コンピュータの特質が変化しているのでそれに対応していかなければならない
  • 数年後にver3を考えている
  • 3つの柱を考えている
    • パフォーマンスの改善
      • 今後数年で劇的に改善したい
    • コンカレンシー、複数の仕事を同時にできるようにしたい
      • ruby作り始めた時は1 cpuだったが、いまだと4-8とか普通にあったりする
      • 複数cpuがあるんだったら全部使いたい
      • 今はそこが弱いので、活用できるように改善していきたい
      • クラウドで数百台のサーバが稼働する所でもパフォーマンスが出せるように
    • エラーチェックを厳しくしたい
      • 実行しないとエラーが分からない
      • 静的解析を強化していきたい
  • 現在は実験中だが、数年後を目処に作っていきたいと考えている

Ethereumで建国するための第一歩を踏み出した

Ethereum知ってますか?なんか名前だけは聴いたことあるけど、よくわからないという方が多いのではないでしょうか。
Bitcoinみたいな何かでしょ?という認識の方も多いかと思います。だいたい合ってるのですが、最近真面目に取り組んでみたら案外面白かったし、上手いこといけば結構世界が変わるな〜、これ使って建国したいな〜、と思ったのでザッと紹介するエントリーを残しておきます。認識が間違っている所があるかもしれないのでご指摘いただければ幸いです。

Ethereumとは?

本題ではないので若干雑な説明になります。
Ethereumを説明するには、まずBitcoinの話から入る必要があります。Bitcoinは一言でいうと仮想通貨です。特徴として挙げられるのは「非中央集権的」に通貨の健全性が担保されている点です。その「非中央集権的」に通貨の健全性を担保するという部分に使われているアーキテクチャがBlockchain(とProof of Work)になります。
これまた物凄く簡単に言うとBlockchainとは、仮想通貨の過去全ての取引履歴の事を指します。トランザクションのデータベースとか言われたりしています。Bitcoinは、P2Pネットワークに繋がっている全てのノードがこのBlockchain(過去全ての取引履歴)を持っており、新しいトランザクションの妥当性を照明し合います。理論上全ノードの計算量の51%を上回らない限り、データの改ざんは不可能という設計になっています。

ちょっと話がいったん逸れてしまうのですが、SmartContractという考え方があります。これはBitcoinが登場するよりも古くから(多分?)ある概念で、1990年代からあるようです。何かというと、例えば自動販売機でジュースを買う時に「150円を自動販売機に支払う」「欲しいジュースのボタンを押す」という2つの行動があった場合に自動販売機は、我々に「ジュースを提供」します。書類上の契約を必要としない契約(取引行動全般を指す)、これを「契約の自動化」とする考え方です。これは、コンビニ店員などを介してジュースを購入するより「非中央集権」な取引が行われていると言えます。そして、BitcoinからBlockchainというテクノロジーを抽出して、仮想通貨以外の分野に適用することでSmartContractを実現し、分散型の自動化組織を作っていけるのでは?みたいな流れが生まれます。

しかし、Blockchainでアプリケーションを作成するのは容易ではありませんでした。
Bitcoin上で動くチューリング完全ではないスクリプト(詳しくは知らない)でアプリケーションを作るわけにもいかないし、かと言って新たにアプリケーション毎に設計したBlockchainでP2Pネットワークを再構築するのも自由度は高いものの現実的ではありません。
そこでEthereumが登場します。EthereumはBitcoinのようなP2Pネットワークと、チューリング完全スクリプトを提供してくれるプラットフォームです。Ethereumの登場により、自ら新たなP2Pネットワークを構築する必要もなくなり、Ethereumが提供してくれるBlockchainの仕組みを使ってより柔軟なアプリケーションの開発が可能になりました。まぁ勿論、Ethereumネットワーク自体が発展してくれないと話にならないワケではありますが。
ちなみにEthereumには、Etherという仮想通貨が存在しています。
やや長くなりましたが、本エントリーではEthereumのテスト環境を構築し、簡単な取引を実行してみるところまでやってみます。

gethのインストール

EthereumのP2Pネットワークに参加する必要があるので、goで実装されている「geth」というCLIクライアントを使って、Ethereumネットワークにノードとして参加します。

$ bash <(curl -L https://install-geth.ethereum.org)

gethでは、Ethereum上での仮想通貨であるetherのマイニングや送金、コントラクトの作成や実行などが出来ます。

プライベートネットに接続して色々試す

いきなり本番ネットワークに繋いでもいいのですが、10GB以上のデータサイズのblockChainの同期が始まったり、いざ接続してもなかなかetherのマイニングに成功しなかったりするので、まずはプライベートネットにテスト接続して感じを掴んでみるのがオススメです。

テストデータ格納用のディレクトリを作成します。

$ mkdir $HOME/eth_private_net

Genesisファイルの作成

ブロックチェーンの最初のブロック(これをGenesisブロックというらしい)の情報を記述したjsonファイルが必要になります。
先ほど作成したディレクトリに、myGenesis.jsonというファイルを下記の内容で作ります。

{
  "nonce": "0x0000000000000042",
  "timestamp": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "0x0",
  "gasLimit": "0x8000000",
  "difficulty": "0x4000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x3333333333333333333333333333333333333333",
  "alloc": {}
}

マイニングモードにする

次に、デフォルトではGethはマイニングモードではないので、明示的にマイニングモードにしてあげる必要があるっぽいです。この辺若干ハマった上にイマイチ概念を理解しきれてない気がするので不安ですが。

$ geth --mine --minerthreads=4

--minerthreads=4その名の通りマイニング用のスレッド数なのでこのオプションはまぁ何でもいいです。初回だとここで1%, 2% ...とマイニング用の準備(かな?)が始まりますので大人しく100%になるまで待ちましょう。
consoleでminer.start(n)と打ってもいいらしいですが、私の環境ではこれだとマイニングが始まりませんでした。一度--mineオプションで立ち上げた後なら、miner.start(n)でもスタートすることが出来ました。

consoleを起動

geth consoleの起動ですが、色々とオプションがあるようです。取り敢えず、先ほど作成したデータディレクトリと、myGenesis.jsonを指定してconsoleを起動してみます。

$ geth --networkid "10" --nodiscover --datadir "$HOME/eth_private_net" --genesis "$HOME/eth_private_net/myGenesis.json" console 2>> $HOME/eth_private_net/geth_err.log

####################################################################
#                                                                  #
# --genesis is deprecated. Switch to use 'geth init /path/to/file' #
#                                                                  #
####################################################################

Welcome to the Geth JavaScript console!

instance: Geth/v1.4.9-stable-b7e3dfc5/darwin/go1.6.2
coinbase: 0x88xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
at block: 680 (Thu, 07 Jul 2016 09:18:37 JST)
 datadir: /Users/xxxx/eth_private_net
 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

>

これでめでたくプライベートネットと、REPL consoleが立ち上がりました。

プライベートネットでetherをマイニング、送金してみる

何はともあれアカウントを作成しましょう。後に送金までの手順を確認したいので2つのテストアカウントを作成します。以降の作業は全てgeth console上でのコマンドになります。
newAccount()メソッドを呼び出して、第一引数にパスワードを渡します。

> personal.newAccount("hoge")
"0x88e9f8cf1e6a996f849b681696a8c960410be669"

> personal.newAccount("fuga")
"0x0b79b067f4b4c02a922dc8972375fb35e3795fbb"

eth.accountsで作成したアカウント一覧がみれます。

> eth.accounts
["0x88e9f8cf1e6a996f849b681696a8c960410be669", "0x0b79b067f4b4c02a922dc8972375fb35e3795fbb"]

eth.coinbaseでマイニングの報酬を紐付けるアカウントを確認することができます。一番最初に作ったアカウントがデフォルトでは設定されているはずです。

> eth.coinbase
"0x88e9f8cf1e6a996f849b681696a8c960410be669"

マイニングしてみる

miner.start()でマイニングを開始し、miner.stop()で止めることができます。また、miner.start()には第一引数にマイニングを実行するスレッド数を渡すことができます。

> miner.start()
true

マイニングを開始したら、eth.hashrateで採掘処理のハッシュ・レートを確認することができます。0以外の数値が返ってきた場合は、マイニングが行われていますが、0が返った場合はマイニングが行われていません。 なお、以前はminer.hashrateだったようですが、1.4.3から(かな?)はレシーバがethに変更になったようです。

> eth.hashrate
965

適当なタイミングでminer.stop()を実行しマイニングを止めて、掘り起こしたetherを確認してみましょう。

> web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
3715.78125

上記の確認方法でもいいですが、存在するアカウント一覧とether残高を一緒に確認したいので(後の送金確認時とかにも便利)、スクリプトを書いておくといいかもしれません。適当なディレクトリに適当な名前で以下内容でjsファイルを作成します。

function checkAllBalances() {
  var i =0;
  eth.accounts.forEach( function(e){
    console.log("  eth.accounts["+i+"]: " +  e + " \tbalance: " + web3.fromWei(eth.getBalance(e), "ether") + " ether");
  i++;
  })
};

続いて、geth consoleに戻り、作成したjsファイルをロードして、functionを実行してみます。

> loadScript("./ethereum/hoge.js")
true

> checkAllBalances()
  eth.accounts[0]: 0x88e9f8cf1e6a996f849b681696a8c960410be669   balance: 3715.78125 ether
  eth.accounts[1]: 0x0b79b067f4b4c02a922dc8972375fb35e3795fbb   balance: 0 ether
undefined

送金してみる

送る側と、受け取る側のアカウントを分かりやすくするために変数に入れておきます。これは必須の手順ではないです。

> var sender = eth.accounts[0];
undefined
> var receiver = eth.accounts[1];
undefined

次に、送金する側(sender)のlockを解除しておく必要があります。パスワードの入力を求められるので、入力します。

 personal.unlockAccount(sender)
Unlock account 0x88e9f8cf1e6a996f849b681696a8c960410be669
Passphrase:
true

なお、unlockAccountの第二引数に文字列でパスワードを渡してあげても良いようです。
次にeth.sendTransactionを使って、試しに5 etherほど送金して、checkAllBalances()で確認してみます。 この時、マイニングが行われている必要があるらしいので、miner.start()を最初に呼び出します。(ずっとマイニングしてるのであればこの処理は必要ではありません)

> miner.start()
true

> eth.sendTransaction({from: sender, to: receiver, value: web3.toWei(5, "ether")})
"0xf997c2aee483bc74fa3bcb134af8ab99525d37b8cbe0afe73d620627e243db3d"

> checkAllBalances()
  eth.accounts[0]: 0x88e9f8cf1e6a996f849b681696a8c960410be669   balance: 3755.78125 ether
  eth.accounts[1]: 0x0b79b067f4b4c02a922dc8972375fb35e3795fbb   balance: 5 ether

Contractについて

さて、Ethereumでは上記で行った送金と同じ要領で、任意のタイミングでTransactionを発生させ、同時にコントラクト・コードを走らせる事ができます。流れとしては、Contractを作成し、ブロックチェーンに作成したContractを登録し、Contractへアクセスし実行、というイメージになります。Solidityという言語で開発することになります。

長くなってきたので一端この辺で切りますが、次回は実際にContractを作成して実行してみる部分を書いたりしたいと思います。embarkというフレームワークを使ってサンプルアプリケーションを開発する流れまで出来れば最高ですが「建国する気持ち」が持つかどうかが不安です。

参考URL

この辺読みながらやりました。ありがとうございます。 Ethereum入門 ethereum/go-ethereum wiki スマートコントラクトとDAO

リクルートに入社して組織作りなどをしています

どうも@soplanaです。ドラクエ10のプレイ時間が3500時間を突破した私ですが、2015年の冬くらいにリクルートに入社していました。
まだ入社してから半年程ではありますが、つくづく面白い会社だなという思いがある事や、一般的に内製開発をやっているイメージのない(かもしれない)リクルートの取り組みやエンジニア文化の話など、発信しておきたいなと思う点がいくつかあったので久しぶりにブログでも書くかという気になりました。

リクルートグループについてちょっと

2012年にリクルートホールディングスを持株会社として、いくつかの事業ごとに子会社が設立されています。
私が入社したのは、ゼクシィやカーセンサーなどの事業を継承し設立されたリクルートマーケティングパートナーズ(RMP)です。リクルートグループは現在、その各事業会社ごとに内製開発組織を作っていくぞという状態にあり、それぞれで募集要項を設定し採用活動や組織作りをしていたりします。会社ごとに結構雰囲気も違ったりするという話も聞きますが、私はまだRMPしか見ておらず、本エントリーも基本的には全てRMPについての言及になります。
ブログ書くのが久しぶり過ぎて、一人称や口調や振る舞いのブログ人格を完全に忘れているので無駄にきっちりした感じになってしまう...。

ざっと労働環境の紹介

よく聞かれる事をいくつか。
開発に使うPCはなんでも指定して購入可能です。開発環境も他のweb系会社のそれをイメージしていただくと良いかと。(githubAWS、slack、Qiita:Team...)
現在、内製開発エンジニアが関わっているプロダクトで動いている言語は、ScalaRuby、js(angular.js、react.js)、SwiftJava。例えばここに挙がってない言語でも、いや俺はgoでやりたい!という強い思いがあれば、概ね「いいよ!」と言われるのではないでしょうか。勿論、なぜその言語である必要があるのかという妥当性みたいなものが語れる必要はあるかとは思いますが。

あとオモシロポイントとしては、エンジニア以外も含む全従業員を対象としてリモートワークが可能となっている点です(※1)。制度上の運用ルールを守ってさえいれば、リモート日数や時間にとくに上限や制限などはなく、少なくとも私の所属する部署周辺ではエンジニア以外の職種の人々含めて、かなり浸透した働き方となっています。
それに加えて勤務時間は多くの人がフレックス制度(人によっては裁量労働)なので割と自由が効き、例えば子供のお迎えや見送り、家族の体調不良などで、午前中や夕方からリモートワークに移行するなどといった利用の仕方も多くの人がしています。色々な職種の方が、自由な場所で、自由な時間に働いているのでslack(or Hangouts)でのコミュニケーションが結構活発だったりします。
フレックス + リモートワークがあることで、午前中に病院や区役所に行ったり、ゆっくり家で家族やニートの友人とランチをとったり出来るのが想像以上にQOLに影響し豊かになったかなと思います。所謂大企業なのに、こんな大体な取り組みが出来てて凄いな…という感動もありました。

入社して驚いたこと

リモートワークの件も驚いた事ではありますが、他にも副業OKという点(入社時に副業の説明されたりしてビビる)、リクルート用語が飛び交っていることなどでしょうか...。まぁでも、何より制度や環境面でイマイチだな〜〜と思う事があれば、手をあげて変えさせてくれと上長に頼むと大体任せてもらえて、実際に組織や会社が変わっていけることに結構感動したしました。

もう一つは、とても営業力のある会社なので、実際に自分達が作ったプロダクトは営業さん達がしっかりとユーザに届けてくれて使われることもweb系出身としてはカルチャーショックがありました。RMPの場合は、単に売るだけではなくお客さんと伴走しながら、どうすればプロダクトはより良くなるか、どうすればより良く使ってもらえるのか、といった事を真剣に考えてフィードバックしてくれたりするので、作りがいもあるのかなと思います。

今の自分のミッション

最初の方に書いた通り、リクルートは分社化したタイミングで各事業会社ごとに内製開発組織を作り始めました。ここ2-3年の話です。つまり組織自体がまだまだ凄く若く、社内に対しても社外に対してもプレゼンスを発揮しないといけない時期にあり、また、仕組みやツールなども完璧に整っているとは言いがたい状態にあります。
RMPのエンジニア組織は50名程の規模になっており、現在もなお採用活動は続けています。毎日色んな問題が出てくる中で目の前の課題を解決することや、中長期的にも組織をどうしていくか、評価制度、キャリアプランなどをどう整備していくかといった問題・課題が山積みです。
そんな中、私は現在エンジニア組織のグループマネージャーという立場で上記に挙げたような課題を解決していくために様々な人に協力してもらいながら、組織作りなどを進めています。コードを書くことから距離が離れてしまったのは少しさみしい気持ちもありますが、グループマネージャーがコードを書いてはダメだという決まりも特にないので、コッソリ書いたりしようかなとは思っています!
あ、問題・課題が山積みとは言いましたが、基本的にかなり愉快な組織で、周りの皆さんが優秀すぎて死にたくなるくらいの現場です。
エンジニアの組織作り、評価制度、キャリアプランなどの話題はなかなかこれといった正解があるものでもないのかもしれませんが、面白い題材だとは思うのでこの辺に興味がある方がいらっしゃったら、是非飲みに行ったり会社に遊びに行ったり・来たりしてお話しましょう。お声掛け下さい!

ここからはやや夢物語ではありますが、リクルートという会社がもともと持っている最強の営業力に、最強の開発力が加わって最高のプロダクトを最速で届けられる体制を作れたらいいなという事と、リクルートの卒業生が様々な分野で大活躍しているように、いつか卒業していったリクルートのエンジニア達が「リクルートのエンジニアやばくね…」と噂されるような世界観を目指して頑張りたいと妄想しています。

おまけ

RMPは絶賛エンジニア募集中です。
まずは会社の雰囲気が知りたい、会社を観てみたい、みたいな気軽な感じでいいので @soplana とか、まぁ何かしらの方法でご連絡いただければカジュアル面談を組んだりできると思いますので、よろしくお願いします!

あとコチラは学生向けですが、

techlabpaak.com

シリコンバレーなどに一週間滞在して、いろんな会社の話を聞けたりするイベントがあり、これも募集中です。一応私がメンターとして同行する事になっています。

出典

※1 www.recruit-mp.co.jp

【メモ】行動原理について

概ね全ての行動原理は快楽回路の刺激に帰結するように思う。
人間は快楽回路の直接的な刺激を自己完結できないからこそ、行動を起こすのだ多分。
そして現代社会において金は、行動と快楽回路の刺激を仲介する役割を果たす。
行動し、金を得て、金を使い、多様な快楽を無限に満たそうとするのだ。
短絡的に快楽を満たそうとする者もいれば、より大きなリターンを得ようと長い時間行動だけを繰り返し、その先にあるであろう目が眩んでしまうような巨大なカタルシスを信じて生きる者もいる。

そうすると演繹的に考えれば、全ての行動は即物的だと言い換えることも出来る。
でも、本当にそうなのだろうか。
自分の中にある、音楽や絵やプログラミングに対する創造性への動機も、即物的なところに帰結するのだろうか。
今はそんな事ないような気がしているけれど、正直分からない。
恐らく後天的に大金を手に入れてしまった場合(大金に対する免疫が無い場合)、人はよりプリミティブな快楽に溺れてしまうのではないかと思う。
その先に待ち受ける心情は分からないけど、それを想像する事は自分の中にある創造性の動機と無関係ではないように思う。
そう思う時点で、自分の創造性は即物的ではないという思いあがりがあるのだろうけど。

ActiveRecordっぽいinterfaceを持ちつつajax通信も担当してくれるjsのライブラリが欲しかった俺は

自分でつくることにした。
動作環境とかChromeでしか試してないし、テストも書いてないし、昨今のjsライブラリの一般的な作り方とかもよく分かってないので完全に勢いで作り始めた。
その辺のお作法の話も学びながら作っていきたい思い。

完全に同じような事をするためのライブラリにjs-modelというのがあるが更新が2年ほど止まっているし、名前にエモみを感じないので、やってやろうという気持ちになった。
js-model • models in your JavaScript

gulpとかbabeljsとか、使ってみたかったし、ES6も全然触ってなかったし、何より一年くらいまともにプログラミングすらしてなかった気がするので、大変面白かった。
取り敢えず今日一日で出来たのところまでを書いておこう。

作ったものはコチラ↓
soplana/leaps-js · GitHub

どんなライブラリ

できればスタンドアローンで動かせるようにしたかったのだけれど、少なくとも現時点ではunderscore.jsに依存する形となってしまった。
20代の頃なら自作してたと思うけれど、残念ながら若さと気持ちが足りなかった。
個人のAWSが不正利用され140万の請求がきている現状も無関係ではない気もする。

まずmodelとなるクラスを宣言する

class SampleUserModel extends LeapsModel {
  static properties() {
    return {
      name:        "",
      age:         null,
      admin:       false
    }
  }
}

インスタンス化し、保存することが出来る。
今のところただたんにArrayにぶち込んでるだけなので、ページ遷移したら消えてしまうというあまり意味のない実装になっている。そのうちlocalStorageに入れるようにしたい。
保存に成功するとmodel.__idにシーケンス番号が入る。

var user = new SampleUserModel({name: "soplana"});
user.admin = false
user.save() // true

保存したレコードはwhereやfindを使って取得できる。

// データの用意
new SampleUserModel({name: "a", age: 10}).save()
new SampleUserModel({name: "b", age: 10}).save()
new SampleUserModel({name: "c", age: 20}).save()

// where検索
var users = SampleUserModel.where({age: 10})
users.length // 2

// id指定で検索
SampleUserModel.find(1)

http requestを走らせる

これが一番やりたかったのだけれど、おおむねmodelとajax通信は密接に関係しているはずなので、通信部分の処理はmodelに任せたかった。
まぁ普段Railsで、極一般的なCRUD/RESTなアプリケーションばかり書いてる僕だからこその発想かもしれないけれど。

まず、先ほど定義したmodelに追加でエンドポイントを定義する。

class SampleUserModel extends LeapsModel {
  static resourcePath() {
    return '/users/{id}.json'
  };

  static properties() {
    return {
      id:          null,
      name:        "",
      age:         null,
      admin:       false
    }
  }
};

上記の例では{id}部分が動的にきりかわるpathで、modelに同名のpropertyがあればそれを参照してつっこんでくれるようにした。model.routing()を使いエンドポイントを確認できる。
こんな感じだ。

var user = new SampleUserModel({id: 1})
user.routing().indexPath // /users/1.json
var promise = user.show()

promise.then(function(data){
  console.log(data) // SampleUserModel

}).catch(function(error){
  console.log(error)

});

今日作り始めたばかりなのでアレだけど、やりたいことはだいたいこんな感じだ。
全然目新しい事もないし車輪の再発明感あるけど、実装してて楽しかった。
ブログも勢いで書いてるからかなり雑だ。
個人のAWSが不正利用され140万の請求がきている現状も無関係ではない気もする。

iPhone6 plus買って良かったこと

f:id:soplana:20141009213748j:plain


2年大切に使ったiPhone5を色んな角度から綺麗に撮れるようになって嬉しい