Wednesday, January 15, 2014

Top 10 things about software development I wish I would have learned in college

Recently a colleague of mine, Rachel Thompson, posted this on twitter:

This inspired me to gather up some thoughts about what things I wish I would have known while still in college.  If I were going to hop in my Delorean and go back in time to drop a few tips about software development to my younger self here's my top 10 tips I would give myself.

1.) Source control

I wish that I would have learned how to use source control earlier.  I truly can't believe that something as fundamental as source control is missing out of the traditional curriculum of a software developer.  It really doesn't matter which one you learn.  This will help you immediately don't wait until you graduate.  Checking in stable versions of code and documents is so valuable.  There will be times where you wish you could go back to the last point where your program was working the way you wanted it to.  Source control is a safety net. learn how to use it.  

2.) Users groups & conferences

Networking is important, start doing it now.  Users groups are a great way to introduce yourself to other people who are interested in learning and growing.  I've met some of my favorite software developers at users groups and conferences.  It’s a wonderful thing to find people who are passionate about their craft.  Consider reading the passionate programmer, run with the "A crowd", surrounding yourself with people who are excellent at their job.  It's only a matter of time before their good habits will wear off on you. 

Imagine the opposite.  Imagine that you accidentally found yourself at a really bad software development shop.  You are surrounded with people who are there to punch a time clock and collect a paycheck.  They may browse the internet more than they write software.  This sometimes actually happens.  There are some large corporations where bad developers can slip between the cracks for multiple years.  Don't their let bad habits rub off on you.  Users groups and conferences are a great way of meeting people who really care about their craft.  It's a good opportunity to keep your finger on the pulse of where the talent in your area is working.  Surround yourself with successful people and you will be successful.  

3.) Technologies learned

When I was an intern, I worked for a cable company that provided the software that would be on your cable boxes.  We wrote the software that would show you On Demand content, pay per view, and allow you to record TV shows.  The language they used is called VODScript (Video on Demand script).  Luckily, I had the good sense not to get myself tied up with a proprietary language.  Make sure that you don't get yourself mixed up in a language like that.  You don't want to pigeon hole yourself at this point of your career.

4.) Empathy

I've read somewhere that more projects fail because of people problems than technological problems.  A group of skilled engineers can typically solve most design and engineering problems.  Often times teams start to struggle when people problems start to surface themselves.  Someone once told me that they'd "rather dig a ditch with friends, than work on a great project with a bunch of assholes".  Although I don't necessarily enjoy digging ditches or physical labor, I do agree with what this quote is trying to get at. 

Respect your fellow engineer.  People you work with are only really willing to discuss things that are socially acceptable to talk about.  If you can have a safe environment to state breaking down some of those barriers, your team will grow.  You will learn to understand each other.  It's important to feel close to those that are on your team.  Odds are you will spend more time directly interacting with them than you will your significant other.  Love the people you work with.  Love what you do.  Help people share those beliefs, and make them feel safe in confiding in you and your team mates.  You cannot be successful without your team being successful.

5.) Being humble & maintaing healthy relationships

When I first started my career, I think that one of my primary objectives was to show my boss how much of a rock star that I am.  I later found that I prefer to have a coaching relationship that I have with my supervisor.  No one is perfect.  Be honest with your supervisor.  Tell them where you'd like to grow.  Ask them for their honest feedback.  It's a much healthier relationship to have a mentor/coach that you report to than trying to convince someone that you are skilled.

6.) Tech is a tool & not necessarily the hard part

If you'd read this blog much, you've known that within the last 6 months I made a semi-drastic career change.  I left my very hardware centric, .NET development shop to a Ruby/Go web shop.  I really envisioned that the technology would be the hardest part of this transition.  It's not.  The hardest part of this transition is the domain knowledge.  You can google "How do I do X in Rail" or "Best way to blah in .NET", but you cannot google for product specific things.  When you start a new job, take time to understand the domain as much as possible.  Technology is the easy part.  Internal training is expensive and time consuming.  Don't make your co-workers repeat themselves.  

7.) Being a software tester

Being a software tester (QA) is a great intro into the software development career path.   I started my career as a QA.  I interned as a QA, and spend approximately 6 months as a QA in my first professional job.  The line between a software developer and a technical skilled QA is blurring.  I'm to believe that the salaries are also similarly blurry.  If you more passionate about finding bugs in other people’s software and general breaking stuff being a QA might be a good fit for you.

8.) Practice

One of best way to become a skilled software developer is by practicing your craft.  Have you heard of Code Katas yet?  If not, it's a great way to independently improve your development skills with fun problems that are just challenging enough to stretch your.  Using katas is also a good way to learn a new language.

9.) Time management, staying focused and consuming information on demand

E-mail - Turn off e-mail notifications, they are distracting.  E-mail is typically seen as an urgent, but not important activity.  Turning off chat/e-mail is a good way to help you stay focused when you need to be productive.  Also, consider managing your e-mail with via Inbox Zero.

Blogs - Find some interesting software development blogs, and subscribe to them in an RSS feed reader.  This is a good way to consume the media that you are interested "on demand", and not necessarily whatever is trending on twitter or Facebook.  Try to not have too many blogs in your feed.  It can be intimidating when you open your feed reader and you have 100+ things to read.

Timing management - I love using the pomodoro technique while coding or performing any task that I need to stay focused on.  Not only will it help you stay focused for a small chunk of time, it's also a good way to step away from the problems that you are trying to solve.  It's surprising how many times you will come back into a programming session with a different perspective because you temporarily separated yourself from the problem.  

10.) Money Management


You spend 4-ish years in college.  There is a demand for developers out there in the world.  There is a good chance that when you graduate from college, you will be able to find a job.  Assuming that you can land your first job, you will also land your first professional paycheck.  Now what are you supposed to do with it?  What's the smart thing to do with it?  Someone once told me that it's important to spend at least 10% of the time that you do studying for your career, to spend studying financial management.  Don't make dumb decisions with your money.  You've studied long and hard for this pay off.  You will work long hours for it.  Educate yourself on financial independence, investing, and debt management.  I guarantee it's worth it.

No comments:

Post a Comment