Brian Eats Ramen

Essays on making games, building communities, teaching and learning.

My 2010 Macbook Pro Upgrade

Giving your mac a new lease on life

My mid-2010 Macbook Pro had been getting really slow lately. It was suffering from the classic Apple upgrade syndrome—upgrade your >1 year old piece of hardware to the latest OS, and start taking a lag hit with every action you take. My bottleneck seemed to be a mix of memory and HD access time.

The common suspicion I heard echoed from some friends is that Apple has no incentive to bother performance optimizing / testing for older platforms beyond a minimal “does it crash” threshold.

Well, with a non-SSD and only 4GB of RAM, I suppose I was not in a position to develop conspiracy theories.

I was considering upgrading my Mac (to something like one of the new Macbook Airs or Macbook Pros). After evaluating it for a bit it looked like my two main bottlenecks are memory (I had 4GB at the time) and hard drive read speed (had a 256GB non-SSD), not the type of thing you’d need to replace your full machine for (e.g., if you really want a Retina display, faster processor [how much compiling are you doing anyway?], or to move to an Air-sized laptop).

So I upgraded my Mac!

Choosing the Parts

Came across a nice memory upgrade guide that Crucial put together that told me which hard drives and memory sticks would be compatible with my machine. Then I did a bit of research on alternatives, found the items on Amazon, and ordered them.

Crucial 8GB memory kit

Crucial 480GB SSD

Rosewill 45 Piece Computer Toolkit

USB Hard Drive Enclosure (to copy my old files over)

The upgrade process was fairly smooth, save for having to find a Philips-head #0 or #00 screwdriver. Those things are small!

Searching, searching, searching through my tech boxes and such. Aha! I happened upon a good sized screwdriver in a computer toolkit I got back when I was building a gaming PC and went to work disassembling according to Apple’s service instructions.

For the SSD conversion I had to take off the nut things on the side, so I needed a Torx screwdriver, and that same kit had a tool close enough to work.

The tough part was getting the bottom of the case back on. It didn’t snap back into a perfect position, it took a bit of eye-balling to make most of the screws line up.

Installing OS X Mavericks

I decided instead of copying my entire drive over I would start fresh. Before I began the disassembly process, I put together a bootable drive using an old USB hard drive.

I used the boot disk creation instructions here (I went with Option 1, using the terminal command createinstallmedia to put the drive together).

I had a brief moment of panic when I turned the Mac with new SSD and RAM on and my hard drive was not recognized.

After Googling it I saw I needed to format the drive before going directly into the installer. Fortunately the boot disk has Disk Utility which you can use to do that.

All in all it was definitely worth it. My machine is running speedily now and I can do screencasts without it feeling incredibly slow.

Getting a Few Fun Utilities

Since I had an empty Mac and I was installing my standard gamut of apps (Divvy, Launchy, iTerm, etc.), I figured I would try some new ones.

Some fun ones have been:




BetterTouchTool (set up a trackpad option to close a Chrome tab)

Now down to work!

UPDATE: Conclusion: Worth it!

The upgrade was definitely worth it. Swear I’m saving 5 seconds every minute by not having to endure extreme lag (even responding to a message in Messages would take 15-30 seconds total, and when the un-closable “Update OS X” popup would show up, it would be another 30 seconds to open the App Store app).

The extra hard drive space has been great, too.

Some Redditors on the /r/mac thread mentioned that enabling TRIM (either via some pretty hefty shell commands or by a TRIM-enabling app) is sometimes necessary for non-Apple produced SSDs. According to this discussion, though, Crucial techs suggest not enabling TRIM on their SSDs.

I additionally followed some of the steps in this guide that will help improve the life/performance of the SSD.

All in all:

Building the Heroku for Unity

As part of playing around building a “Heroku for Unity” style app, I’ve been looking into automating Unity build processes.

Ah crap, that’s backwards, isn’t it… Try turning your head backwards to read it! 🙂

To do this, currently Unity will only build from Windows or OS X. While OS X would be preferable (as it would allow for a smooth transition to the logical next step of building of iOS apps), cloud deployments of OS X servers tend to be more expensive and would require an infrastructure other than Amazon EC2. It’s a possibility down the line, but for now I’m targeting simple web, Android, Windows and OS X native builds.

Here is the stack I’m looking at:

Using Windows Remote Desktop Client to access EC2 Servers on OS X Mountain Lion (or, 10.7+)

Windows Remote Desktop Client is required for administrating servers on EC2, and apparently the version available on the Microsoft website is only available for OS X versions 10.6 and lower.

Since I recently upgraded to 10.8 I looked for somewhere to get a RDC that would be compatible.

I found a thread mentioning the Windows RDC version 2.1.2 works, so I snagged it from here.

You need two things to connect, the EC2 location and the default Windows username and password. The latter is found by right clicking the instance in the EC2 instance dashboard:

This window will ask you for your private key (.pem file) that you got when you launched the Windows Server instance.

Holy sh*%! I’m running Windows in the cloud:

Now down to work…

These instructions for setting up a Windows Jenkins slave are helpful and apply well to EC2 (as long as you make sure your access control permissions are correct).

For some reason I had to Google how to open Internet Explorer… found navigating to it was the best option.


Installing Jenkins slaves requires Java is installed on your image, so let’s do that now:

Solution to “Your current security settings do not allow this file to be downloaded”

Downloaded and installed Java (though the `java` command in PowerShell still does not work)

And one more issue:

And the fix (set the correct Email notification / Hudson URL).



Why Unity is a Big F*@#$ing Deal

Why Unity is a Big F*@#$ing Deal

or, Staying ahead of the curve in videogames

or, Why Unity is crushing the video game industry

or, How game developers (indie and professional) are working faster, better and smarter with Unity3D

Unity3D is a big fucking deal.

When I first heard about Unity3D I was nonplussed. Oh, it’s another “make games the easy way” toy, like Game Maker, Scratch, or Stencyl.

I was dead wrong.

Some shit is happening right now in the game industry, and Unity is the right place at the right time doing the right things.

Absurdly cross-platform (editing and publishing)

Unity’s games can be pushed to iOS, Android, OS X, Windows, Linux, Flash, Unity Web player, Xbox 360, PS3, Wii, Windows Phone 8, Blackberry and Google Chrome Web Player.

Unity’s game editor (and bare bones IDE, MonoDevelop) can be used on both OS X and Windows.

Game companies today need to target mobile. Games on portable devices will account for $20B revenue by 20181, so you can bet your ass any game company worth its salt is working on baking a piece of that pie.

Unity started out in 2000 as a way for Unity’s creators to build games for the Mac:

“The ridiculous and bizarre thing was literally the first and only platform we supported in the very first months was the Mac,” said Helgason, who is now based in San Francisco. This was before the Mac’s resurgence, and the Mac’s place in the gaming industry (especially compared to Windows) was even punier than it is today.2

Now they’re targeting mobile, web, and console.

The Death of Flash and Facebook-as-a-testbed

Adobe’s abandonment of Flash3 for mobile development and Facebook desktop’s general decline as an app consumption platform4 hit a lot of companies hard.

Facebook is now partnering closely with Unity and select gamedev outfits to drive adoption of the Unity web player on Facebook canvas.

Developers can now hit Facebook and mobile in one fell swoop. This is big:

Iterating on a game using A/B testing is simple on Facebook Canvas, a pain in the ass on mobile.

The Asset Store, or the first App Store for Code (and other game assets)

Unity’s asset store is perhaps the most important development in code re-usability since Perl’s CPAN.

Unity’s Asset Store : cpanm Module::


Apple’s App Store : apt-get

Unity3D game developers are happy to pay you for good work, and when you buy most modules you get the full source code. Write good code, get paid5.

Making Asset Store plugins pays more than making games

From the author of NGUI, a popular UI framework:

Meanwhile, NGUI was still earning me 3 times of my previous job’s pay… 11 months after its initial release.6

And from the game he was working on? Made $800, spent $71,000 and 8 months of his development time.

In the end, after 8 months of development and as of this writing, I have sunk about $71,000 into its development, not including my own time, and have sold around 100 copies at $7-$10 each, earning me roughly $800, with a final net loss of about $70,000.

And the game starter kits he threw together and put in the Asset Store? +$13,000.

Looking back at the stats (which I’ve tracked daily), even the simple Game Starter Kits that I’ve put up on the Asset Store over a year ago, and spent roughly 2 weeks of my time on, have been pulling in about $700 to $1500 a month. That’s a gain of roughly $13,000 for something I created over a year ago and barely spent any time on… versus a loss of $70,000 for 7 months of my time working 100 hours a week.

He gets paid more to refactor his code than the product you’re making. Maybe I’m naive, but I haven’t seen anything like this before.7

The Helpful, Huge Community

Have a problem with your game? Want to figure out how to make a crazy whirlpool camera effect?

Just fucking Google it8. Unity’s support and education community has hit terminal velocity, if you get a stack trace, JFGI, there’s a discussion about it already. If you want to do something you haven’t before, there’s a YouTube video, forum post about an asset store plugin that does it, and StackOverflow post about the 3 different ways to do it and their benefits and drawbacks.

In addition to a bustling IRC channel ( #unity3d), there are Unity Answers (re-branded StackOverflow) and Unity Forums.

  1. DFC Intelligence » DFC Intelligence Forecasts Worldwide Online Game Market to Reach $79 Billion by 2017. at 

  2. How Unity3D Became a Game-Development Beast. at 

  3. Isaac, M. Jobs Was Right: Adobe Abandons Mobile Flash, Backs HTML5 | Gadget Lab | at 

  4. [citation needed] 

  5. Unity: Devs can ‘make a living’ from Asset Store | GamesIndustry International. at 

  6. Interesting year. at 

  7. To be fair, ArenMook is likely Unity’s #1 most successful asset store author, and Unity’s 2D and GUI support was an especially egregious omission. ArenMook now works for Unity on their new GUI system (and isn’t fixing NGUI’s shitty atlasing/layering workflow!!@*(#!) 

  8. But search for Unity3D, not Unity. Unity still suffers from lexical competitors Ubuntu Unity 

A code interview course: validation and initial groundwork

I’ve been doing some Skype interviews with some group members who mentioned in a survey that were interested in chatting with me to help figure out what sort of product / course I might be able to offer (some call them “Customer Interviews”, or the more ominous sounding “Idea Extractions”).

It sounds like there are basically two segments of Coding for Interviews customers who have slightly different needs:

  1. People preparing for interviews in the next month, the “sprinters”. This group is largely soon-to-graduate students from various schools (Brown, MIT, CMU, etc.). Product-wise they are interested in an online course / info package, most likely a one-time purchase, tips on interviewing, negotiating, “which topics do I need to review and what problems should I work through”. I need to talk more with people from this group to determine their price range. One analogue would be the $49-$99 One Month Rails course, but the argument could be made that poor college students are less willing to pay money on something than people who want to learn rails to start a business, but another argument could be made that it’s worth investing some money in prepping for interviews because the payoff could be in the $10,000 range for your job, and (this is a bit of a logical stretch) compounded over your career something like $100,000-$200,000.
  2. People who just like to keep on top of stuff and prepare over time, the “marathoners”. This group is a lot of software engineers (the list has members who work at Google, Amazon, Adobe, Twitter, Microsoft, Apple, DreamWorks, Square, CERN, Symantec, Pivotal Labs, Qualcomm, Raytheon, Samsung). Product-wise they are interested in a system to just stay fresh and remind them to practice (which the current newsletter fulfills well). They would be willing to spend between $5-35/month on premium periodic content, a model more akin to the $8/month Practicing Ruby or something like the $9/month RailsCasts)

The three fine individuals I chatted with (they had responded to my survey a few months ago indicating interest in a Skype call) were interested enough in a course-style product to actually PayPal me $25 to pre-order whatever-the-heck I ended up making (which will, of course, be refunded if the course does not get made). I was very nervous bringing that offer up but once they said “heck yes!” it made the validation feel a lot more real.

Customer interviews have been great—1) they’re motivational, 2) they help you prioritize your work, and 3) they make for much closer relationships with your group members. I would feel perfectly ready to chat with a group member the next time I’m wondering about something. Once you get over the hump of chatting with someone for the first time it gets easier and more enjoyable.

The other thing I did this past week was send out quick heads ups to CS department academic advisors and staff who might want to share programming interview resources with students and may occasionally email out to CS jobs@ mailing lists. I posted a quick task on to check top CS departments and produce a list of contacts—for $20 they delivered a spreadsheet of ~100 CS department contacts formatted like so:

Screen Shot 2013-10-07 at 2.45.46 PM

Putting aside a couple of minutes over the next few days I sent quick hellos from GMail (assisted by Tout) and added a personal school-related note:

Subject: Weekly programming interview practice questions

I realized this might interest CS students this time of year. Each week I send a real programming interview question and CS topic overview email to some engineering friends for practice.

It’s been a great way to space out your exposure to the types of questions and topics that get asked over and over at engineering interviews. Especially if you can’t make any resume workshops or mock interviews.


At first I was a bit nervous—what would they think? Would the professors be upset that I emailed about something non-academic?

I sent a few and waited for some Happy Gilmore “you sucks” to come in…

After the first “this looks great, thank you!” response my palms stopped sweating. Then a few more later it was clear this was a good choice, receiving 100% positive responses and thank yous from faculty, staff and students (and ~500 new members over the past three days).



Compounding Opportunity Costs: Five Things Software Engineers do to Kill their Potential

The Five Things Software Engineers do that Compound Yearly to Kill their Potential

1. Not refreshing core material

Software engineers have to spend a minimum of one hour per week simply reviewing and improving their skills and understanding of development.

Straight out of college, even computer science majors struggle to name a few common design patterns they will need to start grokking from their first day at a company.

If you are going to hit the ground running with new projects, understanding core computer science data structures, algorithms and design patterns is essential.

As Peter Norvig notes1, it can take 10 years or perhaps 10,000 hours to become an expert at programming. Some things you can spend your time on, snagged from Norvig’s list:

  1. Program
  2. Talk with other programmers and read their code
  3. Work on projects with other programmers both as the worst in the group and as the best in the group
  4. Learn at least 6 programming paradigms/languages (Java, ML, Lisp, Prolog, Scheme, Sisal). A great book for that is Seven Languages in Seven Weeks
  5. Work on projects other programmers have written. This is essential for a career software engineer. Working on pre-existing code is unavoidable, and an incredibly powerful learning tool. Learn what your code feels like to someone else2 and you will learn to become a more productive team member

2. Pursuing a Job instead of a Calling

In the field of work-psychology, there’s a saying3:

There are three types of employees:

  1. “Job” employees
  2. “Career” employees
  3. “Calling” employees

Job employees are there 9am to 5pm and do what their boss tells them.

Career employees take their career advancement seriously, being sure to do things that get them ahead and bode well for future jobs.

Calling employees take their calling seriously. That is, they care about what they do as part of their company and find ways to make their daily work tie in to their over-arching concerns.

Calling employees are more engaged at work, take the fewest sick days45, and are consistently the most productive.

3. Not communicating well

In software engineering, communication can be the ultimate time saver.

  1. Estimating task time and breaking projects down so they can be scoped down
  2. Requirements gathering and negotiation: figuring out the intent of a task can save you from doing it altogether, or let you engineer an alternative that is quicker and easier
  3. Interpersonal dealings: if you are upset about something, you should feel comfortable bringing it up and working with your company to solve the problem. Often times this is a matter of breaking the problem down to its core components and discussing those soberly (without lizard brain rage). This means if you want a raise, promotion or to work on different projects, you should be able to break down your reasoning in a way that your coworkers can accept

4. Not conducting deliberate, effective job searches

When you look for a job, what do you do?

Does the job find you via email, or do you perform an intelligent breadth-first search based on your long-term goals?

The impact of your job choices, compounded over multiple moves, can be enormous. It will define who you work with and learn from, what you work on, and how happy you can be. Do not take the job search task lightly.

5. Not preparing for interviews

Like job searches, programming interview success or failure can mean the difference between long-term success or failure, compounded over multiple job search periods.

This, and conducting an effective job search, are maybe the quickest, easiest, and highest-impact changes you can make starting right now.

Have you ever failed at a job interview due to lack of preparation? Not a good feeling.

Just a few minutes each day in the month preparing for your interviews can mean a lifelong difference.

Fight back

It’s possible to work towards realizing your full potential. Deliberate practice and continuous determination can get you far over time.

Coding for Interviews, my weekly programming interview question newsletter can be a valuable resource (one email per week, no spam, easy unsubscribe):


  2. If for some reason you will never, in your entire career, have the opportunity to work on shared code, try revisiting your code from three years ago and work with it. 
  3. Hall, D. T. & Chandler, D. E. Psychological success: When the career is a calling. J. Organ. Behav. 26, 155–176 (2005). 
  4. States., U. The power of federal employee engagement. (2008). 
  5. Surprisingly, career employees take more sick days than the job employees.