Technology Evaluation and Vendor Management Questions
Selecting and integrating third-party technology: evaluating tools and platforms, vendor and technology assessment, procurement, and managing implementation and integration projects. Covers structured buy-versus-build and vendor-selection reasoning and running the resulting implementation.
A build-vs-buy decision: evaluate trade-offs for modernizing ETL by building an in-house pipeline versus adopting a vendor-managed pipeline for a mid-size company with 50 analysts, variable workloads, and limited DevOps. Provide criteria, cost/time risks, operational impacts, and a recommended approach with migration considerations.
Sample Answer
Framework: evaluate against business needs (time-to-value, reliability, scalability, cost, control/flexibility, security/compliance, analyst productivity, operational burden).
Criteria & trade-offs
- Time-to-value: Vendor — fast onboarding, templates/connectors; Build — longer dev cycle.
- Total cost of ownership (TCO): Vendor — predictable subscription + data egress; Build — upfront engineering, ongoing maintenance, cloud infra, on-call costs. For mid-size firm, vendor often lower 3–5 year TCO if DevOps is limited.
- Flexibility & control: Build — full control for custom transforms and low-latency needs; Vendor — limited by product capabilities or vendor roadmap.
- Reliability & SLAs: Vendor — built-in retries, monitoring, support; Build — requires investment in observability and runbooks.
- Security & compliance: Vendor — needs review (encryption, data residency). Build — easier to enforce bespoke policies but costs more.
- Analyst productivity: Vendor — self-serve ELT, cataloging, lineage improves analysts’ speed; Build — analysts rely on engineers for changes.
Cost/time risks
- Hidden integration effort, connector maintenance, schema drift handling
- Underestimating ongoing engineering (bug fixes, scaling)
- Vendor lock-in and migration cost later
- License vs cloud compute spikes with variable workloads
Operational impacts
- Vendor reduces DevOps load, faster feature delivery, better monitoring out-of-the-box
- Build increases headcount/skill needs, longer lead times for new sources, higher on-call burden
Recommended approach (for BI Analyst at a mid-size company with limited DevOps)
- Adopt a vendor-managed ETL/ELT platform for near-term (12–24 months) to rapidly improve analyst productivity and reduce operational risk.
- Select vendor with strong connectors, transformation SQL/DB-native support, data lineage, role-based access, and clear SLAs. Pilot with high-value sources and dashboards.
Migration considerations
- Inventory sources, schemas, and downstream reports; prioritize by business impact.
- Start with an incremental pilot: replicate one business domain end-to-end, validate data quality and latency, and measure analyst time savings.
- Maintain parallel runs (dual-writing) for 2–4 weeks before cutover; implement automated data tests (dbt or vendor-integrated tests).
- Plan for exportable transformations (avoid proprietary logic) and document pipelines to reduce lock-in.
- Define rollback, monitoring, alerting, and ownership (who triages failures).
- Reassess after pilot: if vendor gaps appear for custom needs, consider hybrid model (vendor for standard pipelines + small in-house for edge cases).
Create a test plan to validate the accuracy of migrated KPIs and dashboards before go-live. Include test categories (unit, integration, regression, user acceptance), example test cases for metric reconciliation, acceptance criteria, sample test data strategies, responsibilities, and ideas for automating these tests for frequent deployments.
Sample Answer
Overview: This test plan validates KPI and dashboard accuracy after migration (ETL, semantic layer, BI tool) before go-live. It covers unit, integration, regression, and UAT, with reconciliation test cases, acceptance criteria, test data approaches, responsibilities, and automation ideas for frequent deployments.
Test categories & focus
- Unit tests: validate ETL transformations, aggregation logic, date handling, filters at component level.
- Integration tests: end-to-end data flow (source → staging → warehouse → semantic layer → dashboard).
- Regression tests: compare critical KPIs/dashboards to baseline after changes.
- User Acceptance Testing (UAT): business sign-off on semantics, visuals, drill paths, and edge cases.
Example test cases (metric reconciliation)
- Row-count parity: compare source transactional rows vs. loaded rows after filtering. Acceptance: counts match expected business filters (±0%).
- Sum/aggregation check: for Sales Amount, compute SUM(sales) in source and compare to warehouse and dashboard aggregated value. Acceptance: values identical or within agreed rounding tolerance (e.g., 0.01%).
- Group-by reconciliation: compare top-N by region in source vs. BI. Acceptance: top 10 lists identical.
- Temporal alignment: monthly totals in source (based on transaction_date) match dashboard time buckets. Acceptance: same totals and periods.
- Null/late-arriving handling: verify NULLs, late events handled per spec. Acceptance: flagged rows count equals expectation.
- Filter/drill validation: applying region filter yields same subset as source query. Acceptance: subset matches.
Acceptance criteria (global)
- Critical KPIs match source/warehouse within tolerance defined per metric (usually 0% for monetary sums; up to 0.1% for floating aggregations).
- Visuals render correctly (labels, units, date granularity).
- Performance: dashboards load within SLA (e.g., <5s for executive pages).
- No data loss for last 90 days (or defined window).
- Business owners sign UAT checklist.
Sample test data strategies
- Synthetic data: generate controlled transactions to verify transformations (edge cases: zero amounts, negative refunds, out-of-range dates).
- Snapshot baseline: take pre-migration snapshots of source and warehouse for regression comparison.
- Masked production-like data: anonymize production extracts to validate scale and distributions.
- Time-window slices: test historical, incremental, and backfill scenarios.
Responsibilities
- BI Analyst: define KPI specs, create test cases, perform dashboard-level reconciliation, lead UAT with stakeholders.
- Data Engineer: unit & integration tests for ETL, provide test extracts, implement fixes.
- QA/Data QA: run reconciliation suites, automate comparisons, report defects.
- Product/Business Owner: review UAT results, approve acceptance.
- Release Manager: coordinate deployments and test runs.
Automation ideas for frequent deployments
- Create SQL-based reconciliation scripts that produce diff reports (row counts, sums, group-by) and fail CI when thresholds exceeded.
- Store baseline snapshots in a test schema and run automated comparisons in CI (e.g., GitLab CI, Jenkins) post-deploy to dev/staging.
- Use dbt tests for data quality (uniqueness, not_null, accepted_range) and custom assertions for KPI thresholds.
- Integrate BI tool APIs (Tableau/Power BI) to extract rendered values for automated UI checks (or use headless browsers for visual tests).
- Schedule nightly regression runs and alert on anomalies; store results in dashboard for test health tracking.
- Use parameterized test data factories to run edge-case scenarios in automation.
Reporting & exit criteria
- Generate a reconciliation report summarizing all test cases, diffs, and signatures.
- Exit to go-live only when all critical KPI tests pass, UAT signed off, and open defects are non-blocking with mitigation.
This plan balances technical validation and business acceptance while enabling repeatable automated checks for ongoing deployments.
Design a disaster recovery plan for a multi-region BI platform with an RPO of 15 minutes and RTO of 1 hour. Include data replication strategies, failover orchestration, DNS/user routing, consistency guarantees, cost trade-offs, and how to test DR readiness periodically without impacting production analytics users.
Sample Answer
Requirements & constraints:
- RPO = 15 min (max data loss), RTO = 1 hr (full BI platform operational for users)
- Multi-region reads; primary region is active, secondary region(s) for DR
- Minimize user disruption to dashboards and scheduled reports
High-level design:
- Active-primary region (A) with read-replicas in secondary region (B). Use asynchronous replication with a durable change stream (CDC) to meet 15‑min RPO and support replay.
- Components: data ingestion pipelines (streaming + batch), OLAP datastore (columnar/warehouse), metadata/catalog, BI tool servers, object storage for assets, orchestration & runbooks, monitoring.
Data replication strategies:
- Streaming CDC (Debezium/Kafka Connect or cloud-native CDC) from transactional sources into a cross-region Kafka topic (replicated) and into the data warehouse in region B via continuous ETL. Keep commit offsets persisted and backed up.
- Warehouse-level replication: use cloud-managed cross-region replication (e.g., Snowflake replication / BigQuery cross-region copy / Redshift snapshots & datashare) with continuous replication of new micro-batches. Aim for sub-5 minute lag metrics; if not feasible, use combined CDC + micro-batch to ensure <15 min.
- Object assets (reports, extracts, parquet files): replicate object storage with cross-region replication (S3 CRR or equivalent).
- Metadata/catalog: replicate using owned read/write standby or export/import snapshots every few minutes.
Failover orchestration:
- Automated playbook in orchestration tool (e.g., Terraform + runbooks, or cloud failover orchestrator) with manual approval gate for production switchover.
- Steps: detect region failure via multi-source health checks → promote replicated warehouse in B to primary read/write (apply final logs from CDC to catch-up) → update BI tool configs to point to promoted warehouse endpoint (use parameterized connection strings) → promote metadata cluster and object storage endpoints → run smoke tests and resume scheduled jobs.
- Maintain a readiness “pre-warm” standby: compute reserved or small instances in B to allow scaling up quickly.
DNS / user routing:
- Use global load balancer with health checks (e.g., Route 53 latency-based + failover records, or GSLB) to route BI web UI traffic to active region.
- Use short TTLs (30–60s) for failover-critical records to speed switch; for API/database endpoints prefer using regional endpoints behind a service discovery mechanism rather than DNS for internal services.
- For scheduled reports delivered via email, buffer and retry during failover to avoid duplicates.
Consistency guarantees:
- Provide eventual consistency across regions for near-real-time dashboards; mark dashboards that require stronger guarantees (financial/ledger) and route them to primary or block until cutover completes.
- Use transactional guarantees at source + exactly-once semantics in streaming to avoid duplicates during CDC replay.
- During failover, enforce a read-only window until in-flight transactions applied or mark datasets as “stale” in BI UI with timestamp and freshness indicator.
Cost trade-offs:
- Warm standby (running smaller compute) in B: higher cost, low RTO. Cold standby (snapshots + infra as code): low cost, longer RTO. Hybrid: keep data replicated continuously but compute off; spin up compute on failover (balanced cost vs RTO).
- Choose managed cross-region replication which costs more but reduces operational burden and lowers RTO.
- Sizing: reserve minimal compute for critical services; use autoscaling and pre-approved runbook to scale up in failover.
DR testing without impacting production:
- Use a sandboxed “canary” DR rehearsal using recent replicated data: provision isolated compute in region B using a copy of the latest replicated snapshot (point-in-time ≤15 min). Run synthetic queries and smoke dashboards against this copy.
- Run non-invasive failover drills during low-usage windows: simulate region outage for orchestration and routing layers only (DNS/ALB health check fail simulation) while leaving production reads intact. Confirm promotion steps up to but not including final cutover.
- Perform full failover rehearsals quarterly in a staged manner with stakeholder sign-off; use feature flags and separate test tenants to avoid interfering with live schedules. Capture metrics: failover time, data lag at cutover, number of broken dashboards.
- Automate validation: run a suite of smoke queries and data freshness checks; validate scheduled report delivery in test channel.
Operational controls:
- SLAs, runbooks, RACI, and on-call rotation. Continuous monitoring: replication lag, end-to-end freshness, query error rates, BI app telemetry.
- Post-mortem after any drill/failover and update runbooks.
Outcome:
This design meets RPO=15min via continuous CDC + cross-region replication, and RTO=1hr through pre-warmed infrastructure and automated orchestration, while balancing cost with a hybrid standby approach and non-disruptive testing practices to keep analytics users unaffected.
You're the BI analyst assigned to replace a legacy reporting tool used by marketing and finance. Describe step-by-step how you would conduct a needs assessment to gather requirements from stakeholders across both functions during a 4-week engagement. Include stakeholder identification, core discovery questions, artifact deliverables (personas, prioritized requirements, process maps), success criteria, and how you'd resolve conflicting priorities or time constraints.
Sample Answer
Week 0 (kickoff) — clarify scope and schedule:
- Hold a 60‑min kickoff with marketing & finance leads and IT to confirm 4‑week timeline, constraints (security, tool choices), and decision owner.
Week 1 — stakeholder identification & kickoff interviews:
- Identify stakeholders: Marketing (CMO, campaign managers, growth analysts, CRM owner), Finance (CFO/FP&A lead, accountant, revenue ops), IT/DBA, and an executive sponsor.
- Conduct 30–45 min one‑on‑one interviews using core discovery questions:
- What reports/dashboards do you use today and why?
- Which metrics drive your decisions? Frequency and owners?
- Pain points with legacy tool (latency, accuracy, access, permissions)?
- Who needs self‑serve vs. packaged reports?
- Compliance/retention/security constraints?
- Examples of a report that saved time or revenue—and one that failed.
- Desired delivery cadence and acceptable SLAs.
Week 2 — workshops & process mapping:
- Run two 90‑min cross‑functional workshops to validate findings, map current processes (data sources → transformation → report consumption), and confirm data owners.
- Create artifacts: stakeholder personas (roles, needs, tech comfort), process maps, and raw requirements backlog.
Week 3 — prioritize requirements & prototype plan:
- Use RICE or MoSCoW in a prioritization session with reps to score features (impact, confidence, effort).
- Deliver prioritized requirements (MVP list), data source inventory, and a prototype wireframe plan (tool options, authentication model).
Week 4 — validation, success criteria, and handoff:
- Present final artifacts: personas, prioritized requirements, process maps, acceptance criteria, and an implementation roadmap with milestones.
- Define success criteria: e.g., 95% of key reports reproduced, <24‑hr data freshness, role‑based access, and stakeholder sign‑off from both functions.
- Agree on KPIs to measure post‑launch (adoption rate, report run frequency, error rate).
Resolving conflicts/time constraints:
- Use objective scoring (RICE) and tie-breaker to business value aligned with executive sponsor. Propose phased delivery: must‑have (MVP) in first sprint, nice‑to‑have later.
- Where opinions differ, bring data (usage logs, cost/effort estimates) and recommend a pilot for contentious reports.
- Escalate unresolved tradeoffs to sponsor with clear options and impacts.
Deliverables I hand to the implementation team:
- Personas, prioritized requirements backlog, process/data maps, prototype wireframes, acceptance criteria, roadmap, and stakeholder sign‑off log.
Write a Python script or describe code to check data freshness across three databases by querying a metadata table last_updated per dataset, comparing timestamps to expected SLAs (e.g., <= 15 minutes behind), and sending an alert to Slack for any dataset exceeding SLA. Outline libraries you would use, retry logic, and how you would run this as a scheduled job.
Sample Answer
Approach: connect to each DB, read metadata table with dataset + last_updated timestamps, compute lag vs now, compare to SLA (15 minutes), collect failing datasets and send a Slack alert. Add retry/backoff for transient DB/network errors, idempotent alerts, and run as a scheduled job (cron or Airflow).
import os
import time
import logging
from datetime import datetime, timezone, timedelta
import requests
import psycopg2
from psycopg2.extras import RealDictCursor
from tenacity import retry, stop_after_attempt, wait_exponential
# config
DBS = {
"reports_db": os.environ["REPORTS_DB_DSN"],
"analytics_db": os.environ["ANALYTICS_DB_DSN"],
"warehouse_db": os.environ["WAREHOUSE_DB_DSN"],
}
SLA_MINUTES = 15
SLACK_WEBHOOK = os.environ["SLACK_WEBHOOK"]
logging.basicConfig(level=logging.INFO)
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10))
def fetch_metadata(dsn, query="SELECT dataset, last_updated FROM metadata"):
with psycopg2.connect(dsn) as conn:
with conn.cursor(cursor_factory=RealDictCursor) as cur:
cur.execute(query)
return cur.fetchall()
def check_freshness():
now = datetime.now(timezone.utc)
failures = []
for name, dsn in DBS.items():
try:
rows = fetch_metadata(dsn)
except Exception as e:
logging.exception("Failed to fetch metadata from %s", name)
failures.append({"db": name, "error": str(e)})
continue
for r in rows:
last = r["last_updated"]
if last.tzinfo is None:
last = last.replace(tzinfo=timezone.utc)
lag = now - last
if lag > timedelta(minutes=SLA_MINUTES):
failures.append({
"db": name,
"dataset": r["dataset"],
"lag_minutes": int(lag.total_seconds() // 60),
"last_updated": last.isoformat()
})
return failures
def send_slack_alert(failures):
if not failures:
logging.info("All datasets within SLA")
return
text = "*Data Freshness Alert*\n"
for f in failures:
if "error" in f:
text += f"- DB {f['db']}: ERROR {f['error']}\n"
else:
text += f"- {f['db']}.{f['dataset']}: {f['lag_minutes']}m behind (last: {f['last_updated']})\n"
resp = requests.post(SLACK_WEBHOOK, json={"text": text}, timeout=10)
resp.raise_for_status()
if __name__ == "__main__":
failures = check_freshness()
send_slack_alert(failures)
Key points:
- Libraries: psycopg2 (Postgres), requests (Slack), tenacity (retries), logging.
- Retry/backoff: tenacity handles transient DB/connect issues; Slack post wrapped with HTTP timeout + raise_for_status.
- Scheduling: run via cron for simple setups; prefer Airflow/Prefect for visibility, retries, SLA tracking and alert deduplication.
- Additional considerations: timezone normalization, idempotent alerts (dedupe by storing last alerted state), threshold per-dataset SLAs, pagination for large metadata tables, secure credentials via secrets manager.
Unlock Full Question Bank
Get access to all 40 Technology Evaluation and Vendor Management interview questions and detailed answers.
Sign in to ContinueJoin thousands of developers preparing for their dream job.