"Get out of my class! Now!"
It was the low point of my academic career. Halfway through my university degree in Computing and Software Systems, in a session of the required "Introduction to Operating Systems" course. Two students were being yelled at by the professor because we (yes, I was one of them) sat in the back and talked while she was lecturing.
Working toward this CSS degree wasn't really the plan. I didn't have one after I was accepted to the University of Washington for my freshman year in 2000. That lack of a plan turned into poor performance in basically everything I did while at the Seattle campus. I transferred to the Tacoma campus and the brand new CSS degree program there. Still, no plan.
I honestly don't know how I completed enough requirements to graduate, but I did. I never had the drive or interest in the subject matter I was being taught, so I just went through the motions. However, I did graduate in summer of 2005. Now what? Again, I had no idea.
My first job out of college was replacing computers at Boeing locations throughout the Puget Sound area. It was actually pretty perfect. Not much responsibility, strange hours, and not really any free time to spend the money I made. I also made a lifelong friend while working there.
But, the job ended six months later. We replaced all the computers and wouldn't be needed for at least another three years. So, I went back to having nothing to do and no direction. Months later, I found something just about anybody could do (especially someone with a degree in software): testing.
Software testing became my career for the next decade. First at Microsoft (as a contractor), then at many different companies: Kelley Blue Book, DirecTV, Nike and a few in between. Fortunately (I'll explain why it was a plus), it took that ten years of experience and dabbling in writing software on the side to light a fire of passion for software development. Specifically, software engineering with a holistic quality mindset.
What good is this story of mediocrity? The lesson I learned is that sometimes not having a plan is the only way to find a path forward. My extensive experience testing other peoples' code provides not only a very useful perspective now that I'm the one writing it, but also drives me to do my best work so I don't need someone else testing my work.
My uniqueness is only because I took an unplanned, sometimes painful path to where I am. Here are a few tactics to use (based on my experience) to build an undecided career.
Say 'Yes' To Most Everything, In The Beginning
This might come naturally if you have no idea what you want to do, but even if it doesn't, say 'yes'! Volunteer for projects or odd-jobs at your current position, wherever it is. You will learn something new if you accomplish something you haven't before. Better yet, you'll learn even more when you fail at it.
Later, this will evolve to more 'no' answers because you understand a lot more about what you like and what you're good at. Confidentyly declining projects in specific areas only comes from experience. How would I have known I love writing serverless software if I had never tried doing it?
Be Flexible When The Outcome Doesn't Match Expectations
Didn't finish what you started? That technology wasn't a great match for you? That's fine. Just keep searching. The great thing about working in software: there is always something else to learn or try.
I have very specific ideas about how software should be developed, but the ivory tower doesn't usually match the real world. The key is always strive for excellence, but allow for the inability of the organization, or the timeline, or your teammates to get the job done the way you envisioned. Another great thing about working with software: it is editable. Go back and change it later if you must.
Communication, Communication, Communication
In real estate, everyone says "location, location, location". Similarly, the mantra in software should be "communication, communication, communication". Everything is about how we communicate. The we is humans and machines. Time is also an important component. The perfect example is writing code. The code isn't for the machine that executes it, the code is actually for the next human who looks at it - in the future. Machines don't need our verbose code to understand what to do.
The only way I've found to create good communication skills is to always think of the audience. When you speak, or write, or draw, or present, the only reason you are doing it is to communicate something to the audience. What you say or display or write must be relevant to and understood by the audience. Otherwise it is worthless. (Hopefully my communication here is relevant to you)
No career direction? No problem.
Keep practicing these three things to generate a successful career out of indecisiveness: say 'yes' to gain experience, be flexible when you fall flat, communicate with the audience in mind.
Work hard, ask questions, and don't give up. You will find what makes you successful, satisfied, and valuable.