Моим первым языком программирования стал 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 - в особенности.
DrRaznomazov
Из статьи складывается впечтатление, что Apex это язык для обучения программированию. Но ведь это же не так?
eosadchenko Автор
Apex — это язык для разработки логики на платформе CRM Salesforce. Но экосистема обучения Apex выстроена так, что язык легко осваивать.