Assuming you've been here in the past, you may notice that my site looks significantly different than before. That is because I have moved over to SquareSpace.

The main reason for the move is that my Godaddy hosting was about to come up for renewal, and I really didn't want to renew with them. It's kind of embarassing to host there in the first place. I also was tired of worrying about Wordpress, with all of the updates, security holes, commenting issues, etc. Finally, I just wanted to try it out. I've worked with it incredibly briefly for a project at work, and I wanted to get my feet wet.

I kept hearing about SquareSpace advertising on the various 5by5 shows, so I wanted to show my support for the network. So far, I'm very impressed. I was able to import my old wordpress blog and quickly migrate my pages. I haven't seen any hiccups, and everything was easy to locate and update.

So Bravo to SquareSpace!

AuthorMichael Cantrell
I just finished reading an article on Tech Crunch, and felt the need to comment. It is "They Ain't Making Any More of Them: The Great Engineering Shortage of 2012".

If you didn't read the article, how dare you, the basic gist is that there is a great need for engineers and computer science majors, yet we graduated fewer this year than we did in 1984. In fact, we graduated more visual and performing arts majors than computer science, math, and chemical engineering majors combined. The author hilariously dubs this the generation of "American Idols and So You Think You Can Dancers".

At first I couldn't believe it. I thought there were more computer science majors than before, but then I remembered that 2011 was the first year that the number of computer science incoming freshman at Georgia Tech was greater than the year before. Ever since the dot-com bust, enrollment had been at a steady decline. This should surprise anyone, because technology is literally the future. Every day we see more and more people worldwide on the internet. Every day more and more phones are sold. In many developing countries, more people have smartphones than computers. They manage their entire lives through them, even their banking.

In recent years it has seemed as though the United States has gravitated towards easy fame. The abundance of reality tv and stars famous only for how rich they are has pervaded the media. Kim Kardashian, Paris Hilton, Snooki, etc are all examples of misplaced fame and reverence. Not to mention the belief in instant wealth and fame that can be had on American Idol, The Voice, So You Think You Can Dance, The X Factor, America's Got Talent, etc.

Oddly, technology has the stories of fame and fortune, but they seem to be ignored. Bill Gates, Steve Jobs, Steve Wozniak, Mark Zuckerburg, Larry Page, Sergey Brin, and more. Perhaps these just aren't as appealing. They weren't overnight successes (neither are the singers or dancers), but they appear (whether true or not) to require more work than getting on a tv show and being told how great you are.

I agree with the John Bischke, 20-somethings have either lost or don't have the concept of long term value. I think the idea should be taken a step further and extended to all people. Studies show that when given the choice between a short term gain, and a long term gain that is unequivocally worth more, people choose the short term gain. We evolved to prefer short term gains. As a society, we have to overcome this.

The big question is how to move past the instinct of short term gains. I think the only way is education. We have to start educating our children to analyze two options effectively. The long term gain is not always the best choice, but it almost always is. By doing so, we will raise a generation of people that make better decisions. Then they will raise a generation that makes even better decisions. The goal is growth and perpetual motion towards our ideals.

Bischke seems to come to a similar conclusion, but thinks that sites like Code Academy and Code Lesson are enough for people to learn the skills needed. Yet earlier in his article, he says that our current education system leaves holes in knowledge that compound upon themselves. If you have such a scattering of missing knowledge, how can you teach yourself skills relying on that knowledge. The change has to come earlier and be consistent.

We must focus on making sure all students have a good education. One without the missing fundamentals we get now. We need to stop discouraging female students from the STEM (Science, Technology, Engineering, Math) disciplines. There is a wealth of research on how women are discouraged from a young age through college. We're losing half of the population to baseless gender claims. Beyond that, the only way we even measure students is through testing.

Testing is pointless. You can teach someone to pass a test. If you have the money Kaplan can teach your high school student how to do better on the SAT. They don't make the student any smarter, they just help them understand how to beat the test. Further, by having funding based on the tests, you just end up with cheating scandals. Just look at the Atlanta Public School system. It's not just there either. There are confirmed cheating cases in 30 states and DC.

The answer has to be better education. We can do this through teaching problem solving instead of test taking. Critical thinking instead of rote memorization. Creativity instead of conformity. Children want to learn, it's only when adults tell them to sit down and do as they're told that they stop.
AuthorMichael Cantrell
CategoriesRandom Thoughts
The schedule for day 2 was entirely keynote/speaker based. Everyone attending was in the main auditorium listening to the same talks. The great part is everyone gets to hear the same things, and you don't feel like you're missing anything. The downside is that some of the talks may not be relevant or interest you. The other downside is they were so rapid-fire, that I'm having trouble separating them out in my head.

Most of the talks focused on front-end development or design. While interesting, they don't really apply to me. Also, most of the speakers were speaking specifically to others that did the same job as themselves. Overall, I felt energized by the talks, but didn't really come away with anything concrete to do.

My favorite speakers was Steve Smith from GitHub. He talked about all of the internal products they use to keep the team working efficiently and effectively. Plus, most of them were incredibly cool. The best one for me was the application they built to capture and aggregate all of the errors on GitHub. It gives them an immediate way to know if something is broken, and where it is. They don't have to wait for users to report a problem, they can just see that something is going wrong and address it. That may be the one tool I want to build, so that we can provide better service to clients.

Overall, I had a good time, but I definitely preferred the first day. The one question I did have, but couldn't get an answer for, even after tweeting is: Do you guys know how to post videos to Facebook?

AuthorMichael Cantrell
Just like last year, when I went to the PHP Community Conference, I have come back with many things to think about. Oddly, many of them are the same. Maybe that is the purpose of conferences, to keep us thinking about the persistent problems we all encounter, and continue to attempt to address them. Don't let apathy or defeat overtake us. Keep pushing. Keep working. Keep innovating.

The most obvious difference between Converge SE and the PHP Community Conference for me was the workshop day. The workshops offered focused more on actual code and possible techniques than pie in the sky ideals. I definitely enjoyed the workshop day more than the speaker day. This was probably due to the focus of each of the sessions. Several tracks were offered (Mobile, Development, Front-end, Design, Business Dev, and Marketing). By providing a focus, the speakers were able to get into the technical details that a designer might not need or want to know (Development track).

I can only comment on the sessions I attended, but I found them to be very informative. As is always possible though, I did find some things to be disappointed in. I'll focus on the positives here though, because they outweigh the negatives. (I have a plan for a post to address the negatives not only at the conference, but in the general development community.)

The workshops definitely gave me an opportunity to learn about some things I didn't know enough about, and some clarity on things I did. For instance, the first session I attended was about Node.js. I had read about Node.js online, but didn't know anyone that had actually used it. The general idea is non-blocking code, so that you can serve out more requests concurrently. The system is built on JavaScript, and can integrate with client-side javascript quite easily. I came away with my basic assumptions of Node.js confirmed. It is an interesting technology with specific uses, but I don't feel it will be effective for the general use. More to come later.

The second session I went to was Mobile Design Process. This was definitely my favorite workshop, which is funny, since it probably doesn't affect me that much. The focus was on responsive design and changing the way we think about it. Rather than letting screen-size dictate the breakpoints, let the content dictate it. Basically I hadn't seen anyone change their design based on watching the content flow in the browser. Once you see it, the idea validates itself.

For the third session, I went back to development and learned about identity on the internet. This was definitely the most eye-opening session. The sheer amount of data that can be easily gleaned about someone on the internet is impressive. Web Finger being the most scary to me. Basically, from just an email address you can get social profiles, contacts, etc. Luckily, it appears to be opt-in, and I'm not opted-in. However, I have a gmail account that is from the original beta, long before Google added it. Who knows whether it is on by default or not. Yet another reason to be wary of what you share on the internet.

The final session of the day for me was Breaking Free from JQuery. I found this to be the least convincing. The basic argument was that JQuery was heavy and had many bad plugins. Both of these are fair accusations, but both are easily deflected. As far as JQuery being heavy, use the Google CDN. Also, it has to be big to work properly in all browsers. It's not perfect, but you work with the tools you have. Gzip and minify the file (done for you on the Google CDN), and you reduce the burden. The second argument that there are bad plugins is missing the point. Of course there are bad plugins. Every language/tool with any popularity is going to have that problem. Don't blame the language/tool for amateur hour. Blame yourself if you use one of them without doing your homework. Plus, once Ender.js was completely laid out for everyone to see, it has the exact same problems as JQuery and more, but since you pick and choose plugins, you can save maybe 20kB. The added headache, in my opinion, isn't worth it. If you're a massive company like Facebook, Google, Amazon, etc 20kB is a big deal, but most of the sites worked on can spend that time and money better. Infinite money = Superior optimization. Finite money = tough choices.

Overall, the first day was great. Even though I disagree with some of the speakers talks, I still respect them for getting up there and giving them. Speaking at a conference has to be difficult and takes some courage.
AuthorMichael Cantrell
This post has nothing to do with programming, but it covers another thing I am fascinated with, Space. (Definitely deserves the capital "s").

This week James Cameron and the two Google founders announced a new company they were forming, with others, to start mining asteroids for resources. (Link) This is really cool, because it could be the first real step we make to go into space. Neil deGrasse Tyson thinks it's a good idea, so I'm in.

The cool part of this is all of the things we can do once we've successfully captured an asteroid. The amount of effort saved by already having the raw materials in space, means you can build in space, rather than on Earth and then spending enormous resources getting the object in to space. Like Neil deGrasse Tyson said, water already in space is cheaper than water from Earth moved into space.

If we can capture an asteroid and get enough resources out of it, we can build more spaceships. Then it becomes a self-sustaining system, and we can travel further and further. We can take the resources and build space stations or bases on other planets. We can even move the asteroids into orbits and use the asteroids themselves as bases.

Obviously I'm excited, because I would love to go to space. It would be more fun to go to the moon or an asteroid as well.
AuthorMichael Cantrell
The great argument I've heard for Android is how it is "open". It is an open system, unlike the iPhone or Windows Mobile which are closed. That openness has led to some interesting revelations, the latest of which is this number:

To summarize, security researcher, Trevor Eckhart, found some hidden software in Android made by Carrier IQ. It logs phone numbers, text messages, searches, and every url you visit, even SSL. Now, I think this should be looked at as a feature rather than a privacy risk. Android is all about being "open", so why isn't your personal information open as well. There is no such thing as a free lunch, so there is no such thing as a free operating system. You are paying for it with your personal information.

Anyone who is surprised by this must not understand Google's business model. Everything they do is based around selling ads and customer's personal information. They don't have a single product that doesn't do that. With that in mind, can you really be surprised?


As an addendum. My first recommendation is of course to buy an iPhone, because it's a fantastic device, but if you refuse for whatever reason, the new Windows 7 Phones are fantastic as well. They don't have all the apps that the iPhone does, but given that Microsoft has the cash to pay people to make apps for them, I don't think that will be the case for long.
AuthorMichael Cantrell
I've been lucky enough to have a new mobile project at work to continue refining my objective-c skills recently. I'm definitely moving into new territory with custom view drawing, zooming, and some advanced interactions.

So far, I have found the quartz drawing to be the most interesting. Not only can you draw using paths, rectangles, and ovals, but you can use the same language constructs (CGPath in this case) for hit testing. This allowed me to use build an single instance variable to use for hit testing and drawing. I had a total of 52 distinct objects, some with several pieces to them, that were able to draw, zoom, and hit test for under a megabyte of memory.

I was surprised at I was able to do so much with so little memory. I initially had fears that I would be running into all sorts of memory management issues with so many distinct objects on screen. I feel like this just shows how developed objective-c really is.

I have been a PHP developer for quite some time, so objective-c is a huge departure from what I'm used to. The wealth of fully baked frameworks/classes available make it a joy to develop in. PHP has a huge number of frameworks as well, but they are all addons rather than being built in. I really like how MVC is just the way the language works, rather than some convoluted system laying on top of the language. I equate objective-c to smalltalk. I only used smalltalk once at Georgia Tech, and I hated it at the time. As I've had to develop larger applications, I've come to appreciate that experience.

The main thing that stands out as incredibly useful is the delegate pattern used so thoroughly throughout objective-c. I don't know that we even discussed this pattern in school, which seems absurd to me. It is incredibly powerful, because it gives people a way to inject code between actions without subclassing or modifying the base class.

I guess to sum up, I am really enjoying building things in objective-c because the language does most of the work for me. As Steve Jobs said, you want the language to give you the first few floors of scaffolding, so you can put the difficult top floors on a solid base.
AuthorMichael Cantrell
The world has lost a visionary. Sadly, we will not get to see any more of his great ideas.

Rest in peace Steve Jobs.
AuthorMichael Cantrell
The common story around the internet (prior to Steve Jobs, RIP) is that the iPhone 4S is disappointing. People are disappointed that it isn't the iPhone 5. Here's the problem, it is the iPhone 5!

The iPhone 4S is better than the iPhone 4 in every way, except for the form factor. This is in much the same way that the iPhone 3GS is better than the iPhone 3G. The internals of the phone are what everyone expected with some extras. The dual antennas sending and receiving at the same time? Awesome. CDMA and GSM in one device instead of two distinct devices? Awesome. 8MP camera with 1080P video? Awesome. All of this without even mentioning the amazing software. iCloud, Siri, iOS5, and let's not forget Cards.

So the "let down" is that the form factor didn't change. Did anyone ever stop to think that the form factor is good? I certainly think it is. Perhaps Apple feels they have refined it to near perfection, and there is nothing more to do. The phone is an excellent weight, feels good in your hand, and looks fantastic. Why change something that isn't broken? Not to mention the costs associated with changing the form factor just for the sake of changing it.

I guess the basis of this post is, if you're disappointed in the iPhone, do yourself a favor and be quiet. The phone is solid in every way, and Apple is going to sell millions of them.
AuthorMichael Cantrell
I remind young people everywhere I go, one of the worst things the older generation did was to tell them for twenty-five years “Be successful, be successful, be successful” as opposed to “Be great, be great, be great”. There’s a qualitative difference.

- Cornel West

The first time I read the above quote, I felt some deep stirring in myself. I knew I agreed, but I didn't know what to do. Over time I have realized that I always focused on being successful. I was never focusing on being great. Once I came to full realization, I decided to do something about it. I decided I wanted to be great.

I have found the transition from a focus on success to a focus on greatness is difficult. I have found myself increasingly frustrated, because I only really know how to be successful. That is what we are training our society to be in our education system. We focus on the short term. Pass the next test. Finish the next assignment. We lose sight of the final goal. I lost sight of all of my goals.

My goal is to be an innovator in my field. My goal is to push the boundaries of the technology I use. My goal is to speak about what I have done and motivate others to be great. I want to create something different. I want to inspire others to create something different.

My goal is to encourage and enhance education. My goal is to make sure every student has access to science, math, art, music, literature, history, and any other subject they are interested in. I want to help students to learn and be great themselves. I want to support a society that supported me.

I think by focusing on these goals, I can be great. I will be great, because I am trying to help others be great.

Whenever I have doubts, I read that quote, and then I watch this:

Carl Sagan is an excellent source for inspiration.
AuthorMichael Cantrell
CategoriesRandom Thoughts
If you haven't seen, I highly suggest you check it out. Here is my invite link:

The site is basically a daily deal site focused around design. The typical products are furniture, lighting, art books, clothing, and the occasional trinkets. To date, I have made 5 purchases at Fab and loved every single one of them. I bought Plumen bulbs, signed and numbered lithographs of Lady Gaga and Patton Oswalt, Supernova Lights, a Che-Bart shirt, and finally some Urbanears headphones.

Why am I writing about this? I think they have executed on the daily deals plan properly. I've tried groupon, scoutmob, and livingsocial, but never found anything that was all that interesting. There are the very occasional things that are nice, but you're always buying a coupon for something else. Why not sell me an actual product like Fab? Why not sell me something that is harder to find? Why not sell me something hard to find at a nice discount?

Fab has executed on those "why nots". I bought products. I bought the Plumen bulbs that I had seen before, but never found a way to purchase at the time. I bought the Supernova lights that were hard to find and discounted $120. That's an excellent execution.

Fab has found the key to daily deals. Sell people things that they want, but have a hard time buying. Don't sell services, sell products.
AuthorMichael Cantrell
CategoriesRandom Thoughts
I'm sure everyone has been using the new Facebook layout for a few days now, and I figured I'd write down some of my thoughts on it.

My first impression is that it isn't that different from the old layout. You still have the main feed down the middle, and all kinds of crap on the sides. Nothing new by any means. What does bother me is that they're trying to decide what is important to me automatically. I hate it when someone tries to tell me what I'm interested in.

The old feed allowed you to view what they determined the top stories or you could view everything chronologically. Call me crazy, but I always viewed the chronological "most recent" feed. I didn't want to miss anything important, and that way my way of doing it. Did I see a bunch of things I didn't care about? Sure. There is an easy fix though, usually those people are spammy and annoying, so you can unfriend them or block their updates. I have a few people that I unfriended, and a few that I blocked updates from.

I think Facebook thought they could appease people like me with the box on the right hand side showing everything that's going on. The problem there is that it shows me what songs people are listening to (don't care), anything anywhere that someone liked (don't care), and nothing is grouped (each comment on an item is a separate item). This is too much information.

That means that people like myself that were filtering the feed ourselves are now stuck with either the automated feed or the raw feed. Neither of those options really appeal to me, but I just have to put up with it.

Do I hate the new layout? No. Is it somewhat annoying? Sure. Will I come up with a new "workflow" for getting information? Absolutely.

That's how the world works. Things change. We adjust. The new becomes the old.

At least this time I didn't get invited to any groups that are "1,000,000 strong to change Facebook back". Of course, those groups only have a few thousand people in them.
AuthorMichael Cantrell
CategoriesRandom Thoughts
For a while now, I've been trying to think of new things to write about, and I obviously haven't had much success. Beyond just writing, I was having trouble motivating myself to do much of anything, be it work, freelance, or fun. For the life of me, I couldn't figure out why I was having so much trouble with motivation. Nothing I did seemed to work. It's obvious to me now, and it was probably obvious to others what the problem was.


I was burned out on work, burned out on the common activities I did, burned out on just about everything. What's somewhat amusing is that I read about burnout fairly frequently, and I always think I'll recognize it when it happens. That may be the one problem most people fall in to. It is hard to know when you're getting burned out. By the time you do realize, you have to make a major course correction to fix it. For me, that course correction has been a 5-day weekend. Thursday through today.

I originally planned to fly to New York City as a vacation to visit a friend. However, plans fell through, and I ended up not going. At first I was somewhat depressed that my vacation wasn't going to happen, but sometimes changes are better. Instead I've stayed at home and done only what I want to do.

I've gone out to dinner and had great conversations. I went ice skating for the second time in my life. I went to Music Midtown on a whim with a friend. I spent an entire day getting to know someone new. I trained for my triathlon. I watched an entire season of Married With Children.

I did not think about work. I did not think about freelance. I did not work on any personal projects. I did not worry.

I was and am happy.
AuthorMichael Cantrell
The PHP Community Conference was my first time attending a conference. I definitely enjoyed the experience and will go again. Honestly, I should have gone to a conference earlier in my life, because I feel like I learned so much about development and myself.

The first thing I learned was a renewed sense of humility. In my little bubble I felt I was near the top, but outside of that bubble, I realized I am not quite so hot. There are people doing amazing things with new development, profiling, testing, deployment, etc. I, meanwhile, push out predominately CMS sites with the occasional custom site. The custom sites aren't anything to laugh at, as they require some expertise, but nothing on the scale of what I saw. This was a truly sobering moment.

That brings me to my second feeling, motivation. I feel energized to go out and do many of the things I heard discussed. I want to act on this new knowledge to improve myself and the company I work for. We can and should do better than we are. Beyond that, I need to get involved in open source; I need to start filing bug reports; I need to start posting fixes; I need to contribute to the community as a whole. Up to now I have been a freeloader, the time has come to give back.

With that motivation, I want to really start a company. I have tried and failed in the past, but I need to learn from those mistakes. I always tried to go it alone, and I've realized that won't work. I need someone to work with me and provide the pieces of the puzzle I don't have. Luckily, I have that person now, and we're in the first steps of that dream. I have a doubly renewed motivation to move forward. I'm going to stop waiting for certain things to get done and just go for it. I need to stop treating things like they are a single chronological thread and start multithreading (pardon the pun). Stop thinking, and start doing.

I also have the motivation to start trying to speak. I have wanted to be a conference speaker for a while now, but having never been, I didn't know quite what that entailed. I never felt like I had anything interesting to say, and I probably didn't. That means I need to go out and do something worth talking about. From there, I'll gain the experience and the clout to be a speaker. Maybe one day I can provide the inspiration to someone else to get up and do something new.

On my drive home I had to make the choice of what I would take away from the conference. I saw two options: become depressed and resign myself to going nowhere or become energized and go out to do something great. I feel that I've chosen the latter and hope that time will see that to be true. Words are cheap, actions are rich.
AuthorMichael Cantrell
Day 2 turned out to be amazing just like day 1. The talks were all focused on stories in the context of project evolutions.

The opening Keynote by Rasmus Lerdorf was great. He is the guy that got PHP off the ground in the 90s. He talked about performance measures that can be taken in PHP, and things that all developers should be doing, but most don't. He focused in on what PHP is and isn't.

Next I attended Drew Mclellan's talk in Perch. He discussed how the project came about, his successes, his failures. He talked about how they set a goal to make sure all support requests were unique. If a support request came in the goal was to fix the problem not just for the person asking, but for all future users.

After that I went to Paul Reinheimer's talk on XHProf and Wonderproxy. He talked about getting Wonderproxy started, and the kinds of projects it could be used for. Basically the service provides proxies for developers to use to test features in their code that rely on GeoIP data. For instance, running credit card transactions through certain vendors based on the user's country of origin. It was an interesting product, and he talked about some of the difficulties in getting a company started. One of the main problems he has to deal with is SEO. There are an enormous number of sites hosting garbage about proxies just to raise their pagerank, and he said he isn't willing to do that, because he wants to make the web better, not worse. I really respect that. For XHProf, he talked about some of the amazing profiling that can be done. Basically, XHProf counts all of your function calls in a run, and shows you graphs with all of the data. You can even compare previous runs to new runs, basically giving you historical profiling over code changes. This is great because it will give you a real sense of whether your change was good or bad for performance. Definitely a tool I'm going to look into using.

The third talk of the day for me was Laura Beth Denker's talk on the evolution of testing at Etsy. She went into some great depth on the testing tools and methodology used, as well as the basic rollout system. Essentially, Etsy uses a Continuous Integration method, and they were rolling out 3 changes a day 6 months ago. Over the last 6 months they have altered their procedures to increase the number of tests from 1500 to 7000, while decreasing the runtime of those tests from 30 minutes to 7 minutes. This has allowed them to release 40 changes a day to production. That is an amazing turnaround. The talk has gotten me thinking about how we handle rollouts at my current job, and our system is woefully inadequate. Additionally, I'm going to enforce some strict rules on myself for my startup to ensure a great process from the beginning.

For the last talk I went to, I'm not really sure what to say. The focus was on how to tell stories and convince users of something, but it was somewhat dampened by NDA constraints. I'm sure Marcel Esser had some cool things to talk about, but just couldn't.

The closing keynote was given by Terry Chay, and it was probably my favorite talk of the conference. He definitely had the engagement of the audience. He talked about some of the great things that PHP can do, but also talked about some of the things it currently can't, and what we can do to fix it. We need to focus on getting PHP into the cloud, because Rails currently does it better. I definitely felt like he ended the conference on an inspirational note.

I'll have a wrap-up some time later today or tomorrow with my over-arching thoughts on the conference. I had a lot of time to think on the drive back last night, but I'm still trying to piece together what I want to take away.
AuthorMichael Cantrell
I'll make this quick, as the keynote of the conference should be starting in about 30 minutes.

Yesterday was day 1 of the PHP Community Conference, and so far it has been a blast. There were four speakers in two time slots, so I had to choose two. I ended up choosing Lorna Mitchell's talk on API design and Helgi (can't spell his last name)'s talk about front end caching. Both were very informative, and mostly confirmed things I was already aware of.

Lorna focused in the very basics of API design. She covered the use of HTTP status codes as the very first indication of a request's result. That was one thing I hadn't thought about using. She also talked about using the HTTP headers sent to determine the content type requested and other information. While this sounds great in practice, I'm not sure about the practicality. For the latest API I've built, Keno To Go, the requests were all coming from Flash or JavaScript. I don't know if JavaScript can specify certain headers like that. Definitely worth looking in to though.

Helgi's talk on front end caching mostly validated many of the things I already knew. Spiriting, combining JavaScript files, combining CSS files, compressing images, etc. One thing that was very interesting was the different methods that can be used to expire cache. Frequently we've had trouble with replacing images that then don't expire client-side immediately, so the client complains. Obviously you can change the filename, but then you have to change all of the references. You can also use query strings with some unique string each time, such as the timestamp, but then you never cache the image. The most interesting method talked about was the use of URL rewriting to make the image path different, without actually changing the file path. I like this idea the best, because you can change the file path in all of the locations you can find, but if you miss one you're still ok.

That sums up day 1. Today there are 8 speakers with an opening and closing keynote. I'm planning on going to the "Original Hypertext Preprocessor", "XHProf and Wonderproxy", "Is It Handmade Code If You Use Power Tools", and "From Earth To Jupiter With NASA" talks today.
AuthorMichael Cantrell
So, it's too early for me to say much, but I am meeting with a friend today to discuss a possible startup. From what I know, the idea is solid, we just have to execute. What gets really gets me excited is the opportunity to use some new tools that haven't been useful in previous work.

The first thing I'm planning on working with is the Amazon EC2 system. If this project takes off as expected, then we'll need the ability to scale quickly, which the EC2 cloud allows for. As a bonus, the first year is free with a micro-instance. I'm rather interested to see how the system works firsthand. We currently use it at work, but it isn't anything I've been able to work with yet.

Next is a mobile app, specifically for the iPhone. I have done a bit of work with Objective-C and have created a complete app for work. It hasn't been launched yet, because it needs to coincide with a new website. That app failed to push too many boundaries though. It was mostly just text display and a few images. The app for this project should allow me to do more work with images, possibly some video, and several API interactions.

I'm also planning on trying out a few alternatives to Apache as well. Nginx seems to be the most likely candidate, but I'm also planning on dabbling in some Node.js as well. I'm thinking of using Nginx as the primary HTTP server, and then using Node.js to serve out some of the more "live" feeds. I've read and heard good things about how fast Nginx is, and how it can handle much higher load on lower resources. Then with Node.js all of the talk seems to be centered around how it is non-blocking and event oriented. I'm hoping to strike a balance between the two. Nginx would probably suffice on its own, but I feel like the data that will be served out by Node.js should be separated out from the primary site.

The last part that interests me is the opportunity to interact with some new APIs. I don't want to go into specifics, but they are social APIs. Two are obvious, Facebook and Twitter, and I've worked with them before. The others that will be involved are entirely new to me. API interaction in itself isn't interesting, but the architectures chosen by companies are.

Looking forward to getting started in the next few weeks, and I'll try to post progress updates as I can.
AuthorMichael Cantrell
Recently, the debate around me has been heating up over mobile platforms and their viability. Which platforms should we develop for? Which should we focus on and why? These questions and more are important to answer, because you have to make a decision. I might not have written a post, but then I read this and was taken aback by the writer's lack of knowledge.

As a disclaimer, I should start by saying that I do not personally own a smartphone. I had a Samsung slider for 5 years before I finally had to replace it a few weeks ago. I then promptly bought, another Samsung slider. I want my phone to make calls and send text messages. Plus, I don't feel like paying for the insanely priced data plans. However, I have used an iPhone, Evo, myTouch 4G, G1, and a Galaxy S. I also own an iPad2 now, so I would say that gives me some additional experience similar to an iPhone.

Based purely on my previous sentence, the consensus will be that I like the iPhone because I love Apple. While it is true that I like Apple, that is not the only reason I like the iPhone, as you'll see.

The Hardware

I think the first and most important item to focus on is the hardware. The key here is the more hardware variation you have, the more difficult it is to develop a consistent product for that hardware. Cellphone chargers are a great example in the same domain. It used to be that every company would have their own port, or occasionally multiple ports, for charging their phones. This meant that every time you got a phone, you had to get a new charger, car charger, backup charger, etc. Now however, the standard is the MicroUSB port, and we're all the better for it. The obvious exception being the iPhone, but hey, nobody's perfect.

Now apply the underlying concept to the phone hardware itself. How many variations on the hardware are there for the iPhone? Currently, 3.

  • iPhone 3GS, 3G, and original

  • iPod Touch (however many generations they're at now)

  • iPhone 4

You could even lump the iPhone 3GS and iPod Touch together, but I won't. The only difference from a development standpoint is the screen resolution. The iPhone4 has the retina display while the others don't. There are obviously memory, CPU and camera differences, but we'll leave those alone as they're too complicated to get into here, and surely will be once we get to the Android devices.

So we effectively have 2 or 3 platforms to develop for, where the only difference in resolution. Normally, this would be a problem, but Apple has taken care of this for you. The display is treated as the old non-retina resolution during development, and you just add higher resolution graphics that benefit on the retina display, but display no differently on the old display. The important thing to note is that effectively the following things show no variation:

  • Resolution (Even though they're different, it's not a development burden)

  • Physical device size

  • Input methods (touch screen, buttons)

  • Display capabilities (color, response time, etc)

  • Outputs (headphone jack, apple dock connector)

Now let's move on to the Android phones. The problem here is there are so many variations I probably couldn't even name them all. Here is a basic list I pulled off of just the T-Mobile site.

  • T-Mobile Comet

  • Motorola Charm with MOTOBLUR

  • T-Mobile myTouch 3G

  • Motorola CLIQ XT

  • Motorola DEFY with MOTOBLUR

  • LG Optimus T

  • Samsung Vibrant

  • Motorola CLIQ 2 with MOTOBLUR

  • T-Mobile myTouch 3G Slide

  • Samsung Galaxy S 4G

  • T-Mobile myTouch 4G

  • T-Mobile G2

  • T-Mobile G2x

That's 13 different phones from a single carrier. This doesn't even cover the Evo and Droid with their multiple iterations. The sheer number of devices is insane. Just to test on each of those devices, assuming a $100 unlocked dev model, you're already out $1300, and you haven't even started. As a bonus, the next big Android phone will be out in a week, so once you've bought all of these phones, they're already out of date. Pure madness.

Going beyond the sheer number of devices, each is different. The screen resolutions vary wildly. I know the standard for Android seems to be 480x320, but the Evo has a resolution of 480x800. The Evo was supposed to sell well and be a great phone. How do you account for a difference of 480 vertical pixels? Not to mention, the physical size differences. Touch targets depend on the physical size being big enough, regardless of pixel size. If the pixel density isn't standard, then the physical size isn't standard. What is fine on one phone may be impossible to hit on another.

Moving beyond the displays, each has it's own answer to inputs. Some have 2 hardware buttons, some have 3, some have 4, some have 6, some have directional pads or trackballs, some don't. Not to mention, it is possible to have an Android device without a touchscreen. I don't know of any, and I know the Android Market blocks them, but the Android Market isn't the only game in town.

So what is common hardware-wise between the phones? Honestly, I can't think of anything. The physical size is different, the displays are different, the inputs are different, everything is different.

Winner: iPhone

Operating System

Now we can get into the true guts of this argument. Android evangelists love it because it is open or because it isn't from Apple. Sure, I will grant you that, but you should love software because it is good, not because it is open or not from a certain company.

I think one of the key differences between the two is the ability to upgrade. When an upgrade comes out for the iPhone, no one is concerned that it won't work with their phone. They hook up to their computer and apply the update. Done. When an upgrade comes out for Android, you have to find out if your device is supported. Then you have to check and see that the carrier will allow it. Then you have to get it on to your phone.

Note that for Android, you have to investigate whether you can get the latest and greatest. It isn't a given. That is due to the "openness" causing a proliferation of customizations from the carriers and the hardware manufacturers. This is the same problem that cell phones have always had. No consistency, so they can't be updated. A perfect example of this is MOTOBLUR from Motorola. They skinned Android to make it look a bit prettier and have what they wanted in an interface.

Customizations are a big thing as well. Android is open, so it allows customization. iOS is closed, so it does not. iOS provides a consistent user interface, so the user always knows what a button looks like. Android varies, once again, but carrier and phone manufacturer. Not to mention, custom skins can be added to your phone. For a true look at these abominations, there is a tumblr for that. Here is my personal favorite:

Crime against humanity

Who thought that was a good idea? Who thought that looked good? I see the Gmail and the Phone... fish, I guess, but what are the other two supposed to be?

Winner: iPhone

App Downloads/Piracy

The previous two sections are great to discuss/debate, but the real crux of the argument should always fall on sales/downloads. The key with any app is to make money in some way. For this reason, both have stores where you can purchase apps and both have ad platforms. The best part of this section, is that the only thing that matters are the numbers. The data won't lie, and you can't argue that lower sales are better, so let's jump right in.

Currently, Android has the larger market share. According to this article, Android has 33% and the iPhone has 25.2%. Obviously in the market share category, Android wins. But, you have to look past the surface. Keep in mind, Apple did that selling, effectively, a single piece of hardware. As I showed above, Android has at least 13 different devices (if I had to guess at the total, I would say about 70).

However, let's ignore the explanation above and just make Android the clear market share winner. Because they hold nearly 8% more market share, surely equivalent apps would sell better on Android vs. iOS. If you believe that, you're wrong. Market share does not equal downloads. Case in point. For every copy that was sold on Android, on average, 5 copies sold on iOS.

I think a 5:1 ratio is hard to argue with. You might say that is just a single app. True, so let's add the MLB app to the mix. The MLB CEO Bob Bowman said that sales are the same 5:1 ratio for them. He also said that iOS users are more likely to buy, while Android users are more likely to pirate. That can be tied back to the "open" operating system. On Android it is so much easier to pirate things than on the iPhone.

The culture of the users also plays into this. Android users typically don't want to pay for apps. They think everything should be free. iPhone users are more willing to pay for things. To the Android users I say, that's fine, but remember that you get what you pay for.

Winner: iPhone


I would say it's pretty clear which I think is better. Don't take this as me discounting Android completely. I plan to develop apps for it, but they will always come after iOS apps. They will be an afterthought. If I feel this way, others must as well. I know Rovio has had issues, and Smule has abandoned Android altogether.

Will these things hurt Android in the long run, probably not. The majority of Android users aren't buying the phone because it is an Android phone. They're buying them because they want a smartphone, and other than iOS, Android is the only player. Not exactly a great sign...
AuthorMichael Cantrell
Choosing a voice for your company can be tough. I'm somewhat dealing with that at my current job right now. Not so much in deciding what the voice should be, but becoming a part of the voice.

At work, the developers have been asked if we would like to contribute to the company blog. The conflict of course, is the company message. To date, none of the blog posts have been very technical and have been aimed more at clients. There is nothing wrong with this stance, but it means that the kind of articles developers would write are of no interest to your readers. If you try to jam in the developer articles, they would have to be watered down. This is something I personally wouldn't want, as it can degrade my "stance," as minor as it may be, in the development community. To me, there is nothing worse than a "fluff" piece. If, however, you try to force those articles on your readers, you will alienate those readers. When you do that, you will splinter your company's voice.

A splintered voice is a tough thing to deal with. It confuses clients and possible interested developers. The developers see interesting development articles mixed with what they interpret as "fluff" articles, while the clients see articles they find interesting mixed with articles far beyond their comprehension.

That of course begs the question, which should you choose? I think there are three real options.

The first voice option is to stick with the articles aimed at clients. These are typically focused on marketing and other things that will drive sales to your company. Simple ways of showing value to clients. This is fine, but that means your blog is effectively a sales tool, so make sure you treat it as such. Make sure it stays up to date, which means having at least one post a week. If you can't keep that up, the blog looks like it is abandoned, which might cause you to lose possible sales.

Your second possible voice is to go the develop route. This can help you bring in additional talent, or just get developers interested in what your company is doing. This works well for companies like 37 Signals and Google. They write articles that speak to developers and bring in great talent. It also allows them to be leaders in web development. I personally like is approach, but I am a developer after all.

Your third option, if you don't want to choose or can't choose from the other two options, is to have two separate blogs. They don't necessarily have to be completely segregated from one another, but they should be viewable separately. This gives you a best of both worlds option, and keeps the voice fragmentation to a minimum. It is a way to have your client targeted articles easily available to clients, while keeping them away from the more technical articles that they are most likely not interested in. It also allows you to build a development community around you, that can be leveraged to find new talent, amongst other things. Additionally, if there are people interested in both streams if content, there is nothing stopping them from reading both. This causes some fragmentation of voice, as there could be some opposing views between the two blogs, but it also provides the opportunity to create a real conversation that can open up communication between e two thought processes.
AuthorMichael Cantrell
CategoriesRandom Thoughts
I think it's safe to say most people would agree that a website is an investment. It gives a company or product an additional outlet for advertising or transmission of information.

Why then, do so many companies invest large amounts of time and money into a website, only to let it languish? Why do they treat it as a finished product undeserving of attention. Surely you wouldn't treat your house that way. A house would be maintained and upgraded; interiors would be updated with new styles and decor. A website's code, and in fact any piece of software, is no different.

I'll only be focusing on the code for a website, but many of the things I'm going to discuss apply just as equally to design, content, and information architecture.

The code of a website is the core. Without the code, a website can't do anything. Ecommerce can't happen; tweets can't be sent; databases can't be accessed.

These are the core things your site needs to be useful on the internet. There are perfectly usable sites that may have no backend code at all, but they typically don't provide anything more than information. In all likelihood though, your site has some backend code to it, be it PHP, ASP, Ruby, or any other language. This includes items such as CMSs (Joomla, Drupal, Sitefinity), blogs (wordpress), any forms, and of course any custom pieces developed for you.

The code of the site establishes the foundation that allows your investment to run.

There are two things important to keeping your site up to date: minor maintenance and updates. Minor maintenance would be fixing bugs that may be found or the addition of a piece of content here or there. Updates would be new releases of CMSs you are using, or larger development pieces done for you.

Maintenance is the most basic action that can be taken. Almost all clients will pay to keep their sites running and fix them when problems are found. This is a good thing. The problem is, that oftentimes clients don't want to pay for standard site-wide updates. This allows the code to get old.

As a site grows older, it falls behind on technology. The coding techniques used just 2 years ago are vastly different from the techniques of today. Some of the major languages used today didn't even exist 10 years ago. The web is in a constant state of change, and your website should not be any different.

For instance, just a few days ago PHP 5.2 ended development and PHP 5.3 was made the primary version to use. Just a few years ago PHP 4 was still in use. The new technologies from PHP 4 to 5 were massive. Object oriented programming was probably the single largest change between the versions, and it is an enormous asset to a language. PHP 5.2 to 5.3 doesn't have any shifts as large as the addition of object oriented programming, but it does introduce a number of excellent techniques. These shifts in languages are happening more and more often. Additionally, beyond new things being introduced, certain functionality is deprecated. That means that some functionality used 2 years ago may not be available anymore.

Another example is the introduction of essentially a whole new web programming language. Just a few years ago, Ruby was nothing but a scripting language. It had uses elsewhere, but it was primarily used to write single run scripts. Then, Ruby came in to use as a web language with the introduction of Ruby on Rails, one of the earliest web programming frameworks. Just the introduction of Ruby on Rails caused many of the existing languages to undergo large shifts and introduce their own frameworks. Now PHP has a slew of frameworks that didn't exist a few years ago.

Web languages change quickly. What was written just a year or two ago is now behind the times. Maintaining that code becomes increasingly difficult as certain things are deprecated and made unavailable in the new releases. As that happens, programmers forget how those old functions worked, and the documentation may disappear. What was here two years ago may not be available any more. Also, what can be done with the language now, may not be possible with the old version. By making sure you keep your site up to date, you remove some of the unknowns encountered when something has to be maintained. This makes it cheaper in the long run, and reduces the possibility of something going wrong.

How can this problem be solved? With regular site updates. My personal belief is that a site should undergo a thorough update at least every 2 years. This update should include at the very least a review of all code, and possibly a complete rewrite from the ground up. This shouldn't be hard for a client to agree to, as their website will look and feel old anyway. Huge strides are made in usability and web design every year, so sites should strive to look modern. As a perfect example, let's look at eBay from 2 years ago versus eBay today. The differences in design are huge. The current one looks much better than 2 years ago. I'm not saying designs can't last for years, but most don't.

As I've said, your website is an investment. You have to invest money into it to achieve your goals, just like you invest money into a house to raise its value. Keep spending a little over time, and you'll avoid spending a large amount all at once.
AuthorMichael Cantrell
CategoriesRandom Thoughts