There are many ways to go depending on exactly how you want it. Here is a rough outline of one way which I think will fit your description:
First generate the canals. Then start placing houses randomly, for each house you place, place the road in front of it and draw a road from that piece to the existing road network, if either is not possible or placing the road in front results in an ugly 2x2 block of road reposition the house. Detect some road points that are close to each other but far apart following the existing roads and try to make some shortcuts for those.
This kind of stuff most of all takes experimentation and experience. Often you'll get good results from making some detail in a random fashion, determine if it meets some criteria and undo and retry if it doesn't.
For this exact task you will certainly also need a good grasp of basic pathfinding, unless you are already an expert, go read on the topic. And remember, pathfinding doesn't have to be just about the shortest path, for the last part of my description you might want to give some weight to reusing paths that are already there.
This is not at all an easy task, if you get stuck come back and show us your code and some example output and explain in detail how you would like it to be different.