If your friend was learning to code, and wrote a tetris clone, would you congratulate them on their first major project, or would you critique their sloppy code? They had to develop and live with that codebase, maybe for several days or more. They're probably aware of some things that suck about it, but had to stick with it (otherwise you never finish). Having someone criticize your code, variable names, lack of patterns without asking would be really demoralizing.
There's a difference between a well written function, and an entire application that's well organized and thought out. And there's a difference between playing in your garage and playing on stage.
Did the band suck because they couldn't play? Or did they suck because they were nervous? Well the only way to get over that is to play in front of people more.
I also think there should be a difference in expectations depending on where/what you're seeing. You have every right to criticize a group playing Madison Square Garden. But there's a reason the 14 year olds are playing O'Mallys Pub on a Tuesday, or the Ernie Ball stage at Warped Tour, and not the main stages or an arena.
What's particularly awesome and worth congratulating is watching a band of teenagers suck on stage, and then watching them a month later suck a little less. We should be striving for "better" rather than "great", in my opinion.