Monday, January 26, 2015

Why is it so difficult to watch live T.V. on a mobile device

The other day I was out to brunch with my wife and I was trying to see if I could catch some of the Dallas vs Greenbay playoff game. We're both pretty big football fans and were very curious about who the Seahawks would be facing in the NFC Conference Championship. I was extremely frustrated by the fact that I could not find the game anywhere.

I understand that there are one off ways to watch football in particular. But what about T.V. in general. I'm curious as to why there's not an equivalent to a cable subscription for mobile. Yes, most cable providers offer some form of internet T.V. but there's two problems.

  • You're required to have a home cable subscription.
  • Not all programs are available, specifically most live sporting events.

It feels like this is an opportunity for big cable (or an upstart trying to break in) to move forward towards the actual future of television. Right now big cable is desperately trying to hold on to the past because it's lucrative. But as Netflix and Amazon Prime Instant Video are showing, people's television consumption habits are changing.

Here's an outline of what what I believe would be wildly successful in regards to the future of television.

  • Provide a streaming cable subscription that DOES NOT require a home account.
    • Make the service work with Android, Fire, iOS, and Windows mobile.
  • Offer ALL the same channels (Network TV, ESPN, Comedy Central, etc) available with classic cable.
  • Offer an upgrade to access the last full season of shows.
    • This will allow people to catch up on missed episodes.
    • This will allow people that prefer to binge watch shows to do so when the season is over.
  • Offer an upgrade to remove the commercials. I'd pay an extra $10 a month for 0 commercials.
  • Partner with Amazon and Netflix to license their original content.
  • Allow people to pay with Amazon payments. (full disclosure... I work for Amazon).
    • Chances are people already have an Amazon account with a credit card on file.
    • Allows a technology company that understands security to handle the important payment processing.
Something like this is bound to happen sooner or later. Why not now?

Monday, January 19, 2015

Don't hate your users or potential users

The other day I had an incredibly frustrating experience with iCloud that was 100% avoidable. I'm not an iCloud user but a buddy of mine is and when he had his first kid he sent out an iCloud link to some pictures. Being out and about at the time I tried to open the link on my phone using the mobile Firefox browser. I was greeted with this not-so-friendly message:

Something I've gotten used to doing on my mobile when web pages act weird is to check the "request desktop version" button and guess what? The page loaded fine but I was left with more animosity towards iCloud and Apple for blatantly breaking an experience that should "just work".

So what can we learn from this?
  • Your customers aren't just the people who bought your products. 
  • Provide "correct" details when things aren't going to work.

Your customers aren't just the people who bought your products

Most businesses view their customers as the who buy their products or use their services. But in a day and age where social media has become a primary mechanism for sharing information your customer base is now extended to those that your customers share their content with.

When you're building a product that allows users to share information via a URL you are essentially making a contract with that user that their content will be accessible by those they share it with on a modern web browser.

In the iCloud case I'm baffled at why Apple would explicitly block Android users. I understand they're trying to get people to use their ecosystem, but they also need to face the reality that people in their ecosystem interact with people on the outside.

How do I know they're explicitly blocking Android users? I took a look at the difference between the request headers that Firefox sends normally on Android and what it sends when you check the "request desktop site". The big difference was in Firefox's user agent string

Mobile OnlyMobile: Mozilla/5.0 (Android; Mobile; rv:34.0) Gecko/34.0 Firefox/34.0
With Request Desktop Site CheckedMozilla/5.0 (X11; Linux x86_64; rv:34.0) Gecko/20100101 Firefox/34.0

While I don't think this is the case for iCloud, there may be completely valid reasons they're blocking Android mobile user specifically. For instance they may not have the resources, bandwidth, or experience to test their site fully on enough variations of the Android platform to support the experience. Even if that was the case, which I do not think it is, they need to be more explicit with their users and those trying to use the site that there are known and likely use cases where the experience is not going to be available.

This leads me to the next thing we can learn from this experience.

Provide "correct" details when things aren't going to work

The web is often looked at as an "easier" way to provide a unified experience with broader reach than providing a native experience on multiple platforms. But with that broad reach and unified experience comes more responsibility to provide that reach.

The above screenshot says that my browser isn't supported. That's not true, they don't support my operating system. I tried to open that link in Chrome for Android and the normal Android browser and all three of them had the same experience.

The screenshot also says that I may be able to use iCloud with my phones mail, calendar, and contacts. They know that I'm trying to access a photo album. How is what they're suggesting as a possible fix applicable to my situation? 

Providing your customers (or potential customers) a great experience means being helpful when things don't go as they expect. It's not enough to make the experience work as you expect, you need to make the experience work as THEY expect.

Monday, January 12, 2015

How To Become A Great Software Engineer

I've been in the software industry for well over a decade now and today I thought I would reflect on the qualities I've seen in great software engineers that aren't just about the code they write.

Great software engineers are curious about everything. Because great software engineers are curious about everything they tend to dive much deeper into learning technologies. They're not satisfied with just learning how to use something but want to know how it works as well. This helps the engineer to better pick the *correct* solutions for the task at hand. It's important to note that diving too deep can also be a crux as you get stuck in analysis paralysis. Great software engineers recognize when they've learned enough to move on a start delivering.

Great software engineers are passionate about what they build. Not matter what they're building they want it to be great. Whether it's a script, a site, a process, or an application they want it to be used and want it to be a positive reflection of their ability. Because of this they give 100% on everything they build.

Great software engineers don't want to reinvent the wheel. Because these engineers are so curious they naturally become aware of what software is out there. They play with lots of different technologies, frameworks, and platforms. This gives them better judgement about what the correct solutions are to integrate with and what software they need to build themselves.

Great software engineers understand that software engineering is about more than just code. Software is part of a larger system. A great software engineer thinks about hardware, security, operations, deployment, and the maintainability of code.

Great software engineers are willing to do the stuff no one else wants to do. This doesn't mean that they volunteer for all the crappy work. But they understand that sometimes you have to pay your dues. They also understand that the crappy work is a good way to practice their skills.

Great software engineers have learned to make others better. These engineers have learned that you can't do it by yourself. They've also learned that not having a cohesive system is an anti-pattern. Because of this they *want* those around them to be better. Therefore they invest in teaching and mentoring others. In turn they learn more about their knowledge gaps and become better engineers themselves.

Monday, January 5, 2015

Breaking Into The Software Industry Without A CS Degree

I want to start out by saying that having a CS degree will be very very very helpful in a career as a software engineer. I don't want anyone reading this post to confuse what I am about to say as me believing that a CS degree is not helpful, it is. A CS degree will introduce you to Boolean logic, data structures, code optimization, (hopefully) the ability to debug code, and at least one language. It will also make sure you understand more than just the basics of mathematics. But having a CS degree is not the only path to a successful career in software engineering.

Over the years I've worked on everything from criminal investigation software, enterprise content management systems that serve millions of pages to millions of users a day, and mobile applications for iOS, Android, and Windows Phone. I entered the industry without a CS degree; I have a B.A. in Philosophy with minors in Communications and Religion.

I also want to clarify that this post is geared towards those wanting to become professional software engineers. If you're looking to becoming a hobbyist developer, while useful and applicable, most of this will be overkill for you.

If you don't have a CS degree and you want to be a professional software engineer you're going to have more work to do than your counterparts with a CS degree. You're going to need to start by learning the basic's of software engineering. While not an exhaustive list, a good place to start would be learning the following.

  • Math, specifically algebra, calculus, and geometry.
  • Boolean logic.
  • Data structures (learning what they are and learning to identify when to use them).
  • How memory works and is managed as well as the difference between a stack and the heap is.
  • Debugging and profiling code.

I've often been asked how to go about starting to learn the above list of concepts. With the exception of the math you can actually start learning those concepts by diving right into a software development language. I would suggest learning 4 types of languages. Each language will give you a different perspective on the above list.

Start with assembly, move on to C++, from there learn Java or C# .NET, and finally learn HTML and JavaScript. Learn them in that order. Optionally you'd be well off learning a scripting language like perl or python. While scripting languages can be used for more heavy lifting they're very useful as languages for building tools and utilities to automate redundant and often error prone tasks.

Assembly will give you a deep understanding of the connection between a processor and code. It will help you to be aware of how much work computers need to do to use things that are very simple in code (but expensive) like loops and case statements.

C++ will teach you about memory management better than any other language while encouraging you to use object oriented concepts. C++ has a much steeper learning curve but it will teach you more about what's going on with the computer than a high level language will.

Java and C# .NET are both managed code, meaning they run in a virtual machine. The virtual machine will take care of *most* of the memory management for you. These languages will allow you to focus on learning the life-cycle of your software and software design. Higher level languages also make it easier to identify and use data structures correctly. When learning data structures you'll want to pay attention to learning not just how they work but also learning to identify when they should be used. This is going to be a requirement if you want to work for any of the big players in the industry.

I've lumped HTML and JavaScript together as one thing even though technically they're not a single language. I'm comfortable lumping them together as one because they've become so interdependent on each other for web development that you're not going to be able to be truly competent as a web developer without understanding both. Learning HTML and JavaScript will help you learn *the web* as well as help you learn the concepts of User Interface (UI) design and workflow.

This list won't teach you everything you need to know about computers or even software. But it does give you a place to start. As you get into the industry you'll find certain niche's that interest you more than others and you'll naturally dive deeper into that technology stack.