Let's say there are roughly two classes of software development: there's development for development's sake, and there's programming to get things done.
The first class is where software libraries are written and big applications and architectures are developed. It's the one that really requires passion and big heaping piles of experience, so that you can judge the right way to solve particular problems (and anticipate other problems). This class lives in abstraction. If someone has never written a single line of code before college, I wouldn't encourage them to shoot for this class.
The second class is this huge under-served market that the leaders of the software development community seem to rarely acknowledge. I'm sometimes not even sure they know it exists. It's the market where programming is merely a skill that someone brings to their job. It's the market where retail stores could have managers that can cobble together a script to help them iron out scheduling conflicts; where experimental scientists and engineers collect data and then write single-purpose applications to do useful stuff with the data; where even office receptionists can tweak a spreadsheet here and there to make some aspect of the job a little easier.
People that have some primary skill set and have programming as a skill are really valuable in almost any environment.
I've had a lot of different jobs, from government to really big corporations to really tiny mom-and-pops and just about everything in-between. Every single place I've worked could have benefited from someone there with a little bit of free time and some programming expertise.
If you get part way through a computer science major and decide you don't enjoy it, that's totally OK. Go and find the thing that you really do love, and go do that thing, and bring your programming education with you. You don't have to be a good programmer there, you just have to be able to understand another industry well enough to see where it can benefit from having a few things automated here and there.
I can tell that programming is my forte because when the going gets tough, sometimes solving a problem but most often when debugging, I have the drive as the first commentator put it to slog through it.
And while I'm pretty good at system building and administration, when there's a messy bug to be found because something's not working there are few things I'd rather less do, solving it draws on my willpower in a way that's just not even comparable in programming. Even the hardest, takes weeks to find disjoint in time wild pointer bugs (well, weeks back in the days where I had to get my company to procure debugging hardware because the 808x family didn't have it built in).
As smart as I would like to think I am, there are a couple of million kids in China alone that are smarter. Easily. Same goes for the majority of the "celebrities" we have in our circles. Hell, there is probably a large portion of folks this side of the pond that would qualify.
Bringing it back to this, career questions are tough, because ultimately a small percentage of us can even do something about our careers. Changing careers is something that folks do rarely, in part because it so rarely works.
Or, do you really think every middle aged delivery man is passionate about their job because they like delivery? My bet? They like their job because of what it can afford them to do.
The entrenched crowd recognizes programming and all the mired number of daily challenges as a way of life they would not change for any other career.
I've been doing software for around 8 years now. I didn't grow up around computers, my family could never afford one growing up so I was never exposed to programming and IT at an early age, the closest I got to having a computer growing up were my NES and Genesis, I got my first computer at 18 right before starting uni, and was exposed to the internet a year later, since we couldn't get internet service in my home. I wrote my first hello world at 21 during university.
After high-school I found myself at a crossroads since I didn't know what I was going to do as a career, I had a passion for video games but knew very little about computers or programming, and every time I looked into it I felt it was way over my head, with no other options as to what career path to take, I settled for technology, partly because my parents pushed me as they also didn't know anything about computers but they realized it was only going to become more important in the future, and partly because I didn't have any other options.
Anyway I finally ended up doing a bachelors in something called "Systems Engineering" which actually involved very little programming and Computer Science. The few courses on programming I had I actually enjoyed and excelled at, they involved very trivial programming in C, but to me getting a "hello world" to work was amazing, for a while I thought I was happy and that I could actually make a living out of this, that I found something I really liked. This didn't last long of course, and once I started applying for jobs I realized I was competing with people who had started programming in their teens, the sort of programming problems and concepts I struggled with these guys breezed trough effortlessly, this was very very very demotivating, I realized that I could never reach their level no matter how hard I tried(I'm not very smart) I was finally able to get a job as a CRUD developer and that's what I've been doing since, my passion for programming was short lived and died a long time ago, right now this is just a job.
I am not a geek, I actually despise the geek culture, I use Windows as my operating system, I don't read comics, I hate start wars (but love sci-fi) and hate configuring servers, I don't program in my free time, I HAVE to use a mouse when programming, I use an IDE and know nothing about vim or emacs, I'm a slow typist and I'm a slow learner, I don't know my programming language of choice inside and out, I only study algorithms when I need to go to an interview, I'm not smart.
However that doesn't mean I suck at my job, that doesn't mean I don't work hard to achieve my goals and finish my tasks on time, that doesn't mean that I can work through a problem that I have no clue how to fix, even if I need a little help form the internet and fix it, on time.
I've accepted the fact that I am and will be just another mediocre CRUD developer, that I will never make millions or be recognized for my amazing contributions to open source. But you know what it's my Job and I work hard at it, I can't switch careers at this point because there's nothing else I know how to do and I have a family to support.
According to Jeff I don't deserve a job because I'm not passionate enough.
You know what Jeff, screw you.
a. I want to keep working on technology. Whether I'm a programmer or data scientist or even a startup founder, I want to keep taking ideas and directly implementing them-- not being some champion delegator and credit-taker because I would feel dirty and be bored out of my fucking skull if I had that job.
b. I do NOT want to be what most people think of as a "programmer"-- a subordinate who implements crappy ideas with no room for creative control (I'm willing to cede business-strategy creative control, but I decide how to solve problems) and gets no autonomy, no respect, and no chance for advancement. I also think there are very few companies where software engineers actually have it good. Even at Google it's a million times easier to climb the management ladder than the engineering one. You actually have to be good at something to make Staff Software Engineer at Google; not so for its management track.
So, I like programming-- even the debugging, and even maintenance/reading code when I decide that it's important for the code to be read. I don't want to be what empty-suited idiots think of when they think of a programmer, though. Fuck that shit. I'm too old and I'm way too talented to be the butt of that joke.