Machine Learning in SaaS paradigm

Our ultimate objective is to make programs that learn from their experience as effectively as humans do. We shall…say that a program has common sense if it automatically deduces for itself a sufficient wide class of immediate consequences of anything it is told and what it already knows.

John Mccarthy, “Programs with Common Sense”, 1958

Machine learning has been and still is a large part of research area in academic circles. But in last decade or so it has made heavy in roads to the practical world of tech industry and today it’s no secret that most of the large players are using numerous machine learning techniques to enhance various aspects of their workflows. In this post I’m hoping to look at few ways how a SaaS application (presumably run by a startup) can use machine learning to enhance its overall experience.

Personalise user experience

In your experience of using SaaS products, how many times you may have found that your favourite item is at the bottom of the list and you have to scroll half a mile or navigate through several layers of menus ? Usability usually favours the majority and you may discover the bitterness of being stuck in minority.

If you go into the same coffee shop every morning and buy the same drink, if they are any good at their business then they should know your preferences after few days and you don’t have to go through the ordering routine everyday.  It may be just that the shop owner confirms “Same as usual ? ” and that’s it.  So if your app is bit more intelligent (good at its business), it could do the same and not irritate users by dropping their most used features to the bottom of the page and having them crawl over the page every time they use your app. However to be on safe side, just as in the case of coffee shop owner’s confirmation you may need to give an extra setting option to the user confirming whether it’s preferable for the app to learn user behaviours and adapt.

Reduce your support requests

Say you have a hot product in your hands and it’s getting more and more traction. If you have experienced this situation, one thing that you won’t miss is the number of support requests that’s sky-rocketing in parallel to the hotness of your product. Given that startups have limited man power, there’s no need to emphasise the importance of your team’s man hours and whether to spend them answering easily avoidable support issues or somewhere more useful fixing bugs and adding new features. The school book remedy in this situation would be to evaluate the usability of your app which certainly is a good option but it doesn’t hurt to make your app bit more intelligent to identify obvious pitfalls.

In your neighbourhood if you notice someone is wondering back and forth looking up and down wouldn’t you assume he is lost and offer your help ? Taking a leaf out of this situation your app can do the same and be kind enough to identify a stranger wondering throughout your app and offer him help. Not only will you be saving your team’s man hours but you will be saving user’s precious time and as an added bonus impress the user even more so on your product.

Make search intelligent

Search is a window to your application data and improving the quality of search will directly influence the user experience.  Rather than making the user guess under what keywords his target content is indexed under, what if your application is good at identifying user intent behind the search ? That would certainly be the icing on top of your search functionality. To make it even better, mix some fuzzy-ness  to auto correct a search term when there’s an obvious error. Of course all this is easier said than done and every company is not a Google. But you can take an initiative by analysing search terms to identify week spots, start addressing them first and moving forward as a minor experimental optimisation process.

On another note, a good application wide search will greatly help answer most questions your users may have. From experience most of the support questions are recurring in nature so if users can easily find answers from your community forum or support articles, it will help lighten your support inbox.

Finding more details about users

Well, this is more of a grey area. Gossiping on other’s juicy dirty secrets is usually frowned upon, but a little awareness of what’s going on around you could be useful and even healthy. Most of large companies are already digging up your day-to-day buying patterns to better target you but  the amount of how deep you dig into user information (or abstain from it) is certainly up to you. One way to look at this would be how you treat advertisements – as long as they are relevant and useful in achieving your goal you won’t mind it.  But the second it falls below your requirements and becomes nagging, it will be a nuisance and spamming.  Likewise if you can give users a coupon they can’t ignore it’s likely they won’t mind and you can comfort your conscience by thinking you are doing a service rather than snooping around.

Gauging user reaction to new features

It’s a normal practise for apps to use a simple voting system to get to know most desired new features of a SaaS app. Usually what happen is that app admins put up a set of features they feel important and users vote on them. But taking this one step further and crowdsourcing, you can know what users really need and same time know more about your users. Of course collaborative filtering is not a new technology and most of the social sites are using it to rate new items and know preferences of new users back and forth. So even though you are not running a social network, you can still use it to get to know attributes of your user base such as technical savviness, seeking automation. etc.

Conclusion

This only sums up some of the more obvious situations where machine learning techniques can play a part in improve a SaaS application. It certainly is an exciting field in which I’m trying to get a grasp on as a passive interest and hoping to carry out experiments to learn the applicability of various theories. It would be exciting to hear more ideas and how well they have worked so please feel free to share them here.

Some pointers to get started/keep an eye on:

Fixing holes in EC2 reliability

We are in the era of clouds, and at the moment AWS is the Zeus among public clouds. With its scalable and flexible architecture, cheap rates, secure PCI compliant environment, wide array of loosely coupled services and boasting of 99.95% availability, they may deserve the crown. However they are not without holes and few days ago I got the chance to taste it firsthand. This post is about few measures that you should (and I mean this with capital SHOULD) take before moving your production servers to AWS.

To start with, I had been using Slicehost and Linode as VPS providers for couple of years while tinkering with AWS. After a trial run of few months I was satisfied that everything is working as it should be and moved to AWS for real. But the mistake I’ve done and AWS didn’t bother to mention anywhere easily findable is to couple Elastic Block Storage (ESB) with all instance stores. And this is something easy to overlook when you are coming from a regular VPS provider because ephemeral Instance store is the most counterpart similar device to a slice and you may expect the same behaviour throughout.

So back to the story, everything was running fine until AWS had scheduled a maintenance rebooting of the instance two weeks ago. Nothing much to worry right ? But it turns out that the instance didn’t reboot and there was very little possible to do from the AWS web console. Unlike in regular VPS slices, AWS doesn’t come with a back-door SSH console and it turns out even the staff can do pretty much little regarding an instance store. The only solution they could give me was to reboot the instance few times and if it doesn’t work out…well, they are sorry and it’s a lost cause.

I earlier mentioned the mistake I’ve made. But what I got right was to have several layers of backups including database replication slaves. So backups were running pretty much as expected and there wasn’t any lasting damage done.  And only when you are in trouble that you are glad of the time well spent on emergency procedures.

So rest of the story is very little. I removed the crashed instance, restarted a new one from the custom AMI we had and copied data over from DB slaves. But this scenario could have gone vastly wrong if there wasn’t a redundancy setup and for some unfortunate bootstrapping startup it could have reduced all their hard work to crisp.

I know servers should be up running and having them down is not heroic. But there are few points you should have in place before moving your production servers to AWS.

  1. Have a proper backup procedure in place. Better if replication slaves are in some other server vendor or in another AWS region and have a monitor setup to make sure replication process is working properly. Also it’s better to have several layers of backups running so you will have point-in-time recoverable database copy as well as one day old, week old, month old.etc data copies in worst to worst case scenarios.
  2. Use Elastic Block Storage (EBS) – They are the external USB drives of AWS. Couple one or more EBS with your instance store  and use them to store any data you think is valuable. If your instance die, you can just decouple the block and reattach to another fresh instance and run without a hitch.
  3. Have a custom bare-bone AMI with just the OS and may be couple of basic services. Also have an AMI with fully ready-to-launch setup. This way you can make another production ready instance in minimal time as well as have an option in a worst case scenario where the full ready made AMI doesn’t work. Finally, test all your AMIs to make sure that they are working properly.
  4. Have snapshots from your EBS devices in scheduled intervals.
  5. Use these not so easy to find AWS architectural guidelines in designing your platform.

So as I mentioned it’s not about heroics, but making sure your service not getting reduced to ashes because of some stupid server glitch. As someone wise had noted, better be ready than sorry!

Update:

There is another set of sound suggestions made in comment #4 by kordless for any cloud deployment. If you are into heavy scaling they may be particularly useful.

Steve Jobs effect

As the whole world is mourning the passing of one of the giants in this era who has contributed to shape the tech world to where it is now, felt like I should jot down my two cents of the man in my diary.

Even though he is best known for his creativity, vision and entrepreneurship, in my opinion they are secondary to the wave he truly brought. It is the sense of hope and inspiration to the world.

Society is hierarchical in nature. Usually higher levels have more power and leeway at choosing their own destiny while like or not middle and lower have fewer chances. Steve Jobs’ life story is a fairy tale of my era which stands as a testimony to say that even the most humble man can change the world in outpouring proportions. This in my opinion might be the best thing that can happen to a society and I believe the modern American tech hub benefited most out of it. Generally people make idols out of people with power which usually means politicians whom even the best represent egotism rather than the talent. However, Steve Jobs represented the success based on skill and hard work which made him a better role model and an inspiration to the world.

How many might have inspired from the life of Steve Jobs directly or indirectly? I can attest that I’m one, and Vesess for another. As a successful startup it’s not uncommon we come across one of his famous quotes or quirk in his latest product in our usual day-to-day chit chat. So if a team in the other side of the world resonated with his life story, it’s a testimony to his influence.

This kind of influence doesn’t just come with skills. I’m sure there are more creative designers and more skillful entrepreneurs among the small crowd of 6 billion. However there’s a sense of destiny and fate in his life story, which is unique and a good study in itself to learn about phases of the life. Even though I earlier mentioned his life story a fairly tale, this isn’t a typical one where the protagonist is a goody-two-shoe. His life is congested with extreme successes, failures, light and dark and he was man enough to accept it. This surely made it easier for everyone to approach him without putting him on a pedestal who can do no wrong.

For me, his greatest legacy is his own life story more than any other.

As a closing tribute and a fellow Buddhist, may he attain Nibbana and be out of the cycle of suffering.

Apple and Jobs

Photo credit: Johnathan Mak

Replication & backups with Ruby

If there’s one thing certain in life, it is the uncertainty. As you go higher up in the ladder of life, the fall grows steeper, risk becomes greater. Same rules apply in the digital world.

In the process of building and maintaining software, there are plenty of accidents, ways to screw things, foolish mistakes and enemies to sabotage work. So most would agree it’s sensible to have some solid backup strategy as your insurance policy in case a disaster strikes your budding app. But when you say backups & redundancy, it sounds really expensive and time consuming, isn’t it ? Well, Not anymore; with all the cloud services floating around it’s possible to have a good data backup plan with few additional bucks. So in this post I’m sharing a general backup approach easily implementable using wonderful Ruby Backup Gem that you could use or adopt according to your application needs and risk.

When it comes to data replication and recovery, there are various aspects you might need to look into depending on the nature/scale/risk of your data. The method suggested here assumes there are 2 servers for the master and slave where you can setup data replication with MySQL. Also this approach was largely inspired by the strategy adopted by Marco Arment for Instapaper.

Here is an overview of the strategy suggested in this post.

Backup Overview

Backup Overview

1) To achieve point-in-time recovery I’m using a simple master-slave database setup with MySQL. This is very straightforward and Here, here are some examples on how to set it up.

2) Install Backup Gem

gem install backup in both master and slave servers.

3) Setup MySQL binary log syncing from master to slave

– Setup Backup config in master (This will create a ~/Backup/config.rb file)

  sudo backup generate --databases='mysql' --storages='s3' --compressors='gzip'

– Additionally create a default config file defaults.rb (Put mail alert, twitter alert configs here)

– To sync binlogs every 5 mins put this code in ~/Backup/config.rb. Do usual SSH key copy procedure to avoid password prompting when rsyncing.

– Update crontab to sync MySQL logs every 5 minutes

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /bin/bash -l -c 'cd /home/username/Backup /usr/bin/backup perform --trigger sync_logs --config-file
/home/username/Backup/config.rb'

4) In the slave, follow the same process as in the master and setup the backup directory + config.rb. Additionally create a default.rb to store common configurations.

– Create config.rb

  backup generate --databases='mysql' --storages='s3' --compressors='gzip'

– Add email, twitter notification settings in defaults.rb

5) MySQL binlogs will be synced with S3 every half an hour. For this add half_an_hour.rb to your ‘Backup’ directory (All this can be put in config.rb as well. But for the sake of clarity I’m separating them based on the frequency).

6) Daily backup a full copy the database to local disk. For this use the daily.rb script.

7) Weekly store a full copy of database in S3. Use the weekly.rb script for this purpose.

8 ) Use Dropbox to store a copy every month. Plus if one of your workplace machine is synced with Dropbox account it will get synced to the local machine automatically and you can burn them to disks.
Use monthly.rb for this task.

9) Finally update the crontab in your slave to run your backup scripts according to frequencies you intend.

#sync every 30 minutes
0,30 * * * * cd /home/username/Backup  /usr/bin/backup perform --trigger sync_backup --config-file /home/username/Backup/half_an_hour.rb
/var/log/cron/cron.log  /var/log/cron/error.log
 
#backup daily
0 6 * * * cd /home/username/Backup  /usr/bin/backup perform --trigger daily_backup --config-file /home/username/Backup/daily.rb  /var/log/cron/cron.log
/var/log/cron/error.log
 
#backup every week
0 6 1,8,15,22 * * cd /home/username/Backup  /usr/bin/backup perform --trigger weekly_backup --config-file /home/username/Backup/weekly.rb  /var/log/cron/cron.log
/var/log/cron/error.log
 
#backup monthly
0 6 26 * * cd /home/username/Backup  /usr/bin/backup perform --trigger monthly_backup --config-file /home/username/Backup/monthly.rb  /var/log/cron/cron.log
/var/log/cron/error.log

So at the end of this process you will have several redundant copies of your database as well as MySQL transactions up to last 5 minutes. In case of an emergency (ie: disastrous SQL query) you could pick up the nearest full backup and apply MySQL binary logs one up till the disaster occurred and you are good to go.

As a last note (not the least) kudos to the team behind Backup gem. You guys made my life lot easier!

Elections & Prosperity

Election times are upon us…. well, not that there weren’t enough in the past few years, but only that an election which people care at least a dime is nearby and thus some changes to the Sri Lankan social behaviour.

Larger than life political faces materialising in every nook and corner of the country. Roads that were meant to be built in years are built in days. Living cost that was said to be impossible to come down even by godly interventions are coming down like melting butter. Roads that were closed due to terrible security hazards are being opened. Rulers’ godly status has been threatened and thus travelling alongside us – the mere mortals, in the road. Common mortals whom were lethargic due to the lack of gossip matters have again got something to shout about. Oh, almost forgot about free comedies and the entertainment…who needs Mr. Bean ? Considering all this, one might say that we should hold elections every month to see some positive developments in the country.

This is what I call the election prosperity.

But with such a polarised and biased grounds, is there any meaning to all this hype ? That’s another story for another time.