betti number cobol complexity computer program computer programming control flow control flow graph decision-to-decision path design predicates essential complexity flesch-kincaid readability test hammurapi code review tool journyx les hatton panopticode procedure relative homology return statement software engineering software metric software testing source code strongly connected component structured programming system while loop