RSS FeedWell played Steve Ballmer
Exactly as I mentioned on Nov 11th, 2008, Microsoft has denied any suggestions that it is going to acquire Yahoo, and voila, now the price is sub 10$, and only heading south. I think from here, the script may differ from what I thought. Perhaps Microsoft will not buy Yahoo after all, and simply buy the Yahoo search. That would definitely be favored by people who are looking just at improving search.
However, I continue to believe that Microsoft should buy Yahoo entirely – lock, stock and barrel. The reason is this – Yahoo gets millions and millions of visitors, and to market the Live search to them would be much easier there. The browser war has been lost, and with that, the search button from browser has been lost to Google. How many people are going to be able to change their default search engine in the Firefox search box (and install a Live engine in the process)? The answer – not very many.
The place to attack Google exists, only from messengers. MSN messenger and Yahoo messenger, if they were to combine their forces to promote the “new” Live search (basically Yahoo search merged with some niceties from Live search), they might have a shot. Especially, when you can have the users (when upgrading their messenger software) to also install a new search engine on Firefox, and change the default search engine.
As you note, there is no technological element in this game now – it is all business.
I cannot say what will happen tomorrow. But I do believe that buying Yahoo is in Microsoft’s favor. Certainly, first it was Yang’s ego that stopped this deal. Now, it shouldn’t be Ballmer’s ego after all. Don’t you think so?
What is Microsoft’s play on Yahoo?
After Yahoo lost the partnership with Google, the buzz has it that Microsoft will now return to reclaim Yahoo. MS has denied the rumors. So, what is Microsoft’s play on Yahoo!?
Firstly, the deal that was good for Microsoft a year ago, cannot be suddenly bad for it, especially since its coffers are still bursting (as of June 30, 2008, Microsoft has about 23 B$ in cash and short term inventory), and Yahoo is much lower in value now (market cap 15.74 B$ as of Nov 11, 2008). When Microsoft earlier tried to buy Y!, the price tag was a whopping 43.6 B$, which was a 20% premium over the stock price. If at all Microsoft were to buy Y! right now, price would be no more than 17B$, especially since Jerry Yang has himself said he is interested in Yahoo being acquired.
This represents a handsome 62% discount on the same product. Consider this the Fall sale.
Steve Ballmer is known to be a tough negotiator. He does not think what percent discount he has already gotten. He thinks about what percent discount he can get from here. So, if he denies all reports, Y! may soon be trading at sub 10 $, and perhaps even around 8$. That would make the price tag about 12B$. That represents a 73% price drop. Consider this as the black Friday sale.
"I" in MAPRICOT – Improve Logging
By the time we get to step 5 of Mapricot (our eight step process for handling errors in production systems), we have already identified the error, addressed it, and now we are on the prowl for improving other parts of code, such as logging, the “I” phase of Mapricot.
In the analysis phase, something always catches the eye: tons of “unknown” exceptions, or other exceptions with inadequate details in the log. The most interesting, as well as common, mistake is some code that is absorbing an exception, and logging some generic message, such as the following masterpiece:
try {
// functionality
} catch (Exception e) {
log (“Exception in the functionality!”);
// No details of the exception e, and generic statement
}
This is a classic mistake, where the log statement is generic, and is actually losing out on all the details of the exception. Obviously, this code should be replaced by something as:
try {
// functionality
} catch (Exception e) {
log (“Exception in saving: ” + e, e); // Log both the message, and the exception trace
// throw e; // Rethrow the exception if suitable.
}
Another classic mistake is where the code throws a NEW exception, that is not a wrapper on the old exception.
try {
// functionality
} catch (Exception e) {
throw new Exception (“Exception in functionality”); // bad code – lost the original exception!
}
More appropriate is to do:
try {
// functionality
} catch (Exception e) {
throw new Exception (“Exception in functionality”, e); // Wrap the exception
// or
throw e; // Rethrow the original exception
}
A similar problem comes with SQLException, since that does not have a constructor that takes the inner exception as an argument. In that case, the initCause method can be used:
method throws SQLException {
try {
// try block
} catch (Exception e) {
SQLException sqle = new SQLException(e.toString()); sqle.initCause(e); throw sqle;
// those 3 statements on one line, so that line numbers in debug stmts are consistent
}
Now that we have established patterns of the problem code, we can scan the entire application and find the instances of problem code. Regular expression searches come in quite handy for this.
A second broad category of code instances where “I” phase is helpful is where supposedly significant logging is already in place, but yet we are not able to identify what is causing the error to happen. So, the idea is that while we will not be able to resolve the error in the upcoming build, at least we will improve the logging, and then reexamine the error, and fix in the next build after that. Following is an example of this:
if (matchingInvoiceCount == 0) {
throw new IllegalArgumentException (“Strange, no matching invoice found, for reference # ” + refNumber);
// The logging is fine, and we are struggling to identify why does the invoice not exist
}
One possible improvement that we may then be able to make is:
if (matchingInvoiceCount == 0) {
throw new IllegalArgumentException (“Strange, no matching invoice found, for reference # ” +
refNumber + “, modelPK: ” + invoiceModel.getPK() +
“, model XML: ” + invoiceModel.getXML());
// “Improved” logging – see if the model has a PK, and see if the XML shows any
// reasons why the save could have failed earlier.
// Perhaps we will identify the cause of the error in next release logs
}
All in all, the “I” phase of MAPRICOT should be taken as a way to piggyback some changes about errors that are in general happening, but we are not getting enough information about those errors. The problems that we are able to apply the “I” phase on, will likely be problems that we may be able to apply the prioritization phase in the next build.
Apps