I’ve already alluded to the idea that we were going to start providing animated tutorials for LandlordMax in the past on this blog. We currently have one such animated tutorial we use to help people who have problems entering in their license information when they purchase LandlordMax, but we haven’t published any others yet. The reality is that we’ve started to create them, but we decided to wait until the next major version is available to start releasing them (which although I can’t promise, is looking like it will be in November).
For those of you who are interested in getting a sneak peak behind the scenes, here’s one of the latest ones which I personally created that shows how to process your regularly scheduled accounting entries within LandlordMax, like the monthly rents you collect from your tenants. Just a quick note though, this tutorial is just not productized, which is to say it hasn’t been cleaned up, no introduction title has been added, etc. But at least it gives you a good idea of what to expect in the future.
A few other quick things about the tutorial, the “Late” button described in the tutorial is not available in the current version 2.12, this will only be available in the next major upgrade (the upcoming one I just mentioned earlier). As well, the “Receipts” button on the left menu is also only available in the new version. Lastly, some of you may have noticed the date format is different, in the new version you’ll now be able to select 1 of several different formats.
Let me know what you think. Did you find it useful?
There’s nothing I love more than receiving customer testimonials, and we just got another great one on Friday from Gloria Spencer that we’ll shortly be posting to LandlordMax’s Success Stories and Testimonials webpage. Thank you for the great compliment Gloria!
“You have been extremely helpful and quick with your responses. I will inform my friends, associates, etc who have investments property about my experiences with you.”
- Broke our sales record for the most units sold in a single month (and there’s still a week left).
- Broke our sales record for the most revenue in a single month (with upgrades, etc., the number of units doesn’t always directly correspond with total revenue).
- Tied our one day sales record for the most units sold.
- Broke our one day sales record for the most revenue.
- Broke the record for the most unique visitors in a single month (and there’s still a week left).
All in all a great day. I initially knew we broke the sales record for the month but I hadn’t realized we also hit the daily sales records too. Not to mention FollowSteph’s traffic growth which has been growing at a pretty consistent 20-30% a month average for the last year almost. Tuesday was a great day!
The View From the Top
This is completely the contrary of what I generally like to link, but it really shows why some people get ahead in life and others don’t. Priorities and values! Thank you for the great article
Successful Blogging Does Take Time
This is my own article from my other blog. In essence, I’m showing that successful blogging does take time.
10 mistakes that made flipping a flop
Very good article!
Will Google End Up Like Atari?
A good comparison of the similarities between the power and dominance of Atari in it’s heyday compared to Google.
The Art of Customer Service
What customers service should be all about.
What I’ve learned from failure
The title says it all.
Who doesn’t like simple business proverbs?
Last week I published an article here entitled “LandlordMax’s Most Challenging Bug” which received lots of comments both online and through personal emails (probably more people sent emails than commented). One thing that really struck me was the difference in thinking between people who run a business (from small ISV owners to managers) and technical people (developers, architects, etc.). Based on their background the solutions varied substantially. I’m not talking how to tackle the problem technically (btw there were some great tips and information being shared, thank you!), there was no doubt there was a lot of variation here, but I’m talking in terms of what types of solutions made economical sense.
What really struck me is that most developers completely ignored the cost to benefit side of the equation! I’m not saying that you should always base your decision on cost to benefits (I don’t want to acquire design debt for example), but sometimes this becomes a strong factor in the decision making. This is something that I use to lack, I always wanted to get in there and find the correct technical solution. The reality is that sometimes it’s not the right thing to do. This is a hard pill for technical people to swallow. I know it use to be for me. Not so much anymore being a lot more on the business side of things, but in the past it was a common issue.
Using my last article as a basis for this argument, let’s look at the cost to benefit of different types of solutions. Not actual solutions, but cost to benefits of the types of solutions. Rather than share my actual numbers, let’s just round realistic numbers to make the calculations, it’ll be much easier that way. So our first assumption is that allocating a developer to a task for 1 full day will cost $1000 in immediate salary. We should of course add in the costs of benefits, hardware, software, training, testing, etc., but for now let’s just say it’s $1000/day for a developer. Now remember this cost does not include any testing!
Ok, now I’ll assume that our fictional company makes $1 million in revenue a year, a simple round number. Assuming we have a unit price of $150 per unit, then this means we sell 6667 units per year.
Now before I proceed, let me backtrack a little. For those of you who are interested, you can read the full article here. However, just to get everyone up to speed, here’s the quick version. We found a bug in LandlordMax regarding how it reads certain types of JPG images. This bug is also present in many larger software application such as Internet Explorer and FireFox, so it’s not a simple solution. Also, images aren’t part of our core functionality. Don’t get me wrong, they’re a great feature, but we didn’t have them in the first 3 major versions. Now the problem is that we have two solutions, one that’s quicker to implement and one that isn’t. This problem only affects 0.05% of our total customers, and of those 90% will be satisfied with this solution. The other solution is complex, will take more than a week or two, and probably won’t fully work (IE and FireFox with very large resources still don’t have it full working). This solution will satisfy 90% of those customers too, possibly more.
Using these parameters, we can see there are two sides to this coin. Most technical people will want to fully solve the issue, to get it right. Yes the costs are high, but let’s do it right. The business side want’s to see what’s the cost to benefit. Now just a quick side step, you have to remember that you can’t always just look at the cost to benefit otherwise you’ll get so far into design debt that you’ll eventually kill your company. However, in this case, we’re not very likely to expand on this issue once it’s solved so it’s very unlikely that we’ll add any design debt no matter what solution we decide.
In any case, let’s look at the two solutions.
An acceptable solution to the problem which will take about 1/2 a developer day, padded to 1 full day for safety. In this case, the cost is $1000. Now if we calculate it terms of cost to benefit, it means we’re paying $1000 for 0.05% of our 6667 customers, or 333 customers. On average, this means that we’re paying $3.33 to add this solution for these customers, of which 90% will be ok with the solution. The remainder would like a better solution but will probably live with it since this is only a small part of why their using the software, after all this is not the core functionality of the software. Also remember that these few people who are used to using this type of image mode also use to having this issue with a number of other major software applications. So it’s nothing new.
We provide as best a technical solution as we can, knowing that we probably won’t be able to solve it fully as other software companies with budgets multiple orders of magnitude bigger larger than our total revenue can’t solve it. We’d be lucky to spend only a week, probably 2 weeks, and this might only reduce the number of people facing the issue by a percentage. But let’s be optimistic and say that we’ll solve it for 90% of the people who use this image mode.
Then in this case, we’ll spend 10 developer days, $10,000, to solve it. This means that it costs us $10,000 for our 333 customers. On average, this means we spend $30 per customer on this solution alone. This is now a significant percentage of the purchase price (20% of the total purchase price for fixing a small bug). But again, remember that it’s only for 90% of these 333, so we’re only really solving it for 300 people, bringing our per customer solution price to $33.33, or 22% of the total purchase price. We still have to deal with the remainder 10%, or 33 people. Assuming we use solution 1 for the remainder, this now brings up our price to $11,000, $10,000 for the initial solution and $1,000 for the remainder. Our total price per customer is now $33 for just this bug fix, or 22% of the total purchase price.
Which Solution is Right?
Which of these two solutions would you be more inclined to implement from a business side? What about from a technical side?
From a technical side, at least from my experience, we always want the perfect solution. But from a business side, it makes a lot more sence to go with solution 1. And don’t forget, solution 2 is probably a lot more costly than we estimated, it might take us a month, maybe two, or what if it’s a never ending series of issues? If the solution takes two months, which is not so hard to imagine once you see how Mozilla (FireFox) solved it (and that’s not even fully working), that brings our cost per customer to approximately $120 per customer. We’re now at 80% of the total purchase price for just one bug fix that’s not critical! Yes it’s only a portion of the customer, yes we could amortize it, yes we could calculate in the total lifetime purchases of the customer, and so on. But looking at the numbers when the first scenario is perfectly acceptable, I just can’t see how I can justify scenario 2.
As a developer, I can easily find ways to justify solution 2 such as design debt, etc. But from a business perspective solution 2 makes no sense!
UPDATE: Now add to solution 1 the fact that we now have an additional 9-10 developer days to add more features and benefits to the software. Let’s say we can increase our sales by 2% by instead allocating this same developer for the time difference to a new highly requested feature (maybe it’s only 1%, maybe it’s 10%, in any case, we’ll just use 2% since it’s easily feasible). If that’s the case, we can increase our sales of $1 million to $1,020,000, or by $20,000. Now not only have we paid for our bug fix, we’ve also paid for our developer and made a profit!
And the thing to remember here is that we’re not just helping 0.05% of the people (which we are), we’re also making 100% of the all our customers happier with a new feature (well maybe not 100%, but a much much larger percentage than 0.05%) that they wanted!
In the last little while we started to receive the same error/bug report coming through the Error Reporting functionality within LandlordMax. The error coming back was:
Error refreshing logo image javax.imageio.IIOException : Unsupported Image Type
Now this seemed weird to us, because we had all kinds of validations on which types of images to accept within LandlordMax. Before I proceed, to give you some context, LandlordMax has the ability to import pictures (jpg’s and gif’s only) into it’s database for 2 things. You can import an image for your logo/letterhead which will appear at the top of all your reports, which is great for the property management companies that purchase LandlordMax (about 50-65% of our customer base). The other area where you can add pictures is for your tenants, buildings, and units. This is a new feature that many people requested and that we added with version 2.12.
Getting back to this bug, we added all kinds of validation checks when you import images, such as the file extension (does it end with .gif, .jpg, .jpeg, etc.). We also added validations where it tries to first read the file, in case someone tried to manually change the file extension. And so on. Basically a lot of validation checks!
Initially we received some error reports such as the one listed above, and we found that we had missed a few potential validation checks, which we added with one of the patches (version 2.12a). That did significantly reduce the number of error reports, but they didn’t fully go away. Of course not everyone upgrades right away, but with time it seemed to dwindle down very significantly to just a few random ones. However, like I had just said, it didn’t completely go away which we don’t like to see.
Yesterday, we were finally fortunate enough to have someone also send us their email address (an optional parameter in the Error Reporting Dialog Window) along with the Error Report. This was great for us in that we finally had a repeatable test case for this very elusive bug that we couldn’t replicate, and that was extremely rare. We immediately contacted this customer and had her send us the image she used for the logo/letterhead as we tracked it down to a specific line in the code. We got the image, saved it, and added it to our test database. No problems, no errors, no issues! What? That didn’t make sense.
We then contacted her saying we couldn’t reproduce the error and we would be very appreciative if she could send us her database so that we could investigate it in detail. She obliged us and when we immediately tried it we got the exact error. It didn’t make any sense…
So the next step was to manually extract the image from her database into an image file and try that. I know she already sent us the image, but you never know. We extracted the image and opened it up with an image viewing tool without any issues. Very confusing… This image opens up in our image viewing software but not in LandlordMax.
So we dug deeper. Nothing. I personally spent several hours looking at this issue with no luck. So onto the internet and Google Search. After another hour or two, I found a weird bug report from Sun (Bug ID# 5100094). This was the key to the issue. It appears that the Java language doesn’t support JPG images that were saved in CMYK mode and threw this exact exception. Like most people, I know what a JPG image is, but I don’t know the details of how it’s encoded, nor do I really want to know. Now I was forced to find out more about this.
Without getting into too many technical details, it appears that JPG’s can be encoded from a number of modes, with RGB being the most common by far, or at least that’s my understanding. CMYK mode exist, but it’s not very commonly used.
Therefore I quickly checked the images, and low and behold, the image I had extracted from the database was encoded in CMYK! But what about the image she had sent me before? Well I did some further investigation, and to show you just how prevalent RGB mode is, the image she had sent me was in RGB mode. I don’t know if it’s the browser that converted the image or what, but when I did “Save image as…” it saved it in RGB mode. I did some further testing, and when I saved the image in CMYK mode, both browsers weren’t always happy with the image (depending on how exactly I saved it). That was very surprising to me. So it wasn’t only LandlordMax that had difficulties with this image mode sometimes, the major internet browsers also did!
As soon as I converted the image to RGB mode, everything went smoothly and with no issue. This was probably the most brutal bug I’ve ever encountered (omitting concurrency issues and such and just limiting it to straight bugs). It wasn’t an issue with the software, so it wasn’t possible to track down in the code. It was an issue with the image file and the programming language’s support of the image type. The error message wasn’t very indicative of the error as it usual is. And I also can’t blame the Java language either if both the major internet browsers had difficulties with this image mode.
So now what are the options for LandlordMax? This particular mode is not supported by the programming language. Do we look for a third party component and buy it? This is a very expensive solution, it costs a lot of money, not to mention the integration time (which is probably going to cost more than the component)? Will it have other bugs? Testing costs… For the percentage of users, I don’t think this is a viable solution.
Right now I’m personally leaning towards doing an extra validation and trying to invisibly render it from the file directly before accepting it. I’m leaning towards it, I’m not satisfied with it yet as it will have a lot of performance overhead, every new image will have to be rendered before being accepted… Imagine if you add 100 pictures for your building unit and each one has to be rendered. Rather than take a few seconds to a minute to import, it could now take 5-10 or more minutes easily. Is it worth it? Could I do a check after the fact, when trying to render it? That’s a possible solution also but it opens up a whole other can of worms…
The reality is that we don’t yet have a solution to this issue. We’re going to further investigate our options and definitely solve it for the next major upgrade, which is now expected to be out next month rather than this month. This is probably the most challenging bug I’ve encountered simply because it was absolutely unobvious what the issue was, there was no way to track it down in the code, and there is no real, or obvious, solution to it.
For those of you who don’t program, I hope this gives you an idea of the effort that goes into producing a software like LandlordMax Property Management Software. And although this is probably the most challenging bug I’ve ever encountered, it’s also one of the most interesting because of its difficulty!
Since I already touched the topic of email spam this week, let me send out a question to all of you. How do you deal with overwhelming email spam? Not even counting any of the spam my company LandlordMax receives each day, which I can assure you is an order of magnitude more, I personally get several thousands of spam emails a day! Yes, that’s each and every day. I know some fo you get a fraction of that and others get orders of magnitude more! I can’t imagine being Bill Gates (most spammed person in the world) and dealing with his spam levels (4 million spam emails a day).
What I’m starting to notice is that this is becoming a losing battle. I generally let my email client classify most of the emails as spam and throw them in the bulk/junk/spam (depending on which email client you use this will be named differently) folder. However at least a few hundred don’t get caught, and worse, several do get marked as spam when they aren’t (false positives). This therefore means, because I’m running a business and many of the emails are very important and not just personal correspondences, that I need to sift through the junk folder each and every day. I need to double check thousands of spam emails each day. Talk about boring, and especially error prone! It appears that I miss the odd email here and there (not many but a few a month), which is perfectly understandable from my perspective, but not from those who sent the email (which is also perfectly understandable from their perspective). So what are my options?
I do have several options, and I’ve also been suggested several others, but to be honest I haven’t found a solution that I really like yet. So far the best options I’ve seen are:
Continue the same way
This is where I’m at now but I’m looking for a better solution. This is getting more and more time consuming.
Use Spam Assassin
I’m afraid of false positives! Those are the absolute worse. At least with my current solution I can manually filter them and the blame is on me.
Purchase a commercial email spam filter
Which one? And what about false positives?
I forget the term of this type of product, but it basically sends out an email to everyone who emails you to validate who they are. Then it only allows emails through to you from those that responded to your validation email. So basically its a way of validating the emails you’re getting are from someone and not a bot.
Frank Neville from Surfulater (great product by the way) suggested this option a while back to me (thank you Frank) but I’m not too keen on it (this is probably the only time we respectfully had a difference of opinion on a business related item so far that I know of). I understand it’s working great for him, but I’m still hesitant because of the risks of not having people respond. I believe that the onus should be on you, not the person trying to contact you. If someone is trying to reach you to initiate a business deal, or respond to your request, the less trouble they have to go through the more likely things will work out for you. Much like the easier you make the purchasing process the higher your sales conversions are likely to be.
Just delete all the emails in the spam folder
No way, I know for a fact that I’d be deleting many important emails!
Add senders to my “safe list” (or similar terminology depending on your email client).
Yes, but this takes time. This does alleviate the issue, but only from people who’ve already writtent to you. Initial contacts will still have the same issue, which means you still have to sift through all the junk emails.
So what’s the solution? I don’t know. I’d love to hear your suggestions so fire away!
The Fisherman and The Investment Banker
Know what you want out of life before starting on a grand journey
Of the world’s 100 largest economic entities, 51 are now corporations and 49 are countries.
It’s hard to believe that more than half of the world’s largest economies are corporations.
Design debt is something every software project/product has to deal with.
Quick And Dirty Inc.
It’s incredible how many companies operate this way.
Why millions of home alarm systems are useless…
He explains in enough detail what to look for when purchasing a home alarm system. After reading this, my eyes are much more open in seeing how many homes security systems are virtually useless
They also serve who only stand and wait
Brings forth some some very convincing points as to why appliance (dishwasher, fax, computer, etc.) stand-by energy should be visited on a global level.
This is probably the most effictive hacking idea I’ve ever seen to monetize the website you’re hacking!
UPDATE: Well after some further investigation, it looks like I was slightly off. The spammers are indeed sending emails pretending to be me, which is resulting in thousands of bounced emails! The spammers are sending emails directly from their computer (IP 220.127.116.11) pretending to be me (making the emails look like they are coming from me). I am NOT sending any spam to anyone! They are NOT coming from me.
Looks like over the weekend my blog FollowSteph.com was targetted by spammers. Normally, this would mean I received an innordinate amount of email, but this time it was the other way. I’m still working with my host to figure out what’s happened, but from my quick initial inspection it appears that thousands of emails were relayed (or made to appear as though they were) through my mailserver with different FollowSteph.com sender and reply email addresses.
This morning I litterally had thousands of bounced emails in my inbox! Hopefully I’ll be able to resolve this issue very shortly.
Today I came accross a really good analysis of whether it’s better to rent or buy. Of course the results depend on your assumptions and numbers, but what I particularly liked about this one is that they not only showed their numbers, they also described all their assumptions! Please note though that you will need to register with Google to view the spreadsheet with the information, but that’s free. It’s worth the minute it takes to register if you haven’t already done so.
Also, if you’re interested in the blog entry itself, and want to see what others have commented about it, you can view it here.
|NEXT PAGE »|