I'm still at university and I don't yet have experience with creating large scale software systems, but...
The first thing that needs to be done is to work out what's wanted. So far for me, this is normally an assignment specification, but in the real world it involves talking to the client. A lot.
Then I work out how to do what is required. For the relatively small programs that I've been working on, I normally form in my mind a rough idea of what my program's going to look like (what the important parts of the program are and how they interact with each other). This may involve spikes if I have no idea how some part of the program will work. I don't think this approach (do it all in my mind) will scale very well, but the question was asking what we actually do...
Once I know more or less what I'm trying to do, I sit down and write the code. It is here that I discover any problems in what I was thinking.
I don't think I've every used pseudocode to design an algorithm. I think pseudocode is too low level to design large chunks of the program.
I have only used a flowchart on one occasion to help with designing a program - back when I was learning assembly and was quite new to programming (and it was helpful). The Mythical Man-Month says the following: "The detailed blow-by-blow flow chart, however, is an obsolete nuisance, suitable only for initiating beginners into algorithmic thinking. ... I have never seen an experienced programmer who routinely made detailed flow charts before beginning to write programs."