Clean code is code that is elegant, efficient, focused, and readable. It should do one thing well. Bad code lacks these traits. Some heuristics for writing clean code include using descriptive naming, short methods that do one thing, avoiding comments when possible, consistent formatting, following object-oriented design principles like the Law of Demeter, and properly handling errors through exceptions.