Pseudocode is often used across the industry as the main method for writing program designs. Whilst it is fair to say it is also often ignored in a lot of software companies, many of the most successful programs have had some kind of pseudocode in their development lifecycle.
What pseudocode is
Pseudocode is a language with extremely loose syntax and yet strong emphasis on semantics.
Pseudocode uses very high-level syntax very similar to the English languages (or in fact the native language of the writer such as German or French etc). It attempts to be written with a structure similar to that of a programming language but with syntax that does not bind it to one programming language (thus loose syntax).
LET x BE 10 WHILE x < 30 DISPLAY x LET x BE x + 5 END WHILE
Since pseudocode has no actual syntax, this should only be interpreted as the programmer sees fit.
There are deviations from the unstructured concept of pseudocode such as the high-level reference language HAGGIS developed by Quintin Cutts (who read and passed my undergraduate Honours Project) and Greg Michaelson (one of my former lecturers) formalised for the SQA and the Scottish Computing Science exams.
This kind of language defines a syntax that is not tied to one actual programming language but has strict syntax (although for school pupils, the strictness in syntax when marking is often not considered).
What an algorithm is
An algorithm is a mathematical construct for describing a set of procedures or steps to follow to solve a problem. Since programming can be seen as being a problem solving activity, algorithms are a large part of programming.
An algorithm can also be code itself, though it is often seen as being completely based on pseudocode, the actual fact is that a program is itself an algorithm.
It is often the case that programming languages also have their own formal specification (you can find the ZPE formal specification on the ZPE Documentation page on this website).
A formalised specification or reference specification can be written to ensure that the language compiles as expected - it allows us to develop a written set of requirements for the compiler that can be read easily by a developer and checked to ensure that it works as expected before writing the program.