What has to go wrong, will go wrong
In a software development process, there are always roadblocks, detours, U-Turns, poor pathways and long hopeless drives which seemingly lead no where. It happens in all kind of firms, big and small. It happens in the development in all kinds of systems, simple and complex. What has to wrong, will go wrong, and there is very little you can do to avoid it. But you can manage it well, if you are prepared. But here is the funny bit, most of your preparatory skills come with experience. So do not get upset if you do not find the IT industry the way you thought it would be. Its not a perfect world, and this walk of life is no exception.
While coders in larger and more well established institutions do not realise this, simply because they are shrouded by the proceedings of the requirement analysis and design phases too well. There needs to be a major upset in the project for the coder to actually feel it. Its only the managers who realise it first and always, as and when the shit hits the fan. I guess that is why they are managers. And that is where they are important.
While coding is fundamentally about good logic building abilities, software development is about good logical foresight. You really need to see what will go wrong even before it does. The idea is never to think of the known possibilities. It is to figure out the less obvious and make good preparations for the unexpected. Mind you i am not talking about major or minor bug fixes. I am talking about founding in the architectures and the fundamental designs of the system. I am talking about not getting the requirements correctly, or not converting them to the correct data and logic flows. There is always an element of error, which cannot be avoided, but it has to be minimized. Some of the best ways to do them is maintain modularity and flexibility in everything, right from the design to the code that you develop. Working in a startup has helped me realize this very early in my career. People do not badger about those two things with no rhyme or reason. There is good reason to it. And better you are at doing something like that, better you will do in this business of software.
Having blabbed about the IT industry and its flaws so much, let me let you in on another piece of information. The client is a greedy lazy pig! I cannot put in simpler terms. He wants more, always, than what he already has. And, he will never work hard at understanding his own demands and requirements, leave alone telling them to the person in front of him. He will sit there like the Google search engine, waiting for you to ask the right questions for him to come out with the right answers, if he is willing. Google, an artificially intelligent piece of code, is kinder in that respect.
Let me let you on the last secret of this trade. Even if you were to get a fantastic client who were to understand and convey his demands well, and you were able to get the right architectures and designs in place, and all this was followed by some fantastic coding which rarely ever produced any minor bugs (if at all), you are still liable for changes, due to the changing dynamics of the businesses for which most softwares are being developed these days, at least the money minting ones.
AT first I would curse these hurdles and crib about the imperfections with which we go about engineering software solutions. Then, right when i got stuck in my most horrible pot hole along the road to a good development process, i realized that this is where the real fun is. Its is never about how hard you hit, its about how hard you can get hit, and keep moving forward. How much you can take and keep moving forward. So take my advice, if you are stuck in one such pothole, and get up, because that is how some of the best software is written. This is the element of adventure in this career, enjoy it.