At a most elemental level, a program written by a CS student should work, that is, do what it is supposed to do for all legal inputs and provide meaningful diagnostics when it fails. That's hard, but that is the nature of programming.
Finding and choosing algorithms to accomplish a task (well defined or not) is also computer science. That is algorithmics and design. Doing a good job here is harder to measure and depends both a deep understanding of the available building blocks and the problem at hand. Moreover, trade-offs are involved and need to be resolved even though there is little real data to guide decisions. Seeing and exploiting invariant properties of the problem often enables better performance in some dimension; insight there is often called cleverness.
Equally important is the ability to see complex things in a simplified way by introducing abstractions. That's the only way to solve difficult, complex problems, and it is exceptionally difficult to codify.