Моим первым языком программирования стал Apex. Это Java-подобный язык, который автоматизирует backend-логику в приложения на платформе Salesforce.com.
Нельзя сказать, что я до этого не был знаком с ООП или другими языками. Мое знакомство ограничивалось теоретическими знаниями, полупройденными курсами на Codecademy или лабораторными работами в институте. Естественным образом все тонкости технологии, синтаксис языка, его возможности и ограничения быстро выветривались из памяти, поскольку практического применения этим навыкам я не находил.
В 2019 году я пришёл в Accenture как специалист по поддержке и доработке CRM Salesforce. Диапазон задач сначала был очерчен недостаточно чётко, поэтому я стал изучать инструменты как администрирования, так и разработки на Salesforce.
Сейчас мой опыт разработки на Apex около года, я стал сертифицированным разработчиком Salesforce. Могу подвести первые итоги.
Будет полезно для:
новичков в программировании
администраторов Salesforce, которые хотят освоить разработку
опытных разработчиков, которые хотят узнать о разработке на платформе Salesforce
Ниже я кратко приведу все плюсы и минусы Apex, с точки зрения выбора его как языка для обучения. Затем подробнее рассмотрю каждый пункт.
Плюсы Apex:
Apex приучает к написанию оптимального, ресурсоэффективного кода
Apex приучает к юнит-тестированию и к test-driven разработке
Apex имеет единую и обновляемую документацию, собранную на портале Salesforce
Apex имеет out-of-the-box доступ к БД (не нужно писать коннекторов)
Apex – это на 90% Java. Вы с легкостью сможете понимать Java-код после разработки на Apex
Salesforce поставляет собственную онлайн IDE Developer Console, которая позволяет новичку быстро начать программировать без погружения в мир кастомных IDE
Apex можно осваивать в Trailhead-песочницах, без установки и настройки дополнительного софта.
Trailhead обучает программированию на Apex с полного нуля. Trailhead-модули обучают вас концепциям ООП и синтаксису Apex на языке простых смертных (к сожалению, только на английском)
Минусы Apex:
Мало материалов на русском языке (почти нет)
Немногочисленное русскоязычное сообщество
Применимость только для продуктов на платформе Salesforce
Apex приучает к написанию оптимального, ресурсоэффективного кода
Ресурсоэффективный код в Apex – это не блажь и не рекомендация, а почти необходимое условие. Поскольку Salesforce – это облачная платформа, программные ресурсы у каждого клиента платформы ограничиваются лицензией. Иными словами, ресурсы, которые есть у вас в распоряжении, как разработчика, ограничены лимитами Salesforce.
Код, исполнение которого нарушает лимиты, приведет к системной ошибке и откату транзакции. По этой причине у Salesforce есть рекомендации, которых нужно придерживаться, чтобы писать оптимальный код.
Этот пункт я считаю плюсом Apex, поскольку вы с самого начала привыкаете писать оптимальный код, который экономно распоряжается облачными ресурсами. Это формирует полезный для разработчика способ мыслить.
Apex приучает к юнит-тестированию и к test-driven разработке
Покрытие кода юнит-тестами на 75% – обязательное условие для переноса этого кода на PROD-среду. Поэтому вы с самого начала учитесь создавать тест-классы. Это полезный навык – менять ментальный ракурс, с которого вы смотрите на свой код, таким образом, чтобы написать тест.
Salesforce в этом вопросе идет дальше и пропагандирует при разработке начинать с написания юнит-тестов. Это помогает лучше осознать все пользовательские сценарии, которые должен обрабатывать ваш будущий код. Поэтому Apex, как первый язык программирования, не оставляет вам выбора: вы сразу учитесь лучшим практикам и осознанному подходу к процессу разработки.
Пример класса и тест-класса в Apex
Класс:
public class TVRemoteControl { // Volume to be modified Integer volume; // Constant for maximum volume value static final Integer MAX_VOLUME = 50; // Constructor public TVRemoteControl(Integer v) { // Set initial value for volume volume = v; } public Integer increaseVolume(Integer amount) { volume += amount; if (volume > MAX_VOLUME) { volume = MAX_VOLUME; } return volume; } public Integer decreaseVolume(Integer amount) { volume -= amount; if (volume < 0) { volume = 0; } return volume; } public static String getMenuOptions() { return 'AUDIO SETTINGS - VIDEO SETTINGS'; } }
Тест-класс:
@isTest class TVRemoteControlTest { @isTest static void testVolumeIncrease() { TVRemoteControl rc = new TVRemoteControl(10); Integer newVolume = rc.increaseVolume(15); System.assertEquals(25, newVolume); } @isTest static void testVolumeDecrease() { TVRemoteControl rc = new TVRemoteControl(20); Integer newVolume = rc.decreaseVolume(15); System.assertEquals(5, newVolume); } @isTest static void testVolumeIncreaseOverMax() { TVRemoteControl rc = new TVRemoteControl(10); Integer newVolume = rc.increaseVolume(100); System.assertEquals(50, newVolume); } @isTest static void testVolumeDecreaseUnderMin() { TVRemoteControl rc = new TVRemoteControl(10); Integer newVolume = rc.decreaseVolume(100); System.assertEquals(0, newVolume); } @isTest static void testGetMenuOptions() { // Static method call. No need to create a class instance. String menu = TVRemoteControl.getMenuOptions(); System.assertNotEquals(null, menu); System.assertNotEquals('', menu); } }
Apex имеет единую и обновляемую документацию, собранную на портале Salesforce
Salesforce развивает Apex как основной язык для разработки на своей проприетарной платформе, поэтому все обновления и вся документация содержатся на едином официальном портале Apex Developer Guide.
На ней собраны все системные классы и методы, подробно описано их назначение и применение. Можно найти однозначный ответ на большинство вопросов. А вопросов при обучении всегда много.
Apex имеет out-of-the-box доступ к базе данных
Большим плюсом для начинающего разработчика Apex считаю простоту обращения в базу данных из кода. В базу данных можно обратиться из любого места в коде, для этого не нужно дополнительных настроек и соединений.
Вот несколько примеров обращения к базе данных из кода:
Account A = new Account(Name='xxx'); insert A; Account B; // A simple bind B = [SELECT Id FROM Account WHERE Id = :A.Id]; // A bind with arithmetic B = [SELECT Id FROM Account WHERE Name = :('x' + 'xx')]; String s = 'XXX'; // A bind with expressions B = [SELECT Id FROM Account WHERE Name = :'XXXX'.substring(0,3)]; // A bind with an expression that is itself a query result B = [SELECT Id FROM Account WHERE Name = :[SELECT Name FROM Account WHERE Id = :A.Id].Name]; Contact C = new Contact(LastName='xxx', AccountId=A.Id); insert new Contact[]{C, new Contact(LastName='yyy', accountId=A.id)}; // Binds in both the parent and aggregate queries B = [SELECT Id, (SELECT Id FROM Contacts WHERE Id = :C.Id) FROM Account WHERE Id = :A.Id]; // One contact returned Contact D = B.Contacts; // A limit bind Integer i = 1; B = [SELECT Id FROM Account LIMIT :i]; // An OFFSET bind Integer offsetVal = 10; List<Account> offsetList = [SELECT Id FROM Account OFFSET :offsetVal]; // An IN-bind with an Id list. Note that a list of sObjects // can also be used--the Ids of the objects are used for // the bind Contact[] cc = [SELECT Id FROM Contact LIMIT 2]; Task[] tt = [SELECT Id FROM Task WHERE WhoId IN :cc]; // An IN-bind with a String list String[] ss = new String[]{'a', 'b'}; Account[] aa = [SELECT Id FROM Account WHERE AccountNumber IN :ss];
Apex – это на 90% Java. Вы с легкостью сможете понимать Java-код после разработки на Apex
Salesforce создавала Apex на основе синтаксиса Java. Есть небольшие исключения, обусловленные спецификой Salesforce. Все отличия собраны на этой странице.
Но, если посмотреть на методы работы с примитивами и коллекциями, то они работают аналогично Java.
Сравните, к примеру, методы работы со String в Apex и String в Java.
Выходит, что обучаясь Apex вы во многом обучаетесь и Java. Это правило работает и наоборот.
Если вы решите перейти в Java-разработчики, вам не придется начинать с нуля. А полезные парадигмы мышления из Apex-разработки дадут вам хороший фундамент для написания ресурсоэффективного Java-кода.
Salesforce поставляет собственную онлайн IDE Developer Console
Developer Console позволяет новичку быстро начать программировать без погружения в мир кастомных IDE.
Я помню, как раньше делал попытки самостоятельно учить Python, C#. И начинать нужно было с установки IDE, ее настройки. Разобраться, как работает эта IDE – отдельная история. Много папок, много кнопок, много пунктов меню, много панелей. Это было серьёзным барьером на пути начинающего разработчика.
С Apex ничего подобного не было, поскольку любой инстанс Salesforce содержит в себе встроенную IDE, которая называется Developer Console. Устанавливать ничего не нужно, достаточно открыть в браузере Developer Console и сразу писать код. Код можно запустить сразу и проверить его работу в реальном (или «песочном») приложении.
Да, более опытные разработчики Salesforce предпочитают работать в Visual Studio Code или Eclipse, но для начинающих Developer Console – то, что нужно.
Developer Console выглядит так:
Apex можно осваивать в Trailhead-песочницах, без установки и настройки дополнительного софта
Salesforce разработал собственную платформу для обучения – trailhead.salesforce.com. Она великолепна геймификацией процесса обучения и тем, что создавать тестовые среды можно непосредственно со страницы практического задания:

В рамках обучения можно иметь одновременно до 10 (!) активных песочниц. Песочницы можно удалять и создавать новые для каждой следующей задачи, а можно работать в одной песочнице по нескольким заданиям сразу. Любая новая песочница создаётся с уже предзаполненными данными, чтобы вы могли сразу начать эксперементировать и не тратить время на заполнение тестовыми данными.
Trailhead обучает программированию на Apex с полного нуля
В Trailhead множество обучающих модулей и «троп» (последовательностей модулей). Главный плюс для начинающего в том, что для обучения программированию можно выбрать «тропу», которая предназначена для учеников с нулевым опытом или только с админским опытом. В таком случае обучение начнется с самых основ ООП, а в качестве примеров будет использоваться Apex-код.

Все модули Trailhead написаны на английском языке. Авторы модулей стараются максимально просто описывать концепции, поэтому языковой барьер быстро перестает чувствоваться.
Текст часто снабжается забавными примерами и просто шутками. Типичный пример на рисунке ниже:
В изучении Apex есть и минусы. Ниже рассмотрю их подробнее.
Мало материалов на русском языке (почти нет)
На русский язык не переведены такие официальные ресурсы, как:
Это затрудняет обучение ребятам, которые не знают английский язык.
Немногочисленное русскоязычное сообщество
Количество разработчиков из России и СНГ относительно небольшое, поэтому достаточно трудно найти блоги и обсуждение Apex на русском языке. Вот, например, как выглядят профессиональные сообщества Salesforce-специалистов ВКонтакте
Надо заметить, что в Беларуси разработка на Salesforce стремительно популяризуется. В русскоязычном Youtube появляется всё больше качественных видео про Salesforce и Apex (пример). Количество специалистов растёт, но работы всё ещё больше, чем людей.
Этот минус можно конвертировать в преимущество вас как специалиста на рынке труда. Чем меньше специалистов, тем они дороже.
Применимость только для продуктов на платформе Salesforce
В отличие от Java, Python и других кроссплатформенных языков, Apex может использоваться только для разработки на платформе Salesforce.com. Несмотря на многообразие продуктов Salesforce, вы ограничены этим стеком.
Заключение
Apex прекрасно подходит для обучения программированию. Правила и рекомендации Salesforce с самого начала научат вас лучшим практикам ООП, которые применимы к коду на любом другом языке.
Однако, лучше посмотреть в сторону других языков для старта, если:
Вы не планируете профессионально развиваться в качестве специалиста Salesforce;
Вы плохо владеете английским языком. Это затруднит вам изучение любого языка программирования, но Apex - в особенности.
