Avoid Indirection in Code
It's not indirection, it's bad abstraction that's the real issue here. Consider the example used in the article:    if x.startswith("foo"):
      do_something_with(x)

    if is_foolike(x):
      do_something_with(x)

The problem with both of these variations is that the "if-statement" doesn't have any meaning behind it. There's no gain in the indirection presented here. Whereas the following code has meaning:    if checkHasPermissions(x):
      do_something_with(x)

The reader of the function is now able to understand the purpose of the indirection and the function has clear responsibilities.Remember although code is interpreted by machines it's read by humans...