Well, a good starting point would be some graph theory. Probably the best way to lay out a city would be to generate either a random graph, or some grid starting point, and then manipulate it until it complies with some rules.

For an "organic" European type city, I'd probably use the centroidal voronoi algorithm to get a graph, and then pick some reasonably straight walks through it and mark them as major roads, then try to cover the open spaces with progressively less significant streets until all the edges have been incorporated into streets.

For a gridded, North American feel. You need, a grid, and then a bunch of random and terrain based deviations from it. Some cities have multiple grids abutting each other which adds some complexity.

This is not a simple problem.