Slide 1

Slide 1 text

Ruby エンジニアが Salesforce 業界に 異動して感じたこと 〜 Ruby/RailsのヤバいTips共有会 〜

Slide 2

Slide 2 text

自己紹介 名前:しげる 所属:マネーフォワード HR領域→横断領域→BizOps 好きな技術: Ruby, LINE API, React 趣味: LINE API で遊ぶこと。

Slide 3

Slide 3 text

今回のLTで伝えたいこと 1. Ruby のおかげでチャレンジしても生きていけている ○ 1つの言語を極めれば概念がわかる 2. どこでもコミュニティ活動は楽しい! 3. ヤバイTips a. プログラミングは多言語に翻訳できる! LLM をどんどん活用しよう

Slide 4

Slide 4 text

物事はいつも突然に ある日

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

現在のチームの特性: ● 社内のビジネスオペレーションを改善するチーム ● エンジニア職、ビジネス職の混合チーム(計 9名) ● エンジニア職は、2名 ○ 自分とお誘いいただいたマネージャー ● ビジネス職の方もコードを書ける方がいる ○ 相談ができるのでとても良い環境

Slide 7

Slide 7 text

10月から兼務 12月から主務で異動 主務として、3ヶ月目

Slide 8

Slide 8 text

で、最近どうなん?

Slide 9

Slide 9 text

Ruby エンジニアが Salesforce 業界に 異動して感じたこと 〜 Ruby/RailsのヤバいTips共有会 〜

Slide 10

Slide 10 text

コミュニティの特徴

Slide 11

Slide 11 text

コミュニティの特徴 > Ruby コミュニティ 人の特性 ● エンジニア背景の人が多いので、共感がしやすい ● Rubyを実際に開発している人との距離が近い ● 様々な業種の会社の人が参加している ● #rubyfriends などの雰囲気もある

Slide 12

Slide 12 text

コミュニティの特徴 > Salesforce コミュニティ 人の特性 ● Salesforce を使っているので話しやすい ● Salesforce ユーザーといっても種類が様々 ○ ベンダー:Salesforceの開発を請け負う方 ○ アドミン:管理者 ○ ユーザー:営業の方で実際に利用されている方 ● Salesforce の領域が広いため、様々な背景の人がいる ○ エンジニア、情シス、マーケ、IS、FS、カスタマーサクセス

Slide 13

Slide 13 text

コミュニティの特徴 > Ruby コミュニティ 勉強会、教材 ● ドキュメントが多い ○ Ruby, Rails の公式ドキュメント、るびま ○ 様々なエンジニアが Qiita, Zenn で投稿している記事 ● LTや登壇などの機会がとても多い ○ ローカルコミュニティがたくさんある ○ カンファレンスも各所で行われている ■ RubyKaigi, Kaigi on Rails, etc…

Slide 14

Slide 14 text

コミュニティの特徴 > Salesforce コミュニティ 勉強会、教材 ● 勉強する教材が充実している ○ 公式のハンズオン教材(Trailhead)が用意されている ● 資格試験がたくさんある ○ 資格を集めるドラゴンボールとも言われている ● ユーザーコミュニティ主催のSalesforce の勉強会が活発 ○ Trailhead を進めるもくもく会がある

Slide 15

Slide 15 text

Ruby / Salesforce コミュニティで似ていること ● 参加する人たちの属性が似ている ○ 同じ技術を利用している && いろんな背景の人がいる ● コミュニティイベントがが活発! ○ ユーザーコミュニティがとても活発 ● 大きな変更が行われる ○ Ruby / Rails は年に1度のバージョンアップ ○ Salesforce は年に3度のバージョンアップ

Slide 16

Slide 16 text

実際の業務はどうなん? Rubyの知識は使えてる?

Slide 17

Slide 17 text

A. バリバリ使える!

Slide 18

Slide 18 text

12月にしたタスク: 概要 ● 統合で、お客様の担当情報をマージする必要があった ○ 1,000件程度のデータのずれが発生した ● 手動でのマージを検討したが、自動化できればしたい したこと ● Apex(Salesforceの独自言語)でデータパッチを作成&実行 ● わからないことはLLMと相談

Slide 19

Slide 19 text

全体の流れ 1. 実現可能か技術調査を行う 2. Ruby でデータパッチの模擬コードの作成  → LLM で Apex へ変換 3. LLM を利用してテストコード 4. Salesforce でひたすら検証 ♾ 5. Salesforce の本番環境で実行

Slide 20

Slide 20 text

実現可能か技術調査

Slide 21

Slide 21 text

Ruby の模擬コード > 前処理① class RubySampleBatchJob < BatchJob def perform duplicated_contacts = Contact.all leads = Lead.where(email: duplicated_contacts.pluck(:email)) .where("count(email) = 1") .group_by(:email) # ...本処理へ...

Slide 22

Slide 22 text

Apex のパッチコード > 前処理① public class SampleBatchJob implements Database.Batchable { public Database.QueryLocator start(Database.BatchableContext BC) { return Database.getQueryLocator([SELECT Id FROM Contact]); } duplicated_contacts = Contact.all

Slide 23

Slide 23 text

Apex のパッチコード > 前処理① public class SampleBatchJob implements Database.Batchable< SObject> { public void execute( Database.BatchableContext BC, List duplicatedContacts ) { // Collect all emails from the contacts Set duplicatedContactEmails = new Set(); for (Contact duplicatedContact : duplicatedContacts) { duplicatedContactEmails .add(contact.Email); } leads = Lead .where( email: duplicated_contacts.pluck(:email) )

Slide 24

Slide 24 text

Apex のパッチコード > 前処理① // ...続き... // Query leads with emails matching the duplicatedContact emails Map leadsMap = new Map(); for (Lead lead : [SELECT Id, Email FROM Lead WHERE Email IN :contactEmails] ) { if (!leadsMap.containsKey(lead.Email)) { leadsMap.put(lead.Email, lead); } } // ...本処理へ... leads = Lead .where(email: duplicated_contacts.pluk(:email) ) .group_by(:email)

Slide 25

Slide 25 text

Ruby の模擬コード > 本処理① class RubySampleBatchJob < BatchJob def perform # ... duplicated_contacts.each do |duplicated_contact| lead = leads[duplicated_contact.email]

Slide 26

Slide 26 text

Apex のパッチコード > 本処理① for (Contact duplicatedContact : duplicatedContacts) { Lead lead = leadsMap.get(contact.Email); lead = leads[duplicated_contact.email]

Slide 27

Slide 27 text

Ruby の模擬コード > 本処理② if lead Database.LeadConvert leadConvert = new Database.LeadConvert(); Database.LeadConvertResult result = Database.convertLead(leadConvert); if (!result.isSuccess()) puts "Lead conversion failed ..." next end 技術検証 した Apex のコード

Slide 28

Slide 28 text

Apex のパッチコード > 本処理② if (lead != null) { Database.LeadConvert leadConvert = new Database.LeadConvert(); leadConvert.setLeadId(lead.Id); Database.LeadConvertResult result = Database.convertLead(leadConvert); if (!result.isSuccess()) { System.debug('Lead conversion failed ...'); continue; } 技術検証 した Apex のコード

Slide 29

Slide 29 text

Ruby の模擬コード > 本処理③ original_contact = Contact.find(result.getContactId()); merge_contacts(original_contact, duplicated_contact) わからないので、っぽい関数にする

Slide 30

Slide 30 text

Apex のパッチコード > 本処理③ Contact originalContact = [SELECT Id FROM Contact WHERE Id = :result.getContactId()]; mergeContacts(originalContact, duplicatedContact); っぽい関数が実際の関数になった!

Slide 31

Slide 31 text

全体の流れ 1. 実現可能か技術調査を行う 2. Ruby でデータパッチの模擬コードの作成  → LLM で Apex へ変換 3. LLM を利用してテストコード 4. Salesforce でひたすら検証 ♾ 5. Salesforce の本番環境で実行

Slide 32

Slide 32 text

無事動いた🎉

Slide 33

Slide 33 text

結論: Rubyを書いていてよかった

Slide 34

Slide 34 text

今回のLTで伝えたいこと 1. Ruby のおかげでチャレンジしても生きていけている ○ 1つの言語を極めれば概念がわかる 2. どこでもコミュニティ活動は楽しい! 3. ヤバイTips a. プログラミングは多言語に翻訳できる! LLM をどんどん活用しよう

Slide 35

Slide 35 text

ご清聴 ありがとうございました 👏