← All posts

Shift left, shift north: the two axes of SDV development

The two moves that define modern vehicle software work: shift left (validate earlier, against virtual targets) and shift north (develop at higher abstraction, against vehicle APIs instead of bus signals).

Two directions on one map

Automotive software development is being pulled in two directions at once, and the SDV community — digital.auto prominently — gave them compass names:

  • Shift left — move validation earlier in time: test before hardware exists, on virtual targets, in CI.
  • Shift north — move development up in abstraction: write features against vehicle APIs instead of bus signals and ECU registers.

They’re independent axes. You can shift left without shifting north (run your low-level CAN stack against a virtual bus) and north without left (prototype against a vehicle API, validate on hardware as usual). The teams moving fastest do both — and after a year of building virtual cars, I’d argue you eventually can’t do one well without the other.

time → (requirements … road) abstraction ↑ apps · vehicle API (VSS) services · middleware signals · buses · silicon traditional: late, low-level SDV: early, API-level shift left + shift north
One map, two moves: earlier in time, higher in abstraction. Most legacy pain lives in the bottom-right corner.

Shift left: validate before the hardware exists

The traditional flow is the V-model: requirements down the left leg, implementation at the bottom, integration and validation up the right leg — with the expensive truth that most validation happens late, on test benches and prototype vehicles that are scarce, shared, and physically slow to reconfigure. A bug found on the right leg of the V costs orders of magnitude more than the same bug found on the left.

Shifting left means building targets you can test against now:

StageVirtual targetWhat you catch
Feature logicVehicle API playground (digital.auto)Wrong behavior, bad UX flows
ECU softwareVirtual ECUs on a virtual busIntegration bugs, signal contract violations
Control algorithmsCo-simulation with FMUsControl instability, calibration errors
System behaviorPhysics simulation (CARLA) in the loopClosed-loop failures, scenario edge cases
HMIA real Android Automotive image in a VMThe warning that never reaches the screen

Two properties make a shifted-left setup actually stick, and they’re worth designing for from day one:

  1. It must run in CI. A simulation an engineer runs by hand is a demo; a simulation that gates every merge is a validation strategy. This is why the entire virtual-car series insists on containers and committed build artifacts — docker compose up is a sentence CI understands.
  2. It must share contracts with the real thing. The virtual bus uses the same .dbc signal databases as the physical harness; the FMU exposes the same signal interface as the production controller. Testing against a simplified contract shifts bugs right again, silently.

The honest limits: virtual targets validate logic and integration, not timing on real silicon, not EMC, not a certified safety case. Shift left doesn’t delete the right leg of the V — it thins it, so what remains on hardware is what genuinely needs hardware.

Shift north: develop above the wire

Shift north is the abstraction move: instead of writing features against frames and bit offsets, write them against a vehicle API — the standard tree of COVESA VSS signals introduced in SDV 101.

The difference is visceral when you put the two side by side. South, a feature developer needs the signal database, the bus layout, and the encoding rules:

# South: decode Vehicle_Speed from CAN frame 0x123 (needs the .dbc, the bus, the offsets)
raw = can_bus.recv(0x123)
speed_kmh = ((raw.data[1] << 8) | raw.data[0]) * 0.01

North, they need the concept of vehicle speed:

# North: the same fact, one abstraction up
speed = await vehicle.Speed.get()

That’s not just ergonomics. Three structural things fall out:

  • Portability. The API-level feature runs against a simulator, a virtual car, a test rig, and the production platform without change — only the layer that maps the API to signals moves. (In the virtual car, that mapping layer is exactly what the broker does with the .dbc.)
  • A wider talent pool. A Python or Android developer can build vehicle features without five years of CAN folklore. The wire knowledge concentrates where it belongs: in the platform team that owns the mapping.
  • Testability. APIs mock cleanly; bit offsets don’t. Shifting north is what makes shifting left cheap — which is why the two axes converge in practice.

The catch, symmetric to shift left’s: someone still has to own the south. Latency-critical control loops, safety paths, and diagnostics still live near the wire, and the API layer is only as trustworthy as its mapping. Shift north moves most development up; it doesn’t make the bottom of the stack disappear — it makes it a product with an SLA.

The compound effect

Put both moves together and the day-one experience of vehicle-feature development changes completely:

  1. Prototype the feature against VSS in a browser playground — hours.
  2. Drop the same logic onto a virtual car with real signal contracts, gate it in CI — days.
  3. Watch it drive a physics-simulated vehicle and render on a real Android cockpit — still no hardware in the room.
  4. Land on the test bench and prototype vehicle with the integration bugs already dead.

Every step of that pipeline exists as a free or open tool today; the rest of this series walks through each one. The strategic view of where this is all heading — and what it means if you’re deciding whether to work in this field — is in the final post on SDV opportunities.