astamuse Lab

astamuse Labとは、アスタミューゼのエンジニアとデザイナーのブログです。アスタミューゼの事業・サービスを支えている知識と舞台裏の今を発信しています。

現場コーチング受けてみた話

f:id:astamuse:20201125123021j:plain

こんにちは、アプリケーションエンジニアの @yukung です。突然暑くなったり寒くなったり、気温の変化が大きい今日このごろ、体調いかがでしょうか。コロナの勢いも再び出てきてしまっており少し不安な状況になりつつある中、再度気を引き締め直してしっかり体調に気をつけていきたいですね。

スクラム始めてみてその後どうなった?

さて、今回は以前ご紹介した、弊社の ICP 開発チームにおける開発の様子のその後について触れてみたいと思います。

以前このブログで、ICP 開発チームでは開発の進め方としてスクラムを導入して開発を行っていることをご紹介しました。その時の経緯や具体的なやり方の様子などは、以下の記事もぜひご覧ください。

lab.astamuse.co.jp

また、本記事の趣旨とは少しずれますが、今年の大きな変化として多くの企業がリモート・在宅での業務にシフトしていく中で、我々 ICP 開発チームもスクラムを継続しつつ、自ずとリモート主体の業務スタイルに移行しています。その時の変化の様子については、以下の記事で紹介されていますのでこちらもどうぞご覧ください。

lab.astamuse.co.jp

スクラムを始めてみて浮き彫りになった課題

上記の記事で触れた通り、スクラムを始めてしばらくは、私自身がスクラムマスター兼開発者兼各種スクラムセレモニーの MC を兼任する形で進めていました。見様見真似で始めたこともあり、はじめの頃はチーム全体が何が正解かも分からず、まずは私が言っていることを正として、進めていたと感じています。

そうすると、容易に想像できることではありますが、だんだんと私自身がボトルネックになりはじめている感触を持つようになりました。どんな点でそう感じていたかについて、細かいものまで挙げると切りがないですが例えば以下のようなものです。

  • スプリントプランニングの進め方について
  • ストーリーポイント見積もりの基準について
  • デイリースクラムのファシリテーション
  • プロダクトバックログリファインメントの議論のファシリテーション
  • 振り返りのファシリテーション
  • etc...

当然といえば当然ですが、知らないものに取り組んでいるのでそうならざるを得ないのはある程度仕方のない面があります。

一方で、この状況は決して芳しいものではなく、チームの成果を最大化するにはこの状況自体を改善する必要性がありました。PM の Gyopi が機を見たタイミングで違和感や改善提案などを出してくれてそれ自体に大分助けられていたのですが、私自身も認定スクラムマスターの資格を持っている訳ではなく、私自身でも自信を持って進められているわけではありませんでした。

そんな折、私が以前在籍していた職場で現場コーチとして関わってくれていたギルドワークスの中村さん

guildworks.jp

からお声がけいただいて、中村さんのご厚意によりアドバイスをいただける機会を得ることができました。

GuildWorks

コーチングの内容(一部)

漠然とした課題感は持っていたものの、自分たちでも何が課題なのかをはっきり認識できていない中で、中村さんには現状を率直にぶつけてお話を聞いていただきました。以下はその時のミーティングの様子で話していたメモの一部です。(字が汚くてすいませんw)

f:id:astamuse:20201125120251j:plain

(この時からは結構時間が経っており、今となってはという話も含まれていて個人的には懐かしい感情が沸いてきます…)

また、中村さんにはチームの振り返りのある会にご同席いただいて、様子を観察していただきました。一部ですが抜粋してみます。あくまでも私たちのチームの状況なので、全て参考になるわけではないと思いますが、なんとなく雰囲気が伝わればと思います。

f:id:astamuse:20201125120331p:plain

中村さんとのオンライン雑談会

また、この後ある程度時間が経ってからも、オンラインでの雑談会で相談に乗っていただいたりもしました。その時にいただいたメモなどを一部抜粋してご紹介します。

こちらも私たちが直面した状況に対する議論のメモなので、これを読んでそのまま何か答えとなるようなものではありませんし、特定の課題に限っていないので取り留めもないのですが、少しでも参考になればと思い載せてみます。(中村さん)とカッコ書きにしているところは、中村さんからいただいたアドバイスの一部です。

オンライン雑談会のメモ

  • ストーリーポイントの確からしさに対する不安
    • 怖い?
      • (中村さん)正確さを求められる強迫観念をチームが持っている?
    • 数字は取っているけど、それを見てカイゼンする姿勢になりづらい
    • ポイントについて話しているのにいつの間にか工数見積になっている。
      • (中村さん) 議論する前にまず最初につけてみると良い かも?
      • (中村さん)1,2,3,5,8,13 で 2 つ以上離れていると、話し合うと良さそう なアラート。
    • (中村さん) 規模見積と工数見積の違い について
  • チームの人数の大きさについて。多いと感じているが実際どうなのかが不安
    • 最適な人数ってどれくらい?分けたほうがいい?
      • (中村さん)どうして分けないの?
      • 実際に回るかどうか不安
        • (中村さん) 試しに PO と SM (私自身) が、一緒に1週間くらい旅行に行ってしまって、その間みんなに回してもらえばいいのでは?
      • (中村さん) 小さく分けてうまくいかなければ、元に戻せばいい んじゃないかな?
      • (中村さん)PO が一人で回らないかもという場合、POを増やすという選択肢もある。例としてエンジニアから企画の人に手伝ってもらってPOをできていた例がある。
    • チームをわけることで、ドメイン or 技術スキルに偏りが出るかもという不安
      • (中村さん) 「みんながいい感じに守備範囲広くできる状態」をそもそも目指すのか?目指すとしたらそこにはどのように到達する のか?
      • (中村さん) ”チーム”としてユーザーに届けるためのスキルを持っているか が大事。
    • (中村さん) スモールチームでやったほうが、学びの増幅が起きやすい 印象がある
    • チーム分ける時、コードベースでも分けてる?
      • (中村さん)とある現場の例では、別れているチームも1つあるけど、2チームは同じところを触っている
      • (中村さん)同じところを触りそうなときにはスプリントの手前でやることをずらして被りづらいようにしている
  • リファインメントっていつしたらよい?今は週一回時間を取ってやっているが、議論が発散しがちでうまくできていないと感じる

現場コーチから持ち帰って実践したこと、変化があったこと

上記のような取り組みをさせていただいたことで得られたこととしては、まずは 私自身の良い振り返りの機会になった 、ということが大きかったと思っています。

自分自身でも自信を持てていたところ、逆にあまり自信を持てておらず不安だったところ、全く観点がなかったところなど、率直にぶつけさせていただいたことで気付かされることが多くありました。それによって私自身の振る舞いが少しずつ変わっていったように感じています。

また、上記でいただいたようなアドバイスを元に起こったチームの変化という意味で 1 つ挙げると、 私が行っていたような多くの議論のファシリテーションなどを、今ではチームメンバー全員で交代しながら実施することができるように なりました。

それによって、プロダクトバックログリファインメントとの向き合い方が以前より変わり、 しっかりリファインメントできたものに関してはやることがはっきりしてチームメンバーが理解できている状態でスプリントプランニングに臨めるようになった ため、議論がスムーズになりました。

スプリントプランニングやプロダクトバックログリファインメントなどについて、関わっているメンバー一人一人が、 誰かがやってくれるものという認識ではなくチームメンバーが自分のタスクとして認識する ことで、どういう事に気を配らないといけないのか、また議論の着地点をどこにするのか、という意識が少しずつチームメンバーに芽生えてきたのではないかと感じることが多くなってきました。結果的にリモート中心となってもミーティングの練度が高まっていったように感じています。

まとめ

スクラムを始めてしばらくして浮き彫りになってきた課題について、幸運にもギルドワークスの中村さんにアドバイスいただける機会をいただけたことで、チーム開発におけるカイゼンを一歩前に踏み出すことができたと感じています。

お声がけいただいたギルドワークスの中村さん、この場を借りて御礼申し上げます。ありがとうございました!

我々 ICP 開発チームはまだまだ完成された開発チームではありませんが、スクラムを用いて自分たちの開発するものについてチームで議論しながら進められるような開発ができています。こうした開発にご興味がある方は下記バナーの採用サイトからご応募いただければと思います。

gitlab-ci+kaniko+gcloudでCloudRunにアプリケーションをデプロイする

f:id:astamuse:20201110120825p:plain

11月です。寒いですね。ICPチームでgitlab-ci芸人をやっているchotaroです。
gitlab-ciと戦ったのも一年前
性懲りもなく、ややこなれてきた人向けのgitlab-ciのTIPS記事です。

日本語での情報があまりない分野ですので、誰かの役に立てば幸いです。
(なおこの記事を書いている段階でブログ当番を2ヶ月ほど滞納しております。土下座。

主な元ネタはこちらのgitlab公式doc

本記事のモチベーション

以下をモチベーションとしています。

  • 気軽にツール作ってdeployしたい。
  • gitlab-ciのjobからgcrにimageをpushしたい
  • ついでにそのままCloudRunにデプロイしたい
  • でもdind(docker-in-docker)はセキュリティ的に使いたくない(重要

jibなどもツールの選択肢にはなりうるのですが、CloudNative Buildpacksがdockerを必要とするため、dindを用いることが不適切なケースでは利用できません。

そこでここではgitlabの公式ドキュメントにも記載のある、kanikoを利用した実現方法を紹介していきます。

事前知識

kanikoとは

ものすごく端的に言えば、「dockerを使うことなく、Dockerfileからcontainer imageを作成し、リポジトリに pushするツール」です。

kaniko自体は、kubernates内でimageをbuildすることが主眼とされています。本記事ではあくまでも、container imageをdockerなしに作成するツールとして用います。

dockerfileの作成

kanikoはdockerを使いませんが、inputにDockerfileを必要とします。ProcfileなどではなくDockerfileなので、この点がややCloudNative Buildpacksなどと比べると開発者にとって少し敷居が高いかもしれません。

あくまでサンプルなので拘らず、GCPのdocにあるものを真似します。

Dockerfile

FROM node:15-slim

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install --only=production

COPY . ./

CMD [ "node", "index.js" ]

index.js

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  const name = process.env.NAME || 'World';
  res.send(`Hello ${name}!`);
});

const port = process.env.PORT || 8080;
app.listen(port, () => {
  console.log(`helloworld: listening on port ${port}`);
});

package.json

{
    "name": "helloworld",
    "description": "Simple hello world sample in Node",
    "version": "1.0.0",
    "private": true,
    "main": "index.js",
    "scripts": {
      "start": "node index.js",
      "test": "mocha test/index.test.js --exit",
      "system-test": "NAME=Cloud test/runner.sh mocha test/system.test.js --timeout=30000",
      "lint": "eslint '**/*.js'",
      "fix": "eslint --fix '**/*.js'"
    },
    "author": "Google LLC",
    "license": "Apache-2.0",
    "dependencies": {
      "express": "^4.17.1"
    },
    "devDependencies": {
    "got": "^11.0.0",
    "mocha": "^8.0.0",
    "supertest": "^4.0.2"
    }
}

起動して8080にアクセスするとHello World!という表示だけ出ます。

kanikoを使ったbuild

kanikoは引数で三つ指定が必要です。

  • docker-file
    • build対象のDockerfileはどこに置いてあるか。
      • gitlab-ciであれば$CI_PROJECT_DIRなど。
  • context
    • どこのソースを使用するか。kubernatesでの利用が主眼なので、リモートリポジトリなども指定できます。
      • gitlab-ciで特定のrepositoryでciする場合だと、素直に$CI_PROJECT_DIRなどでOKです。
  • destination
    • この設定値がpush先になります。
      • 例えばgcrのフルパス。(ex: gcr.io/<プロジェクト名>/<image名>

executorを対象にdocker runすればそのままdestinationに作成したimageがpushされる形です。

また、gcrにpushしたい場合GCPでの認証認可が必要になりますが、その他のGCPツール群と同じく$GOOGLE_APPLICATION_CREDENTIALSの環境変数にcredentialファイルのpathを渡してあげればOKです。

gcr上のイメージをcloud run上へdeployする

pushしたdocker imageをcloud run上にdeployするには、gcloudのコマンドを使えばOKです。gcrへのpushで使ったservice accountにこの権限も付与しておくと管理すべき認証情報が一つのservice accountにまとまるのでエコです。

公式ドキュメントも参考に、コンテナイメージを使ってgcloudコマンドでdeployしましょう

gcloud run deploy <サービス名> --image <imageのpush先> --platform managed --region <region名> 

実際に試してみる

gitlab-ci.yml

このような形になりました(ExecutorにはDocker Machineを使用しています)

stages:
  - build
  - deploy

before_script:
  - echo 'set up  credentials'
  - echo $CREDENTIAL > $CI_PROJECT_DIR/key.json
  - export GOOGLE_APPLICATION_CREDENTIALS=$CI_PROJECT_DIR/key.json

build: 
  stage: build  
  image:
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: [""]  
  script:
    - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $DESTINATION

deploy:
  stage: deploy
  image: google/cloud-sdk:alpine
  script:
    - gcloud auth activate-service-account --key-file=key.json
    - gcloud config set project $GCP_PROJECT_NAME
    - echo y | gcloud auth configure-docker
    - gcloud info
    - echo y | gcloud run deploy kaniko-sample --image $DESTINATION --platform managed --region <region名>

ポイントは以下の点です。

  • buildとdeployでjobを分ける
  • 環境変数にcredentialなどの情報は外出しする(git管理下に鍵情報は置きたくないので
  • before scriptで認証情報のセットアップを行う

buildとdeployでjobを分ける

kanikoのimageはdebugで利用します(gitlab公式docも参照ください

また、素のalpineなどにgcloudを入れるのは大変なので、gcloudのimageをそのまま使うためtaskを分けています。

環境変数にcredentialなどの情報は外出しする

gitlab-ciのvariablesに下記を設定します。

  • GCP_PROJECT_NAME
    • GCP上のプロジェクト名
  • CREDENTIAL
    • サービスアカウントの認証情報
  • DESTINATION
    • gcrの指定

before scriptで認証情報のセットアップを行う

  - echo 'set up  credentials'
  - echo $CREDENTIAL > $CI_PROJECT_DIR/key.json
  - export GOOGLE_APPLICATION_CREDENTIALS=$CI_PROJECT_DIR/key.json

ややトリッキーな書き方になってはいますが、variablesに設定した認証情報を書き出します。

    - gcloud auth activate-service-account --key-file=key.json
    - gcloud config set project $GCP_PROJECT_NAME
    - echo y | gcloud auth configure-docker

gcloudでそのkeyをもとにサービスアカウントとしての認証設定を行います。これでgcloudのセットアップはOK

実行後の確認

gitlab-ciの実行結果を確認し、Service URLにアクセスしてHello World!を確認します。

Deploying container to Cloud Run service [<サービス名>] in project [<プロジェクト名>] region [<リージョン名>]
Deploying...
Creating Revision...................................................................................done
Routing traffic......done
Done.
Service [<サービス名>] revision [<サービス名>-00004-but] has been deployed and is serving 100 percent of traffic.
Service URL: https://<url>

trouble shooting系(ここでつまりました

  • gcloud run の際にSERVICEがないと言われる
    • ちゃんとhelpをよみましょう。
    • gcloud run deploy <SERVICE名称> <--で始まるその他オプション>という構文です。
  • gcloud run の際にregionが設定されてないと言われる
    • ちゃんと(ry
    • 設定しましょう。 --regionオプションです
  • 403が出て表示できない
    • これが出るのは主に、デプロイしたアプリが権限を必要とする状態になっており、かつアクセス者に権限がない場合です
    • console上でアクセスする人(gcp上のメンバー)に権限を付与すればそのメンバーがアクセスできるようになります。
      • あくまでサンプルやリクエストを複数受けても問題ない場合のみ使うべきTIPSではありますが、--allow-unauthenticatedオプションをつけてdeployすることで誰でもアクセスできるようになります。

まとめ

ざっくりとした解説にはなりますが、以上です。
趣味と実務の境目みたいなTIPSでしたが、こういう積み重ねが後々新しいことをやろうとした時に効いてくると信じています。

やってみた感想としては、Dockerfileを用意すればどんなアプリケーションでも原則このやり方でdeployできるはずなので、社内ツールのようなものにも活用していけたら気軽にいろいろ試していけそうかな、という感じです。

ICPとして今後本番利用したりしていくかは未知数ですが、jenkinsでの運用に限界があるのも事実なので、この辺りのアンテナも個人的には立てていきたいところだと思っているところです。

さて最後にはなりますがアスタミューゼでは引き続き好奇心豊富な(?)メンバーを募集しています。
業務やドメイン的には他の方の記事がどれもかなり興味深い内容にはなっておりますので、そちらも読んでいただきビビッときたらこちらよりご連絡いただければと思います。では!

参考にさせていただいたもの

データ・オペレーション

データはいささか奇妙な性質を持っています。なんらかの事象の記録という観点では、それは文明の出現と時期をともにします。それが電子的に記録され、流通するようになってからは、まだ日が浅いものの、現在では、私たちの生活において決定的に重要な意味を持っています。

はじめまして。じんと申します。当ブログでは初のお目見えと相成ります。どうぞよろしくお願いいたします。弊社には2020年1月より参画し、いわゆるデータ・サイエンティストとして勤務しておりました。講談社サイエンティフィク社様のデータ・サイエンスに関する一連の書籍の一部の執筆を担当させていただいたことがありますので、まあ、データ・サイエンティストを自称してもいいのではないか、とは思っています。

さて、「勤務しておりました」、と過去形となっているのは、どうも自分が現在している仕事はいわゆる純粋な「データ・サイエンス」と呼ばれるものではないのではないか、とここ数ヶ月ほど感じておりましたためです。もちろんデータ・サイエンティストとしての仕事もしているのですが。そこで、はて、自分の仕事はいったい、既存の仕事でいうとなんであろうか、と考えたところ、もっとも適切にそれを表現するのは「オペレーション」と呼ばれる仕事、より粒度を細かくして参りますと、生産管理や流通管理の仕事が最も近いであろう、という認識に至りました。ご存知やもしれませんが、弊社はデータを取り扱うことに重きを置いた企業です。扱っているものはいわゆる洗剤や消毒液などではなく、「データ」という、触ることは難しいものの、しかし価値のある商品を取り扱っています。このデータという商品を生産し、流通させ、販売する機構全体について今日は考えていることを書いてみたいと思います。 DevOps や DataOps 、 MLOps 、 AIOps という概念を多少、広げた話になるのではないか、と思っています。車輪の再発明となる記事かもしれませんが、「データ」の「オペレーション」として、私が「データ・オペレーション」として考えていることをここではご紹介させていただきたいと思います。この記事が公開されたあと、他の有識者のみなさまのご意見を伺いに行こうかと考えています。

生産

さっそくまず生産に入っていきましょう。なんらかの生データを入手し、それに機械学習あるいは人手によって記述された規則に基づいて追加的なデータ、例えばなんらかのタグなどを付与しなければならない状況を考えていきます。

原材料調達

とにもかくにも、原材料が必要です。なんらかのデータですが、典型的には外部から購入できる、あるいは無償で公開されており入手が容易なデータベースなどが考えられます。 Wikipedia などは典型的なものでしょう。付加価値を付与する前のデータがあるとして、それに付加価値を付与しなければなりません。なんらかのタグを付与する際には、注釈づけ (アノテーション) が行われた教師データが必要になります。この注釈づけを適切に行うことは容易ではありません。テキストにおいては、『Natural Language Annotation for Machine Learning』という書籍が参考になります。

ここで一つ頭に留めておかないといけないことは、有償のデータを購入して利用する場合は、その供給者に対して、すなわちデータの仕入れ先に対して、こちらが価格交渉力を保持しているか、という観点です。典型的な Porter’s Five Forces の Power of Suppliers の問題です。もし、独占的にある企業が保有しているデータの入手が必要になった場合、こちらは価格交渉力を持ちません。「足下を見られる」ことになります。相手の言い値で買わざるを得ないことになります。この蛇口を締められてしまいますと、当然、こちらは干からびてしまいますから、仕入れ先の冗長化には気を配る必要があります。

加工

なんらかのタグを付与する対象のデータと、そのための教師データが用意されたとしましょう。さあ、データ・サイエンティストの登場となります。機械学習の問題に帰着できるのであれば、何らかの計算模型 (モデル) を設定し、パラメタを推定し (学習) 、その上で実際にタグを付与 (推論) することになります。

この加工については、実に様々な設定がありうるため、一概に論じるのは難しいところですが、よく感じることは、目的に対して適切な、過小でもなく過大でもない手段で取り組むことが、特に費用や時間の制約が大きい場合は、重要である、ということです。少々乱暴な例ですが、小学生の頃に通っていた塾の講師がよく言っていたことを思い出します。「隣の家の犬がうるさいとき、爆弾を投げるのは過剰だろう。小石でも投げるか、そもそも隣の家の家主を尋ねるべきだ」と。

どうも、この加工において、ひとまず爆弾を投げるような事例を多く見かけるように思います。手段と目的を転倒すべきではありません。人手で規則を書けば済むような問題に対して、これを機械学習で解きたい、というのは単なる自己満足に過ぎません。もちろん、爆弾を保有している、ということを外部に主張することに商業的な意義がある場合はあります。

また、この課題が、どれくらい難しいものか、というある種の「偵察」が重要です。現代の技術や資源ではまず解決不可能な問題と相対している可能性すらあります。こういった観点も上述の『Natural Language Annotation for Machine Learning』で詳説されていますが (しっかりイタレーションを意識する必要があります) 。データと、まず「一揉みしてみる」ことが肝要です。既に確立され、論文も多数出版されている機械学習課題であればある程度の目測を立てることは可能ですが、新しい種類のデータに対して新しい種類の処理、すなわち加工を施そうとする場合は、まずその「硬さ」を調べてみる必要があります。包丁で十分なのか、それともダイヤモンドカッターを持ち出さないといけないのか、そもそも強力な炸薬で爆破する必要があるような課題なのか、こういった問題の難しさをまず見積もる必要があります。解決不能であると考えられるのであれば、埋没費用の誤謬に惑わされることなく、速やかに撤退する必要があります。

品質管理

私が、機械学習を利用した生産において、最大の問題と感じているのがこの品質管理です。10万件のデータ、典型的にはデータベースのレコードに対して機械学習によって何らかのタグを付与したとしましょう。この精度(適合率や再現率といった観点はもちろんありますが、一旦「精度」と捨象します)が、適切に注釈づけ (アノテーション) されたデータの、テストデータに対して、90%の精度を達成したとしましょう。歩留まりだと考えますと(良品率と一旦まとめて考えてしまいます)、10万件のデータに対して1万件の誤りが含まれていることが想定されます。1万件も誤りが含まれているのです。1万件です。菓子パンだと考えると10個に1個は不良品が含まれているのです。これは許されることなのでしょうか。この菓子パンを検品なしにそのまま出荷したら、瞬く間に企業の評判は地に落ち、社内はお客様のお怒りの電話の鳴る音で満たされることになります。

話は脇に逸れますが、この「歩留まり」について感銘を受けたのは名著、『ルワンダ銀行総裁日記』における珈琲豆商人の一節で、これはぜひお勧めしたい一冊です。また、この名著は、巨大な体系を、この場合は開発途上国とはいえ、一国の経済であり、それを専門知識で以って俯瞰する、という点において技術者として実に印象深いものです。手段と目的を転倒させてはならない、ということもこの書籍から深く読み取ることができます。

加えて、実験室のような環境で90%の精度を達成したとしても、現場での生産はその精度を遥かに下回ることがほとんどです。 data availability and user tolerance という考え方があります。要は、豊富に教師データがあり、かつ、結果が誤っていても重大な問題が生じない機械学習課題であれば実用化は容易、ということです。 EC サイトや動画配信サイトの推薦システムを考えますと、お客様の購買履歴や視聴履歴が容易に手に入り (data availability) 、かつ妙な商品やコンテンツを推薦してしまったとしても、本来であればご購入いただけたはずの商品をご購入いただけなかったという機会損失はありますが、被害は大きくありません (user tolerance) 。ただし、未成年のお客様に成人向けの商品やコンテンツを推薦することには大きな問題がありこの点については厳密な制約を加える必要があります。

評判分析も user tolerance の高い課題です。 A 社の X という製品と、 B 社の Y という商品の評判を機械的に調べてみることを考えてみましょう。莫大なツイート集合に対して評判分析を実施し、 X と Y がどのような観点においてどのような評価を、典型的には肯定的な評価と否定的な評価をどのくらい受けているのかを考えます。そもそも、莫大なツイート集合をマーケティング担当者が読解するのは無理がある話です。また、多少の誤りがあっても、そもそもの莫大な母集団を考えますと多少の誤りは許容できます。

問題は、データの一次加工物、すなわち何らかの分析をデータに加えたものと、それに対して更に何らかの加工を加え、特に人手による分析が後段で入ったり、あるいはそのデータがさらに別の機械学習課題の入力として利用される、データの二次加工物では異なる品質を要求されるということです。一次加工の結果、すなわち10万件のデータに1万件の誤りが混入している、そういったものを直接、販売することは果たしてできるのでしょうか。 user tolerance について、慎重に吟味する必要があります。

このことから、データの一次加工物に対しては人手による系統的な品質管理が必要となることがわかります。その体制を構築することも一つの難しい問題です。

流通

在庫管理

さて、とにもかくにも、データが生産されました。当然、それはどこかに保管されます。現代であれば、クラウド上のストレージや何らかのデータベースにそれは格納されているはずです。もしここで、弊社が生産しているものがテレビであれば、生産されたテレビはどこかの倉庫に山積みになっています。データの厄介なところは、それに触れたり、物理的実体として視認することが難しいという点でしょう。例えば、在庫管理の担当者の引き継ぎが行われたとき、少なくとも、後任者は、倉庫にテレビが山積みになっていれば、いやあ、在庫が山積みだなあ……とすぐにわかります。データの場合、この引き継ぎが適切に行われなかった場合、そもそも在庫が山積みである、ということの認識すら難しくなります。いわゆるデジタル・ダッシュボードの果たす役割は実に重要なものです。

会計上、テレビのように物理的実体を伴って出荷を待っている資産は貸借対照表の流動資産の部に計上されます。問題は、データは流動資産としては計上されない、ということです。もしテレビの在庫が倉庫に山積みになっている場合は、それは棚卸資産として評価の対象となりますが、データは会計部門から捕捉されません。この性質もデータの取り扱いを厄介にします。ソフトウェアは無形固定資産として資産に計上できますが、それによって生じたデータは資産にはなりません。しかしデータが決定的に重要なのです。

その一方で、テレビが倉庫に山積みになっており、その倉庫の賃料を求められることと同じように、データもストレージを占有し続け、倉庫の賃料のように、着実に出費を強要してきます。加えて、データにも鮮度があり、古いデータより新しいデータの方が当然有用性が高い場合が多くなります。

雑駁に述べて参りましたが、データは在庫としては以下のような性質があることがわかります。

  1. (データの取り扱いに習熟していない限りは) 直感的に捉えづらく在庫の実態の把握に工夫が必要
  2. 会計部門から監視されないため棚卸しの機会を強要されない
  3. 維持に費用を要する上に徐々に価値が低下していく

言うまでもなく、 3. については多くの商品が該当します。問題は 1. と 2. で、率直に言って、在庫としては非常にいや〜な商品です。この在庫としてのデータの管理についてはまた別の機会に述べてみたいと思います。そもそもデータは一般的な意味において私たちが思い浮かべる「在庫」なのでしょうか。

一つ留意しおきたい点は、この商品に関する私たちの認識です。計算機科学においては「型」となるでしょうか。菓子パンは食べられるものであって、重さがあり、形があり、それはある一定の形態であるべきもので、可能な限り密封されて輸送されるべきものであって、時間とともに食用に耐えられなくなる、という認識を広く想定することができます。在庫管理の担当者や、後述する流通の担当者、例えば菓子パンを倉庫からコンビニエンスストアに輸送くださるドライバの方も、その認識においては齟齬は大きくないでしょう。パンは食品なのです。

一方、データベースのあるテーブルのあるカラムに入っている値の型は、はて、文字列なのか、整数なのか、当然ですが、それは一定の専門知識がなければ把握することができません。私の父や母に SQL をしゃべってもらうことは、まあ、いい歳ですから、今後も不可能でしょう。菓子パンはとても身近なものですが、文字コードに関する知識も含めて、いまお読みいただいているこのテキスト自体が実際はどのようにこの世界に存在しているのか、というのは意外と難しい問題です。このテキストは地球上の、もろもろを捨象しますと、ある計算機のストレージ上にあります。それに簡便に触れていただくために、あれこれとプロトコルがあります。こういった問題を隠蔽するように、すなわちそれを多くの方が気にかけなくてもよいように、計算機科学は進歩してきました。それはすなわち、専門家でなければその実態を把握できない、ということに他なりません。計算機科学に限らず、科学技術というものは本来的にそういった性質があります。なぜ蛇口をひねると水が出るのでしょうか?その水はどこから来たのでしょうか?電気はどうでしょうか?

話はそれますが、この在庫というものは、非常に厄介な一方、なかなか面白いものです。任天堂社様の名コンテンツ『社長が訊く』の『PUNCH-OUT!!』の開発経緯からは、在庫について考えさせられるものがあります。

流通管理

やれやれ、ひとまずちゃんとデータの実態を把握しつつ在庫として確保した、とします。さて、今度はこれを流通させなければなりません。流通は、必要なもの (what) を、必要な場所 (where) の必要な人 (who) に、必要なとき (when) に着実に届けることです。あまり気持ちのよい例ではありませんが、戦争における銃弾や砲弾について考えてみましょう。戦闘が生じる前 (when) に、戦闘が生じる場所近傍 (where) の部隊 (who) に銃弾や砲弾 (what) を届けなければいけません。銃弾がなければ銃も単なる棒になってしまいます。

データのよいところは、それが有線であろうが無線であろうが、その流通に要する計画および実行が物理的な商品と比べて比較的容易であるところです。もちろん回線の容量やデータベースの処理速度という制約がありますし、データベースのレプリケーション一つ取り上げてもあれこれと検討すべきことがあります。しかし、銃弾や砲弾のように、前線で一日にどれだけの銃弾や砲弾が必要で、そのためにはトラック何台を前線と策源地の間を一日何回往復させる必要があり、それはどういうスケジュールでなされ、トラックの稼働率(トラックもいずれ故障しますので全てのトラックが常に稼働するとは期待できません)はいくらで、トラックの修理のための部品と技術者はいくら必要で、トラックの運転手は何名必要で、彼らにもお休みを取っていただく必要があるのでどういうシフトで、また燃料はどれくらい必要で、事故や敵の妨害も加味した安全率も考慮すると……といった複雑な数式を解く必要は少なくなります。

映像のような大容量のデータをオン・デマンドで世界中に流通させるためには、コンテンツ配信網の利用が必要になってきます。これも上述の流通という観点から理解できます。すなわち、大容量の映像コンテンツ (what) を、世界各地 (where) の視聴者の方々 (who) にオン・デマンド (when) でお送り差し上げる、すなわち流通させるためには、大容量回線網の地理的な接続を加味した上で、回線網上に分散した補給点を設置する必要がある、ということになります。高速道路や幹線道路の脇に工場や倉庫が立地していることや、かさばる輸入原材料の加工を行う工場が沿岸部、それも直接、船舶からの荷下ろしが可能な海沿いに立地していることと変わりません。

話を元に戻しますと、一つ厄介な問題は、データを販売を担当する営業部門にお渡しする段階です。データベースに格納されているデータを、さて、どうお渡しすればいいのでしょうか?営業担当者の方が SQL を発行して必要なデータ、すなわち商品を取り出せばいいのでしょうか。営業担当者の方が複雑な SQL をしゃべることができることを期待してもよいものでしょうか。やはりエンジニアが SQL をしゃべって必要なデータを取り出すべきでしょうか。仮に後者だとして、営業担当者の方が必要なデータをエンジニアが適切に SQL に落とすための意思疎通に齟齬は生じないのでしょうか。いよいよ頭が痛くなってきました。

さて、ここで what/where/who/when が現れました。ここまで意図的にいくつかの問題に触れずにいましたが、いよいよ販売の話に移ります。

販売

ようやく、いよいよデータの販売にまでたどり着きました。しかしまだまだ問題は山積しています。

需要予測

いよいよ深刻な問題についてついに触れなければなりません。一般的には、企画部門が、何らかの商品の企画を行い、生産部門において生産が行われ、流通部門がそれを輸送し、営業部門が販売できるように彼らの手元に商品を届けることになります。さて、ある商品がどれくらい売れるのか、どう需要を予測すればいいのでしょうか?この点については近年の典型的なデータ・サイエンティストの仕事となります。大量生産されるある種の消耗品はわかりやすい例でしょう。過去の販売データに基づいて、何らかの計算模型を設定し、パラメタを推定し、推論を行うことである程度の需要は予測できます。地域の人口や年齢構成、収入などからも推定は可能です。

この商品、すなわち、データ (what) は、まあ、売れる、ということが高い確度でわかっているとします。データが必要とされるまでの時期までの時間に余裕がある場合は何とか生産が間に合うでしょう。厄介なのは、特殊な、頻繁には生じない商取引に必要なデータで、これを迅速に提供、すなわち生産する体制を常に生産部門は整えておかなければならないという状況が生じることです。このことから、生産部門の稼働率には常に遊び、すなわちバッファを残しておく必要が生じます。

さらに、異なるデータを同時に、異なる営業部門から求められ、しかも生産部門にはそれを並行して生産する余裕がない状況を想定してみましょう。胃が痛くなる状況です。ここで、 5W1H の残り、 why と how が生じます。なぜ (why) 、またそれはどれくらいの確度 (how certain) で必要となるものか (商品が販売され利益が生じる、と事前に完全に確定している状況はむしろ稀です) 、どれくらいの利益 (how much) を生じさせるものなのか、期待値の計算が必要になってきます。しかも期待値の計算に必要なパラメタである確率 (確度) および確率変数 (利益) を事前に求めることは容易でありません。

価格設定

なんとかデータを売れるようになってきたとしましょう。長い道のりでした。さて、これをいくらで売ればいいのでしょうか?原価計算の登場です。原価としては、原材料としてのデータの調達費、加工費、エンジニアの人件費などが含まれます。データという商品の直接費については、外部から原材料となるデータを購入した場合はその費用、機械学習の教師データを作成した場合はその注釈づけを行ったアノテータの人件費、エンジニアの人件費、さらにデータの加工に要した計算資源の利用費用が含まれます。これにオフィスの家賃やらなにやらの間接費が加わり、概ね原価を計算することができます。さて、付加価値として、おいくら万円、この原価に利益となる部分を上乗せして販売価格とすべきでしょうか?ここには当然、重大な要素として、競合他社を考慮した価格戦略やマーケティングが潜んでいます。 Power of Customers において、こちらが独占的なデータ提供者だとしたとき、売価をふっかけてもいいものでしょうか?当然、お客様は他の調達先を探すことになります。この点については別の理論が出現しますが、またの機会に譲りたいと思います。

法務

ここに来てちゃぶ台をひっくり返すことになりまして誠に恐縮です。この商品はそもそも売っていいのでしょうか?法的な問題があります。大きくは、原材料が何らかのデータベースであった場合は、そのデータベースを加工して販売してよいのか、というライセンス (契約) の問題と、著作権の問題が生じます。これは最初に検討しておくべき問題です。特に、データを生成するために利用されたパラメタについては注意が必要になってきます。例えば、自社ではない他社が注釈づけを行った教師データに基づき、何らかの学習を経て、得られたパラメタは誰のものなのでしょうか。 GitHub で公開されている学習器やパラメタを利用して生成されたデータの扱いはどうなるのでしょうか。ある種のライブラリは、当該ライブラリを使ってデータを生成したことを明示することを求めることがあります。お客様にデリバリ差し上げる商品にその旨を明示することは営業上、許容可能なのでしょうか。また、収集した公開情報を加工して販売することに著作権法上の問題は生じないのでしょうか。頭の痛い問題ですが、これらは早急に生産段階から明瞭にしておく必要があります。

管理会計

ヨシ!データという商品を販売することできました。万歳!……と快哉を叫び祝杯をあげ、べろべろに酔っ払いたいところなのですが、ところがどっこい、最後に本当に面倒な話をしなければなりません。管理会計です。社内で共通に利用され販売されるデータがあるとしても、部署によってその利用頻度には濃淡があるでしょう。生産部門でデータを生産していたエンジニアのお給料はどこから生じたものであるのか、ということを考えると、ある営業部門の売り上げとその売り上げにおけるデータの貢献度を計算する必要が生じてきます。しかし、そのような貢献度を明確に計算できるものなのでしょうか?あるエンジニアが特定の営業部門の仕事のみをしている場合は問題は単純です。しかし、エンジニアのチームが社内で横断的に利用されるデータを整備している場合、それはどうなるでしょうか。これはエンジニアの俸給にも関連する問題です。この問題についてはいまだに明確な回答を私は持ち得ていません……いえ、回答はあるのですが、計算式の算出、すなわち貢献度の計算を行うためには、営業部門の活動に関する専門的な知識と、生産部門が生産したデータの営業部門への貢献度とをすり合わせ、データの価値を売り上げから算出するため体系的な仕組みが必要となり、その方法論をいままさに模索している最中です。

まとめ

ここまでで、原材料の調達、加工、品質管理を含む生産管理、在庫管理を含む流通管理、さらに価格設定や管理会計といった様々な観点が、 GPU をぶん回すことに集中したいデータ・サイエンティストの周りにはうようよと存在していることがわかってきました。私の個人的な経験に基づきますと、これら様々な観点に対して誰かが俯瞰的に目配りをしない限りは、いくら高度な専門知識と経験を兼ね備えているデータ・サイエンティストのチームを編成しても結局のところ成果の極大化は難しいのではないか、と考えています。それは傑出した技術者集団を抱えていた企業が、市場から退出していった歴史となんら変わるところがありません。結局のところ、私自身は、ある特定の種類のデータを処理することにこれまで専念して参りましたが、実用化という観点においては失敗ばかりであり、それはこのような視点を欠いていたからであると認識しています。目下、私の関心は、ここまで述べて参りました、データに付加価値を付与しそれをお客様に提供する過程全体の最適化にあります。

この他の観点としては、財務会計があり、これはデータを資産として計上できないということ、すなわち生産されたデータが単なる費用として表現されてしまい、弊社内のデータの価値を外部の関係者の皆様から適切に評価していただきづらい、という問題を生じさせます。またそもそも、どのようなデータを保持していれば競争上の優位を維持できるのか、といった企業戦略も念頭に置く必要があります。これら様々な要素を加味しながら、関係する専門家の皆様と、データの最適な生産、流通、販売を実現することがデータ・オペレーションの仕事なのではないかと愚考する次第です。この長い記事を最後までお読みくださったことに心より御礼申し上げます。

最後に

弊社は人材募集中です!応募してください〜!お願いします〜!私を助けてください〜!「データエンジニア」および「機械学習エンジニア」でご応募いただければ、たぶん私が現れますので、ざっくばらんに、雑談をさせていただければ幸いです! h.nishikawa@astamuse.co.jp にメールをお送りいただく形でも結構です!お待ちしております〜!

Copyright © astamuse company, ltd. all rights reserved.