Parallelization Strategy
This chapter outlines how multiple developers can work on the Implementation Plan simultaneously. It identifies parallelization opportunities, conflict hotspots, and coordination strategies for efficient team collaboration.
Steps 3 (FCFS mode) and 5 (Roster maintenance) allow up to 3 developers to work concurrently on independent PRs.
Overview
This chapter uses an older step numbering (14 steps) that predates the current 14-step plan. In particular, Steps 10–14 here do not match the current plan. Refer to the Implementation Plan and PR Roadmap for the authoritative ordering. This chapter will be updated when those steps are closer to implementation.
The Implementation Plan consists of 14 steps across 4 phases. Some steps must be sequential due to hard dependencies, while others can be highly parallelized. With a 3-developer team, strategic work distribution can significantly reduce total implementation time.
Step-by-Step Parallelization
Step 2: Foundations (Sequential)
Parallelization level: 1 developer (sequential)
Sequence:
- PR-2.1 (Schema) → PR-2.2 (PolicyEngine) → PR-2.3 (Concerns)
Why sequential? Each PR builds directly on the previous. The schema must exist before the PolicyEngine can reference it; concerns depend on schema models.
Optional parallel work:
- PR-2.4 (Talk as Registerable) can proceed after PR-2.3 if seminars are in scope for MVP. Talk registration follows the same pattern as Tutorial registration and can be implemented by a second developer in parallel with Tutorial-focused PRs in Step 3.
graph LR
PR21[PR-2.1<br/>Schema] --> PR22[PR-2.2<br/>PolicyEngine]
PR22 --> PR23[PR-2.3<br/>Concerns]
PR23 -.->|optional| PR24[PR-2.4<br/>Talk]
style PR21 fill:#ff9999
style PR22 fill:#ff9999
style PR23 fill:#ff9999
style PR24 fill:#ffcc99
Step 3: FCFS Mode (High Parallelization)
Parallelization level: Up to 3 developers
Phase 3a: Admin & Student Foundations
Parallel tracks (2 developers):
| Track | PR | Developer Focus |
|---|---|---|
| A | PR-3.1 | Admin scaffold (campaigns/policies CRUD) |
| B | PR-3.2 | Student index (tabs/filters) |
Prerequisites: PR-2.3 must be merged.
Why parallel? Both PRs implement different controllers
(CampaignsController vs UserRegistrationsController) with no shared
code paths.
Merge order: Either can merge first; no dependencies between them.
Phase 3b: Student FCFS Flows
Parallel tracks (2 developers):
| Track | PR | Flow Type |
|---|---|---|
| A | PR-3.3 | FCFS single-item campaigns |
| B | PR-3.4 | FCFS multi-item picker |
Prerequisites: PR-3.1 and PR-3.2 merged.
Why parallel? Both implement different branches of
UserRegistrationsController#show logic. They share the controller file
but modify different action branches based on campaign configuration.
Conflict management:
- Each PR adds distinct routes (
register_single,register_multi) - Shared private methods (
ensure_eligible!,enforce_capacity!) can be extracted by the first PR to merge - Last PR to merge handles route file conflicts (rebase before merge)
Merge strategy: Flexible order; coordinate in daily standup.
PR-3.5 (policy-gated exam registration) has been moved to Step 12. Step 3 focuses on tutorial and talk registration only.
graph TD
PR23[PR-2.3<br/>Concerns]
subgraph "Phase 3a: Parallel (2 devs)"
PR31[PR-3.1<br/>Admin scaffold]
PR32[PR-3.2<br/>Student index]
end
subgraph "Phase 3b: Parallel (2 devs)"
PR33[PR-3.3<br/>FCFS single]
PR34[PR-3.4<br/>FCFS multi]
end
PR23 --> PR31
PR23 --> PR32
PR31 --> PR33
PR31 --> PR34
PR32 --> PR33
PR32 --> PR34
style PR31 fill:#99ccff
style PR32 fill:#99ccff
style PR33 fill:#90ee90
style PR34 fill:#90ee90
Step 4: Preference-Based (Mixed Parallelization)
Parallelization level: 2-3 developers depending on phase
Phase 4a: UI & Persistence Foundations
Parallel tracks (2 developers):
| Track | PR | Purpose |
|---|---|---|
| A | PR-4.1 | Student preference ranking UI |
| B | PR-4.2 | Roster foundations (models + service) |
Prerequisites: Step 3 complete.
Why parallel? PR-4.1 uses the stubbed materialize_allocation!
interface from PR-2.3. PR-4.2 implements the real roster persistence.
They don't conflict because PR-4.1 only reads the interface.
Optional parallel work:
- Developer C can research solver libraries (MCMF vs CP-SAT) and draft PR-4.3 structure while waiting for PR-4.2 to merge.
Phase 4b: Solver Integration (Draft in Parallel, Merge Sequentially)
Single track (1 developer):
| PR | Dependencies |
|---|---|
| PR-4.3 | PR-4.2 must be merged (needs roster persistence) |
Why sequential merge? The solver's finalize! method calls
materialize_allocation!, which writes to roster tables created in
PR-4.2. This is a hard dependency for merging.
But drafting can be parallel: Developer can write solver logic with
stubbed materialize_allocation! calls while PR-4.2 is in review. Only
the final merge requires PR-4.2 to land first.
Parallel work during PR-4.3:
- Developer B: Draft views for PR-4.4 (allocation controller UI)
- Developer C: Write integration test suite for allocation flow
Phase 4c: Allocation UI & Wiring
Parallel tracks (2 developers):
| Track | PR | Dependencies |
|---|---|---|
| A | PR-4.4 | PR-4.3 merged |
| B | PR-4.5 | PR-4.3 merged (can draft in parallel with 4.4) |
Why parallel? PR-4.4 adds teacher UI for allocation operations. PR-4.5 wires student-facing result views. Minimal overlap.
Merge order: PR-4.4 → PR-4.5 (preferred but flexible).
Dashboard widgets for registration/allocation are now part of Step 10 (Dashboard Partial), not incremental additions in Steps 3-4.
graph TD
PR36[PR-3.6<br/>Dashboard]
subgraph "Phase 4a: Parallel (2 devs)"
PR41[PR-4.1<br/>Student prefs UI]
PR42[PR-4.2<br/>Roster foundations]
end
subgraph "Phase 4b: Sequential (bottleneck)"
PR43[PR-4.3<br/>Solver integration]
end
subgraph "Phase 4c: Parallel (2 devs)"
PR44[PR-4.4<br/>Allocation controller]
PR45[PR-4.5<br/>Post-allocation wiring]
end
PR36 --> PR41
PR36 --> PR42
PR42 --> PR43
PR43 --> PR44
PR43 --> PR45
style PR41 fill:#99ccff
style PR42 fill:#99ccff
style PR43 fill:#ff9999
style PR44 fill:#90ee90
style PR45 fill:#90ee90
Step 5: Roster Maintenance (High Parallelization)
Parallelization level: Up to 3 developers
Phase 5a: Foundation Work
Parallel tracks (2 developers):
| Track | PR | Purpose |
|---|---|---|
| A | PR-5.1 | Read-only roster controller + views |
| B | PR-5.4 | Counters + integrity job |
Prerequisites: PR-4.2 must be merged (roster infrastructure).
Why parallel? Both read from roster tables but don't modify them. PR-5.1 displays rosters, PR-5.4 counts participants. No write conflicts.
Merge order: Flexible; PR-5.1 should merge first to unblock Phase 5b.
Phase 5b: Operations & Permissions
Parallel tracks (2 developers):
| Track | PR | Purpose |
|---|---|---|
| A | PR-5.2 | Edit operations (remove/move) |
| B | PR-5.5 | Permissions + tutor read-only variant |
Prerequisites: PR-5.1 merged.
Why parallel? PR-5.2 adds controller actions for edit operations. PR-5.5 adds authorization rules (abilities) and conditional UI. Low conflict risk because they touch different layers.
Merge order: Either can merge first.
Parallel draft work:
- Developer C: Start PR-5.3 draft (candidates panel) while waiting for PR-5.2.
Phase 5c: Candidates Panel
Single track:
| PR | Dependencies |
|---|---|
| PR-5.3 | PR-5.2 merged (needs edit operations to assign candidates) |
graph TD
PR42[PR-4.2<br/>Roster foundations]
subgraph "Phase 5a: Parallel (2 devs)"
PR51[PR-5.1<br/>Read-only controller]
PR54[PR-5.4<br/>Counters + job]
end
subgraph "Phase 5b: Parallel (2 devs)"
PR52[PR-5.2<br/>Edit operations]
PR55[PR-5.5<br/>Permissions]
end
PR53[PR-5.3<br/>Candidates panel]
PR42 --> PR51
PR42 --> PR54
PR51 --> PR52
PR51 --> PR55
PR52 --> PR53
style PR51 fill:#99ccff
style PR54 fill:#99ccff
style PR52 fill:#90ee90
style PR55 fill:#90ee90
style PR53 fill:#90ee90
Conflict Hotspots
When multiple developers work in parallel, watch these files for merge conflicts:
1. Routes (config/routes.rb)
Why conflicts occur: Multiple PRs add new routes to the same namespace.
Mitigation strategies:
- Designate a "routes owner": One developer handles all route-related conflicts during merge.
- Use consistent formatting: Follow Rails conventions for namespace blocks and member/collection actions.
- Rebase frequently: Pull latest
maindaily before pushing. - Coordinate merge order: Agree in standup which PR merges first.
Example conflict scenario:
# PR-3.3 adds:
post :register_single
# PR-3.4 adds (same location):
post :register_multi
Resolution: Both lines coexist; just order them consistently.
2. Abilities (app/models/ability.rb)
Why conflicts occur: Multiple PRs add authorization rules to the same file or concern.
Mitigation strategies:
- Split into concerns: Create
app/abilities/registration_ability.rbandapp/abilities/roster_ability.rbto separate workstreams. - Use section comments: Clearly mark sections like
# Registration — FCFS mode - Group related rules: Keep all rules for one controller together.
Recommended structure:
# app/models/ability.rb
class Ability
include CanCan::Ability
include RegistrationAbility
include RosterAbility
include AssessmentAbility
# ...
end
3. Dashboard Components
Why conflicts occur: Dashboard widgets are now consolidated in Step 10 (Dashboard Partial) rather than added incrementally.
Mitigation strategies:
- Use separate component files: Each widget is its own component
(
OpenRegistrationsCard,AllocationResultsCard,ManageRostersCard). - Feature flag each widget: Enables independent testing without UI conflicts.
- Coordinate in Step 10: Multiple developers can work on different widgets in parallel during Step 10 implementation.
4. UserRegistrationsController
Why conflicts occur: PRs 3.3 and 3.4 both modify the same controller.
Mitigation strategies:
- Keep actions separate: Each PR implements distinct actions or
branches (
if campaign.single_item?vsif campaign.multi_item?) - Extract shared methods early: The first PR to merge should extract
helpers like
ensure_eligible!,enforce_capacity!,build_registration_context. - Coordinate merge order: Agree which PR merges first; others rebase and adopt the extracted methods.
Example of method extraction:
# First PR to merge extracts:
private
def ensure_eligible!(campaign)
result = Registration::PolicyEngine.call(campaign, current_user)
redirect_to(...) unless result.pass?
end
Later PRs reuse this method instead of duplicating logic.
Steps 6-9: Grading & Assessments
Step 6: Grading Foundations (Sequential)
Parallelization level: 1 developer
Sequence: PR-6.1 (Assessment schema) → PR-6.2 (Grade scheme schema)
Why sequential? Both are purely additive migrations. Can be combined into a single PR or done sequentially. Low complexity.
Step 7: Assessments (Sequential)
Parallelization level: 1 developer
Sequence: PR-7.1 (Migration) → PR-7.2 (Controllers)
Why sequential? Controllers depend on migrated Assessment records existing. Migration must complete first.
Step 8: Assignment Grading (High Parallelization)
Parallelization level: Up to 3 developers
Parallel tracks:
| Track | PR | Purpose |
|---|---|---|
| A | PR-8.1 | Grading service (backend) |
| B | PR-8.2 | Grading UI (teacher/TA) |
| C | PR-8.3 | Publish/unpublish results |
Prerequisites: Step 7 complete.
Why parallel? PR-8.1 is pure service logic (no UI). PR-8.2 builds UI that calls the service (can use doubles initially). PR-8.3 adds toggle actions to existing AssessmentsController.
Merge order: PR-8.1 → PR-8.2 → PR-8.3 (preferred). PR-8.2 can draft with stubbed service calls while PR-8.1 is in review.
graph TD
PR71[PR-7.1/7.2<br/>Assessments]
subgraph "Phase 8: Parallel (3 devs)"
PR81[PR-8.1<br/>Grading service]
PR82[PR-8.2<br/>Grading UI]
PR83[PR-8.3<br/>Publish/unpublish]
end
PR71 --> PR81
PR71 --> PR82
PR71 --> PR83
PR81 --> PR82
PR82 --> PR83
style PR81 fill:#90ee90
style PR82 fill:#90ee90
style PR83 fill:#90ee90
Step 9: Activity Tracking (Moderate Parallelization)
Parallelization level: 2 developers
Parallel tracks:
| Track | PR | Purpose |
|---|---|---|
| A | PR-9.1 | Achievement model (new assessable type) |
| B | PR-9.2 | Achievement marking UI |
Prerequisites: Step 8 complete.
Why parallel? PR-9.1 creates model and migrations. PR-9.2 builds UI (can draft with stubbed model initially).
Merge order: PR-9.1 → PR-9.2 (PR-9.2 requires model to exist).
graph TD
PR83[PR-8.3<br/>Publish/unpublish]
subgraph "Phase 9: Parallel (2 devs)"
PR91[PR-9.1<br/>Achievement model]
PR92[PR-9.2<br/>Achievement marking UI]
end
PR83 --> PR91
PR83 --> PR92
PR91 --> PR92
style PR91 fill:#99ccff
style PR92 fill:#99ccff
Step 10: Dashboard (Partial) - High Parallelization
Parallelization level: Up to 2 developers
Parallel tracks:
| Track | PR | Purpose |
|---|---|---|
| A | PR-10.1 | Student dashboard (partial) |
| B | PR-10.2 | Teacher/editor dashboard (partial) |
Prerequisites: Steps 2-9 complete.
Why parallel? Completely separate controllers and views. Student dashboard shows registration/grades from student perspective. Teacher dashboard shows campaigns/rosters/grading from admin perspective.
Merge order: Flexible (no dependencies).
graph TD
PR92[PR-9.2<br/>Achievement marking]
subgraph "Phase 10: Parallel (2 devs)"
PR101[PR-10.1<br/>Student dashboard]
PR102[PR-10.2<br/>Teacher dashboard]
end
PR92 --> PR101
PR92 --> PR102
style PR101 fill:#90ee90
style PR102 fill:#90ee90
Steps 11-13: Student Performance & Exam Registration
Step 11: Student Performance System (Very High Parallelization)
Parallelization level: Up to 4 developers
Phase 11a: Schema & Services (3 developers):
| Track | PR | Purpose |
|---|---|---|
| A | PR-11.1 | Performance schema (4 tables) |
| B | PR-11.2 | Computation service (draft in parallel) |
| C | PR-11.3 | Evaluator (draft in parallel) |
Prerequisites: Step 9 complete (needs assessment data).
Why parallel? PR-11.2 and PR-11.3 can be drafted while PR-11.1 is in review using local schema definitions. Merge after PR-11.1 lands.
Phase 11b: Controllers (3 developers):
| Track | PR | Purpose |
|---|---|---|
| A | PR-11.4 | Records controller (factual data display) |
| B | PR-11.5 | Certifications controller (teacher workflow) |
| C | PR-11.6 | Evaluator controller (proposal endpoints) |
Prerequisites: PR-11.1, PR-11.2, PR-11.3 merged.
Why parallel? Three independent controllers with distinct purposes. Minimal shared code.
Merge order: Flexible (PR-11.4 can merge first as it's simplest).
graph TD
PR102[PR-10.2<br/>Teacher dashboard]
subgraph "Phase 11a: Schema & Services (3 devs)"
PR111[PR-11.1<br/>Performance schema]
PR112[PR-11.2<br/>Computation service]
PR113[PR-11.3<br/>Evaluator]
end
subgraph "Phase 11b: Controllers (3 devs)"
PR114[PR-11.4<br/>Records controller]
PR115[PR-11.5<br/>Certifications controller]
PR116[PR-11.6<br/>Evaluator controller]
end
PR102 --> PR111
PR102 --> PR112
PR102 --> PR113
PR111 --> PR112
PR111 --> PR113
PR112 --> PR114
PR112 --> PR115
PR112 --> PR116
PR113 --> PR114
PR113 --> PR115
PR113 --> PR116
style PR111 fill:#90ee90
style PR112 fill:#90ee90
style PR113 fill:#90ee90
style PR114 fill:#90ee90
style PR115 fill:#90ee90
style PR116 fill:#90ee90
Step 12: Exam Registration (Moderate Parallelization)
Parallelization level: Up to 3 developers
Parallel tracks:
| Track | PR | Purpose |
|---|---|---|
| A | PR-12.1 | Exam model (cross-cutting concerns) |
| B | PR-12.2 | Lecture performance policy (add to engine) |
| C | PR-12.3 | Pre-flight checks (draft in parallel) |
Prerequisites: Step 11 complete.
Why parallel? PR-12.1 creates Exam model. PR-12.2 adds policy kind to existing PolicyEngine. PR-12.3 can draft pre-flight logic (merges after PR-12.1 and PR-12.2).
Sequential continuation:
| PR | Dependencies |
|---|---|
| PR-12.4 | PR-12.1, PR-12.2, PR-12.3 merged |
| PR-12.5 | PR-12.4 merged |
graph TD
PR116[PR-11.6<br/>Evaluator controller]
subgraph "Phase 12a: Parallel (3 devs)"
PR121[PR-12.1<br/>Exam model]
PR122[PR-12.2<br/>LP policy]
PR123[PR-12.3<br/>Pre-flight checks]
end
subgraph "Phase 12b: Sequential"
PR124[PR-12.4<br/>Exam FCFS registration]
PR125[PR-12.5<br/>Grade scheme application]
end
PR116 --> PR121
PR116 --> PR122
PR116 --> PR123
PR121 --> PR123
PR122 --> PR123
PR123 --> PR124
PR124 --> PR125
style PR121 fill:#99ccff
style PR122 fill:#99ccff
style PR123 fill:#99ccff
style PR124 fill:#ff9999
style PR125 fill:#ff9999
Step 13: Dashboard Extension (Low Parallelization)
Parallelization level: 2 developers
Parallel tracks:
| Track | PR | Purpose |
|---|---|---|
| A | PR-13.1 | Student dashboard extension |
| B | PR-13.2 | Teacher dashboard extension |
Prerequisites: Steps 11-12 complete.
Why parallel? Extends existing dashboards from Step 10 with new widgets. Student and teacher dashboards are independent.
Merge order: Flexible.
graph TD
PR125[PR-12.5<br/>Grade scheme]
subgraph "Phase 13: Parallel (2 devs)"
PR131[PR-13.1<br/>Student dashboard ext]
PR132[PR-13.2<br/>Teacher dashboard ext]
end
PR125 --> PR131
PR125 --> PR132
style PR131 fill:#90ee90
style PR132 fill:#90ee90
Step 14: Quality & Hardening (Moderate Parallelization)
Parallelization level: 2 developers
Parallel tracks:
| Track | PR | Purpose |
|---|---|---|
| A | PR-14.1 | Background jobs (performance/certification) |
| B | PR-14.2 | Admin reporting (integrity dashboard) |
Prerequisites: Steps 11-13 complete.
Why parallel? PR-14.1 creates background jobs. PR-14.2 builds admin UI that displays job results (can use stubbed data initially).
Merge order: PR-14.1 → PR-14.2 (PR-14.2 displays job results).
graph TD
PR132[PR-13.2<br/>Teacher dashboard ext]
subgraph "Phase 14: Parallel (2 devs)"
PR141[PR-14.1<br/>Background jobs]
PR142[PR-14.2<br/>Admin reporting]
end
PR132 --> PR141
PR132 --> PR142
PR141 --> PR142
style PR141 fill:#99ccff
style PR142 fill:#99ccff
Parallelization Summary
Key insights:
- High parallelization: Steps 3, 5, 8, 10, 11 (2-4 developers)
- Moderate parallelization: Steps 9, 12, 13, 14 (2 developers)
- Sequential bottlenecks: Steps 2, 4 (PR-4.3), 6, 7
- Overall: With 3-4 developers, Steps 3-5 can complete in ~60% of sequential time. Steps 6-14 add similar parallelization gains.
Key insight: Steps 3, 5, 8, 10, and 11 are highly parallelizable. Steps 4, 6-7, and 12-14 have bottlenecks but allow parallelization before and after.
graph LR
subgraph "Legend"
SEQ[Sequential - Must be done in order]
PAR2[Parallel - 2 developers can work together]
PAR3[Parallel - 3 developers can work together]
BOTTLE[Bottleneck - Blocks other work]
end
style SEQ fill:#ff9999
style PAR2 fill:#99ccff
style PAR3 fill:#90ee90
style BOTTLE fill:#ff6666
flowchart TD
Start([Start Implementation])
Step2{{"Step 2: Foundations<br/>(Sequential - 1 dev)"}}
Step3{{"Step 3: FCFS Mode<br/>(Parallel - up to 2 devs)"}}
Step4{{"Step 4: Preference-Based<br/>(Mixed - 2 devs)"}}
Step4b{{"PR-4.3: Solver<br/>(Bottleneck)"}}
Step5{{"Step 5: Roster Maintenance<br/>(Parallel - up to 2 devs)"}}
Step6{{"Step 6-7: Grading Foundations<br/>(Sequential - 1 dev)"}}
Step8{{"Step 8: Assignment Grading<br/>(Parallel - up to 3 devs)"}}
Step9{{"Step 9: Participation<br/>(Parallel - 2 devs)"}}
Step10{{"Step 10: Dashboard Partial<br/>(Parallel - 2 devs)"}}
Step11{{"Step 11: Student Performance<br/>(Parallel - up to 4 devs)"}}
Step12{{"Step 12: Exam Registration<br/>(Mixed - 2-3 devs)"}}
Step13{{"Step 13: Dashboard Extension<br/>(Parallel - 2 devs)"}}
Step14{{"Step 14: Quality & Hardening<br/>(Parallel - 2 devs)"}}
Done([Implementation Complete])
Start --> Step2
Step2 --> Step3
Step3 -->|High parallelization| Step4
Step4 -->|Phase 4a-4b| Step4b
Step4b -->|Phase 4c| Step5
Step5 -->|High parallelization| Step6
Step6 --> Step8
Step8 -->|High parallelization| Step9
Step9 --> Step10
Step10 -->|High parallelization| Step11
Step11 -->|Very high parallelization| Step12
Step12 --> Step13
Step13 --> Step14
Step14 --> Done
style Step2 fill:#ff9999
style Step3 fill:#90ee90
style Step4 fill:#99ccff
style Step4b fill:#ff6666
style Step5 fill:#90ee90
style Step6 fill:#ff9999
style Step8 fill:#90ee90
style Step9 fill:#99ccff
style Step10 fill:#90ee90
style Step11 fill:#90ee90
style Step12 fill:#99ccff
style Step13 fill:#90ee90
style Step14 fill:#99ccff