Monday, April 8, 2013

My Experiences and Guidance for Software Engineers on Beginning Your Career

Over the Easter holiday weekend recently my family was invited to a friends house to spend the day, where I was speaking with a gentleman that was about to graduate with a masters in CS. I struck up a conversation about software engineering and briefly provided some suggestions about kicking off the job hunt and career. I soon came to realize how much the information I was providing was appreciated, and guess I forget a bit about trying to get my foot in the door. I had no one offering me 1st hand advice upon leaving college in the sea of graduates all competing for jobs. Therefore I though it might be helpful to recollect and offer a fresh perspective to those starting out their professional career as a software engineer. Just remember, take the free advice for what it's worth; obviously everyone could have variations on this topic.


I have been a software engineer focused with technologies on the Microsoft stack for almost 11.5 years at the time of this writing. While by no means I'm a 30 year veteran of this field, I'm also no newbie to this game either. Holding (3) professional jobs in this time span has allowed me to work with a slew of diverse professionals and allowed me to soak up and experience a lot about being a software engineer too. Since my experience roughly dates to the new millennium, I feel a lot of what I have to say holds relevant today as opposed to experience from writing on a mainframe system at IBM in 1984. Not that it doesn't hold water, but most of the technologies used on day 1 of my professional career are still widely used today.

Here is a list of advice I compiled for new software engineer professionals that I thought might help you get started on the right path. It's not inclusive of every fine grained detail, but it should be enough to get you on your way to your 1st job.


Advice #1: Gain experience early. If at all possible try to get an internship doing some actual coding. I was not able to do this but it will pay dividends for not only the experience but the networking connections you will have made. Depending on where you are going to school this might not be possible if there are no jobs or internships in the area. Don't worry it's not a show stopper as evidence by my own experience but it helps.


Advice #2: Stick to your guns. If at all possible, make sure your 1st professional job is one in a true programming / software engineering role. I've met many of people wanting to take a shortcut into getting 'experience' and went the role of a Helpdesk or Support Engineer. Here are folks with a degree in CS, taking phone calls on fixing Outlook. My advice, gain experience coding and don't pick the wrong fork in the road down a different path in the IT world. This again assuming you want to be a software engineer. When I graduated the '.com bust' had just occurred and programming jobs were tough to come by if you did not have experience. At the time I was working at Blockbuster Video as an assistant manager and did not have the help of any internship or the like on my resume. Essentially there was nothing computer related attached to me other than my degree. I was told at one point to take any job that can get the work 'computer' on the resume. Even if that meant plugging in computer in an office. I would have gone down this path but what a mistake that would have been. Stick to your guns and get your foot in the door with a programming job and settle for nothing less if at all possible. It's a slippery slope if you start down the wrong path and try to unwind that new experience after a few years to get back into software engineering.


Advice #3: Build your profile. So there are a few key online sites that seem to circulate in the community when looking for jobs or researching someones public background. The biggest one for professional use is probably LinkedIn. I didn't use it for years as I misunderstood it's use and didn't see it catching on well. However I've seen it gain momentum in the last several years. Get your complete profile built and begin to network by adding known contacts. However, LinkedIn is not Facebook. This is a professional networking site. I would say 95% of my contacts are in the field of software engineering. I have a few family members and friends in non-related fields but I keep this to a minimum. If you want friends for social networking use Facebook. If you are building a professional profile use LinkedIn. Heck, if you are a software engineer in the industry feel free to connect with me if you wish (see: LinkedIn Profile). You can also get 20 connections out of the gate if you accept requests from recruiters.  Just be careful not to bloat your connections with too many recruiters as they act like computer viruses that spread to your other contacts so they can build a portfolio and get their take on landing someone a job. A quick note on professional recruiters - later in your career you might be able to fly solo on job searches because of experience, but recruiters can be a valuable resource early in your career. There motive is to get you a job so they can make money. They almost act as your personal agent, trying very hard to find you a job. They do not cost anything, so feel free to reach out to a few. It will not be long before your name is in a dozen databases and you are getting several callas and emails about job positions.


Advice #4: Get your resume online. Best site for software engineering jobs IMO: Dice.com. Followed behind this I like Monster.com. (There is also Stack Overflow careers, but I believe it's by invitation only. In the future, consider getting a Stack Overflow account, and begin building reputation to get an invitation to this site as well.) Both Dice and Monster have search agents that you can set up that will send you emails of new jobs in search areas and locations you specify (i.e. Orlando, FL .NET Software Engineering Jobs). Let the results come to you rather than constantly pulling them. You can fine tune the search agents so you do not get bombarded with Senior level positions requiring 10 years of experience. Jump on the opportunity to be the 1st to send in your application and resume for new positions. Believe it or not, many companies will look to fill positions where a tenured employee has just left and a replacement is needed quickly. Remember the old saying, "the early bird gets the worm". Looking around at jobs on these sites will help you get a feel of requirements, salary, location, etc. Be forewarned that filling out all of the information on these sites is time consuming, so be prepared to set aside some time. However the effort could pay dividends in getting that job you desire.


Advice #5: Get formal and take the interviewing process seriously. Look like something the cat dragged in right out of a few too many parties in college or with friends? Get cleaned up and dust off that old suit (or go and get one). The competition will be stiff for those entry level positions, so take interviewing seriously. Sometimes making the right 1st impression can make all of the difference between (2) similar candidates. I know because I have assisted with interviewing candidates over the years. Interviewing is a presentation of the most formal version of 'you'. This is no time for t-shirts, feet on the table, and over confidence. Things like firm hand shakes, eye contact, cleanliness, speaking well (notice I didn't say 'speaking good?' If you think that's appropriate pick up a remedial English book), sending thank you follow-up emails, and being respectful and appreciative go a long way to landing you a job. Obviously there is still the technical aspect and depth of your skills which is important too, but you might be surprised how many companies look for 'the right fit to the team' being as important or more than the skills. I've heard time and time again about how it's possible to grow someone's skills, but it's extremely challenging to work with a know-it-all with a difficult personality. Bottom line, bring your 'A' game to interviews with a smile, be personable and presentable. At the end of the day you are selling yourself to the company and need to prove why they should hire you.


Advice #6: Cramming for an interview or job skill is not taboo. Want to know which comment I made that helped me get my 1st job as a programmer? I told the interviewer (and soon to be my 1st boss) the following as a response to "Do you know Microsoft Access (VBA)?": "No, I did not use it in college as we were mostly working on a Unix platform, but I understand the mechanics and basics of software engineering. It just a matter of syntactical differences between languages, but I understand the concepts well." Two things at play here; one I showed that I was not taught 'applied programming' as many in fields like MIS majors are. They might be taught VB.NET as applied in business, but couldn't explain thing 1 about databases, architecture, structure, or mechanics of building applications. Good Great engineers will not rely on a single language as their understanding but rather understand software engineering as a whole. The second thing at play was that come time for day 1 at that job, I was going to know better about Microsoft Access. I remember New Years eve 2001, skipping a vacation with my fiancĂ©, I spent reading a book on Access 2000 (which I still have to this day) as part of a multi-week cram on learning a new technology. Know what, by the time I went through my interviews, landed the job, and began the job, I hit the ground running. Putting in this effort, not only will bring you up to speed on a technology, but it displays the type of passion desired by both parties to land the job. Lesson here, be prepared to on board new technology for either the interview process or new job and don't expect the employer to give you gobs of time to learn it; that's your job.


Advice #7: Gravitate toward the best at your 1st job. There is a reason we have 2 ears and only 1 mouth. Do yourself a favor and learn as much as you can from the seasoned professionals once you being your job. Don't overburden them, but soak up as much from them as you can. If you show respect, there are likely to open the door for you to ask even more questions  I had the privilege of being around many seasoned professionals in my 1st job that were heavy into OO programming. I was carved from that block and is at the root of my DNA as a developer. These folks will help you move along in your career quickly as opposed to you trying to figure out everything on your own.


Advice #8: Make a conscious decision on technology path. One of the reasons I have been mildly successful in my career is because I have stuck with the Microsoft stack of technologies in programming since day 1. If you already have a passion for Java vs. .NET vs. something lower level like C++ then you might want to focus in on jobs in the technology / languages of your choice. However if the job market is competitive or tight you might not have a choice. Changing technology directions during your careen is analogous to switching majors in college. It can be done but can also be a set back. If you go from Java to VB.NET it's not impossible (remember the advice from #6, it's just another language), however there are realities once you go down a path that you become familiar with that might be non-existent in other languages. For example if you were a Silverlight developer in 08',09' and moved to be a Java developer, not much of the applied learning would transfer. Sure you have a deeper understanding of rich client web applications but the Silverlight knowledge would not have transferred. If you are looking for longer term success in the 1st 5-10 years of your career, your best bet would be to dig in and become deep at the technology stack you selected and enjoy.


Advice #9: Make a conscious decision on company type. Most of my career has been in the 'Corporate America' atmosphere and I think it has a lot of advantages. To list some: good benefits, larger companies, larger pool of talent to learn from, growth opportunities, job security, and project variety are some of the advantages. I have moved from doing a lot of internal custom development, to working for a public software company. There are other lines of development like government, gaming, hardware and start-ups.  The latter sentence I have no experience with and only a working knowledge through what I read and what I have heard through those I know. I have found that in the government / military work as well in the gaming industry there is large need for low level development in languages like C++. Start-ups are another animal all together. I've heard they pay well, but in return you will probably work a lot of hours, and not afford a great sense of job security. This is because a lot of start-ups are funded by project from various sources. If the project is a failure, funding may stop and people could loose their jobs. If the project is a big hit, the company might get acquired and layoffs occur through duplication of effort by 2 combined companies. However, this environment is typically fast paced and you have the potential to learn a lot. Hopefully if the unfortunate deal arises and you loose your job, you will know you didn't loose the biggest asset which was the byproduct of those projects you worked on and the gained knowledge.


Advice #10: Play the role of grunt and then move on. Don't expect to be writing the next new Xbox game as the lead of your team from day 1 on the job. Odds are you will not work on new development as a junior developer. This is normal and a good thing. You will more than likely inherit either a legacy application to maintain or be placed on a larger team in a supporting role. Either way you will be able to look at existing code (be prepared because it may not have been well written  but this is a part of the growing process) and gain experience in your new work environment. The natural progression for most professionals is the following: get your 1st job, kick a$$ for 3-5 years, learn a lot, and make a maneuver for a new job. Odds are you will make a 10-30% pay increase from job 1 to 2. The problem is job 1 will likely look at you as "John the entry level programmer we got out of college", where as job 2 will look at you as "the experienced mid-level .NET guy with 5 years experience at a large company." I read a book about 10 years ago that spoke to this exact point but for the life of me can't remember the title. I'm not advocating for job hopping if your happy. However be careful not to get stuck in 1 companies or team's culture of a certain way of programming. You might be the ace at job 1 in methodology 'D', but come to find everyone else is doing methods 'A-C' and you are now overpaid for skills that are becoming obsolete. The job hop after 3-5 years is good to get a fresh perspective, new respect, and a new set of challenges. You'll be able to draw on your experiences from job 1, and now learn the new things from job 2. 


Advice 1...n: Never stop learning (hence 1...n). Want to have a great career, enjoy what you do, and be at least somewhat successful? Make sure you never stop learning new things to become a better software engineer. I have a blog post on the challenges of this (see: You Can't Know It All (YCKIA), But Keep Pursuing After It Anyway). I will not delve too deep into this point since I have written so much of its importance in the link mentioned, but I must reiterate how important it is to keep fresh with updated skills. After all there is a reasons software engineers tend to make a decent salary; it's not easy to do what we do. However I think if you get knee deep in it, the career is totally fulfilling and presents something intriguing and interesting every day.

Wrap Up: Well I could add probably another 10 suggestions but this was a brain full to digest I'm sure if you are a new or aspiring software engineer. This isn't the only path or set of circumstances as I mentioned at the beginning, but rather my collections of experience across jobs and conversations with other colleague's experiences. Feel free to comment and add any of your own thoughts as well. Last but not least, good luck in your career and welcome to the world of software engineering.