本記事はSalesforce Platform Advent Calendar 2017の21日目の記事です。
前職ではSalesforce+α(AWSとかHerokuとか)なSI業務を5年半くらいやっていて、昨年、事業会社のエンジニアとして転職してから1年ちょっとが経過しました。新卒エンジニアとしてのスタートがSalesforceというのは当時としてはレアな経歴だったと思うし、それが故にエンジニアとしての色々な悩みを抱えつつ仕事をしていました。
ということで、本記事では「エンジニアとしてSalesforceで技術は学べるのか?スキルアップできるのか?」とか「潰しが効くのか?」とかそういった疑問に対する考えをダラダラと書いていきたいと思います。
プログラミング言語/フレームワークとして学べること
エンジニア初心者にとってはApexやVFはプログラミング言語/フレームワークを学ぶのに適したプラットフォームだと思います。理由としては以下のとおり。
- 実行環境が環境依存せず、環境構築などのプログラミングを学ぶ上での敷居が低め
- DBやランタイムも自分で用意する必要がない
- 言語仕様がJavaライクでオブジェクト指向に書けなくはない(実際書くことは少ないけど)
- VFのapexタグではViewテンプレートとして必要なタグが一通り揃っているし、コントローラとの変数バインドの概念もあるので一般的なWebアプリケーションフレームワークとそこまで乖離していない
- ガバナ制限によってN+1クエリを容易に書けなくなっているので、必然的に効率的なデータ操作をせざるをえない
- タイムアウトのガバナにより、処理時間が長いものは非同期処理に持っていかざるを得ない。
- Webアプリにおいても一つのリクエストがプロセスを専有してしまい非効率なため非同期に持っていくことが多い。
- スロークエリ回避(Index付与、カラムのカーディナリティ、クエリオプティマイザ意識したクエリ実行)
大事なのは「Salesforceでできるからそこから先は学ばなくて良いのではない」ということです。Salesforceは技術的な敷居を下げているので、エンジニアとして成長していきたいのであれば、本質的なところをもう一歩踏み込んで勉強して理解した方が良いと思います。
また、開発がローカル環境で完結せず、毎回HTTPリクエスト&SF内でのビルドが実行されて開発スピードが遅くなるのはやりづらいところです。毎回Salesforce環境にアップロードされるので、gitを使った開発手法を取り入れたりするのも難しいし、テストも遅いのでTDDなどの開発・設計手法を取り入れるのも難しいです。フロントエンドだけなら色々といじれると思いますが。
プラットフォームに依存しないプログラミング言語と比べるとエコシステムが弱いので(そもそもニーズが無いというのもあるが)そこらへんも物足りない部分かもしれません。
なので、一通りApex/VFで勘所を掴んだらWebに強い言語(PHPやRubyなど)でサービスを作ってみて、もう少し深い領域まで勉強することをおすすめします。
一般的なWeb技術として学べること
Salesforceはエンタープライズ領域のSaaSであり、プログラマブルな部分もあるしAPIを使った外部連携の話が当然あります。エンタープライズ領域でないとSOAP APIやSAMLなどのXMLな技術にはあまり出会えないし、ODataみたいなエンタープライズなAPI仕様を聞くこともあまりないです。また、Salesforceは数年前からOpenID Connect(OIDC)に対応していて、他のアカウントでSalesforceにログインできるし、他のサービスにSalesforceのアカウントを使ってログインすることも技術的には可能です。一方でLINEログインは最近OIDCに対応した感じですし、facebook・twitterログインはそもそもOIDCではなかったりします。
Sitesやコミュニティを使っている組織なら証明書の発行が必要になったり、DNSレコードをいじったりすることもあります。Salesforceからメール配信するならSPFやDKIMの設定が必要になったりします。
というように上げればキリが無いんですが、要するにSalesforceは様々な技術を包含しています。もちろんこういった領域にはそれぞれエキスパートが居るので、Salesforceでつまみ食いしたレベルでは本業の人には全く太刀打ちできませんが、知っているとアーキテクチャの理解度が高まったり、いざその技術が必要になった時のはじめの一歩が出やすいです。
潰し効くの?
回答になっていませんが、潰しが効くかどうか以前にSalesforceをやりたい人はSalesforceをやるべきだと思うし、Salesforceをやりたくない人は自分が好きな領域をやれば良いと思います。自分のやりたい領域に全力でコミットするのが大事。Salesforceをやりたいと思っている人であれば、Salesforceの技術をブログやTwitterなどのツールで発信したり登壇してみたりツール作ったりコミュニティ運営してみたり啓蒙していったりすれば良いと思います。Salesforceが無くなったらどうするの?っていうのも愚問で、何を使っていたとしても多かれ少なかれ我々は巨人の肩に乗っているわけで、そういったリスクは当然あります。仮になくなったとしてもSalesforceに代替する何かが作られるとは思うし、そうでなくてもSalesforceのエッセンスは何かしらのプロダクトで生きていくと思います。そしてそのエッセンスを学ぶためにも勉強したりコミュニティなどで行動していくことが大事なのだと思います。その意味では「潰しは効きます」。また、何がやりたいのかがわからない人は色んな技術領域を勉強するのも良いと思います。その点Salesforceは技術領域が多岐にわたっているので、認証関連技術を好きになったりAPI連携に興味を持ったり、あるいはDB周りやマルチテナントアーキテクチャに興味を持ったりすることもあるかもしれません。Salesforceのライセンス料金やプロプライエタリ技術にうんざりしてOSSでSFA/CRMを独自に開発する、なんてルートもあると思います。
Salesforceに限らずだと思いますが技術、サービスや社会的な価値観の変遷に応じて、キャリアパスやロールモデルも新しく増えたり減ったりしていると思います。そういう意味では「この人をロールモデルとしてキャリアアップする!」というよりは「自分自身がキャリアを切り開く」とか「自分自身がロールモデルになる」という思考をすると良いような気がしています。