While there are a multitude of techniques and heuristics to help you do so, I think it boils down to making the code read as close to english (or your group's native language) as possible. My usual process is to actually write it in plain english comments first, then go back sentence by sentence and transcribe it into a programming language statement that resembles the english statement as closely as possible, deleting the comment.
For example:
// Use pythagorean theorem to find the hypotenuse from the lengths of both sides
becomes:
float hypotenuse = pythagorean(length_side1, length_side2);
Obviously then, you go back and define pythagorean, length_side1, and length_side2 in similarly readable terms.
This might seem like a trivial example that is difficult to get wrong, but what happens when people are writing it is that the definitions are more fresh in their minds, and they are writing it one word at a time anyway, so they substitute the more complex definitions because it seems more efficient at the time, leaving something like this:
float hypotenuse = math.sqrt((triangle.point[1].x - triangle.point[2].x)^2 +
(triangle.point[1].y - triangle.point[0].y)^2);
Then they will reread the above to themselves, realize it's not immediately apparent what's being done, and feel compelled to insert a comment. Try to transcribe the code into english, and you'll see why because it comes out something like this:
The hypotenuse is the square root of
sum of the square of the difference
between the x coordinates of points 1
and 2 of the triangle and the square
of the difference between the y
coordinates of points 0 and 1 of the
triangle.
Technically, that's valid english, but no one can understand you without a lot of effort. Being able to write code that reads like clear english is one reason I feel computer science college students shouldn't begrudge their english composition and other liberal studies courses.