Вопросы на собеседовании: Salesforce-разработчик
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Разработчик платформы.
Смотреть пример резюме: Salesforce-разработчик →Тренировка флешкарточками
Интервальное повторение · Hunter Pass
Вопросы
Я использую один тонкий триггер, который передает контексты упорядоченным обработчикам.
- В триггере нет SOQL, DML и бизнес-правил, он только передает коллекции.
- Обработчики объявляют нужные контексты, поэтому логика вставки не запустится при удалении.
- Единый реестр явно задает порядок проверки, обогащения и асинхронной работы.
Зачем это спрашивают: Интервьюер проверяет, дает ли каркас предсказуемость без лишней абстракции.
Я рассматриваю каждую запись и побочный эффект во всем порядке выполнения.
- Flow до сохранения меняет ту же запись, а Apex отвечает за сложную работу с коллекциями.
- В after-триггере ID уже есть, но значения еще не окончательны: последующий Flow после сохранения или другая автоматизация могут их изменить.
- Работа, которой нужно итоговое сохраненное состояние, запускается после фиксации и заново читает запись, а повторные циклы остаются идемпотентными.
Зачем это спрашивают: Интервьюер проверяет практическое понимание автоматизаций в общей транзакции.
Я защищаю конкретную операцию и запись, а не всю транзакцию одним флагом.
- Set обработанных ID или ключей операций блокирует только повторный побочный эффект.
- Сравнение старых и новых значений убирает работу, если нужное состояние не изменилось.
- Следующая порция триггера или другая операция при этом продолжает выполняться.
Зачем это спрашивают: Интервьюер ищет более безопасный подход, чем один статический флаг на транзакцию.
Он считает Trigger.new единицей работы и контролирует запросы, DML, процессор и память.
- Множества собирают ключи связей перед одним запросом с условием IN.
- Карты заменяют вложенные проходы, а каждое логически единое обновление выполняется одним DML-вызовом над коллекцией.
- Запросы выбирают нужные поля, а стоимость алгоритма растет почти линейно.
Зачем это спрашивают: Интервьюер проверяет форму данных и стоимость алгоритма, а не только расположение запросов.
Сравнение превращает событие сохранения в значимый переход состояния.
- Уведомление идет при смене Status на Approved, а не при каждом постороннем изменении.
- Один предикат работает и для одной записи, и для массового пути.
- Меньше лишних запросов, записей и событий также снижает риск рекурсии.
Зачем это спрашивают: Интервьюер проверяет, реагирует ли автоматизация на смысл изменения, а не на любое сохранение.
Domain-класс отвечает за инварианты и поведение одного типа объекта.
- Методы контекста триггера работают с текущим набором записей.
- Проверка и изменение состояния того же объекта подходят этой границе.
- Сценарий между несколькими объектами остается в Service-классе.
Зачем это спрашивают: Интервьюер оценивает, умеет ли кандидат провести полезную границу объекта.
Service отвечает за законченный сценарий между несколькими объектами и границами.
- Триггеры, LWC-контроллеры и REST-ресурсы могут вызвать одну операцию.
- Открытый метод выражает цель транзакции, а не детали интерфейса.
- Инварианты остаются в Domain, а запросы в Selector.
Зачем это спрашивают: Интервьюер проверяет, является ли Service границей сценария, а не складом утилит.
Selector централизует узкие формы запросов за методами с бизнес-названиями.
- Вызывающий код одинаково использует наборы полей и переходы по связям.
- В тесте селектор заменяется через интерфейс.
- Я не делаю универсальный метод, который всегда загружает лишние поля.
Зачем это спрашивают: Интервьюер проверяет и переиспользование, и понимание цены абстракции.
Я регистрирую записи и связи, затем явно фиксирую их на границе сервиса.
- Он группирует DML и разрешает связи после получения ID родителя.
- Все записи следуют одной видимой политике порядка.
- Я не смешиваю зарегистрированную работу и прямой DML в одном сценарии.
Зачем это спрашивают: Интервьюер ожидает управляемой координации DML, а не паттерна ради паттерна.
Я передаю интерфейсы селекторов и шлюзов вместо создания реализаций внутри методов.
- Тестовая заглушка возвращает точные записи без SOQL.
- Подменный шлюз моделирует успех, тайм-аут и неверный ответ без внешнего вызова.
- В рабочей среде фабрика создает реальные зависимости вне бизнес-логики.
Зачем это спрашивают: Интервьюер проверяет, можно ли изолировать бизнес-логику от границ платформы.
Сохранение, синхронная автоматизация и ее DML обычно входят в одну транзакцию.
- Необработанное исключение откатывает ранние изменения базы в этой транзакции.
- Задача из очереди позже начинает свою транзакцию с новыми лимитами.
- Ее внешний эффект нельзя сделать атомарным с исходным сохранением.
Зачем это спрашивают: Интервьюер проверяет точное понимание отката и асинхронных границ.
Я использую точку сохранения для отката известной группы синхронных DML после обрабатываемой ошибки.
- Откат восстанавливает состояние базы после этой точки.
- Он не отменяет HTTP-эффект, уже принятый внешней системой.
- Я держу участок небольшим и все равно возвращаю понятный результат ошибки.
Зачем это спрашивают: Интервьюер проверяет, не принимают ли точку сохранения за распределенную транзакцию.
Методы Database с allOrNone равным false возвращают результат на каждую входную запись.
- Каждый SaveResult сопоставляется с исходной записью.
- Сообщения и поля ошибок сохраняются или возвращаются вызывающей стороне.
- Дальнейшая работа использует только успешные ID, потому что ошибочные строки не записаны.
Зачем это спрашивают: Интервьюер проверяет явную обработку результатов, а не только флаг.
Я следую бизнес-инварианту, а не удобству реализации.
- Коммерческое предложение и его строки откатываются вместе, чтобы документ не был неполным.
- Независимые контакты могут сохраниться по отдельности.
- Импортер сохраняет ключ каждой исходной строки, сопоставляет его с соответствующим SaveResult и позволяет безопасно повторить ошибки.
Зачем это спрашивают: Интервьюер проверяет соответствие свойств транзакции бизнес-сценарию.
Избирательный фильтр позволяет индексу сузить набор строк вместо просмотра большинства данных.
- Подходят ID, ключи связей, внешние ID и уместные индексированные поля.
- Широкие отрицательные условия и значения с малым разнообразием часто дороги.
- Сочетание условий я подтверждаю через Query Plan на похожих данных.
Зачем это спрашивают: Интервьюер проверяет понимание оптимизатора без заученных порогов.
Я сравниваю ведущую операцию, ожидаемое число строк и относительную стоимость.
- Узкий индексный план обычно лучше полного просмотра.
- Индекс со слабо различающимися значениями все равно может дать плохой план.
- После изменения фильтров я снова проверяю план на похожих данных.
Зачем это спрашивают: Интервьюер проверяет, служит ли Query Plan основанием для точечного изменения.
Я перехожу к родителю, когда каждой дочерней записи нужен небольшой набор его полей.
- Это убирает второй запрос и ручное соединение через карту.
- Выбираются только нужные поля родителя.
- Отдельные запросы яснее, когда фильтры или граф связей расходятся.
Зачем это спрашивают: Интервьюер проверяет решение о форме запроса, а не знание синтаксиса.
Я использую его, когда родитель и ограниченный набор дочерних записей обрабатываются вместе.
- В дочернем подзапросе фильтруются и сортируются только нужные открытые записи.
- Результат сервиса совпадает с формой данных интерфейса.
- Непредсказуемый объем дочерних записей запрашивается отдельно и группируется по ID родителя.
Зачем это спрашивают: Интервьюер проверяет, влияет ли число дочерних записей на дизайн.
Они фильтруют родителей по наличию или отсутствию дочерних записей без их загрузки.
- Полусоединение находит организации с открытыми сделками.
- Антисоединение находит организации без активных контактов.
- Детали дочерних записей запрашиваются отдельно только при необходимости.
Зачем это спрашивают: Интервьюер проверяет фильтрацию по связям, сокращающую объем данных.
Я разрешаю идентификаторы только по списку и связываю все значения данных.
- Имена полей и направления сортировки берутся из известных соответствий.
- Пользовательский текст связывается, а не склеивается с запросом даже после экранирования.
- Неизвестные 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