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

自分を攻略していく記録

自分がやりたいことを達成するには何をすればいいのか、その攻略していく過程をつらつらと

FinTech(フィンテック)入門を読んだ

FinTech入門を読んだ

2014年あたりからFinTechという金融とテクノロジーをまぜた言葉で使われるようになり出した。そのFinTechについて普段聞き慣れない人にも理解できるよう、マネーフォワードのCEOらによって明快に書かれている。今年からFinTechの業界に入ったので入門として読むことにしたのだが、非常に勉強になったので知らなかったことを簡単にメモしておく。

金融の「アンバンドル化」

金融というビジネスは2つのレイヤーに分けられる。1つ目が、情報サービスのレイヤーで、パソコンでいうところのアプリケーションに相当する。もう1つは、インフラサービスのレイヤーである。これはパソコンでいうところのOSに相当する。従来の金融機関はこれら両方のレイヤーを扱ってきた。しかし、近年では技術の発達により、スタートアップが情報サービスのレイヤーに参入し、2つのレイヤー部分が分離してきた。これをアンバンドル化という。ただ、インフラ部分はスタートアップにとっては参入が難しい分野であるので、今後金融機関がスタートアップと手を組んで再びアンバンドル化とは逆の動き「リバンドル化」が進むと考えられている。

個人資産管理

個人資産管理(PFM: Personal Financial Management)という言葉ある。これは文字通り、個人の収入・支出の管理や将来必要となるお金の準備をすることである。これは特にアメリカでのニーズが強い。というのも、教育費や住宅のためにローンを組むことがアメリカでは多く、お金を借りるための信用度「クレジットスコア」というものがあるためだ。クレジットスコアがある点を越えると「プライム」とみなされ、お金が借りやすくなる一方で、基準点を下回ると「サブプライム」と呼ばれる。そこで生まれたのがIntuitのQuickenだ。1980年代半ばのことである。

インターネットが爆発的に普及すると「アグリゲーションサービス」が出てきた。これは、各プラットフォームに分散している資産を可視化するものだ。その中にMintというサービスがあった。2006年に生まれ、急激に大きくなってIntuitに買収された。日本ではMoneyLookやKakeibonが似たようなサービスである。家計簿というニーズに特化したMoneyForwardやZaimも生まれた。とくにMoneyForwardは、2015年の時点では知っている人は知っている、という程度だったが、最近では頻繁に耳にするようになった。

様々なサービスが生まれた技術的背景には、銀行のAPI公開がある。これを使うと銀行と簡単に連携するサービスをつくることができる。そうなると、サービスには色々な付加価値が求められるようになる。HelloWalletやLearnVest、BillGuardはそれぞれ尖った付加価値を持ったサービスであったため、ユーザーを多く獲得し、大企業に買収されるに至っている。FinTech業界ではこのように大企業に買収されていく、という流れがアメリカではできている。

Quicken Mint HelloWallet BillGuard Moneylook Kakeibon Money Forward Zaim
f:id:ngo275:20170404225458j:plain:w100 f:id:ngo275:20170404225511p:plain:w100 f:id:ngo275:20170404225523p:plain:w100 f:id:ngo275:20170404225643p:plain:w100 f:id:ngo275:20170404225749j:plain:w100 f:id:ngo275:20170404225848p:plain:w100 f:id:ngo275:20170404225958p:plain:w100 f:id:ngo275:20170404230104p:plain:w100

企業向けのクラウドサービス

FinTechは企業の業務支援ツールも出しており、その大きなサービスとして、アメリカのIntuitが出しているQuickBooksが挙げられる。Xeroという競合のサービスも有名だ。日本ではMFクラウド会計や、freee、弥生会計オンラインがある。従来、手動で行なっていた入力が自動で行われたりするのだ。会計以外にも経営指標を算出するソフト(アメリカのDOMOなど)も生まれている。

QuickBooks Xero Fundbox DOMO MFクラウドシリーズ freee 弥生会計オンライン
f:id:ngo275:20170404230533p:plain:w100 f:id:ngo275:20170404230627p:plain:w100 f:id:ngo275:20170404230734p:plain:w100 f:id:ngo275:20170404230833p:plain:w100 f:id:ngo275:20170404230958p:plain:w100 f:id:ngo275:20170404231147p:plain:w100 f:id:ngo275:20170404231312p:plain:w100

資産運用

アメリカでは20世紀後半の金融の流れの影響からか資産運用に対して積極的である。そこでアドバイザーとしてFinTechが入ってきた。フィナンシャルプランナーは通常コストがかかる。そこでいくつかの質問に答えると最適なポートフォリオを提示するシステムが生まれた。それが、BettermentやWealthfront、Personal Capitalである。国内では、WealthnaviやTHEOといったサービスがある。

Betterment Wealthfront Personal Capital Wealthnavi THEO
f:id:ngo275:20170404231507j:plain:w100 f:id:ngo275:20170404231558j:plain:w100 f:id:ngo275:20170404231705p:plain:w100 f:id:ngo275:20170404231839p:plain:w100 f:id:ngo275:20170404231936j:plain:w100

融資

金融機関から個人や法人がお金を借り入れることを融資という。投資と違って返済の義務があるもの。金融機関は、利用者から預かっているお金を使って融資するので、融資にはリスクが伴う。融資をしてもいいのか、という判断をテクノロジーを使って解決しようという動きがある。Amazonの利用履歴を元に信用度を測るKabbageや、SNSのネットワークから信用度を測るKreditechやVouchというサービスがある。

Kabbage Kreditech Vouch
f:id:ngo275:20170404232122j:plain:w100 f:id:ngo275:20170404232217j:plain:w100 f:id:ngo275:20170404232949p:plain:w100

ソーシャルレンディングという言葉がある。これはインターネット上でお金を借りたい人と貸してもいい人のマッチングをするものである。P2Pファイナンスとも呼ばれる。リーマンショックを受け、金融機関が融資を厳しくした背景からこのようなニーズが高まった。イギリスのKivaやアメリカのLending Clubが代表的なソーシャルレンディングである。Lending Clubではパートナーの銀行が貸付を行なった後に、その債権を購入したい投資家を募るシステムになっている。日本ではクラウドクレジットやManeoというサービスがある。このソーシャルレンディングは、ジャンルを絞ったものも多く存在する。例えば、アメリカのSoFiというサービスは学生ローンに特化していて、履歴書の書き方から面接の練習も見ることで、ローンの返済能力をあげる施策を行なっている。OnDeckというサービスはオンラインの銀行のような新しいビジネスモデルもある。

Upstart Kiva Lending Club SoFi OnDeck クラウドクレジット Maneo
f:id:ngo275:20170404232801p:plain:w100 f:id:ngo275:20170404233106g:plain:w100 f:id:ngo275:20170404233223p:plain:w100 f:id:ngo275:20170404233314j:plain:w100 f:id:ngo275:20170404233414p:plain:w100 f:id:ngo275:20170405212946j:plain:w100 f:id:ngo275:20170404233459p:plain:w100

クラウドファンディング

クラウドファンディングには大きく融資型・投資型・寄付型がある。融資型が、融資の項目で上述したのと同じで、投資型も似ているが、獲得できるのが株式である。ベンチャーキャピタルの出資と近い。アメリカのAngelListがこの投資型のクラウドファンディングをしているサービスの1つである。寄付型のものは金銭的な見返りがないが、応援したいプロジェクトを後押しできる。JAPANGIVINGやふるさとチョイスがその例である。

もう1つ、事前購入型がある。日本ではこの形式が多く、ReadyforやMakuakeが相当する。アメリカでいうと、Kickstarterがそれに当たる。支援者がまず、これから開発を始めるというプロジェクトに出資して、一定金額に到達すれば開発を開始する。完成すると支援者はプロダクトを手にすることができる。投資と違って金銭的リターンはないが、これも応援の後押しをできる。

AngelList Kickstarter JAPANGIVING ふるさとチョイス Readyfor Makuake
f:id:ngo275:20170404234112p:plain:w100 f:id:ngo275:20170404234203p:plain:w100 f:id:ngo275:20170404234308p:plain:w100 f:id:ngo275:20170404234422j:plain:w100 f:id:ngo275:20170404234523p:plain:w100 f:id:ngo275:20170404234637p:plain:w100

決済

PayPalがこれに当たる。もっともITと相性が良い。日本で現金決済が占める割合は50%以上と言われている一方で、アメリカでは20%未満だそう。また、Apple Payが注目を浴びていたが、それはiPhone端末に搭載されたICチップで決済ができるというサービスだ。イギリスのTransferWiseは国境をまたぐ個人間送金を強みにしている。

Apple Pay Stripe PayPal TransferWise
f:id:ngo275:20170405185423j:plain:w100 f:id:ngo275:20170405190208j:plain:w100 f:id:ngo275:20170405190320j:plain:w100 f:id:ngo275:20170405190437j:plain:w100

国内ではLINE Pay、Yahoo! ウォレットに加え(これらは資金移動業に相当)、AnyPayが運営するpaymoというサービス(収納代行)や、つい最近ではKyashというサービス(suicaと同じ前払金支払手段)もリリースされて非常にホットである。資金決済法のあたりについてはまたしっかり勉強したい。

LINE Pay Yahoo! ウォレット paymo Kyash
f:id:ngo275:20170405191039j:plain:w100 f:id:ngo275:20170405215817p:plain:w100 f:id:ngo275:20170405190844j:plain:w100 f:id:ngo275:20170405191155p:plain:w100

アメリカのSquare、国内でいうと楽天スマートペイやCoineyは、スマホタブレットに装着するとクレジットカードが使えるようになる、という小型デバイスを開発している。

Square 楽天スマートペイ Coiney
f:id:ngo275:20170405185541j:plain:w100 f:id:ngo275:20170405190538j:plain:w100 f:id:ngo275:20170405191706p:plain:w100

感想

FinTechの種類とそれに対応する具体的なサービスを列挙してあって(それも国内にとどまらず海外のものにもたくさん言及してある!)非常にためになった。ここに書いてあるのは断片的なものであって本質的なことは本で確認してもらいたい。サービスが生まれた背景とかまでしっかり説明されてある。

特に決済に関しては、資金決済法に関連して様々な形式のサービスが出てきているのでもっとフォーカスして調べようと思う。2017年4月5日にKyashというアプリがプレスリリースされたが、今後の動向について注目していきたい。

C言語の学習にちょうど良いものを見つけた(Tutorial - Write a Shell in C)

f:id:ngo275:20170331224641j:plain

Tutorial - Write a Shell in Cを読んだ

Cの勉強にと思ってTutorial - Write a Shell in Cを手を動かしながら読み進めてみた。以下のような簡単なbashのようなシェルを作ってみようというもの。非常にわかりやすく書かれており、C言語の勉強にはもってこいだと感じた。(僕はC言語にはあまり触れたことがない。)

f:id:ngo275:20170331225229g:plain

シェルのライフサイクル

  • Initialize 設定ファイルの読み込み等。

  • Interpret ユーザー入力やファイル(stdin)を読み込んで実行。

  • Terminate メモリを解放して終了。

この流れが基本的なライフサイクルだが、今回作るシェルはbashのようなものなので、実行のたびに設定やシェルの終了がないことに注意する。プログラムの概形は以下のようになる。

int main(int argc, char *argv[]) {
    // もしあれば設定を読み込む.

    // loopするコマンドの実行. あとで実装
    lsh_loop();

    // シェルの終了
    return EXIT_SUCCESS;
}

シェルの簡単なループ

まずコマンドを扱う基本的な流れは以下のとおり。

  • Read 入力からコマンドを読み取る。

  • Parse コマンドの文字列をプログラムや引数として解釈する。

  • Execute 解釈したコマンドを実行する。

loopのコマンドの概形は以下のとおり。

void lsh_loop(void) {
    char *line;
    char **args;
    int status;

    do {
        printf("> ");
        line = lsh_read_line();
        args = lsh_split_line(line);
        status = lsh_execute(args);

        free(line);
        free(args);
    } while (status);
}

int main(int argc, char **argv) {
////

プロンプトの入力を読み取って、関数や引数に分割して、実行、そしてメモリ等を解放している。処理を終えるべきタイミングを lsh_execute で管理している。

入力の読み込み(Read the line)

ユーザがどれだけの文字の量を入力してくるのかわからないので、まずある程度の量を見積もっておき、それを超えたら再割り当てするようにする(Cではこれが定石らしい)。lsh_read_line は以下のようになる。

#define LSH_RL_BUFSIZE 1024
char *lsh_read_line(void) {
    int bufsize = LSH_RL_BUFSIZE;
    int position = 0;
    char *buffer = malloc(sizeof(char) * bufsize);
    int c;

    if (!buffer) {
        fprintf(stderr, "lsh: allocation error\n");
        exit(EXIT_FAILURE);
    }

    while (1) {
        c = getchar();

        // 終了まできたらnullにして終わり
        if (c == EOF || c == '\n') {
            buffer[position] = '\0';
            return buffer;
        } else {
            buffer[position] = c;
        }
        position++;

        // もしbufferを超えた時
        if (position >= bufsize) {
            bufsize += LSH_RL_BUFSIZE;
            buffer = realloc(buffer, bufsize);
            if (!buffer) {
                fprintf(stderr, "lsh: allocation error\n");
                exit(EXIT_FAILURE);
            }
        }
    }
}

void lsh_loop(void) {
////

最初の部分は宣言ばかりで、while以下がキモになる。while(1) はひたすら回り続けて、getchar をしているが、これはintであることに気をつける。EOFはcharではなくintだからだ。改行もしくは文字の終端がきたら終了する。それ以外はcharを連結してstringを作る。次にはじめに準備したbufferのサイズを超えていないか、になる。もし超えていたらreallocateする。

結構長めのlsh_read_lineを実装したのだが、実は少し新しいCのライブラリにはこの機能に相当する getline という関数があった。それを使うと以下のように簡単に短縮される。

#define LSH_RL_BUFSIZE 1024
char *lsh_read_line(void) {
    char *line = NULL;
    ssize_t bufsize = 0;
    getline(&line, &bufsize, stdin);
    
    return line;
}

読み込んだものを解釈(Parse the line)

今さっき読み込んだものの引数を解釈していく。ここでは簡単のために、引数の解釈にはスペースを利用する。つまり echo "this message" というコマンドがあったら、 "thismessage" のように分割された引数を持つこととなる。このような条件下ではstrtokトークナイズすれば良い。 lsh_split_line は以下のようになる。

#define LSH_TOK_BUFSIZE 64
#define LSH_TOK_DELIM " \t\r\n\a"
char **lsh_split_line(char *line) {
    int bufsize = LSH_TOK_BUFSIZE, position = 0;
    char **tokens = malloc(bufsize * sizeof(char*));
    char *token;

    if (!tokens) {
        fprintf(stderr, "lsh:allocation error\n");
        exit(EXIT_FAILURE);
    }

    token = strtok(line, LSH_TOK_DELIM);
    while (token != NULL) {
        tokens[position] = token;
        position++;
        
        if (position >= bufsize) {
            bufsize += LSH_TOK_BUFSIZE;
            tokens = realloc(tokens, bufsize * sizeof(char*));
            if (!tokens) {
                fprintf(stderr, "lsh: allocation error\n");
                exit(EXIT_FAILURE);
            }
        }
        token = strtok(NULL, LSH_TOK_DELIM);
    }
    tokens[position] = NULL;
    return tokens;
}

#define LSH_RL_BUFSIZE 1024
char *lsh_read_line(void) {
////

lsh_read_line と同じロジックであるが、先ほどはnullで終わるcharの配列を扱っていたのに対して、今回はnullで終わるポインターの配列を扱っている。はじめのstrtokポインターをはじめのトークンに与えている。またそれ以降の strtok は入力で与えられた文字列に対応するポインターたちを返し、それぞれのトークンの末尾に\0 bytesをつけている。そして文字のポインターの配列のポインターを格納している。言っててわからなくなってきた。最後に、全部の strtok が終わるとnullでトークンの配列作成が終わる。

シェルの開始

シェルの開始がもっともシェルの大切な部分になる。プロセスをUNIX上で動かすには2つしか方法がない。まず1つ目は、初期化(Init)だ。UNIXのコンピューターが起動する時、カーネルがロードされる。一度カーネルがロードされ初期化されると、カーネルはそのたった1つのプロセスのみが動き(それを初期化と言うのだが)、コンピューターが動いている間はそのプロセスはずっと動き続ける。

しかしながら、多くのプログラムはこのように初期化されないためもう一つの方法が出てくる。フォークである。OSがプロセスを複製するのだ(オリジナルが親、コピーが子になる)。fork() は子プロセスに0を返し、子プロセスは親プロセスに自身のプロセスID(PID)を返す。新しいプロセスを開始するには既存のプロセスから複製することが大切なのだ。

ところが、ここで問題がある。欲しいのは既存のプロセスの複製ではなく、違うプロセスなのだ。そこで出てくるのが exec() だ。現在のプロセスを全く異なるプロセスに書き換えることができる。まずフォークすることで2つのプロセスができる。そして、子プロセスは exec を利用していて新しいプロセスに書き換わる。親プロセスはこれをしながらも他のことを行い続けることが可能で、子プロセスとの関連は持ち続ける。

起動のコードはこんな感じになる。

int lsh_launch(char **args) {
    pid_t pid, wpid;
    int status;

    pid = fork();
    if (pid == 0) {
        // 子プロセス
        if (execvp(args[0], args) == -1) {
            perror("lsh");
        }
        exit(EXIT_FAILURE);
    } else if (pid < 0) {
        // フォークでエラー
        perror("lsh");
    } else {
        // 親プロセス
        do {
            wpid = waitpid(pid, &status, WUNTRACED);
        } while (!WIFEXITED(status) && !WIFSIGNALED(status));
    }
    
    return 1;
}

#define LSH_TOK_BUFSIZE 64
#define LSH_TOK_DELIM " \t\r\n\a"
char **lsh_split_line(char *line) {
////

プロセスをまずフォークするが、そのpidが0の時は子プロセスに相当する。この時に、ユーザーからの入力を受けてコマンドを実行したいので、 execvp を利用している(execの仲間)。execvpv はstringの配列(ベクトル: vector)を引数にしているためで、 p はプログラムが実行する時にファイルのフルパスを与えるのではなく、その名前を与えてOSに探してもらうことを表す。

もし exec が-1を返す時はエラーがあったことになる。perror はシステムエラーをプログラムの名前とともにプリントする。エラーがどこからきているか検証できる。

pid < 0 はフォークでエラーがあった時である。

if文の最後のブロックはフォークが成功し、親プロセスの時の処理が対応する。子プロセスの実行完了を親プロセスは待ってあげねばならない。waitpid はプロセスの状態が変わるまで待機する。ただ、この関数には多くのオプションがある(exec と同様に)。プロセスは正常に終了することもあれば、エラーや強制終了で終わることがあって多くのことを想定しないといけない。そこでここでは、waitpid はプロセスが終了するかキルされるまで待機することにする。

シェルのビルトイン

lsh_loop の中で lsh_read_linelsh_split_line を呼び出しているが、lsh_launch は呼び出していない。それは、もしユーザーがディレクトリを移動する時、chdir() を使うことになるが、カレントディレクトリはプロセスのプロパティだからである。親プロセスの持つカレントディレクトリは移動前のままになる。子プロセスも親プロセスの持つカレントディレクトリを継承することになる。

同様に、もしexit というプログラムがあるとして、exit を読んでももともと呼ばれていたシェル自体を終了することができない。終わらせたいシェルの中に組み込む必要がある。多くのシェルは~/.bashrc にそうした設定が書かれている。

いくつかのコマンドをシェルそのものに加えていかねばならない。ここで実装するのはcdhelpexit である。それらは以下のようになる。

/* 
ビルトインシェルのコマンドに対応する関数の宣言
*/
int lsh_cd(char **args);
int lsh_help(char **args);
int lsh_exit(char **args);

/* 
ビルトインシェルの関数に対応するコマンドの宣言
*/
char *builtin_str[] = {
    "cd",
    "help",
    "exit"
};

int (*builtin_func[])(char **) = {
    &lsh_cd,
    &lsh_help,
    &lsh_exit
};

int lsh_num_builtins() {
    return sizeof(builtin_str) / sizeof(char *);
}

/* 
ビルトイン関数の実装
*/
int lsh_cd(char **args) {
    if (args[1] == NULL) {
        fprintf(stderr, "lsh: expected argument to \"cd\"\n");
    } else {
        if (chdir(args[1]) != 0) {
            perror("lsh");
        }
    }

    return 1;
}

int lsh_help(char **args) {
    int i;
    printf("Shuichi Nagao's LSH\n");
    printf("Type program names and arguments, and hit enter.\n");
    printf("The following are built in: \n");

    for (i = 0; i < lsh_num_builtins(); i++) {
        printf(" %s\n", builtin_str[i]);
    }

    printf("Use the man command for information on other programs.\n");

    return 1;
}

int lsh_exit(char **args) {
    return 0;
}

int lsh_launch(char **args) {
////

lsh_cd はまず二つ目の引数が存在するか確認し、なければエラーを出す。あればchdir() を呼んでいる。lsh_help はいい感じのメッセージを出していて、exit は0を返してシェルのループを終了する。

ビルトインとプロセスを組み立てる

あとは残るは lsh_execute() の実装だ。これはビルトインとプロセス両方の起動を行う。

int lsh_exit(char **args) {
    return 0;
}

int lsh_execute(char **args) {
    int i;

    if (args[0] == NULL) {
        return 1;
    }

    for (i = 0; i < lsh_num_builtins(); i++) {
        if (strcmp(args[0], builtin_str[i]) == 0) {
            return (*builtin_func[i])(args);
        }
    }

    return lsh_launch(args);
}


int lsh_launch(char **args) {
////

最後の仕上げ

必要なヘッダーファイルをインクルードする。

#include <stdio.h>
// fprintf()
// printf()
// stderr
// getchar()
// perror()
#include <sys/wait.h>
// waitpid() and associated macros
#include <unistd.h>
// chdir()
// fork()
// exec()
// pid_t
#include <stdlib.h>
// malloc()
// realloc()
// free()
// exit()
// execvp()
// EXIT_SUCCESS, EXIT_FAILURE
#include <string.h>
// strcmp()
// strtok()

あとは gcc -o main main.c して ./main で実行ができる。ここで実装したのは非常に簡単なbashのようなシェルで、以下のようないくつかの問題はある。コードはgithubにあげておいた。

  • スペースで引数を判断するので"“で囲まれた複数の単語までそれぞれが引数として認識されてしまう。

  • パイプライン処理は対応していない

  • ビルトインのコマンドが少なすぎる

  • ワイルドカードで検索(glob)できない

※CのライブラリやUNIXについてわからないことがあればここが非常に参考になるとのこと。

2017年の4分の1がもう過ぎるので読んだ本を振り返ってみる

2017年の4分の1が終わろうとしているので、振り返りを兼ねて読んだ本をメモしておく。

f:id:ngo275:20170327101448j:plain

1月

ヘビーな技術書をガッツリ読んでいた。

Lisperのポール・グレアムが書いた本。前半はアメリカでの初等教育において、オタクがいじめられることについて批判していたのがなぜか印象に残っている。エンジニアでこの本を読んだことがあるという人は多いみたい(少なくとも身の回りには)。

  • 詳解Swift第3版

2016年の年末に出版されたSwift3対応のもの。Swiftを勉強し始めて間もない頃に詳解Swift(一つ古い版)を挫折したが、ある程度わかってきてから読むとものすごく勉強になる。Xcodeの使い方は一切触れずにSwiftという言語にフォーカスしているため、これをマスターしてもアプリは作れない。

  • コンピュータの構成と設計 第5版 上

コンピュータサイエンスの勉強ならこれ、と言われた。序盤はスラスラいけるが、パイプライン処理の詳細な話あたりから急にスピードダウンし、かなり時間をかけて読み進めた。時間がない時に、軽い気持ちで読むものではない本。時間があって勉強したい時にとても良いかも。

  • そのエンジニア採用が不幸を生む

人材系で働いている人に勧められた本。エンジニアとしてやっていきたいと思っていたら読むべき。理系だしなんとなくパソコン好きだからという理由でエンジニアを選んでしまうことがいかに危険か。

2月

1月にヘビーな技術書をずっと読んでいたので、技術から少し離れてビジネス系を読んだ。

  • HARD THINGS

起業家ベン・ホロウィッツが書いた本。twitterFacebookに出資したVCの創業者。CEOにしかわからない辛さがありありと描かれていた。特に起業する・したい人にはすごく参考になる本。

  • LIFE SHIFT

今後平均寿命が100歳を超えるということは科学的に必然だそうで、そうなった時に今のライフスタイルだと、生きていくことが困難になるので、どういう生き方が生まれてくるのか、という話。60代で定年になってから残り30~40年どうやって生きていくのか、いろいろ考えさせられる。

  • 暗号解読 上

暗号技術の歴史に関して。暗号が必要になった経緯や、その時に利用されていた暗号など。暗号の成長について非常にわかりやすく説明されていた。大戦中の暗号解読者の戦いは面白かった。

  • 88.68%勝てる営業

家にあった。カタカナが多すぎて読みにくかった。

3月

TEDを見ている中で、なんでみんなこんなにプレゼンがうまいのか、と気になってプレゼン関連の本を読んだ。

  • ゼロ・トゥ・ワン 君はゼロから何を生み出せるか

PayPal創業者ピーターティールのマインドセットがわかりやすく書かれている。「競争よりも独占をしろ」とか。非常に勉強になる。

  • 個を動かす

同じ高校の大先輩が活躍しているのでどういう人なのかと気になって読んだ。

  • アメリカの大学生が学んでいる「伝え方」の教科書

プレゼンのアウトライン作成から細かい作り込みや、プレゼンのカンペの作り方までわかりやすく説明してある。本というよりも教科書に近い。

  • ビジネスと人を動かす 驚異のストーリープレゼン

上とは違って教科書というより本。読んでいてこっちの方が引き込まれる。引き込まれる話し方について説明しているからだと思うけど。

人工知能について非常に丁寧に説明してある。勉強になった。

4月はお金の回り方に関するものと技術書を読み漁ろうと思う。

ペアプロして気づいた、デキるエンジニアと未熟なエンジニアとの差

デキるエンジニアとペアプロをした

デキるフルスタックエンジニアとペアプロすることになった。かなり繊細な箇所をリファクタリングするというタスクだった。彼は、高校時代に孫さんに影響を受け、高校卒業後に渡米し、カリフォルニアの大学に通う。そして卒業して帰国後、未踏クリエイターに選出されてひたすらLispを触っていた。ちなみに、エディタはEmacsで、サーバーサイドはもちろんiOSAndroidEmacsで実装している。一方で、僕は彼に比べれば経験値も技術力もかなり劣る。

二人の実力差は大きいのだが、実装するのは彼の方だった。力量差があるもの同士のペアプロというと、未熟な方が教わりながら実装する、ということをイメージしてしまう。もちろん実力差が小さくなればそんなこともないのかもしれないが…。

作業速度の速さ

圧巻だったのは速さだ。Emacsを使っており、ホームポジションから本当にほとんど離れない。プログラミング歴が浅いとどうしてもトラックパッドや矢印キーに手を伸ばしてしまうが、その行為がいかに時間を奪っているのかを痛感した。複数の画面をめまぐるしく行き来し、手とパソコンと一体になっている感が強い。学生ベンチャーにいるとなかなかこのレベルの速さでタイプする人に出会えない。タイピングが早い人はいくらでもいるが、実装そのものの速さはペアプロをしないと体感できない。

ドキュメントをまず当たる

Emacsで実装しているとXcodeのように強力な補完がない。それに加えて、彼はiOSエンジニアではなく、むしろサーバーサイドが得意と言っていた。にもかかわらず的確に正しい関数を書いていくのだ。よくこんなに覚えているなと思っていたところ、彼は頻繁に公式ドキュメントを参照していることに気づいた。少しでも曖昧なところがあると Dash というアプリで公式ドキュメントを確認するのだ。これを繰り返しているうちにしっかりと身につくようである。言われてみると、自分が実装するときは疑問解決の際、ブログやQiita、スタックオーバーフローなどばかり参考にし、公式ドキュメントを参照する機会が少なかった。まず公式ドキュメントを参照するという癖がなかったのだ。見習わなければならない。

Dash
f:id:ngo275:20170321233504p:plain:w120

お互いめちゃくちゃ疲れる

こっちは普段慣れない速度でコードを考えていたので非常に集中力を使ったが、実はドライバー役の彼も普段より全然疲れたそうだ。一人で実装しているとぼーっとする時間がどうしても生まれてしまうのが、ペアプロをするとそれがなくなる。いいことだが長時間行うには適度に休憩を挟まないといけないみたいだ。

実装や思考速度は普段より早いのだが、意外とついていけることにも気づいた。逆にいうと、彼の速度でエディタを扱えるようになると実装速度が2倍くらいになると痛感した。

レベルの高い人に囲まれる良さ

こういう高いレベルの人に囲まれる良さも感じた。学生ベンチャーにいると優秀な学生に出会えるがなかなか出会えない人もいるのが現実だ。どうしても幅が狭まってしまう。特に技術力が高いエンジニアはレベルが高い環境と求めると思うので、そういうところに飛び込んでいく度胸が求められるのかもしれない。四月からの新しい環境が楽しみだ。