Saturday, April 26, 2014

Knowing All of Your Competition (For Good, For Bad)

Here on PEI, the IT industry is fortunate in that a lot of its business comes from 'off-Island'. It's the typical fairytale IT dream... you don't have to be where your clients are and as long as you have a decent internet connection you can be anywhere in the world. Or, to tweak the old adage, "On the internet, nobody knows you're an Islander".

People on the Island here that are able to have a clientele like that are living the dream, so to speak. The big city clients with their big city chequebooks, paying big city dollars to someone that gets to live in relative peace and quiet out of the way.

Now don't get me wrong... this is not just a PEI phenomenon. The point I want to make with this post is the same point I have made with different people at different times from all over the place. From PEI to New Zealand, there are people living and working this way, but I've found a number of them have a small blind spot.

Over the last few months or so, I've had a strikingly similar conversation with a number of these people. When I talk to them about what they do, they are more than happy to discuss where their clients are and what work they do. I tend to also ask them about the technology that they are working with, mainly because I'm nosey.

After finding out these sorts of things, I tend to ask: do you know anyone else around here (or 'there') that does similar work? It still surprises me, though, when I'm told "I don't know... all of our competitors are not here".

The reason for my surprise has a few facets, so let me explain.

Firstly, I'm asking about other companies that do similar work. I can see why that sounds like 'your competition', but really, it's not. If you're business is a Ruby based web app that tracks your dogs' visits to the dog park, why would you only consider other companies that do the same type of app to be 'doing similar work'? The fact that you're discounting the fifteen companies down the street that have Ruby web apps for tracking your cats' visits to the backyard means that you're not paying attention to the fact that they could pivot quite quickly and become your competition.

From that, what I consider to be 'similar work' generally means 'using the same technology' with a hint of 'in your problem space'. To me, knowing this is just as important as knowing who your competition is.

If you don't know who else in your area is using the same stack, then you don't realise the potential for being able to get help when you need it. If you're working with a Hadoop cluster and starting to bang your head on the wall, isn't it easier to drive 5 minutes and grab lunch with someone who's already been through that (or at least going through the same pain). Knowing these people is important as you want to be able to know who can help you (and who you can help).

Extending that somewhat, you may find that together you can gain some interesting 'purchasing power'. A company I know is using a random JS library for their front end application. All too late, they found out that another company was actually paying a large amount of cash to get on site training for the same library. Imagine if the first company knew about this ahead of time: maybe together they could have got a discount for additional training hours, or at least been able to schedule similar training the following week, knowing that the trainers were already here.

For me, those examples are the 'good' reasons you need to know your 'competition'.

The 'bad' reason comes from the fact that I'm referring to these other companies as 'competition', still. You see, especially when you're working in a small, out of the way place, these other companies are, at some point, probably going to try and hire someone out from under you. If you don't know which companies around you are using the same technologies as you, then you have no idea who might be trying to take away your human resources, right now.

Put differently, your company and products are just a really complex system for consuming inputs and producing outputs. Your obvious competitors are the ones that are trying to push their outputs instead of yours. However, never forget your inputs. If you don't have coders for input, you have no product for output. And just because your traditional competitors are not geographically near you doesn't mean that you can ignore those that use a similar technology as you do.

If you want to be surprised one day, ignore those people that are looking to hire your staffing pool (either current or future). As a bonus, if you know who these people are, you may just have a really great source of help, too...

Sunday, December 15, 2013

My First Ever Coderetreat

Yesterday I was fortunate enough to attend the Summerside 'instance' of the Global Day of Coderetreat (my first ever) and already I can't wait for the next one.

The day is very difficult to describe without sounding like a cultist, to be honest :) There's something very awesome about being able to slowly, precisely and correctly write code without having any pressure to just 'get it done'.

For those that aren't familiar with the process, ours went something like this: partner up, write some code for 45 minutes then delete it. Add a constraint and repeat. While the goal seems to be "implement Conway's Game of Life", the actual goal, in a way, is to never quite get there :)

For our particular retreat, we started with basically just trying to implement GoL correctly. This means using TDD properly, and slowly implementing the code bit by bit. My first round I got to do it in Java, which is always fun.

After deleting the code, we added the constraint of 'no conditionals'. This time my 'pair' wrote in PHP and surprisingly enough got to the exact some point in the code as the first round (which I found humourous).

After lunch, we added 'use no primitives' (and 'no PHP' :) ). This time my partner and I decided to use Ruby, which was fantastic as I am an absolute beginner, and my team mate was definitely not an expert. We got to spend some time learning RSpec (for testing Ruby code) and we spent a lot of time simply discussing what the constraint meant. It was definitely a difficult thing to wrap our heads around, but this was the point where I suddenly realised that some of our constraints are not necessarily possible with all of the languages that we choose to use. This was definitely a pivotal moment for me. To be honest, it had been brought to my attention at the end of the first constraint, but this time it was me making the realisation by myself :)

Delete. Break. Try again. This time using JS and 'only return self'. Delete. Break. Back to Java and 'no more than 4 lines per method, ping pong coding' (and maybe something else). By this time, for sure, I was completely beat. My brain stopped working around 2:30PM and so to be honest it's quite possible that the constraints I listed may be out of order, wrong, or incomplete. Also, by the end of the day (and quite naturally) we were getting less and less code done, but there was more and more conversation around how we would do the code.

While these constraints may seem random or simply designed to annoy, each session ended with some really good discussion as to how these constraints actually make our code more testable, easier to develop (with some practice!) and ultimately better.

Lately I have been reflecting on my time at university. "Youth is wasted on the young", they say, and I believe, sometimes, that "university is wasted on the uneducated". The more I have been able to think about what I learned there, it seems, the more it is that I'm relearning all of these lessons again.

And that's a good thing.

I've also been reminded that I need to extend my knowledge of languages again!

Thanks especially to the City of Summerside for giving us the venue (and gigabit internet to boot!) and all of the organisers (especially Steven Baker and Derek Campbell).

I can't wait for the next one!

Wednesday, September 18, 2013

Please... No More Rock Stars!

Let me cut to the chase: I'm so sick and tired of seeing people advertising for software developers and using nouns to describe these future employees as something they are not.

As a possible candidate for this position, here's why I don't match what you're hiring...

I'm not a rock star. I don't have any recording deals, and I don't have groupies. More importantly, I don't turn around and leave you in the lurch at crunch time because I would rather do something shady at the hotel when I'm meant to be wowing the fans.

I'm not a ninja. For one I have very little martial arts training. More importantly, I don't come in in the middle of the night and drastically upset things so that when you come back the next morning you wonder "what the hell just happened?!?"

Finally, I'm not Chunk Norris (yes, I just saw this advertised!) I don't think I have to actually say anything about this but I'll tell you what... well, I'm not Chuck Norris.


I get it's all about advertising and marketing and all that crap but as far as I'm concerned, you're trying to impress the wrong people! Software engineers aren't about showmanship. We're not about trying to seem hip and happening and all that. We're about getting it done and doing it well.

I also get that there are some instances when you need what may be defined as a rock star. However, if you're not planning on paying that person a heap of money to always be on the road at conferences, selling your brand subconsciously, then I think you're doing it wrong. Alternatively, maybe, a rock star is someone you're hiring because you're hiring that person... in which case, you're not really going to advertise for them!

As far as I'm concerned, there aren't many people that look at an advertised position and think to themselves "you know what? I am a rock star!". As far as I'm concerned, the people that look at your ad and get their ego stroked that way are exactly the kinds of people you shouldn't want to hire.

Stop please. For my sake. Stop stroking the wrong peoples' egos and stop making yourself look like you're more about marketing than you are about development.

Please?

Tuesday, August 20, 2013

Roaming in the US... Now that's the way to do it!

We just got back from a 4 day trip in Boston. Because a lot of the time my wife and I were going to be in separate parts of the city, we really needed to be able to contact each other. Suffice to say, we were dreading the roaming charges!

Having spoken to our current cell provider, we were looking at $1.50 / minute for voice, 60c / message for text and $5.00 / MB for data. A $50 package would have given us 50 minutes, 50 messages and 25MB of data, before going back to charges that were approximately half of the 'non package' prices.

Only 50 messages? The worst thing about that is that it's incoming and outgoing, so really it's only 25 messages in a way. This was still going to be expensive!

We started to think about prepaid SIMs, but trying to organise that was going to be a hassle. That is until I found Roam Mobility.

There is one prerequisite for using Roam and it's the same prerequisite for using other pre-paid SIMs... your phone needs to be unlocked as far as the network is concerned. This is fine for us as we had Nexus 4's that only cost us $50 to begin with :)

So here's the deal: with Roam, you can buy a SIM card for $20 (I bought mine at the local Telus store). Once activated, that card gives you a phone number based in the US (note that it also only works in the US). So long as you use it at least once a year, you can keep that SIM. Once it's activated, you buy a 1, 3, 7, 14 or 30 day plan.

We opted for the 7 day 'Talk + Text + Data' plan and here's what we got:
- Unlimited talk within the US as well as to Canada
- Unlimited text within the US as well as to Canada
- A total of 700MB of data usage (for every day's worth of plan, you get 100MB of data)

How much? $27.95!

So for less than the $50 roaming package from our own provider, we got unlimited talk and text and all the data we needed / wanted. They even tell you how to set your phone up as a mobile hotspot for your laptop!

The coverage was no problem and it was probably the most simple process I have ever used for anything related to telecommunication.

So that's my tip: if you're roaming to the US, get an unlocked phone and jump onto Roam... I can't wait to travel that way again, just so that I can use it again :)

Thursday, August 8, 2013

Not Going to NEPHP? Try Pandacodium Instead!

You may or may not have noticed that I'm heading to Boston next weekend for the Northeast PHP conference. You also may or may not have realised there was a little sarcasm in that last sentence.

But what are you going to do? Where are you going to be? What if I told you that you could attend a hackathon instead?

Well?

Pandacodium is an online, world-wide hackathon that's going to run for 48 hours starting on Friday, August 16th at 7PM.

I don't know if the theme changes every year, but either way, this one is going to be focussed on developing real-time web applications.

Although I've never been to a hackathon, and I'm probably going to miss the one in Charlottetown in a few weeks, it's something that I'm itching to do... and now you all can! Please, let me live through your adventures :)

Seriously: I urge everyone that can to take this opportunity to flex your coding muscle, stretch your comfort zone, meet new people and more importantly have a heap of fun! Head over to http://pandacodium.ca right now and sign up. If I weren't going to Boston, I'd be doing this.

Let me know if you're going to go in it... I want to hear all of the gory details!

Monday, July 29, 2013

NEPHP 2013: Don't Be STUPID, Grasp SOLID

This may be getting boring, but too bad... there are so many talks to see at Northeast PHP this year!

Anthony Ferrara is giving a talk this year titled 'Don't be STUPID, Grasp SOLID' (see http://northeastphp.org/talks/view/33/Don-t-Be-STUPID-Grasp-SOLID and https://joind.in/talk/view/8907).

This is another one of those talks that I think I need to concretely square away some issues I've been having with my code lately. When I first started writing code, I always had small, compact functions. However, somewhere between here and there I lost my way.

I started cramming random meaning into particular function parameters, for example. Depending on the combination of 46 different parameters, the function would do one of 2,500 things... just because it seemed right to use the same function name. This may be because of PHP's lack of function overloading, or it may not. Either way, I realise now how stupid it all was.

Elsewhere, my code started pulling in random static classes, using singletons from static function calls and the like... this is all bad news when you start realising the benefits of unit testing, for example, but in reality, and in my older age, I've realised it's just bad news no matter what.

So like I say: I've started to come back around to smaller functions and classes and already it's made a huge impact on the way I work. I can honestly say that changing that particular approach to my coding has probably saved me more time and given me more safety than any other 'tweak' I've done to my 'style' in the last 5 years. And now that I have a taste for it, I'm looking for more!

Other than the actual topic, I've heard some awesome things about Anthony himself, so it'll be great just to see him talk anyway.

Hopefully you will too!

Saturday, July 27, 2013

NEPHP 2013: You Can UX Too: Avoiding the Programmer's User Interface

Just another talk I want to see in Boston this year at Northeast PHP 2013...

This talk is on a track that I must admit, I know pretty much nothing about. And to be honest, until recently I've tried to avoid it. But no longer! User Experience (UX) is definitely something I need to be on top of and conferences, talks and workshops are a perfect way to get on the way.

With this in mind, I'm looking forward to the talk 'You Can UX Too: Avoiding the Programmer's User Interface', to be given by Eryn O'Neil. If you want details, check out either http://northeastphp.org/talks/view/187/You-Can-UX-Too-Avoiding-the-Programmer-s-User-Interface or http://joind.in/talk/view/8931.

The reason this is going to be on the top of my 'UX exposure list' is specifically because it speaks directly to me. I am a programmer, no doubt about it, and this talk is addressing the simple (and dare I say obvious?) fact that UX is a problem for programmers. I'm really looking forward to getting an idea of how to take off my coding hat and stick on my UX hat easily, and hopefully more often.

For what it's worth, I'm not saying that I don't want to see any of the other UX talks. On the contrary, this whole realm of software is completely foreign to me and I really need to correct that.

And dare I give kudos to the conference itself for making sure to include this UX track? It's going to be fantastic to have such a wide audience at the one place... I'm looking forward to getting to talk to these 'UX-aware' attendees and finally being able to get an idea of how it all works.