Interface - not understanding the dependent structure of methods or constants (why is this nil?, why don't I have access to a method?, What can this object see and do?)
State - when the assumptions you made about the current state of the program are incorrect (How does a value change at a certain point? What has been initialized at this point?) Take advantage of Ruby's quick feedback loops and flexibility. Ability to see into your program's state is critical.
Flow - occur when you don't how the Ruby interpreter got to or left a location in code and its associated state. (How did the interpreter get here? Where does the interpreter go from here? When does the instance variable get set?) - Helpful tool: using TracePoint and pass it a block to analyze interpreter data flow. This can help to track when values change.