エンジニアのためのsalesforce超入門

こんにちは。はじめまして。tarokamikazeです。
最近ずっとsalesforceを触っているので、ここはひとつエンジニア向けの入門記事でも書いてみようかと思います。

ここでは、商品的には Sales Cloud / Service Cloud についてお話します。
マーケティング関係など、他の製品については取り扱いませんのでご注意ください。

## はじめに: もし経営者やえらいひとが、この記事を読んでいただいていたら

上流工程ができるエンジニアが社内にいて、CRM/ERP等の導入を検討しているならば、この記事を見せて「ちょっと作ってみて」と言ってみてください。
来週には、あなたの欲しいシステムをsalesforce上で構築し終えているかも。

**......無論、おぬしが作ってもええんじゃぞ？**

## 想定読者

ある程度コードがかけて上流工程もできるWebエンジニアを対象としています。

* スタートアップの社長だけど、顧客管理とかちゃんとやんなきゃねーというスゴイ級エンジニア
* そろそろうちも顧客管理しなきゃねーとお思いのCTO様
* えらいひとに「salesforce導入検討して」と振られた社内エンジニア
* 「てか導入しといて」といきなり言われた、かわいそうな社内エンジニア

## salesforceとは

言わずと知れた、世界10万社以上が利用するSaaSです。
用途として一番メジャーなのは[CRM](https://ja.wikipedia.org/wiki/%E9%A1%A7%E5%AE%A2%E9%96%A2%E4%BF%82%E7%AE%A1%E7%90%86)(顧客管理システム)ですが、プログラムなしで案件・請求管理等、なんでも管理画面が作れます。

エンジニア的に言うと「スキーマ定義したら画面が勝手についてくる」という感じ。
具体的には、以下の機能がプログラムなしで作れます。

* テーブルやカラム、リレーションの新規作成/編集/削除
* テーブルやカラムに紐づくCRUD画面と REST / SOAP API
* テーブルやカラム単位での権限管理(参照・編集権限)
* 社員組織 x レコード単位での権限管理(平社員は自分に関係するものだけ編集権限、その上長は部下に関係するものの参照権限 etc...)
* レポート・ダッシュボード機能(これは一般ユーザーでもカスタマイズ可能)

わお。CakePHPのBakeより便利じゃん。
このように、社内システムを作りたい場合のカスタマイズ実装コストをかなり抑えられます。

その他の機能でいうと、下記のようなことも、全部プログラムレス。

* ログイン機能
* ユーザー管理
* 電子稟議・承認機能
* レコードの新規作成・更新等をトリガーにした自動処理(メール送信etc..)
* [Twitterみたいな社内SNS(Chatter)](http://www.salesforce.com/jp/chatter/overview/)が無料でついてくる
* 顧客/業者向けポータルサイトも作れるらしい
* スマホアプリも無料でついてくる


## UI

私が知る限り、Salesforceには4種類のUIが用意されています。
参照するデータは同じです。ユーザーが好きに選ぶこともできます。

エンジニア的には、正直どれも一長一短あって選びづらい。

### Classic

2010年以前の古臭い感じ。いい意味でも悪い意味でも枯れている。他がSPA(JSゴリゴリ)で重いので、低スペックマシンだとこちらか。
**あとフォントが糞。MSゴシックとかありえん**

### Classic Console

SPA。
一覧と詳細画面を1画面内で表現できるのがウリ。画面デザインはClassicぽい。
Service Cloudでないと使えなかったが、Sales Cloudでも使えるようになった。
**これもフォントが糞。MSゴシックとか(ry**

### Lightning Experience

SPA。
要素の配置はClassicそのままに、より現代的なUIになっている。
AIが営業活動に勝手にアドバイスしてくれるのがウリ。
ときたまJSがコケるので、安定性としては課題が残る。(再読込すればいいだけだが)
フォントはやっっとメイリオ採用。ヒラギノはどうだったっけ。。。

### Lightning Console

2017年2月にβリリースされたばかり。Classic ConsoleのイイトコとLightning ExperienceのUI、AIを組み合わせたものらしい。私はまださわれていないです。

## 設計のコツ

スキーマ定義したら画面が勝手についてくる以上、要件定義が決定的に重要になります。

Lightning系では[AI(Einstein)](https://www.salesforce.com/jp/products/einstein/overview/)がついてきます。
こいつは「どの会社でも使うテーブル = 標準オブジェクト」の内容を解析しているものと思われます。
つまり「**標準オブジェクトをsalesforceのお作法通りに使わないと、AIの恩恵を受けづらくなる**」ということです。

CRM(Sales Cloud) を導入・設計する際は、標準オブジェクトの意味合いをよくよく理解し、自社の概念を整理していかに標準オブジェクトに落とし込むか、という「概念の翻訳と説明能力」が求められます。

**こういうの、DDDやってるひとならお手の物ですよね！**

salesforceのカスタマイズ自体は非エンジニアでも可能であるものの、こういったエンティティ定義は、やはりエンジニアでないと厳しいかもしれません。
逆に言えば、エンティティ定義をしっかりと固めたあとの保守作業は非エンジニア部門に渡すのが正しいやり方だと思います。

## 標準オブジェクトのER図

Sales Cloud の標準オブジェクトのER図です。
これが一番書きたかったやつ。公式だと見づらかったりするんですよねー。
こいつを暗唱できれば、カスタマイズもレポートも楽勝！

### マーケ〜受注まで

![GeneralObjectsOpp.png](https://qiita-image-store.s3.amazonaws.com/0/103900/990e66f5-400e-a241-3d54-edd8762208ad.png)

### 受注以降

![GeneralObjects.png](https://qiita-image-store.s3.amazonaws.com/0/103900/8a36d56d-b2b6-3981-c5e9-567023dd027e.png)

だいたいのオブジェクトがユーザーと「所有者」(レコードレベルでの権限制御で利用)と紐付いています。これを利用して「営業社員単位での商談金額」みたいなレポートもカンタン！
ちなみに、標準オブジェクトは物販系をメインターゲットにしている模様。
月額課金モデルの商品だと、工夫が必要そうです。

## 無料でさわってみよう

とりあえず興味本位で触ってみたい方は、[Developer Edition](https://developer.salesforce.com/signup) を利用するのがよいでしょう。こちらは期間無制限で無料。
チュートリアルサイト[Trailhead](https://trailhead.salesforce.com/ja)を利用すれば、無料で使い方・カスタマイズ方法まで理解できます。

導入検討されたい方は、[30日間無料のトライアル](https://www.salesforce.com/jp/form/trial/freetrial.jsp)を申し込んでみてください。

導入済み企業で「自分はsalesforce担当じゃないけど、カスタマイズとか遊んでみたいよ！」という方は、社内のsalesforce担当者に「[Sandbox環境ください！](https://help.salesforce.com/articleView?id=data_sandbox_create.htm&language=ja&type=0)」といえばよいかと思います。

## おかねのはなし

* お値段は高め。Sales Cloudだと定価 ¥18,000 / 月。営業さんがつけば値引交渉可能。
* 生産性は高いので、プログラム工数も含めて考えると、そこまで高くはない。
* 導入規模によるでしょうが、salesforce社のひとが無料で**自社の活用方法や営業ノウハウ**を教えてくれたりする。また無料でユーザー会やセミナー等多数やっている。これらセミナー代を含んでいるとしたら、むしろ安いかもしれない。
* 顧客・商談管理だけではなく、案件・納品・請求管理まで(作り込めば)可能。そういうERPを導入するのと比べると、十分元は取れるかも

## エンジニア視点での闇

* ヘルプページがリダイレクト多すぎてクソ重い。
* 稼働中の環境への機能追加が辛すぎる。
  * 影響が出るのを覚悟の上で、本番環境にカスタマイズするか。
  * Sandbox(開発環境)でカスタマイズしたものを、ひとつひとつポチポチしてデプロイするか。
  * Gitみたいに、本番と開発環境の差をdiff一発でとれる、みたいなことができればいいのに.......
     * [Salesforce DX](https://www.salesforce.com/jp/products/platform/products/salesforce-dx/) で、できるようになるらしい！
* salesforce標準機能ではできない機能を実現するには、**独自言語 Visualforce や APEX(古いjavaみたいなやつ)**を使わないといけない。こいつの開発環境も古臭くて辛い。
* REST/SOAP APIコール数に制限があるため、雑にB2CシステムとAPI連携すると死ぬ。
  * 上記2つの闇を払うためには、Heroku with [Heroku Connect](https://devcenter.heroku.com/articles/heroku-connect)でデータをPostgresに同期し、お好きな言語で開発しちゃえばいい。
* 利用者/管理者コミュニティは活発で公式も大事にしているが、エンジニアコミュニティは微妙。
  * ~~大事にしてたら、もうちょっとマシな開発環境用意しますよねー~~ [Salesforce DX](https://www.salesforce.com/jp/products/platform/products/salesforce-dx/) でかなり改善するっぽい？
  * 世の中ではAPEX自社開発なんてせず、たいていベンダーに投げるらしい。顧客との関係薄いエンジニア方面へは、投資を渋っている模様
* 権限制御が多機能なぶん複雑で、一度ハマると抜け出しづらい。
* **Classic 画面のデザインが古臭すぎる。フォントがマジでクソで、CSSはカスタマイズ不能。** 海外でも言われてる。
  * [フォントはブラウザ設定でなんとかすることはできる。](https://www.dondari.com/Salesforce.com%E3%81%AE%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%81%8C%E6%B1%9A%E3%81%84%E3%81%AE%E3%81%A7%E6%94%B9%E5%96%84%E3%81%99%E3%82%8B)
* CRMのような営業系業務アプリをつくれるエンジニアは、アメリカでは給料がどんどんあがっているらしい。**が、日本ではまだまだ。。。**

## まとめ

* CRUD機能を画面ポチポチするだけで作れるよ。管理画面開発の生産性はクソ高いよ
* 導入には上流工程スキルと、業務理解が必要だよ
* 標準機能でできないことを無理やりなんとかしようとすると、とても辛いよ
* DDDわかるひとなら、きっとかんたんにできるよ！

## 参考URL

* [Salesforceを導入して「これを先にやっておけば・・・」と後悔したポイント3つ](https://www.skyarc.co.jp/news/000451.html) : 逆に、こういうこと考えずに作り始められるの...? とエンジニアはびっくりする記事。
* [SalesforceでのWebアプリケーション開発についての現状（部外者向け）](http://qiita.com/stomita/items/992f6be7084565420e8d) : エンジニア視点でのいろんな闇と、それとの闘い方を教えてくれる。
* [モダンJavaScriptアプリケーション開発 in Salesforce](http://qiita.com/stomita/items/0d978be1f3696e9ef7e8): 同上。@stomita氏は心の師匠です。
* [AtomとPlantUMLで爆速UMLモデリング](http://qiita.com/nakahashi/items/3d88655f055ca6a2617c) : 当記事のER図はこれで書きました。本当にサクサク書けるのでオススメです。