Software Design for Python Programmers (Principles and patterns)