automation code complete computational linguistics computer programming computer science english language indirect self-reference jef raskin joint application design knowledge representation markup language naming collision polysemy programming language source code steve mcconnell structured programming tex user interface