solutioning
- Establish trust by questioning to get real data
- Understand high-level pain points and differentiators
- Document domain-driven architecture and models
- Write failing tests for functions
- Pseudocode functions
- Make it workable
- Make it maintainable with conventions and modular interfaces
- Make it scalable/efficient, if needed
-
Focus on restarting regularly to adapt incrementally, inexpensively, and continuously
- Check-in relationship, short-term concerns, long-term objectives
- Time-box tasks throughout lifecycle
- Break down goal into atomic components
- Isolate Model-View-Controller structure
- Isolate Class composition
- Isolate singular-task, functions with inputs/outputs
- Write tests for Behavior-Driven Development
- Pseudocode
- Get to Minimum Viable Product
- Make it maintable
- Optimize
- Repeat
The point is to show progress, strategies, and optimization just like real life, not “knowing the answer” which isn’t possible for new problems. Drive the process like you’re the senior person, but be a great teammate too!
- Understand the problem
- Think aloud
- Ask questions
- Scope the problem
- Get clues
- Express what you’re considering or not
- Listen for clues carefully
- Read carefully
- Write down notes for givens like inputs and outputs
- Manually test out a simple, but realistic example
- Reasonably big/realistic breadth
- Include special cases so you don’t miss edge cases
- Reverse engineer and breakdown thoughts
- State brute-force algorithm MVP; maybe pseudocode
- Talk about tradeoffs like time and space complexity
- Optimize
- Bottlenecks
- Unnecessary complexity
- Duplicated work
- Edge cases
- Consider time and space complexity tradeoffs
- Data structures
- Hash tables
- Recursion
- Bottom-up, vs. top-down
- Memoization
- Dynamic programming
- Data structures
- Walk through in detail; check against problem
- Write beautiful code
- Modularize with top-down functions first
- May save you from writing smaller helper utility functions that aren’t that important to logic
- Refactor
- Add arrows to insert new code instead of rewriting to save time
- Modularize with top-down functions first
- Test your code (not the algorithm)
- Code review
- Logic
- Areas vulnerable to errors
- Small test cases
- Special edge cases
- Big test cases (like realistic example you made above)
- Bugs
- Think about root causes
- Fix them
- Code review
Good luck and bring your own thin whiteboard markers if you like!