You've decided to become a Software Developer. Now what?
Some of the most common questions the WiBit.Net forum moderators are asked are questions about how to get started. I will try and help you guys out by writing down a guide based on my experience becoming a professional myself. I was once the college kid wondering about his future. What do I do? How do I do it?
Where to Start
In our Introduction to Computer Programming course we ask our viewers to answer a basic question: Am I a software developer? This question must be answered before you do anything. Do you have what it takes? This is not an inspirational question, it’s a realistic one. For example, when I was a boy I wanted to be an astronaut. I have one trait that a Space Man cannot have... I'm a big person. Not a fatty, but I'm 6 feet 5 inches tall (ok, I could lose a few pounds). Astronauts need to be much smaller. My genetic makeup (and love for beer and bar food) has predestined me to not fly space ships. Oh well! You need to be honest with yourself and truly seek the answer to this question. It is a tempting trade, especially with all the stories over the last 20 years about overnight millionaires. Even though those stories fill headlines and sell news stories, they are quite rare (about the same probability of becoming a successful actor or musician). A true developers lifestyle is far less glamorous then the Mark Zuckerberg clime to fame. Most often you will be working with teams of people on a specific portion of a project. Since team work is very common, you need to be able to handle the stress and scrutiny that comes along with this work environment. This is truly a field that you must be passionate about in order to ascend to a high level (I’ll elaborate further in a moment). Watch the first lesson in our Introduction course to get an idea of some things you need to consider before answering this very important question.
Great! You've made the decision to join the club. Congratulations! Now, let's talk about some personality traits that are useful when developing software professionally. Here at WiBit.Net we preach that "programming is not a job, it is a lifestyle." We all truly believe this creed and try to express this with everything we do on this site. If you are not fascinated by software development then the constant learning that is required will be miserable for you. Trust me when I tell you that you will constantly be learning. Technology moves quick and you can't afford to lag. The people that treat it like a job are often the ones that outdate themselves and become irrelevant. I was part of the first wave of professional developers to enter the workforce having programmed since childhood. At that time, many professional developers did not have computers growing up and were exposed to computers and technology in college. This allowed me to enter the workforce with a child like excitement and enthusiasm that opened opportunities to me very quickly. If you’ve been around a while (BTW, I’m not call you old!) then you need to be extra careful about staying current because the kids entering the workforce now were very young children when Java came out! The most important trait you must have is to stay excitable and passionate about software development. Other traits that will give you opportunities are:
Willingness to be wrong
This is something that Bryan, Jason, and I struggle with sometimes, ha ha! A lot of "hot shot" youngins out of college have a cocky attitude. A lot of veterans have a "I know what I'm doing, so shut the f*** up" attitude. Both are wrong. Young guys can learn a lot from the vets and vice versa. It's important to accept criticism and be willing to accept others views as correct. Being wrong is the only way to strive to being right. The workforce is so different from college. In fact, you will learn more at your first job then you did all those years in college. Accept being wrong as an inevitability and always be willing to change your point-of-view (even if only for selected projects).
Ability to "think outside the box"
How cliché is this? Well, as corny as it sounds, it is as true as the Earth is round. There are different types of professional developers. One common kind is what I call a "copy and paste" coder (or “Copy and Paster” for short). These are people that can only write software if the solution already exists. All they need to do is take the code from somewhere else and apply it to their code. In many cases these people seek entire code files containing what they need and make minor tweaks for their specific purpose. There is a need for these people, but they are often the ones stuck in a dead end position. It's great that they can research and quickly solve a programming problem (the open source philosophy, in part, attempts to reduce duplicate efforts). Developers do very often post their code on web sites specifically to offer it to anyone that needs it. Many of these “Copy and Pasters” have the view of "if a wheel already exists then why reinvent it?" I totally agree with this view. I begin to astray from this style of thinking when a more complex problem arises. What do you do if a wheel doesn't exist yet? You need to possess the skills to conceive a wheel, get others to understand and accept your idea, and build one! That sounds easy, but it's not. This requires another class of developer. I call these guys the "rock stars." This is the developer that has no fear when presented with a problem. The last thing that comes to mind is "we can't do this." These are the guys that get it done. These are also the guys that are difficult or impossible to replace. Therefore, you should always be willing to accept anything as possible and deliver the solution in as simple of a form as possible. Step out of where you feel comfortable and explore! It is very important to strike a balance between "Copy and Paster" and "Rock Star". Some code is horribly over engineered because a "rock star" chose to do it their way; even though a solution already existed that did the same thing. If you are a rock star, just make sure that you have a tad of humility and common sense. Some rock starts don’t trust code they didn’t write themselves (guilty). I sometimes have a view of externally or third party developed code as jagged and difficult to integrate with my code. Throughout my over a decade as a professional developer I have been victimized by horrible external API’s (memory leaks, poor performance, yada yada); therefore I understand that not all externally developed code is worth a s***… but it is a good idea to give it a good solid objective review before formulating an opinion.
Programming is a profession that is filled with heartache. It is common to spend days, weeks, months, heck even years working on code and determine that it is a worthless pile of crap. It is also common to fail many many times before scoring a victory. Our Introduction to Computer Programming lesson “Am I a Software Developer?” states that “Not every day is a victory”. If you’ve programmed a while this is one of the most truthful statements you’ve probably heard. This is normal, so don't let it deter you. The difference between a "copy and paste coder" and a "rock star" is determination to solve the problem no matter what. A copy and paster will seek others to solve the problem for them and a rock star will sit down until their eyes bleed and their fingers swell to get the problem solved. If the code you've been working on for 3 weeks is turning into junk, then scrap it and work as hard as you can to get it right and on time. If you can't solve a problem, leave it alone and come back to it later. If you find that you can’t solve it then lean on others for help. Again, a Copy and Paster goes to other first, a Rock Star only gets help when they are defeated (ha ha ha), thus the Rock Star actually learns a lesson becoming stronger and more powerful and the Copy and Paster goes right back to screwing off on Facebook.
When you are so emotionally invested in an activity it is hard to stay calm. Next to programming, one of the most stressful things for me is following my horrible NFL team. I've been waiting for the Washington Redskins to build a consistent winning team for 20 years! Haha! They test my patience every single year!!!! It’s tough knowing that they are out of the playoff hunt every year before the half way point. Development can often be just as frustrating. When you are struggling with a problem just make sure that you stay confident in yourself. Frustration often leads to short sighted decisions that turn out awful (DAN SNYDER). Keep a cool head and don't over stress yourself.
It is common for developers to work with a team. These teams can take many forms. You may work in an office building surrounded by your teammates. Some of your teammates may work from home or be located in different countries. You may work from home and all of your teammates do also. It is important, no matter what set up your team has, that you are a "team player." It is important to compromise and be sensitive to others roles. If you're developing an app and someone wants to use one framework and you think it's better to develop it using another framework then make sure that you are capable of building a convincing case for your preference. If you are out voted, suck it up and take it. There is nothing worse than the "I told you so" guy or the "I didn't get my way so I'm going to pout all the time" guy (BTW, this is not directed at anyone specifically that I work with, ha ha). Not every disagreement ends in a victory, and just as it is with any successful relationship, you give some you take some.
One Person Gang
Didn't I just talk about the importance of team work? Then why is it important to be a "one person gang"? One thing that is important to understand is that software development is a business. You are being paid to write code that solves problems in the spirit of either saving or making money. It is not charity work (unless you work for the Government). Because of this, business people will find creative ways to maximize their development budget. This may mean that you are working multiple high priority projects at once, or you are expected to work directly with customers, etc. Business minded people are focused on doing more with less. It is common for development teams to be short staffed. The attitude from senior management is often: tough s***, get it done. This means you need to be your own time budgeter, record keeper, document writer, mentor to new staff, and all that crazy crap. Short staffed development teams are often a result of either financial constraints or inability to find the skills needed to fill vacant positions.
Have a Personality
One thing to always remember is that in many cases (probably the majority) the users of technology are not technologically savvy. They want to press a button and have it do what it is supposed to do. When this doesn’t happen the user gets upset and sometimes this experience could cause the user to despise the company (or person) that made the product. The thing that sucks is this one upset user could affect you or your company’s business relationship with this client forever. Since no software is perfect and problems are inevitable, it helps to have a personality. People like working with people that treat them well, especially customers and end users. It is not acceptable in many work environments to have no people skills anymore. I see it more and more where engineers are working directly with customers, which was practically taboo years ago. Remember in the movie Office Space there was the non-technical guy who took the specs from the customers (via a fax) and physically (via his secretary) took them to the Engineers? That doesn’t happen anymore in a lot of places. Engineers and technical staff are meeting with clients more than ever. As you could imagine, there are a lot of benefits to this tactic. Who is better than the technical staff to answer customer’s technical questions? If no technical people are present then the sales guy would constantly have to say “I’ll check with the developers and get back to you,” which is unacceptable now-a-days. Since people are so accustomed to working with technology their expectations are higher than ever. People want it, they want it now, and they want it to be perfect. If you have technical and personal skills they you are a double threat! I believe that as the world becomes more impersonal (due to the extensive use of technology) many people are longing for a more personal interaction that reassures them the technology they use was created by a “real person”. When they see that you have a pleasant personality it will give them more confidence in you as a creator of technology. Having this relationship removes or reduces the “intimidation factor” which (I believe) is the cause of many people distrusting technology. Always be cordial and accessible to your clients (customers, end users, whatever you call them). This pays off many times over.
Now that you have a general idea of how to adjust your personality we will tackle the issue of education. Software development is such a results driven field that you can spot many people that never went to or never completed college succeeding just fine. I would suggest that you don't use these people as a role model but rather as inspiration. If you kick ass you have nothing to worry about. I would absolutely suggest that you get a college degree because it will likely help you later. Programmers, like everyone else, age and some companies are youth focused. There are some companies that regularly push out older people and recruit fresh meat right out of school. They can pay the young guys less and work them much harder because they are so eager to build a career. Young programmers often have less life responsibility (no spouse and no children) and therefore they can be used to focus 100% on their work. If you are laid off it is important to carry a college degree in your arsenal. Now that I've frightened you, let me tackle some questions that I am asked a lot:
Do I need a degree to be a software developer?
No. But, do yourself a favor, be smart and get one. Remember that life exists after your 20's and you do need to plan for years down the road.
Which degree should I get?
I'm always asked this: "Should I get an Information Systems or Computer Science degree?" I always answer with: "Well, what do you want to do?" It's so true! You need to define what you want before answering this question. You can absolutely make it as a developer with a CIS degree. Having said that, I recommend that you bite the bullet and go Computer Science. You will learn so much more about what you're doing and the machines you'll work with. CS also gets more into the engineering side of programming. Many curriculums require basic electrical engineering, higher math requirements, computer networking and security. This information makes you a more well-rounded developer. Most job listings I encounter ask for CS degrees. The ones that ask for both will often have CS mentioned first, which means it is preferred. If you aspire to become a professional software developer or engineer or architect then get a Computer Science degree.
Do I need advanced math skills to program?
For the most part, no. I say this, however, with a huge BUT that follows. You can get along with only basic algebra skills. BUT it depends on the industry you get into. If you are writing software for NASA or some Jet Propulsion Lab then your calculus skills better be good! The most important thing that math buys you in software programming is problem solving skills. Math is often an exercise in problem solving. Much of calculus isn't hard if you know how to apply certain techniques. Programming is the exact same. Try to think of a chess game. If you were tasked with developing an Artificial Intelligence algorithm for a computerized chess game you need to design clever and smart process flows. Again, it's not hard, but it is quite intricate. Your math skills will help you break this problem apart and apply your skills to attack each portion. So, bluntly, learn your math as best as you can with the understanding that there is a good chance you may never use it. If nothing else, at least you can help your kid in advanced math classes in the future ha ha!
What other school subjects will help me evolve into an elite developer?
Besides math, I believe that business is a good counterpart. If you can understand and demonstrate the business implications of your software projects then you are so valuable! It's not enough to know the documented software requirements. You need to know what business purpose it is being applied in so that you can make the best product possible. Also understanding how your own organization works is important too. Management does not always do a good job at telling you what is important. You are sometimes responsible for figuring that stuff out. With basic business education you have a better grasp of timelines, project management, budgets, and all that stuff. Remember, it is important to be a "one person gang" and your business understanding may come in handy when promotions are up for grabs.
Is the college I attend important?
Yea and no. Some companies are stupid enough to buy into reputations of colleges. I, for one, think this is totally stupid. I've met some dumbasses that came from prestigious institutions and some super talented people from "mom & pop" schools. I am of the belief that your skills will speak for themselves. If you interview well, you will be given a shot. Focus more on what you're learning over where you're learning it. To be honest, you may learn more from WiBit.Net then from some expensive colleges. Keep that in mind.
What activities in college should I engage in?
It is sometimes hard to work and go to school. I always tell people that school activities are a good substitute to work experience. Many colleges will offer intern programs to work on projects either with the school or an outside company. Colleges also offer teacher and lab assistant programs. Take advantage of this stuff as much as you can. My college internship was the most valuable addition to my resume when I was first looking for a job out of college.
What is more important: work experience or college education?
Tough question. Sometimes it's one, sometimes it's the other. You are going to get a different answer based on who you ask. I personally believe that what you know is the most important thing. A person passionate about programming that is a self learner and stays up to date is sometimes more valuable than a college graduate. A person in a high position once told me "college can't teach you passion." This is such a true statement. A successful demonstration of passion and relevant work experience will take you so much farther than accolades. I remember being part of a job Interview where a recruit came to us with two pages of education on their resume. They had degree after degree blah blah. The fact was that this person was almost 30 and had never worked a real job. This person over educated themself. They wanted too much money for a person that has never worked on a real project before. Many managers for software developers are very aware of how different the education of programming is compared to the real deal. While you are educating yourself, please get experience!!! No one wants someone that thinks they're smart but can't prove they have what it takes to compete in the business.
While you are being educated it is a great idea to take a look at the different industries that employ software developers. There are many companies that facilitate as "development shops" and write many different applications for multiple industries; however, even in these types of operations there are people that have industry expertise. Try to seek an industry that peaks your interest and start learning about it. A programmer working for automotive companies will need to specialize in different topics than a programmer in health care. Even though a lot of programming is similar, industry specializations are useful. Also, once you go through the process of learning a specific industry you know how to do it again if you decide to switch.
If you talk with a real estate agent about the price of property the first thing you learn is "Location! Location! Location!" Job opportunities are sort of similar. There are areas that are more lucrative than others for software developers. There are also areas where specific industries are more prevalent. You may be from an area where the economics do not cater to software development, and therefore you must go elsewhere to establish yourself. One really cool thing about this profession is that some companies are liberal about work schedules. Some places only require that you are in the office occasionally and the majority of the time you work from a home office. If you score a gig this sweet you can move somewhere where the cost of living is lower and collect a good paycheck! These types of freedoms are more likely available to established programmers so don't expect this at the start.
Try to find specific companies within your industry of choice. Do some research about them, find financial records, learn who the executives are, learn all you can about their products and/or services. After collecting this information then study it. This may shy you away from specific places or make you more interested in others. This information is also useful in the Interview. If you can find ways to insert the knowledge you've learned casually (not forced) you may impress someone. I've seen Interviews where opening questions like "So, what do you know about this company?" were asked. An interviewee that replies with "uhhhh, nothing" doesn't look as good as one that is able to articulate relevant information about the company's business. Keep in mind that you should try not to be all that picky on your first job venture, within reason obviously. If you read an article that makes the company look like Enron Jr. then use your judgment. The first job is to establish yourself. I don't think it's very common now-a-days to get a job out of college and stay there until you retire. Get your feet in the door, get real work experience and reevaluate later. Be sure to follow all job application protocols, which are often available on the company website or through recruitment firms. Finding a "head hunter" to locate opportunities for you is not a bad thing either. Just remember they take a commission (which your company will have to pay). One benefit of using a head hunter is that they will sometimes get paid a commission that is a percentage of your first year salary. This gives them an incentive to get you the highest starting salary they can.
After you lined up all the companies to target, applied for jobs and received interview appointments you are getting a lot closer to landing your opportunity. Interviews are very frightening sometimes. A lot of places make interviews scary on purpose in an attempt to weed people out. Don't fall for that stuff. Be confident in your skills, let your resume do the talking and be ready to answer questions with confidence. Always be honest. If you don't know something then just say so. If an employer likes you and you can show relevant skills and a determination to learn they will be more willing to send you out for training. Maintain eye contact throughout. Make sure that you act like yourself. Ok, well a professional version of yourself. You don't want to fart at anytime during the interview, or anything. Be polite and respectful but not overly cordial. Refrain from using pleasantries like Sir and Ma'am (it just shows that you're a kiss ass). Be confident and concise. Have faith in yourself.
It is important to follow up immediately after an interview. Many people simply write an email thanking the company for the opportunity and that sort of thing. The main thing I have learned about this portion of the process is that time lapsed doesn't mean anything. What I mean is if you don't hear back after a few weeks it could mean you are out of the running or you may still have a shot. I actually received a job offer almost a year after an interview before. I turned it down cause I already accepted a position elsewhere, but that kind of stuff happens. Make sure that you are persistent about the job, but try to know when you're defeated. People that are overly persistent, believe it or not, can actually gain a reputation for being annoying that can spread across companies (especially in the same industry). Even if you have a good feeling about the interview still keep trying at other places. The first thing to keep in mind about a good interview is that the interviewer may just be acting nice and you have no shot. Sometimes they have already made up their mind but keep interviewing people to satisfy HR and federal rules. Another thing to make sure that you leverage delicately is multiple offers. You may be given an offer at the second job you interviewed for and the first company extends an offer to you. Now you have a chance to request a counter offer from the first company to exceed your second company's offer. It may work, it may not. Just be careful when handling counter offer situations. Don't burn bridges and be very modest about the situation. Always make the company that you do no choose feels good about the situation because you never know if they will keep you in mind for opportunities later.
OK. Now you got the job! Now what do you do? WORK YOUR ASS OFF!!! Make everyone at WiBit.Net proud of you!
I hope this blog was useful to any of you younger guys and gals venturing out into the field. Remember to be confident, stay current, share (or develop) your glowing personality, and write some bad ass programs!