So You Want to be a Programmer

The pamphlet people assume they receive when becoming a programmer.
The pamphlet people assume they receive when becoming a programmer.

In my quest to become a programmer (coming from the world of marketing and product management), I am sometimes asked by my fellow newbies what it takes to get to a point where you’re ready to take on a programming role.

Not that I’m the expert, but I’ve given it some thought around what really helps build good fundamentals for any language, framework, or role you step into, and I thought I would share!

Understand Variables, Loops, and Conditional Statements

If that looks like gobbledegook to you, that is okay! These are terms that we use in the programming world (and plenty of worlds outside of that!) that refer to specific concepts that are found in all programming languages.

Variables are ways to store data into a named reference point, so that you and your code can refer to it later. It’s pretty much like saving your friend’s home address into Google Maps or into your phone, you took the data (their address) and gave it a name (your friend’s name!) so that the next time you’d like to retrieve their address, you just type in their name into the search bar and ta-da, you have the relevant information at your fingertips!

Loops are used when you wish to repeat an action over and over again, for whatever reason, until you tell your program to stop. It’s useful for when you’re looking through a list of data, or you’re counting from zero to 100, or almost anything where you need to work through many things and do something for each one. If you’ve ever played the same song over and over again until you got sick of it, congratulations, you created your very own loop to repeat that song until you got bored, or the music player died.

Conditional statements is a fancy sounding term for what is essentially logic gates. Which is another fancy term for telling your code to look at something, see if it fits into what you’re looking for, and then do something if it does. You can also have it do something if it does not fit into what you’re looking for. If you imagine yourself going into a concert, or a movie, or an airplane, anything with assigned seating, you’re walking down the aisle looking for your row and seat number, right? You’re essentially using a mental conditional statement to look for whether the seat you’re looking at is the one that you’re assigned to, and if it is, you take the seat!

Of course, I’m oversimplifying what these three terms are and what they could be, but it’s for the sake of illustrating these simple-sounding concepts that are pivotal to the world of programming. You must have a solid grasp of all three, regardless of what language, to advance and progress in your learnings.

Get Comfortable with Version Control

Version control is life. Really, not just meme-ing this post up, but version control systems (sometimes referred to as VCS) are useful for the sake of being able to track changes happening to your code (which is super helpful in figuring out what broke something) as well as preserving your code somewhere other than on your hard drive (if you use a hosted solution).

Popular version control systems are Git and Mercurial, but there are many more. These two flavours in particular are distributed version control systems, meaning many people can work on the same projects, making it easier to collaborate and work on projects concurrently without blowing everything up.

Websites like GitHub and Bitbucket are useful in hosting your projects as well as all of the changes checked into your version control system.

Now, if none of the above made sense to you, don’t worry about it! There are many, many resources to get you started on version control systems, and the sooner you start the better because having good habits around good version control will save you from so many headaches in the future. Source: am the man creating many of those headaches for others.

The important part is that in order to participate with a team of developers, version control will have to be part of your arsenal, and the more you know the better.

Build. Build. Build. Did I Mention Build?

Image of author’s reaction to own projects.
Image of author’s reaction to own projects.

We all have to start from somewhere, and there’s no better way to do so than building anything. And I literally mean anything.

In the programming world, the term “hello world app” is a thing that means we take a language, and as a first step, find a way to get it up and running and just have it print “Hello world!” It doesn’t matter how you go about doing it, but it really reinforces the point of just getting something up and running as a first step. You can go from printing it out, to asking the user to type in something to print, to manipulating the text, to asking for their name, and really, there are a million different things to do as long as you want to poke around with things.

Not to mention, it is far easier to get your foot into the door when you have a clear paper trail of projects that you’ve started, worked on, and especially finished and published. I would prefer to speak with someone who has a multitude of different projects that they’ve created or contributed to without proper work experience over someone who has years and years of work experience but no real projects or contributions to speak of.

In addition, by continuously building and poking around with code, you’ll be referencing documentation, searching the web for answers to problems you can’t quite figure out, and asking your peers for help. All three are must-have skills when it comes to programming, and it’s something that becomes sharper as you build and build and build.

I often say that I’m not technically smarter than anyone around me, I can just google way better than you can.

Find a Community

I left this for last, despite how lame and vague it sounds, because it’s potentially the most important. Despite stereotypes and firmly held beliefs, programmers can and should be as social as possible. Whether that’s in person or online, it matters not, as long as you find people who can share in your struggles or have shared them in the past, because it makes it far easier to motivate yourself when you have a group of people you can turn to for advice, or to commiserate with.

Personally, when I decided to throw everything into programming in March of 2015, motivation and direction was sorely lacking. I was hacking alone at home with my computer, building small little apps here and there, while googling the problems I ran into. Sounds fun.

Luckily, two things happened: I reached out to a group of friends who are seriously talented developers, who gave me a push in the right direction as well as started helping me review my code, and I stumbled onto slashrocket, the community that’s fuelled a lot of my motivation over the past couple of months. When you have a group of people who are either learning with you, or have already been there and done that and can give you advice and help, it makes it so much easier to find fun projects to work on, ask all the stupid questions that you might need to (I had a lot), and just have a social environment where you can hang out all day and casually chat with like-minded people.

The community aspect is huge for me, because I feel like it’s what will really make the difference in the long run. Schools like HackerYou and Bitmaker Labs are great for the curriculum they offer, but I firmly believe that their real value-add, in my opinion, is that you’re in a room with a bunch of people in the same struggle, being lead by people who have been there and done that. And that’s just a powerful environment to be in.

At the end of the day, whether or not you think you are ready to jump into the world of programming is up to you. It’s a mental game where you have to push away all doubt, take some risks, and get some confidence in your skills to be able to sell yourself to an employer, a business partner, or yourself.

It’s been a super fun journey, which I’m still totally on, but I’ve loved every minute of it.

The Potential of Fitness Bands (as of early 2015)

Fitbit Flex vs Jawbone UP24

A few weeks ago, I was given the opportunity to write a product review on the Staples TechHub on the Fitbit Flex and the Jawbone UP24, comparing the two side-by-side.

They’re lovely products, and the sheer act of having a physically visible device on my wrist kept me thinking about my current activity levels and whether I was doing enough to get to my 10,000 daily steps goal.

However, unless you’re a runner, or meticulous about entering in the exact food items you’re eating (with the correct measurements,) it felt like pedometers with fancy apps. I would feel little buzzes or get notifications every time I hit a milestone or completed my goals, but I had very little incentive to do much more than let it passively measure my daily activity. The portions of the band and associated apps that were not automatically tracking my activity or consumption really felt like more of a chore than a supportive partner in the pursuit of better health.

One could argue that staying fit and healthy is hard work, which I agree with, so remaining diligent and keeping track of your food and exercises manually is part of the process. Personally, I just feel like I could track these things myself, without having to stay within the confines of the options available in someone else’s app.

Not having tried all of the offerings on the market, in terms of fitness bands, I’d make the argument that while the devices aren’t all-encompassing when it comes to tracking health and fitness, it’s at least a great start. You get an idea of your resting caloric burn, your level of activity throughout the day, and have the option to track your consumption and activities. I know the Fitbit Surge offers GPS and heart rate monitoring out of the box (with 7+ days of reported battery life!) and would be a great start on covering more ground in terms of fitness, if I were so inclined (and if I could afford it!)

At the end of the day, it excites me to see this space heating up with different devices offering different benefits as selling points, and I can only imagine how integrative and powerful these tiny little devices will become in the next five to ten years.

Do you currently use fitness bands or other wearables? If not, what would it take to get you to wear one?

Shoving Music Into a Cloud: My Life with Spotify

Shoving Music Into a Cloud: My Life with Spotify

I constantly have some sort of music playing. In the background, in the foreground, in another room, it doesn’t matter, I want something playing at all times. Considering my Last.FM account passed 80,000 scrobbles recently, I’d say I have some pretty high demands of my music.

In September of 2014, I decided to fully ditch my offline music library.

By that, I mean I purged the music on my phone, the music on all of my computers, and didn’t even bother making backups of those files. I went all in, in the name of a grand experiment: what would life be like when relying completely on online music streaming services?

Specifically, I went whole hog with Spotify. Which was great timing, because it had just come out in Canada.

TL;DR: It’s pretty great, and I only have minor setbacks once in a while.

Internet Always Required

One of my biggest reservations was that I constantly needed an internet connection to listen to music. Meaning if the internet were to go down for an extended period of time, or if I were out in the boonies with no reception, or if I’m commuting on the subway, I would have no music. I’ve been in those situations several times each, and frankly, there is no easy way out of it.

Spotify has a feature for Premium members to make their music available offline. I haven’t had the chance to try it, but I assume it will just be music downloaded to my devices, similar to filling my library.

A persistent internet connection will be the largest problem with making the full leap into online music streaming providers, and there’s no way around it. However, living in Toronto means I will have a persistent internet connection about 98% of the time, and so this is really only a once-in-a-while issue for myself.

The Latest and Greatest

Another reservation about making the switch is that the latest releases from artists may not make it into your platform of choice, for whatever reason.

As an example, when Taylor Swift’s 1989 album came out, I wanted to see what all the hubbub was about, so I typed in “Taylor Swift” into the search bar and found nothing. I mean, absolutely nothing. After some digging around, I learned that Taylor Swift and her record label didn’t want anyone on Spotify to listen to any of her music at all. End result? I didn’t give it a chance, at all.

As a counter-example, however, Drake recently released his new album, If You’re Reading This It’s Too Late. He released it during the evening, something like 11PM EDT, and I read about it in the morning. While it wasn’t attached to his artist page on Spotify yet, a search for the album name brought it up and let me listen to it within seconds.

So what’s the end result? Well, the latest albums and singles from artists won’t always be available, and there are alternatives to listen to them (cough, YouTube, cough) but it’s going to depend on the artist and the rightsholders.

For the most part, this will hardly be an issue. At least not on Spotify thus far.

The Oldest and Greatest

One of the benefits of having access to hundreds or thousands of artists and their full musical library is that you can feel like listening to something, and have it play within seconds.

Just this week, I felt like some old school hip hop on Monday, hard hitting trance music on Tuesday, lovey-dovey indie folk songs on Wednesday, indie electro on Thursday, and 90s R&B slow jams on Friday. Within seconds, I was able to find a playlist, an artist, or start a Spotify radio station and jam along to my incessant musical wants and needs for the day. No sweat.

Discoverability is Now a Thing

The lovely thing about finding random playlists or starting radio stations off of songs you like is that you sometimes run into artists that just resonate. It’s been happening non-stop since I made the switch, and I don’t think it would have happened as organically if I were listening to my offline collection.

As I write this post, I started with a featured playlist called “Indie Pop Chillout,” and I’ve already saved a few of the songs from artists that I have never heard from before. Call me a bit slow on the uptake with new music, but it has never been this easy to listen, discover, and save new music, going back to the days when I would record songs off of the radio using tapes.

Different Experiences by Device

Speaking only about Spotify, I’ve found that I get a different listening experience based on the devices I listen to. Because I’m not a Premium member, I will have ads playing between blocks of songs, and that’s fine. They’re unobtrusive, they can be informative, and the gentleman has a rather pleasant voice.

However, on my phone, I can’t pick and choose which songs to play. It’s forced shuffle play, apparently unless I have Premium. On my iPad and desktop PCs though, I can pick and choose whatever I like.

I’m not sure if that’s because a lot of people listen to Spotify on their phones and that’s the best way to encourage upgrades to Premium, but it can be a bit jarring at times. Like when I’ve shuffle play’d on a specific album, only to have it play things from different albums or different artists altogether.

I should probably take the plunge into Premium, but I really haven’t found a burning desire for it, and the annoyances are minor enough to ignore. I hope that doesn’t change any time soon.

Was it Worth The Switch?


Before I streamed entirely from Spotify (or any other music service,) I kept up a library of about 50-60 GB of music. I’d continuously feed it new releases and singles, and go through the work of maintaining the labels and metadata to make sure that I was looking and listening to the right thing. The library was constantly growing and would not fit into any phones or devices I owned in its entirety, so time was also spent picking and choosing what was the flavour du jour. And don’t even get me started on creating backups of this library.

Now, I don’t even think about these files that I used to collect and maintain. If I feel like listening to Stars tonight, I just type in Stars and away I go. Sure, it won’t always be available and I won’t always have the latest releases, but the accessibility and convenience sure are one tough offering to beat.

It’s pretty darn exciting to see what Netflix and Spotify have done to change my consumption habits with regard to movies, tv shows, and music. To think that these companies are creating such great offerings, that even the most fearsome pirates (arrrrgh!) have curbed their old behaviours.

I, for one, welcome our new cloud overlords.

Have you made the switch? What were your reservations before making the switch, and what did you end up experiencing? Let me know in the comments!

Life Lessons From Reddit

When I surf through Reddit, I occasionally find threads that are just worthwhile to save, because they make me laugh, because they’re interesting, or because they cause me to think.

Tonight, I found one of those threads that really made me think, and you can find it here: What is something someone said that forever changed your way of thinking?

And I’ll leave it up to you to decide how it makes you feel, but I just wanted to share a few of my favourites…

I was 13 years old, trying to teach my 6 year old sister how to dive into a swimming pool from the side of the pool. It was taking quite a while as my sister was really nervous about it. We were at a big, public pool, and nearby there was a woman, about 75 years old, slowly swimming laps. Occasionally she would stop and watch us. Finally she swam over to us just when I was really putting the pressure on, trying to get my sister to try the dive, and my sister was shouting, “but I’m afraid!! I’m so afraid!!” The old woman looked at my sister, raised her fist defiantly in the air and said, “So be afraid! And then do it anyway!”

That was 35 years ago and I have never forgotten it. It was a revelation — it’s not about being unafraid. It’s about being afraid and doing it anyway.

My old boss, the CEO of a small hospital, told me a story from back when he was a lab technician (for simplicity, let’s call him Dan). Dan had forgotten to check some sort of mechanism on a piece of equipment he used, it malfunctioned and broke the equipment which ended up having around a $250,000 repair bill. The next day Dan’s boss called him in to talk about it, and he was sure he was going to be fired. His boss asked him why he didn’t do a proper check, made sure he understood what happened and sent him back to work. Dan asked him “Am I not getting fired? I was almost sure that’s what this was about.” His boss said “No way, I just spent $250,000 teaching you a lesson you’ll never forget. Why would I fire you now?”

It seems silly, but that attitude always resonated with me. Don’t make professional decisions based on emotional responses. Always know what your goal is when dealing with someone, and what exact problem you are trying to solve. Everyone makes mistakes, and yelling at them just makes them resent you and become defensive. Being calm and understanding will make people look up to you.

“Everyone you meet knows something you don’t.” My grandfather told me this, and it’s been a good reminder that I am surrounded by teachers.

“The person that you will spend the most time with in your life is yourself, so try to make yourself as interesting as possible.”

A small thing, but vastly more important than it sounds:

I was sitting in a bus once, and we came to the railroad tracks. There were some cars sitting inbetween us and the next red light, so if a train came, we’d be stuck until it had passed. That was always a couple of annoying minutes.

Then the light turned green, and the bus went across the train tracks without having to wait for a train. Pheew, crisis averted. Then, behind me, a mother said to her small child:
“That was too bad, we didn’t get to see the train today.”

That was the perfect way to frame that. Why not enjoy what you get?

Too many others to include, but a fantastic read.

Destiny: A Lengthy Review

Destiny: A Lengthy Review by Jon Lim

It has been exactly one week since the much-hyped Destiny was released into the world, and I wanted to really give it a fair shake before writing anything about it. At this point, I’m a level 17 Exo Warlock, currently on the starting point of Mars, have had my fair share of time in the Crucible, and I’ve participated in a handful of Strikes on the Earth and Moon.

If you understood none of that, it basically means I’ve played a good chunk of the single player game, I’ve participated in the multiplayer matches, but I have not had a chance to get into the end-game content, which would be Raids.

Pre-conceived Notions

To complete my disclosure, I played through a good amount of content on the public beta. I got right up to the level cap. I knew how to play the game the minute it was released on launch day, so I’m not sure if that changes this review. However, I will say I walked into the game with very low expectations, given that I was quite bored in the beta, and the whispers were telling me that not much would change between the beta and the launch.

Core Gameplay

Destiny by Bungie, Perfect Shooter Mechanics

Destiny, as a shooter at its core, is near perfect.

The controls are smooth and responsive, the guns feel impactful, and it’s extremely satisfying to blow up a huge chunk of enemies with a super. Enemies dodge, duck, dip, dive, and dodge whenever I’m around, and the variety of skills and weapons give you enough variety in build paths to really spice things up.

It’s a shooter with RPG elements, including level progression, but also weapon and armour progression. Both really add to the game, especially loot progression, but more on that later. The feeling of growth and progression are really well done in Destiny, and I’d like to continue playing to get a sense of what happens at the level cap and also what end game content feels like.

Graphics and Art

Destiny is absolutely beautiful.

Destiny is a beautiful game. Absolutely gorgeous graphics, really showing you what a next-gen title can do.

There’s something about zipping along the coastline on your speed-bike, as the sun is shining behind your character causing some lens flares, that makes you appreciate the care that went into building the world and making it look great. Crawling through alien tunnel systems or underground temples really made me want to explore the entire planet, and running into packs of enemies or treasure only sweetened the deal.

Seriously, the planets and areas that Bungie has created are absolutely stunning, and your first time touching down on a new planet always feels like an incredibly new experience.

Now, The Problems

Now that I’ve gotten my favourite parts of the game out of the way, we can start talking about the issues that are absolutely dogging this game. There’s quite a few complaints, so buckle in.

Your Shooter is Boring

The controls and shooter mechanics? Awesome. Fantastic. I would use them for every shooter going forward if I could. You took the best aspects of Halo’s controls and gameplay and made them better.

Everything wrapped around your shooter? Boring as hell.

Destiny can sometimes feel like a ghost town.

Every mission on each planet drops you into the same place, and you have to make your way to the progressively further objective. You’ll invariably fight through a few dozen of the planet’s enemies du jour, and you’ll reach your objective, where you deploy Ghost, who will tell you he will need time to hack into the system / steal data / mess with your enemies. But oh no, the jerks who we fought on the way in have discovered where we are and are sending a few soldiers to get you, whom are mandatory to kill before Ghost can complete his actions.

Save for a few missions, the variety of objectives is almost non-existent. You’re always going to have to fight your way to the objective, then you either deploy Ghost and defend him, or kill the big baddie that shows up.

Never mind the poor presentation of the story, the need to constantly go back to your ship, the long load times for going back to your ship or flying to a destination, and each planet being one large map that you will see over and over again through that planet’s missions.

The Community Sucks Because of You

Destiny's community could use some work for better communication.

I’ve run into plenty of people at the social hub, on planets during missions, and in multiplayer matches. However, there’s no easy way to communicate with any of them, except for doing the wave and dancing emoticons.

If you have no friends on PSN or XBL who play Destiny, you’re probably not going to have an easy time finding a Fireteam who you are able to effectively (voice) communicate with. There are ways around this, with subreddits like /r/fireteams, but that sort of defeats the purpose of being able to just jump in and play with the randoms that you’ll run into. Not that I’d want Destiny to become Warframe or anything, but being able to wave to people you run into and then being able to invite them to a fireteam, and being able to voice chat on that fireteam easily would be great additions.

A basic chat, easy fireteam creation, and fireteam chat. Any of those three would help facilitate the feeling of community and working for a common good that should exist in Destiny. The sense of community does not exist in Destiny simply because no one can easily communicate with each other, except when I express myself through dance.

Matchmaking and Multiplayer is … Odd

I don’t fully understand it yet, but I’ve played at least a dozen multiplayer matches, mostly on Control. If you aren’t familiar, Control is where you and your team control three points on the map and defend them from the other team who are trying to do the same.

Perhaps it was just my first couple of matches, but when I jumped on at level 6 (the minimum to play multiplayer!) it felt like I was getting curb stomped into the ground by much higher levelled people who had far better gear. The game says that level advantages are disabled, but I’m not entirely sure what that meant, or if that’s true. It just felt like I was getting wrecked by people who had better guns and armour, and better familiarity of the maps.

Skip forward to when I turned level 15 and I jumped back on Control maps: I was holding my own and often throwing down a 1.00+ K/D ratio, while usually leading my team in captures. I doubt I had become significantly better in my two additional hours of cumulative play time, and the only difference was that I had far better gear and skills for my Warlock.

It’s not a huge problem, but quite a horrible experience for anyone just dipping their toes into multiplayer, to get matched up with a bunch of level 20+ players who just splatter your face into the walls as often as they can.

Strikes are Awful, and Unsatisfying

Strikes are basically big bosses that exist as special missions on each planet, where you’re forced to be matched with other players to help you take on the challenge ahead. It helps to be over-levelled for these, trust me on that one.

Destiny's Strike missions are boring and unsatisfactory.

The notion of being grouped with two other people is actually pretty great, and I would have enjoyed it more had I been able to communicate with them at all!

Regardless, you’re once again dropped off on the same point, and you fight your way into the farthest part of the planet. Once there, you’ll run into a large boss of some sort that you’ll have to kill. It’s not particularly challenging, or engaging, or fun, to kill this boss. They are pretty much just a damage sponge with some sort of high-damage attack and/or minions to throw you off and give you ammo.

I played the Strikes on Earth and the Moon, and after both, I immediately said “Well, that was no fun.” out loud. They’re pretty cool bosses, as far as I am concerned, just far too predictable, boring, and completely unsatisfying wastes of time.

But There’s Potential

I didn’t want to end my review off on a negative note, because while Destiny has many, many, many issues that are present, I don’t doubt that Bungie will work the game into better shape given enough time. In addition, there’s a few things that have great potential and/or make the game enjoyable for me now.

Loot Drops Keep Me Going

Destiny's loot system is fantastic.

Perhaps just my love of ARPGs is propelling this forward, but I absolutely love the item system in Destiny. I love getting new items to compare side-by-side with my existing item in that slot, and min-maxing myself forward.

I enjoy watching my attack numbers spike as I make the right choices, as well as attacking faster, throwing grenades farther, or even the simple quick reload. I wish some of the cooler characteristics show up earlier on, to really draw you in, but it does force you to grind through some of the more boring parts of the game before you get to the fun guns and armour.

There’s an NPC in the Tower called the Cryptarch, and he levels up as you interact with him more and more and you receive items in your mailbox as well as discovering better items through Engrams, which is the Destiny equivalent of the “unidentified item.” Really enjoyable system, though I haven’t spent much time figuring out all of the benefits of levelling him up, nor have I received anything for levelling him up yet.

Multiplayer is Still Fun

Destiny's multiplayer leaves much to be desired, but is still fun.

I’m not huge on competitive multiplayer games, so I initially shied away from it in Destiny because I really just wanted to do some co-op missions and blast through alien jerks with friends by my side. However, once I tried multiplayer, I was pretty hooked. As simple as it can be, or even as unfair as it can be, you’re still able to kill people and contribute to your team’s success, and those actions are thrilling when you do pull them off.

On one control map, I single-handedly defended a point just by having well-placed shots and grenades, and anticipating room invasions well. It also helps that a Warlock’s super ability can clear a room quite easily, but finishing that map with that many kills and defends was a huge rush, and it made me keep going.

Playing With a Friend (or Two) Makes it Better

I had been playing solo until about level 9, because no friends of mine were ever online or even close to my level (they were usually further) so I never had the chance. However, one night, a buddy popped on and had a bit of time to kill, so we started up a PSN party, made a fireteam, and off we went on a few missions on the moon.

It was a far, far better experience playing with someone else doing the same missions as you. You’re able to tell each other enemy positions, you can chirp each other for missing shots, and you can have friendly competition on who can snipe the most guys from afar. It’s a completely different dynamic, being able to speak and verbalize as you play, compared to playing solo.

I mean, this is a “duh” moment, but it really shouldn’t need friends to make it more fun. However, given that it does, that’s a huge level of potential if Bungie were ever to fix fireteam creation and communication.

Public Events are Amazing

Destiny's Public Event system is incredible and fun.

Public Events are completely randomized events that occur on the planet that you’re on. I’m not sure if you have to be on the same mission as everyone else, but they appear and everyone in the area is alerted. You simply run in and start performing the objective (usually kill something or protect something) and you’re automatically included.

They’ve been tremendous fun because the entire area bands together to complete this event, and it’s always a good time seeing 5-15 other guardians shooting at one big baddie or protecting something important. I wish that’s how missions worked, or Strikes, or Raids, but I will settle for these fantastic and delightful random public events to get my fix of social and community interaction.

The Real Question: Is Destiny Worth Buying?

Initially, this would have been a resounding no. The game was boring from the outset, and repetitive to a fault, despite great shooter mechanics and an absolutely beautiful game. There are a myriad of issues with regards to being social, the lack of mission variety, and boss fights being just a lengthy session of “press the right trigger.”

However, Destiny has started growing on me. I’ve enjoyed the variety of planetary settings (despite having to run through the same set pieces for every mission,) the multiplayer can be thrilling and addicting, the loot system is pretty compelling, and public events are delightful.

If I had to give you a definite answer, I’d say: yes, Destiny is worth buying. But I’d probably wait until it went on sale a few months down the line, or pick it up used. It’s a fantastic shooter at the core, with tons of room for improvement. Hopefully, down the line, improvements do come because it’s an enjoyable game, but definitely not for everyone.

Destiny has been plenty of fun.

Sept 16, 2014, 8:57PM EDT – UPDATE: After watching a bunch of people try to take on the Vault of Glass, the newly released Raid, I retract any desire I had for matchmaking for Raids. It looks impossibly hard even with a well coordinated group of people, and doing that with a bunch of strangers would probably be an exercise in frustration. Looks fun though!

Google Spreadsheets: COUNT with Multiple Values in Cells

It’s been more than two years since I wrote a post on using Google Spreadsheets to use COUNT and FILTER in tandem to count values with multiple conditions.

Circling back, it does very well at allowing you to count when you need to validate multiple conditions. However, it falls apart the minute that your data is either messy or comes grouped with other data inside of a cell. Here’s an example where my original post would have trouble with:

Google Spreadsheets: Multiple Values in Cells

Why does it fall apart? Each cell can have multiple values inside of it.

To dig a little further, we have to understand that my original post called for using the FILTER function to pare down the data set into the specific rows that we need, and then using the COUNT function to count the result of the filter. However, FILTER does not allow for wildcards in its conditions for filtering, making it extremely difficult to account for data that is in the same cell as other data.

Luckily, there’s an easy way to get around it, using a crude but workable solution for counting values with multiple conditions, with sources that have multiple values in cells, extensible to messy or not-very-nice data.

The Scenario

In the above example, let’s say we’d like to count the number of items inside of Column A and Column B for every row that Item A appears in.

Manually counting them, we know that for Item A, it is listed on a total of 3 rows (Rows 2, 3, and 7) and has 7 values listed to its name in Column A, and 4 values listed in Column B. Hopefully I haven’t lost you, but I’m saying that we count the number of values inside Column A every time Item A is listed, and we do the same for Column B.

How would we go about doing this in Google Spreadsheets?

For the impatient, here’s what the formula looks like:


I know, I know, it looks odd and confusing, so let’s break it down starting from the very inside formulas.

=SEARCH("*A*", A:A)

This is what we’re using as a condition inside of FILTER. SEARCH allows us to parse through the values in a column or row and find characters or values that we’re looking for. In this particular instance, I am looking for the character “A”, but you could be looking for whole words, sequences of characters, you name it, and you have the possibility of adding wildcards on the outside of the term you’re looking for to make it catch every instance properly. Experiment with this, because I’m not 100% sure on whether or not the wildcards help in every situation.


When SEARCH is used in conjunction with FILTER, it returns a list of rows or columns (as specified by the first parameter in FILTER, in this case it’s B:B) that returned a TRUE condition for the SEARCH. The result would look like this:

X, Y, Z
X, Y, Z

This is returning B2, B3, and B7 respectively from my above example, because they had Item A in their Item column.

=JOIN(",", (FILTER(B:B, SEARCH("*A*", A:A)))

Using JOIN, you can combine all of our FILTER results into a single cell, where each cell’s values are separated by a comma (first parameter from JOIN, in this case “,” means separate values using a comma) and makes it nice and simple for us to analyze just this one cell.

X, Y, Z,X, Y, Z,Z

This is what our data now looks like, all inside of a single cell.


We arrive back at the original Google Spreadsheets formula, with SPLIT and COUNTA appearing. SPLIT allows us to break apart a single cell into many cells that contain each and every value that we have in the cell, as long as we let it know how the data is separated. In this case, it’s separated by commas because of the work we did above with JOIN, and we use COUNTA to count the non-numeric values that the data represents.

Doing this for Item A, we can quickly see that it has 7 items in Column A, and 4 items in Column B.

Easy peasy eh?

I linked the functions into the documentation for Google Spreadsheets as I listed them above, but here they are again, just in case:

If you end up trying this out, let me know what you think, or if you have any questions, or if you have any improvements or suggestions!

Scraping Steam for Data using Python + BeautifulSoup

As promised in yesterday’s blog post about analyzing public Steam numbers, here are the juicy technical details behind scraping a website using Python, and a Python library called BeautifulSoup.

Python Logo

The Method

I chose to use Python because I’ve been using it for a little under two years to do number crunching, as well as building a few automation scripts for work. It’s very lightweight, very easy to read, and quite a mature language.

That said, you can probably do this in whatever you feel like, but my approach consisted of the following steps:

  1. Poke the Steam & Game Stats page and get the HTML page that is served up to the browser
  2. Parse the HTML code and pull out specific numbers that would be useful for analysis
  3. Open a specified CSV file, and add lines to the file with all of the relevant data
  4. Close file, standby for next script run

What Was Used

The script is a very small file (33 lines!), and uses the following:

And you can take a look at the Gist itself to see the full script, but I am going to use this post to explain some of the methodology behind the script, to help people who want to learn about writing in Python and scraping web pages!

Alright, shut up, explain your code.

Of course!

steampage = BeautifulSoup(urllib.urlopen('').read())

This gets the ball rolling for the scraper. We use urllib to open a connection to the Steam & Game Stats page, and then read it with the BeautifulSoup library. If you are unfamiliar, I know I was, BeautifulSoup is a very powerful Python library that makes it super easy to navigate, search, and modify the parsed code you receive from websites.

In short: read the code of a webpage using BeautifulSoup, and you get all kinds of methods to chop and screw it to your liking.

timestamp = time.time()
currentTime = datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')

I wanted to use a consistent timestamp when recording data into the CSVs because it would allow me to group results in a sane manner. It uses the current time (of the script running) and formats it into YYYY-MM-DD HH:MM:SS so that when imported into Google Sheets, it would preserve the actual date and time aspects.

top100CSV = open('SteamTop100byTime.csv', 'a')

You’ll see two open(…) lines in my script, and both of them point to a specific CSV. This is where I dumped all of my data. The second parameter (‘a’) made sure I was opening and adding to the CSV, rather than continuously overwriting.

for row in steampage('tr', {'class': 'player_count_row'}):
    steamAppID = row.a.get('href').split("/")[4]
    steamGameName = row.a.get_text().encode('utf-8')
    currentConcurrent = row.find_all('span')[0].get_text()
    maxConcurrent = row.find_all('span')[1].get_text()
    top100CSV.write('{0},{1},"{2}","{3}","{4}"\n'.format(currentTime, steamAppID, steamGameName, currentConcurrent, maxConcurrent))

This simple looking for loop pulls out the Steam ID for the game, the English game name (as listed on the Top 100 list), the number of concurrent players (as of the script reading the page), and the peak concurrent seen throughout the day (I forget why I wanted this.) It also adds that information on a new line inside of the CSV.

In addition, this loop shows you the simplicity of the power behind BeautifulSoup. Let me break it down into smaller pieces because each one uses different BeautifulSoup methods.

for row in steampage('tr', {'class': 'player_count_row'}):

When I dug through the Steam & Game Stats source code, I realized that every game was listed inside of a table row with the class player_count_row. Upon seeing the pattern, I simply asked BeautifulSoup to iterate through every single block or table rows using that class, and as they are all uniform in their markup, can consistently pull out the information we need.

    steamAppID = row.a.get('href').split("/")[4]

With BeautifulSoup, you can make direct references to markup (as seen above), and then grabbing parameters within the markup itself (like ‘href’.) I did this to grab the URL of each Steam game, break it apart based on where the forward slashes (‘/’) were, and pulled out the app ID that was nestled inside of the URL.

    steamGameName = row.a.get_text().encode('utf-8')

Like the above markup parameter grabbing, get_text() is a very neat function in BeautifulSoup that allows you to grab the text for a link. The Steam & Game Stats page uses the game name itself as the link text, so it was a breeze to add to our collection of data.

    currentConcurrent = row.find_all('span')[0].get_text()

Nabbing the current and peak concurrent users is the same procedure, so I only need to explain it once. The find_all() function from BeautifulSoup finds the markup that is specified. It takes every single instance of that markup found and creates an array that can be referenced for easy modification or evaluation.

With the same methods and functions, I managed to easily find the current and peak concurrent users for Steam altogether.

Simple, right?

What else?

There’s nothing else, really! Those 33 lines were more than enough to collect lines upon lines of data inside of two CSV files.

There’s plenty of work that went into the analysis of that data, but that’s for another day.

Thanks for reading! As always, happy to answer questions or take feedback, so leave comments or yell at me on Twitter!

An Analysis of Activity on Steam

I have wanted to flex my analysis muscles for quite some time and thought I’d get some practice on publicly available data: the Steam & Game Stats page.

Steam Logo

For the unaware: Steam is one of the largest gaming platforms available for PCs, and they have a wonderful stats page that lists the current number of concurrent users for each game, as well as the current number of concurrent users in general. I’ve always wondered what actual activity levels were, ever since seeing this page, and so I decided to scrape that page for a week or two and see what sort of data I could get.

NOTE: If you’re interested in the technical details behind the scraping, I will provide that in a separate post in the near future.

The data I have managed to mine from this page is trivial at best, but I had a ton of fun learning how to build the scraper (uses Python, BeautifulSoup, and a handy dandy cronjob) as well as figuring out the required Google Sheets equations to put it all together.

Some Fun Facts About Steam Activity

On average, 19.95% of concurrent players on Steam are playing games.

Here is a visualization of what Steam activity levels have looked like from March 7, 2014 to March 19, 2014:

On average, 1/5th of the Steam “concurrent” user base is actually playing a game. However, I will concede that this is not dead-on accurate, as I only have numbers for top 100 games at any given moment, but is reliable for estimations because games in the top 90-100 levels account for 0.02% of the user base, meaning any additional users playing non-top-100 games will be relatively insignificant in their effect.

There was a big spike, on March 9, 2014 at 4:00pm EDT (16:00) when the number of Counter-Strike: Global Offensive players ballooned up to a staggering 111,893 players. Presumably for the start of a tournament. (Haven’t dug into this one too much.)

Dota 2 dominates games played on Steam, accounting for an average of 5.58% of the concurrent player base.

Not a real surprise, given the popularity of Dota 2, but the second most played game is Counter-Strike: Global Offensive, sitting at a distant 1.66% average, about three times smaller than Dota 2. This translates to an average of about 400,000 concurrent players, with the highest I’ve recorded at 673,018 concurrent players on March 15, 2014 at 10:00am EDT.

In fact, most of the highest numbers of concurrent players in Dota happens in the mornings from 9:00am to 11:00am.

However, might be indicative of the real struggle for MOBAs to fight against the titan amongst gods, League of Legends, which boasted an impressive peak of 7.5 million concurrent users in January 2014.

Hard to gain ground on such an entrenched competitor, but they’re definitely doing their best.

160 games have been a part of the Steam Top 100 between March 7, 2014 and March 19, 2014

While that sounds like a lot, we have to remember that the Steam catalogue currently sits at over 3,000 titles and growing, it’s pretty safe to say that breaking into the top 100 is no easy feat.

Further analysis that I could do as time goes on is to get a breakdown of the genres being represented in the Top 100 list, which would also provide a decent idea of what is and what is not popular on Steam. Not to mention that this is an extremely small sample size, it would be more worthwhile to get this data over a period of a year to make it really meaningful.

What’s Next?

Well, this is a big pile of data, and it’s growing by the hour. This is great, but what can I really do with this data?

For starters, the original goal was to figure out if there was a link between the digital marketing behaviours of publishers and the level of concurrent players on Steam, as well as growth or decline in player base from that activity (or lack thereof.) I will have to explore whether or not that is still possible to figure out, as there are a lot of marketing activities that are either harder to track down or even attribute towards the success of a game.

Secondly, I will have to step up the data storage game a bit to make it much more accessible. Currently, a Python script scrapes the Steam & Game stats page, adding a line to two separate CSV files with all the relevant data. I’d like to transition this into an actual database (probably MySQL) and maybe make it open to the public to poke at and do their own analysis.

Lastly, I’m really not sure. It was a fun side project in the first place, and I feel like it was a great learning experience and a fantastic way to brush up on my analytical skills.

Have any ideas or want access to the data? Give me a shout, I’m happy to share!

Octocat Attacks: Our entry for the GitHub Game Off

Near the end of October, a blog post from GitHub caught my eye, entitled: GitHub Game Off.

In short, GitHub was running a competition for game developers to build their games, host their code on GitHub, and have it loosely based on a git concept (forking, branching, etc). We were free to build it however we want as long as it could be open source. As a life long gamer, it’s always been a dream to build my own game, and that’s a dream that’s been also shared by awesome guy Wayne Sang.

We had been toying around with the idea of building out a game idea that Wayne had several months ago, and before Game Off, we had decided to build something smaller to get us acclimated with each other’s style and capabilities. GitHub Game Off presented itself as an opportunity to finally make this happen with real deadlines and actual work needing to be produced.

That game? Octocat Attacks.

Octocat Attacks Title Screen

You can view the source code here, and the playable version of the game here.

Most of the rest of this post is going to talk about the development side of things, as there were quite a few things I learned along the way.

Creating the Concept

When Wayne agreed to build a game for the competition, we sat down and hammered out a concept pretty quickly. I suggested that we use Flash, as it was probably the fastest way to get up and running with a game especially with established libraries already available, and that we make a puzzle game because “it’s far easier to build a silly puzzle game than a full blown action game!

Just for the record, I was going to eat those words.

We sat down for several hours to hammer out the concept: it would be match-3 style puzzle, it would be about a giant alien attacking Earth, and various countries coming together to build separate parts of a robot to defend against the alien. The loose association with git was that each country was essentially working on its own “branch” of the master robot repo, and completing a level was that particular country “pushing” their part toward the final product. Each round was timed, and your score affects the quality of the piece that is created, with three different possible tiers in quality, which also affected your final battle with the alien.

I also did some research around the best Flash library to use to build games, and I landed upon what seemed like the most developed and easiest to get started with: Flixel.

There were a handful of other engines available, but Flixel was really far along in development and actually powered games I had heard of (like Canabalt!) and so I ran with it. Just as a side note, once you start using it, Flixel really feels like it was built more for twitch-based games rather than puzzle games, I was lucky to find the Flixel Power Tools set which extends the capabilities of Flixel even further, allowing me to take care of some of the issues I was having with sprites in Flixel.

Starting to Code

Once my environment was set up, I began to write a few test games just to get a feel of Flixel and Actionscript.

Have I mentioned that I haven’t really touched code in a serious way since 2009? Have I also mentioned that I haven’t touched ActionScript since 2005?

Granted, I was very familiar with programming in the first place, so the learning curve wasn’t very steep for me, but it was one thing to be figuring out what I can and can’t do with Flixel, and it was a completely different beast trying to do it while learning ActionScript 3.

However, I got a prototype up and running relatively quickly. According to my records, we started brainstorming on October 27th, and I had a prototype with a 5×7 board full of temporary game pieces that could switch places on October 31st. I was rapidly iterating on the first prototype, creating 90% of the game mechanics by November 12th: puzzle piece generation, piece movement (swapping places), match checking and clearing, and empty space refilling. Nothing was 100% as it should be for a completed game, but it was a very quick start.

Around this time, Wayne chipped in with his awesome pixel art, and the game was finally starting to come together.

Refactoring Mania

Regardless of the level of stability, I was rather unhappy with how game pieces were being moved around and being checked as matches, so I spent a good week refactoring everything. And I mean everything.

Suddenly the game became less jittery and resource intensive, I had created a queue for the checking and clearing of pieces, but I was still being plagued by my code to animate the refilling of pieces on the board. It was a problem that I am still having trouble with to this day, and I feel like I’ve smashed my head against it enough times that I may need to refactor the entire thing to provide a different approach.

Oh well, that’s what branches are for, right?

The important lesson I have is that, and I didn’t know this because I am a complete newbie, Flash and ActionScript 3 runs code synchronously (I think.) This was a problem with the initial way I was refilling pieces, because I essentially had a for loop that would check every single spot on the board, and if there was no sprite within that spot, it would start the animation to move all pieces above the empty square downward to fill the empty spot and create the new piece. However, if you have two (or more) empty squares on top of each other, the new piece creation happens simultaneously and you have stacked pieces in the same square.

As you can tell, I am not very experienced with puzzle game animations!

Octocat Emerges

On November 19th, Wayne sent me an email where he sketched out the alien: he had taken the Octocat, of GitHub fame, and turned it into the alien monster attacking the Earth. It shot lasers from its eyes, it was adorable, and I think it gave me a bit of extra motivation to see this project go all the way.

Alien Octocat

Aw, aren’t you a horrible little creature?

Final Stretch

It feels like I’ve left out a lot of details, but that’s because the entire month felt like a blur. I was constantly trying to fix our animation problem while building out the HUD (score, timer, etc) and the functionality to power the HUD. Wayne was churning out all of the necessary art assets for the game, and it was starting to come together.

Eventually, we decided that we weren’t going to complete the game in time, and we were alright with that. We were both willing to continue working on the game at a more leisurely pace after the deadline had passed, and that’s one of the side projects I am really looking forward to.

At the end of the day, the v0.1 build of Octocat Attacks, as in the one we’re submitting to GitHub Game Off, is a very incomplete game. We have an incomplete puzzle engine, no audio, and our content is far from complete.

However, we got it out there. We took the effort to start our project and bring it this far, and we’re continuing to push on. I’m very happy with how the game looks right now thanks to the hard (and amazing) work that Wayne has put into his pixel art, and our game is functional, which is a lot more than I expected when we started!

It’s been a really fun and educational experience to build a game from scratch, and you better believe that Wayne and I are going to continue developing games.

Octocat Attacks Stage Select
Octocat Attacks Gameplay

FreshBooks + Stripe = Freelancer’s Best Friend

As an occasional freelancer, one of the more painful aspects in my day-to-day operations is the invoicing and payment collection.

Now, I’ve used FreshBooks for a good long time for the freelancing side of the business, and it has always served me well – keeping track of billable hours and expenses – but I’ve always found payments to be a tad annoying. The previous payment gateway I used was Paypal, simply because there weren’t any other useful alternatives.

And then, Stripe came to Canada.

Oh happy days! Stripe makes online payments with credit cards much, much easier, and when coupled with FreshBooks, it makes the collection of payments for invoices that much easier as well. Payments can now be made directly inside of the FreshBooks interface, and the payments will go directly to your bank account rather than sitting inside of Paypal.

To get started, you’re going to need an account for both FreshBooks and Stripe. Here are the sign-up links for those interested:

FreshBooks (Affiliate link!)

Once you’ve signed up for both services, go to Stripe and click on the “Your Account” button in the top right and head to “Account Settings” and navigate to the “API Keys” section of the settings popup.

API Keys from Stripe

You’re going to need the “Live Secret Key” in a minute, so keep it handy.

Next, click on “Settings” in the top right part of your FreshBooks account, navigate over to the “Online Payment” page, and click the box next to “Stripe”. A new section should appear asking for your “Live Secret Key”. Paste it in here, click “Save”, and you’re good to go!

Now, when clients want to pay off their invoices online using a credit card, they’ll see this button at the top of their invoice:

Stripe Invoice Payment

And clicking on it will bring up this payment form:

The real advantage, in my opinion, is that I can now control the entire branding experience, rather than having clients taken away to Paypal and then being directed back. The flow of payments is far easier, and you can still leave Paypal as an additional option if your clients really need that.

Happy freelancing!