It's been about a month since I've started working as a junior programmer. This is hardly a position to be giving advice from, so I'm not going to try and do that. I thought I'd share my experiences of going into the world of software development. Every company is different, and different countries also have different ways of approaching the same industry.
Theory from University really does help
When you dive head-first into a massive enterprise system, it's a lot easier to orientate yourself in the codebase if you have a solid theoretical background. I think that having studied a Computer Science degree really opens you up to some recurring patterns. These patterns can occur on many levels such as on an architectural level, a class level (think GoF Design Patterns) and at a lower code level.
If you're familiar with design patterns, the way things fit together will seem a lot more intuitive because each design pattern has a specific intent or class of problem that it addresses. This obviously assumes design patterns are used, but good verbose naming convention and standard patterns can go a long way towards making sense of a couple of hundred thousand lines of code. In the end, the structure "lifts" itself off the code a lot easier, and you start seeing repeated patterns instead of ad-hoc technical code.
This is a pretty fundamental benefit of using Design Patterns in the first place, but I find that having being forced to study and implement patterns in University just makes things easier.
Having worked with different architectural patterns also makes a big difference. Rather than knowing the intricacies of a certain set of technologies, you learn to picture things on a higher level. Being able to visualize a high-level process flow through a system is a lot easier if you're used to working with systems at that level of abstraction.
Other coding theory like the principles of decoupling, encapsulation, contracts, separation of concerns and all that other good stuff is great to know because you can recognize it easier if you've studied it. You can also tell when it's not being used, try and figure out why.
Knowing how different data structures work will give you a lot more intuitive knowledge when you see them being used in practice. The very act of using a specific data structure or code pattern signals a certain intent in a thought process, and if you have shared that thought process before it's a lot easier to get "into" a codebase.
This is all drilled into you while you're studying, but once you get thrown into the largest codebase you've ever worked on, in a language you've never worked with, using a technology stack you've never heard of, the initial "holy shit!" phase passes a lot faster if you have a solid theoretical background to fall back onto.
But University isn't everything
It's hard to keep track of what you learn and where, because your knowledge grows very organically as new connections between existing topics get made, but I think that if you were to just study a Computer Science degree, and aim for a pass on every test, assignment and exam, you just won't survive in any sort of competitive environment that focuses on quality.
University assignments usually test a specific concept, and how you actually go about coding isn't usually taken that seriously. People can write absolutely terrible code, but if their assignment does what it's meant to, it's usually "good enough". I strongly believe that programming ability strongly depends on your mindset and attitude towards programming itself above and beyond any theoretical and practical knowledge you pick up along the way.
If you don't have the dedication to sit for a couple of days seriously thinking about the best approach to solving a certain problem, or not giving up until you've found the root cause of a hard-to-replicate bug, or refactoring and pruning your code until it meets your personal standard, you just won't enjoy programming in the long run.
There's something absolutely magical about programming that is much more than just creating business value for some corporate. On an abstract level, reasoning about code, it's structure, and the logical-physical mapping between an abstract system and it's final physical manifestation is an absolutely rewarding process, like doing mental acrobatics in a world where the rules are rigid but what you do with them is almost limitless. Personally I think that unless you find that for yourself, outside of your degree, and carry that into your degree and into your job, you're just missing out.
A degree isn't enough, you need a good attitude to really stick with it and make your job worthwhile.
It's a bit like having bipolar disorder
One of my team-members recently described a programming job as having bipolar. You get really good happy days, and you get really bad, not-so-happy days. The happy days make the job more than worthwhile, but you have to learn to get through the bad days too.
The general consensus seems to be, "bug fixing is shit work". Everyone wants to be involved in getting an awesome design down for the next feature or writing some awesome technical (non-business) code plumbing that uses some cool language feature to magically make future work simpler and cleaner. No-one wants to go around fixing typos, fixing business formulas, doing integration with poor custom file formats. But it has to be done.
I think it takes a certain type of mindset to be able to stick with the not-so-happy work in the short term to get a shot at the happy-work in the long term. If writing an awesome piece of code, being proud of it, taking ownership of it and seeing it in action doesn't give you a kick, the unhappy work will probably have you dreading your trip to work every morning.
There is cool technical work, and then there is not-so-cool business-oriented work. I'm a coding junky. I love making code work in clean and elegant ways a lot more than I love the thought of a manager making key decisions based on the report I just wrote. The thought of pushing a system to its limits and seeing the effects of analyzing and tweaking a design -- all the invisible stuff like making sure a system can push thousands of transactions a second and not fall over and know why, that is what programming is about for me. Some projects have the one (imaging writing the Apache webserver), some projects have none (imagine VB CRUD and reporting), and some projects have a bit of both in order to be successful.
It's hard work, but University can actually be harder
When you leave work, you're done. You could choose to stop thinking about the problem and go again the next day. At University, you always have an assignment to finish. Not an assignment, a ton of assignments. People just have more respect for your time at work than they do at University. Oh, and your time is worth something.
I think it's important to believe in yourself and know that you are entering the working world with a solid foundation. Obviously as a junior you don't have a lot of experience, but people recognize that and will always be willing to help you out. If they aren't, find somewhere else to work, you probably won't improve very quickly.
I've been trying my best to find a balance between recognizing my position at the bottom (as a Junior) but having confidence in my skills and knowledge when tackling new problems. Show respect to others and they should show respect to you. Then even if a problem is really difficult, if you approach it with maturity and ask for some guidance you should be able to grow in leaps and bounds.
It's a lot nicer than having to graft long evenings for a synthetic result.
Your co-workers are smart and can teach you a lot
Part of work is getting the job done, but the other part is about growing as a person. If you constantly engage with your co-workers, ask them about what they're working on, discuss ideas with them, listen to their conversations, try understand, ask for advice and just take the effort to listen to what they have to say, you should soon realize just how much you can actually learn on an "average" work day.
Once again, I feel that this becomes a lot easier if you have a solid background from University. It's easier to engage on common ground if you are familiar with terms and concepts.
I am fortunate enough to work in an environment with some really, really smart people that are both highly qualified theoretically and also have massive industry experience. This is probably worth a lot more than a slight bump in your salary at this point, because if you grow enough your salary will probably take care of itself.
Having a salary is great
To be honest, I sometimes forget that I'm actually getting payed. I think this has a lot to do with being in the education system for 15 years solid, but if you're too busy being involved with what you're doing to remember to check the clock tick by and do some head-maths as to how much you just earned, you should be OK and enjoy your job methinks. This is probably more just a by-product of this being my first serious job, but I think the word "serious" pretty much sums it up. It can be a high pressure environment and working successfully is very rewarding, but getting payed just makes it sweeter.
But it isn't everything
Some advice that I got from a team-member is that at the early stages of the game - don't worry about salary. Worry about focusing on your personal growth, knowledge and career. Read books. Engage with co-workers. Do research. Do training. Get smarter. Get stronger. Then the rest will take care of itself.
I do actually agree with it. One of the main attractions of my current position was the fact that I can work on some serious enterprise software in an environment where I still do training to bridge the University-Industry gap, and work with a mentor to help get into things. I only found out about the salary after I decided to sign up, because I personally think that it's a very valuable opportunity that's absolutely worth more than a slight salary bump in the bottom-bracket.
Overall, work has been very rewarding. I'm doing my Honours in Computer Science part-time and working full-time, so it's definitely been exhausting, but it's a great feeling to finally be working in the industry that I've been growing into for the last couple of years.
I feel pretty privileged to have a passion for programming that translates so well into a rewarding work environment.