Subtasks reuse tasks instead of getting their own table
A separate subtasks table would be simpler to read and would immediately be wrong: teams nest two or three levels, and a subtask that turns out to be real work has to become a task. The self-reference makes both free. What it costs is that depth is unbounded — the application has to stop runaway nesting, because the schema will happily allow a chain a hundred long.