tag:blogger.com,1999:blog-32045862321551344202016-10-31T22:22:21.164+08:00It's common sense, stupidCommon sense, programming,.Net,C#, software development, finance and anything interesting under the sunSoon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.comBlogger261125tag:blogger.com,1999:blog-3204586232155134420.post-4389893004723425732014-06-12T15:57:00.000+08:002014-06-12T15:57:27.129+08:00waystous.com, and why it matters for MalaysianWell, I've established a new website called <a href="http://waystous.com/">waystous.com</a>-- this is mainly to cater to multimedia junkies in Malaysia! The idea is simple; it is to enable Malaysians to stream movies from streaming services such as <a href="http://netflix.com/">Netflix </a>and <a href="http://hulu.com/">hulu plus</a>.<br /><br />Riding on the interest for House of Cards on hypptv, I hope that more Malaysians will come to learn about netflix.com, and <a href="http://waystous.com/house-of-cards-is-coming-to-hypptv-malaysia/">stop buying pirated contents</a> from pasar malam or torrent network!<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="http://waystous.com/wp-content/uploads/2014/06/ken-spacy.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://waystous.com/wp-content/uploads/2014/06/ken-spacy.jpg" height="179" width="320" /></a></div><br />Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com3tag:blogger.com,1999:blog-3204586232155134420.post-90061107392765251052013-10-16T12:40:00.001+08:002013-10-16T12:41:31.476+08:00My painful experience in dealing with tmdhosting<br />I read <a href="http://www.marco.org/2013/10/15/godaddy-mt">how horrible it is to deal with an incompetent webhosting provider</a>. And I have my own horror story to share. It’s a story that I hope will serve as a wakeup call to those who are in hosting providing business: beef up your offering, improve the competency of your support and do not oversell.<br /><br />The hosting provider that I have problem with is the <a href="http://www.tmdhosting.com/">tmdhosting</a>. In Chinese, TMD stands for a popular rude word that English has no equivalent of. When I first signed up with this hosting provider, I had no idea that I would curse the name.<br /><br />This is how the story got started. My company was looking for a competent web host to host a vtiger app for our internal CRM use. tmdhosting is very aggressive in advertising, it even set up<a href="http://www.tmdhosting.com/vtiger-hosting.html"> dedicated vtiger hosting page</a> just to give the impression to the world that it is the vtiger hosting expert.<br /><br />And so, we manually migrated the data in our old CRM to vtiger. And the moment we started using it, we found that the vtiger app was slow. We found out that the reason for this problem was because we were using shared hosting and our CPU limits were breached.<br /><br />tmdhosting suggested that I upgraded to a VPS hosting package, which I complied. Before I could finish upgrading, another support personnel suggested me to take a dedicated server. I didn't take that because I couldn’t foresee why do I need a dedicated server. I reasoned that if a VPS couldn’t work out, then, and only then I would go for a dedicated server.<br /><br />And so tmdhosting began a round of migration from the old shared hosting account to a VPS.<br /><br />I thought that after the migration would increase the snappiness of my websites. How wrong I was. In fact, the performance of VPS was actually a few magnitude worse than shared hosting. I then filed a ticket to the support and asked the tmdhosting to fix the problem, there is no reason why VPS performance was worse than shared hosting performance.<br /><img height="408" src="https://lh5.googleusercontent.com/W7wduIfQj9hZVSQBFPf_NOfcj2uQfwf1unRvg6t1zBjyy3-jhpUka8YqbGptomZxjl1qsTK3caiZiwW2_XSe-NZxL8BIPD4GArcfcnFPRw3jlEbX-0UEQC-p" width="640" /><br /><br /><br />See how useful the reply? I asked why VPS’s performance is worse than shared hosting, and the reply I got was “you need more resources”. Complete nonsense!<br /><br />I then reiterated my questions, and again, the support ignored my questions and it appears as if the support was just reading from the scripts:<img height="490" src="https://lh5.googleusercontent.com/M9MQgKQ_TL3g9RGDzw1YUHndZ_KA8SQZqxfnYRfVtwux1zDrfY8muvl0kTY7ygjIh8I1rYJHfB2LUIlTnrAmBB4M3SEGsrcGbCF5lj20uijgvT_qs6dqMQET" width="640" /><br /><br />As you can see, all the tmdhosting staff was interested in, was to upsell me dedicated server hosting package, regardless of whether I needed it or not. tmdhosting was really putting their own interest above customer's.<br /><br />After a few more exchanges, I decided to take the matters into my own hands and ssh into my server and did a few investigation. I narrowed the performance problem down to a disk issue:<img src="https://lh4.googleusercontent.com/WS-3birwcd_8xVPXP6rIeU80-N_gcbqJv0cQaGkJhwj0R2_EDlg7mk8CUTmKPnVpbPUKG6jFXm8tMdc8c1uMWLGelH0bJZuKG8RsjjJaw-UzGjWv8hn4uWaf" /><br /><br /><br />51 seconds to transfer 1KB! This is simply outrageous. Now, of course I understand that for VPS, the CPU and RAM are guaranteed and the IO performance is not, and one bad container on a hardware node can drastically hurts the performance of other containers on the same node. But no matter what, such a slow IO performance is completely unacceptable.<br /><br />I was very sure that I have a case against the tmdhosting provider, so I showed them the statistic and they bombed back with.... the talks of dedicated server again:<br /><br /><img height="617" src="https://lh5.googleusercontent.com/J9xS5mNPlTDEt15sANi5iHHZ4qCoceFjIWJretJHDWPECjSLpeeZemaepH2X5UsKl9fglFNGRD2GRZrbTA4aBEhjelQ3o6KHTa7nBzkTPDcap3cvOZKEtQ9B" width="640" /><br /><br /><br /><br />I was amazed and stupefied by the kind of response offered by tmdhosting. Here it is, a very simple and significant case that demonstrates your incompetency, and all you do, instead of fixing your failing, you upsell us another more premium package.<br /><br />I then asked for ssh credentials to test the disk performance on my old shared hosting account, just to compare the disk IO operation characteristics, but this time tmdhosting refused to let me do so on the pretext that this may result in severe server overloads.<br /><br /><img height="640" src="https://lh4.googleusercontent.com/z4RxPH6uZ3pXGNkmxWCWOi0I935y0JENiHTWRW0h8g7RhNsf3pw7Q9oqGPTKkL_It2I0isJFkUHpsZpn6j5LTKfpZMB9yEezXiK3mBXBZPioeM5m_WHM7zpF" width="637" /><br /><br /><br />tmdhosting conveniently forgot that the very reason why I wanted to test the disk characteristics, was because their VPS performance was simply very bad. And since when running SSH command required government issued document? All these actions were meant to irritate me into giving up doing something that I deem necessary and which would further reveal their poor plans.<br /><br />On top of the support incompetence, all the tmdhosting wants, is to sell me the expensive dedicated server package. But would an expensive dedicated server package solve my problem? I don’t know, and tmdhosting didn't care. All it cares is to upsell me expensive package.<br /><br />You might say that I should just disengage them the very first moment they showed their incompetence but I didn’t. Yeah, serve me right. Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com3tag:blogger.com,1999:blog-3204586232155134420.post-66617808248674149872012-10-06T16:29:00.001+08:002012-10-10T14:36:48.907+08:00My experience with outsourcing a development project to India<h2>Introduction</h2>My company was looking at using <a href="https://www.vtiger.com/">vtiger</a> in order to replace the old, aging in house CRM system. Our old CRM system is consisted of separated subsystems that are functioning on their own with absolutely no integration among themselves. Due to that the subsytems were developed in a haste and has never since been upgraded, it became harder and harder for us to maintain it.<br /><br />Hence we have decided to use vtiger. We found that vtiger fulfills most of our needs. The module architecture of vtiger means that we can always write a third party module to provide extra functionality we need without touching the vtiger core source code. <br /><br />And so, there went my quest to write a dongle module to supplement existing vtiger CRM functionalities. I have very limited PHP knowledge, and zero knowledge in the internal working of vtiger module architecture. So I wrote my specs, and went to<a href="http://freelancer.com/"> freelancer.com</a> to find someone who can do the job for me with a reasonable price.<br /><br />To cut the long story short, my project <i>did</i> go on smoothly. Despite that <a href="http://www.isa.org/InTechTemplate.cfm?Section=Columns&template=/ContentManagement/ContentDisplay.cfm&ContentID=79776">many</a> <a href="http://www.techrepublic.com/blog/10things/10-problems-with-outsourcing-it/3016">warning against</a> the perils of outsourcing, my experience shows that outsourcing can still be cheaper than doing everything in house, with lower defect rates and faster completion time. <br /><br /><h2>The Story:</h2><br /><ol><li>Before I started to even post the project on freelancer.com, I took great pains to compose a spec. I wrote the use case of the vtiger module, the UI specification, the reports I wanted to see and so on and so forth. The specification is so <i><b>detailed</b></i> that I specified the URL for each forms, specified the elements, and the purpose of those elements for each forms and even designed the database schema for the backend. The point of this exercise was not to corner the implementer into doing the work my way, but rather to make sure that the implementer really understood my requirements.</li><li>A lot of people <i>hate</i> writing specs; why you are writing something that no one reads, and something that is so ephemeral-- we all know requirements change with time, right? And if your spec is so complete, you might just as well code the whole thing yourself! </li><li>My reply to the above points are as follows:</li><ol><li>Regardless of how whimsical is the one who designated the requirements, changing the requirements in English is still significantly easier than changing the source code. </li><li>Designing the requirements in detail force you to think about difficult issues even before you start writing a single line of code. I suspect that those who refuse to nail down the requirements are clueless about that they want, and they don't want to look stupid when the developers confront them. </li><li>Yes, requirements do change with time, but this is a point that <i>for</i> writing requirements, not against them. It's easier to document the requirement changes and their reasons in English, rather than in code, no?</li><li>As to the point: "if your spec is so complete, you might just as well code the whole thing". This is simply a straw man argument. I expect the implementer has some sense and experience in the domain and I don't expect him to ask me to specify in detail "does a button click works". Furthermore, coding is not just about UI, it has more than what meets the eye. Even if coding was just about the UI, it was still easier for me to "code" in English, rather than code in PHP or any other programming language. </li></ol><li>There were a few bidders, and all their resume looked very impressive with multiple years of experience working with vtiger. But the resumes lie! You would need to interview them. And that was what I did; I interviewed them on their understanding of my spec and quizzed them on their vtiger ability. This was where the fun came in. Despite impressive resume, a few showed great difficulty in understanding the spec, another showed so much misunderstanding on vtiger that even I could detect, and another kept on saying my questions were elementary and he wasn't bother with them. All these kind of behavior didn't inspire confident. </li><li>But luckily I did manage to get a developer who showed mastery in vtiger and understanding of my spec. We hit off quickly. I had full confidence that the project was going to succeed. In fact, if you were not confident about the prospect of an outsourced project, don't continue!</li><li>On the day of handover, we spent a few hours going through the applications, weeded out the bugs and enhanced a few features. Despite that the specs were completely written, and that the implementer showed good understanding during interview stage, when he delivered the thing to me, I still found a few parts that were not done properly. It took us a few real time sessions to hammer out all the issues, and we were done. </li><li>As predicted, the project was a resounding success!</li></ol><br /><ol></ol><h2>My thoughts on engaging freelancers:</h2><div><ol><li>Contrary to the prevailing opinion, there <i>are</i> well-qualified, smart, fluent in English knowledge workers in India, and their rates do come in cheap-- something like USD 20/hour. The only thing is you need to know how to <i>identify</i> them. I did this by interview them at length, ask them to show a sample of their past works, make sure that they really know their stuff, and more importantly, they show <i>deep understanding of my specs. </i>If they cared to read about your specs and understood them, that meant that they were more likely to commit to your project and there was a higher chance of success.</li><li>There will be a lot of "professional" firms that come knocking your door; they can show you impressive websites and resumes and they can even show you the past vtiger modules they did. But you still have to take the pains to interview them. They might have done their projects but this is not a guarantee that they can do yours. </li><li>Indian slang can be a bit hard to follow for me as a Chinese. And I am sure that my slang can be a bit hard to follow for an European, or an African or anyone else. Which is why I make it a point that all correspondence must be done in writing form. Some would insist that a chat-meeting is more efficient and therefore more preferable. I would say that if you can't write down your requirements clearly, then perhaps you haven't really understood it enough. </li><li>The act of writing your specs down forces you to think deeply of what you want, and reduce the amount of time wasted on requirement clarification, communication and rework. No, this is not Waterfall; and even if it is, Waterfall model is good for this kind of projects!</li><li>Set clear boundaries and expectations for your freelancer, and show <i>empathy</i>. You can do this by giving them good specs, make sure they really understand them, then give them free space to do their work, and only come back to them when the deadline looms near. </li><li>When dealing with a freelancer, make sure you structure your payment in stages. You pay only when a stage is done and you are satisfied with it. And you can easily cut your losses if you found that the freelancer was not performing up to the level you expect.</li><li>Most importantly, <a href="http://www.amazon.com/How-We-Decide-Jonah-Lehrer/dp/0547247990/ref=sr_1_1?ie=UTF8&qid=1349850199&sr=8-1&keywords=How+We+Decide">go with your feeling</a>! Before you hit off, make sure that you are comfortable with the guy you engage! </li></ol></div>Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com58tag:blogger.com,1999:blog-3204586232155134420.post-55036930071898252352011-08-21T14:58:00.002+08:002011-08-21T14:58:46.020+08:00kindlemalaysia.comIt's a long hiatus from me. I haven't been updating this blog for ages, and now I am back, just to do some shameless promotion for my new side adventure.<br /><br />To help my fellow Malaysians to get their hands on Kindle, I've decided to launch <a href="http://kindlemalaysia.com/">kindlemalaysia.com</a>. Basically this is a website that allows you to purchase kindle the eBook reader direct, because the <a href="http://amazon.com/">Amazon.com </a>just won't ship its precious eBook reader device to Malaysia. So, anyone who is residing in Malaysia who wishes to get their hands on the device can go to the website and order one. The purchase process is painless, just like how would normally you buy things online.<br /><br />If you have any questions you should read the <a href="http://kindlemalaysia.com/user-resources/faq/">FAQ</a>, and contact <a href="mailto:admin@kindlemalaysia.com">admin@kindlemalaysia.com</a> if your questions are not covered in FAQ.<br /><br />One would think that my main purpose to setup this eCommerce shop is to make money. Nothing could be further from the truth. I have a nice full time job, and don't really need any part time income, thank you very much ( Although I would be much delighted if my friends who like to engage me as their wedding MC). And from my survey I highly doubt whether Malaysians are that much into book reading that I can make a nice living selling Kindle.<br /><br />The reason I would do this, is to experiment with <a href="http://www.google.com/AdWords">Google Adwords</a> and online eCommerce. In other words, I am doing this for fun, and experience. Or maybe gaining a few talking points on this blog; writing about software isn't that fun after all. I hope that by one year later I can educate, regale everyone about my experience and what I've learnt.<br /><br />We will see how it goes.Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com3tag:blogger.com,1999:blog-3204586232155134420.post-8549090105974596622010-08-07T22:53:00.002+08:002010-08-08T16:42:56.664+08:00CliSecure<span class="Apple-style-span" style="line-height: 18px;"><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">One of the benefits ( or drawbacks) of .NET application is that the code can be easily decompiled by tools such as Reflector. This feature is tremendously useful if you have a third party application whose methods are behaving bizarrely and you want to know what’s under the hood so that you can work around it. It is also comes in handy when you are trying to understand the algorithms offered by .Net framework ( such as </span></span><span class="Apple-style-span" style="line-height: 18px;"><a href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx"><span style="color: #000099; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">LINQ</span></a></span><span class="Apple-style-span" style="line-height: 18px;"><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">’s Sort()) so that you can decide whether to use the existing one or writing your own.</span></span><br /><div class="Style-1" style="line-height: 115%;"><o:p></o:p></div><div class="Style-1" style="line-height: 115%;"><br /></div><div class="Style-1" style="line-height: 115%;"><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">However, for those who are in the line of selling software ( as opposed to, say </span><a href="http://www.redhat.com/"><span style="color: #000099; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">open sourcing the software and then selling the service</span></a><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">), the danger of having the whole application decompiled and resold by the competitors is just too great to ignore. Which is why .NET developers will have to obfuscate and encrypt their code before they package it for sale. </span><o:p></o:p></div><div class="Style-1" style="line-height: 115%;"><br /></div><div class="Style-1" style="line-height: 115%;"><a href="http://www.secureteam.net/"><span style="color: #000099; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">CliSecure .NET Obfuscator</span></a><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;"> is a .NET code protection and licensing solution that I have been using for past one year. To date, we are very satisfied with the product and the service. Here are a list of the features that we really love</span><o:p></o:p></div><div class="ListStyleCxSpFirst" style="line-height: 115%; margin-left: .5in; mso-add-space: auto; mso-list: l0 level1 lfo1; tab-stops: list .25in .5in; text-indent: -.25in;"><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">1.<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">.NET 4.0 support. </span></b><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">We are in the process of migrating to .NET 4.0. The most important .NET 4.0 feature for us is </span><a href="http://msdn.microsoft.com/en-us/library/dd460688.aspx"><span style="color: #000099; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">PLINQ</span></a><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">. For computationally intensive application, parallelism is the way to go as Moore’s Law </span><a href="http://www.zdnet.com/news/intel-scientists-find-wall-for-moores-law/133066"><span style="color: #000099; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">is going to hit the wall</span></a><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">. Instead of counting on the processor clock cycle to double up every 18 months, it is far more realistic to distribute computational loads to different cores to solve your speed issue. Which is why .NET 4.0 support is crucial for us in this matter. With CliSecure 5.2, we know that by the time we have transit to 4.0, we can release it straight to the customers without worrying about whether the protection tool is up to the task or not. </span><o:p></o:p></div><div class="ListStyleCxSpMiddle" style="line-height: 115%; margin-left: .5in; mso-add-space: auto; mso-list: l0 level1 lfo1; tab-stops: list .25in .5in; text-indent: -.25in;"><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">2.<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">Support various .Net Applications. </span></b><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">The .NET ecosystem is vast; Windows Form, ASP.NET, Silverlight, WPF, WCF, Windows Phone 7 etc. Different types of application development caters to different groups of needs, but they share the same CLR and framework. It is not unlikely that your application has to run on desktops, browsers and windows smartphones at the same time. The good thing about CliSecure is that it can handle all the nuances of the types, so that you don’t have to use different protection tools for different types of applications. One caveat though, some of the nonstandard .NET applications ( such as assemblies compiled by </span><a href="http://www.mathworks.com/products/netbuilder/"><span style="color: #000099; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">Matlab .NET builder</span></a><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;"> and </span><a href="http://www.silverfrost.com/"><span style="color: #000099; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">Silverfrost</span></a><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;"> the fortran.Net compiler) may not be supported due to the nonstandard nature of those compiled assemblies. But in those cases, one can readily work around the limitation by editing the assemblies by hand. For me, this is not really a problem, as we seldom compile those nonstandard .NET code.</span><o:p></o:p></div><div class="ListStyleCxSpMiddle" style="line-height: 115%; margin-left: .5in; mso-add-space: auto; mso-list: l0 level1 lfo1; tab-stops: list .25in .5in; text-indent: -.25in;"><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">3.<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">Method Call Obfuscation</span></b><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">. A lot of the protection tools keep the name of external calling method intact, because the names are needed in order to resolve the dependencies between different methods across different assemblies at runtime. This could create a security risk as hackers can determine what are the external calls your assemblies make and guess the content of your code. However, CliSecure solves this problem by replacing external calls with internal delegates so that the real, external calls are hidden from Reflector tools. With method call obfuscation, there is no problem in protecting the </span><a href="http://msdn.microsoft.com/en-us/library/dd264736.aspx"><span style="color: #000099; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">dynamic type objects</span></a><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">, introduced in C# 4.0. So all your dynamic language fanatics! You can now have the privilege to write </span><a href="http://haacked.com/archive/2007/08/19/why-duck-typing-matters-to-c-developers.aspx"><span style="color: #000099; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">duck typing code</span></a><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;"> that is previously restricted to dynamic type languages. But don’t blame anyone else if you introduce silly bugs that could have been caught by C# compilers. Greater flexibility comes with greater risks, I’m warning you. </span><o:p></o:p></div><div class="ListStyleCxSpMiddle" style="line-height: 115%; margin-left: .5in; mso-add-space: auto; mso-list: l0 level1 lfo1; tab-stops: list .25in .5in; text-indent: -.25in;"><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">4.<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">64 bit support.</span></b><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;"> Our application is a heavy number crunching engineering application. It uses up memory a lot. So 64 bit machine is the only hope for large projects. We were using other protection tools before stumbling upon CliSecure. Amazingly at that time ( about a year ago) there was not a single .NET obfuscator tool that protected a pure 64 bit application. When contacted on how to solve this problem, those tool providers advised us to compile our application as 32 bit app and run as 32 bit app on 64 bit OS. But this is completely impractical, as the very reason why we need 64 bit OS is because we need bigger memory. I communicated this need to CliSecure and they got it done in one month. This was the deal breaker for us to use CliSecure. </span><o:p></o:p></div><div class="ListStyleCxSpMiddle" style="line-height: 115%; margin-left: .5in; mso-add-space: auto; mso-list: l0 level1 lfo1; tab-stops: list .25in .5in; text-indent: -.25in;"><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">5.<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">Stack Trace Translation.</span></b><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;"> It’s often that when you are debugging a assembly which calls a protected assembly, you will get a gibberish stack trace when the crash happens. With the obfuscation, the real stack trace is also obfuscated and thus make debugging hard. However, with CliSecure 5.2, the stack trace is nicely preserved so that the developers won’t have to scratch his head and guess what’s going on wrong in the protected assembly. This would save us tremendous amount of time. </span><o:p></o:p></div><div class="ListStyleCxSpMiddle" style="line-height: 115%; margin-left: .5in; mso-add-space: auto; mso-list: l0 level1 lfo1; tab-stops: list .25in .5in; text-indent: -.25in;"><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">6.<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">Encryption, not just obfuscation</span></b><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">. There is a difference between encryption and obfuscation. With obfuscation, Reflector can still see your method body and logic, with all the variables renamed, logic reshuffled ( not to the point of destroying the original code flow, of course). The weakness is that with enough determination, the hacker can still de-obfuscate the code and understand what is going on in your application. Encryption, on the other hand, completely hides the method body from hackers so there is no way of guessing what the code does beyond what is revealed from the method name.</span><o:p></o:p></div><div class="ListStyleCxSpMiddle" style="line-height: 115%; margin-left: .5in; mso-add-space: auto; mso-list: l0 level1 lfo1; tab-stops: list .25in .5in; text-indent: -.25in;"><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">7.<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">Compatible with </span></b><a href="http://msdn.microsoft.com/en-us/library/ms173183(VS.80).aspx"><b><span style="color: #000099; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">reflection</span></b></a><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">. One of the things I love about .NET is its rich meta data and the ability to use reflection to manipulate it. You can use reflection to dynamically infer an object’s type, create an instance of a type, access an object’s available methods, fields and properties. This is extremely useful when you are trying to bind and display data in a declarative fashion. Unfortunately, obfuscation tools have the nasty habit of obfuscating private variables’ name, and make them inaccessible reflection, thus defeating the purpose of .NET rich metadata concept. CliSecure, on the other hand, doesn’t have problems with reflection. You can write the code in the way you want to without worrying about how the protection tool would work on it. </span><o:p></o:p></div><div class="ListStyleCxSpLast" style="line-height: 115%; margin-left: .5in; mso-add-space: auto; mso-list: l0 level1 lfo1; tab-stops: list .25in .5in; text-indent: -.25in;"><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">8.<span style="font: normal normal normal 7pt/normal 'Times New Roman';"> </span></span><b><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">Technical Support</span></b><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">. The standard mantra of technical support in software world is “we’ll get back to you in 24 hours time”. But not everyone follows this. When we were researching for a .Net protection tool, there was one provider who got back to us only one week later, and his response was “sorry we can’t do this now, but we’ll keep you posted” and we never heard from him since. Providing good technical support is very important as we, the end users have our business to do; we can’t wait too long for our vendors to fix their problems or else our business would be affected. <b>Provide timely and helpful technical support is sometimes more important than features</b>. And for this reason I would normally </span><a href="http://itscommonsensestupid.blogspot.com/2008/08/for-developers-how-to-choose-software.html"><span style="color: #000099; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;">eschew large software company with resellers</span></a><span style="color: black; font-family: Arial, sans-serif; font-size: 11pt; line-height: 115%;"> and prefer the ones that are small and nimble enough to answer my question quickly. CliSecure .NET Obfuscator has never failed to resolve my queries in a timely manner. When I encountered bugs in their software, they would usually give me an update that fixed the problem within a reasonable time frame. The technical support should always factor into the consideration when purchasing a component. </span><o:p></o:p></div><div class="Style-1CxSpFirst" style="line-height: 115%;"><br /></div><div class="Style-1CxSpLast" style="line-height: 115%;"><br /></div>Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com8tag:blogger.com,1999:blog-3204586232155134420.post-20801450610388887852010-05-02T17:42:00.003+08:002010-05-05T13:32:57.068+08:00How to Use C# Client to Consume Google App Engine's rpc<div style="text-align: justify;">Google App Engine allows one to run the web apps on Google infrastructure. This is especially enticing to developers because it takes care of hardware, hosting, scaling, authentication and deployment issues.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">I'm glad to learn that one can create desktop clients in any language to take to the Google App Engine backend. The way this can be done is as thus. First, get <a href="http://appengine-cookbook.appspot.com/recipe/xml-rpc-server-using-google-app-engine/">the excellent xml rpc python</a> code from here, integrate it into your Google App Engine application.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">The meat of your web service method is defined inside the <b>application</b> class, assuming that we have the following method in the application class:</div><pre class="brush: python">def getName(self,meta, keyInput): <br /> return keyInput<br /></pre><br /><br /><div style="text-align: justify;">This is how you can call this service method from C# client, by making use of the <a href="http://www.xml-rpc.net/">xml-rpc.net</a> library: </div><br /><pre class="brush: csharp">[XmlRpcUrl("http://localhost:8080/xmlrpc")]<br />public interface AppTest: IXmlRpcProxy<br />{<br /> [XmlRpcMethod("app.getName")]<br /> string GetName(string number);<br /><br />}<br /><br />public string GetName(string keyInput)<br />{<br /> var appProxy = XmlRpcProxyGen.Create<apptest>();<br /> appProxy.Url = "http://localhost:8080/xmlrpc/";<br /> return appProxy.GetName(keyInput);<br /><br />}<br /></pre><br /><div style="text-align: justify;">So now your C# client can talk to Google App Engine backend with ease.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Isn't it simple? But it took me a few days to figure this out.</div>Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com2tag:blogger.com,1999:blog-3204586232155134420.post-18276358014308933002010-02-18T23:53:00.000+08:002010-02-18T23:53:17.220+08:005A99<div style="text-align: justify;">I waited my friend at RHB bank opposite the Spring Shopping Mall, he was late, and the day was raining. This is not my exact idea of fun, I told myself. I was preparing to meet my ex-secondary schoolmates ( dubbed <i>5A99</i>), meeting schoolmates can be fun, if the gathering can ignite the sense of kinship that bonded everyone in the first place. But it can be boring or even downright embarrassing if everyone is staring in (or past) everyone's presence, not knowing what to say. A bad weather and a-friend-late-on-time seemed like a bad omen for the thing to come. </div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Finally, he came, so I followed his car to the destination. <a href="http://maps.google.com/maps?f=q&source=s_q&hl=en&geocode=&q=kuching&sll=54.787715,-6.492314&sspn=3.370577,10.821533&ie=UTF8&hq=&hnear=Kuching,+Sarawak,+Malaysia&z=11">Kuching</a> was moving up a lot since the days when I moved away from it. That place was a new restaurant that didn't exist ten years ago. As we parked our car and walked into the restaurant, I took a look at my watch. 7.20pm, 10 minutes to the dinner. Standing in front of the door was a handsome young man. He was Tze Siang, after years, he still looked as boyish as before. </div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Suddenly, everyone seemed to appear at the same time, we enthusiastically exchanged handshakes, meeting old pals was good, but the atmosphere was a bit tense. We started to chit-chat, the conversation was a bit formal. And there were long pauses between conversation. Were we at lost of words to say to each other because of <i>long-time-no-see</i>? I wondered.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">However, when we found a place to sit down, suddenly the atmosphere was heating up. First, a few crackers of chuckles, then, the voice volume rose, and crackers of chuckles gradually evolved into burst of laughters, from every corner of the room. </div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">We were exchanging our life-experience and jokes. We told one another of our experience from our walks of life, our friends listened attentively, sometimes added a few interesting remarks that set us all into laughters. The way we shouted across the table, it felt so much like the way when we shouted across the classroom. Our exaggerated facial expression when telling stories, those were the faces that we <b><i>were</i></b> when we were studying together. For a moment we traveled back in time, being our old gun-hoo self, resumed our innocent and carefree attitude. There was never a moment in my life when I felt more <i>5A99</i> then now. </div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">The only difference was, the ladies were much more pretty and urbanized then ten years ago, and the men were more handsome, slickly dressed then before. </div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">To be sure, we are never the same again after started working. Our work and our commitment have taken a toll on us. We can no more make friends as heartfelt as we were ten years ago. There are times when we have to wear a mask when dealing with people. And sometimes I wonder whether earning money and recognition in exchange of innocence and genuine friendship is a good bargain.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">But tonight's gathering reminded me of how precious and enduring the friendship forged since young is. We may only see each other once a year, or maybe less. And the time may come when we busied ourselves with our families, but deep inside my heart, I would never forget that at one point of time I studied together with <i>5A99</i>, and tonight shall go down as one of the most memorable days in my life. Of course, we didn't befriend with each other because we wanted to get projects or benefits, that's the point I cherish most.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Thanks, 5A99. Love you all, always.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><br /></div>Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com3tag:blogger.com,1999:blog-3204586232155134420.post-55412028409601805282010-02-16T23:21:00.001+08:002010-02-16T23:32:42.816+08:00Face.com<div style="text-align: justify;">Ever since I joined <a href="http://www.facebook.com/">facebook</a> I was overwhelmed by a large number of photos and photo albums created by my friends ( you know who you are :)). With a gazillion number of photos, photo browsing, finding and tagging became an addictive activity, and a consuming one.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">For a long time I wished that facebook would just import the <a href="http://picasaweb.google.com/">picasa</a>'s ability to <a href="http://www.readwriteweb.com/archives/picasa_web_albums_to_get_face.php">auto-recognize the faces and auto-tag them appropriately</a>. I reckon that facial recognition technology shouldn't be so difficult that only Google can do it, and should be important enough for any photo-sharing-intensive sites to have it. Or else how can the users manually identify every single one of their friends in the photos?</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">So, I was thrilled to learn that <a href="http://face.com/">face.com</a> has finally taken the challenge to autotag the faces in facebook photos. The marketing material says that face.com employs "the most advance face recognition technology on earth". Although I can't verify the claim, but from my experience it is a very useful application that actually <i>saves your time tremendously</i>, unlike other pointless time-waster applications that suck away your time and serve absolutely no purpose at all ( I'm looking at you, <a href="http://www.facebook.com/applications/SuperPoke!/2357179312">SuperPoke!</a> and <a href="http://apps.facebook.com/marketplace/?cm_mmc_o=PBBLFzyLCjC_BBLFzyLCjC_BBLFzyLCjCtBFw">MarketPlace</a>). </div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">So, if you have facebook account, why don't you just head over to <a href="http://face.com/">face.com</a>, and lets it tags you and your friends photos. I'm sure you will find it as useful as I do. </div><div style="text-align: justify;"><br /></div>Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com2tag:blogger.com,1999:blog-3204586232155134420.post-63888554614915873612010-01-22T15:03:00.001+08:002010-01-22T15:19:43.063+08:00Stupid Support Emails from Malaysia<div style="text-align: justify;">Ayende just posted the stupidest support email on <a href="http://ayende.com/Blog/archive/2010/01/21/stupid-support-emails-4.aspx">his blog</a>. I took a look at the email content, and had to agree with him. Really, the email lacked even basic netiquettes, was poorly written, and was asking for heavens and earths from someone he doesn't know personally.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">What a shame.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">What is more embarrassing to me is that the author of that email comes from Malaysia. Yes, <i>It is from Malaysia</i>, my country.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">It must be a gigantic failure for <a href="http://itscommonsensestupid.blogspot.com/2009/05/open-letter-to-my-sister-and-other.html">Malaysia's education system</a> to produce graduates <i>who don't even know how to ask questions</i>. It's a bigger failure for the system to produce graduates who don't appreciate the amount of free time open source contributers have and ask for a detailed A-Z tutorial when the they can just google up the information themselves. Maybe I shouldn't be too surprised by the entire episode. I mean, what can you expect a spoonfeeding-education system to produce? An Einstein?<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Just to let you know that I was a victim of Malaysia's education system as well. I couldn't forget the time in secondary school when I had to memorize all the facts in order to pass my exams and to booked a seat in college. Even in the university I crushed through the subjects by sheer memorization. The effect of regurgitation and force memorization crippled our creativity, made us unable to think for ourselves because we were trained and told that there was only one answer in the world and unless you get that answer right you are dead and that answer is the correct one and there shall be no debate on it.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">This kind of spoonfeeding system has a more deleterious effect on other students, I afraid. A lot of top grade students do not know anything besides their books. And it isn't clear that they really understand the knowledge taught. I mean, even for maths and physics and engineering and computer science subjects you can score an A without understanding the material, isn't it? All you have to do is to memorize everything, leave no stone unturned. So, when it comes to the time when they are expected to do their own research, or get things done without to- to-bottom command from their superior, they flounder. Or when they are asked to solve real world problem on their own, they are stumped. Even a simple act of asking help from appropriate person in an appropriate manner is too difficult for many of them, as demonstrated above.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">What a pity.<br /><br /><b><i>Edit: Thanks to our broken education system, the Power Distance Index (PDI, the higher the index is, the more submissive a person is to authority) </i></b><a href="http://www.clearlycultural.com/geert-hofstede-cultural-dimensions/power-distance-index/"><b><i>for Malaysia is the highest</i></b></a><b><i>.</i></b><br /></div><div style="text-align: justify;"><br /></div>Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com1tag:blogger.com,1999:blog-3204586232155134420.post-36955475299080545872010-01-14T17:09:00.000+08:002010-01-14T17:09:49.752+08:00Me, At the SiteMap of StackOverflowIt's flattening to see my account at the sitemap of <a href="http://stackoverflow.com/">StackOverflow</a>, <a href="http://www.google.com.my/search?rlz=1C1GGLS_enMY291MY303&aq=f&sourceid=chrome&ie=UTF-8&q=stackoverflow">according to Google</a>.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/_SDci0Pf3tzU/S07fBD3OG8I/AAAAAAAAFZs/2IJ_-wUouRI/s1600-h/soflow..png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="266" src="http://1.bp.blogspot.com/_SDci0Pf3tzU/S07fBD3OG8I/AAAAAAAAFZs/2IJ_-wUouRI/s400/soflow..png" width="400" /></a><br /></div><br />Thanks to <a href="http://meta.stackoverflow.com/users/130507/chris">Chris</a> who <a href="http://meta.stackoverflow.com/questions/35497/tom-ritter-ngu-soon-hui-what-is-your-secret">brought this to our attention</a>!Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com1tag:blogger.com,1999:blog-3204586232155134420.post-25052629900641161482009-12-31T23:23:00.000+08:002009-12-31T23:23:40.447+08:00Goodbye 2009, Hello 2010<div style="text-align: justify;">Time flies.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Maybe it's time for me to do some reflection. Let's see, what I have done this year?<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Probably not much. At least, nothing very interesting. Just another year.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Oh wait, maybe I <i>did</i> do something. On SO, I achieve more than <a href="http://stackoverflow.com/users/3834/ngu-soon-hui">10k of reputation</a>, an achieving that is worthy of <a href="http://meta.stackoverflow.com/questions/20849/thanks-to-both-stackoverflow-and-telerik-for-the-awesome-promotion">a free telerik license</a>.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">On the blog side, I wrote 84 blog posts this year, that's a drop of 50 posts from last year.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">And I planned to migrate my blog to a wordpress blog. But so far I haven't done anything on it.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">That's it. Wish everyone a happy new year!<br /></div>Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com0tag:blogger.com,1999:blog-3204586232155134420.post-44523723684092893822009-12-18T16:34:00.000+08:002009-12-18T16:34:51.483+08:00Dude, Where's Your csproject and sln?<div style="text-align: justify;"><a href="http://en.wikipedia.org/wiki/Revision_control">Source control</a> is indispensable for any team with more than two members. There is literally no way to transfer code from one developers to another with just disk swap and copy. And if you happen to work on a development project with multiple developers and your team doesn't even have a decent source control, it's not hard to guess that most of your time will be wasted on yelling at each other, arguing who's breaking the code, and demanding for latest files.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">What a terrible waste of your developer's precious time, and what a waste of your stackholders' money. Sometimes it's quite a bit of irony for developers to write code so that other people's life and work can be automated and at the same time, the level of automation in development is just bare minimum. This is simply scandalous.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Now, even if you already a source control, that doesn't mean that you are free from improvement, far from it. Some developers I know only check-in the source code, leaving the configuration file, csproject, solution file and all other perceived secondary files on their hard disk without proper backup. This is also not acceptable.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Think about this: when a new developer joins your team, he is expected to start working immediately. Don't expect him, <i>ever</i> to pickup the code from source control and then create the csproject files himself just in order to do a compilation. First, the idea of constructing csproject from the source files is just plain boring. Second, it involves a fair amount of guess work; how do <i>you</i> know which files to include and which files <i>not</i> to include? Third, it can take a long time just to figure out what are the external references. Not to mention that every time you include a new cs file, you still have to inform him to do the same work lest the build is broken.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Let's do a simple cost benefits analysis of not adding the csproject files into the source control. The initial csproject file construction: 4 hours on average ( it can take a significantly longer time if you have a large project). Every time a new file added: 2 minutes, the frequency of this happening: 1 per week. That's 8 minutes per month per developers. But what about the time needed for the developers to get in and out of the zone of coding thanks to this tiny distraction? Probably half an hour. Multiplying this number with the number of developers and with the length of the project duration, you can see that the whole development effort is taking a toll simply because someone decided that the csproject and solution files are not worthy of a place in source control.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">So, please, for the sake of everyone, do check-in your csproject and solution, now. And make sure that your daily build can build everything automatically, without manual intervention. Starting from checking out all the files from the source, and then proceed to run a compilation, finally finishing with installer packaging, everything must happen seamlessly.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><br /></div>Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com0tag:blogger.com,1999:blog-3204586232155134420.post-49548109002892302362009-12-10T22:04:00.000+08:002009-12-10T22:04:40.282+08:00SO 10K<div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/_SDci0Pf3tzU/SyC2J8bmYMI/AAAAAAAAFVs/x0od39_-mzM/s1600-h/SO%2010k..png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="170" src="http://1.bp.blogspot.com/_SDci0Pf3tzU/SyC2J8bmYMI/AAAAAAAAFVs/x0od39_-mzM/s640/SO%2010k..png" width="640" /></a><br /></div><br />Now I am also an <a href="http://stackoverflow.com/users/3834/ngu-soon-hui">SO 10k gold members</a>!Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com0tag:blogger.com,1999:blog-3204586232155134420.post-9702728422231305352009-12-09T23:06:00.000+08:002009-12-09T23:06:33.015+08:00Google Docs Outage<div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/_SDci0Pf3tzU/Sx-5zTlpEZI/AAAAAAAAFUY/wYLCJX7lUY0/s1600-h/google%20docs%20outage.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="153" src="http://1.bp.blogspot.com/_SDci0Pf3tzU/Sx-5zTlpEZI/AAAAAAAAFUY/wYLCJX7lUY0/s400/google%20docs%20outage.jpg" width="400" /></a><br /></div><br /><div style="text-align: justify;"><a href="http://docs.google.com/">Google Docs</a> is usually stable. But today, for four hours already, I am unable to access some of my documents.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Not all, but some. But that's enough to drive me crazy. And luckily today is not one of the days when I have to sell Google Docs to my relative ( Yes, I am Google's part time, unpaid evangelist).<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">A search in the Google Docs forum reveals that <a href="http://www.google.com/support/forum/p/Google+Docs/thread?tid=5bd98477a7b1f0f7&hl=en">I am not alone</a> <a href="http://www.google.com/support/forum/p/Google+Docs/thread?tid=54649d66d81ba342&hl=en">in facing</a> <a href="http://www.google.com/support/forum/p/Google+Docs/thread?tid=6e74d7b408cfefa7&hl=en">the outage</a>. This is unacceptable as people depends on Google Docs for their personal docs, working docs, and even <a href="http://www.google.com/support/forum/p/Google+Docs/thread?tid=1467ac8c61361584&hl=en">their exam notes</a>.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">But, there is still <a href="http://www.google.com/support/forum/p/Google+Docs/thread?tid=1467ac8c61361584&hl=en">a workaround</a>, hopefully those who need to access their documents would somehow get a backup version of the docs.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">The moral of this outage? I afraid there is <i>no</i> moral. You can't expect us-- I mean any mere mortal, not just yours-truly who live on the cloud-- to dutifully backup our documents to a safe space because the reason why we put our docs online in the first place is to avoid doing the backup. I think we just have to take it as it is, that such an outage is indeed regrettable, and there is nothing we can do to forestall it from happening, and there is nothing we can do to minimize such an unfortunate event.<br /></div>Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com1tag:blogger.com,1999:blog-3204586232155134420.post-37958895030184250322009-12-08T10:07:00.000+08:002009-12-08T10:07:26.944+08:00Test Practices at Google<div style="text-align: justify;">Here's an article on how <a href="http://gojko.net/2009/12/07/improving-testing-practices-at-google/">Google conducts its automated test</a>s. It gives us a glimpse of how Google manages its testing infrastructure and justifies the testing investment ( Yes, testing effort needs to be justified from time to time). We all know although writing tests are good, but tests that are poorly written will suck up development time, yield little or negative return of investment, and cost disillusion among developers. Here's how Google finds out whether a test is a "good" test (i.e., catches bugs and has a low maintenance cost) or a "bad" test. ( doesn't find bugs and is brittle):<br /></div><blockquote><div style="text-align: justify;">The first step was to provide developers reactive feedback on tests. For example, the system suggested deleting tests that teams spent loads of time maintaining. They then collected metrics on whether the people actually acted on suggestions or not. The system also provided metrics to tech leads and managers to show how teams are doing with tests.<br /></div><br /><div style="text-align: justify;">The second step, which is in progress at the moment, is to find patterns and indicators. As they now have identified lots of good and bad tests, the system is looking for common characteristics among them. Once these patterns are collected, algorithms will be designed to identify good and bad tests, and manually calibrated by experts.<br /></div></blockquote><div style="text-align: justify;">It seems like they are applying pattern recognition in identifying the tests. Kudos to Google.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">The software community would benefit as a whole if Google decides to open source <i>this</i> portion of the code.<br /></div>Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com0tag:blogger.com,1999:blog-3204586232155134420.post-58847486851228831162009-12-01T22:33:00.000+08:002009-12-01T22:33:47.271+08:00Call to Vote: Should I Get a New URL and a WordPress Blog Engine?<div style="text-align: justify;">One month ago I <a href="http://itscommonsensestupid.blogspot.com/2009/10/should-i-get-new-domain-name-and-new.html">put a poll</a> on thetop right hand side of <a href="http://itscommonsensestupid.blogspot.com/">my blog</a>, asking everyone should I get a domain name and a new WordPress Engine. Here's the result I got so far:<br /></div><br /><ul><li style="text-align: justify;">7 votes for "Get a new url and a new wordpress blog engine"</li><li style="text-align: justify;">3 votes for "retaining the same blogger engine but get a new url"</li><li style="text-align: justify;">4 votes for "retaining both the url and the blogger engine"</li></ul><div style="text-align: justify;">The rational for each choices are available <a href="http://itscommonsensestupid.blogspot.com/2009/10/should-i-get-new-domain-name-and-new.html">here</a>.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Now, there are 26 days left before the poll closes. All I can say is, do vote, so that I know what to do with this blog.</div><div style="text-align: justify;"><br /></div>Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com0tag:blogger.com,1999:blog-3204586232155134420.post-20192067746607143262009-11-27T10:21:00.001+08:002009-11-27T10:27:20.816+08:00Can You Figure Out What It Is?Here's <a href="http://learn.typemock.com/its-coming/">a puzzle</a> for you to crack, can you figure out what it means?Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com2tag:blogger.com,1999:blog-3204586232155134420.post-67028170787186376882009-11-26T21:52:00.000+08:002009-11-26T21:52:23.206+08:00Exchange 2010--New Software, Old Paradigm<div style="text-align: justify;">On Tuesday I went to <a href="http://www.microsoft.com/windows/windows-7/">Windows 7</a>, <a href="http://blogs.msdn.com/philpenn/archive/2008/08/19/windows-hpc-server-2008-rc2-now-available.aspx">Windows Server 2008 RC2</a> and <a href="http://www.itpro.co.uk/618136/microsoft-exchange-server-2010-review">Microsoft Exchange 2010</a> launching at KL Convention Center. The party was great, the speakers were convincing and nice, and the food was... well, there was no food.<br /></div><div style="text-align: justify;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/_SDci0Pf3tzU/Sw6BP6gRxkI/AAAAAAAAFRI/feKn9z_I-qg/s1600/exchange.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;"><img border="0" src="http://1.bp.blogspot.com/_SDci0Pf3tzU/Sw6BP6gRxkI/AAAAAAAAFRI/feKn9z_I-qg/s1600/exchange.jpg" /></a><br /></div><div style="text-align: justify;">I was mildly impressed by Windows 7 and Server 2008, but Microsoft Exchange was a huge let down.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">It wasn't that the software was poorly done. The Exchange server interface was OK, the web version of the outlook client was fully AJAX, and overall it seemed that it was quite good a tool for its purpose.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">The only problem is, in my mind, the days for server-client based Email programs are over. Back in the antediluvian days when web browser market was monopolized by the much-hated IE6 , Exchange, and <a href="http://office.microsoft.xn--com%20%20home%20%20products-1w9pka/">outlook</a> were the only acceptable email servers and clients existed on desktop. There was no reliable web application substitute because<a href="http://mashable.com/2009/07/16/ie6-must-die/"> IE6 hindered web application so much that developers had no choice but to continue write for desktop application</a>.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">But no one, not even the mighty Microsoft could hold back the pace of innovation. Firefox busted into the scene, broke the tyranny of IE, and suddenly web development became fun again! Developers started to write applications for web, and more and more applications were shifting to the webs and consumers suddenly found that web apps are much more convenient than desktop apps and that really worried Microsoft, so it pushed out IE7 faster than scheduled. <a href="http://mail.google.com/">Gmail</a> is the web 2.0 app fanboy, showing us what can a web app does.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Which is what makes Exchange 2010 looked so pale in comparison. I would have to install Exchange on server, I <i>still</i> have to do that in 2010 version. This is completely unacceptable; what can't Microsoft make the a complete online system for email management, instead of a desktop application? <a href="http://www.google.com/enterprise/">Google Enterprise</a> is entirely web-based. And we can completely manage and configure our blogging platform, e-commerce platform, news platform entirely on the web ( think about CMS systems such as <a href="http://www.drupal.org/">Drupal</a>), it shouldn't be so difficult for Microsoft to make Exchange 2010 web-based, or is it?<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Looks like despite the rhetoric "web is the future", Microsoft thinking is still deeply,hopelessly rooted in desktop application. I can only wish them good luck, for the trend is moving towards web, not away from it.<br /></div><div style="text-align: justify;"><br /></div>Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com3tag:blogger.com,1999:blog-3204586232155134420.post-50909039194674140012009-11-25T23:46:00.000+08:002009-11-25T23:46:53.213+08:00Is Reddit Going Nuts?<div style="text-align: justify;">Something must be deeply <b><i>wrong</i></b> with <a href="http://reddit.com/">reddit.com</a>.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">It used to be a nice place to submit articles, to discuss about them and to upvote/downvote them, depending on whether you like or hate them.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">But for certain reason, unknown to me, my submissions for the past few weeks were going down in the drain; they never appear in the <a href="http://www.reddit.com/new/">newest link</a>, which means that they didn't stand chance to be seen, upvoted/downvoted or discussed.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Sure, I can still see <a href="http://www.reddit.com/r/programming/comments/a7w1c/the_mistakes_i_made_in_my_programming_career/">my submission</a>, but note that there is no upvote or downvote activity.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">This is the worst way a user-driven website can break-- it means that not everyone can submit articles.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Reddit! You are no longer as fun as you were before! Now please go and fix your problem.<br /></div>Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com1tag:blogger.com,1999:blog-3204586232155134420.post-47776902697622186532009-11-20T20:00:00.002+08:002009-11-25T11:39:56.134+08:00The Mistakes I Made in My Programming Career<div style="text-align: justify;">You don't usually see people ( including me!) talk about their mistakes openly. But I think it is good to think about the mistakes we made in the past, so that we don't commit the same errors in the future.<br /></div><br /><div style="text-align: justify;">I've been a professional programmer for about 5 years now. Like anyone else, I made mistakes along my way. Usually I didn't recognize the wrong thing I did right away; I only knew about the mistakes after being exposed to the correct ways of doing things. Hopefully after reading this post you would draw something useful from it and won't make the mistakes ( and pay the same price) as I did.<br /></div><ol><li><span style="font-size: x-large;">Not using a proper ORM</span><br /><br />Data Access Layer code is always messy, tedious and boring. I remembered when I was first doing a simple internal bookkeeping application, I was horrified at the amount of code I had to write just to get the basic plumbing done. So I started to plug away the <a href="http://msdn.microsoft.com/en-us/library/h43ks021(VS.71).aspx">ADO.NET</a> and manually coded up a home-brewed-with-a-very-specially-customized-to-specific-table-schema ORM to serve my purpose.<br /><br /><br /><br /><div style="text-align: justify;">A few months later there were some changes in the business requirements, and that cascaded into changes in table schemas, which led to a modification of my ORM, which was <i>so</i> painful that I discarded it all together and opted for <a href="http://www.wrox.com/WileyCDA/Section/Strongly-Typed-DataSets-in-ASP-NET-2-0-Pages.id-302833.html">strongly typed dataset adapter</a><br /></div><br /><br /><br /><div style="text-align: justify;">For a while this thing actually worked. But still, I wished that I <a href="http://itscommonsensestupid.blogspot.com/2009/04/nhibernate-multiple-databases-support.html">used a proper ORM</a> ( such as <a href="https://www.hibernate.org/343.html">NHibernate</a>) for the job. At least I don't have to worry about changing database vendor when my users grow in numbers.<br /></div><br /><br /><br /><br /></li><li><span style="font-size: x-large;">Not learning generics soon enough.</span><br /><br /><br /><br /><div style="text-align: justify;">I started my career as a programmer in .Net 1.1 days. The problem with .Net 1.1 is that it doesn't have <a href="http://draft.blogger.com/msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx">generics</a> support. As a result we couldn't have strongly typed list and could only be satisfied with the bland <a href="http://draft.blogger.com/en.csharp-online.net/ArrayList">ArrayList</a>. But using Arraylist, with casting and boxing all over your code is just painful to read and write. So we used <a href="http://draft.blogger.com/www.codesmithtools.com/">CodeSmith</a> to generate strongly typed collection list. But as the codebase grew those custom generated lists were becoming a monster on their own. Because I can modify the code easily, I often step in and change a method's behavior to suit my purpose, and that caused confusions and bugs later on.<br /></div><br /><br /><br /><div style="text-align: justify;">I should have switched to .Net 2.0 and started to use generics as soon as it is available, instead of creating more and more custom collection lists that are simply unmaintainable.<br /></div><br /><br /><br /><br /></li><li><span style="font-size: x-large;">Reinvent the wheel</span><br /><br /><br /><br /><div style="text-align: justify;">New programmers always like to reinvent the wheel: "The current implementation wasn't good enough for me so I have to rewrite the whole thing from the scratch". I once thought about writing my own UI controls because Windows Forms UI controls were just too unsophisticated for my use.<br /></div><br /><br /><br /><div style="text-align: justify;">As we all know there are a lot of excellent .Net UI control tools available; my GUI tools were not as good as those commercial ones, of course. I was just too naive then.<br /></div><br /><br /><br /><br /></li><li><span style="font-size: x-large;">Too much documentation.</span><br /><br /><br /><br /><div style="text-align: justify;">Code documentation is good, because it explains, in plain English, what your code is doing, right?<br /></div><br />Wrong.<br /><br /><br /><br /><div style="text-align: justify;"><a href="http://itscommonsensestupid.blogspot.com/2008/03/one-single-tip-to-comment-your-code.html">Documentation is often staled, outdated or downright wrong</a>. I spent a lot of my time documenting my code ( <a href="http://msdn.microsoft.com/en-us/library/b2s063f7(VS.71).aspx">XML documentation</a>, remember?), only to find that I needed to update the documentation when I changed my code. Updating the code is a must, but updating the XML documentation isn't; it's a liability, it sucks time, and it serves no purpose. Eventually I ran out of patient changing the XML documentation and moved on to something else.<br /></div><br /><br /><br /><br /></li><li><span style="font-size: x-large;">No automated build</span><br /><br /><br /><br /><div style="text-align: justify;">Application deployment and packaging are comparatively easier than programming, and so I put a very low priority on that. Soon, I was receiving complains from everyone the build wasn't working. "Prerequisites are missing, how to fix it?";"dlls are not updated, can you please send me a patch?";"Why the icons are running away?" and calls alike were reaching desk like avalanche.<br /></div><br /><br /><br /><div style="text-align: justify;">At the end of the day I was worn out, not because of programming, but because of mind-numbing re-deployment and repackaging process. I could really "save" sometime from writing the automation scripts, but the time I wasted on fixing every errors and on supporting other people was many times more than what I could "save". <a href="http://ayende.com/Blog/archive/2009/11/18/reducing-friction-as-a-standard-operating-method.aspx">Your software should be built at one click, more than that is a waste.</a><br /></div><br /><br /><br /><br /></li><li><span style="font-size: x-large;">Rely on visual inspection and debugging too much</span><br /><br /><br /><div style="text-align: justify;">It's so easy to come up a form and display your output. And Visual Studio is so powerful that one can easily step into the code and inspect the value on the fly. But <a href="http://gilesbowkett.blogspot.com/2007/10/debugger-support-considered-harmful.html">debugger is harmful</a> if you indulge into it too much. Imagine if your method will only get called after the application is up and running for 45 minutes, are you going to wait 45 minutes to reach that point and then only start debugging?<br /></div><br /><br /><br /><div style="text-align: justify;">A better way is to break the application into sub-module that can be called independently. In this way you can just prepare the input that produces the faulty output and test it from there onwards.<br /></div><br /><br /><br /><br /></li><li><span style="font-size: x-large;">No unit test</span><br /><br /><br /><br /><div style="text-align: justify;">I used to think that my application is trivial, that it can be easily covered by manual testing. Unit testing is for something big, and sophisticated and not for me. The outcome of this was the application grew into a monster, with no separation of concern, hard-to-refactor and completely unmaintainable code base. There was a point when I was afraid to make even the slightest modification to my code because any changes may or may no result in breaking changes. There were a few times when a mysterious problem suddenly surfaced out of nowhere, and the root cause was a breaking change I introduced a few months ago. Working with this kind of legacy code is not just boring and straining, but mentally stressing as well.<br /></div><br /><br /><br /><br /><div style="text-align: justify;">But with unit tests, life improves dramatically. I wish I could have learn <a href="http://www.amazon.com/Art-Unit-Testing-Examples-NET/dp/1933988274">the art of unit testing</a>, and practicing unit testing starting from day one. It's a shame that the school doesn't teach unit testing.<br /></div><br /><br /><br /><br /></li></ol>Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com13tag:blogger.com,1999:blog-3204586232155134420.post-23429947574777011812009-11-19T22:15:00.000+08:002009-11-19T22:15:00.936+08:00Google Wave, I Don't Get It<div style="text-align: justify;">I love<a href="http://itscommonsensestupid.blogspot.com/2008/09/google-chrome.html"> Google's</a> <a href="http://itscommonsensestupid.blogspot.com/2009/03/why-gmail-is-better-than-yahoo.html">products</a>. But the <a href="http://wave.google.com/">Google Wave</a> is driving me nuts. Google Wave is the first Google product that I neither get it nor like.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">I just can't understand Google Wave. I mean, what is it <i>really</i> for? Upon logging into Google Wave I can see that I have, erm, a lot of entries ( sorry, I don't really know what else to call them), and all I can say is that it's a nice way to interact with a lot of people. But if I want social interaction I could have just Gchat with them, or setup a <a href="http://groups.google.com/">Google groups</a> to have fun together.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">I can see that Google Wave has a lot of overlaps with other Google offerings. That doesn't sound very promising, I afraid.<br /></div>Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com2tag:blogger.com,1999:blog-3204586232155134420.post-59572271868712668112009-11-10T21:25:00.001+08:002009-11-11T09:15:19.844+08:00Matlab: Invalid .NET Framework. Either the specified framework was not found or is not currently supported.<div style="text-align: justify;">If you are trying to compile <a href="http://www.mathworks.com/">Matlab</a> into .Net framework, you might encounter this message,<b> even though you have the .Net framework installed</b>:<br /></div><blockquote>Invalid .NET Framework. Either the specified framework was not found or is not currently supported.<br /></blockquote><div style="text-align: justify;">This error is very misleading, because most of the time, developers are smart enough to install .Net framework before trying to compile Matlab library into .Net component. The reason why-- despite that you already have .Net framework installed-- this message comes up is because of the way you specify your mcc build compilation parameter.<br /></div><div style="text-align: justify;"><br /></div><pre class="brush: bash">'mcc -d ' dnetdir ' -W ''dotnet:dotnet,dotnetclass,1.0,private'' -T link:lib ' mfile<br /></pre><br /><div style="text-align: justify;">The above command <b>won't</b> work if you don't have .Net framework <b>1.0<i></i></b> installed. This is because Matlab allows you to specify the .Net framework version (<b>1.0</b>) after you specify your class name(<b>dotnetclass</b>). And by setting the value to be 1.0 you are compiling against .Net framework 1.0 which simply doesn't exist on modern developer machine. <br /></div>Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com4tag:blogger.com,1999:blog-3204586232155134420.post-80058099087399739082009-10-20T22:40:00.000+08:002009-10-20T22:40:21.499+08:00Should I Get a New Domain Name and New Blog?<div style="text-align: justify;">I wrote my second post about <a href="http://itscommonsensestupid.blogspot.com/2007/11/kick-start.html">two years ago</a>, and in these two years the blog has achieve some readership ( about 250+ <a href="http://www.google.com/reader">Google Reader</a> subscribers, don't believe the number of subscribers reported by <a href="http://feeds2.feedburner.com/ItsCommonSenseStupid">feedburner</a>-- it's not accurate), hit <a href="http://reddit.com/">reddit.com</a>, <a href="http://news.ycombinator.com/">hacker news</a>, <a href="http://dzone.com/">dzone</a>, <a href="http://dotnetkicks.com/">dotnetkicks</a> and other news aggregator websites homepage a few times and help me collect my <a href="http://itscommonsensestupid.blogspot.com/2009/09/my-first-google-adsense-cheque.html">first cheque</a> from Google. Not bad for a simple blog that doesn't even have a proper domain name.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">But I think time has come for me to do some serious reflection on this blog. If this blog were to grow-- and if I were to continually invest in my blogging effort, mostly for the purpose of self entertainment and maybe a bit of publicity-- I would need to give the blog a proper URL, not a subdomain at <a href="http://www.blogger.com/">blogspot.com</a>. And also, I need a customizable backend and frontend, basically this means that I would have self-host a WordPress blog engine ( Sorry, .Net based blog engines such as <a href="http://blogengine.net/">blogengine.net</a> are totally out of .question because the plugins are not as many and the hosting cost is substantially more expensive).<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Now, let me list down the pros and cons of getting a new domain name and a new blogging engine:<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Pro:</b><br /></div><br /><ol><li style="text-align: justify;">More professional</li><li style="text-align: justify;">If I am not doing it now, it will be harder for me to do it next time.</li><li style="text-align: justify;">An SEO friendly URL has a greater chance of drawing in more traffic from search engines.</li><li style="text-align: justify;">Easier customization</li></ol><b><div style="text-align: justify;">Con</div></b><br /><br /><ol><li style="text-align: justify;">I would lose my readership. Not everyone would bother to rebookmark or resubscribe, I know</li><li style="text-align: justify;">I would lose Google PageRank. I have to garden my blog from the start</li><li style="text-align: justify;">I would need to setup a lot of things</li><li style="text-align: justify;">Need to shell out at least RM135 per year for the blog ( about 40 USD per year)</li><li style="text-align: justify;">Lose the remaining Google Adsense earning</li></ol><div style="text-align: justify;">What do you think? Leave a comment here or vote at <a href="http://itscommonsensestupid.blogspot.com/">my blog</a>!</div><div style="text-align: justify;"><br /></div>Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com4tag:blogger.com,1999:blog-3204586232155134420.post-43680877152882527472009-10-19T23:56:00.002+08:002009-10-19T23:57:59.346+08:00Common Misconception of The Cost of Software Development<div style="text-align: justify;">I didn't foreseen that my rant ( <a href="http://itscommonsensestupid.blogspot.com/2009/10/why-software-is-expensive.html">Why Software is Expensive</a>) would generate a huge response on the Internet ( over 100 comments and 89 points in <a href="http://www.reddit.com/r/programming/comments/9qwlm/why_software_is_expensive/">reddit</a>, 25 comments and 23 points in <a href="http://news.ycombinator.com/item?id=861554">hacker news</a>). Most comments agreed with the points I raised. While it is nice to find that the netizens out there agree with me, but it would be nicer if all the IT-illiterate guys wake up to the truth.<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">But wait! There are some dissonance that are worth addressing here:<br /><br /></div><blockquote><div style="text-align: justify;">Software is too expensive because people want to laze off all day and getting a nice income, because REPRODUCTION costs are ZERO, yet the price is STILL high.<br /></div></blockquote><div style="text-align: justify;"><br />Well, software is not something that you can write once and forever derive revenue from it without putting in extra effort. Anyone who believe this is grossly mistaken. Unlike a lot of products on the market that don't innovate for a decade but still able to pull in revenue just because they have something valuable to sell, software is built entirely upon innovation. Version 2 of a software application is usually a vast improvement ( and rewrite) over its predecessor. The corresponding line of code usually grows at geometrical rate but the price doesn't . <a href="http://www.nytimes.com/2006/03/27/technology/27soft.html">Windows 95 has 15 million lines of code and Windows XP has 35 million</a>, but the price is about the same. Without actively innovating the software applications as we know them will not be as user friendly and as powerful as they are now. All these R&D needs funding; to say that the developers are lazying off their days at beach while collecting cheques are simply distorting the truth.<br /><br /></div><blockquote><div style="text-align: justify;">Not to mention, software is far more full of bugs than hardware is, and hardware development is EVEN HARDER. And yet the price of hardware is plummeting every month while the price of software is staying constant. <br /></div></blockquote><div style="text-align: justify;"><br />That's because no one is ordering their own custom made hard disk and <i>everyone</i> is trying to commission their own software. Custom made things are always more expensive than standardize products before the latter can be mass produced but the former isn't. The reason why hard disk is so cheap is because<i> it comes only in a few flavors and that people all around the world are sharing the cost of developing these few flavors of hard disk</i>. Software, on the other hand, doesn't enjoy this luxury and that's why the price cannot plummet. As to the accusation that software is more full of bugs than hardware, we the developers <i>can</i> make the software bug free <i>provided</i> that you treat software development like hardware development: rigid specs, adequate funding and time.<br /><br /></div><blockquote><div style="text-align: justify;">Software consultants are exploiting the naive because software projects are delaying and the cost is ballooning all the time.<br /></div></blockquote><div style="text-align: justify;"><br />More often than not, the clients don't have a clear idea of what they want at the start of a project, so any estimation based on that are at best tentative, at worst egregiously inaccurate. All the estimation that software developers can provide at that stage, are only as good as the clarity of the client requirements. So later as the project understanding increases, software developers can of course provide better estimation which will often result in an increase of the amount of work needs to be done.<br /></div><br /><div style="text-align: justify;">But really, who is to blame here? The clients who don't know what they want, or the software developers who have to provide an educated guess out of the most uncertain situation?<br /><br /></div><blockquote style="text-align: justify;">I can't pay for your research time, and I can't pay for speculative work; I don't know what modules/design I like or need, so I need you to provide me with choices, but I can't pay for the thing I don't use.<br /></blockquote><div style="text-align: justify;"><br />Creating design and writing code takes time <i>regardless</i> of whether you are using them or not. So if you are not paying for them no one can do the job for you. I can understand why business owners are reluctant to pay for something that will be discarded away eventually, but without those throwaways there is no way to discover the portion that you need and want to keep.<br /><br /></div><blockquote><div style="text-align: justify;">I don't need a website ( or the software application); it's expensive and I can see no real benefit out of it.<br /></div></blockquote><div style="text-align: justify;"><br />I don't know how to answer this one. This stumps me.<br /></div>Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com0tag:blogger.com,1999:blog-3204586232155134420.post-16107147496465808102009-10-11T12:06:00.000+08:002009-10-11T12:06:48.513+08:00Introducing CodePad-- An Online Programming Compiler<div style="text-align: justify;">I love to do my work on the cloud, and <a href="http://itscommonsensestupid.blogspot.com/2009/09/apps-i-used.html">I am shifting as much work as I can, to the cloud</a>. I've stopped using <a href="http://office.microsoft.com/">Microsoft Office</a>, in favor of <a href="http://docs.google.com/">Google Docs</a>. For my personal accounting use, I eschew big desktop package such as <a href="http://www.intuit.com/">Intuit</a>, in favor of lightweight an online alternative, <a href="http://buxfer.com/">Buxfer</a>. Instead of using FTPs to upload and manage the files onto my web host, I prefer to log into <a href="http://www.cpanel.net/">cPanel</a> and make the necessary changes. Storing and working with my data on the web applications give me the flexibility to access them from anywhere, at anytime. Having been bitten by hardware failure more than once, the idea that you would never ever lost your data because they are all stored and backup elsewhere is something I can't resist.<br /></div><br /><div style="text-align: justify;">But it seems that compilers and debugging environment don't keep up with this trend. I don't expect to be able to compile my C# code online; there is no online version of <a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx">Visual Studio</a>, either. Similarly, to write and debug <a href="http://www.php.net/">PHP</a> requires one to setup a dedicated environment with all the <a href="http://www.apache.org/">Apache</a> and <a href="http://www.mysql.com/">MySQL</a> installed and configured. That's all well until your hardware blows up on you and you are struggling to find the backup and get back your environment.<br /></div><br /><div style="text-align: justify;">It is in this light that I am thrilled to find <a href="http://codepad.org/">CodePad</a>. CodePad is an <i>online</i> interpreter or compiler. Note the <i>italic</i> word, online. Which means you can type it your code, and presto! The code just runs!<br /></div><br /><div style="text-align: justify;">CodePad, admittedly, is not suitable for serious development work. But it's fun to play with, and it's a quick ground for us to check <i>and share</i> our code, our ideas. The fact that we can get our code online and make it runs still get me excited. It might a sign that finally we are moving in the direction of "cloud programming".<br /></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">To the <a href="http://stackoverflow.com/">SOers</a>, CodePad is an invaluable tool for you to answer and verify your response quickly, especially if you are hunting on easy questions where there are hundreds of people who also know the answer. If you can type in the code from memory and verify it without firing up your debugger, you stand a better chance of getting the answers upvoted and accepted.<br /></div>Soon Huihttp://www.blogger.com/profile/12990238997406388445noreply@blogger.com0