Top 10 Reasons You Won’t Get The Job – Part 1

Over the years, I’ve done quite a bit of hiring and the things that people do that negatively impact their chances of getting a job are sometimes pretty astounding. I understand that you are nervous – it’s OK, we’re all human. However, there are some key mistakes that I’ve seen over and over again that I have compiled into my Top 10 Reasons You Won’t Get The Job.  Since these are kind of long, here are the first five:

10 – You Didn’t Prepare

If you have gone through the trouble of finding the job posting, writing a cover letter, submitting all of your documents, and passing a phone interview why would you not prepare for the actual in-person interview?! Before you step into that room you should have done you research on the company.  Find out their mission statement, goals, strategic objectives, position in the industry, and key operating information.  What have been their latest successes? Failures? Find out everything you can about the position.  Use networking tools like LinkedIn and GlassDoor to talk to people that already work there about the job duties, supervisor, and work environment.  You should also find out how this company likes to interview.  Is it going to just be you and a few HR and technical people?  Does this company like to bring in panels of 10? In this age of information there is absolutely no reason to go into these situations blind. There is also no bigger turn off to a hiring manager than to have you ask questions for things that would’ve been easily answered with a small amount of research.  You need to be just as interested in working for the company as you want them to be interested in hiring you.

9 – You Didn’t Sleep

So you spent the night before your interview tossing and turning in bed.  By getting yourself all worked-up and nervous, you have cheated yourself out of the rest that you needed to perform well in your interview and make a good first impression. If you have followed #10 then you should be prepared and feel confident that you can walk into your interview and have the knowledge to succeed.  If you are nervous, it’s OK!  Just take the steps needed to relax and get some sleep.  A hot shower, herbal tea, favorite movie – whatever it takes.

8 – You Show Up Late

You cannot believe the number of people I’ve had show up late to an interview! Not only does this show that you have problems with your organization skills, but it could also means that you now lack the time with your interviewer to demonstrate your skills.  Being late also means that you may become more nervous and flustered.  As if showing up late could ruin a first impression any further than now wasting the interviewer’s time with a poor interview.  Look, those of us on the hiring side of the desk understand that everyone is human.  If you are having a completely hectic day and have been faced with a flat tire, unexpected babysitter problems, or another situation that means you cannot perform at your best – call us before your interview and reschedule.  It is highly unlikely that we’re going to say no.  We want you to show us your best!

7 – You Give One Word Answers

No matter what is going on in your interview, never give one word answers. Even if the question could be answered with a yes or no, find a way to provide more detail or insight.  For example:

Interviewer: I see you worked at XYZ company for 4 years?

You: Yes

WRONG

Try phrasing things like this:

Interviewer: I see you worked at XYZ company for 4 years?

You: Yes, I started in 2010 and held two job titles during my time there. I primarily worked with ABC technology during my time there.

See the difference? This way you are providing more insight into your skills and giving more conversational answers.

6 – You Lack Details

Like the above, you need to be able to articulate the answers to questions and help the interviewer see why you are the best candidate.  Show your problem solving approach and don’t be afraid to think out loud when given hands-on problems or puzzles. Demonstrate how this job relates to your strengths and connect all of the dots for the interviewer so they can have confidence in choosing you for the job.

 

This wraps up today’s list.  Check out the final 5 

Taking Some Professional Advice

These days there probably isn’t a field that wouldn’t list “communications” as a critical skill needed for successful candidates, but I’ve found that this is even more important in the field of computer science.  Why?  Programmers don’t like people – even themselves.

Talking about yourself is hard. Too much and people think you’re a motormouth, too little and people wonder “why is he so quiet?”. Mentioning your accomplishments can get you marked as a braggart and never talking about them can make you seem like a loser.  Where is the happy medium? Learning to talk about yourself in a self-effacing manner is not only important for interpersonal communication, but it is critical to your success in your career.

One of the best pieces of advice came to me during one of my first jobs out of college.  My boss would regularly walk around the office, talk about how things were going, maybe ask you about your weekend.  He almost always started with the same question: “What have you been working on at home?”.

I remember being surprised and confused by this question.  Why would my boss want to know what I worked on at home?  Was he implying that I should’ve been researching work issues at home on the weekends? I hadn’t really been working on anything on the side.  I was pretty overwhelmed at work with all of the new things I was learning.  I almost felt like I would be wasting my time on things that had nothing to do with my work. After a few months I finally got up the nerve to ask what he meant by this question. What was the expectation?

The advice he gave me is this – ALWAYS have something to tell me.

I started picking up side projects so I would have something to talk to him about.  Little freelance projects that did or did not pay, fun applications and websites that I wanted to write.  I learned so much, so fast. I picked up Python and learned to write little applications and connect to websites, I wrote a web-app for a new business in England that landed me a gig I still work on (5 years later), I picked up C++ and started working on games, I cracked my head on my first Android application. Whatever interested me or sounded fun, I spent some time on.  Many of my personal projects never got finished or were abandoned, but what I had learned stuck with me.

During my time there, I almost always had a side-project going and I always had something to tell my boss about when he came around.  Sometimes he would nod thoughtfully and smile, other times he would give me some pointers or direct me to something I should read.  In a way, my work I was doing outside of the job helped me connect with my boss better than my actual work performance.  He would stop by and ask me how the project we discussed last week was going and he became a mentor I could talk to when I was really stuck. When I decided to move on, he wrote me one of the best recommendations I could ever ask for and I will never forget that encouragement.

I still do side-projects and freelance work today.  Most of my projects are from repeats, referrals, and word-of-mouth and I don’t really have to go looking for them anymore. Learning to talk about myself has also allowed me grow my communication skills and learn to speak with people that I would once be intimidated by as well as communicate about technical details and programming in a way that you can never really master in school. Whatever you’re doing right now, find the time to start working on side projects. Don’t wait for someone to tell you what to do.  Employers want initiative and passion – show them you have what they need and you’ll surprise your boss, clients, and yourself.

Caught Up in the Details

Lately, I’ve been trying to really home-in on some of the problems that I see many of my students going through that holds them back from their learning and programming goals.  Today I want to talk about “the details”.

Computer Science, like many fields, is one that enjoys details.  We thrive on it actually, digging into problems, exploring the minutia, and giving everything an acronym. But I start to think how unhelpful this attitude is to students.  Learning to program well requires the introduction of the following all at once:

  • Terminology
  • Basic concepts of programming
  • Acronyms
  • Development software / IDEs
  • Foundational knowledge in computing
  • Coding standards
  • Documentation
  • Requirements gathering
  • Syntax for the language they are studying

You can probably tell this is an overwhelming list.  I actually could add a few more items but typically, this is what is covered in the first few WEEKS of an introductory computer programming course.  I start to ask myself why.  Why are we so caught up in all of these details?  Why is it so important to impart the skills of documenting or making sure they can understand a bit from a byte when they are first starting out?

It seems to me we would be doing a students a great service if we tried to remove some of these roadblocks to their learning and actually just taught them how to program. We don’t teach people how to drive cars by making them learn how to fix one.   No one ever learned how to write by studying the history of penmanship. Some topics are better left for later when the student has a grasp of the language, then we can go back and make sure that they understand what is going on under the hood.

So today, for all of my students, I would recommend the following – put down the details and focus on the programming.  Really dig into the whys and hows of your current language and don’t worry about all of the peripheral knowledge that you can gain over time.  Slim down your list to:

  • One programming language (of course, I think C# is the best)
  • One IDE – Visual Studio really cannot be beat
  • A simple set of challenges or projects you want to accomplish

You will make far more progress in learning how to program if you narrow your focus towards a goal that can be stated easily such as “A program that can convert temperatures from Fahrenheit to Celsius” or “A program that lets me enter and search my DVD titles”.  Not only will you find that you have more motivation when you are focused on completing a particular project, but you will learn a lot more about your programming language by solving the challenges that will be held within.

If you haven’t checked out my learning course for C# yet, now is a good time to get started – learn more here.

Object Independant Serialization C#.NET

Creating and storing serialized objects in a database is a fairly easy task.  However, the problem comes when you have created serialized objects with one application (or version of an application) and want to deserialize and use them with another.  Usually the error that you get is:

Unable to find assembly 'MyAssembly; Version=1.0.3463.18923;
Culture=neutral; PublicKeyToken=40e3171cc8066fe6'.

What?

Well the issue here is the objects that have been Serialized have a formatter transmits the information required to create an instance of an object of the correct type and version. This information generally includes the full type name and assembly name of the object. The assembly name includes the name, version, and strong name hash of the assembly.  What this ultimately means is that your serialized object data is now tied to the assembly and version that created it.

By default the deserialization process uses this formatter information to recreate the object as the correct type.  What we can do is override what the serialized object says and provide our own assembly information so that we can open our objects in another application.

First what we need is to create some add-ons for the SerializationBinder class that is part of System.Runtime.Serialization

sealed class SerializationHelper :
System.Runtime.Serialization.SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
}
}

What the SerializationBinder class does is allow us to setup the assembly information and find the current object type that we want to deserialize as in this application, as opposed to the one it was created it.

First thing, we create an object of Type to hold the object type that we want to deserialize as

Type typeToDeserialize = null;

The biggest problem I ran into is the way that System.Reflection.Assembly returns assembly information. We can get the full name of the assembly like so

string currentAssembly = Assembly.GetExecutingAssembly().FullName;

Which gives us the fully qualified name of the current assembly, version and culture information. But we don’t need all that.

// In this case we are always using the current assembly
assemblyName = currentAssembly;

int index = typeName.IndexOf(‘.’);
string obj = typeName.Substring(index+1);

index = currentAssembly.IndexOf(‘,’);
currentAssembly = currentAssembly.Substring(0, index);

string objType = currentAssembly + "." + obj;

So here we use a little string magic to extract just the assembly name andjust the object name so that we can concatenate them together into a fully qualified object name that GetType() will understand.

// Get the type using the typeName and assemblyName
typeToDeserialize = Type.GetType(objType);

This will return the CLR loaded manifest information on the object that matches the AssemblyName.Objectname that we provided to GetType. We can then return this information.

return typeToDeserialize;

Ultimately, to make sure that your deserialization process will use this new binding formatter you need to create your binary format binder as a new instance of our SerializationHelper class.

BinaryFormatter myFormat = new BinaryFormatter();

//set up a new binder so that we can maintain assembly freedom between
//serialized objects
myFormat.Binder = new SerializationHelper();

This way, when the myFormat.Deserialize() is called, the SerializationHelper class and our new overriden method will fire, causing the assembly information to be changed to the current running assembly, allowing you to deserialize objects that your current application (or version of the same application) did not create.

Programmer Productivity

I saw this image on a blog the other day.

programmer productivity in a graph

I hear a lot from other programmers that they have problems with productivity.  I know I used to.  I had to work with the TV or Netflix on the background so I would have something to tune out.  You were only going to get about three consecutive hours out of me before I would run off and hide somewhere for a recharge.  I used to drive my manager crazy!

Joel Spolsky talked about this same problem on his blog once.

Sometimes I just can’t get anything done.

Sure, I come into the office, putter around, check my email every ten seconds, read the web, even do a few brainless tasks like paying the American Express bill. But getting back into the flow of writing code just doesn’t happen.

These bouts of unproductiveness usually last for a day or two. But there have been times in my career as a developer when I went for weeks at a time without being able to get anything done. As they say, I’m not in flow. I’m not in the zone. I’m not anywhere.

I think most of us were excited to find out we weren’t alone. If someone like Joel, that I highly respect and look up to has the same problem, then I don’t fee like there is something wrong with me.

So what do you do about it?

First, I made a list of all of the things I thought made me unproductive:

  • Open floor plan offices / not getting any privacy – if I was constantly overhearing other conversations, arguments, etc…I couldn’t keep focused
  • Pestering co-workers – Why would you come by my desk and ask me “did you get that email I sent 10 minutes ago?”.
  • Poor communication about requirements – self explanatory
  • Poor multitasking / prioritizing skills – if I had THINGS ON FIRE and other tasks to handle, I wasn’t sure about how to get it all done and in what order.
  • Twitter and Facebook notifications on my phone – self explanatory
  • Email notifications on my computer – also self explanatory
  • The Internet in general

So when I would find myself in a period of strong productivity, I would begin to ask myself.  What is going on right now that makes me more productive?  I created a similar list of “pro” environment things:

  • Music is good but I don’t want lyrics, instrumentals / dance music only
  • TV/Netflix is good but only if its some nonsense show that I don’t really care if I watch.  Daytime TV is good for this.
  • A private office.  For the most part I just started working from home.
  • No interruptions.  I had to isolate myself from the Internet.

If you find yourself in a similar situation, I would recommend that you start making lists like the above.  It has completely changed the way I work and my work output. Not all of us are cutout to work in the same office environment and learning these things about yourself will only make you happier as an employee.

Put yourself in control

A lot of us think that we are just lazy or that unproductive behavior is just part of who we are.  You are capable of so much more! Each of us has the power to control what makes us unproductive.  To make myself more productive I had to take control of the areas that I could:

  • Turn off notifications on your phone. Added bonus – more battery for later!
  • Work from home when I really, really need to get something done.  I also found places I can “hide” at work and not be bothered but I am easily accessible for pop-up meetings.
  • Black-out times on your calendar – These are times that you are scheduling yourself to work without interruption and they show as busy to anyone else that may want to schedule you for something.
  • Re-position your work environment – Move your desk so you can’t see people passing by or so you don’t see distractions.
  • Learn to reward yourself – I give myself three hour breaks for Internet, snacks, walks around, etc…

Now I seem to have the opposite problem where I am so productive with all of my tasks that people wonder how I get everything done.  Its really been a complete change.

I would be interested to know what you think makes you unproductive.  How do you combat it?

Math and Programming – Locked in an Eternal Struggle

It constantly surprises me the number of students that want to go into Computer Science that don’t like math.  Haven’t we been told for decades that the two fields are intertwined?

There seems to be two schools of thought on this struggle between math and programming.

Programmers do not need to be good at math

I often hear from programmers in the field that they don’t feel like they need to be good at math to do their job.  They have perfectly good careers and rarely have to use any math.  So why bother?

Today’s programmers are typically more focused on business logic problems and n-tier communication issues than using fancy equations to solve problems. Maybe the most math that you ever have to do is determine if you are going to overload your mobile network connection or that your Java library is going to be too big to load. When was the last time you had to implement a logical math function that wasn’t already given to you in a library?

Fundamentally, I think the flaw in this logic is that “being good at math” is not the same as “being good at math problems”. I’m sure that many a programmer goes about his day without ever giving the college Algebra class that he took almost a decade ago another thought. So why do we need it?

Programmers need math to learn logic

Think back to your last math class.  What did you learn?  It doesn’t really matter what you answer here since the answer, fundamentally is going to be the same. Math teaches us some basic things that make us better programmers.

  • Logical thinking – math teaches us about the application of logic to a problem.  Conjecture, proof and building theories.
  • Linguistical thinking – There has been tons of research that shows learning math is more like learning a language.  We use similar areas of the brain to learn and retain this information.
  • Future automation – Programmers typically have a drive to automate processes and tedious tasks.  Figuring out these automation techniques for tasks almost always involve computational mathematics in your code.

So not only do we need to take all of those math classes to learn the basics of mathematics, but we are also training ourselves on problem solving and how to approach the tasks that we will find in our programming careers.  We are also training our brain to learn the programming languages that we will encounter.  Let’s talk about that for a second…

Math is a language?

Absolutely! Math is more of a language than programming languages simply due to the way that our brains process problems.  When you are handling a math problem, you are dealing with unknowns and ambiguities.  This forces us to have to handle things based on context, just like you would when communicating with someone else.   One of the great things about programming is that you have a compiler that will help you determine how that ambiguity resolves.  You probably also have a better idea of the expected output or the end result in programming than you do when working math problems.

As someone currently working on their doctoral thesis on the subject – this is a subject that is near and dear to my heart. I would argue that in the hierarchy of rigor, mathematics falls between language and programming.  Its a bridge for understanding and applying concepts, even if you never actually feel that you use math in your everyday programming tasks.  This is why the two fields are locked together – no other training will help you learn the kind of abstract thinking that you will apply in programming like mathematics.

What does this mean for upcoming students in the field?

If you’re not good at math I don’t think you’re a hopeless case, but I do think that it has the potential to directly translate to your ability to apply critical thinking and solve problems in your programming courses.  However, there is no indicator that I’ve found in my research that states a person must be good at math to be good at language (hello future research project!). Since the two are similar, there is a good probability that a person that is good with languages could also apply the same concepts to programming and be successful.

Feel free to comment.  My research analysis will be posted on this blog when I am finished with my dissertation, so maybe we’ll have a more definitive answer then!

Don’t Get Type Cast in Your Programming Career

I was recently talking to a student about their career goals and they said “which language should I choose to learn: C# or Java?”.  My response was that they should learn both, since limiting your knowledge in this field can be a dangerous game. You want to be able to branch out and learn new things, even after you are out of school, so you can figure out where you fit.  I hear a lot about “specialization”.  People seem to think that since these specialized devs that only know about a few key systems like Sharepoint make tones of money, that is what they need to do as well.  I would caution you to not think this way as specialization only seems to work for a handful of people.  The more you learn about different systems, environments, and technologies the more it is going to open your eyes to different ways of thinking and working with different types of people.

Specialization also happens in the development world where you get stuck only working on projects that are supported on one platform.  You may think, “hey, I know a lot of different stuff about C#, Winforms, Asp.net, ASMX, Asp.net MVC, etc” but all of these are .NET platform technologies.  Not limiting yourself, should mean using different platforms altogether. i.e Linux, Windows, OSX, iOS, Android, different DBs, different languages. Also, different types of apps and requirements such as  web, desktop, mobile, embedded, enterprise level, high traffic, etc…

I recently saw a conference video from the Goto Conference where one of the presenters, Trisha Gee was giving career advice to programmers.  Here is the video:

Trisha talks about not limiting yourself in your learning and thus limiting your career by only focusing on one kind of technology, platform or area.  She used herself as an example since she switched from web development to server administration to server development. I’ve done the same thing.  I started as a programming student that went into programming, then IT administration (basically a catch-all title in itself), then server administration, then software administration, then programming instruction with freelance development and web development projects on the side.  By learning all of this, I learned I can switch gears and diversify my skills to create an impressive resume.  I also learned a lot of soft-skills.  Those are the people skills that you pick up along the way and having all of this experience helps when you need to put yourself in another person’s situation or understand the impacts of your decisions. It gives you a broader view of the process.

The key to all of this is don’t box yourself in. Don’t be afraid to learn new things and pick up new skills, even 10 years from now when you feel secure in your job. By switching gears now and then you are going to keep yourself from feeling like you are stuck in a rut.  It can be quite scary jumping into a new area or discipline in your field but ultimately it is rewarding as it gives you a very well-rounded resume that will open up a lot of doors.  It also shows employers that you are willing to invest in yourself and aren’t afraid of change.

Programming Challenge: Reverse Input

This week’s programming challenge is about Strings!  String is a great C# class with a lot of built-in functionality for manipulating characters and text.

Write a program that reads a string from standard console input and then prints it in reverse order on the screen.

To spice this up, allow the program to take in a number of strings and reverse the whole thing before printing it.  The console should know that the program is done when it encounters the word END.

Example input:

one

two

three

END

Example output:

three

two

one

See if you can write this program before I post the solution on Friday.

[codesyntax lang=”csharp” title=”Solution” blockstate=”collapsed”]

class Program
    {
        static void Main(string[] args)
        {
            //create a List that allows you to hold the input strings
            List<String> wordList = new List<string>();

            //get the word input from the user until they tell us there are no more words
            string input = "";

            while(true)
            {
                Console.WriteLine("Please enter the word you wish to store or END to quit");

                //get the string from the user
                input = Console.ReadLine();

                //test the input to make sure its not the word END
                if(input == "END")
                {
                    break;
                }
                else
                {
                    //store the input in the list
                    wordList.Add(input);
                }

            }

            //once the user has entered all of the words they want, we will reverse the list and print it
            wordList.Reverse();

            foreach(string word in wordList)
            {
                Console.WriteLine(word);
            }

        }
    }

[/codesyntax]

Programming Challenge – Roll the Dice

Write a program which simulates two dice with values from 1 to 6. The program takes a single argument which is the number of dice. The output should contain the values of the dice and the probability for this combination to occur. The probability is expressed as a decimal value between 0 and 1 with three decimal points.

How do you find the probability of a dice roll? Check out this explanation: http://www.math.hawaii.edu/~ramsey/Probability/TwoDice.html

If you think you have it figured out, post below and email me a link to your source so I can check it out!  I’ll post the solution at the end of the week.

 

 Post updated with solution below
[codesyntax lang=”csharp” lines_start=”1″ title=”Solution” blockstate=”collapsed]

class Program
    {
        static void Main(string[] args)
        {
            //welcome the user and start the program
            Console.WriteLine("Welcome to the dice probability program");
            Console.WriteLine("-------------------------");
            Console.WriteLine("Rolling dice");

            //create a new dice object and roll
            Dice newRun = new Dice();
            newRun.Roll();

            //display the result of the rolls
            Console.WriteLine("Die 1 rolled a {0}", newRun.Die1);
            Console.WriteLine("Die 2 rolled a {0}", newRun.Die2);

            //probability
            //Since each die has six sides and the game is played with two dice, there are 36 (6 x 6) combinations 
            //find the total of the two dice
            int total = newRun.Die1 + newRun.Die2;

            double probability = 0;

            //compare the total to the probability out of 36
            switch (total)
            {
                case 2: probability = 1.0 / 36.0; // 1 possible combination of dice 1/36
                        break;

                case 3: probability = 2.0 / 36.0; // 2 possible combinations of dice 2/36
                        break;

                case 4: probability = 3.0 / 36.0; // 3 possible combination of dice 3/36
                        break;

                case 5: probability = 4.0 / 36.0; //4 possible combination of dice 4/36
                        break;

                case 6: probability = 5.0 / 36.0; //5 possible combination of dice 5/36
                        break;

                case 7: probability = 6.0 / 36.0; //6 possible combination of dice 6/36
                        break;

                case 8: probability = 5.0 / 36.0; //5 possible combination of dice 5/36
                        break;

                case 9: probability = 4.0 / 36.0; //4 possible combination of dice 4/36
                        break;

                case 10: probability = 3.0 / 36.0; // 3 possible combination of dice 3/36
                        break;

                case 11: probability = 2.0 / 36.0; // 2 possible combinations of dice 2/36
                        break;

                case 12: probability = 2.0 / 36.0; // 1 possible combination of dice 1/36
                        break;

            }

            //output result
            Console.WriteLine("The probability of this roll is {0:F3}", probability);
            Console.ReadKey();
        }
    }

class Dice
    {
        private int die1;
        private int die2;

        public int Die1
        {
            get { return die1; }
            set { die1 = value; }
        }
        

        public int Die2
        {
            get { return die2; }
            set { die2 = value; }
        }

        public void Roll()
        {
            //get a random number object we can the use to determine the die face
            Random rand1 = new Random();
            Die1 = rand1.Next(1,6);
            Die2 = rand1.Next(1,6);
        }
    }

[/codesyntax]

Which Version of Visual Studio 2013 Do I Need?

One of the confusing things about getting started with a .NET language is figuring out which version of Visual Studio that you need.  Microsoft typically puts out many different versions of the Visual Studio software with each release and they can differ in the types of programs and projects they can create, features, functionality or limitations.  With the current version of Visual Studio 2013, there are five different versions of the main product and three versions of the Express edition so its no wonder that people just getting started or that are looking to upgrade to 2013 feel confused.  Here are the differences so you can determine which version you need.

Visual Studio Express

Visual Studio Express is the free version of the product that is usually released alongside the full version of the product.  Giving a free edition of Visual Studio allows people who want to learn a .NET language an easy way in. Since the Express version is free, it is often pared down and contains less functionality than the full version. Applications created in the Express version can be later maintained in other versions of Visual Studio if you decide to upgrade.

For 2013, there are three versions of Express: Web, Windows, and Windows Desktop.

 

Visual Studio Express Web

The Web version of Express allows you to create ASP.NET and Azure projects as well as other web-based projects like web services or web APIs.  This version is good if you won’t be creating other types of applications and the install will be slimmer since it only has the minimum necessary for these types of projects.

 

Visual Studio Express for Windows

The Windows version of Express allows you to create Windows Phone or Windows Store applications for Windows 8.1.  If you are thinking about getting into the app space, this is the version for you. It has support for HTML, JavaScript, C++, C# and Visual Basic and a built-in device simulator so you can test your apps on various phone and tablet devices.

 

Visual Studio Express for Windows Desktop

The Windows Desktop version is different from the previous version as it allows you to create full Windows desktop applications using Windows Presentation Foundation (XAML), regular Windows Forms or Console applications. If you are targeting the Windows desktop and wanting to make regular Win32 desktop applications, this is the version for you.

 

Visual Studio 2013

The full versions of Visual Studio are of course more powerful since they come with a full-sized price tag. There are five versions of the full product: Ultimate, Premium, Professional Online, Test Professional, and Professional.    All of the full versions of the program also allow you to connect to code collaboration platforms such as Team Foundation Servers (internal and at Visual Studio Online) and Github.

Here is the difference:

Visual Studio Professional Online

The Professional Online edition gives you all the functionality to create applications for Windows Desktop, Azure, Server and Windows Phone but does not include a lot of the functionality of the regular Professional edition. It is also limited when it comes to the number of users that can be connected to a project via Visual Studio Online.  For Professional Online, there is a maximum of 10 users and projects can only be hosted to Team Foundation Server Online and not to an in-house TFS installation.

 

Visual Studio Professional

The professional edition gives you the ability to create all of the project types that are available in all three versions of the Express edition. Windows desktop, Windows phone, Web, etc…It also gives you the ability to create cloud-based applications with Azure and Office integration add-ons.  There is no maximum for the number of users that can be connected to a project via Visual Studio Online.

 

Visual Studio Test Professional

Test Professional gives you a lot of the functionality of the Professional version along with tools for testing and integrating with workflows and collaboration.  The big difference with Test Professional is the lack of project availability. This edition is really for testing and QA personnel and does not include the ability to create projects.  However, if you are wanting a solution to create lab environments, capture requirements, or create and manage test cases, this is the version for you.

 

Visual Studio Premium

Premium is going to give you everything that is in Professional plus integrated testing tools to plan, develop, test and operate applications.   There are features included that allow you to workflow your code through a peer-review process and helps with multitasking and productivity by allowing you to suspend and resume tasks. Code coverage analysis tools and interface tests are also included.

 

Visual Studio Ultimate

Ultimate gives you everything in Professional and Premium as well as extensive testing tools. There is built-in functionality for capturing and reproducing bugs, diagnostic data, and performing web performance and loading testing. A new design interface allows you to create diagrams that validate code and implement architecture.

 

To help better understand all of the differences, here is a comparison chart:

Categories and capabilities Visual Studio 2013 Ultimate with MSDN Visual Studio 2013 Premium with MSDN Visual Studio 2013 Test Professional with MSDN Visual Studio 2013 Professional with MSDN Visual Studio Online Professional
Work in the same IDE to create solutions for the web, desktop, cloud, server, and phone checkmark checkmark checkmark checkmark
Take your apps to the cloud, Windows and Windows Phone Stores with included services as subscription benefits checkmark checkmark checkmark checkmark
Get access to Microsoft platforms and tools past and present, with new releases added all the time, including Visual Studio checkmark checkmark checkmark checkmark
Get access to Microsoft platforms and tools past and present, with new releases added all the time checkmark checkmark checkmark checkmark
Organize and define your test plans with test case management and exploratory testing checkmark checkmark checkmark
Provision and manage virtual lab environments for testing with consistent configurations checkmark checkmark checkmark
Improve code quality with a peer code review workflow within Visual Studio checkmark checkmark
Improve developer productivity when multitasking with task suspend and resume checkmark checkmark
Automate user interface tests to validate application UI checkmark checkmark
Find and manage duplicate code in your code base to improve your architecture checkmark checkmark
Determine how much code is being tested with code coverage analysis checkmark checkmark
Reliably capture and reproduce bugs found during manual and exploratory testing to eliminate “no repro” bugs checkmark
Collect and analyze runtime diagnostic data from production systems checkmark
Perform web performance and load testing checkmark
Design architectural layer diagrams to then validate that code implements the architecture checkmark
Maximum number of users on a Visual Studio Online account Unlimited Unlimited Unlimited Unlimited 10
Host team projects on-premises or in the cloud checkmark checkmark checkmark checkmark Cloud only

 

 

All of these versions can be downloaded from the Visual Studio Download site: http://www.visualstudio.com/downloads/download-visual-studio-vs

If you want to try these out you can get a 90 day free trial from www.visualstudio.com or if you are a student at a school that participates in the Dreamspark program, you can get a free version of the Professional edition at www.dreamspark.com.