Skip to content

Вопросы на собеседовании: Salesforce-разработчик

100 реальных вопросов с образцовыми ответами и пояснениями для уровня Разработчик платформы.

Смотреть пример резюме: Salesforce-разработчик

Тренировка флешкарточками

Интервальное повторение · Hunter Pass

Вопросы

triggers

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

  • В триггере нет SOQL, DML и бизнес-правил, он только передает коллекции.
  • Обработчики объявляют нужные контексты, поэтому логика вставки не запустится при удалении.
  • Единый реестр явно задает порядок проверки, обогащения и асинхронной работы.

Зачем это спрашивают: Интервьюер проверяет, дает ли каркас предсказуемость без лишней абстракции.

designtriggersautomation

Я рассматриваю каждую запись и побочный эффект во всем порядке выполнения.

  • Flow до сохранения меняет ту же запись, а Apex отвечает за сложную работу с коллекциями.
  • В after-триггере ID уже есть, но значения еще не окончательны: последующий Flow после сохранения или другая автоматизация могут их изменить.
  • Работа, которой нужно итоговое сохраненное состояние, запускается после фиксации и заново читает запись, а повторные циклы остаются идемпотентными.

Зачем это спрашивают: Интервьюер проверяет практическое понимание автоматизаций в общей транзакции.

transactionsrecursion

Я защищаю конкретную операцию и запись, а не всю транзакцию одним флагом.

  • Set обработанных ID или ключей операций блокирует только повторный побочный эффект.
  • Сравнение старых и новых значений убирает работу, если нужное состояние не изменилось.
  • Следующая порция триггера или другая операция при этом продолжает выполняться.

Зачем это спрашивают: Интервьюер ищет более безопасный подход, чем один статический флаг на транзакцию.

queriestriggers

Он считает Trigger.new единицей работы и контролирует запросы, DML, процессор и память.

  • Множества собирают ключи связей перед одним запросом с условием IN.
  • Карты заменяют вложенные проходы, а каждое логически единое обновление выполняется одним DML-вызовом над коллекцией.
  • Запросы выбирают нужные поля, а стоимость алгоритма растет почти линейно.

Зачем это спрашивают: Интервьюер проверяет форму данных и стоимость алгоритма, а не только расположение запросов.

triggers

Сравнение превращает событие сохранения в значимый переход состояния.

  • Уведомление идет при смене Status на Approved, а не при каждом постороннем изменении.
  • Один предикат работает и для одной записи, и для массового пути.
  • Меньше лишних запросов, записей и событий также снижает риск рекурсии.

Зачем это спрашивают: Интервьюер проверяет, реагирует ли автоматизация на смысл изменения, а не на любое сохранение.

apex

Domain-класс отвечает за инварианты и поведение одного типа объекта.

  • Методы контекста триггера работают с текущим набором записей.
  • Проверка и изменение состояния того же объекта подходят этой границе.
  • Сценарий между несколькими объектами остается в Service-классе.

Зачем это спрашивают: Интервьюер оценивает, умеет ли кандидат провести полезную границу объекта.

Service отвечает за законченный сценарий между несколькими объектами и границами.

  • Триггеры, LWC-контроллеры и REST-ресурсы могут вызвать одну операцию.
  • Открытый метод выражает цель транзакции, а не детали интерфейса.
  • Инварианты остаются в Domain, а запросы в Selector.

Зачем это спрашивают: Интервьюер проверяет, является ли Service границей сценария, а не складом утилит.

queries

Selector централизует узкие формы запросов за методами с бизнес-названиями.

  • Вызывающий код одинаково использует наборы полей и переходы по связям.
  • В тесте селектор заменяется через интерфейс.
  • Я не делаю универсальный метод, который всегда загружает лишние поля.

Зачем это спрашивают: Интервьюер проверяет и переиспользование, и понимание цены абстракции.

transactions

Я регистрирую записи и связи, затем явно фиксирую их на границе сервиса.

  • Он группирует DML и разрешает связи после получения ID родителя.
  • Все записи следуют одной видимой политике порядка.
  • Я не смешиваю зарегистрированную работу и прямой DML в одном сценарии.

Зачем это спрашивают: Интервьюер ожидает управляемой координации DML, а не паттерна ради паттерна.

injectiondependenciestesting

Я передаю интерфейсы селекторов и шлюзов вместо создания реализаций внутри методов.

  • Тестовая заглушка возвращает точные записи без SOQL.
  • Подменный шлюз моделирует успех, тайм-аут и неверный ответ без внешнего вызова.
  • В рабочей среде фабрика создает реальные зависимости вне бизнес-логики.

Зачем это спрашивают: Интервьюер проверяет, можно ли изолировать бизнес-логику от границ платформы.

transactionsapex

Сохранение, синхронная автоматизация и ее DML обычно входят в одну транзакцию.

  • Необработанное исключение откатывает ранние изменения базы в этой транзакции.
  • Задача из очереди позже начинает свою транзакцию с новыми лимитами.
  • Ее внешний эффект нельзя сделать атомарным с исходным сохранением.

Зачем это спрашивают: Интервьюер проверяет точное понимание отката и асинхронных границ.

Я использую точку сохранения для отката известной группы синхронных DML после обрабатываемой ошибки.

  • Откат восстанавливает состояние базы после этой точки.
  • Он не отменяет HTTP-эффект, уже принятый внешней системой.
  • Я держу участок небольшим и все равно возвращаю понятный результат ошибки.

Зачем это спрашивают: Интервьюер проверяет, не принимают ли точку сохранения за распределенную транзакцию.

databasedata-model

Методы Database с allOrNone равным false возвращают результат на каждую входную запись.

  • Каждый SaveResult сопоставляется с исходной записью.
  • Сообщения и поля ошибок сохраняются или возвращаются вызывающей стороне.
  • Дальнейшая работа использует только успешные ID, потому что ошибочные строки не записаны.

Зачем это спрашивают: Интервьюер проверяет явную обработку результатов, а не только флаг.

data-modelconcurrency

Я следую бизнес-инварианту, а не удобству реализации.

  • Коммерческое предложение и его строки откатываются вместе, чтобы документ не был неполным.
  • Независимые контакты могут сохраниться по отдельности.
  • Импортер сохраняет ключ каждой исходной строки, сопоставляет его с соответствующим SaveResult и позволяет безопасно повторить ошибки.

Зачем это спрашивают: Интервьюер проверяет соответствие свойств транзакции бизнес-сценарию.

queries

Избирательный фильтр позволяет индексу сузить набор строк вместо просмотра большинства данных.

  • Подходят ID, ключи связей, внешние ID и уместные индексированные поля.
  • Широкие отрицательные условия и значения с малым разнообразием часто дороги.
  • Сочетание условий я подтверждаю через Query Plan на похожих данных.

Зачем это спрашивают: Интервьюер проверяет понимание оптимизатора без заученных порогов.

queries

Я сравниваю ведущую операцию, ожидаемое число строк и относительную стоимость.

  • Узкий индексный план обычно лучше полного просмотра.
  • Индекс со слабо различающимися значениями все равно может дать плохой план.
  • После изменения фильтров я снова проверяю план на похожих данных.

Зачем это спрашивают: Интервьюер проверяет, служит ли Query Plan основанием для точечного изменения.

queries

Я перехожу к родителю, когда каждой дочерней записи нужен небольшой набор его полей.

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

Зачем это спрашивают: Интервьюер проверяет решение о форме запроса, а не знание синтаксиса.

subqueries

Я использую его, когда родитель и ограниченный набор дочерних записей обрабатываются вместе.

  • В дочернем подзапросе фильтруются и сортируются только нужные открытые записи.
  • Результат сервиса совпадает с формой данных интерфейса.
  • Непредсказуемый объем дочерних записей запрашивается отдельно и группируется по ID родителя.

Зачем это спрашивают: Интервьюер проверяет, влияет ли число дочерних записей на дизайн.

joinsqueries

Они фильтруют родителей по наличию или отсутствию дочерних записей без их загрузки.

  • Полусоединение находит организации с открытыми сделками.
  • Антисоединение находит организации без активных контактов.
  • Детали дочерних записей запрашиваются отдельно только при необходимости.

Зачем это спрашивают: Интервьюер проверяет фильтрацию по связям, сокращающую объем данных.

queriesinjection

Я разрешаю идентификаторы только по списку и связываю все значения данных.

  • Имена полей и направления сортировки берутся из известных соответствий.
  • Пользовательский текст связывается, а не склеивается с запросом даже после экранирования.
  • Неизвестные API-имена отклоняются до сборки запроса.

Зачем это спрашивают: Интервьюер проверяет, различает ли кандидат значения и идентификаторы.

Закрытые вопросы

  • 21

    Что такое перекос данных и как он влияет на локальный дизайн?

    design
  • 22

    Чем Future и Queueable Apex отличаются при выборе дизайна?

    designasync-apexdata-structures
  • 23

    Когда Batch Apex лучше Queueable Apex?

    batchasync-apexdata-structures
  • 24

    Какую роль должен играть Schedulable Apex?

    apex
  • 25

    Как QueryLocator и размер порции влияют на Batch Apex?

    batchasync-apexqueries
  • 26

    Когда оправдан Database.Stateful?

    database
  • 27

    Какие границы транзакций важны в цепочке Queueable?

    transactionsdata-structuresasync-apex
  • 28

    Как сочетать внешние вызовы и DML в асинхронном Apex?

    asyncapexdata-model
  • 29

    Что режим публикации Platform Event означает для транзакции?

    designeventstransactions
  • 30

    Как подписчику Platform Event использовать данные повторного воспроизведения?

    events
  • 31

    Когда выбрать CDC вместо собственного Platform Event?

    events
  • 32

    Как решить, должна ли автоматизация быть во Flow или Apex?

    automationapex
  • 33

    Как не допустить повторных побочных эффектов между Flow и Apex?

    automationapex
  • 34

    В чем практическая разница между with, without и inherited sharing?

    ownership
  • 35

    Почему соблюдения правил доступа к записям недостаточно для Apex-метода?

    endpointsapex
  • 36

    Когда использовать WITH USER_MODE или AccessLevel.USER_MODE?

  • 37

    Когда подходит Security.stripInaccessible?

  • 38

    Что означает cacheable=true для Apex-метода в wire?

    cachingapex
  • 39

    Как выбрать между Lightning Data Service и собственным Apex?

    lightningapex
  • 40

    Как использовать refreshApex после императивного изменения?

  • 41

    Как чисто организовать связь вложенных LWC?

    communication
  • 42

    Когда Lightning Message Service лучше DOM-событий?

    domlightning
  • 43

    Как хуки жизненного цикла LWC влияют на отрисовку?

    hookslightningperformance
  • 44

    Что должен проверять полезный Jest-тест LWC?

    lightningjest
  • 45

    Как Named Credentials и External Credentials разделяют обязанности?

    credentials
  • 46

    Как выбрать между REST, SOAP, Composite и Bulk API 2.0?

    restbulk-api
  • 47

    Как OAuth, правила транзакций, повторы и идемпотентность влияют на внешний вызов?

    oauthidempotencytransactions
  • 48

    Когда Custom Metadata Types подходят для конфигурации?

    metadataconfig
  • 49

    Как сочетаются фабрики, заглушки, runAs и тесты асинхронной работы?

    mockingasync
  • 50

    Как Salesforce DX, scratch org, unlocked package и проверка развертывания входят в процесс?

    deploymentscratch-orgsvalidation
  • 51

    После изменения Flow одно действие after update для Opportunity выполняется дважды. Как найти причину?

    automation
  • 52

    Статический флаг работает для 200 записей, но пропускает вторую порцию триггера в той же транзакции. Что изменить?

    transactionstriggers
  • 53

    Database.update с частичным успехом вернул 7 ошибок на 120 строк. Как должен ответить сервис?

    database
  • 54

    Код ставит точку сохранения, вставляет аудит, затем пытается сделать HTTP-вызов и падает. Как изменить дизайн?

    http
  • 55

    Запрос списка стал неизбирательным после роста Case до 600 000 записей. Что проверить сначала?

    queries
  • 56

    Query Plan все равно выбирает полный просмотр после добавления индексированного флага. Почему?

    indexesqueries
  • 57

    Две задачи обновляют контакты одних организаций и иногда получают UNABLE_TO_LOCK_ROW. Что изменить?

  • 58

    Один интеграционный пользователь владеет 300 000 активно обновляемых записей, и сохранения замедлились. Какова гипотеза?

    hypothesis-testing
  • 59

    Третья Queueable-задача в цепочке из пяти не запустилась, а первые две уже сохранились. Как восстановиться?

    async-apexdata-structures
  • 60

    Внешний вызов Queueable исчерпал обычные повторы. Что добавит Transaction Finalizer?

    transactionsdata-structuresasync-apex
  • 61

    Batch с порцией 200 превышает время из-за дорогого расчета цены для каждой записи. Что настроить?

    pricingbatch
  • 62

    Database.Stateful Batch показывает неверные итоги после повтора. Как сделать отчет надежным?

    resiliencebatchdatabase
  • 63

    Ночные задачи задерживают пользовательские Queueable на несколько часов. Как работать с общей асинхронной емкостью?

    capacitytriggersasync-apex
  • 64

    Потребитель Platform Event создает дубли заказов после переподключения. Как исправить?

    events
  • 65

    Подписчик был выключен дольше окна повторного воспроизведения Platform Event. Как закрыть разрыв?

    events
  • 66

    Один подписчик Platform Event падает на неверных сообщениях, и очередь растет. Как изолировать ошибку?

    backlogevents
  • 67

    Потребитель CDC записывает обогащение в ту же запись и создает цикл. Как его остановить?

    feedback
  • 68

    Flow до сохранения и before-триггер задают разные Discount__c. Как устранить конфликт?

    triggersautomation
  • 69

    Записи доступа к Project__c, созданные в Apex, исчезают после смены владельца. Как сделать их устойчивыми?

    ownershipapex
  • 70

    После обновления схемы OpenAPI действие External Services исчезло из Flow. Как безопасно восстановить его?

    schemaopenapiautomation
  • 71

    DML в пользовательском режиме начал падать после изменения набора разрешений. Как реагировать сервису?

    data-model
  • 72

    LWC на lightning-record-edit-form остается в состоянии сохранения после того, как серверное правило проверки отклоняет сохранение. Что изменить?

    formslightningvalidation
  • 73

    LWC попадает в цикл перерисовки после изменения реактивного свойства в renderedCallback. Как исправить?

    reactlightning
  • 74

    Ценовое правило Salesforce CPQ работает в Product Configurator, но не после изменения количества в Quote Line Editor. Что проверить?

    cpqconfigsalesforce
  • 75

    LWC в рабочей области получает каждое LMS-сообщение дважды после повторного открытия вкладки. Где утечка?

    lightning
  • 76

    refreshApex завершился, но интерфейс не изменился. Какую частую ошибку искать?

    ownership
  • 77

    Jest-тест проверяет DOM раньше, чем промис императивного Apex обновит его. Как стабилизировать тест?

    promisesapexjest
  • 78

    Jest-тест wire проходит отдельно, но падает после другого теста. Что проверить в изоляции?

    jest
  • 79

    Внешний REST API возвращает 429 при всплеске из 80 обновлений. Как безопасно повторять?

    restresilience
  • 80

    POST завершился тайм-аутом, но внешний сервис мог создать ресурс. Что делать дальше?

  • 81

    Вызов через Named Credential начал возвращать 401 после изменения учетных данных. Как диагностировать?

    credentials
  • 82

    Страница Visualforce приближается к лимиту view state в 170 КБ и медленно обрабатывает отправку формы. Как найти и уменьшить нагрузку?

    visualforce
  • 83

    Composite API вернул успешный HTTP-статус, но два подзапроса завершились ошибкой. Как обработать?

    httpcomposite-apisoft-skills
  • 84

    Загрузка Bulk API 2.0 завершилась с ошибочными строками. Как восстановиться?

    bulk-apiautomation
  • 85

    Функция работает в одной песочнице, но после развертывания маршрутизация пуста. Используется Custom Metadata. Что проверить?

    deploymentmetadata
  • 86

    Сервис выбирает ветку по Custom Permission, но тесты покрывают только разрешенный путь. Как проверить оба пути?

    testing
  • 87

    Общая фабрика тестов создает одинаковые внешние ID в параллельных тестах. Что изменить?

    testing
  • 88

    Тест с System.runAs утверждает, что FLS соблюдается, но рабочий код показывает поле. Что не так?

    system-design
  • 89

    Тест Platform Event успешно публикует событие, но проверки не видят изменений подписчика. Чего не хватает?

    events
  • 90

    Версия unlocked package падает из-за ссылки на метаданные вне графа зависимостей. Что делать?

    componentsdependenciesmetadata
  • 91

    Компонент unlocked package срочно исправили прямым развертыванием исходников, а следующее обновление пакета убрало исправление. Как не допустить расхождения?

    deploymentiaccomponents
  • 92

    Триггер превышает процессорное время при массовом импорте, хотя SOQL в цикле нет. Что проверить?

    queriestriggers
  • 93

    При массовом импорте Flow вызывает Apex, но invocable-действие обрабатывает только первый запрос. Как изменить дизайн?

    triggersautomationflow
  • 94

    Подписчик Platform Event иногда не находит только что созданную запись. Какую настройку публикации проверить?

    queriesevents
  • 95

    Интеграция CDC обрабатывает много неважных изменений и отстает. Как сократить работу?

    concurrency
  • 96

    Два быстрых изменения фильтра в LWC показывают результат старого запроса. Как исправить гонку?

    lightning
  • 97

    SOAP-интеграция возвращает бизнес-ошибку внутри HTTP-ответа. Как ее классифицировать?

    http
  • 98

    OAuth проходит успешно, но внешний API возвращает 403 для одного метода. Что проверить?

    oauthendpointsapi
  • 99

    Scratch org показывает конфликт исходников после изменения того же Flow коллегой. Как решить безопасно?

    automationscratch-orgs
  • 100

    Развертывание удаляет Apex-класс, на который еще ссылается Flow. Как спланировать удаление?

    automationdeploymentapex