Skip to content

Commit bcfef7b

Browse files
Copilotandimarek
andcommitted
Expand effort estimate with detailed breakdown and justifications
Co-authored-by: andimarek <1706744+andimarek@users.noreply.github.com>
1 parent 11e22a9 commit bcfef7b

File tree

1 file changed

+40
-8
lines changed

1 file changed

+40
-8
lines changed

JSPECIFY_MIGRATION_PLAN.md

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -240,14 +240,46 @@ When annotating the API, consider:
240240

241241
## Estimated Effort
242242

243-
- **Phase 1-2** (Core + Impl): ~8 files, 2-3 hours
244-
- **Phase 3** (Stats): ~11 files, 1-2 hours
245-
- **Phase 4-5** (Instrumentation + Scheduler): ~6 files, 1-2 hours
246-
- **Phase 6-7** (Registries + Reactive): ~5 files, 1 hour
247-
- **Phase 8** (Annotations): ~6 files, 30 minutes
248-
- **Final verification and testing**: 1-2 hours
249-
250-
**Total estimated effort**: 6-10 hours
243+
### Per-Phase Breakdown
244+
245+
| Phase | Files | Time Estimate | Justification |
246+
|-------|-------|---------------|---------------|
247+
| **Phase 1-2** (Core + Impl) | 8 files | 2-3 hours | `Try.java` and `DataLoaderOptions.java` require careful analysis of nullable generics and multiple nullable fields. Implementation classes need review of internal null handling. |
248+
| **Phase 3** (Stats) | 11 files | 1-2 hours | Mostly straightforward classes with few nullable members. Context classes are simple records. |
249+
| **Phase 4-5** (Instrumentation + Scheduler) | 6 files | 1-2 hours | Methods explicitly return nullable `DataLoaderInstrumentationContext`. Requires attention to null callback patterns. |
250+
| **Phase 6-7** (Registries + Reactive) | 5 files | 1 hour | `DispatchPredicate` is simple. Reactive subscribers follow established patterns. |
251+
| **Phase 8** (Annotations) | 6 files | 30 minutes | Annotation definitions rarely need null annotations; quick review only. |
252+
| **Final verification** | N/A | 1-2 hours | Full build, test suite, and enable `AnnotatedPackages` option. |
253+
254+
### Time Estimate Rationale
255+
256+
Each file requires the following activities:
257+
258+
1. **Analysis** (~5-10 min/file): Review all fields, parameters, return types, and generic bounds
259+
2. **Annotation** (~5-10 min/file): Add `@NullMarked` and `@Nullable` annotations
260+
3. **Compilation check** (~2-5 min/file): Run `./gradlew compileJava` and fix NullAway errors
261+
4. **Iteration** (variable): Complex classes may need multiple rounds of fixes
262+
263+
**Complexity factors that increase time:**
264+
- Generic types with nullable bounds (e.g., `Try<V>`, `DataLoader<K, V>`)
265+
- Classes with many optional/nullable fields (e.g., `DataLoaderOptions`)
266+
- Interfaces that return nullable values (e.g., `DataLoaderInstrumentation`)
267+
- Chained builders or fluent APIs
268+
269+
**Factors that decrease time:**
270+
- Simple data classes with all non-null fields
271+
- Annotation definitions (usually no changes needed)
272+
- Classes that already follow non-null patterns
273+
274+
### Total Estimated Effort
275+
276+
| Scenario | Hours | Conditions |
277+
|----------|-------|------------|
278+
| **Optimistic** | 6 hours | Experienced with JSpecify, no unexpected issues |
279+
| **Expected** | 8 hours | Normal pace, some debugging of NullAway errors |
280+
| **Pessimistic** | 10 hours | Complex edge cases, API design decisions needed |
281+
282+
**Recommendation**: Plan for 8 hours, which allows for one full working day or 2-3 focused sessions.
251283

252284
## References
253285

0 commit comments

Comments
 (0)