I don't know anything about your friends or their app, but one thing to keep in mind is that the quality of work in a young startup is rarely in question. Mostly the people who work at them don't know what questions to ask.

At the risk of being very unfair in my generalisations young programmers often come in one of 2 shapes: 1) They think people over complicate stuff. As long as you have talented people and maintain your common sense, you will end up with good code. 2) They have read many, many blog posts and books like Code Complete and they are sure they know how to "do it right". As long as you adhere to this process you will end up with good code. 1 and 2 are not incompatible, but for some reason I rarely see people who exhibit both at the same time.

I've said it many times before, but in reality nothing teaches you to be a better programmer than watching something you worked on (and thought you knew what you were doing with) collapse under its own weight over a period of 5-10 years. The problem with young startups is that either your startup fails in the first year or two (and you never get to see why what you did was a mistake), or it is successful and you end up being CTO before you get to see why what you did was a mistake.

This leads to people who fit (again) one of two patterns: 1) The serial failure artist who wanders from one project to the next, staying for a year or so, writing horrible code without realising it and then moving on to do the same on the next project 2) The "why are all my underlings so incompetent" manager who can't understand how the next generation(s) of people who joined the team fscked up everything beyond comprehension. It's not so difficult!

As I have some experience learning and teaching foreign languages, I have drawn some parallels with being fluent in writing code and being fluent in speaking a foreign language. Even native speakers take 15 years or more to reach an adult level of fluency and proficiency in a language. When you are learning a foreign language, you have to expect to spend similar amounts of time and to immerse yourself in the target culture before you can reach an adult level of fluency and proficiency. This is why virtually all students of foreign languages fail to reach that level.

It is the same with programming. It takes a good 10 years before you start to understand all the subtleties that are important in programming. If you surround yourself with other young programmers and only ever read your own code, you end up becoming fluent in a kind of baby talk of your own invention. Alternatively if you obsess with meta issues like process you will become like the guy who can talk for an hour on verb inflections but can't order a drink at MacDonald's.

Ideally, what you want to do as a young programmer (IMHO) is to immerse yourself in a mature culture of fluent and proficient adult programmers. Unfortunately because virtually every single one of us started out the same way (either becoming baby-talk masters, or obsessing with meta details, or god-help-us-both) there are almost no such extant cultures.

My advice (based on my abject failure to do so when I was young) is not to think about this as a "should I join a startup and get a lot of responsibility" or "should I join an established company and learn industry methods" point of view. Instead take a long term view of your apprenticeship. Accept that it will take the better part of a decade. Try to spend time in many situations. But above all, seek out and cultivate relationships with mentors who can help you grow. It can be in your job, but it doesn't have to be. Go to meetups with established programmers and trade beer for wisdom. Write as much free and open source software as you can and get feedback. Go to conferences and search for the people who look like they've already had their preconceived notions shattered a thousand times.