<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-29369725</id><updated>2011-12-10T22:36:08.682-08:00</updated><category term='install'/><category term='logging'/><category term='technology'/><category term='Jack Slocum'/><category term='choose programming language'/><category term='Microsoft'/><category term='tools'/><category term='LGPL'/><category term='documentation'/><category term='best programming language'/><category term='what is XML'/><category term='secure'/><category term='yagni'/><category term='how to'/><category term='privacy'/><category term='benchmark'/><category term='Songsmith'/><category term='Ajax'/><category term='Iron'/><category term='exceptions'/><category term='EXT-GWT'/><category term='programmer'/><category term='evaluation'/><category term='exception handling'/><category term='webkit'/><category term='thoughts'/><category term='compare'/><category term='Safari'/><category term='kiss'/><category term='license'/><category term='zen'/><category term='video'/><category term='performance'/><category term='programming language'/><category term='hype'/><category term='Windows 7'/><category term='Quotes'/><category term='dry'/><category term='Slocum'/><category term='programming'/><category term='CentOS 5.5'/><category term='Opera'/><category term='humour'/><category term='Server'/><category term='XML'/><category term='OpenEXT'/><category term='Java'/><category term='SOAP'/><category term='GPL'/><category term='PHP'/><category term='Browser'/><category term='Google Chrome'/><category term='Firefox'/><category term='opinion'/><category term='Ruby'/><category term='software'/><category term='Linux'/><category term='PHP 5.2.10'/><category term='neo'/><category term='drupal'/><category term='Internet Explorer'/><category term='fun'/><category term='large project'/><category term='JavaScript'/><category term='V8'/><category term='J2EE'/><category term='extjs'/><category term='performance test'/><category term='Prototyping'/><title type='text'>GoIT-Postal - Programming Nowadays</title><subtitle type='html'>Life, universe, hell, heaven and programming in there.&lt;br&gt;
This blog is about prejudices and practices in programming.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>28</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-29369725.post-4894739423806399091</id><published>2011-02-17T03:26:00.000-08:00</published><updated>2011-02-17T04:17:37.058-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='install'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP 5.2.10'/><category scheme='http://www.blogger.com/atom/ns#' term='drupal'/><category scheme='http://www.blogger.com/atom/ns#' term='CentOS 5.5'/><title type='text'>Installing PHP 5.2.10 on CentOS 5.5 in 6 steps</title><content type='html'>Recently I ran into the problem to update PHP on a CentOS 5.5 server from version 5.1.6 to 5.2 or higher. The reason was that I wanted to test Drupal 7 on a virtual machine the first time.&lt;div&gt;As &lt;a href="http://drupal.org/requirements"&gt;a fact for Drupal&lt;/a&gt;, Drupal 7 needs PHP 5.2.5 or higher as a requirement. But a simple "php -version" revealed that CentOS only comes with version 5.1.6. Understandably, because CentOS is a server operating system an only provides stable packages in their repositories.&lt;div&gt;Anyway, a simple "yum update php" only says "nothing to do", so here is the hack to get a more recent PHP on the server:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Get root.&lt;/li&gt;&lt;li&gt;Make sure that you are only using standard PHP packages, remove the other ones (for now). You can get a list of installed php packages using the commands "&lt;span class="Apple-style-span" style="font-family: 'DejaVu Sans Mono', 'Liberation Mono', monospace; font-size: 14px; line-height: 17px; white-space: pre; "&gt;rpm -qa |grep php&lt;/span&gt;".&lt;/li&gt;&lt;li&gt;Add the deployment repositories through (editing) creating the file "&lt;span class="Apple-style-span" style="font-family: 'DejaVu Sans Mono', 'Liberation Mono', monospace; font-size: 14px; line-height: 17px; white-space: pre; "&gt;/etc/yum.repos.d/CentOS-Testing.repo&lt;/span&gt;". Insert the following lines (without spaces at the start):&lt;br /&gt;&lt;b&gt;[c5-testing]&lt;br /&gt;name=CentOS-5 Testing&lt;br /&gt;baseurl=http://dev.centos.org/centos/$releasever/testing/$basearch/&lt;br /&gt;enabled=1&lt;br /&gt;gpgcheck=1&lt;br /&gt;gpgkey=http://dev.centos.org/centos/RPM-GPG-KEY-CentOS-testing&lt;br /&gt;includepkgs=php*&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Update PHP through the command "&lt;span class="Apple-style-span" style="font-family: 'DejaVu Sans Mono', 'Liberation Mono', monospace; font-size: 14px; line-height: 17px; white-space: pre; "&gt;yum update&lt;/span&gt;".&lt;/li&gt;&lt;li&gt;Resart the Apache web server (or any webserver you use) through "&lt;span class="Apple-style-span" style="font-family: 'DejaVu Sans Mono', 'Liberation Mono', monospace; font-size: 14px; line-height: 17px; white-space: pre; "&gt;service httpd restart&lt;/span&gt;" or "&lt;span class="Apple-style-span" style="font-family: 'DejaVu Sans Mono', 'Liberation Mono', monospace; font-size: 14px; line-height: 17px; white-space: pre; "&gt;apachectl restart&lt;/span&gt;".&lt;/li&gt;&lt;li&gt;Test the version of PHP:&lt;br /&gt;&lt;b&gt;[root]# php -version&lt;br /&gt;PHP 5.2.10 (cli) (built: Nov 13 2009 11:44:05) Copyright (c) 1997-2009 The PHP Group Zend Engine v2.2.0,&lt;br /&gt;Copyright (c) 1998-2009 Zend Technologies&lt;/b&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;That pretty was it. If you had non-standard-packages, reinstall them now.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-4894739423806399091?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/4894739423806399091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=4894739423806399091' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/4894739423806399091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/4894739423806399091'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2011/02/installing-php-5210-on-centos-55.html' title='Installing PHP 5.2.10 on CentOS 5.5 in 6 steps'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-3844040742800012988</id><published>2010-05-29T05:53:00.000-07:00</published><updated>2010-05-29T06:11:50.866-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='Browser'/><category scheme='http://www.blogger.com/atom/ns#' term='performance test'/><category scheme='http://www.blogger.com/atom/ns#' term='Opera'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Chrome'/><title type='text'>Video: Opera response to Google Chrome's speed test video</title><content type='html'>Remember the &lt;a href="http://goit-postal.blogspot.com/2010/05/chrome-performance-better-than.html"&gt;Google Chrome speed / performance test video&lt;/a&gt;? Well, Opera responded with an own performance test video as a reply to Google.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As known, the Opera browser and Google's Chrome are fighting for the fastest-browser-in-the-world crown and Opera is catching up right now with a faster Javascript engine in Opera 10.50. Time do do a little performance testing:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;object style="height: 344px; width: 425px" width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/zaT7thTxyq8"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/zaT7thTxyq8" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;But though both tests do compare the respective performance using the all-known-potato-method, you cannot be exactly sure if a comparison can be done really accurately. Judge yourself.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-3844040742800012988?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=15ee4733db48922f&amp;type=video%2Fmp4' length='0'/><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/3844040742800012988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=3844040742800012988' title='28 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/3844040742800012988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/3844040742800012988'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2010/05/video-opera-response-to-google-chromes.html' title='Video: Opera response to Google Chrome&apos;s speed test video'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>28</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-2281638901876123029</id><published>2010-05-17T16:24:00.000-07:00</published><updated>2010-05-17T16:45:57.222-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='webkit'/><category scheme='http://www.blogger.com/atom/ns#' term='humour'/><category scheme='http://www.blogger.com/atom/ns#' term='Browser'/><category scheme='http://www.blogger.com/atom/ns#' term='V8'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Chrome'/><category scheme='http://www.blogger.com/atom/ns#' term='benchmark'/><title type='text'>Chrome performance better than lightning (or a potato canon)</title><content type='html'>Well, everyone already had the idea that Google's Chrome browser is one of the fastest browser out there. Be it rendering (by using the WebKit) or JavaScript (with the V8 engine), even giving every tab an own process seems to help.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But, until today, I did not know that Chrome is faster than sound or a flash (thunder and lightning). Or even... an ordinary potato gun.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Evidence needed? Watch this video, it explains how that is possible (scientifically).  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;object style="height: 344px; width: 425px"&gt;&lt;param name="movie" value="http://www.youtube.com/v/nCgQDjiotG0"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/nCgQDjiotG0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Who would have thought that a browser outranges a potato canon? Well, now we know.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-2281638901876123029?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/2281638901876123029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=2281638901876123029' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/2281638901876123029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/2281638901876123029'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2010/05/chrome-performance-better-than.html' title='Chrome performance better than lightning (or a potato canon)'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-8576076963974588755</id><published>2009-12-30T15:05:00.000-08:00</published><updated>2009-12-30T18:04:24.541-08:00</updated><title type='text'>Five reasons why Apple can/should/could create a tablet-PC (and five why not)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_INKFSJw6kKY/Szvz4C5RoFI/AAAAAAAAACA/I38gD8iFssg/s1600-h/apple-touch.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 143px;" src="http://3.bp.blogspot.com/_INKFSJw6kKY/Szvz4C5RoFI/AAAAAAAAACA/I38gD8iFssg/s320/apple-touch.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5421194720645849170" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;So there are many rumours (or should we say "reasons"?) why Apple will release a kind of tablet PC on &lt;a href="http://blogs.ft.com/techblog/2009/12/exclusive-apple-to-host-event-in-january/"&gt;Jan 26th&lt;/a&gt;. No one knows, &lt;a href="http://www.foxnews.com/slideshow/scitech/2009/12/10/apple-tablet-concept-gallery"&gt;everyone speculates&lt;/a&gt;, but let us be honest: Technically, they could. And for me to look into the glass ball: At Jan, 26th, Steve will introduce a device pretty the same like the iPod Touch with a 7" display, having wireless and a OS X. But that is just the beginning.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Marketing and the name will be important&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Most rumours go for the name. May it be &lt;/span&gt;&lt;a href="http://www.eweek.com/c/a/Mobile-and-Wireless/Apple-Tablet-Rumors-Continue-Buoyed-by-iSlate-Site-820404/"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;iSlate&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;, or &lt;/span&gt;&lt;a href="http://news.cnet.com/8301-13579_3-10422960-37.html"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;iGuide&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; (&lt;/span&gt;&lt;a href="http://www.macrumors.com/2009/12/28/another-buried-apple-trademark-iguide-as-an-alternative-name-to-islate/"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;here too&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;), no one knows (despite the fact that both seem to be aquired / protected by Apple's employe "Regina Porter" and Apple's commissioned &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:Arial, Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia, serif;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;lawyers). I, personally, go for something else. "iSlate" or "iGuide" does not sound like Apple for me. Better would be "iTouch" or "iBook Touch", something like that. But here, iThink, we will have to wait for Apple's last call.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Apart from the good kind of selection depending on names, Apple's congeniality is not ultimately found in technical reasons. It is founded in design and pretty useable products. And their placement in the market.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Other markets emerge, existing markets got complex&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Having the netbook market exploding these days and (for a newbee at the phonie-thingies) &lt;a href="http://www.reuters.com/article/idUSTRE5BS2J820091230"&gt;some drawbacks at the mobile market&lt;/a&gt; which might, on the long tail, get serious for production costs and/or customer revenues, Apple is smart enough to engage new markets. So let us have a look on why Apple should expand their market introducing a complete new device to the market.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Five reasons why Apple can/should/could create a tablet-PC (and five why not):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;1. Technically they have OS X for iPhone and therefore "Cocoa Touch" which is needed to run a successful tablet PC nowadays (fast enough multitouch applications).&lt;/div&gt;&lt;div&gt;2. Rumours say that Apple worked four years on something like a touch-PC, if they are not ready yet with their experience on Cocoa Touch, they never will be.&lt;/div&gt;&lt;div&gt;3. Rumours say that Apple is asking software deliverers to not only work for the resolution of iPhone/iPod Touch but to modify their software to work on bigger screen resolutions.&lt;/div&gt;&lt;div&gt;4. Having 100.000 "Apps" in their market place that might be easily modified would help a lot to implement a new platform.&lt;/div&gt;&lt;div&gt;5. After the success of the iPhone everyone will listen to a new device, even if it is "yet another touch PC" - marketing is on their side.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Where there is much light, there is shadow, too. Five reasons against:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;1. A tablet PC needs to cope with all functionalities of a normal PC. Can Cocoa Touch be married with OS X at a glance? Windows 7 has it built in.&lt;/div&gt;&lt;div&gt;2. You never can copy a success story in IT-world. After the success of the iPhone, the Apple touch-PC should be a burner, having much more functionality than the iPhone (else it would only fill an niche).&lt;/div&gt;&lt;div&gt;3. Apple is (at the moment) forced to get functionalities to the iPhone other mobile companies have, should they open a second front at tablet-PC's or concentrate to what they have/need to do?&lt;/div&gt;&lt;div&gt;4. Pricing will be critical. Selling an iPhone at $199 which then is partly payed by a telecommunication partner is cheaper than selling a new kind of device at Apple's own [risk] (rumours say it should be well under $1000) &lt;/div&gt;&lt;div&gt;&lt;div&gt;5. January 26th is a date the media knows (now). &lt;a href="http://www.marketwatch.com/story/is-rumored-tablet-already-priced-into-apple-2009-12-29?reflink=MW_news_stmp"&gt;Steve Jobs has to deliver (something - read the link tot he end)&lt;/a&gt;. Hopefully he is not taking his mouth too full (or didn't at the past without saying something... ).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Words from the editor (please only read if you want to):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well, I would not call it "words from the editor" here at the end of this blog. I'd call it: Rumours. I researched a lot depending the Apple-tablet-thingie going on. My opinion is that Apple will - at best - deliver a gizmo working with a 7" touch display on Jan, 26.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On the other hand I read that they will only get new gadgets 'n gizmos for the iPhone on this date. No one can tell, but one thing is clear: Apple does, let's says since mid 2007, not always move fast enough. Nowadays they have to move. Kind of fast. Others do.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So my guess for the future is: On Jan, 26th, Steve introduces iPhone 4.0 :) or something like a "iBook Touch". &lt;a href="http://www.boygeniusreport.com/2009/12/23/apple-tablet-definitely-coming-in-7-size/"&gt;Starting at 7"&lt;/a&gt;, getting to 10.1" (promised middle of 2010).&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-8576076963974588755?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/8576076963974588755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=8576076963974588755' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/8576076963974588755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/8576076963974588755'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2009/12/five-reasons-why-apple-canshouldcould.html' title='Five reasons why Apple can/should/could create a tablet-PC (and five why not)'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_INKFSJw6kKY/Szvz4C5RoFI/AAAAAAAAACA/I38gD8iFssg/s72-c/apple-touch.jpg' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-5261307353856273244</id><published>2009-10-28T10:49:00.000-07:00</published><updated>2009-10-28T13:38:31.054-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opinion'/><category scheme='http://www.blogger.com/atom/ns#' term='large project'/><category scheme='http://www.blogger.com/atom/ns#' term='Quotes'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Quotes for large software projects</title><content type='html'>Again it is time to talk about larger software projects. This time not only about the "how's" and "where's", let us take a more... humorous approach. Let us have some famous qoutes you could use to get some brains straight back to line.&lt;br /&gt;&lt;br /&gt;If someone shows off a very complicated software design to you, consider to quote the following:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;"&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;C.A.R. Hoare&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Let's say everything in a huge project is clear - theoretically. Why should implementing it be difficult? Because...&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;"&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;In theory, theory and practice are the same. In practice, they're not.&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;Yogi Berra&lt;br /&gt;&lt;div style="text-align: left;"&gt;Long-year-experience and wisdom from my friends:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;"&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;Frameworks like Ruby on Rails exist to make simple things even more simple and complex things impossible.&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;A colleague of mine&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;A deadline bites. But again, time - while developing in a large project - is somewhat relative:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;"&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time.&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;Tom Cargill&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Cutting the development time by throwing more developers into a project? Reply this:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;"&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;Nine people can't make a baby in a month.&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;Fred Brooks&lt;/div&gt;Not exactly valueable for large projects, but, alas, said by a great man:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;"&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;Whereas Europeans generally pronounce   my name the right way ('Nick-louse   Veert'), Americans invariably mangle   it into 'Nickel's Worth.' This is to   say that Europeans call me by name,   but Americans call me by value.&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;Niklaus Wirth&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Something every programmer of a large project at least said once in his life:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;"&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;It works on my machine.&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;Anonymous Programmer&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;And, one of my favourites, not exactly from a programmer (but a wise man):&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;"&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;Perfection is achieved, not when there   is nothing more to add, but when there   is nothing left to take away.&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;Antoine de Saint Exupéry&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;Look out for some more quotes at "&lt;a href="http://goit-postal.blogspot.com/2007/12/quotes-5-different-views-on-computers.html"&gt;Quotes: 5 different views on computers and programs&lt;/a&gt;".&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-5261307353856273244?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/5261307353856273244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=5261307353856273244' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/5261307353856273244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/5261307353856273244'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2009/10/quotes-for-large-software-projects.html' title='Quotes for large software projects'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-1125655308571968283</id><published>2009-09-10T16:39:00.000-07:00</published><updated>2009-09-10T18:04:04.669-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dry'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='zen'/><category scheme='http://www.blogger.com/atom/ns#' term='kiss'/><category scheme='http://www.blogger.com/atom/ns#' term='programmer'/><category scheme='http://www.blogger.com/atom/ns#' term='yagni'/><category scheme='http://www.blogger.com/atom/ns#' term='best programming language'/><category scheme='http://www.blogger.com/atom/ns#' term='neo'/><title type='text'>About a stackoverflow-comment I wrote: Best practices, summaries and Zen</title><content type='html'>Once upon a time... I answered a question on stackoverflow.com (&lt;a href="http://stackoverflow.com/questions/159176/what-do-you-consider-the-1st-principles-of-programming/159504#159504"&gt;What do you consider the 1st principle(s) of programming&lt;/a&gt;?) a little bit zen-likely. The standard answers were "kiss", "dry" and "yagni" which I not only like but try to embrace wherever possible. Nevertheless, there is much more to say about that and therefore here is my little "zen-garden" of programming tips in 4 parts:&lt;br /&gt;&lt;div class="post-text"&gt;&lt;p&gt;&lt;strong&gt;Zen, part I: Programming is only the road, not the way.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Programming is only the technique to teach a computer what it's gotta do. To be successful in creating fast, reliable software means to know your algorithms, best-practices and all the other stuff not necessarily connected to your programming (language).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Zen, part II: If you are in a hurry, stroll along. If you really are in a hurry then take a detour.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Sounds silly but do not let yourself get into compromises that (really) may trouble you afterwards. "Stroll along" when the project is in a total hurry? It works if done right.&lt;/p&gt;&lt;p&gt;For this I got a rule: In case you are at the core of a program, try to be as precise and good as possible. If you are using methods from the core that are deep in your software, try to be faster in coding. If you are coding above these two, you can even get a little bit more sloppy. This way you will prevail headaches by not spending time to trace "unexpected behaviour" of core functionalities (and all relying parts to them).&lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Remember: Design errors are the hardest to find and/or fix. Next step on the ladder are programming errors in parts everyone relies on, then the "real showing-off software parts" (like UI or web interfaces). If you need to fix a design error at the end of a project, it means to fix it through the persistence layer, the protocols, the client... ahem. Not good at all.&lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Zen, part III: Know your path, Neo.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Know your environment, tools and the stuff you rely on on a daily basis and get it sorted so that it works for you. Best if you use your programming "environment" so natural that you do not even have to think of it. If you have to get a job done do not introduce "fancy new stuff" but do your work. This stuff can be introduced in a new project, namely then when you have time to prepare and use it.&lt;/p&gt;&lt;p&gt;Which leads to the thought that you "should stay onto the stuff you ultimately know. Anytime." Right?&lt;/p&gt;&lt;p&gt;Completely wrong. Try to learn something new every day. At least try to inform youself about new thingies out there, not in detail, not remotely complete but &lt;span style="font-style: italic;"&gt;open minded&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;I am sure you accomplish this, because to learn something new you are reading this blog right at this moment. Aren't you?&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Zen, part IV: Do you think that's air you're breathing?&lt;/strong&gt;&lt;/p&gt;Never, ever, think you're the best in what you are doing, if so, you only could get worse;-). And never be satisfied with the techniques you know and therefore stop listening or learning to new ideas.&lt;br /&gt;At least try to be open minded enough to listen to new concepts, strategies or - even - programming languages and paradigms. That advice is the most necessary - and most valuable- I might give to you for your (programmers) life at all.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-1125655308571968283?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/1125655308571968283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=1125655308571968283' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/1125655308571968283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/1125655308571968283'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2009/09/about-stackoverflow-comment-i-wrote.html' title='About a stackoverflow-comment I wrote: Best practices, summaries and Zen'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-5659198061717637284</id><published>2009-07-21T12:41:00.000-07:00</published><updated>2009-07-21T18:15:28.620-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='license'/><category scheme='http://www.blogger.com/atom/ns#' term='GPL'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows 7'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Microsoft releases code to Linux. Why that?</title><content type='html'>No, the hell doesn't freeze and &lt;a href="http://blogs.zdnet.com/microsoft/?p=3403"&gt;pigs don't fly&lt;/a&gt;. But Microsoft released source code to the Linux open source community. Earnestly.&lt;div&gt;Well, old news, you might say. Microsoft did release parts of their code using (more or less real) open source licenses and started doing so years ago. They released code under the &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Public_License#Microsoft_Public_License_.28Ms-PL.29"&gt;MS Public/Reciprocal License (Ms-PL/Ms-RL)&lt;/a&gt;. They even released code for their &lt;a href="http://port25.technet.com/archive/2009/01/26/web-sandbox-source-now-available-under-apache-license-2-0.aspx"&gt;Web Sandbox Source under the Apache 2.0 license&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;So what is different?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;According to Microsofts speaksman Tom Hanrahan it is &lt;b&gt;the first time Microsoft contributes source code for inclusion in the Linux source tree&lt;/b&gt;. It's not that they never, ever before commited code to the strict GPL. The real news is that they commited it directly to Linux, the operating system that competes more than well in server technologies Microsoft wants to get and hold a grip on. And trying to be conform with Linus Torvalds, Microsoft released the code under the GPLv2 - notGPLv3.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;And why would Microsoft put source under GPL for their competitor?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Microsoft is business and the definition of "business" - excuse my sarcastic but nevertheless realistic view - is to earn money. As a corporation you have to bill something to earn something to pay something (e.g. your own bills and employees). Simple as that. So they try to bode themselves well from GPLing.&lt;/div&gt;&lt;div&gt;Looking behind the gifted 20.000 lines of code it is not that difficult to find out why they did it, at least if one looks at the purpose the source-gift should fulfill: Microsoft is releasing three device drivers for Linux which should enhance the performance of the Linux operating system &lt;a href="http://www.microsoft.com/presspass/features/2009/Jul09/07-20LinuxQA.mspx"&gt;when virtualized on Windows Server 2008 Hyper-V or Windows Server 2008 R2 Hyper-V&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;That's the news? Um, yeah, any afterthoughts?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Yes, there are some and they - obviously/hopefully - have to do with a kind of change of what Microsoft does and how they behaved lately. A new OS is comming (Windows 7) where they finally &lt;a href="http://windows7news.com/2009/07/07/did-microsoft-listen-to-beta-testers-after-vista/"&gt;listened to the users&lt;/a&gt; and &lt;a href="http://www.extremeprogramming.org/"&gt;firstly, radically and totally changed their programming paradigms&lt;/a&gt; to implement it. And &lt;a href="http://www.bing.com/"&gt;bing&lt;/a&gt; is doing well (actually only because they have a huge advertising budget, as I think, but time will tell).&lt;/div&gt;&lt;div&gt;Not that Microsoft changed from ground to bottom but it seems like a little peace of white flag (a very, very little piece in their own manor, - "corporation" - you remember?) and that it is not only about fighting (&lt;a href="http://en.wikipedia.org/wiki/Fear,_uncertainty_and_doubt"&gt;FUD&lt;/a&gt;ing) anyone totally down to the ground anymore. Not even Microsoft can live without an eco-system surrounding them. Perhaps, and for god's sake, they understood. At least a little, little bit.&lt;/div&gt;&lt;div&gt;Hope so.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;[Update]&lt;/b&gt; Read &lt;a href="http://www.virtualization.info/2009/07/microsoft-releases-hyper-v-linux.html"&gt;http://www.virtualization.info/2009/07/microsoft-releases-hyper-v-linux.html&lt;/a&gt;, it's a more technical approach but reveals another view on the topic.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-5659198061717637284?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/5659198061717637284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=5659198061717637284' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/5659198061717637284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/5659198061717637284'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2009/07/microsoft-releases-code-open-source-why.html' title='Microsoft releases code to Linux. Why that?'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-4960358519092073248</id><published>2009-02-26T06:16:00.000-08:00</published><updated>2009-02-26T08:15:53.275-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opinion'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Songsmith'/><title type='text'>Trying to kill creativeness in programming: Why a "Programsmith" would fail</title><content type='html'>Ever wanted to be a great musician but cannot read notes? No problem, using a computer program will help you getting along and famous: &lt;a href="http://research.microsoft.com/en-us/um/redmond/projects/songsmith/"&gt;Microsoft Songsmith&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Songsmith composes music for you, the only thing to do is to adjust some sliders and sing into a microphone. From that moment on music will fill your laptop, quick and easy, nice and dandy, for every occasion in every phase of your life.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Why there is no "Programsmith"...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So much for the idea the creators of Songsmith try to sell. But, as we all know, in real life it is not so easy to just create an algorithm that scans sound and spits out world-class music. The idea surely is appealing. And it is not really new: Many customers and project managers dream of an IT-service-provider/programmer/administrator that exactly solves problems in the same way: Best would be to "sing" a little requirement into the phone so that the complete and working program can be deliverd a week later. And do not technologies like RAD, XML, EJB, Webservices suggest the possibility of a Programsmith? Simply connecting the modules and you are done?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;... and why a "Programsmith" would fail&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Certainly not, projects in IT do not work that way. You have to communicate and get the requirements right, make project plans, split the workload into functional points and instruct the programmers, involve third-party-modules and interfaces. All in all it is a creative process and we all know that. But our customers (and quite a hand full of programmers) would like a "Programsmith" to exactly do that: Draw a little plan, involve some kind of magic compiler (UML, anyone?) and deploy the program.&lt;br /&gt;&lt;br /&gt;Well I had fun scanning through the results of Songsmith videos on youtube viewing classical hits interpreted by the program like &lt;a href="http://www.youtube.com/watch?v=ypycpKQxXR0&amp;amp;feature=PlayList&amp;amp;p=33C9533F899548DD&amp;amp;index=3"&gt;"Roxanne" from "The Police"&lt;/a&gt;. I think that this is the hearable pendant of a (more sophisticated) program how a kind of Programsmith would compose it. It will not work out in the end, at least not as long as the to-be-written-program is a counterpart to the complexity of a &lt;a href="http://www.youtube.com/watch?v=t5nTFKSTAxo&amp;amp;feature=PlayList&amp;amp;p=33C9533F899548DD&amp;amp;index=19"&gt;"Stock Aitken Waterman" tune simple enough to be more or less replicated by Songsmith&lt;/a&gt;. But even that one crackles and creaks a lot.&lt;br /&gt;&lt;br /&gt;I wonder if there is a similar video out there treating programming in such a way (&lt;a href="http://www.youtube.com/watch?v=3oGFogwcx-E"&gt;videos like singing to be successful selling "Glow In The Dark Towels"&lt;/a&gt;) using the sliders "XML", "Webservices", "Cloud-computing" and such. Would be funny to see the results of them. Well, let me search a bit... .&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-4960358519092073248?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/4960358519092073248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=4960358519092073248' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/4960358519092073248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/4960358519092073248'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2009/02/when-programs-try-to-kill-creativeness.html' title='Trying to kill creativeness in programming: Why a &quot;Programsmith&quot; would fail'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-3481045669238822018</id><published>2009-01-06T04:41:00.000-08:00</published><updated>2009-02-26T08:29:05.815-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opinion'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='best programming language'/><title type='text'>Are programmers open minded enough in technical opinions? Why not?</title><content type='html'>Today I checked an entry on &lt;a href="http://stackoverflow.com/"&gt;stackoverflow.com&lt;/a&gt; to see how the answers were doing and which answer the questioner selected for himself to be valid. Again I was totally disappointed because the answer selected was in my opinion far away from being the best answer, rather it seemed to be the most convenient answer for the guy who asked at first place.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Are we open minded enough?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Questions of programmers mostly divide in two parts: The technical questions (i.e. questions which provoke solutions that either work or won't) and questions which - at least - elict to give an opinion in the answers because they cannot be answered that simple (i.e. "which framework is best", "what is the fastest method to..."). The latter kind of questions troubles me here.&lt;br /&gt;&lt;br /&gt;When we ask for opinions of the community we should stay as open minded as possible judging the answers, but this, alas, is very difficult. Let me state some points why this is so.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Why aren't we open minded enough regarding our technical opinions?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So, why is it so? I gathered some reasons and their descriptions I stumbled upon in my life and wrote them down:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Projects, timelines, customers and change requests to be done "until yesterday".&lt;/span&gt; In a perfect world we would have enough time to evaluate different approaches for a programming project or problem. But in the real world you often have to just get the job done and have no time to rely on fancy stuff like other opinions. This may get a habit that is hard to be dealt with so that finally the own opinion counts (more).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Experience vs. half knowledge.&lt;/span&gt; Every programmer has a certain experience in a certain moment in his life. You certainly cannot have a (completely) valid opinion of things you didn't "experience" until now, be aware that half knowledge is a bad judge. Anyway, many people in cs trust their half knowledge more than (other) opinions from more experienced people, often even without really recognizing that they do so.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Sticking with own tools / frameworks / languages.&lt;/span&gt; Regarding their languages, tools and frameworks most programmers are very conservative and do not want to change them. That is not bad per se, things that worked out should be kept and experience gathered stays preserved, but it leads to programmers who do not try (or accept) new ways and therefore being "open minded" gets really hard.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Only the newest tools / frameworks / languages are the best.&lt;/span&gt; This seems to be the opposite of the argument above but it merely isn't. Someone who only relies on the latest techniques may not be aware that a problem can be solved better using an "old" technology. This perhaps because he never got deep enough using something (long enough) to see the advantages that are not obvious at first place. On the other hand the drawbacks of a new technology are not known at the beginning so everything looks more simple than before. That creates prejudices which constrain to be open minded.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;It worked fine in my project so it works fine for everyone else.&lt;/span&gt; Generalization. Nearly everyone fails on this and it is perfectly human to do so. But in cs all project are, more or less, different. Be it because of the (slightly) different requirements or the environments or specifications a program has to run in. Even small varieties may make the great difference and everyone should keep this in (an open) mind.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;This all is not really new and there are many slogans that reflect them like: "A fool with a tool is still a fool", "If all you have is a hammer then everything looks like a nail", "Use the right tool for the right job" or "Some tools make simple things even more simple and complex things impossible". Anyway, every time I answer a "technical opinion question" I lean back and try to evaluate my answer against the points I mentioned above. I think this improves my answers a lot.&lt;br /&gt;&lt;br /&gt;Related posts:&lt;br /&gt;&lt;a href="http://goit-postal.blogspot.com/2006/10/different-types-of-programmers.html"&gt;Different types of programmers&lt;/a&gt;&lt;br /&gt;&lt;a href="http://goit-postal.blogspot.com/2008/06/how-to-choose-best-programming-lanuage.html"&gt;How to choose the best programming language&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-3481045669238822018?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/3481045669238822018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=3481045669238822018' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/3481045669238822018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/3481045669238822018'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2009/01/are-programmers-open-minded-enough-in.html' title='Are programmers open minded enough in technical opinions? Why not?'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-249774817330242679</id><published>2008-12-20T05:09:00.000-08:00</published><updated>2008-12-20T06:03:41.274-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='webkit'/><category scheme='http://www.blogger.com/atom/ns#' term='Iron'/><category scheme='http://www.blogger.com/atom/ns#' term='Browser'/><category scheme='http://www.blogger.com/atom/ns#' term='privacy'/><category scheme='http://www.blogger.com/atom/ns#' term='V8'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Chrome'/><title type='text'>Google Chrome without data sniffing: Iron is here.</title><content type='html'>A german software company named &lt;a href="http://www.srware.net/en/"&gt;srware&lt;/a&gt; took the GPLed source code of Google's chrome and ironed it down to create a browser that does not phone home to Google any more. The latest release of Iron (&lt;span class="news_text"&gt;1.0.155.0&lt;/span&gt;) from December 14 already contains &lt;span class="news_text"&gt;WebKit version 528.5 and &lt;/span&gt;&lt;span class="news_text"&gt;JavaScript engine V8 version 0.4.4.1&lt;/span&gt; and therefore is slightly newer than the respective versions in Chrome.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Your data is private again&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The goal creating a Chromeclone was simple: Although &lt;a href="http://goit-postal.blogspot.com/2008/09/chrome-first-little-test-with-highly.html"&gt;Google Chrome delivered fantastic rendering and JavaScript speed from scratch&lt;/a&gt; and is pretty stable and compatible, criticism arose because the new browser shared it's data with Google.&lt;br /&gt;&lt;br /&gt;Every time a new URL is entered this data is sent to Google. And Google can match these with the browser because every browser gets a unique id when it is installed. Furthermore, the Google Updater is installed and runs in background every time you start your computer (check your Task-Manager for "GoogleUpdate.exe"). This and more is deactivated in Iron, according to &lt;a href="http://www.srware.net/en/software_srware_iron_chrome_vs_iron.php"&gt;this page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;BSD-licensed, USB-stick version and source available&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The browser identifies itself as "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528.7 (KHTML, like Gecko) Iron/1.0.155.0 Safari/528.7". The geeks at srware provide downloads for an Iron-Installer, an Iron-USB-version (without installation) and the source code they altered. The source is available under a BSD-license, so everyone can use it completely free even for commercial products.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Conclusion&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;, language tips and full incognito&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The rendering and JavaScript performance of Chrome attracted us from the beginning, alas the privacy drawbacks stopped us from using it. Iron does a good job here and comes, as a bonus, wit a USB-stick version and without installation but preconfigured with the german language.&lt;br /&gt;&lt;br /&gt;To change the language choose the "SRware Iron anpassen" icon (top right in the tab of the browser) and click "Optionen". Then click the third button ("Schriftart- und Spracheinstellungen ändern"), choose the tab "Sprachen" and select your language in the "Iron language" - dropdown.&lt;br /&gt;&lt;br /&gt;One more option at startup is the "&lt;span class="news_text"&gt;--incognito" parameter. Start Iron with this (i.e. like "IronPortable.exe &lt;/span&gt;&lt;span class="news_text"&gt;--incognito" to immediately switch into the anonymous mode. Have fun!&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-249774817330242679?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/249774817330242679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=249774817330242679' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/249774817330242679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/249774817330242679'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2008/12/google-chrome-without-data-sniffing.html' title='Google Chrome without data sniffing: Iron is here.'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-6450067995068389991</id><published>2008-09-02T16:19:00.001-07:00</published><updated>2008-09-02T17:37:17.396-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='webkit'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='Browser'/><category scheme='http://www.blogger.com/atom/ns#' term='V8'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Chrome'/><title type='text'>Google Chrome: A first little test with highly complex AJAX/Javascript web applications</title><content type='html'>&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;a href="http://www.google.com/chrome"&gt;Google Chrome&lt;/a&gt; - what is it's real performance for highly AJAX-based web applications?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Some five hours ago Google introduced Google Chrome and put it on their site for download. Google Chrome is a stand-alone web browser and therefore has to compete with browsers like Internet Explorer, Firefox, Opera and Safari. Here at first a &lt;a href="http://goit-postal.blogspot.com/2008/05/javascript-core-performance-in-actual.html"&gt;core Javascript test (as stated in a previous Javascript-post):&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;table border="0" cellpadding="2" cellspacing="2"&gt;&lt;tbody&gt;&lt;tr bgcolor="#f0f0f0"&gt;&lt;td align="left"&gt;&lt;b&gt;Chrome 0.2&lt;/b&gt;&lt;/td&gt;&lt;td align="left"&gt;FF 2.0.0.14&lt;/td&gt;&lt;td align="left"&gt;FF3 RC1&lt;/td&gt;&lt;td align="left"&gt;IE 7.0.5730.13&lt;/td&gt;&lt;td align="left"&gt;Opera 9.27&lt;/td&gt;&lt;td align="left"&gt;Safari 3.1.1&lt;/td&gt;&lt;/tr&gt;&lt;tr bgcolor="#f0f0f0"&gt;&lt;td align="right"&gt;&lt;b&gt;3471,8&lt;/b&gt;&lt;/td&gt;&lt;td align="right"&gt;26271,4&lt;/td&gt;&lt;td align="right"&gt;5447,0&lt;/td&gt;&lt;td align="right"&gt;40846,2&lt;/td&gt;&lt;td align="right"&gt;12358,2&lt;/td&gt;&lt;td align="right"&gt;6318,8&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;Time in milliseconds the browsers needed in this performance test&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;But Google Chromes main goal is (according to Google) an other goal than that of other browsers: Highly AJAXed Javascript "web applications" shall run faster and more safe with Google Chrome, thus enabling a new era of web based applications like Google Maps, Google Mail or others. Time to look at speed and compatibility issues with more complex applications, even though the browser is stated as a "Google beta". Again.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;YAWB or not YAWB, that is the question.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Yet Another Web Browser? Or: Why is Google in the web browser market? Because that is Googles business, the idea fits. Why not presenting the browser as a gift and earning money with the applications they run?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Internas and testing environment&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Time to do a kind of real life test using an internal application that makes heavy use of Javascript and AJAX. At the moment Google Chrome is too much of an early bird to do this excessively, but we can have a look under the hood and run a fairly complex application on it.&lt;br /&gt;&lt;br /&gt;The new features include&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A new Javascript Engine called &lt;a href="http://code.google.com/p/v8/"&gt;V8&lt;/a&gt; is in use.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Better performance through compiled Javascript, it is compiled into machine code and not necessarily always interpreted.&lt;/li&gt;&lt;li&gt;The new Javascript VM has a better garbage collection included to preserve memory.&lt;/li&gt;&lt;li&gt;Browser tabs or new browser windows run in dedicated threads.&lt;/li&gt;&lt;/ul&gt;The testing application has some thousands of lines of self-written Javascript-code and relies on Prototype and other frameworks. It (re)opens different "windows" as DOM-elements and is able to switch through them via ctrl-tab and shift-ctrl-tab. Data is drawn from the background via AJAX, the usability allows drag-and-drop of single (or multiple) elements from one window into others. The application "runs" on IE, Firefox and Safari. Pretty complex stuff for a first test.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Compatibility will be the key...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;What use is a new browser if the sites you want to visit will not work with it? Right, none. So the browser has to be as compatible as possible. I was fairly surprised and impressed as I saw the application running smooth and dandy. There was no itch regarding the Javascript-compatibility, every function I tested simply worked. The whole Javascript-code ran without the need to apply a single patch or something similar from our side. You know the moments where you hope "ah, come on, it will work out somehow. I believe, I strongly believe..." and you run it and it works out? That was one of that rare moments. Impressive.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;... and performance will be the door-opener.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So it seems to be pretty compatible, right, but the second side is, is it faster, more useable than other browsers? The rendering engine seems to be partly from the webkit.org - project, rendering was pretty fast and compatible (to say the pages looked like in other browsers). From the look and feel of the thing I would say Google Chrome is at least one of the fastest rendering browsers if not the fastest, anyway.&lt;br /&gt;&lt;br /&gt;And the Javascript-performance was astonishing (see &lt;a href="http://sunnytalkstech.blogspot.com/2008/09/google-chrome-beats-others-at.html"&gt;here&lt;/a&gt; for numbers of a normal Javascript test suite). The application, running pretty fast in Firefox 3 and Safari 3.1 got a little extra speed-kick. That way it really feels like a real application on the computer rather than rendered web results. The clear separation of tabs and windows into threads does its additional work: Because no tab has to wait until an other tab releases the processor you have the feeling that it works faster or smarter.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;So is it worth the hassle?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I think it is worth giving it a try. I do not think that I will use it yet as a browser-user, because I need my Firefox-plugins or IE-updating. But I will definitely test it with/for Javascript and AJAX-driven pages and our own developments. The gain in there is definitely worth the hassle.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-6450067995068389991?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/6450067995068389991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=6450067995068389991' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/6450067995068389991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/6450067995068389991'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2008/09/chrome-first-little-test-with-highly.html' title='Google Chrome: A first little test with highly complex AJAX/Javascript web applications'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-5398958133067364514</id><published>2008-06-15T11:58:00.000-07:00</published><updated>2009-01-06T08:10:12.589-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='evaluation'/><category scheme='http://www.blogger.com/atom/ns#' term='thoughts'/><category scheme='http://www.blogger.com/atom/ns#' term='hype'/><category scheme='http://www.blogger.com/atom/ns#' term='choose programming language'/><category scheme='http://www.blogger.com/atom/ns#' term='Prototyping'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='programming language'/><category scheme='http://www.blogger.com/atom/ns#' term='best programming language'/><title type='text'>How to choose the best programming language</title><content type='html'>Inspired by a new blog-article "&lt;a href="http://java-hobby.blogspot.com/search/label/Best%20Programming%20Language"&gt;Best programming language&lt;/a&gt;" there are some more open points to discuss on how to choose the best programming language for life, universe and everything. Let me give 5 of them.&lt;br /&gt;&lt;br /&gt;First things first: Is choosing the right language even remote possible? And if so, how can it be done? Well, to set things clear let's have a real-world-example: Which (spoken) language shall I learn to succeed at most? If it's only a matter of &lt;a href="http://www2.ignatius.edu/faculty/turner/languages.htm"&gt;understanding and talking to the most people this would be chinese&lt;/a&gt;. Do you achieve your goals with that? Most probably not.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Why wise selection is necessary&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can speak with one billion people in case you choose to learn chinese, but you could not read this blog (in case you prefered learning chinese before learning english).  And how many people in your neighbourhood do speak chinese? Is it worth learning (under respect of this argument)?&lt;br /&gt;&lt;br /&gt;Choosing a programming language too depends on many factors which you have to name and select with care. You want to show the best performance in programming (be it in programming-speed, stability, scalability ...), here is how:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;5. Complexity of setup is not counting for evaluation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So, setting up an environment to evaluate the new programming language will last one to two hours (or even more)? Be honest: Setting up a testing environment for two hours is more easy than living with a not at all appropriate programming language for the next 6 month on a eight-hour-per-day-working-base in your new project. And of course you have to think about administration workload later on (which too reflects in evaluation, of course), but there are tools, workflows etc. which, done right, may help you to get rid of this point. Test the availability of tools, too.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;4. The most hyped language may not be the best to choose&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;What is a hype (spoken in language selection)? Well, there is a new language out in the market. All people talk how easy and neat it is to work with it. Pretty cool so far. The drawback is that these languages are not widely "broadcasted" out there, mostly information is sparse on both the language and the usage/projects done with it. Of course you may use it, &lt;a href="http://unspun.amazon.com/Best-Programming-Language/list/show/1045"&gt;but be sure not to see things through rose-colored glasses&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;3. Programming for fun is one, doing a project the other thing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Think of team-working, releasing, "changing one little bit might affect many others (and how can I prevent/check this)". This will help a great lot in case the project gets bigger and you will have to hire new people.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;2. Prototyping and "getting things done (as fast as possible)" is not your daily work&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Of course, most bosses and clients want to see what you do as fast as possible. They are more eager to compare your work with their business plan than to hear "no, we are setting up servers/software/configurations - please stand by". But on the long trail, as a programmer, you only can win if your work is profound and, in best case, solves problem other peoples like your bosses and clients do not even think of now. Test your desired language(s) if they fulfill your own personal claims on that regard, then test the language if it serves well in a programmers team and client-centric manner.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;1. A fool with a tool is still a fool&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Do not blame the programming language if you run in first problems (at first sight). Search for other ways if your goal cannot be reached with your first shot. Use Google to find new ways and thoughts (a good test to show if enough people using it / documentation on how to use it is out there, too). And even if you used the language for some years and think that the new project does not fit to it, give it a try on Google/the community. There are other people who might help you to solve a brain-nut-problem, sometimes on-the fly.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Not sure what langauge to choose now?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Watch out! There are a couple of languages on the market. And there is no easy answer to this question, if someone provides you with an easy answer, be most careful! Evaluate some languages, program some more in the languages that reach the "inner circle" for you and never forget the old but true saying: Use &lt;span style="font-weight: bold;"&gt;the right tool at the right time&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Other "Thoughts on" and "how to" articles:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://goit-postal.blogspot.com/2007/08/10-thoughts-on-successful-server.html"&gt;10 thoughts on successful server programming&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://goit-postal.blogspot.com/2007/05/thoughts-on-successful-exception.html"&gt;Thoughts on successful exception handling&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://goit-postal.blogspot.com/2007/01/how-to-successful-log-in-programming.html"&gt;How to successful log in programming&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://goit-postal.blogspot.com/2006/12/thoughts-on-successful-logging.html"&gt;Thoughts on successful logging&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Related posts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://goit-postal.blogspot.com/2006/10/different-types-of-programmers.html"&gt;Different types of programmers&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-5398958133067364514?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/5398958133067364514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=5398958133067364514' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/5398958133067364514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/5398958133067364514'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2008/06/how-to-choose-best-programming-lanuage.html' title='How to choose the best programming language'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-5688490200597477349</id><published>2008-05-24T11:54:00.000-07:00</published><updated>2008-12-10T12:56:43.708-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='webkit'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet Explorer'/><category scheme='http://www.blogger.com/atom/ns#' term='Safari'/><category scheme='http://www.blogger.com/atom/ns#' term='Browser'/><category scheme='http://www.blogger.com/atom/ns#' term='performance test'/><category scheme='http://www.blogger.com/atom/ns#' term='Opera'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='benchmark'/><title type='text'>Javascript core performance in actual browsers</title><content type='html'>&lt;span style="font-size:100%;"&gt;Today more and more sites do use JavaScript excessively. Be it because of Ajax-functionality or CSS/JavaScript hacks, disabling JavaScript does not work o&lt;/span&gt;&lt;span style="font-size:100%;"&gt;n a daily based surfing any more. On the other side all major browsers got a new version released in the last two month or do have beta versions in the queue. Time to sum up some Javascript core performance tests to show which browser vendor&lt;/span&gt;&lt;span style="font-size:100%;"&gt;s/developers did their homework (right).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;webkit.org's sunspider performance test&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_INKFSJw6kKY/SDh-axTcvwI/AAAAAAAAAAs/3R56SMYZ_zc/s1600-h/overall-sunspider.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_INKFSJw6kKY/SDh-axTcvwI/AAAAAAAAAAs/3R56SMYZ_zc/s400/overall-sunspider.gif" alt="" id="BLOGGER_PHOTO_ID_5204048367803219714" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:78%;"&gt;Result of Javascript performance tests in short&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;The graph above shows the time needed by every browser for the webkit test suite (running in a loop, time in milliseconds):&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:100%;"&gt;&lt;table border="0" cellpadding="2" cellspacing="2"&gt;&lt;tbody&gt;&lt;tr bgcolor="#f0f0f0"&gt;&lt;td align="left"&gt;FF 2.0.0.14&lt;/td&gt;  &lt;td align="left"&gt;FF3 RC1&lt;/td&gt;  &lt;td align="left"&gt;IE 7.0.5730.13&lt;/td&gt;  &lt;td align="left"&gt;Opera 9.27&lt;/td&gt;  &lt;td align="left"&gt;Safari 3.1.1&lt;/td&gt;  &lt;/tr&gt; &lt;tr bgcolor="#f0f0f0"&gt;  &lt;td align="right"&gt;26271,4&lt;/td&gt;  &lt;td align="right"&gt;5447,0&lt;/td&gt;  &lt;td align="right"&gt;40846,2&lt;/td&gt;  &lt;td align="right"&gt;12358,2&lt;/td&gt;  &lt;td align="right"&gt;6318,8&lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:78%;"&gt;Time in milliseconds the browsers needed in this performance test&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;See the details of every webkit test in the graph below.&lt;br /&gt;&lt;br /&gt;As stated the graph above shows the overall results of &lt;a href="http://webkit.org/"&gt;webkit.org&lt;/a&gt;&lt;a href="http://webkit.org/"&gt;'s sunspider performance test&lt;/a&gt;. &lt;/span&gt;&lt;span style="font-size:100%;"&gt;webkit.org is an open source project which provides the source code the Safari browser (from Apple) and Adobe Air (from, well... Adobe) are based on.&lt;/span&gt;&lt;span style="font-size:100%;"&gt; It hosts an online Javascript performance test under &lt;a href="http://webkit.org/perf/sunspider-0.9/sunspider-driver.html" target="_new"&gt;http://webkit.org/perf/sunspider-0.9/sunspider-driver.html&lt;/a&gt; (caution, this link automatically starts the test).&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;Why "yet another Javascript test"?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;In this test the five browsers "Firefox 2.0.0.14", "Firefox 3 RC1", "Internet Explorer 7.0.5730.13", "Opera 9.27" and "Safari 3.1.1 (on Windows)" were tested, technically spoken pretty simple because: Firefox 3 RC1 was released some week ago along with the XP Service Pack 3 (system and/or Internet Explorer 7) updates and a valid performance comparison should be done with every major update.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_INKFSJw6kKY/SDiufBTcvyI/AAAAAAAAAA8/mOoFTJdZNcs/s1600-h/goit-postal-browser-usage.GIF"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_INKFSJw6kKY/SDiufBTcvyI/AAAAAAAAAA8/mOoFTJdZNcs/s400/goit-postal-browser-usage.GIF" alt="" id="BLOGGER_PHOTO_ID_5204101217375797026" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:78%;"&gt;Browser usage of goit-postal.blogspot.com: Remember, it's a website for technicians&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;So this test shall give an expression about the core performance o&lt;/span&gt;&lt;span style="font-size:100%;"&gt;f &lt;/span&gt;&lt;span style="font-size:100%;"&gt;Javascript &lt;/span&gt;&lt;span style="font-size:100%;"&gt;in yet available mainstream-browsers (and no, thank you, no flame wars intended). That is the reason why, for example, Opera 9.27 as last stable was tested and not the faster Opera 9.5beta (&lt;/span&gt;&lt;span style="font-size:100%;"&gt;according to &lt;a href="http://www.zdnet.de/enterprise/os/vista/tests-beratung/0,39035744,39189761-3,00.htm"&gt;this place&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;) &lt;/span&gt;&lt;span style="font-size:100%;"&gt;and IE7 despite of IE8beta, &lt;/span&gt;&lt;span style="font-size:100%;"&gt;so called &lt;a href="http://spreadsheets.google.com/pub?key=prwiA9OORogiFQboaRRVDBg"&gt;nightly builds of the browsers&lt;/a&gt; were abandoned for the same reason. Compatibility and conformity is not an issue here, either.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;That, too, is the reason the sunspider performance test was chosen for this benchmark: Sunspider mostly tempers with core JavaScript functionality, na&lt;/span&gt;&lt;span style="font-size:100%;"&gt;mely some mathematics or date calculations and string manipulations. That is why it is highly limited in its characteristics i.e. for "graphical" Ajax websites using DHTML and manipulating DOM (see "Limitations of the test" below). On the other hand this performance tests nature serves to test the base performance &lt;/span&gt;&lt;span style="font-size:100%;"&gt;of the Javascript engines &lt;/span&gt;&lt;span style="font-size:100%;"&gt;(i.e. low-level scripting speed and the speed of the interpreter / number crunching) from the mentioned browsers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The performance test in detail&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;The test was done on the following machine/circumstances:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Intel PC with Pentium D 3.4GHz Dual Core (so environmental task do not play such a huge role becaus they may run on the other core), 2GB RAM (just used 380M of them), GeForce8600GT (this too means the graphics system did not really interfere that much ;-)&lt;/li&gt;&lt;li&gt;Windows XP SP 3 (SP3 freshly installed)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Internet Explorer Version 7 (patched through SP 3)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Forefox 2.0.0.14 and (more interresting) Firefox 3 Release Candidate 1&lt;/li&gt;&lt;li&gt;Opera 9.27&lt;/li&gt;&lt;li&gt;Safari 3.1.1 (Windows edition, of course ;-)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The browser was the only running application (despite the TaskManager)&lt;/li&gt;&lt;li&gt;All unnecessary services of Windows XP (or other vendors than MS) were stopped&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The caches of the browsers where empty, the internet connection was dedicated (for the test)&lt;/li&gt;&lt;li&gt;All browsers were opened with the same resolution (1280x1024 on a 1900x1200 panel)&lt;/li&gt;&lt;li&gt;Browser plugins were not installed or, if so, disabled (if you installed Firebug on Firefox remember to disable it for testing purposes!)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;At the end of this article you will find links which help to compare the results with your own computer/environment.&lt;br /&gt;&lt;br /&gt;The webkit-tests themselves split into "3d", "access", "bitops", "controlflow", "crypto", "date", "math", "regexp" and "strings". Below is a graph showing these (without "strings" for better visualisation).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_INKFSJw6kKY/SDh_8BTcvxI/AAAAAAAAAA0/7myAuAQjPR8/s1600-h/single-sunspider.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_INKFSJw6kKY/SDh_8BTcvxI/AAAAAAAAAA0/7myAuAQjPR8/s400/single-sunspider.gif" alt="" id="BLOGGER_PHOTO_ID_5204050038545497874" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:78%;"&gt;Single performance tests on webkit.org the browsers needed to complete&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;The graph above shows the time needed by the browsers to complete the tests (in milliseconds):&lt;br /&gt;&lt;br /&gt;&lt;table border="0" cellpadding="2" cellspacing="2"&gt;  &lt;tbody&gt;&lt;tr bgcolor="#f0f0f0"&gt;  &lt;td align="left" height="17"&gt;&lt;br /&gt;&lt;/td&gt;  &lt;td align="left"&gt;FF 2.0.0.14&lt;/td&gt;  &lt;td align="left"&gt;FF3 RC1&lt;/td&gt;  &lt;td align="left"&gt;IE .0.5730.13&lt;/td&gt;  &lt;td align="left"&gt;Opera 9.27&lt;/td&gt;  &lt;td align="left"&gt;Safari 3.1.1&lt;/td&gt;  &lt;/tr&gt; &lt;tr bgcolor="#f0f0f0"&gt;  &lt;td align="left" height="17"&gt; 3d&lt;/td&gt;  &lt;td sdval="3596,6" sdnum="1031;1031;#.##0,0" align="right"&gt;3.596,6&lt;/td&gt;  &lt;td sdval="722" sdnum="1031;1031;#.##0,0" align="right"&gt;722,0&lt;/td&gt;  &lt;td sdval="1890,6" sdnum="1031;1031;#.##0,0" align="right"&gt;1.890,6&lt;/td&gt;  &lt;td sdval="1218,4" sdnum="1031;1031;#.##0,0" align="right"&gt;1.218,4&lt;/td&gt;  &lt;td sdval="753" sdnum="1031;1031;#.##0,0" align="right"&gt;753,0&lt;/td&gt;  &lt;/tr&gt; &lt;tr bgcolor="#f0f0f0"&gt;  &lt;td align="left" height="18"&gt; access&lt;/td&gt;  &lt;td sdval="2531,8" sdnum="1031;1031;#.##0,0" align="right"&gt;2.531,8&lt;/td&gt;  &lt;td sdval="827,4" sdnum="1031;1031;#.##0,0" align="right"&gt;827,4&lt;/td&gt;  &lt;td sdval="2489,6" sdnum="1031;1031;#.##0,0" align="right"&gt;2.489,6&lt;/td&gt;  &lt;td sdval="1868,2" sdnum="1031;1031;#.##0,0" align="right"&gt;1.868,2&lt;/td&gt;  &lt;td sdval="981,2" sdnum="1031;1031;#.##0,0" align="right"&gt;981,2&lt;/td&gt;  &lt;/tr&gt; &lt;tr bgcolor="#f0f0f0"&gt;  &lt;td align="left" height="18"&gt; bitops&lt;/td&gt;  &lt;td sdval="4668,2" sdnum="1031;1031;#.##0,0" align="right"&gt;4.668,2&lt;/td&gt;  &lt;td sdval="641" sdnum="1031;1031;#.##0,0" align="right"&gt;641,0&lt;/td&gt;  &lt;td sdval="2152,8" sdnum="1031;1031;#.##0,0" align="right"&gt;2.152,8&lt;/td&gt;  &lt;td sdval="1750,4" sdnum="1031;1031;#.##0,0" align="right"&gt;1.750,4&lt;/td&gt;  &lt;td sdval="762,6" sdnum="1031;1031;#.##0,0" align="right"&gt;762,6&lt;/td&gt;  &lt;/tr&gt; &lt;tr bgcolor="#f0f0f0"&gt;  &lt;td align="left" height="18"&gt; controlflow&lt;/td&gt;  &lt;td sdval="225,2" sdnum="1031;1031;#.##0,0" align="right"&gt;225,2&lt;/td&gt;  &lt;td sdval="75,8" sdnum="1031;1031;#.##0,0" align="right"&gt;75,8&lt;/td&gt;  &lt;td sdval="663" sdnum="1031;1031;#.##0,0" align="right"&gt;663,0&lt;/td&gt;  &lt;td sdval="265,6" sdnum="1031;1031;#.##0,0" align="right"&gt;265,6&lt;/td&gt;  &lt;td sdval="171,8" sdnum="1031;1031;#.##0,0" align="right"&gt;171,8&lt;/td&gt;  &lt;/tr&gt; &lt;tr bgcolor="#f0f0f0"&gt;  &lt;td align="left" height="18"&gt; crypto&lt;/td&gt;  &lt;td sdval="1505,8" sdnum="1031;1031;#.##0,0" align="right"&gt;1.505,8&lt;/td&gt;  &lt;td sdval="387,8" sdnum="1031;1031;#.##0,0" align="right"&gt;387,8&lt;/td&gt;  &lt;td sdval="1381,2" sdnum="1031;1031;#.##0,0" align="right"&gt;1.381,2&lt;/td&gt;  &lt;td sdval="593" sdnum="1031;1031;#.##0,0" align="right"&gt;593,0&lt;/td&gt;  &lt;td sdval="497,4" sdnum="1031;1031;#.##0,0" align="right"&gt;497,4&lt;/td&gt;  &lt;/tr&gt; &lt;tr bgcolor="#f0f0f0"&gt;  &lt;td align="left" height="18"&gt; date&lt;/td&gt;  &lt;td sdval="4859,4" sdnum="1031;1031;#.##0,0" align="right"&gt;4.859,4&lt;/td&gt;  &lt;td sdval="481,8" sdnum="1031;1031;#.##0,0" align="right"&gt;481,8&lt;/td&gt;  &lt;td sdval="1266" sdnum="1031;1031;#.##0,0" align="right"&gt;1.266,0&lt;/td&gt;  &lt;td sdval="619" sdnum="1031;1031;#.##0,0" align="right"&gt;619,0&lt;/td&gt;  &lt;td sdval="668,8" sdnum="1031;1031;#.##0,0" align="right"&gt;668,8&lt;/td&gt;  &lt;/tr&gt; &lt;tr bgcolor="#f0f0f0"&gt;  &lt;td align="left" height="18"&gt; math&lt;/td&gt;  &lt;td sdval="2643,8" sdnum="1031;1031;#.##0,0" align="right"&gt;2.643,8&lt;/td&gt;  &lt;td sdval="652,4" sdnum="1031;1031;#.##0,0" align="right"&gt;652,4&lt;/td&gt;  &lt;td sdval="1697" sdnum="1031;1031;#.##0,0" align="right"&gt;1.697,0&lt;/td&gt;  &lt;td sdval="1312,8" sdnum="1031;1031;#.##0,0" align="right"&gt;1.312,8&lt;/td&gt;  &lt;td sdval="775,6" sdnum="1031;1031;#.##0,0" align="right"&gt;775,6&lt;/td&gt;  &lt;/tr&gt; &lt;tr bgcolor="#f0f0f0"&gt;  &lt;td align="left" height="18"&gt; regexp&lt;/td&gt;  &lt;td sdval="1115,8" sdnum="1031;1031;#.##0,0" align="right"&gt;1.115,8&lt;/td&gt;  &lt;td sdval="327,4" sdnum="1031;1031;#.##0,0" align="right"&gt;327,4&lt;/td&gt;  &lt;td sdval="406,2" sdnum="1031;1031;#.##0,0" align="right"&gt;406,2&lt;/td&gt;  &lt;td sdval="0" sdnum="1031;1031;#.##0,0" align="right"&gt;0,0&lt;/td&gt;  &lt;td sdval="362,4" sdnum="1031;1031;#.##0,0" align="right"&gt;362,4&lt;/td&gt;  &lt;/tr&gt; &lt;tr bgcolor="#f0f0f0"&gt;  &lt;td align="left" height="18"&gt; string&lt;/td&gt;  &lt;td sdval="5124,8" sdnum="1031;1031;#.##0,0" align="right"&gt;5.124,8&lt;/td&gt;  &lt;td sdval="1331,4" sdnum="1031;1031;#.##0,0" align="right"&gt;1.331,4&lt;/td&gt;  &lt;td sdval="28899,8" sdnum="1031;1031;#.##0,0" align="right"&gt;28.899,8&lt;/td&gt;  &lt;td sdval="4730,8" sdnum="1031;1031;#.##0,0" align="right"&gt;4.730,8&lt;/td&gt;  &lt;td sdval="1346" sdnum="1031;1031;#.##0,0" align="right"&gt;1.346,0&lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:78%;"&gt;Detailed time in milliseconds the browsers needed to perform the tests&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;The "string" - test is an exception in two ways: Firstly it is not visualized above because it would spoil the graph (the bar of the IE would be too long making other results more or less unreadable) and secondly it shows that the Internet Explorer at least has problems with strings and, probably, memory management (depending on strings and the testing-code).&lt;br /&gt;&lt;br /&gt;Noteable, too, is the fact that the Opera-test on "regexp" delivers a timeline of zero milliseconds. Assumable there is a Javascript-error in Opera preventing the counter to count the time correctly.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Memory and CPU usage on webkit's test&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One word about the memory: The memory was released after every test (webkit runs the tests more than once) by every browser as expected, because the tests are loaded separately in frames. All browsers (despite FF2 who nevertheless did aparently well in this test)  do release memory of non-needed frames, nowadays.&lt;br /&gt;&lt;br /&gt;Another &lt;/span&gt;&lt;span style="font-size:100%;"&gt;word about the CPU-usage:  This is not totally empirical but I measured CPU usage from the lowest to the max utilization of usage like this:&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Safari&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Firefox3&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Opera&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Firefox 2&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Internet Explorer 7&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:100%;"&gt; I had no good tool on Windows XP to take an absolute accurate measure of the CPU usage but could survey the usage with a process messaging tool plus my ears: The computer I sat next to and tested this really sounds bad if an application needs only a little bit more performance than others. I definitely should buy another cooler for that processor if I want to keep it ;-).&lt;br /&gt;&lt;br /&gt;Nevertheless, noteably is that only the Internet Explorer utilized (and needed) more than 50% of the overall CPU performance on the system (up to 80%): Seems that it is the only system that can utilize more than one CPU (and needs it, anyway ;-). But to be honest, Firefox 2 didn't sound good, either... .&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;Limitations of the test&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;Never forget that this is no "real-life-performance-testing". The tests driven here are, to say the least, mostly academical. At least they are not realistic as long as someone wants to write a &lt;a href="http://www.physics.uq.edu.au/people/foster/postscript.html"&gt;ray-tracer in a scripting language&lt;/a&gt;. But they are intended (and pretty accurate) to give a feeling of the Javascript engines working in the tested browsers.&lt;br /&gt;&lt;br /&gt;Additionally, the test was done only regarding "stable" versions of the tested browsers in the given environment. A well-used real-life-existing test like webkit served well because my interests are real life scenarios. I am sure someone can pimp up the string-tests of webkit.org for IE or install another version of Opera (not to mention the performance of Safari running native on Mac OS X, who knows), but that is not the essence of this test, that would be something different (like a performance tuning test). This test only shows the direction.&lt;br /&gt;&lt;br /&gt;This means (of course): This test says (nearly) nothing about real-life-performance of, let's say, heavily used Ajax-features. It does in no way measure the speed how DOM/DHTML or even graphical rendering is done by the browsers. Or garbage collection of Javascript in general (perhaps in special :), and therefore, in the real browser world. This would be a complete other kind of testing (Upcoming soon! Watch out your theatre  or this site for more details!).&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Conclusion: Why this test has been done and what I learned from it&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;Of course, testing done right needs time. Preparing the machine, restarting, emptying the cache, providing in any way you can think of that the data is as valid and correct as possible. Why did I waste my time although there are so many Javascript-testing-scenarious and results out there? Because the world keeps on changing. If you only change one single component (in computer life that normally is a new browser or &lt;/span&gt;&lt;span style="font-size:100%;"&gt;[minor] &lt;/span&gt;&lt;span style="font-size:100%;"&gt;operating system version), all other components (like speed, memory etc.) may behave in an other kind.&lt;br /&gt;&lt;br /&gt;One thing I learned (and was more than eager to test) was that Firefox 3 is using a new memory management, system wide (and for Javascript). I know that the old &lt;a href="http://www.techcrunch.com/2007/11/20/firefox-3-beta-1-the-memory-use-says-it-all/"&gt;memory management&lt;/a&gt;&lt;a href="http://www.squarefree.com/2007/09/20/firefox-memory-usage-and-memory-leak-news/"&gt; was not at it's best, not to speak about Javascript memory leaks&lt;/a&gt;. Not the best base to throw in a long running RIA application. Another thing was that I heard that FF 3 competes better than Safari on the webtoolkit - test.&lt;br /&gt;&lt;br /&gt;webkit.org provides the source code for the Safari browser. I tested some very complex Ajax framework on a Safari browser and was astonished about it's speed. Some day I heard that Firefox 3 slew Safari on it's own battleground: The webkit sunspider performance test. &lt;/span&gt;&lt;span style="font-size:100%;"&gt;Time to figure that out.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Nevertheless, (as you surely guessed till now) providing a so called "RIA" Application based on Javascript with my colleagues, it was time to make detailed and own-experienced performance testings for the existing possibilities out there. The surprising parts (some seen at the charts above) are, more or less that&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;Webkit (Apple) astounded me because our (JS/Ajax-)applications ran recognizable three to four times faster using Safari on Mac, I saw this month ago (and though compatibility issues are a problem we really think to deploy this platform)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Firefox 2 was beginning to be not as slow as Firefox 1.0/1.5 (or Mozilla, but it is still sometimes too slow) and then started to get slower again (memory usage "degregaded")&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Firefox 3 came with a new memory management and the capability to also resolve memory of Javascript-objects of certain depths (an old known Firefox 2 bug), so Firefox 3 definitely was/is an option&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The crown of performance is not the Internet Explorer any more (webkit, anyone?)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Safari scared the hell out of me being that performant in ("graphical") Javascript (DHTML/DOM/Javascript-performance)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I read that Firefox 3 should be faster than Safari at webkit.org which - frankly - I could not believe (and did not test on the longtrail. But I will.)&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;What is missing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Testing the core performance of Javascript in todays browsers is okay. But it does not give real facts or benchmark results you may rely on deploying complex Javascript-based Rich Internet Applications. Even so, every application is different.&lt;br /&gt;&lt;br /&gt;The next performance test on Javascript will try to clearify DOM/DHTML - changes and the performance-behaviour respective to the used browsers and browser rendering engines. My guess at the moment is that webkit (Safari) is top-notch there, but who am I to say that in a changing world?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Appendix: Performance-Links webtolkit.org (alphabetically):&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://webkit.org/perf/sunspider-0.9/sunspider-results.html?%7B%223d-cube%22:%5B1281,1187,1125,1110,1203%5D,%223d-morph%22:%5B1781,1781,1766,1797,1719%5D,%223d-raytrace%22:%5B640,641,656,640,656%5D,%22access-binary-trees%22:%5B407,438,438,453,469%5D,%22access-fannkuch%22:%5B578,562,531,516,563%5D,%22access-nbody%22:%5B1203,1203,1188,1203,1219%5D,%22access-nsieve%22:%5B313,359,344,328,344%5D,%22bitops-3bit-bits-in-byte%22:%5B390,406,390,437,391%5D,%22bitops-bits-in-byte%22:%5B375,360,375,359,375%5D,%22bitops-bitwise-and%22:%5B3328,3250,3281,3250,3359%5D,%22bitops-nsieve-bits%22:%5B625,625,594,609,562%5D,%22controlflow-recursive%22:%5B219,219,219,219,250%5D,%22crypto-aes%22:%5B421,438,437,438,453%5D,%22crypto-md5%22:%5B515,531,562,500,500%5D,%22crypto-sha1%22:%5B547,563,547,546,531%5D,%22date-format-tofte%22:%5B1390,1375,1391,1344,1375%5D,%22date-format-xparb%22:%5B3500,3485,3468,3484,3485%5D,%22math-cordic%22:%5B1500,1516,1266,1313,1516%5D,%22math-partial-sums%22:%5B672,656,641,656,671%5D,%22math-spectral-norm%22:%5B563,562,578,531,578%5D,%22regexp-dna%22:%5B1109,1110,1125,1110,1125%5D,%22string-base64%22:%5B1422,1406,1422,1375,1391%5D,%22string-fasta%22:%5B891,875,891,891,875%5D,%22string-tagcloud%22:%5B828,765,828,797,797%5D,%22string-unpack-code%22:%5B1312,1297,1281,1297,1297%5D,%22string-validate-input%22:%5B734,734,734,734,750%5D%7D"&gt;&lt;span style="font-size:100%;"&gt;Performance of &lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://webkit.org/perf/sunspider-0.9/sunspider-results.html?%7B%223d-cube%22:%5B1281,1187,1125,1110,1203%5D,%223d-morph%22:%5B1781,1781,1766,1797,1719%5D,%223d-raytrace%22:%5B640,641,656,640,656%5D,%22access-binary-trees%22:%5B407,438,438,453,469%5D,%22access-fannkuch%22:%5B578,562,531,516,563%5D,%22access-nbody%22:%5B1203,1203,1188,1203,1219%5D,%22access-nsieve%22:%5B313,359,344,328,344%5D,%22bitops-3bit-bits-in-byte%22:%5B390,406,390,437,391%5D,%22bitops-bits-in-byte%22:%5B375,360,375,359,375%5D,%22bitops-bitwise-and%22:%5B3328,3250,3281,3250,3359%5D,%22bitops-nsieve-bits%22:%5B625,625,594,609,562%5D,%22controlflow-recursive%22:%5B219,219,219,219,250%5D,%22crypto-aes%22:%5B421,438,437,438,453%5D,%22crypto-md5%22:%5B515,531,562,500,500%5D,%22crypto-sha1%22:%5B547,563,547,546,531%5D,%22date-format-tofte%22:%5B1390,1375,1391,1344,1375%5D,%22date-format-xparb%22:%5B3500,3485,3468,3484,3485%5D,%22math-cordic%22:%5B1500,1516,1266,1313,1516%5D,%22math-partial-sums%22:%5B672,656,641,656,671%5D,%22math-spectral-norm%22:%5B563,562,578,531,578%5D,%22regexp-dna%22:%5B1109,1110,1125,1110,1125%5D,%22string-base64%22:%5B1422,1406,1422,1375,1391%5D,%22string-fasta%22:%5B891,875,891,891,875%5D,%22string-tagcloud%22:%5B828,765,828,797,797%5D,%22string-unpack-code%22:%5B1312,1297,1281,1297,1297%5D,%22string-validate-input%22:%5B734,734,734,734,750%5D%7D"&gt;Firefox 2.0.0.14&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://webkit.org/perf/sunspider-0.9/sunspider-results.html?%7B%223d-cube%22:%5B237,241,260,257,252%5D,%223d-morph%22:%5B276,218,210,336,197%5D,%223d-raytrace%22:%5B224,237,220,221,224%5D,%22access-binary-trees%22:%5B81,85,81,83,80%5D,%22access-fannkuch%22:%5B378,394,377,375,380%5D,%22access-nbody%22:%5B234,259,236,232,236%5D,%22access-nsieve%22:%5B122,120,129,122,133%5D,%22bitops-3bit-bits-in-byte%22:%5B139,146,144,146,146%5D,%22bitops-bits-in-byte%22:%5B165,171,170,171,168%5D,%22bitops-bitwise-and%22:%5B117,117,117,116,122%5D,%22bitops-nsieve-bits%22:%5B209,201,210,215,215%5D,%22controlflow-recursive%22:%5B75,76,76,76,76%5D,%22crypto-aes%22:%5B144,142,144,141,146%5D,%22crypto-md5%22:%5B121,119,119,120,120%5D,%22crypto-sha1%22:%5B124,124,124,124,127%5D,%22date-format-tofte%22:%5B254,307,268,266,285%5D,%22date-format-xparb%22:%5B194,195,211,213,216%5D,%22math-cordic%22:%5B291,312,304,312,283%5D,%22math-partial-sums%22:%5B212,202,217,198,192%5D,%22math-spectral-norm%22:%5B139,150,148,151,151%5D,%22regexp-dna%22:%5B360,329,353,288,307%5D,%22string-base64%22:%5B151,153,154,156,154%5D,%22string-fasta%22:%5B277,284,270,274,264%5D,%22string-tagcloud%22:%5B257,246,235,259,275%5D,%22string-unpack-code%22:%5B424,441,439,461,432%5D,%22string-validate-input%22:%5B201,215,203,218,214%5D%7D"&gt;&lt;span style="font-size:100%;"&gt;Performance of &lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://webkit.org/perf/sunspider-0.9/sunspider-results.html?%7B%223d-cube%22:%5B237,241,260,257,252%5D,%223d-morph%22:%5B276,218,210,336,197%5D,%223d-raytrace%22:%5B224,237,220,221,224%5D,%22access-binary-trees%22:%5B81,85,81,83,80%5D,%22access-fannkuch%22:%5B378,394,377,375,380%5D,%22access-nbody%22:%5B234,259,236,232,236%5D,%22access-nsieve%22:%5B122,120,129,122,133%5D,%22bitops-3bit-bits-in-byte%22:%5B139,146,144,146,146%5D,%22bitops-bits-in-byte%22:%5B165,171,170,171,168%5D,%22bitops-bitwise-and%22:%5B117,117,117,116,122%5D,%22bitops-nsieve-bits%22:%5B209,201,210,215,215%5D,%22controlflow-recursive%22:%5B75,76,76,76,76%5D,%22crypto-aes%22:%5B144,142,144,141,146%5D,%22crypto-md5%22:%5B121,119,119,120,120%5D,%22crypto-sha1%22:%5B124,124,124,124,127%5D,%22date-format-tofte%22:%5B254,307,268,266,285%5D,%22date-format-xparb%22:%5B194,195,211,213,216%5D,%22math-cordic%22:%5B291,312,304,312,283%5D,%22math-partial-sums%22:%5B212,202,217,198,192%5D,%22math-spectral-norm%22:%5B139,150,148,151,151%5D,%22regexp-dna%22:%5B360,329,353,288,307%5D,%22string-base64%22:%5B151,153,154,156,154%5D,%22string-fasta%22:%5B277,284,270,274,264%5D,%22string-tagcloud%22:%5B257,246,235,259,275%5D,%22string-unpack-code%22:%5B424,441,439,461,432%5D,%22string-validate-input%22:%5B201,215,203,218,214%5D%7D"&gt;Firefox 3 RC1&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://webkit.org/perf/sunspider-0.9/sunspider-results.html?%7B%223d-cube%22:%5B531,547,578,531,516%5D,%223d-morph%22:%5B640,579,593,594,656%5D,%223d-raytrace%22:%5B766,766,719,718,719%5D,%22access-binary-trees%22:%5B641,625,578,578,578%5D,%22access-fannkuch%22:%5B937,921,890,968,875%5D,%22access-nbody%22:%5B531,547,484,484,500%5D,%22access-nsieve%22:%5B453,484,453,453,468%5D,%22bitops-3bit-bits-in-byte%22:%5B547,547,516,531,515%5D,%22bitops-bits-in-byte%22:%5B562,562,516,562,515%5D,%22bitops-bitwise-and%22:%5B625,562,579,594,563%5D,%22bitops-nsieve-bits%22:%5B500,500,500,484,484%5D,%22controlflow-recursive%22:%5B657,672,657,657,672%5D,%22crypto-aes%22:%5B547,516,484,484,500%5D,%22crypto-md5%22:%5B469,422,406,421,438%5D,%22crypto-sha1%22:%5B453,422,406,453,485%5D,%22date-format-tofte%22:%5B640,610,563,594,578%5D,%22date-format-xparb%22:%5B687,672,641,704,641%5D,%22math-cordic%22:%5B671,625,656,641,625%5D,%22math-partial-sums%22:%5B454,437,437,391,407%5D,%22math-spectral-norm%22:%5B640,656,625,610,610%5D,%22regexp-dna%22:%5B422,406,406,406,391%5D,%22string-base64%22:%5B11266,11422,11250,11547,11375%5D,%22string-fasta%22:%5B750,781,766,766,719%5D,%22string-tagcloud%22:%5B4187,4187,4219,4093,4187%5D,%22string-unpack-code%22:%5B812,781,766,860,859%5D,%22string-validate-input%22:%5B11703,11953,11406,11875,11969%5D%7D"&gt;&lt;span style="font-size:100%;"&gt;Performance of &lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://webkit.org/perf/sunspider-0.9/sunspider-results.html?%7B%223d-cube%22:%5B531,547,578,531,516%5D,%223d-morph%22:%5B640,579,593,594,656%5D,%223d-raytrace%22:%5B766,766,719,718,719%5D,%22access-binary-trees%22:%5B641,625,578,578,578%5D,%22access-fannkuch%22:%5B937,921,890,968,875%5D,%22access-nbody%22:%5B531,547,484,484,500%5D,%22access-nsieve%22:%5B453,484,453,453,468%5D,%22bitops-3bit-bits-in-byte%22:%5B547,547,516,531,515%5D,%22bitops-bits-in-byte%22:%5B562,562,516,562,515%5D,%22bitops-bitwise-and%22:%5B625,562,579,594,563%5D,%22bitops-nsieve-bits%22:%5B500,500,500,484,484%5D,%22controlflow-recursive%22:%5B657,672,657,657,672%5D,%22crypto-aes%22:%5B547,516,484,484,500%5D,%22crypto-md5%22:%5B469,422,406,421,438%5D,%22crypto-sha1%22:%5B453,422,406,453,485%5D,%22date-format-tofte%22:%5B640,610,563,594,578%5D,%22date-format-xparb%22:%5B687,672,641,704,641%5D,%22math-cordic%22:%5B671,625,656,641,625%5D,%22math-partial-sums%22:%5B454,437,437,391,407%5D,%22math-spectral-norm%22:%5B640,656,625,610,610%5D,%22regexp-dna%22:%5B422,406,406,406,391%5D,%22string-base64%22:%5B11266,11422,11250,11547,11375%5D,%22string-fasta%22:%5B750,781,766,766,719%5D,%22string-tagcloud%22:%5B4187,4187,4219,4093,4187%5D,%22string-unpack-code%22:%5B812,781,766,860,859%5D,%22string-validate-input%22:%5B11703,11953,11406,11875,11969%5D%7D"&gt;Internet Explorer 7.0.5730.13&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://webkit.org/perf/sunspider-0.9/sunspider-results.html?%7B%223d-cube%22:%5B344,359,390,359,390%5D,%223d-morph%22:%5B469,453,484,469,469%5D,%223d-raytrace%22:%5B422,375,344,359,406%5D,%22access-binary-trees%22:%5B203,187,234,203,266%5D,%22access-fannkuch%22:%5B937,906,937,922,906%5D,%22access-nbody%22:%5B312,328,406,312,344%5D,%22access-nsieve%22:%5B375,390,407,391,375%5D,%22bitops-3bit-bits-in-byte%22:%5B297,282,281,297,313%5D,%22bitops-bits-in-byte%22:%5B391,344,391,359,343%5D,%22bitops-bitwise-and%22:%5B578,563,547,562,563%5D,%22bitops-nsieve-bits%22:%5B516,531,531,531,532%5D,%22controlflow-recursive%22:%5B265,266,282,250,265%5D,%22crypto-aes%22:%5B343,359,359,343,359%5D,%22crypto-sha1%22:%5B203,281,234,219,265%5D,%22date-format-xparb%22:%5B578,625,641,610,641%5D,%22math-cordic%22:%5B906,953,422,938,391%5D,%22math-partial-sums%22:%5B328,360,282,281,281%5D,%22math-spectral-norm%22:%5B265,313,250,281,313%5D,%22string-base64%22:%5B390,562,391,437,453%5D,%22string-fasta%22:%5B1125,1469,1078,1172,1187%5D,%22string-tagcloud%22:%5B735,859,828,860,859%5D,%22string-unpack-code%22:%5B1719,1906,1734,1938,1922%5D,%22string-validate-input%22:%5B390,453,375,406,406%5D%7D"&gt;&lt;span style="font-size:100%;"&gt;Performance of &lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://webkit.org/perf/sunspider-0.9/sunspider-results.html?%7B%223d-cube%22:%5B344,359,390,359,390%5D,%223d-morph%22:%5B469,453,484,469,469%5D,%223d-raytrace%22:%5B422,375,344,359,406%5D,%22access-binary-trees%22:%5B203,187,234,203,266%5D,%22access-fannkuch%22:%5B937,906,937,922,906%5D,%22access-nbody%22:%5B312,328,406,312,344%5D,%22access-nsieve%22:%5B375,390,407,391,375%5D,%22bitops-3bit-bits-in-byte%22:%5B297,282,281,297,313%5D,%22bitops-bits-in-byte%22:%5B391,344,391,359,343%5D,%22bitops-bitwise-and%22:%5B578,563,547,562,563%5D,%22bitops-nsieve-bits%22:%5B516,531,531,531,532%5D,%22controlflow-recursive%22:%5B265,266,282,250,265%5D,%22crypto-aes%22:%5B343,359,359,343,359%5D,%22crypto-sha1%22:%5B203,281,234,219,265%5D,%22date-format-xparb%22:%5B578,625,641,610,641%5D,%22math-cordic%22:%5B906,953,422,938,391%5D,%22math-partial-sums%22:%5B328,360,282,281,281%5D,%22math-spectral-norm%22:%5B265,313,250,281,313%5D,%22string-base64%22:%5B390,562,391,437,453%5D,%22string-fasta%22:%5B1125,1469,1078,1172,1187%5D,%22string-tagcloud%22:%5B735,859,828,860,859%5D,%22string-unpack-code%22:%5B1719,1906,1734,1938,1922%5D,%22string-validate-input%22:%5B390,453,375,406,406%5D%7D"&gt;Opera 9.27&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://webkit.org/perf/sunspider-0.9/sunspider-results.html?%7B%223d-cube%22:%5B250,235,234,250,219%5D,%223d-morph%22:%5B234,234,219,219,218%5D,%223d-raytrace%22:%5B297,281,281,313,281%5D,%22access-binary-trees%22:%5B125,141,125,125,125%5D,%22access-fannkuch%22:%5B469,454,469,453,438%5D,%22access-nbody%22:%5B250,234,281,266,250%5D,%22access-nsieve%22:%5B140,140,140,141,140%5D,%22bitops-3bit-bits-in-byte%22:%5B140,156,140,141,141%5D,%22bitops-bits-in-byte%22:%5B172,172,172,172,172%5D,%22bitops-bitwise-and%22:%5B250,265,250,250,250%5D,%22bitops-nsieve-bits%22:%5B204,187,203,188,188%5D,%22controlflow-recursive%22:%5B172,172,172,172,171%5D,%22crypto-aes%22:%5B172,172,172,172,172%5D,%22crypto-md5%22:%5B156,157,157,157,156%5D,%22crypto-sha1%22:%5B172,172,156,172,172%5D,%22date-format-tofte%22:%5B250,266,281,266,281%5D,%22date-format-xparb%22:%5B375,407,406,390,422%5D,%22math-cordic%22:%5B297,297,297,297,297%5D,%22math-partial-sums%22:%5B296,282,297,297,313%5D,%22math-spectral-norm%22:%5B172,188,172,188,188%5D,%22regexp-dna%22:%5B360,359,359,359,375%5D,%22string-base64%22:%5B203,218,218,219,203%5D,%22string-fasta%22:%5B312,328,313,344,328%5D,%22string-tagcloud%22:%5B234,250,250,266,234%5D,%22string-unpack-code%22:%5B234,250,250,265,234%5D,%22string-validate-input%22:%5B297,312,328,328,312%5D%7D"&gt;&lt;span style="font-size:100%;"&gt;Performance of &lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://webkit.org/perf/sunspider-0.9/sunspider-results.html?%7B%223d-cube%22:%5B250,235,234,250,219%5D,%223d-morph%22:%5B234,234,219,219,218%5D,%223d-raytrace%22:%5B297,281,281,313,281%5D,%22access-binary-trees%22:%5B125,141,125,125,125%5D,%22access-fannkuch%22:%5B469,454,469,453,438%5D,%22access-nbody%22:%5B250,234,281,266,250%5D,%22access-nsieve%22:%5B140,140,140,141,140%5D,%22bitops-3bit-bits-in-byte%22:%5B140,156,140,141,141%5D,%22bitops-bits-in-byte%22:%5B172,172,172,172,172%5D,%22bitops-bitwise-and%22:%5B250,265,250,250,250%5D,%22bitops-nsieve-bits%22:%5B204,187,203,188,188%5D,%22controlflow-recursive%22:%5B172,172,172,172,171%5D,%22crypto-aes%22:%5B172,172,172,172,172%5D,%22crypto-md5%22:%5B156,157,157,157,156%5D,%22crypto-sha1%22:%5B172,172,156,172,172%5D,%22date-format-tofte%22:%5B250,266,281,266,281%5D,%22date-format-xparb%22:%5B375,407,406,390,422%5D,%22math-cordic%22:%5B297,297,297,297,297%5D,%22math-partial-sums%22:%5B296,282,297,297,313%5D,%22math-spectral-norm%22:%5B172,188,172,188,188%5D,%22regexp-dna%22:%5B360,359,359,359,375%5D,%22string-base64%22:%5B203,218,218,219,203%5D,%22string-fasta%22:%5B312,328,313,344,328%5D,%22string-tagcloud%22:%5B234,250,250,266,234%5D,%22string-unpack-code%22:%5B234,250,250,265,234%5D,%22string-validate-input%22:%5B297,312,328,328,312%5D%7D"&gt;Safari 3.1.1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-5688490200597477349?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/5688490200597477349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=5688490200597477349' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/5688490200597477349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/5688490200597477349'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2008/05/javascript-core-performance-in-actual.html' title='Javascript core performance in actual browsers'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_INKFSJw6kKY/SDh-axTcvwI/AAAAAAAAAAs/3R56SMYZ_zc/s72-c/overall-sunspider.gif' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-8734030427600724044</id><published>2008-04-26T05:00:00.000-07:00</published><updated>2008-04-27T04:20:37.725-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenEXT'/><category scheme='http://www.blogger.com/atom/ns#' term='license'/><category scheme='http://www.blogger.com/atom/ns#' term='GPL'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='Slocum'/><category scheme='http://www.blogger.com/atom/ns#' term='extjs'/><category scheme='http://www.blogger.com/atom/ns#' term='EXT-GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='LGPL'/><category scheme='http://www.blogger.com/atom/ns#' term='Jack Slocum'/><title type='text'>extjs - when open source kills community progress</title><content type='html'>Two days ago, Jack Slocum from extjs announced a license change for the JavaScript/Ajax framework extjs (&lt;a href="http://www.extjs.com/"&gt;http://www.extjs.com&lt;/a&gt;). The previously "dual-licensed" frameworks stays &lt;a href="http://extjs.com/company/dual.php"&gt;dual-licensed - for open source and closed source software&lt;/a&gt;. This is no real news, mainly only one letter changed, the letter "L". "L" like in &lt;span style="font-size:78%;"&gt;(large)&lt;/span&gt; big. I recognized the change because I was on the page to buy 5 developer licenses. I am not sure to do so now.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;GPL vs. LGPL - the difference&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;extjs 2.1 and later is licensed under the GPL now, earlier versions (up to 2.0.2) are under the LGPL. The "lesser" or better "library" GNU general public licence is less restrictive than the original GPL. In short words, the LGPL was created to grant the user of a program/framework the right to use it without giving the complete source code back. Using any GPL source code or part of it requires you to open source all your code, the LGPL only requires you to publish the changes you did to the LGPL-code. So using extjs in a, let's say commercial application, was okay until now.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;extjs dual licensing model&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Software development is expensive, to pay your rent you have to sell something. In the open source world often training, proprietary licenses, special programming or consulting is available from the "vendors" of the software, companies like RedHat show that it is possible to earn money with GPL-software if you have a good &lt;a href="http://www.alittlemadness.com/2008/04/24/ext-discovers-step-2-of-the-slashdot-business-model"&gt;business model&lt;/a&gt;. extjs (additionally) used the approach by selling development licenses. It is forbidden to build a framework or development base from extjs unless you meet certain circumstances. Anyway, having the library under the LGPL granted you the permission to sell your own work with extjs built in. The new dual licensing model including the GPL passage now forces the developers to buy developer licenses. This is not a bad thing per se, as mentioned before, this is no problem for me. The problem is that I do not exactly know what I buy with a development license, which was no problem as long as the LGPL-fallback was effective. But now other questions are important: Can I give away extjs as often / where / when I want to do it? Are my customers bound to buy a developer license too, if they simply want to improve the JavaScript of my application or is my application then completely GPLed? Do I need to forbid this explicitely?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The consequences I: extjs and the community&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Putting extjs under the LGPL helped to build the community which is very active, as seen in the forums of extjs.  The word was spread, the framework used. And the product thrived and prospered from  large companies and/or many programmers using it. Not at least because of the license. extjs is a good framework, but what is it good for if nobody uses or extends it?&lt;br /&gt;&lt;br /&gt;Reading the forum at the moment is no fun. It reflects many of my own thoughts and worries about the future of extjs. Many people relied on the framework, built software with it, extended their own programs and are not sure what is happening at the moment or how the future will go on. &lt;a href="http://stephan.reposita.org/archives/2008/04/24/more-cluelessness-from-extjs-lead-developer-jack-on-the-gpl-issue/"&gt;This decision may kill the community&lt;/a&gt;, many users &lt;a href="http://www.gwt-ext.com/forum/viewtopic.php?f=5&amp;amp;t=1061&amp;amp;st=0&amp;amp;sk=t&amp;amp;sd=a"&gt;request a fork of extjs&lt;/a&gt; based on the last LGPL version (2.0.2).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The consequences II: extjs and the fork&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;"Forking" is a process where someone takes the open source part of a software to create a new open source project. One of the most known forks is &lt;a href="http://en.wikipedia.org/wiki/Joomla"&gt;Joomla&lt;/a&gt;, a content management system that forked from Mambo by taking the source code and advancing it from that base.&lt;br /&gt;&lt;br /&gt;extjs up to version 2.0.2 - technically - is under the LGPL. In principle it is possible to take this code base and create a new branch (or fork) of it. Anyway, the old license too tried to avoid that by prohibitting derivative work that is a framework or development toolkit. But the download of the version 2.0.2 includes a LICENSE.txt which says that you may use the LGPL if you "Are using Ext in a commercial application that is not a software development library or toolkit, you will meet LGPL requirements and you do not wish to support the project" which is, in my opinion, not hard enough to avoid forking. The fork then needs to derive from version 2.0.2 and under the LGPL, thats all.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;So it is GPL then, GPL is a good thing, why the hassle?&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;The uncertain future (any license changes again, anyone?). The imprecise actual commercial license (please, please, please, make it clear!). The community that will perhaps not forget or forgive and most certainly shrink from now on. The unknown handling/procedures, i.e. developing plug-ins for extjs (is it &lt;/span&gt;&lt;span style="font-size:100%;"&gt;then &lt;/span&gt;&lt;span style="font-size:100%;"&gt;GPL? Commercial? &lt;/span&gt;&lt;span style="font-size:100%;"&gt;May I post it, because then its derivative work and I may need a developer license? &lt;/span&gt;&lt;span style="font-size:100%;"&gt;If I submit the code, who possesses it - do I need to GPL my other code if I "use it back"?). This very last point - the uncertainty - prevents me from sharing my experiences with extjs in their forum at the moment.&lt;br /&gt;&lt;br /&gt;I develop software and live for and from it. Ergo I pay for software that I need to do my on-a-daily-base-job. We integrated extjs and spent some hundreds of hours to develop (with) it, so we wanted to buy the licenses without any real need (because we meet the LGPL/extjs license agreement). This should have been a contribution for the excellent work of Jack Slocum and his team. But I am not willing and not obliged to support uncertain business decisions, especially when they compromise my own software and business. I'll stay with extjs 2.0.2 and keep an eye open to their policies. Or other frameworks. A pitty, I thought I do not need to do that for some two years or so.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-8734030427600724044?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/8734030427600724044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=8734030427600724044' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/8734030427600724044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/8734030427600724044'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2008/04/extjs-when-open-source-kills-community.html' title='extjs - when open source kills community progress'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-1039228885816239919</id><published>2007-12-27T11:47:00.000-08:00</published><updated>2009-10-28T13:39:57.532-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opinion'/><category scheme='http://www.blogger.com/atom/ns#' term='Quotes'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Quotes: 5 different views on computers and programs</title><content type='html'>Oldies but goldies: Gathering famous quotes on computers, programs, users and programmers. Have fun!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The users view on computers and programs:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;Homer Simpson: &lt;/span&gt;&lt;span style="font-size:85%;"&gt;"The Internet? Is that thing still around?"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;Ted Nelson: &lt;/span&gt;&lt;span style="font-size:85%;"&gt;"Any fool can use a computer. Many do."&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;Jeremy S. Anderson: &lt;/span&gt;&lt;span style="font-size:85%;"&gt;"There are two major products that come out of Berkeley: LSD and UNIX. We don't believe this to be a coincidence."&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;Dennie van Tassel: &lt;/span&gt;&lt;span style="font-size:85%;"&gt;"I've finally learned what 'upward compatible' means. It means we get to keep all our old mistakes."&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The programmers view on computers and programs:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;Anonymous:&lt;/span&gt;&lt;span style="font-size:85%;"&gt; "The best thing about a boolean is even if you are wrong, you are only off by a bit."&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;Stan Kelly-Bootle: &lt;/span&gt;&lt;span style="font-size:85%;"&gt;"Should array indices start at 0 or 1?  My compromise of 0.5 was rejected without, I thought, proper consideration."&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;Robert Sewell: &lt;/span&gt;&lt;span style="font-size:85%;"&gt;"If Java had true garbage collection, most programs would delete themselves upon execution."&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;Alan J. Perlis: &lt;/span&gt;&lt;span style="font-size:85%;"&gt;"There are two ways to write error-free programs; only the third one works."&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The meta view on computers and programs:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Edsger W. Dijkstra: &lt;/span&gt;"The question of whether computers can think is like the question of whether submarines can swim."&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bjarne Stroustrup: &lt;/span&gt;"There's an old story about the person who wished his computer were as easy to use as his telephone.  That wish has come true, since I no longer know how to use my telephone."&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Dave Barry: &lt;/span&gt;"Computers are getting smarter all the time. Scientists tell us that soon they will be able to talk to us.  (And by 'they', I mean 'computers'.  I doubt scientists will ever be able to talk to us.)"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Oktal: &lt;/span&gt;"I think Microsoft named .Net so it wouldn't show up in a Unix directory listing."&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The worlds view on Computers and programms:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Seymour Cray: &lt;/span&gt;"The trouble with programmers is that you can never tell what a programmer is doing until it's too late."&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Eagleson's Law: &lt;/span&gt;"Any code of your own that you haven't looked at for six or more months might as well have been written by someone else."&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Edsger W. Dijkstra: &lt;/span&gt;"If debugging is the process of removing bugs, then programming must be the process of putting them in."&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paul Ehrlich: &lt;/span&gt;"To err is human, but to really foul things up you need a computer."&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The artists view on computers and programs:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Pablo Picasso: &lt;/span&gt;"Computers are useless. They can only give you answers."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;More quotes to read at "&lt;a href="http://goit-postal.blogspot.com/2009/10/quotes-for-large-software-projects.html"&gt;Quotes for large software projects&lt;/a&gt;".&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-1039228885816239919?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/1039228885816239919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=1039228885816239919' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/1039228885816239919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/1039228885816239919'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2007/12/quotes-5-different-views-on-computers.html' title='Quotes: 5 different views on computers and programs'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-3742629426103626329</id><published>2007-08-12T18:27:00.000-07:00</published><updated>2008-06-15T13:47:47.996-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Server'/><category scheme='http://www.blogger.com/atom/ns#' term='thoughts'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='logging'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>10 thoughts on successful server programming</title><content type='html'>&lt;span style="font-size:130%;"&gt;What defines succesful server software and how can it be programmed?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;How to program server software successfully&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Everyone uses server software nowadays, at least in the internet, but most time people are not aware of it. Therefore "successful" server software is boring. Not the technology or the creation process itself, but server software is succesful when it &lt;span style="font-style: italic;"&gt;behaves &lt;/span&gt;boring. Or, in other words, it simply works. Most times you do not know it's there and if it behaves as it should one tends not to see it.&lt;br /&gt;&lt;br /&gt;So at first, a definition of "server software" would be helpful. Server software(s) are programs that do not run on your computer directly. Results of input are computed on another peace of hardware but then the results are shown in your own program (or internet browser, this very page you are reading is nothing else than a computed result from the servers of blogspot.com).&lt;br /&gt;&lt;br /&gt;But how are programs prepared to work in the daily server world? Just a few (apparently obvious) thoughts to achieve this goal.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;10 thoughts on successful server programming&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Be aware that a server program or script is not comparable with software running on your computer at home. Server software has to run self-sufficient to a high degree.&lt;/li&gt;&lt;li&gt;&lt;a href="http://goit-postal.blogspot.com/2007/01/how-to-successful-log-in-programming.html"&gt;Think of an appropriate logging to relieve later-on forensic fault diagnostics. Better to log too much than nothing&lt;/a&gt;, users who access your server will do this in ways you never thought of while programming it. And there is a good chance that you need to narrow down what exactly happened.&lt;/li&gt;&lt;li&gt;Use all features your programming language provides to write solid software. &lt;a href="http://goit-postal.blogspot.com/2007/05/thoughts-on-successful-exception.html"&gt;If exception handling is available, use it&lt;/a&gt;. Finally-blocks to clean up your code? Definitely. And there is much more you can utilize, from assertions to the usage of complete testing systems etc.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;In any case avoid memory leaks. If you program C / C++ be very careful, but even if you use Java / .NET or scripting languages this may get an issue for long running server software (just assume that a collection of data in Java / .NET will only get longer and longer and never shorter).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;When you use external resources (i.e. databases, networks or file systems) be aware that they may fail. The least should be an explanative error message for your users. The best would be an email notification to the administrator and a retry / recover of the failing system automatically (to a second database, for example). The parts in programming I need to rely on external resources are the parts I spend the most time developing them, create fallbacks for or even use logging at most.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Try to get the configuration as precise as possible. The configuration(s) of your systems are the base your software is running on, keep it as simple as possible and as complex as necessary. To ease your way changing your configuration later on simply follow an old saying from Antoine de Saint Exupery: "&lt;span style="font-weight: bold;"&gt;Perfection is reached not when there is nothing left to add, but when there is nothing left to take away.&lt;/span&gt;"&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If possible try to set up a test system. If you do not have a spare server for that, do it on your own (development) computer. The moment you notice erratical behaviour is the moment where you do not want to mess around setting up a system to replay and find the error.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Make Backups. &lt;span style="font-weight: bold;"&gt;Nobody wants backup but everyone cries for recovery&lt;/span&gt;. Do not forget that you write server software and, in case something bad happened, you have to be up and running as fast as possible. Backups may help to recover fast, then you got time to search for the problem.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If you follow all these steps do not forget that "releasing" has other implications for server software. The good news is that you may not need to release client-software on hundreds or thounsands of computers. The bad news is that you might have to take your server down to release new program(part)s and believe it or not: Users don't like that ;-) . So releasing should be as fast and stable as possible. Best would be that it is rollback-able to an older (working) release.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Alas, there is one very unpopular thought left: Document it. Start documenting the structure (i.e. involved server machines, a top-down documentation of the different modules/parts of your software etc.) and the programming code inline itself. There are many guides and tools out there that help you get your documentation right, search and follow the ones that help you most here.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Though this all sounds pretty obvious it is astounding that you nearly never see systems that follow all this tips. Even if you want to you may not be able to follow all of them because of restrictions from the outer world (timelines, new "prio zero" features needed yesterday etc.). But often it helps just to keep them in mind in your daily work and introduce them eventually. And now, happy server-software-coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-3742629426103626329?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/3742629426103626329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=3742629426103626329' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/3742629426103626329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/3742629426103626329'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2007/08/10-thoughts-on-successful-server.html' title='10 thoughts on successful server programming'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-3005678041898554349</id><published>2007-05-28T12:47:00.000-07:00</published><updated>2008-06-15T13:45:37.230-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thoughts'/><category scheme='http://www.blogger.com/atom/ns#' term='exception handling'/><category scheme='http://www.blogger.com/atom/ns#' term='exceptions'/><title type='text'>Thoughts on successful exception handling</title><content type='html'>In the last article, &lt;a href="http://goit-postal.blogspot.com/2007/03/brief-introduction-to-exception.html"&gt;a (very) brief introduction to the benefits of exceptions&lt;/a&gt;, we saw that exception handling may produce more efficient and stable code. The example was kept simple enough to provide an operation breakdown on how exceptions basically work. This article will explain how exceptions may be used for greater benefits, how programs and program parts get more stable using exception handling and how exceptions and parts of the programming efficiently interact with error handling and each other.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Why exceptions?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As stated before, many coding efforts directly flow into error handling in general. In case a simple "&lt;span style="font-style: italic;"&gt;or die&lt;/span&gt;" expression is not enough when an error occurs ("&lt;span style="font-style: italic;"&gt;or die&lt;/span&gt;" just stops processing of the program-code at once), exception handling provides useful mechanisms to write code that may handle the erroneous behaviour or helps finding the cause of it.&lt;br /&gt;&lt;br /&gt;Following the &lt;a href="http://en.wikipedia.org/wiki/IPO_Model"&gt;IPO&lt;/a&gt; principle, errors in programs or program parts do occur because of a flaw in programming or incorrect input to the program / program part. Assuming we only take a single method call retrieving parameters, the following conditions which result in wrong output can be classified:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The parameters given to the method are not well defined (i.e. are wrong or empty / null where they must not be)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The "constellation" of the parameter values are not expected in the given way by the method (because if parameter "a" has a certain value, "b" must not be of another certain value)&lt;/li&gt;&lt;li&gt;The caller of the method simply calls it in an improper way (i.e. the environmental conditions are not correct, needed resources are not allocated yet etc.)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The method allocates external resources (i.e. open connections, file handles etc.) and does not free them (thus leading to an invalid internal state of the program, the operating system or other components like databases)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The method relies on external resources (i.e. file system, database etc.) which are not available at the moment they are needed&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The method and therefor it's programming trusts on an internal state that is not correct (i.e. corrupt data/instances needed to compute the result)&lt;/li&gt;&lt;li&gt;The method contains a programming error&lt;/li&gt;&lt;/ul&gt;Looking at the points above reveals that only the last two arguments deal with programming faults in our method, the other five describe errors that depend on the usage or environmental states the method runs in. So while exception handling can help to identify purely written code while development, it often is used to keep the code up and running correctly in productive systems.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;How exception handling is done (right).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Using exception handling is as simple as that: If you write a method and you are able to handle the behaviour without breaking the flow of your code or stressing external logic through "workarounds", you do not need exceptions at that place. The time you wonder about how you may "get this check of a variable/state into an if-then-else" - construct or you rely on methods or (external) resources which may throw exceptions of their own it's another part of the story.&lt;br /&gt;&lt;br /&gt;Before your code gets overly complicated throw an exception. You then surely can determine the place where the exception will be thrown and, because of try-catch - blocks, you always have a defined place where your exception and the execution of your code will lead to.&lt;br /&gt;&lt;br /&gt;And you cannot handle every error, better: exceptional behaviour, at the place it (immediately) occurs. If you write a method that, say, reads some file content and returns it as a string, and you do not exactly know from which routines this method will be called in the future, then you should let pass or (re)throw the input/output exception as it occurs in your method. What good is it to return an empty/null string if an error happens? Firstly, you will have to check for a null pointer reference anyway, otherwise the surrounding code will not work properly either. Most times checking for a null reference is as verbose as catching an exception. On the other hand, if you don't throw an exception, does returning an empty (not null-) string mean that an error occured or that the file was "empty"?&lt;br /&gt;&lt;br /&gt;Take your time and rethink if the method where the error happens really has all informations to react accordingly or handle that error. Else (or if you are not sure how to handle this kind of exceptional behaviour at that place) throw an exception.&lt;br /&gt;&lt;br /&gt;And never forget: If you decide to throw an exception, be as precise about the error as you can be. If your language accepts an error message to pass with the exception, make it as accurate as possible. If the language allows to specify different exceptions or even subclass exceptions, be as precise in selecting the type of the exception as possible.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Somewhere ... by and beyond exeptions?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Do not listen to people who argue that exceptions are (time-)expensive. Firstly they are right, no argument needed. But the benefit of clear, more stable and readable code leaves enough time for you to optimize your algorithms on other places more needed. Remember that exceptions represent "exceptional behaviour", they represent erronous states which only happen in special erronous cases. Ordinary spoken: If you do not throw exceptions to just simply leave a loop or code block you will be fine on the performance side of life.&lt;br /&gt;&lt;br /&gt;And there are a couple of open points and additional benefits introducing concepts like exceptions. Some of them, more or less tightly married with exceptions, are thingies like stacktraces where you can follow the whole way of the exception through the complete code (in most languages introducing exceptions), finally-blocks and (in a certain way)  assertions and closures. But handling these issues would blast this article.&lt;br /&gt;&lt;br /&gt;Alas, one controversially discussed exception technique, the so called checked exceptions of the programming language Java, should at least be mentioned here to round off.&lt;br /&gt;&lt;br /&gt;Checked exceptions are exceptions you have to catch or, via definition, throw up to the next ("calling") instance. A method, for instance, that does not want to catch the exception on it's own has to declare that the exception which then has to be catched from the caller of the method by default - if not, the compiler will not compile the code. This is a very controversial issue within the (Java-) community because the need to catch checked exceptions naturally leads to more programming overhead. But again, the compiler tells you that the programmer of the method wanted you to explicitely respect that this kind of exception(s) may occur - and you have to deal with it. Integration might be tough, but at least you know about the possible exceptions without consulting the documentation simply by compiling your code. I, personally, had my difficulties accepting this feature, but at least the advantages had beaten the "programming verbosity" pants off for me and I think you will love this feature as it follows your way in larger projects.&lt;br /&gt;&lt;br /&gt;So, go on throwing exceptions, and may the catch be with you!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-3005678041898554349?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/3005678041898554349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=3005678041898554349' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/3005678041898554349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/3005678041898554349'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2007/05/thoughts-on-successful-exception.html' title='Thoughts on successful exception handling'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-7406703636719182124</id><published>2007-03-30T09:35:00.000-07:00</published><updated>2008-06-15T13:50:55.302-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='exception handling'/><category scheme='http://www.blogger.com/atom/ns#' term='exceptions'/><title type='text'>A brief introduction to benefits of exceptions</title><content type='html'>&lt;span style="font-size:100%;"&gt;Every programmer of a programming language has to cope with errors/exceptions and error/exception handling on a "it's all in a job" - base nowadays. But astoundingly often, exception handling and it's (more or less) proper or inteded usage is highly discussed all over and over again. This brief introduction wants to show that exception handling is a powerful tool and may be a shortcut for normal error handling. By using exception handling, programs even get more robust and less error-prone.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;A tiny example without &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;exception handling&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;A program works using the &lt;a href="http://en.wikipedia.org/wiki/IPO_Model"&gt;IPO&lt;/a&gt;-principle: &lt;span style="font-weight: bold;"&gt;I&lt;/span&gt;nput-&lt;span style="font-weight: bold;"&gt;P&lt;/span&gt;rocessing-&lt;span style="font-weight: bold;"&gt;O&lt;/span&gt;utput. If the input is well defined and the processing is correct, the output is correct too. The following example is a little program that reads three  numbers (line by line) from a text file with a given name, adds them up and prints the sum as a result, "written" step by step:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;Read the name of the file as parameter of the program into variable "fileName"&lt;/li&gt;&lt;li&gt;Assing a variable "sum" with the value "0" (zero)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Open the file "fileName"&lt;/li&gt;&lt;li&gt;Repeat steps 5 and 6 for 3 times&lt;/li&gt;&lt;li&gt; - Read one line into the variable "line" as text&lt;/li&gt;&lt;li&gt; - Convert the text "line" into a number and add it to "sum"&lt;/li&gt;&lt;li&gt;Close the file "fileName" (the resource handler needs to be freed)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Print "sum" on the screen&lt;/li&gt;&lt;/ol&gt;The processing of this simple excample is correct, but there are pitfalls that might stop our program from working correctly depending on the input:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The program did not get a parameter to store it in "fileName"&lt;/li&gt;&lt;li&gt;The file "fileName" does not exist or cannot be opened&lt;/li&gt;&lt;li&gt;There is nothing in the file, or, more precisely, there are not at least three lines in the file&lt;/li&gt;&lt;li&gt;One of the three lines is/are not numerical and cannot be converted into a number&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Programming this example without exception handling means that you have to check each of these error sources step by step (check-list):&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;if no parameter is given, go to "&lt;span style="font-style: italic;"&gt;exit&lt;/span&gt;" with error "No parameter given" (1.)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;if the file "fileName" does not exist, go to "&lt;span style="font-style: italic;"&gt;exit&lt;/span&gt;" with error "File does not exist" (3.)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;if the file cannot be opened, go to "&lt;span style="font-style: italic;"&gt;exit&lt;/span&gt;" with error "File cannot be opened" (3.)&lt;/li&gt;&lt;li&gt;if the next line cannot be read, go to "&lt;span style="font-style: italic;"&gt;exit&lt;/span&gt;" with error "Cannot read number" (5.)&lt;/li&gt;&lt;li&gt;if the line is not a number, go to "&lt;span style="font-style: italic;"&gt;exit&lt;/span&gt;" with error "Cannot read number" (6.)&lt;/li&gt;&lt;li&gt;write the sum&lt;/li&gt;&lt;li&gt;"&lt;span style="font-style: italic;"&gt;exit&lt;/span&gt;": if the file is open, close it.&lt;/li&gt;&lt;/ul&gt;This example is written in a defensive kind and shows that the most part of programming often is not the program-logic itself. Moreover it is error handling and reporting, because the user wants to know why he did not get the sum.&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;Using exception handling.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;Using a language that utilizes exception handling will help a lot in this example. At first, the methods provided by the language will provide you with (more or less) reasonable built-in exception handling, i.e. the method "open file" will raise an (input/output) exception if the file cannot be opened or does not exist or even if the parameter for the file name is invalid. This way you will not have to check for the file of your own (though you could) but rather catch an appropriate exception and print an according error message. You define the range where an exception will be "inspected" through the try-catch - block (pseudo-code):&lt;/span&gt;&lt;/span&gt;&lt;pre&gt;&lt;br /&gt;try {&lt;br /&gt; openFile()&lt;br /&gt; do(3-times) {&lt;br /&gt;   try {&lt;br /&gt;     readNumberAndAddToSum // Assuming that an exception is thrown if no number is applicable&lt;br /&gt;   }&lt;br /&gt;   catch(NotANumberException) {&lt;br /&gt;     closeFile() // because it already is open&lt;br /&gt;     printNaNError&lt;br /&gt;     exit&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt; closeFile()&lt;br /&gt; printSum&lt;br /&gt;}&lt;br /&gt;catch(IOException) {&lt;br /&gt; printIOError&lt;br /&gt;}&lt;/pre&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;Wherever an input/output exception occurs (here in the method "openFile()"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;), the code will stop at this line and jump into the "catch(IOException) { ... }" - block. This is especially true in case the "&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;readNumberAndAddToSum" will throw an IOException (i.e. end of file). The handling of a type of exceptions can be centralized for the whole algorithm this way.&lt;br /&gt;&lt;br /&gt;Additionally, a NotANumberException is catched in this example too, the program then terminates. If the IO - routines and the number converting routines work correctly (i.e. throw the right exceptions), this little snippet fulfills all the "if / exit" - assumptions done earlier, without writing more lines of code.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;That's all folks?&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;As shown above, exception handling can shorten and, in a way, clarify the source code. A detailed "which-errors-happen-if" matrix &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;does not need to be as detailed as a matrix that shows all possibilities when only using "if ... then ... else if ..." - constructs &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;(the check-list above)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;. Simply try to write the program with complete error handling using the check-list and you will see the difference.&lt;br /&gt;&lt;br /&gt;Let us enhance the original purpose: The little example of reading three numbers matured and needs to be integrated in a larger program. This way the program cannot simply be stopped via "exit" if an error occurs, we have to re-write it as a method returning the sum as a number to fit into the whole program. The question is, case an error occurs, which value should be returned? Normally, errors are indicated using the "-1" - value. But the sum could be "-1" which then will be interpreted as an error.&lt;br /&gt;&lt;br /&gt;Throwing an exception or letting an exception through (by not catching it explicitely) is the answer to this problem. By changing the intention of the algorithm ("simply printing the sum" to "returning the sum as a subpart of a larger program"), the scope of the method changed from a single program to a part of a program. So the algorithm cannot come to a conclusion on how to react on errors any more, because it does not know the exact state it was called from (compute - print - terminate is not an option any more). Anyway, the calling instance of the algorithm can do this because it knows why it called the method, it may print an error message or show an error dialog, it may ignore the error or create a file for later processing etc. . So the caller of our newly created method needs to know what exactly went wrong and will get this information from the exception thrown: "Couldn't I read the file? IOException". "The input went wrong because there was no number? &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;NotANumberException".&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;So, exception handling is ...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;... an additional possibility to handle exceptional behaviour and errors in an efficient, readable and maintainable way, if used correctly. It provides you from getting headaches by declaring detailed error matrixes or by providing the possibility to even catch errors you didn't think of in first place. And remember: A segmentation fault only is an exception never catched.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-7406703636719182124?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/7406703636719182124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=7406703636719182124' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/7406703636719182124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/7406703636719182124'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2007/03/brief-introduction-to-exception.html' title='A brief introduction to benefits of exceptions'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-117072570453311912</id><published>2007-02-05T16:28:00.000-08:00</published><updated>2008-06-15T13:46:39.013-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='J2EE'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='compare'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>Why Java might lose against Ruby (or Python, or PHP ...) in web development</title><content type='html'>&lt;span style="font-size:130%;"&gt;There I said it...&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;There I said it, Java might lose its rank in web development. Sun GPL'd Java and integrates scripting languages. Ruby is going on with JRuby, Python has it's JPython pendant, nowadays &lt;a href="http://www.caucho.com/resin-3.0/quercus/index.xtp"&gt;PHP runs/compiles on Java&lt;/a&gt;. But that is not enough, Java may lose the struggle for the #1 internet language.&lt;br /&gt;&lt;br /&gt;I always thought that a language like C# will accomplish the task to overthrow the "heir to the throne", but that was a little bit naive and sounds ridiculous: Java and .NET are way too similar for that. Lisp? SML? OCaml? Haskell? No, these languages need (damn) good programmers to complete the task, and there are not enough good people out there. To shift the workload needed in IT-business kind of standardized people are needed (no offense meant!): People only thinking in mathematics, functional programming and definitions, or simply only programming recursions seem to be the wrong way to work this load. The industry needs standard tasks to be done in standard ways by standard workers. If it wouldn't be that way, no-one would program Perl/PHP/Java/C# or similiar languages/scripts any more, they would program such complex algorithms like Shell-sort in only four lines (as I did in SML more than one and a half decades ago).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The three frontier war&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Many people are complaining about Java, it is fighting a three-frontier-war. The arguments:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Java is losing against Perl or PHP because they "get things done". Perl is "quick in programming". PHP is a starters programming language, fast and simple (be honest: nearly no good known project uses PHP5 with objects and Exception-handling) and, moreover, it's good for small to medium sized projects and has (like Perl) not to deal with the (typing and casting) overhead of strong typing.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Java is losing against Ruby or Python because they "get things done faster". Ruby on Rails seems to rock for (small to medsize) projects and Python seems at first glance to be a good replacement for all.&lt;/li&gt;&lt;li&gt;Java has, because of the mature kind and popularity, to match (or: to be a target of comparisons) with functional programming languages like Lisp and Haskell, for example, which "know what the programmer wants" without explicitely explaining it by syntax.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;I do not even mention runtime behaviour, everyone knows that C (&lt;a href="http://kano.net/javabench/data"&gt;or even C++&lt;/a&gt;&lt;a href="http://kano.net/javabench/data"&gt; compared to an old JVM&lt;/a&gt;) is magnitutes faster than Java and everyone thinks that Java still is slow. So, Java is dead, isn't it?&lt;br /&gt;&lt;br /&gt;Let us, just for a minute, forget the discussions and the pro's and con's of the points mentioned above, all this was discussed endlessly all over the internet before. Let us not talk about the verbosity of Java programs compared with dynamic language A or the fact that programs can be written so much more elegant using language B, because in B there are not all those conventions which clog the programmer using Java.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Who is killing Java?&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;Though having the best intentions, Java programmers are killing Java. I know that sounds weird, but I watched that for nearly 5 years now. The fact that Java people, (better: Java software / better: Java frameworks) cannot simply "be simple" discourages. And directs programmers and projects got the train: Ruby on Rails, as an example, is the exact opposite by just being simple. Just "getting the thingies done" is what people want to see after endless fussing around with XML and EJB, hoping that it will work out anyhow. Having hundreds of pages of documentation explaining complex frameworks, who cares? Ever started a new experimental web container in Tomcat and not simply copied the web.xml without exactly knowing what's in there? It got far too complicated.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The world is watching&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Continue doing complicated stuff and you will see the people running away from Java. The problem about Java is not the language, the problem about Java is that Java does not provide a "simple start" anymore, not with all the programmers using these fancy frameworks nowadays. I'm not talking J2EE - that is too complicated, too. But that's only &lt;span style="font-style: italic;"&gt;interfacing&lt;/span&gt;, at least partly. Looking at the frameworks deriving from J2EE and even if you have an IDE like NetBeans or Eclipse installed, you cannot have a web/http-service up and running in 2 minutes. Too much configuration - which needs too much knowledge of how to be configured. And, yes, surely, you cannot simply talk to a database, that would not be 1337 enough, you need a second (third, fourth ...) layer like EJB/Hibernate etc., all XML / annotations configured. At least we can do it, who bothers if we need it? And who cares for SQL, anyway? There are so much frameworks, why bothering with the simple thingies 'round there?&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;C'mon. I heard of a project where four (practicvally immutable) database tables had to be filled with logging informations and they used the &lt;a href="http://ibatis.apache.org/"&gt;XML-ORM-Mapping iBatis&lt;/a&gt; framework for that. Be honest, ever heard of the word "overkill"? Nooooo, you are right: Better configuring it using XML, or even better, let the software write the configuration! Write your makefiles in XML (including self-injected file commands). Keep it unreadable, that's a kind of job-security, too! Why typing some 10 lines of code when we simply may let the preparser generate it by configuring all in fourty lines of XML?&lt;br /&gt;&lt;br /&gt;Never mind. Just keep on killing Java.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-117072570453311912?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/117072570453311912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=117072570453311912' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/117072570453311912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/117072570453311912'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2007/02/why-java-might-loose-against-ruby-or.html' title='Why Java might lose against Ruby (or Python, or PHP ...) in web development'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-117041177419173094</id><published>2007-02-02T02:03:00.000-08:00</published><updated>2008-06-15T13:48:34.644-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Internet Explorer'/><category scheme='http://www.blogger.com/atom/ns#' term='secure'/><category scheme='http://www.blogger.com/atom/ns#' term='Browser'/><title type='text'>Totally secure internet-browsing in 15 minutes</title><content type='html'>&lt;span style="font-size:130%;"&gt;Browsing the internet without fear&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;Nowadays, the internet is a hazardous place. There are viruses, trojans, Cookies that store and reveal your data, people phishing your money from your bank account with special worms and so forth. The problem is, you never can be sure if your computer is suffering from malware and re-routes your online-banking-request to some russia servers. Hell, I am not sure myself (and at least I am supposed to know such things).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The old solution: Rebooting your computer&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;In former times I solved the problem pretty easy: I downloaded a bootable Linux CD, i.e. the &lt;a href="http://www.knoppix.net/"&gt;Knoppix Live CD&lt;/a&gt;. All I had to do was to insert the CD, reboot the computer and, eventually, setup the network so I could browse the internet. The advantage of such Live CDs is obvious: They start a complete and fresh operating system every time, and because they do it from CD, malware can not change the programs or data and install unwanted software on the computer. But, be honest, do you want to reboot your computer (twice, you have to start your original OS again afterwards) to simply transfer some money via online banking? Because this all was to time-consuming I stopped doing it.&lt;br /&gt;&lt;br /&gt;The next step was to split responsibilities between different Browsers. "Daily surfing" with IE and "secure surfing" with Firefox. But again, this is not totally safe. I used Firefox more and more and because of that I had to at least empty the caches/cookies/passwords from time to time to regain a little bit of security and privacy. That was no fun, either. And you never know when security holes will be exploited in the future, even if it's Firefox.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The new solution: Virtually, no security holes&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;Yesterday, I hit on something in the web that sounded promising to solve these problems. It is an &lt;a href="http://www.lifehack.org/articles/technology/beginners-guide-run-linux-like-any-other-program-in-windows.html"&gt;article about setting up a virtual machine as a window&lt;/a&gt;, just like any other program you use on your computer on  a daily basis. The punchline is that you do not have to restart your computer to start an other operating system from a so called Live CD image, no you run the complete OS in a separate window on your desktop. Then you can use Firefox in there to browse the web. And it is easily done, too.&lt;br /&gt;&lt;br /&gt;All you have to do is download and install the virtual machine VMWare, get a Live CD - iso-file and setup the VM environment. A so called iso-file is nothing more or less than an image from a CD named "blahblah.iso".&lt;br /&gt;&lt;br /&gt;The steps for that (in short form, for more information please visit &lt;a href="http://www.lifehack.org/articles/technology/beginners-guide-run-linux-like-any-other-program-in-windows.html"&gt;lifehack.org&lt;/a&gt;) :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Download and install VMWare for your operating system &lt;a href="http://www.vmware.com/download/player/"&gt;from this place&lt;/a&gt;. You need administrative access to install it, though.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Download an iso-image of Linux. You can find &lt;a href="http://download.fedora.redhat.com/pub/fedora/projects/live/FC-6-i386-livecd-1.iso"&gt;Fedora Core here&lt;/a&gt; (approx. 700mb), &lt;a href="http://cudlug.cudenver.edu/ubuntu-cd/edgy/ubuntu-6.10-desktop-i386.iso"&gt;Ubuntu Linux here&lt;/a&gt; (approx. 715mb) and, the smallest of all, &lt;a href="http://www.puppylinux.org/user/downloads.php?cat_id=1&amp;amp;download_id=56"&gt;Puppy Linux here&lt;/a&gt;. Fedora and Ubuntu will be easy to get up and running and have Firefox in their package, Puppy Linux will need less resources but a little hands-on experience shown below.&lt;/li&gt;&lt;li&gt;Download the prepared VMWare configuration files from &lt;a href="http://linux.wolphination.com/data/OS.zip"&gt;here&lt;/a&gt; and unzip them into a new folder. Open the file "OS.vmx" in this folder and edit the line that starts with "ide1:0.fileName =", this option must point to your iso-file. For example, if you downloaded Ubuntu and stored it in "C:\Linux" the line should be - ide1:0.fileName = "C:\Linux\edgy-desktop-i386.iso"&lt;/li&gt;&lt;li&gt;Doubleclick on the file "OS.vmx" (to start VMWare) and wait.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/5323/3126/1600/682001/fedora-core-firefox.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/5323/3126/400/48121/fedora-core-firefox.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Fedora Core's Firefox is clickable as small icon left from the "System" - menue or in "Applications -&gt; Internet -&gt; Firefox", but this Fedora only serves resolutions up to 800 x 600&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;What happens is that VMWare starts the operating system from the iso-file as if it were an ordinary CD. That bears the advantage that malware cannot install itself on the "operating system in a window". Every time you restart VMWare will be as if you start it the first time. You now are safe to surf whatever you want, after shutting down VMWare your computer is in the same state than before.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/5323/3126/1600/221904/ubuntu-loves-big-screens.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/5323/3126/400/824665/ubuntu-loves-big-screens.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;The screen resolution of Ubuntu and Fedora Core can be changed via menue "System -&gt; Preferences -&gt; Screen Resolution", this Ubuntu serves up to 1024 x 768&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Ubuntu and Fedora Core automatically get the network connection from VMWare via DHCP. If you prefer Puppy Linux (because it's smaller, does not use that much resources and therefore starts faster) you will have to run the network wizzard, select the interface by pressing on the button "eth0" and then press the button "Auto DHCP". After this you can browser via the "Browse" - icon left on the desktop.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/5323/3126/1600/163196/puppy-love-the-network.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/5323/3126/400/113618/puppy-love-the-network.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-size:85%;"&gt;Puppy loves the network: Start the network wizzard to connect. For me Puppy only ran using the Xvesa and not Xorg window system and does not have the Gnome desktop installed.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Some words on usability and needed resources: I prefer Ubuntu over Fedora Core because it starts faster and provides you with a screen resolution up to 1024 x 768. But this merely is a matter of taste. A Pentium IV with 2GHz (AMD 2500+) and some 512 megabyte of RAM should suffice to run the virtual machine fluently on your computer. You can "suspend" the OS using a VMWare feature, this is like normal going in suspend mode and means that the "operating system window" will be stored on your hard disk. Starting it afterwards keeps your preferences and running programs. But it keeps the cookies, too.&lt;br /&gt;&lt;br /&gt;So, happy safe surfing and remember: The fact that you are not paranoid does not mean, that they do not chase after you... .&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-117041177419173094?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/117041177419173094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=117041177419173094' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/117041177419173094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/117041177419173094'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2007/02/totally-secure-internet-browsing-in-15.html' title='Totally secure internet-browsing in 15 minutes'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-116991511669129836</id><published>2007-01-27T07:47:00.000-08:00</published><updated>2008-06-15T13:52:31.978-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thoughts'/><category scheme='http://www.blogger.com/atom/ns#' term='logging'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><title type='text'>How to successful log in programming</title><content type='html'>In a previous article, "&lt;a href="http://goit-postal.blogspot.com/2006/12/thoughts-on-successful-logging.html"&gt;Thoughts on successful logging&lt;/a&gt;", I wrote about why and how logging is done and, rudimentarily, about best practices in logging. This article now shows how successful logging can be done: Where and what should be logged and how the impact of logging on the overall performance (meaning: usage of resources and time to interpret log-messages) can be optimized.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Where and what to log or: What happens if logging goes wrong.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;The simple answers to these two questions "Where?" and "What?" would be: Log everywhere, log all, then you have all the informations about your program in your log at any time. But most times, alas, there are no simple answers in life (or especially: in programming) and following these two answers will result in a couple of problems:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;ol&gt;&lt;li&gt;The log will explode with log messages, finding crucial messages will become difficult.&lt;/li&gt;&lt;li&gt;The log will get verbose because one incident raising a log condition might be logged more often than once (see below for an explanation).&lt;/li&gt;&lt;li&gt;The verbosity might be misleading. This can be the case when one incident is logged in different places in the code and therefore seems to deliver different meanings (at first sight).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Logging methods will be called more often than actually necessary and (thereby) increase the size of memory usage / log files etc. .&lt;/li&gt;&lt;li&gt;Gathering the informations more often than needed for the log message (i.e. retrieving additional informations, concating the message from them ...) and calling the log method will decrease the overall performance of the program or of parts of it.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Taking these problems serious and pondering a little about them will reveal that successful logging also demands a certain programming style, namely the kind that allows programmers to put the logging lines onto the right place. So let's first talk about the "where" to log, finding this answer will additionally help to clear how to log, seen from a programmers point of view.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;A first example: Where to log or not to log. That is not the question.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Logging is like error (exception) handling: If you do it in the wrong place, you get too much or, alternatively, too less information. So the question you have to ask yourself is: Am I in a state of "misbehaviour" (or success) at this point that justifies a log message and - even more important - do I have all informations in this place to produce a log message I can read and am sure what exactly happened? Remember: The moment you do not work on the program every day you should be able to interpret the log message in a couple of seconds, too.&lt;br /&gt;&lt;br /&gt;Let us assume we have methods &lt;span style="font-weight: bold;"&gt;openFile() &lt;/span&gt;and&lt;span style="font-weight: bold;"&gt; createFile()&lt;/span&gt; which return a file handle if the file could be opened / created or &lt;span style="font-weight: bold;"&gt;null&lt;/span&gt; if this is not possible. Then, owning a file handle we have the following methods on it: &lt;span style="font-weight: bold;"&gt;fileHandle.readContent(), fileHandle.writeContent() &lt;/span&gt;and &lt;span style="font-weight: bold;"&gt;fileHandle.deleteFile()&lt;/span&gt;. We then want to write the methods &lt;span style="font-weight: bold;"&gt;emptyFile()&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;moveFile()&lt;/span&gt;. The pseudo.code for this might look like:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;function fileHandle prepareFile(String fileName) {&lt;br /&gt;fileHandle = openFile(fileName);&lt;br /&gt;if(fileHandle == null) {&lt;br /&gt;logError("Cannot open a file.");&lt;br /&gt;fileHandle = createFile(fileName);&lt;br /&gt;if(fileHandle == null) {&lt;br /&gt; logError("Cannot open a file.");&lt;br /&gt;}&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;// Eventually do some additional action here which justifies this method&lt;br /&gt;return fileHandle;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function boolean emptyFile(String emptyFileName) {&lt;br /&gt;fileHandle = prepareFile(emptyFileName);&lt;br /&gt;if(fileHandle!=null) {&lt;br /&gt;fileHandle.writeContent("");&lt;br /&gt;fileHandle.close();&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function boolean moveFile(String source, String destination) {&lt;br /&gt;sourceFileHandle = prepareFile(source);&lt;br /&gt;destinationFileHandle = prepareFile(destination);&lt;br /&gt;if(sourceFileHandle==null || destinationFileHandle==null) {&lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;else {&lt;br /&gt;destinationFileHandle.writeContent(sourceFileHandle.readContent());&lt;br /&gt;sourceFileHandle.deleteFile();&lt;br /&gt;sourceFileHandle.close();&lt;br /&gt;destinationFileHandle.close();&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Obviously, this code will also produce misbehaviour (just look at the moveFile() - method and imagine what will happen if the source file cannot be opened). But moreover the log messages will not help you finding an error. At first, you only get the message "Cannot open file." - which file? But only changing the log line to &lt;span style="font-weight: bold;"&gt;logError("Cannot open file " + fileName + "."); &lt;/span&gt;will not do the trick either, though it is a lot better.&lt;br /&gt;&lt;br /&gt;That obviously is because you can call one of the methods (emptyFile() or moveFile() ) and always only get the same log message. You do not exactly know where the error happened. The method prepareFile() is not the right place to log the message because it has not all informations needed ("am I emptying or moving a file?") to create a significant conclusion of the error that happened. The scope of the method prepareFile() is not suffice to log enough information to be precise.&lt;br /&gt;&lt;br /&gt;Let us rewrite the methods for the sake of better logging:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;function fileHandle prepareFile(String fileName) {&lt;br /&gt;fileHandle = openFile(fileName);&lt;br /&gt;if(fileHandle == null) {&lt;br /&gt;fileHandle = createFile(fileName);&lt;br /&gt;// Do not log here - this would be verbose!&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;// Eventually do some additional action here which justifies this method&lt;br /&gt;return fileHandle;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function boolean emptyFile(String emptyFileName) {&lt;br /&gt;fileHandle = prepareFile(emptyFileName);&lt;br /&gt;if(fileHandle==null) {&lt;br /&gt;logError("emptyFile: File " + emptyFile + "could not be prepared.");&lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;else {&lt;br /&gt;fileHandle.writeContent("");&lt;br /&gt;fileHandle.close();&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function boolean moveFile(String source, String destination) {&lt;br /&gt;sourceFileHandle = prepareFile(source);&lt;br /&gt;if(sourceFileHandle==null) {&lt;br /&gt;logError("moveFile: Cannot prepare source file " + source + ".");&lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;destinationFileHandle = prepareFile(destination);&lt;br /&gt;if(destinationFileHandle==null) {&lt;br /&gt;logError("moveFile: Cannot prepare destination file " + destination + ".");&lt;br /&gt;sourceFileHandler.close();&lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;destinationFileHandle.writeContent(sourceFileHandle.readContent());&lt;br /&gt;sourceFileHandle.deleteFile();&lt;br /&gt;sourceFileHandle.close();&lt;br /&gt;destinationFileHandle.close();&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;As you can see, two things happened: Firstly, the logging will create better error messages, that kind you really know what happened. And secondly, more astonishing, the error handling improved. This, clearly, is based on the fact that logging and error-handling often go hand-in-hand (and you surely could do better code using exception handling and finally blocks). Or, asked in an other way: Why does anybody in 90 percent of all cases want to log? Yes: In case errors happened.&lt;br /&gt;&lt;br /&gt;The improvement, of course, has it's price too: We needed an additional five lines to accomplish it. But this should only show one thing: Next time you think of the whereabouts of logging, simply think of the whereabouts of error-handling.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;What to log.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;The answer of the "where to log" already gave some answers to the "what to log" question. Errors, better said exceptional behaviour of the code (or the state of the program) surely is worth to be logged. As listet in the previous article, the purpose of logging changes as the programming work changes too. From simple checks if the program code works as desired to maintainance of the program, i.e. performance logging and logging of the proper (or improper) working of complete modules. This kind of logging should be added from the beginning on too, to a certain degree. It helps you to better understand your code at develop time and maintain the program later on in one big shot. Only make sure that verbosity will not be an issue at any time.&lt;br /&gt;&lt;br /&gt;This can be achieved in quite a few ways and always depends on the functional blocks you want to monitor with logging. Let us assume you want to watch the processing time of a page created by your web application. A good idea would be to define a maximum time you allow the page to be rendered. Log only if this time-limit is exceeded, this way your log will only get flooded in case the program works too slow. In other cases, when performance is not an issue, try to get the basic conditions on how logging is useful (like "used time" while logging the performance) and follow them, this will keep your log slim and dandy.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Logging: A conclusion.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Let us conclude with a list of "best practices" for logging. These points merely are explained in the article and summarized in the following six points:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Try to formulate your logging messages that way that you can quickly recall the cause for the logging only by reading the message.&lt;/li&gt;&lt;li&gt;Treat logging like error (or success) handling: Find the right place for your logging message that has all informations you want to know. Improving the error/exceptional code handling will naturally create the places you can log easy and good. Don't log at every opportunity.&lt;/li&gt;&lt;li&gt;Often, less is more. Try to concentrate on vital log messages and avoid verbosity.&lt;/li&gt;&lt;li&gt;Sometimes, more is more. Think of the life-cycle of your program not only the time you code it, your program will go productive and certain logging messages (i.e. performance logging for memory or speed or database usage etc.) can too be very useful later on.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Use a logging (logging-API or Framework, self-written logging) that has different on-and-offswitchable log levels ("debug", "info", "error", "fatal") and is able to log into a kind of persistence layer, be it files, databases or something similar. The moment your program goes productive you will love this option for latter error analysis.&lt;/li&gt;&lt;li&gt;Use a logging (API, Framework, self-written) that interferes as little as possible with the rest of your code. It must not use too much resources or be overcomplex to use. Anyway, it should be able to be configured at run-time, i.e. switching debug-levels on or off, switching file logging on or off etc. .&lt;/li&gt;&lt;/ol&gt;So, happy logging! And might the information be with you... .&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-116991511669129836?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/116991511669129836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=116991511669129836' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/116991511669129836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/116991511669129836'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2007/01/how-to-successful-log-in-programming.html' title='How to successful log in programming'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-116568128973160086</id><published>2006-12-09T08:01:00.000-08:00</published><updated>2008-06-15T13:49:52.384-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thoughts'/><category scheme='http://www.blogger.com/atom/ns#' term='logging'/><title type='text'>Thoughts on successful logging</title><content type='html'>Dealing with logging the last days, again, I thought it would be time  to b-log about it too. So let us dive into the questions why programmers log, how programmers log and what the best and worst practices are on how to log.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Why logging?&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Nearly every program and nearly every programmer does logging. And because of that, the purpose of logging changes through the lifecycle of a program.&lt;br /&gt;&lt;br /&gt;At first, in "programming mode", logging normaly serves as status output and is used to validate the functioning of the newly written code. The simplest example for this would be a log-line in a block of code that is placed there to prove that the block is called anyway.&lt;br /&gt;Introspection is another important thing at this point: If a programmer is not sure about the variables and values of a program at a certain point, he may simply output the values, the "state" of his program, using a log.&lt;br /&gt;Logging also is useful to show off errors that do not directly occur in the programming code, such as a subsystem (like a database connection) went down etc. To know about these things is vital while programming: You never can be sure that your program works fine and dandy if the environment it works in isn't.&lt;br /&gt;&lt;br /&gt;But as the program and the programming code evolves and grows more and more to a productive system, the intention of logging changes. The goal is not to monitor the code precisely any more but rather the modules of a program and their proper functionality. The main task of logging changes to: Survey the  duration of operations, their failing or their success. This kind of log-mutation often comes smoothly and not abrupt or as a sheer matter of choice because the newly needed informations are usually already needed while programming, too.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;How logging is done.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Logging exists as long as programming itself does. It starts by an ordinary output to the console via "println" and does not even end with high-level logging engines that are retrievable via network connections or external logging-client programs.&lt;br /&gt;&lt;br /&gt;It always starts the same way. At first, just a couple of informations are merely printed to the console, after that, a little package is written that fulfills this task. Then, with rising complexity, the informations need to be categorized, otherwise crucial facts are lost in too many log-lines. By the way, logging means to trace the activity of a program over time, so the output has to be preserved in files or databases or repositories of any kind. And what about distributed systems on more than one computer, shouldn't they log to one place so that surveillance of only this log-source is possible? What started fairly simple can get pretty complex over time.&lt;br /&gt;&lt;br /&gt;To not reinvent the wheel at this stage, there are a lot of logging APIs out there in the world. But they all boil down to some base functionality:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;The methods to log are - more or less - simple to call&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Different log-levels are introduced such as "debug", "trace", "info", "warn", "error", "fatal" so that the importance of a log-line can be classified&lt;/li&gt;&lt;li&gt;Most loggings have different channels that can be switched on or of for observations&lt;/li&gt;&lt;li&gt;Often, the log output can be canalized into a file or similiar data sinks&lt;/li&gt;&lt;/ul&gt;Anyway, fulfilling these preconditions do not define a good logging mechanism or API.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Best (and worst) practices doing the logdance.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Inserting a line of code that logs something always arises the same question: Is this correct, at this place, this time? Will this spam the log later on or is it accurately set here?&lt;br /&gt;&lt;br /&gt;In first sight it is a good thing to log. If you create a system that will work for some time or reaches a certain degree of complexity it always is good to (at least vaguely) know what the system is doing right now. Or which conditions might have led to a failure of the code. Computer programs are systems that react on user or data and interact with their environment on many different variables and states. To write a program without logging is like having a black box you put input in and expect the correct output to be delivered. But then if something doesn't work proper you only have that black box to look at, without any further information why your program did not work.&lt;br /&gt;&lt;br /&gt;But, as mentioned before, logging all and everything will not work out, either. Here are some suggestions on logging successful:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Try to log a state or error just once. Log (only) at the end of an action or an error-handling block. This will reduce verbosity and makes the log much more readable.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Think about to introduce prefixes to the log messages which will give a hint where the log message is placed in the code. Example: You have a module that parses URLs, so every message might start with "ParseURL:...". This way you directly know where the logging message comes from.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Do not only think of the place in the program code where you want to log a message, but consider the environment (variables, states, etc.) to be logged, too. This way it is more easy to recollect not only the place but the circumstances from a log message itself.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Keep in mind that the intention of logging will change as the program matures (described above). Sometimes spending 10 seconds more for a log message (i.e. to additionally show variables and states in the message) will greatly pay off later on.&lt;/li&gt;&lt;/ul&gt;So much for the "where to log" and "when to log", let's determine "how to log". As mentioned before, you can use own code or prebuild logging packages. Anyway logging should be made easy for the programmer (otherwise no one will use it) and treat computer ressources with respect (otherwise it will draw the performance of the program down).&lt;br /&gt;&lt;br /&gt;Using prebuild packages is not a bad idea. Many functions that will be needed are available and can be used later on, even if at the start you are not aware that they will be useful. But be careful selecting the logger you want to use: It's use will spread through the whole program and changing it afterwards is nearly impossible. In general the development history of logging packages displays the idea what logging really should achive a little bit: From very simple modules to "all-in-one device suitable for every purpose" loggers, they nowadays return to a k.i.s.s-approach. Doing the log dance? Sure! But keep it simple, fast and easy-to-use, otherwise it will be counterproductive  and no one will use it.&lt;br /&gt;&lt;br /&gt;This article is continued at "&lt;a href="http://goit-postal.blogspot.com/2007/01/how-to-successful-log-in-programming.html"&gt;How to successful log in programming&lt;/a&gt;"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-116568128973160086?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/116568128973160086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=116568128973160086' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/116568128973160086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/116568128973160086'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2006/12/thoughts-on-successful-logging.html' title='Thoughts on successful logging'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-116074611136250654</id><published>2006-10-13T06:04:00.000-07:00</published><updated>2008-06-15T13:50:04.566-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programmer'/><title type='text'>Different types of programmers</title><content type='html'>Being a while in "the IT business" I saw nearly every kind of programmer you can imagine. Well, time to sum up! And pondering a little bit about that whole thing, there are kind of four types I clearly recall: The Starter, The Coder, The Programmer and The Generalist. Oddly enough, these types are not only bind to their educational background or experience, I saw developers with an academic degree and some years of experience who still were Coders or even Starters. And i saw Generalists who were career changers with just some real experience.&lt;br /&gt;&lt;br /&gt;So, lets start to sum up.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Starter&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Starter, as his name suggests, is more or less starting to develop programs. At the beginning often he has a kind of success hacking some code and producing quick results. If a solution works, it is a good solution for him, regardless if that solution is working fine or just la-la. This also means that he is not really interested in code-reuse, maintainability or performance at first sight. He knows that there is more 'round there in the world of programming and he knows that he is not quite there yet.&lt;br /&gt;&lt;br /&gt;Typical programming languages: PHP, VBA, Access or similar systems.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Coder&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In contrast to The Starter,  the coder diggs deeper into the concepts of programming. He is a kind of matured Coder, knows what a pointer is and (merely) understands recursion or some concepts of functional programming. Often he speaks more than one programming language but he certainly is addicted to "his favourite one" which he then defends at all means. The coder writes programs which, more or less, do what they are intended to do and therefore tends to think he is a good programmer (which naturally leads to problems because often he simply isn't).&lt;br /&gt;&lt;br /&gt;Typical programming languages: Scripting languages, C/C++, Java or C#&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Programmer&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Being an IT-specialist who understands not only the concept of one part of a program, the Programmer also understands the environment his code runs in. He not only knows that changing a part of a system does not only affect this single part, but a whole lot more like refering code, other parts of the system or complete environments. Actually, he seems to "see" the dependencies a change may affect on the overall system before he starts coding.&lt;br /&gt;Furthermore, he is looking for more elegant and sophisticated solutions and thinks a lot about reusable, performant ways to solve the problems he is faced with. Typically, a programmer is a "lazy code writer", he re-thinks the problems and tries to put them into as less lines of code as possible. This leads to problem,s because he then often develops complex solutions for simple problems.&lt;br /&gt;&lt;br /&gt;Typical programming languages: Object oriented or functional programming languages, sometimes meta-languages (like XML, UML etc.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Generalist&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;He not only sees the problem to be solved, rather he nearly has a solution to it at an instance taking dependencies in account others did not even think of. At least he was a good programmer and knows what he is talking about. Normally he speaks more than one programming language fluently and he understands the concepts behind them. Often he is used as an architect, but he likes to code some snippets on his own, too. The systems he is working on are an open book for him.&lt;br /&gt;&lt;br /&gt;Typical programming languages: You name it... .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Of course there are more Starters than Coders, more Coders than Programmers and only a view good Generalists available in this world. But for medium sized projects my advice would be to stick with one Generalist and one or two programmers at least. This will be extremely helpful creating a product that is well-designed and maintainable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-116074611136250654?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/116074611136250654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=116074611136250654' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/116074611136250654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/116074611136250654'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2006/10/different-types-of-programmers.html' title='Different types of programmers'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-115289457812823584</id><published>2006-07-14T09:26:00.000-07:00</published><updated>2008-06-15T13:50:24.515-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><title type='text'>What technology do you need?</title><content type='html'>In times where IT-projects are cancelled or are never really doing what they meant to do, one question arises more often than others: What kind of technology do you really need to fullfil your tasks? In principle, this is a very simple question. In practise, this is one of the tough ones.&lt;br /&gt;&lt;br /&gt;Well, as stated above, in principle the question is pretty simple to answer: "It is the technology that solves your problems.". If so, why does not everybody simply use the technology suited to the problem? There are a number of reasons, let me try to state some of them:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;"We always used X and it was apropriate till now."&lt;/li&gt;&lt;li&gt;"You can solve every problem using X."&lt;/li&gt;&lt;li&gt;"X is better than Y, because of ..."&lt;/li&gt;&lt;li&gt;"We (only) have knowledge of X and cannot simply switch to Y."&lt;/li&gt;&lt;li&gt;"Our (co)workers know X and not Y."&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;Some of the above listed statements are more true (or wrong) than others. Let's have a look at them.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;We always used X and it was apropriate till now.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Having a new project or problem to solve, this sentence cannot be wronger than any other, as long as the new problem is not of similiar kind like the older ones. The fact that problems were solved in the past does not really take in account that new kinds of problems may arise that can be programmed easier using another programming language or other tools. It only depends on the problem.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;You can solve every problem using X.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This sentence mostly bases on the fact that programmers are much more conservative selecting their tools and programming languages than often expected. In theory, every problem can be solved unsing any computer language. But nobody nowadays would write a website using machine code or a very complex workflow system that connects to other systems around a business only using scripting languages.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;X is better than Y, because of ...&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Well thats a knocker. I cannot remember how often I heared that argument before and I cannot count the numbers it still was wrong then. Do listen carefully to this argument, then compare it to the needs your new project has to fulfill. You will surely find an argument against it in an instance.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;We (only) have knowledge of X and cannot simply switch to Y.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This argument often is true. It often does not make sense to switch to a complete new programming paradigm if no one ever worked with it. Nevertheless, working in business programming you should always be aware of technology changes and perhaps you have a chance to spit in some new paradigms on small/lesser extensive problems and projects. This will invalidate the argument a little bit in the future and broaden the view.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Our (co)workers know X and not Y.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;True too, but a little bit like the argument before. If you never give Y a chance, you will never collect knowledge in that region. And we talked about that the technique used should at least match the problem.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p style="font-weight: bold;"&gt;So what to do?&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Taking the arguments from above here is a brief (of course incomplete) list what everyone should bare in mind:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Evaluate your tasks for the new problem.&lt;/li&gt;&lt;li&gt;Try getting open-minded, if all arguments say "Y" is better than "X", evaluate your options about "Y"&lt;/li&gt;&lt;li&gt;Get a background on the technologies you want/have to use. Often this may help to make a decision on how/what to use more simple.&lt;/li&gt;&lt;li&gt;If you got a complex problem you might want to use a complex environment. Otherwise if you got a simple problem, you might to want a simple environment.&lt;/li&gt;&lt;li&gt;The tougher the problem, the more tough it is to "computerize" it, meaning that simple environments may not fullfil your needs there.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;This all sounds pretty simple or even flat? True. On the other hand advice needs not to be complex to work. And be honest, how often in your daily life do you really ask yourself the questions stated above when deciding how to go on in IT and project managment?&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-115289457812823584?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/115289457812823584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=115289457812823584' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/115289457812823584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/115289457812823584'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2006/07/what-technology-do-you-need.html' title='What technology do you need?'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-115196763325827362</id><published>2006-07-03T13:09:00.000-07:00</published><updated>2006-07-03T18:05:39.196-07:00</updated><title type='text'>You know YAGNI? Well, here is YRGNI!</title><content type='html'>A little ago I wrote about &lt;a href="http://goit-postal.blogspot.com/2006/06/fuukin-tlas.html"&gt;TLA's (three letter acronyms)&lt;/a&gt;. Well, I think we all agree that pressing the world into three letters is not enough and would not work. And computer work is so much more complicated than normal work... .&lt;br /&gt;&lt;br /&gt;Therefore (and to show that computerization is geeky) the computer industry and nerds had to top three letters. The first well known computer more-than-three-letters acronym widely known was "wysiwig" - &lt;span style="font-weight: bold;"&gt;W&lt;/span&gt;hat &lt;span style="font-weight: bold;"&gt;Y&lt;/span&gt;ou &lt;span style="font-weight: bold;"&gt;S&lt;/span&gt;ee &lt;span style="font-weight: bold;"&gt;I&lt;/span&gt;s &lt;span style="font-weight: bold;"&gt;W&lt;/span&gt;hat &lt;span style="font-weight: bold;"&gt;Y&lt;/span&gt;ou &lt;span style="font-weight: bold;"&gt;G&lt;/span&gt;et - which only meant that what you see on the screen is what you (mostly) get printed on the printer. I'm sure IBM hated it.&lt;br /&gt;&lt;br /&gt;Nowadays the nerd-gossip is, as example, about words like YAGNI. And to be honest, I love YAGNI. It's an abbreviation of "&lt;span style="font-weight: bold;"&gt;Y&lt;/span&gt;ou&lt;span style="font-weight: bold;"&gt; A&lt;/span&gt;in't&lt;span style="font-weight: bold;"&gt; G&lt;/span&gt;onna&lt;span style="font-weight: bold;"&gt; N&lt;/span&gt;eed&lt;span style="font-weight: bold;"&gt; I&lt;/span&gt;t". A new project starts and the client is full of ideas what might be done. Mostly he has no idea what he wants but - aren't that computers? Can they not simply do everything one imagines? As how to build an interface for department "x" smartly transfering data to department "y"? And may the workflow not simply be shown by using "z"? "At least I get all the data/workflow/oversight I need, if (or if not) ... and it's simple when ... having ..." buzzing bingo. The client is freely associating all the possibilities and opportunities even (or because?) he does not really know what he wants. At this point being a project manager, you have two ways. Nod or tell them YAGNI.&lt;br /&gt;&lt;br /&gt;Doing the first and nod you should really be aware of what you promise. You should be aware of the implications and programming/integrational work that might follow your promise, if that all fits into your project plan and if it fits into your available data structures. Not every thing that might be done can be done in a simple way - often the time schedule does not suffice to implement it or data is not availabe to fulfill the task. That is why I love YAGNI: Tell it to the client, listen to their argumentation (perhaps it really is reasonable? If it is reasonable: drop YAGNI). And despite of what you tell them look what you can do backstage as a preparation without too much effort. This way you stay prepared and, heck, being aware of them you sometimes might realize their wishes on the fly. Both (the client and you) will not come into troubled water and believe it or not, both will prosper from that. You can concentrate on the work that has to be done and your client can concentrate on the functionality he really needs.&lt;br /&gt;&lt;br /&gt;What a surprise for me to find an article which teaches me a new acronym (YRGNI) and &lt;a href="http://blog.qualityaspect.com/2006/06/30/when-yagni-is-confused-with-yrgni/"&gt;tells me that YAGNI is confused with YRGNI&lt;/a&gt;. YRGNI means &lt;span style="font-weight: bold;"&gt;Y&lt;/span&gt;ou a&lt;span style="font-weight: bold;"&gt;R&lt;/span&gt;e &lt;span style="font-weight: bold;"&gt;G&lt;/span&gt;onna &lt;span style="font-weight: bold;"&gt;N&lt;/span&gt;eed &lt;span style="font-weight: bold;"&gt;I&lt;/span&gt;t. So which one is correct? Reading the article splitted the responsibilities for these two philosophies for me. And as mentioned before both are no contradictions: The one (YAGNI) seems more the "management" level, the other one (YRGNI) more the "fulfillment" part of the story. After I read the article completely I was even more astonished that I found myself in both worlds.&lt;br /&gt;&lt;br /&gt;So, as I technician I'd say one should "think YRGNI and act YAGNI". Best of both worlds.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;http://blog.qualityaspect.com/2006/06/30/when-yagni-is-confused-with-yrgni/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-115196763325827362?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/115196763325827362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=115196763325827362' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/115196763325827362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/115196763325827362'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2006/07/you-know-yagni-well-here-is-yrgni.html' title='You know YAGNI? Well, here is YRGNI!'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-115024423863078851</id><published>2006-06-13T17:01:00.000-07:00</published><updated>2008-06-15T13:45:06.878-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='what is XML'/><category scheme='http://www.blogger.com/atom/ns#' term='SOAP'/><category scheme='http://www.blogger.com/atom/ns#' term='choose programming language'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>What, exactly, is XML?</title><content type='html'>This seems a dumb question: What, exactly, is XML? But, being honest to yourself, can anybody out there explain to me in a few words what XML really is? Or, to be more precise, what is XML all about?&lt;br /&gt;&lt;br /&gt;For a couple of years I tried to just listen to the guys 'n ladies who should know the answer and, believe it or not, I got a couple of answers depending on whom I asked for:&lt;br /&gt;&lt;br /&gt;Listening to consultants it is the one-and-only salvage to our new computer-century, solving all problems you ever had. Not even enough, it is capable to solve problems you are not yet aware of ever to have.&lt;br /&gt;&lt;br /&gt;Listening to the techies you might learn that all you want to achieve technically may be done using XML.&lt;br /&gt;&lt;br /&gt;Listening to the decision-makers it is the answer to life, the Universe and everything, and that all doing one big shot.&lt;br /&gt;&lt;br /&gt;But, honestly, can anyone out there answer the simple question: "What, exactly, is XML"? Doubt so. This is because merely (in first sight) it only is a format but then (in second sight) everyone put their hopes in it to solve problems XML never was ment to solve. I still can remember the hype in IT where, at a meeting, someone simply said: "Well to solve this problem we provide a XML interface, that should do.". Needless to say that it didn't.&lt;br /&gt;&lt;br /&gt;And it is easy to process. There are so much frameworks, tools and API's to cover all that unconvenient stuff of "reading", "parsing" and "testing" XML (configurations) that most people may suggest to you that using XML is pretty more simple than doing without it. Never had the sensation that you needed one hour to do something in XML which could have been done in a couple of minutes without? I had.&lt;br /&gt;&lt;br /&gt;To be more precise, the troubles I have with XML are the following:&lt;br /&gt;&lt;br /&gt;- It is not defined which element (or tag) to use if there are more than one in one realm. As far as I know all the tools and API's take the first value they find, but it might be a source for errors, especially if you insert a new element which overrides (or better: does not override) the previous value.&lt;br /&gt;&lt;br /&gt;- XML is not human readable. It is an exchange format with fault-tolerancy. This is the one advantage XML has (compared to, say, a fixed size record-driven format): In case an elenment is not defined, the structure is kept (mostly). But reading XML as a human reader is painful.&lt;br /&gt;&lt;br /&gt;- XML is a format and no programming language. XSLT is a cute way to transform XML into another XML (or text or u-name-it), but XSLT is no programming language either. The moment you stop thinking of XML as a language is the moment you will better recognize how often it is misused nowadays.&lt;br /&gt;&lt;br /&gt;- XML produces overhead. Huge overhead. Only think of SOAP-WebServices (or BLOBs represented in XML): To send one bit of information you will need to process, assemble and send some kilobytes round the corner. Agreed, SOAP-WebServices are well-defined and can simply be extended. But do you need XML-ish things for each and every problem?&lt;br /&gt;&lt;br /&gt;So what, exactly is XML? An all-intention-problem-solver? Definitely not. An extensible exchange-format with fault-tolerancy and many available tools to deal with and transform or show it? I bet on that one.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-115024423863078851?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/115024423863078851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=115024423863078851' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/115024423863078851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/115024423863078851'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2006/06/what-exactly-is-xml.html' title='What, exactly, is XML?'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-114964362378537938</id><published>2006-06-06T17:55:00.000-07:00</published><updated>2006-07-04T10:16:32.516-07:00</updated><title type='text'>Fuukin TLA's</title><content type='html'>CEO. OOA. OOD. PHP. ROI. SOA. TTM. XML. I hate fuukin TLA's.&lt;br /&gt;&lt;br /&gt;Do not understand me wrong: Though pressing the world in three letters nowadays seems far too easy and I do not have something personal against Three-Letter-Acronyms, they are in no way cabable to describe the world we live in today. And I don't reckon that tla's are capable to describe the days "spirits were brave, the stakes were high, men were real men, women were real women and small furry creatures from Alpha Centauri were real small furry creatures from Alpha Centauri"&lt;span style="font-weight: bold;"&gt;*&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Three letter acronyms are... three letter acronyms. It always depends on what you are doing with (or on) them, or what you might tell the world using them or what the world is telling you using them. Please understand me right: No "tla" is - as such - good or bad at first sight, but they stand for ideas and are highly able to create prejudice simply by mentioning them and activating the assotiations they create (the selection chosen at top of this article was randomly chosen, you might as well replace the abbreviations through your favourite ones instead).&lt;br /&gt;&lt;br /&gt;How ridiculous the above mentioned conglomeration of buzz-words really is may simply be shown by building a brief job-description with them:&lt;br /&gt;&lt;br /&gt;"Central Executing Officer is searching an Object-Oriented-Architect/Designer to build pages delivered with PHP&lt;span style="font-weight: bold;"&gt;**&lt;/span&gt;. In your future job you need to be able to create a vast Return-On-Investment by building a Service-Oriented-Architecture which helps us getting our products available "Time-To-Market". eXtended-Markup is no foreign -Language for you."&lt;br /&gt;&lt;br /&gt;Buzzing-Bingo! - and I did it in alphabetical order, too. Me having to deal with that kind of fancy stuff all day you perhaps understand why I sometimes really wonder who's doing all the programming work... .&lt;br /&gt;&lt;br /&gt;So my advice for the day: Don't rely on guys using only buzzing-bingo-words all day long. And, if possible, start to not use them for yourself.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;*&lt;/span&gt;    Stolen from Douglas Adams. Could not resist. Sorry.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;**&lt;/span&gt; I know I did not "translate" the three letter acronym PHP because nobody would do so in a job description (PHP originally stands for "Private Home Page Tools").&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-114964362378537938?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/114964362378537938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=114964362378537938' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/114964362378537938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/114964362378537938'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2006/06/fuukin-tlas.html' title='Fuukin TLA&apos;s'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29369725.post-114963473815304358</id><published>2006-06-06T15:52:00.000-07:00</published><updated>2006-06-06T21:12:12.793-07:00</updated><title type='text'>At least. The web got me. Catch-22.</title><content type='html'>So at least the web got me involved. And it's a little bit of a catch-22 situation for me: I do not want to blog. Well, said that you can simply prove me wrong. "Why, oh why, is he blogging then? He already said he doesn't want to do it and he did so at his very first sentence at blogger.com! Blame him, he's lying to us." And who am I to argue that, it is more than true. Not the "he's lying" point, I hope, but alas I am not a blogging kind of guy daily spreading my thoughts to the webworld, why am I doing it anyway?&lt;br /&gt;&lt;br /&gt;The reason is as simple as the reason anyone is blogging nowadays: I think I got to say something (more or less) important to the world. And because my job does not always allow me to publish my opinion as straightforward as I'd like to do, this webspace is a place I may let off some steam gathered reading dumb commentaries or simply things I think that are not true. Writing commentaries, as I now recognize, is not the same thing as writing an article and commenting the commentaries that are the result of your own thoughts. You can learn a lotta bunch more through the latter way.&lt;br /&gt;&lt;br /&gt;"To blog or not to blog" was the decision I had to make now. Catch 22. Well, let us see how deep the bloggin-hole goes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29369725-114963473815304358?l=goit-postal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://goit-postal.blogspot.com/feeds/114963473815304358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29369725&amp;postID=114963473815304358' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/114963473815304358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29369725/posts/default/114963473815304358'/><link rel='alternate' type='text/html' href='http://goit-postal.blogspot.com/2006/06/at-least-web-got-me-catch-22.html' title='At least. The web got me. Catch-22.'/><author><name>Georgi</name><uri>http://www.blogger.com/profile/14147510898520565363</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
