Here are some of the questions we may ask ourselves while reviewing code.
Is the code clean and modular?
- Can I understand the code easily?
 - Does it use meaningful names and whitespace?
 - Is there duplicated code?
 - Can you provide another layer of abstraction?
 - Is each function and module necessary?
 - Is each function or module too long?
 
Is the code efficient?
- Are there loops or other steps we can vectorize?
 - Can we use better data structures to optimize any steps?
 - Can we shorten the number of calculations needed for any steps?
 - Can we use generators or multiprocessing to optimize any steps?
 
Is documentation effective?
- Are in-line comments concise and meaningful?
 - Is there complex code that’s missing documentation?
 - Do function use effective docstrings?
 - Is the necessary project documentation provided?
 
Is the code well tested?
- Does the code high test coverage?
 - Do tests check for interesting cases?
 - Are the tests readable?
 - Can the tests be made more efficient?
 
Is the logging effective?
- Are log messages clear, concise, and professional?
 - Do they include all relevant and useful information?
 - Do they use the appropriate logging level?