What recent computer science graduate should know.

Many many years ago when I landed my first coding job, I was amazed at how different working in a software development shop was different from what I had pictured in my mind. At that time, I did not even graduated yet, I was in need of money and it seemed like a great opportunity so I took the job. While driving to my new place of employment for the first time, I was running some scenarios in my head, trying to remember some tested and true algorithms, thinking of whole bunch of technical things that might help me impress my then new boss; what came as a complete surprise to me was the fact that I had no idea what the work was about.
After couple of weeks, I began to realize that many things that were part of my job were not covered in school at all. I can’t really blame school for that, after all they were trying to give me as much information as they could about technical aspects – languages, algorithms and all that jazz, I myself had failed to learn the truth about real time work of a coder, and I did have opportunities to do so. Later on when I became a manager and was interviewing people for coding positions, I realized that I was not unique in this lack of knowledge. Most of the recent graduates were in the same boat that I was in years ago.
That time had passed, I learned a great deal from working on different development teams, I could probably be called a veteran of the game called software development, and today I wanted to post about things that I think any recent graduate should educate himself on:
- Time Management.
- Ability to produce accurate estimates
- Ability to write technical documentation.
- Dealing with customers – when times are good and bad.
- Dealing with co-workers in conflict situations.
- Learning is an ongoing process when coding
Lets look at those a bit closer:
Time Management
Time management in my opinion is the most important skill a developer can have. I would also add self discipline to this since the two are related. It is just too easy to get distracted by things that are not really work – after all internet is right there. Another point is getting way too involved in your project, spending way too much time on tasks that are not really that important. It is business first, and we are all on a dead line. Other people’s deadline is depended on you most of the time as well. One of the biggest time wasters in my life is email. I get tons of messages a day, most of those need to be answered. Most of my clients / co-workers expected me to get to that right away, well guess what? That does not happen. I am answering my emails at 10 am and at 4 pm. If its urgent, people can call me, if they don’t know my phone number, then most likely it is not urgent. It took a while to convince by boss and my client that this is the best approach to my time. This works for me, I can’t guarantee that it will work for everyone.
Estimates
What happens most of the time is my boss tells me to code something – a feature, application, you name it. He wants to know how soon can this be done. In turn I go to coders and ask them – how long would it take you to do this? Most of the coders are not able to give me an accurate estimate – and I can understand it – things happen, but could you be at least close? I can understand if you are off by couple of weeks – my estimate will allow for that, but when you are off by month, that makes me look stupid, and guess who will look stupid next?
Technical Documentation
One of the things developers hate is to write tech documents – manuals, reports you name it. But despite all that, you still are going to do it. Hopefully it will not develop into full time job for you, unless you want it to. I am not a big fan of doing it, but trust me, on top of what developers do, I actually write proposals, analysis papers, reports of various types and so on. It is a bit of a challenge for me, since English is not my first or even second language. So many times I had seen a talented coders who can’t write – and believe me, it creates a negative impression which should not be your goal here.
Dealing with customers
Let’s hope that in your career you will never have to speak to a pissed off customer. We can hope all we want, but it will happen sooner or later. If I had a penny for every time customer yelled at me, I would have a truck load of pennies by now. I am not even going to mention a situation where a client demanded that I had to buy lunch for his entire team simply because my plane was delayed. I had customers tell me stuff like : “So it can’t do X, then your software is shit”. Which was especially frustrated, because no sane person wold do X. In all fairness, this is a way users respond to what we code, and we can’t possibly please everyone. What I find even more frustrating is when customers do have issues, but won’t tell you anything and then the time to renew the contract is approaching and all of a sudden they don’t want to continue. Feedback is good for you, even when it comes in a form of a pissed off customer. Feedback is good because it will not only tell you what customers really want, but what your software is doing right. I am not saying that you have to fold every time customer has something uncomfortable up his butt, you have to learn how to hold your ground and compromise if compromise is possible.
Dealing with co-workers
Most likely you won’t be working by yourself. You will be in a team which would consist of several coders. Most of us have our own personalities, favorite approaches, opinions and so on. There are going to be conflicts and you will have to deal with it. Conflicts are not necessary bad – at times it is the best way of solving difficult problems with features or code. Listen, argue if you believe that you are right, but don’t start getting personal – keep in mind if the conflict is geared towards solving a coding issue, this is what you want to do. If the conflict is about issues that are on a personal level – stay out of it.
Learning
The industry is constantly changing, there are new things coming out every day, you should be on top of the things that affect your work. Read blogs, join a social network geared towards developers (dZone comes to mind) get yourself a mentor if you can, trust me, it will pay off. Here is an example from my previous job – one guy just did not care, he did what he supposed to do, no learning, no progress. The rest of the team would get raises every year, this guy – well, he did not. Despite the fact that he was there longer then almost everyone else, his pay was the lowest on a team. I was managing the team and tried to convince him that learning is good, he did not respond. At the end of the day, if you will not progress, your financial compensation will not progress either.
I must admit, that this is not a full list. You could probably come up with lots more, however to me this is what’s important. I would love to hear from you on what you consider vital.