Free preview

Evaluation

In one line: the compliance tables here are more mechanism-specific than most in the module. Two rows are genuinely strong; two describe the build phase and quietly leave the deployment phase uncovered.

Functional requirements

RequirementStated mechanismAssessment
Building codeCI detects changes; pub-sub coordinates; workers compile; artifacts to primary blob✅ Complete and specific
Deploying codeReplication service to regional blobs; P2P within a region; regional config coordinates✅ The strongest part of the design
Version control integrationGit-based; CI pulls the latest changes
Environment configurationCentral config service holds global and regional state⚠️ Mechanism present; no versioning or rollback of config alongside code
RollbackConfig service points at a previous version; servers re-fetch older binaries🔴 Rollback-by-redeployment — minutes, not seconds; depends on unspecified retention
Deployment monitoringMonitoring tracks health, status, performance of the pipeline⚠️ Liveness, not health — no per-cohort comparison, no gate

Configuration is listed as satisfied and the hard half is missing

The requirement was "users must be able to manage environment-specific configurations, such as database connections and API endpoints." The mechanism given is a config service that holds global and regional state, which satisfies the literal reading.

What it does not address is the coupling Lesson 3 raised: configuration changes are deployments too, and they need the same machinery.

Code rollback WITHOUT config rollback:
  binary reverts to v1.0
  config still holds v1.1's new database endpoint
  -> v1.0 code, v1.1 config: a combination NOBODY ever tested

Configuration changes are also, empirically, a leading cause of production incidents — and they are riskier than code changes precisely because they usually skip the pipeline: no build, no tests, no staging, often no review, and they take effect in seconds.

The fix is to treat config as an artifact: version it, tie the version to the build version, roll them back together. The design's global state service already holds {build_version: build:1.1}; extending that to {build_version, config_version} is a small change with a large payoff.

A rollback that reverts one of two coupled things is not a rollback.

Non-functional requirements

The availability row describes build availability and calls it system availability

Availability: "The configuration service enables automated failover by rerouting build requests to backups. Redundancy is ensured with duplicated servers, databases, and load balancers."

Both sentences are about the build side. Reroute build requests; duplicate servers and databases.

Ask instead what availability means for the deployment side, and the row is silent:

What if the GLOBAL STATE SERVICE is unavailable?
  -> no deployments can be triggered, AND no rollbacks
     (it is the single strongly-consistent component; Lesson 7)

What if a REGIONAL CONFIG SERVICE is unavailable?
  -> that region silently stops receiving deployments
     (it polls; nothing alerts on a poller that stopped)

What if a REGIONAL BLOB STORE is unavailable?
  -> that region's machines cannot fetch binaries mid-rollout
     -> a PARTIALLY deployed region, versions split across the fleet

The third is the dangerous one and it is unaddressed. The design's own quiz answer for availability is "redundancy through duplicated elements," which is right for stateless components and does not cover a partially-completed global rollout.

A deployment system's worst availability failure is not being unable to deploy — it is being unable to finish, leaving the fleet split across versions with no mechanism to converge. The declarative model from Lesson 7 actually helps here: machines keep polling and converge when the store returns. Saying that is the right answer, and the design does not.

The fault tolerance row is the best in the chapter, and it earns it by naming a mechanism

Fault tolerance: "Workers regularly send heartbeats through the pub-sub system, recorded in an SQL database; if one is missed, the task is reassigned to an available worker."

This is what a compliance row should look like. It names a specific mechanism, ties it to a specific failure, and the mechanism actually delivers the requirement — "every build must definitively report success or failure."

Compare with rows elsewhere in the module that say "replication ensures fault tolerance" without saying replication of what, against which failure.

Two qualifications, both from Lesson 4:

"If one is missed" is too aggressive. A single missed heartbeat should not trigger reassignment — a GC pause or a brief network blip will do that routinely. Real leases require several consecutive misses, and the interval is a trade between detection speed and false reassignment.

Reassignment without fencing allows duplicate execution. Both the original and the replacement worker can write to the same artifact path. The fix is a fencing token rejected on stale writes, or reproducible builds making the duplicate harmless — ideally both.

A mechanism-specific compliance row is falsifiable, which is what makes it worth writing.

RequirementStated mechanismAssessment
AvailabilityFailover of build requests; redundant servers, DBs, load balancers🔴 Build-side only — the partially-deployed-fleet failure is unaddressed
Fault toleranceHeartbeats + task reassignment✅ Best row in the chapter — but needs multiple misses and a fencing token
PerformanceAsync builds; regional distribution; P2P within a region✅ Correct, and P2P is the real win — see Lesson 6
ScalabilityQueue auto-scales with volume; config service adds servers; resources adjust to load✅ Well suited — stateless workers make this nearly free
SecurityMFA, OAuth, encryption at rest and in transit, firewalls, IDS, IAM least privilege🔴 Generic — no artifact signing, provenance, or install-time verification (Lesson 9)

Scalability is genuinely easy here, and it is worth knowing why

The scalability row is short and it is right, for a reason the design does not state: almost nothing in this system holds state that constrains scaling.

ComponentScaling story
Build workersStateless — add machines, they pull from the queue. Nothing to rebalance
Pub-sub queuePartitions freely — no strict ordering requirement (Lesson 5)
Blob storageScales by construction
Regional config servicesRead-mostly caches — replicate freely
Global state serviceThe one exception — strongly consistent, small, must not be sharded

That last row is the whole scaling constraint, and it is fine because the object is one key per project and the read fan-in is absorbed by the regional tier.

Compare with the module's other systems, where scaling meant choosing a partition key and living with its skew — user IDs and celebrities, prefix ranges and letter frequency, hosts and domain concentration. Here there is no partition key to get wrong, because the work is independent and the shared state is tiny.

A system whose work is independent and whose shared state is one small key scales trivially — and recognizing when you are in that situation is as useful as knowing how to shard when you are not.

What the evaluation omits

Four things a strong answer adds, each covered earlier:

Retention. Rollback reads from blob storage and no policy says what is kept. A retention policy is a rollback policy (Lesson 8).

The aggregate bandwidth figure. The performance row credits P2P without ever stating the 1.07 Tbps that makes it mandatory (Lesson 6).

The missing gates. No staging, no test gate before production, no automatic rollback — three of the seven pipeline stages (Lesson 8).

Supply-chain integrity. No signing, no provenance, no verification at install, on the one system whose compromise implies compromise of everything else (Lesson 9).

Key takeaway

The fault tolerance row is the module's best because it names a falsifiable mechanism — heartbeat leases with reassignment — though it needs multiple missed beats and a fencing token. The availability row covers only the build side, and the failure it misses is the important one: a partially-deployed fleet split across versions, where the declarative model is the actual answer. Scalability is genuinely easy because the work is independent and the shared state is a single small key — there is no partition key to get wrong, which is unique in this module. Configuration is marked satisfied while the hard half is absent: a rollback that reverts code and not config is not a rollback. And security is entirely generic on the one system where the specific threat — artifact integrity — is what matters.

Next: the interview walkthrough.

Enjoying the preview?

Create a free account to unlock the rest of this course, the in-browser judge, and live AI mock interviews.

Sign up free to continue