- Make sure you completely understand the code
- Evaluate all the architecture tradeoffs
- Verify code correctness
- Check for well-organized and efficient core logic
- Is the code as general as it needs to be, without being more general that it has to be?
- Make sure the code is maintainable
- Enforce stylistic consistency with the rest of the codebase
- Confirm adequate test coverage
- Check tests having the right dependencies and are testing the right things
- Ask if the code is forwards/backwards compatible. In particular, be on the lookout if the code is changing the serialization / deserialization of something
- Run through a roll-back scenario to check for rollback safety