Wednesday, June 4, 2014

5 Reasons You May Not Want To Work For Google Refuted

I came across this article this morning on LinkedIn, 5 Reasons You May Not Want to Work For Google. I have never worked for Google. I believe I did apply in college. I did, however, spend 4 years at EA Sports working on Madden. Admittedly, this is not quite as high profile as Google, but I feel like I can relate to the idea of the article.

I feel opposite to the points in the article and wanted to explain why.

1. You'll Be Stereotyped

People can assume whatever they want. If they're the kind of person that sees a particular company on your resume and proceeds to judge you for it prior to meeting you, then that's probably not someone with whom you want to be friends or with whom you want to work. Once you actually meet, it will come through if you are genuine, nice person. One of my college friends has been working at Google since we left college and is still an extremely nice, friendly person. He hasn't changed!

2. You Need to Always Be "On" the Job

First off, why wouldn't you always be "on" the job? Why are you afraid of working with intelligent, motivated people? I look back on my time at EA and feel so fortunate that I was able to work with such talented individuals, especially right out of college. I think my time at EA shaped who I am as a developer and taught me so much more than college ever could, because I got to work with people who are "on" the job. Maybe I couldn't climb the ladder in a year, but I learned a tremendous amount. You always want to have people smarter than you around so you can learn from them. If you want to slack, then yes, maybe Google is not the place for you.

3. Subsequent Job Search Will Get Harder

The article states that employers will definitely want to interview you. Getting the interview is half the battle! Once you get in the interview, you can explain why you left. I have done that several times in interviews when asked about EA. There are plenty of reasons you may want to leave a formerly dream job - moving to a new city, low upward mobility, better work-life balance, more money. You can easily explain this.

4. Your Future Expectations Will Be Tougher to Meet

Did I really think that all companies would be like EA? Did I expect multiple gaming consoles at my desk, free games, a game room, to wear shorts and flip-flops to work, and 5 weeks of PTO when I switched jobs? No, because I am a reasonable person. Just because a job has a lot of perks, doesn't mean it's right for you. Life is trade-offs which you weigh. Yes, those perks are awesome. At some point though, I wanted to change the direction of my career and life and working at EA did not support my new dreams. I have a job that is working for my current life way better than EA would and I am happier with the experience I am getting. I do miss it, but I know it was a good decision for me in the end.

5. You'll Become a Professional Networking Target

So what? I got my dream job right out of college, why wouldn't I want to help other people achieve their dreams as well? EA was my absolute first choice and it was never lost on me how lucky I was. A lot of times, you just get asked to submit a resume. Great! I put it through the company system and if they get hired, I get money. Not a big deal. I am happy to give advice and volunteered to do so through a mentorship program at my alma mater as well as attending many EA recruiting events where I met current college students and freely handed out my business card.



Tuesday, May 13, 2014

When Is The Right Time To Launch Your Product?

I attended a founders speech by Philip Holt yesterday at Starter Studio. During the Q&A session, someone asked him about knowing when to launch, and I think his response was spot on.

There are many things you need to consider when first launching your product. We always hear about the MVP. But what is your MVP? Is it when you get all the features you planned on having implemented? Is it when you're bug free? Is it when the thing is just freakin' running?

Philip's response was this:

"You launch as soon as you have the 'IT' factor"

As soon as you have the IT factor, it's time to launch. And you only need ONE! If you have (or think you have) multiple IT factors, don't wait. Launch with ONE. There's a couple reasons for this.

1) You want to get your product in the marketplace as soon as possible. If you launch without your IT factor, you may pickup customers that have been waiting for your product only to have them figure out they've been waiting for nothing. But, as long as you have that one feature they have been waiting for, then they'll likely stick around for more.

2) You need validation. Maybe what you thought was your IT factor really isn't and you need to go back to the drawing board. There is no better way to get validation then to have customers (NOT friends and family) use it.

But what if you don't know what your IT factor is?! Then put the mouse down, back away from your computer, and start sending your resume out. If you don't know what your 'IT' is, you have more problems then just trying to figure out when to launch.

So quit sitting around waiting for everything to be perfect. Quit second guessing yourself on if your product is going to be successful. Put up or shut up.

LAUNCH TODAY!


If you're in Orlando, checkout Starter Studio: http://starterstudio.com/

You can also follow Philip Holt on Twitter: https://twitter.com/PhilipHolt






Thursday, May 8, 2014

Object Oriented Development for Non-Programmers: Part 1 - What is An Object?

Introduction

I was recently asked by a designer on our team to help her understand programming so she could better communicate with her team. I am in the process of coming up with a series that will assist her in understanding the concepts of programming and object oriented design without being overly technical.

I develop regularly in C# so any examples will be in C#. Most modern languages are object oriented so the concepts can be applied to other languages, such as C++ and Java.

Keywords are underlined.


What Is An Object?

The first role of a developer is to design how we are going to model the data we are working with. We need to determine what data to model and how it is going to interact with the other data. This is our program architecture.

With object oriented programming, we model our data much like we interact with the world.

For example, right now you may be sitting in a room. A room is an object. A room has attributes such as width, height, and depth. In programming, we would call those properties.

In our code, we would create an object called Room with properties Width, Height, Depth. So in our code, we have a model for what makes up a Room object. At this point we have only modeled room, we do not currently have any rooms. We have a concept of what a room is - essentially a room is a width, depth, and height. Therefore an object can be described as a collection of properties.

To have a room in code with properties, we need to create an instance of the room. Creating an instance says to the computer, "Hey, allocate a block of memory to fit one 'Room' object." Once we have an instance, we can set the properties.

The code for our example is below. Note that this is C# code, but not a full implementation. Some has been removed to simplify and avoid confusion while we focus on what an object is and how we instantiate (create an instance of) it.

This is the code for our Room object. We define the name of the object and the properties.
    class Room //  "Room" is the name of the object
    {
        // Properties listed below:

        int Width; // the int signified "integer", or whole number

        int Height;

        int Depth;
    }

This is how we instantiate Room objects and set the properties on the object. We use the "new" keyword to tell the computer to create a new instance and allocate the memory. We can create as many Room objects as we'd like.
            Room room1 = new Room(); // Create a new instance of a Room named "room1" - you can name it whatever you'd like.

            // Set the properties on room1:
            room1.Depth = 10;
            room1.Width = 20;
            room1.Height = 30;

            Room room2 = new Room(); // Create a new instance of a Room named "room2"

            // Set the properties on room2:
            room2.Depth = 15;
            room2.Width = 25;
            room2.Height = 35;

Friday, April 25, 2014

Best Practices for Code Checkin

A stable build is important to a project, whether large or small scale. Stability means that the code builds, any unit tests run successfully, and you can navigate the program's critical path. Ideally, there should be no or few crashes. A lot of development time is wasted on debugging stability issues. Much of this could be prevented with a careful code check-in process.

As soon as you get to a stopping point where you can check-in, check-in! It's ok to check-in small parts of features incrementally. Software development is an iterative process, and your check-ins should be iterative as well. Don't wait until you have a lot of files changed to do your check-in - do it sooner rather than later!

You know how you press Ctrl-S all the time while coding (I know I do!)? Think of this as a Ctrl-S.

Why?
  • The more you check-in your working code, you keep a better baseline so if you do make a mistake, there's less backtracking to find out where you went wrong.
  • Less changes = less chance for bugs or build breaks
  • Better visibility to your team - your team can see where you're at with your feature development, which helps especially when they are doing work that is intertwined with your feature.

When it's time to check-in follow this process to minimize build breaks and bugs: 
  • Pull down latest code and merge, if necessary.
  • Go through each of your changed files and diff them against the repo. Check for:
    • Test code that was accidentally left in
    • Files that are actually unchanged
    • Wiping out someone else's work
    • Anything you do not mean to check-in
  • Build and test - someone may have checked something in that breaks your code, so it's important to test after getting latest. Also, test any features that may have been affected by your development, even if it's not the feature you were working on.
  • Run any unit tests set up for your project.
  • When you're confident everything builds and runs, check in. Make sure to be descriptive in your check-in notes. A month from now, when you're looking through the file history, you'll thank yourself! Your coworkers will thank you as well!
  • Don't leave! Make sure your check-in works. Check your automated build server to make sure the build passes. If you don't have an automated build server running for your project, get one! If you don't have time to verify your check-in, you do not have time to check in!

Wednesday, April 23, 2014

C# DateTime Add Business Days - Without Looping

I recently had to add the number of business days to a C# DateTime object, which DateTime does not currently support. I did a quick search on Google, and came up with some looping solutions, so decided to write my own O(1) solution.

I implemented the AddBusinessDays() method as an C# extension method on the DateTime object. Now, the AddBusinessDays() method can be used anywhere in the code!

        public static DateTime AddBusinessDays(this DateTime date, int numBusinessDays)
        {
            DateTime adjustedDate = date;

            /* First, we want to normalize the days to the upcoming Monday
             * Get the number of days to Monday
             */
            int daysUntilMonday = DaysUntilMonday(date);
            int daysToAdd = numBusinessDays;

            // Too many days until Monday
            if (daysUntilMonday > daysToAdd)
            {
                adjustedDate = adjustedDate.AddDays(daysToAdd);

                // Check to see if we're on the weekend
                int endDateDaysUntilMonday = DaysUntilMonday(adjustedDate);

                // Landed on a weekend
                if (endDateDaysUntilMonday <= 2)
                {
                    // Days from Friday - we need to add these back on to the end
                    daysToAdd = 3 - endDateDaysUntilMonday;

                    // Normalize to Sunday, then add the days we have not yet added
                    adjustedDate = adjustedDate.AddDays(endDateDaysUntilMonday - 1 + daysToAdd);
                }
            }
            else
            {
                // Normalize to Monday
                adjustedDate = adjustedDate.AddDays(daysUntilMonday);

                daysToAdd -= Math.Max(daysUntilMonday - 2, 0);

                // Calculate the number of weekends added
                int weekendsAdded = (int)(daysToAdd / 5.0);
                daysToAdd += weekendsAdded * 2;

                // Add a day for each weekend day
                adjustedDate = adjustedDate.AddDays(daysToAdd);
            }

            return adjustedDate;
        }

        private static int DaysUntilMonday(DateTime date)
        {
            int daysUntilMonday = DayOfWeek.Monday - date.DayOfWeek;

            if (daysUntilMonday < 0)
            {
                daysUntilMonday += 7;
            }

            return daysUntilMonday;
        }

Tuesday, April 22, 2014

C# Extension Methods - When And How to Use Them

C# extension methods were added in .NET 3.0 as a way to extend a type without creating a new derived type.

From MSDN:

Extension methods enable you to "add" methods to existing types without creating a new derived type, recompiling, or otherwise modifying the original type. Extension methods are a special kind of static method, but they are called as if they were instance methods on the extended type. For client code written in C# and Visual Basic, there is no apparent difference between calling an extension method and the methods that are actually defined in a type.

When would you want to use an extension method versus deriving from a class and using inheritance to create your own extension?

A popular reason to use an extension method is when you do not control the code for the type you want to extend. Examples would be extending a class provided by .NET or from a third party API.

Say, for example, you want to add functionality to the DateTime class. You could inherit from DateTime, creating a class MyDateTime. To call your methods, you would have to use MyDateTime and know when to use MyDateTime vs. DateTime. Another option is to extend the DateTime class, adding your methods. Now, every DateTime object used in your project will be able to use your extra functionality.

It is important to note, when using extension methods versus inheritance, you will not have access to protected or private members of the extended class. All extension methods are static.

Adding an extension method is very simple. First, determine where this should go in your project's organization. The extension methods should preferably live in a common area that all of your code can see, maybe in a helper file.

The silly example below shows how to set up the static extension method. Simply create a static method with a parameter of "this DateTime date". Any other parameters can follow.

    public static class DateTimeExtensions
    {
        public static int GetMinutesPlusSeconds(this DateTime date)
        {
            return date.Minute + date.Second;
        }
    }

Now I can call something like this anywhere in the code. Make sure to include the namespace of the helper method as Visual Studio might not pick up that you need an additional namespace.
            
    DateTime date = DateTime.Today;
    int sum = date.GetMinutesPlusSeconds();

The Tech Scene in Orlando, FL - The EA Sports Phenomenon

"I use to work at EA Sports!" 

That's usually all it takes to perk up someone's ears and get their attention in Orlando. Trust me, I've used it many times. But is it a good thing that that statement carries so much clout? Take a second to think about how many people in the Orlando tech scene are saying this.

The tech scene in Orlando is small (but growing)

There are few places that you can mention that everyone in the tech industry will recognize (especially outside of Florida). What is Orlando really know for? EA Sports and military/research contracts. What about the startups? Well, unless I'm completely out of the loop (which is entirely possible), there's no startup in Orlando that has hit it big in the last 5 years. That means Orlando isn't a startup hub. Yet.

What about the startup villages and incubators?

I've been part of a company in an incubator. Despite the resources you're given, there's nothing in the water there that will make your startup succeed. Personally, I think you have the same chance succeeding in the incubator as you do going at it on your own.

So why do I bring this up now? There is a tech entrepreneur, Philip Holt, that has been making headlines lately. Every article you read about him doesn't miss the opportunity to name drop EA. Personally, I would be a bit offended if every article about me remembers me for my past jobs (not too offended though, because an article is an article). EA brings legitimacy, but when does it start to overshadow his current accomplishments?

See the most recent article about what Philip Holt is doing:

http://www.orlandosentinel.com/business/os-cfb-cover-online-game-volatility-0421-20140420,0,3037488.story

Until we can overshadow EA Sports with something bigger, Orlando will always be known for EA Sports. Good luck Philip is surpassing the EA Sports phenomenon.

Tuesday, April 8, 2014

So You Want to Get Into The Game Industry

I often get asked how to break into the game industry. Friends and family are always asking and if I can talk to their friend whose life's dream is to work on a game.

My first question is why you want to be in the game industry. Is it because you truly have a passion for games? Is it because you want to challenge yourself with the exciting problems teams encounter when making games? Is it because you want to play games all day? You saw a commercial for schools that advertise programs that lead you to a game design career and it looked awesome?

It is important to address the misconceptions about the game industry. Hopefully this is a given, but you do not play games all day. You play the game to test your work, which involves repeatedly drilling down into one particular area. It is completely different than playing for leisure. The novelty of playing video games during work wears off quickly.

The realities that come with making games for a living are hard deadlines, long hours, and high stress. When you have a job that everyone wants, you are easily replaceable. There is someone willing to work longer and cheaper. Chances are, you, who wants to get into the industry, are willing to work longer and more cheaply than me.

That being said, there are times when it is a lot of fun. There are definitely plenty of people in the industry who love their job and have accepted the conditions. It does work for some, not for everyone. This is not meant to discourage, but you (and your family) should be aware of the environment and the commitment.

The next question is what exactly do you want to do for the game? If you have "a ton of really awesome ideas" and want to be a designer, then you are a dime a dozen. It may sound harsh, but it is true. I have spoken with so many people who have "so many amazing ideas" and "if they just talked to me, I'd transform the game." Anyone can be a Monday morning quarterback. You should be able to think of something tangible you would like to contribute.

With those questions answered, I have three ways to get into the game industry. All of these routes are long and arduous - there is no easy way to get in. The magic formula is a ton of hard work and time.


Have Training and a Skill

Like I said above, have something tangible you can contribute and have the appropriate training for that skill. Examples of tangible skills are programming, sound engineering, art, and project management, among others. Look on the career pages of game companies, and see what they are looking for in their job openings and what kind of training is required. Pick what you want to do and go to school for it. You will be up against people with degrees, experience, and certifications in these areas. Design is no exception. There are accredited universities that offer degrees in game design.

If you already have a degree in one of these areas, you are ahead of the curve. You have the proper training. Now, unless you are right out of college, you need to demonstrate how you can use that knowledge to contribute to a game.


Start in QA and Work  Your Way Up

It is possible to work your way onto a game team from QA (Quality Assurance), aka being a tester. Sounds like your dream job, right? Start in QA, do a good job, and work your way up to lead and possibly management positions.

The road from QA is a long one but it can be done. You will start off working very long hours with very little pay and respect. If you can stand out and pay your dues so to speak, you could end up with a role on a game team.

If you are currently in college, a QA position may be perfect for you. You get the game industry experience while working on your degree - hopefully something that actually has something to do with one day making games!


Become The Best In The Country At the Game And Maybe They Will Hire You

Now we're talking! If you can win tournaments and become recognized for your skills, the company may notice you and want to bring you in for ideas. Don't forget to be particularly active on the forums.

This may sound like the easy way in, but you really have to be the best in the country. Even then, there is no guarantee this will get you a job. This is like becoming a professional athlete - how many kids want to do it and how many actually get to do it? I would recommend going the other two routes before training to be a professional gamer while your mom tries to evict you from her basement.


All three of these ways take a lot of time and work. Before you go down one of these roads, think long and hard about if this is what you really want. Do you want it enough to work through 4 years to get a relevant degree? Do you want it enough to spend years in QA, potentially sacrificing a higher salary? If you do, by all means, go for it! There are plenty of highly successful people in the industry and there is no reason you cannot be one of them if you are willing to be realistic and apply yourself diligently.