y toku ブログ

inclusion を目指す

JavaScript 超初心者向け -- 継続するために役に立っていること --

JavaScript だけをひたすら学んでいても正直つらい...

学び方、勉強の進め方は個人の好き嫌いが大きく異なる。コンセプトをまずは全部、一気に読み、その後サンプルや例題を解く人。コンセプトや抽象的なことより、とにかく具体例で理解したい人。動画でかいつまんで音を伴って学びたい人などなど。さまざまなタイプがいると思う。

私はコンセプトの理解をしっかりし、その後サンプルや例題を解き、またコンセプトに戻り確認する。というのを繰り返すタイプ。

JavaScript を勉強していると、「これって何に役に立つんだっけ?」っていう疑問が非常に耐えず、私は正直先が見えずに辛くなりました。

実際に動くものを作り、理解を深めて行くステップが良かった

とくに、関数の使い方や高級関数(higher order function)、コールバック関数など、いったいどのように使われていくんだろう、という疑問が常に絶えません。具体例もなかなかわからないまま進んでいると、一向に身についているきがしませんでした。

そこで、私の場合は、HTML と CSS を体系立てて学んだことが皆無だったので、とりあえず Udemy で HTML, CSS, JavaScript の基本を抑えるコースを取ることにしました。

http://udemy.com/the-web-developer-bootcamp/

とんでもなく安くなっていたので即買いました。

理解がさらに深まる

こういうコースをとると、JavaScript がいつ使われるのか、どうやってブラウザ上に反映させるのか、などという基本的な知識を一気に身につけることができます。この時点での進捗は41%程度、HTML,CSS,JavaScript の基礎がほぼ終わりに向かっています。

これにより、かなり理解を深めることができました。今まで断片的だったものがつながり、目に見える形でブラウザ上の表示に動きをつけることができるようになります。

JavaScript で、DOM の操作を学ぶセクションではコールバックってこういう場面で使うんだ、span タグとクラス名をつけておけば、これでいじることができるのか、など気づきや学びが多いです。

何より、目に見えるものを作っていくので、JavaScript がどのように使われるのか、というのを体感していくことができます。

JavaScript のコーディングのみの勉強をしていて、継続が難しくなったら、こういうコースをとっても良いのではないかなと思うのです。

JavaScript 超初心者向け -- 配列における forEach 最初の最初 --

何度でも書きますが、これは超絶初心者向けのブログ記事です。JavaScript を勉強しはじめ、躓いてしまいそうになった点を書いてみたいと思います。

配列 (array) を勉強していると配列内の繰り返し処理を学びます。単純な for 文、for ... of、そして必須メソッド forEach。そして、お決まりの MDN を調べても最初さっぱりわかりませんでした。

f:id:yasuhikotoku:20190915144341p:plain

この構文を見て、ぱっと理解できるようになったとき、おそらくレベルが上がっているんだなと思います。これは自分で書いてみて理解が進んできたので、ここに書いて見たいと思います。

何がわからないかというと、何を書いていいかが最初わかりませんでした。そして、それぞれの引数が何をしているのがよくわかりませんでした。

で、ググりまくりいくつか特徴をつかめました。

  • forEach の引数内に関数が書けること
  • 関数の引数が、(value, index, array 全部 ) ということ
  • 関数を外出しできること

なので、いろいろ何が起こるか自分でやってみてテストをしてみます。

サンプルの配列とメソッドを使ってみる

var numbers = [1,2,3,4,5,6,7,8,9,10];

numbers.forEach(function(val ,id, arr){
    console.log("Array of " + arr + " Index= " + id + ", the value is " + val)
})

/* 
各要素で繰り返し処理をするので、numbers 配列の何を取ってるのか理解してみました。
- val が 値
- id が Index
- arr が配列全部
*/

これを実行すると期待どおり、それぞれ入ってきていました。

f:id:yasuhikotoku:20190915150240p:plain

無名関数 (anonymous function) をそのまま書いて実行することができました。

次に、関数を外だししたいと思います

関数を外に出して呼んでみる

//forEachで呼ばれることを前提に書いているので、2つ引数を書いてみました。

function findEven(val, id){
    if(val % 2 === 0) {
        console.log("Index= " + id + ", 値は " + val + "、偶数です。" );
    }
}

// numbers 配列に対して、forEach から呼んでみます。

numbers.forEach(findEven);

f:id:yasuhikotoku:20190915151255p:plain

これで確かに、findEven 関数を呼び偶数をログに吐き出せました。

さらに調べていくと、これは コールバック関数 というやつらしく、非同期処理を実現するために...と書いてあり、超絶初心者には本当に理解ができるかというと... うーん、難しいです。

プログラムは上から実行されるはずがあとから実行してほしい、みたいなケースがあり、それを実現するための処理、というところらしいです。これは実際にものを作り始めると理解が深まるはずなので、ここでそれを深く理解できないからといって勉強をやめるのはナンセンスでしょう、と理解しています。

numbers.forEach(findEven()); とするとどうなるんだろう?

f:id:yasuhikotoku:20190915151432p:plain

だめです。理解するにはおそらく深いところまで... 下記の記事を何度も何度も読みました。すごく理解が深まります。

sbfl.net

が、理解が 100% に追いつかないので、ものを作りながら理解をしていきたいと思います。

JavaScript 超初心者向け -- 配列内にオブジェクトがある際のループを試してみる --

今日は配列の中にあるオブジェクトへのアクセス方法を書いて見たいと思います。これまで、オブジェクトのループや配列のループを書きました。 いろいろネットで検索すると、配列の要素としてオブジェクトを持つものが多くあり、これらをループ処理をするにはどうすればいいのだろうかという素朴な疑問からまずはテストしてみました。

まずはサンプルから。

var arr = [
    {id: 1, animal: "dog", age: 10},
    {id: 2, animal: "dog", age: 2},
    {id: 3, animal: "cat", age: 15},
    {id: 4, animal: "cat", age: 4}
];

このような配列があったとき、age が ある値以上のものだけを抽出するにはどうすればよいのだろうかと疑問が湧いたので試してみました。

for...of を使う

前回書いた記事を利用して、for...of を利用して書いてみました。

function overAge(num) {
    var newArrOverAge = []; // 格納先の配列の初期化
    for (value of arr) {
        if (value.age > num) {
            newArrOverAge.push(value.id);
        }
    }
    return newArrOverAge;
}


// age が 5 より大きいオブジェクトのidを返してみる
overAge(5);
// => [1,3]  として配列で返してくれました。

f:id:yasuhikotoku:20190906155259p:plain

今回試したかったのは for (value of 配列名 ) で value で返ってくるものがオブジェクトであるということで、認識した通りの書き方でしっかり返してくれました。

JavaScript 超初心者向け -- 配列のループ最初の最初 --

配列(array)のループ処理の最初の最初を勉強していたことを整理したいと思います。以前にも書きましたが、JavaScript超初心者が最初から勉強することを想定していますので、イケてる、イケてないという議論はここではおいておきます。

配列のループ処理

配列にはインデックスがあり、0から始まるということ。これはJavaScriptに限った話ではないと思いますが、そこを最初に意識していないとミスを連発しました。

for 文

for (var i = 0, arr = 0 ; i < array.length; i++) {
    処理;
}

最初に勉強していたときに、 以下未満 かという点です。 配列ののインデックスは 0 から始まるので、i <= array.length としてしまうと、ズレてしまいます。

具体的に書いてみます。

var arr = [1,2,3]; 

for (var i = 0, sum = 0; i <= arr.length; i++) {
    sum += arr[i];
}
console.log(sum); 
// =>  NaN で出ます。

こうして not a number を返されてしまいまして、なんでだろうなとひとりで思っており、 console.log(arr[i]); を入れて何が書いてあるか、見てみました。

f:id:yasuhikotoku:20190905160830p:plain

上記のように、undefined が 3 のあとに返っていることに気づき、ループしている要素数が一つ多いことに気づきました。 これを実行しているときに学んだことは、arr[i] のログをしっかりとること、インデックスが0から始まることをよくよく認識 します。 なので配列要素の長さ 未満 で処理する必要があります。

var arr = [1,2,3]; 
for (var i = 0, sum = 0; i < arr.length; i++) {
    sum += arr[i];
}
console.log(sum); 
// => 6

これで条件文を以下から未満にして、インデックスが 0, 1, 2 で 3 はやらないようにするとうまくいきます。

for... of

配列の要素をループする方法でもうひとつ for...of という書き方があるようです。

for (変数) of (配列名) {
    //処理; 
} 
  1. [変数名] が何でもいいということに気づくのがまず大事で、ドキュメントでは number of numbersArray のように書いてありますが、変数名はとにかくなんでも良いということです。

  2. 配列名。 これは、for ([変数] of [配列名]) { ... } としてかいたときに、{ } の中に対象の配列名を書く必要があるということです。

例えば、以下のような感じ。

var arr = [1,2,3,4,5], sum = 0; 
for (var value of arr) {
    sum += value;
}
console.log(sum); 
// => 15

これをすると、for loop で書いた指定のミスがなくなるので、こちらの方が使いやすい感じがしました。

最後に、for... in は配列では使わない方が良いらしいです。配列はシステム上オブジェクトなので、for (var xxx in object) {} も利用可能らしいのですが2つの点で配列では使えないそうです。 1. 環境依存 2. 遅い

詳しくは下記の記事

javascript.info

次は配列内にオブジェクトがある際のアクセス方法と forEach メソッドなどメソッドを書きたい。

JavaScript 超初心者向け -- リカージョン(再帰関数) --

JavaScript を学んでいてつまづいたのが再帰関数です。英語のドキュメントでは Recursion と書いてある章です。 ただ、なんとなく理解しているのですが、どうしても自分で書こうとすると書けないものの一つです。これは本当に気持ち悪い書き方だと思いましたが、なんとか読んで理解するまで理解を深めていけましたので、まずはその過程を書いてみたいと思います。

リカージョン(再帰関数)の概念を理解する

再帰処理」って単語が出てきたら「自分自身を呼び出す処理が書かれている関数を呼び出すことなんだな~」 ( https://wa3.i-3-i.info/word14899.html (概念を理解するのにとても助かりました )

When a function solves a task, in the process it can call many other functions. A partial case of this is when a function calls itself. That’s called recursion.

  とにかく自分自身を呼び出す関数なのかと頭では理解できましたが、どうしても自分で書くことができませんでした。

克服方法

関数は値であるということをよく理解する

Functions are values.関数は値である といろいろなドキュメントで見かけますが、このことによく気づくとリカージョンの理解が一歩進みました。 関数がその自分自身の関数を呼ぶという、文で見ると簡単ではありますが、実際に理解するとき脳が停止しました。 しかし、関数が値(形を変えていく値という風に理解するとさらによく理解できましたが。。)であれば、方程式に代入することはよくあることです。a = 2a + b みたいなことが確かに数学を勉強している時によくありました。

YoutubeやQiitaを見て理解を深める

下記の動画が理解を高めてくれたのと同時に、スタックに関する概念とリスク(オーバーフローを起こすリスク)を説明してくれていました。できるだけ recursive は避けた方が良いのではというのが彼の意見ではありましたので、自分ではなるべく書く必要がないかもしれませんがしっかり理解したいと思います。

www.youtube.com

qiita.com

実際にひとつひとつ超簡単な例で試す

eloquentjavascript.net

このドキュメント内の例をもとに理解をしていきました。このようなドキュメントの例を見ても、最初はさっぱり理解できなかったのですが、ひとつ一つ理解を深めていきました。このドキュメント内では、「2 の 3 乗」のような乗数を2つの変数を使った関数をもとに説明しています。

先ほど参考にさせていただいた、Qitia内でも引用されている条件をまずここにも引用します。(独学プログラマーという本の引用だそうです) 再帰関数を理解するための最もシンプルな例 - Qiita

再帰法は、再帰終了条件を持たなければならない。 再帰法は、状態を変えながら再帰終了条件に進んでいかなければならない。 再帰法は、再帰的に関数自身を呼び出さなければならない。

なるほどなるほど。終了条件が必要なのかと理解できます。

function power(base, exponent) {
  if (exponent == 0)
    return 1;
  else
    return base * power(base, exponent - 1);
}

console.log(power(2, 3)); // 2の3乗
// → 8

この例から理解すると

  • if (exponent == 0) これが終了条件です。
  • power(base, exponent - 1) この部分が終了条件に向かって進んでいる & 関数自身を呼んでいる

まず一文ずつ理解していきました。で、 2 の 3 乗のケースを一つずつひも解いてきました。

power(2, 3); // base が 2 で、exponent が 3 でそれぞれ代入していきます。 まず、 exponent が 3 なので終了しませんので else で書かれている return の後が起こります。

2 * power (2, 3-1) なので 2 * power (2, 2) になります。exponent に 2 を入れて power (2,2) をさらに続けます。 私はこの時点で、関数が値であるということがピンときました。値なので、関数が変数のような扱い方がされていていいのだと理解できました。↓続きます

2 * 2 * power (2, 2-1) なので 2 * 2 * power (2, 1) となります。続いて 2 * 2 * 2 * power (2, 0)
2 * 2 * 2 * 1 ← ここで終了条件の exponent == 0 に合致するので、1 が返ってきて終了です。 => 結局8 となります。


という感じで、リカージョンを理解していきました。

自分でこれを利用し関数を書いてください、と言われたら絶対難しいのですが、書いてあることを理解するレベルにはまずいけました。 パターン化できる、終了条件に向かって自分自身の関数を呼んで進んでいける、ということを書き出せれば理解が進むはずだとわかりました。

JavaScript 超初心者向け -- オブジェクトのループ --

この記事では JavaScript 超初心者がひとつ一つの使い方を習得するために小分け Tips を書いています。MDN などの公式サイトでももちろん勉強できます。この記事では、超初心者の自分がエラーなどが出た時にどのように乗り越えているかも書きつづり、壁を一つひとつ乗り越えている方法を書いてみたいと思います。

このブログでは、エラーや思うようなデータが出ない時に、どのように修正していったかも書いてみたいと思います。初心者としては、期待しない結果が出た時、どこが間違っているのかがわからないことが最もストレスで勉強がはかどらない、と思います。あえてそこも書いてみたいと思います。誰かのお役に立てばとともに、自分の勉強を振り返るためにこの記事を残しておきたいなと思います。

JavaScript で オブジェクト内をループする方法

そもそも、オブジェクト内をループする方法がイメージできないという素朴な疑問がわきつつも、それはさておき、多くの基本ドキュメントでオブジェクトのループ処理があります。 これはイケてる書き方、モダンもっと良い書き方がある、というのはありますが初期の勉強中にあたるのがオブジェクトのループだと思います。今日はその最も基本とされている書き方と、躓きそうになった部分を書いてみたいと思います。

主に、こちらのサイトを参考にしています。

javascript.info

for (key in object) {
       // 処理を書く
}

この記述方法は完璧に暗記します。

サンプル

一階層の場合

サンプルオブジェクトと関数をとりあえず作ってみます。

var obj = {
    a:2,
    b:1,
    c:3,
    d:2,
    e:11,
    f:2,
    g:1,
    h:3,
    j:5
}; 

// ある特定の値を持つ key を配列として抽出する関数

function findNumber (n) {
    var arrNum = []; // ここに条件に合致する key を格納していきます。
    for (var key in obj) {
        if (obj[key] === n) {
            arrNum.push(key);
        }   
    };
    return arrNum;
}

// 値が 2 の key だけ抽出してみます

findNumber(2); 

f:id:yasuhikotoku:20190902220622p:plain (画像内では、console.logの関数をテスト的に書いてしまっているので、現れている...)

これでできました。体にしみこませるために値が n 以上の関数を作ってみたり、偶数だけを配列として抽出するというのもやってみたりして理解できました。

複数階層の場合

JavaScript のオブジェクト内ループのテストをしている時にひとつ疑問が出ました、オブジェクトって複数階層(ネストされているオブジェクト)があるけど、この場合どうやって検索するんだろうか?

これもまた必死にググった結果、複数階層があるというのを ネスト されたオブジェクトということに気づき、それでまたググると、再帰関数(関数がその関数自身を利用する関数)を使わないといけないということが書いてあるので、今の段階では割愛します。

再帰、リカージョン、recursion の記事を書き次第、こちらでupdateします)

期待しない結果が起きた時の対処方法

私がこのループを勉強している時に出たエラーを恥ずかしながら紹介したいと思います。

オブジェクト名を object として指定しまい空白で帰り、期待していない答えだった

MDNやjavascript.infoのサイトでも、下記のような構文が書いてあります。

for (key in object) {
       // 処理を書く
}

object をそのままコピペで書いてしまったために空白として値が返ってきました。お恥ずかしいけど、コンピュータは無機質に無感情で回答を返してくれる部分がとても好きです。

f:id:yasuhikotoku:20190902152236p:plain

関数内でオブジェクト名を object としてしまっています。本来はループ対象の Object 名obj を指定すべきでした。

[key] として指定するところをドット記法で書いてしまうミス

これはループとはまったく関係ないことに起因する事象です。 f:id:yasuhikotoku:20190902152625p:plain

if 文内で obj.key としてしまいました。これはオブジェクト要素へのアクセス方法が2つあることに起因しています。

  • obj.key とすると key というキーを検索しています。
  • obj[key] は、key という変数 (variable) で検索しています。今回は、key という変数で書いているので、if ( obj[key] === n) { hogehoge } と書く必要がありました。

[補足] for (key in object) {} の key を別名にしても動く

上記で書いた丸暗記式の key 部分が変数である、と気づいたとき、key ではない変数もできるはずだと思い、別の名前で試してみましたところ動きました。 f:id:yasuhikotoku:20190902153348p:plain

こんな感じで、超初心者向けの JavaScript におけるオブジェクトのループに関して理解を深めていきました。

新メンバーオンボーディングによるエンゲージメントを高めるテック企業

米国の急成長テック企業を2社経験し、オンボーディングについてツイートしたところ聞いてみたいというフィードバックをいただいたので、私の主観でまとめてみたいと思う。

この記事で紹介すること

  1. そもそも新メンバーオンボーディングではいったいどんなことをしているのか
  2. なぜここまで投資して、オンボーディングに時間をかけているのかの私見

きっかけ

Twitterで今勤めている Auth0 (オースゼロ)のオンボーディングに関していくつかツイートしたところ新卒同期のブンブンや、

米国で0 -> 1 を担当した野村さんからも、

米国スタートアップのオンボーディングについてぜひ聞いてみたいというフィードバックをいただきました。少しでも需要があるかもと、書いてみることにしました。

ここに書く内容は完全なる主観です。  

背景

急成長テック企業では、人がとてもつもない勢いで増えていきます。私が以前勤めていた米国発のオンライン決済プラットフォームStripe(デカコーン企業)では、入社したときは世界で600人弱、日本では5人目でした。そして、2年半で世界で1600人まで拡大していきました。また、現在勤めているAuth0は今では500人弱ですが、一年前は250名前後だったそうです。つまり、年間で倍くらいの人数を採用していきます。StripeもAuth0もこの規模でも新メンバーオンボーディング(入社後トレーニング)を本社でやっています。

両社ともに資金調達は、シリーズD以降で数百億を調達し、他国展開する体力がそれなりにある企業です。人への投資をしっかりしています。

オンボーディングの期間

Auth0の新メンバーオンボーディングは基本一週間。私の場合、日本で初めての職務での採用かつ、自分から学びたいことリストを出したら一週間ではおさまらなくなり、本社の担当メンバーや世界にいるメンバーとディスカッションをするため滞在期間をさらに一週間伸ばし、トータル二週間となりました。Stripeは私が入社したときは3週間でした。

他の人にも聞いてみたところ、本社ではなく地域HQであるシンガポールなどに行く会社もあるようです。期間は3日〜3週間以内でばらつきがあるようです。

それでは自身の経験を書いてみたいと思います。

私が経験してきたオンボーディングの内容

具体的にはそんなに書きませんが、概要は以下のような内容です。まず、オンボーディングのクラスの大きさによりますが2パートで構成されます。

  1. 全員同時に受けるパート
  2. 役割別によるパート

全員同時に受けるパート

どんな内容を受けたかというと。

  • 会社の歴史。サイトに掲載されていない話などがテッパンで盛り上がります。
  • Executive からの薫陶とQ&A(AMA, Ask Me Anything形式でなんでも質問してよい)
  • 組織の紹介。これは会社によると思うが、小さ目の会社だと全組織がわかる。
  • 製品の紹介。これは多くの会社でみっちりやるのだと思います。製品の仕組み、バリュー、ユースケースなどを理解します。
  • ツールに慣れるゲーム形式ワークショップ。会社によって使用ツールが違うこともあります。よく使うツールについては、ゲーム形式でワークショップで学ぶこともあった
  • カルチャーに関するチームワークショップ
  • Financials。非公開企業なので外部に公開できない内容を細かく見せる。これは会社の文化が現れていて、だいたいのテックスタートアップはTrustとTransparencyを大事にしていると思います。それをもとに、FinancialsをCFOやCROから説明があります。
  • ランチ。シャッフルランチなどでいろんな人と会うことも。まったく関係の無いチームの人とランチすることがあるので、自分より歴の長い社員に聞きたいことをグサグサ聞きます。
  • ユーザーサポートの回答。これは会社のカルチャーだと思うのですが、Stripeのオンボーディングでは役割関係なく、全員がお問い合わせに回答するトレーニングがあり、私はこれ素晴らしいと思います。有料サービスでサポートを提供している場合は、これがない場合もある。
  • IT機器の配布、ツールの説明
  • ノベルティの配布
  • Happy hour参加。テック企業だとHappy hourと言って、ある曜日の夕方カジュアルにオープンスペースで飲む時間があると思います。StripeもAuth0もあります。頑張ってソーシャライズ!笑 これハードル高いよ。

Tips。 まったく知らない初対面の社員に聞くと、良い会話ができる質問をここに書いてみます。 (握手して、軽い自己紹介をお互いにした後)

  • How long have you been here?
  • How is your life at (会社名)? )
  • What did you do before (会社名)?
  • Why did you choose this company?
  • Any advice for new members?
    ポイントは、全部オープンの質問にすること。この質問すると結構面白く、どんな人がどんな思いでこの会社に入ったかを知ることができます。

  • Have you been to Japan? (これおまけ)

カジュアルに盛り上がる。日本が小さいチームというのは本社の人が知っています。未知のマーケットを数人でどうやって開拓していくかを知りたいでしょう。

役割別にやるパート

私の場合、今回はマーケティングでの採用です。このパートは完全に仕事環境の整備がテーマだと思います。どのようなときに誰に話をすればものごとが解決しそうか、社内のプロセスを知っておくのが大事です。

  • 各担当のキーマンと1:1で誰が何を担当しているかを把握する。
  • その役割に特殊の社内ツールを学ぶ。同じツールでも会社によって全然使い方が違ったり、内製製品があったりこのあたりかなり面白いです。
  • 自分のプランをぶつけてフィードバックをもらいつつ、日本でどんなことをやるか共有する。

三番目、かなり大事だと思っています。

私は、StripeもAuth0も日本チームが一桁台(5人とか)なので、そもそも日本だけですべてを独立して進めることはできないですし、効率が悪いです。本社の戦略を理解する、最低限のツールを学ぶ、つまりインプットです。それに加えて、自分たちの戦略やプランを共有して、フィードバックをもらうことも大事です。そこから「だったらこの人に会うといいよ」というのをさらにもらいます。戦略やプラン自体は入社前に見せているので、誰に会うのが良いかなどのフィードバックはすでにもらえることが多いです。

教えてもらったら、あとは常に状況を共有し(5:15とかで)つつ、成果で示すのみ。

急成長企業はすべてが整っているわけではもちろんありませんし、成長痛を伴っています。急激に成長しているのですが、その時点のプロセスを知っておかないと「日本何勝手なことしてんの?」みたいな、意図しないひずみが産まれてしまうので、そうならいようにしたいものです。

エンジニア採用の場合は、エンジニア専用のスピンナッププログラムがあるのが一般的なようです。所属するチームや組織で、モクモク会のようなことをやったり、OJTで動いているプロジェクトに入ってアウトプット出したりしているのを見かけます。

その他にも、営業は営業、サポートはサポートと別々にスピンナッププログラムが用意されているか、もしくは自分でリクエストして学ぶ機会を作って行く感じですね。

オンボーディングをみっちりするのはなぜか?(私見)

上記のような内容で、1-3週間ほどみっちりやるのですが、そもそもなぜこんなことをするのでしょうか? 個人的には、3つ理由があると思います。

  1. 会社・カルチャーの理解を深める = スケールの土台を作る
  2. エンゲージメントを高める
  3. 関連メンバーとつながりを作っておきインパクトある仕事を進めやすくする

会社・カルチャーの理解を深める = スケールの土台を作る

成長するスピードが早い時、容易に想像することができるのが、組織としてのDNAや一体感(カルチャー)を保つのが一般的には困難になることです。最近のテック企業の多くは、かなり早い段階からカルチャーをすごく大切にしています。カルチャーがしっかりしているとスケールしても、統一した認識で意思決定ができるのでとても大事だと思います。

カルチャーが大事というと、少しだけ話しはそれますが、採用の段階からスキルがあるかという観点に加え、カルチャーにフィットするかというのが多角的に見られます。多くの面接を経て、ときには本社へ送られて面接を突破し、晴れて採用されてもなお、カルチャーをしっかり伝えるのが大切です。

会社がどのように成り立ってきたか、自分たちが大切にしていることは何か、入社前から色々調べたり聞いたりしていても、中に入らないと実際のところはわかりません。なので、社員歴が浅い人も長い人も統一のフィロソフィーを認識するのが大切です。

カルチャーワークショップ

Auth0のオンボーディングを少しご紹介。同日入社の社員で、いくつかのグループにわかれディスカッション。企業のどのバリューが自分に刺さっているかなどをお互いにシェア。最後、チーム全員にアウトプットを出すワークショップがありました。アウトプットの形はなんでもあり。うちのチームはWhat do you meme? というゲームからヒントを得て、ゲームを作りました。他のチームは、いくつかあるコアバリューの中から一つを選び、ストーリーにして、ムービーを作っていました。2時間でここまでできるのかというくらいすごかった。

エンゲージメントを高める

リモートで働く社員もどこのオフィスで働く社員も最初のオンボーディングは、本社へ来ることがおすすめされています。このトレーニングでは本社、米国内でリモート、ロンドンオフィス、アムステルダムからリモート、アルゼンチンからリモート、東京オフィス、そして東京オフィスと静岡でリモートを掛け合わせる人(私)がいたと思います。Auth0はリモート社員が半数を有に超えているらしいです。。。信じられない。。。

みんなバラバラのところで仕事をするので、あえてオフラインで一箇所に集まり、しっかりチームを作るのが大切です。もちろんこれにはそれなりの投資をしているのですが、できるだけ会社を好きになってもらい、充実した気持ちで仕事をして欲しいというのはどういう会社も同じでしょう。

リモート社員でもオフィスで働く社員でも、みな同じように高い生産性を維持するには、会社のDNA、組織の構成、ツール、組織連携など具体的に知っておく必要があります。座学でもできるのですが、あえて本社に全員来させて、役員などから直接説明を受けるというのは、気持ちが全然違います。高ぶりますよね。会社に大切にされているな、これから頑張ろう、とほぼすべての人が思うでしょう。

関連メンバーとつながりを作っておきインパクトある仕事を進めやすくする

私はこれがかなり大事だと思います。一人でものごとを完結するより、多くの人の力を借りて仕事をするほうが成果が大きくなります、一般的に。そのためにも、自分のやりたいことを達成するための関係づくり、誰に話せばものごとが進むのかを掴んでおくのがとても大事です。

スタートアップといえど、みな人間です。結局、多くの場合、人で動くことがあります。キーマンとなるべき人を確実に掴んでおき、いつでも相談できる状態にしておくというのは大事です。そのためにも、担当者と1:1をしてお互いの活動をシェアすることが大事だなと思います。組織の成り立ち・歴史、人の構成、関係部署など多くのことを理解しておくとイメージがわきます。

また、ディナーなどに呼ばれたら積極的に行って、カジュアルにも関係を作ります。ディナーなどはもう慣れたので、どんな質問をするとみんなリラックスするかとか、盛り上がるかとかはだいたい理解できるようになりました。あんまり仕事に関係しない家族の話とかもすると、関係を近づけることができます。だいたい、私は質問してばっかりになっちゃうんですけど笑 私は、人に対する興味がすごくあって、会話が途切れることがほぼないです。これはビジネススクール時代に体得した気がするのですが、人間ってみな本当に面白い。その人のヒストリーを知るだけでも相当面白いので、3時間でも話していられる自信があります。話がそれましたが、カジュアルな場で関係づくりをするのも大事かなと思います。

最後に。

リモートの社員でも基本この5日間はここに来ます。それでも何らかの理由で来れない人は、Zoomで入ってきています。おそらくこれを前編Zoomでやるのは難しいとは思いますが、Zoomでつないでいます。

最後の最後に。 もちろんこれ全編英語なので、上手い下手関係なく、これを生き抜く英語力と精神力、そして何よりも楽しむマインドセットが大事でしょう。

ぜひ、盛り上げて行きましょう。(何を)。