Моим первым языком программирования стал Apex. Это Java-подобный язык, который автоматизирует backend-логику в приложения на платформе Salesforce.com

Нельзя сказать, что я до этого не был знаком с ООП или другими языками. Мое знакомство ограничивалось теоретическими знаниями, полупройденными курсами на Codecademy или лабораторными работами в институте. Естественным образом все тонкости технологии, синтаксис языка, его возможности и ограничения быстро выветривались из памяти, поскольку практического применения этим навыкам я не находил. 

 В 2019 году я пришёл в Accenture как специалист по поддержке и доработке CRM Salesforce. Диапазон задач сначала был очерчен недостаточно чётко, поэтому я стал изучать инструменты как администрирования, так и разработки на Salesforce. 

Сейчас мой опыт разработки на Apex около года, я стал сертифицированным разработчиком Salesforce. Могу подвести первые итоги. 

Будет полезно для:

  • новичков в программировании

  • администраторов Salesforce, которые хотят освоить разработку

  • опытных разработчиков, которые хотят узнать о разработке на платформе Salesforce

Ниже я кратко приведу все плюсы и минусы Apex, с точки зрения выбора его как языка для обучения. Затем подробнее рассмотрю каждый пункт.

Плюсы Apex: 

  1. Apex приучает к написанию оптимального, ресурсоэффективного кода 

  2. Apex приучает к юнит-тестированию и к test-driven разработке 

  3. Apex имеет единую и обновляемую документацию, собранную на портале Salesforce 

  4. Apex имеет out-of-the-box доступ к БД (не нужно писать коннекторов) 

  5. Apex – это на 90% Java. Вы с легкостью сможете понимать Java-код после разработки на Apex 

  6. Salesforce поставляет собственную онлайн IDE Developer Console, которая позволяет новичку быстро начать программировать без погружения в мир кастомных IDE 

  7. Apex можно осваивать в Trailhead-песочницах, без установки и настройки дополнительного софта.  

  8. Trailhead обучает программированию на Apex с полного нуля. Trailhead-модули обучают вас концепциям ООП и синтаксису Apex на языке простых смертных (к сожалению, только на английском) 

Минусы Apex: 

  1. Мало материалов на русском языке (почти нет) 

  2. Немногочисленное русскоязычное сообщество 

  3. Применимость только для продуктов на платформе 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-код. 

Примеры обучающих модулей по разработке на Apex для администраторов
Примеры обучающих модулей по разработке на Apex для администраторов

Все модули Trailhead написаны на английском языке. Авторы модулей стараются максимально просто описывать концепции, поэтому языковой барьер быстро перестает чувствоваться.  

Текст часто снабжается забавными примерами и просто шутками. Типичный пример на рисунке ниже: 

В изучении Apex есть и минусы. Ниже рассмотрю их подробнее.

Мало материалов на русском языке (почти нет)

На русский язык не переведены такие официальные ресурсы, как: 

  1. Trailhead

  2. Apex Developer Guide

Это затрудняет обучение ребятам, которые не знают английский язык. 

Немногочисленное русскоязычное сообщество

Количество разработчиков из России и СНГ относительно небольшое, поэтому достаточно трудно найти блоги и обсуждение Apex на русском языке. Вот, например, как выглядят профессиональные сообщества Salesforce-специалистов ВКонтакте 

Надо заметить, что в Беларуси разработка на Salesforce стремительно популяризуется. В русскоязычном Youtube появляется всё больше качественных видео про Salesforce и Apex (пример). Количество специалистов растёт, но работы всё ещё больше, чем людей. 

Этот минус можно конвертировать в преимущество вас как специалиста на рынке труда. Чем меньше специалистов, тем они дороже. 

Применимость только для продуктов на платформе Salesforce

В отличие от Java, Python и других кроссплатформенных языков, Apex может использоваться только для разработки на платформе Salesforce.com. Несмотря на многообразие продуктов Salesforce, вы ограничены этим стеком. 

Заключение

Apex прекрасно подходит для обучения программированию. Правила и рекомендации Salesforce с самого начала научат вас лучшим практикам ООП, которые применимы к коду на любом другом языке.  

Однако, лучше посмотреть в сторону других языков для старта, если: 

  • Вы не планируете профессионально развиваться в качестве специалиста Salesforce; 

  • Вы плохо владеете английским языком. Это затруднит вам изучение любого языка программирования, но Apex - в особенности.