<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Blog of Leonid Mamchenkov &#187; Programming</title>
	<atom:link href="http://mamchenkov.net/wordpress/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://mamchenkov.net/wordpress</link>
	<description>You just stepped in a pile of posts.</description>
	<pubDate>Thu, 02 Oct 2008 11:29:02 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<item>
		<title>Firefox extensions</title>
		<link>http://mamchenkov.net/wordpress/2008/08/23/firefox-extensions/</link>
		<comments>http://mamchenkov.net/wordpress/2008/08/23/firefox-extensions/#comments</comments>
		<pubDate>Fri, 22 Aug 2008 21:00:12 +0000</pubDate>
		<dc:creator>Leonid Mamchenkov</dc:creator>
		
		<category><![CDATA[All]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Technology]]></category>

		<category><![CDATA[Web work]]></category>

		<category><![CDATA[browser tabs]]></category>

		<category><![CDATA[Browsers]]></category>

		<category><![CDATA[experience]]></category>

		<category><![CDATA[firefox]]></category>

		<category><![CDATA[firefox extensions]]></category>

		<category><![CDATA[plugins]]></category>

		<category><![CDATA[tabbed browsing]]></category>

		<category><![CDATA[user interface]]></category>

		<guid isPermaLink="false">http://mamchenkov.net/wordpress/?p=11341</guid>
		<description><![CDATA[Yesterday was a somewhat slow day, so I spent some time on the housekeeping of my Firefox browser.  Somehow I managed to accumulate a lot of extensions, themes, plugins, bookmarks, bookmarklets, and what not.  It felt like a good time to clean the mess up a bit.
I spent about two hours going through the list [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>Yesterday was a somewhat slow day, so I spent some time on the housekeeping of my Firefox browser.  Somehow I managed to accumulate a lot of extensions, themes, plugins, bookmarks, bookmarklets, and what not.  It felt like a good time to clean the mess up a bit.</p>
<p>I spent about two hours going through the list of all installed pieces, upgrading outdated versions, changing old solutions to the modern alternatives, getting new tools, and so on.   I have to say that after that effort my Firefox works faster, and it suits me better now.  One of the biggest changes from my previous setup became the use of <a href="https://addons.mozilla.org/en-US/firefox/addon/5447" onclick="javascript:urchinTracker ('/outbound/article/addons.mozilla.org');">Tab Kit extension</a>.  Among its many features, it has the one that I&#8217;ve been passively looking for for a long time now - tab bar on the right side, instead of top, but not as a part of the sidebar, and with a tree view.  Combined with <a href="https://addons.mozilla.org/en-US/firefox/addon/3542" onclick="javascript:urchinTracker ('/outbound/article/addons.mozilla.org');">Aging Tabs extension</a>, the result is exactly the way I wanted it.</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-11342" title="Firefox tabs" src="http://mamchenkov.net/wordpress/wp-content/uploads/2008/08/firefox_tabs.png" alt="" width="274" height="341" /></p>
<p style="text-align: center;"><em>(it is better in real life than it is on the screenshot)</em></p>
<p>Now when I open links from the site in the new tabs, these new tabs are organized in a tree like structure.  Tabs that I haven&#8217;t yet visited are highlighted in green.  Current tab is highlighted in blue, as usual.  And the rest of the tabs are coloured in different shades of grey, depending on how long ago I last viewed them.  Also, because the tab bar is separate from the sidebar, I can get an additional panel on demand, with an application that I need the most at the moment, without sacrificing my precious tabs.</p>
<p>And just in case you are wondering which other extensions I am using, continue reading for the list of all extensions, which was generated by one of the extensions on that list.</p>
<p><span id="more-11341"></span></p>
<p>Application: Firefox 3.0.1 (2008071615)</p>
<p>Operating System: Linux (x86-gcc3)</p>
<p>Total number of items: 42</p>
<ul>
<li><a href="http://www.pierceive.com/" onclick="javascript:urchinTracker ('/outbound/article/www.pierceive.com');">Adblock Filterset.G Updater 0.3.1.3</a>Synchronizes Adblock with Filterset.G</li>
<li><a href="http://adblockplus.org/" onclick="javascript:urchinTracker ('/outbound/article/adblockplus.org');">Adblock Plus 0.7.5.5</a>Ads were yesterday!</li>
<li><a href="http://en.design-noir.de/mozilla/aging-tabs/" onclick="javascript:urchinTracker ('/outbound/article/en.design-noir.de');">Aging Tabs 0.7.1</a>Makes unused tabs fade with age and highlights the selected tab.</li>
<li><a href="http://firefox.exxile.net/aios/" onclick="javascript:urchinTracker ('/outbound/article/firefox.exxile.net');">All-in-One Sidebar 0.7.6</a>Sidebar control with award-winning user experience!</li>
<li><a href="http://ginatrapani.org/workshop/firefox/betterflickr/" onclick="javascript:urchinTracker ('/outbound/article/ginatrapani.org');">Better Flickr 0.3</a>A compilation of useful Greasemonkey scripts for Flickr.  All scripts copyright their original authors. Click on the script homepage in the Help tab for more information.</li>
<li><a href="http://ginatrapani.org/workshop/firefox/bettergcal/" onclick="javascript:urchinTracker ('/outbound/article/ginatrapani.org');">Better GCal 0.3</a>Enhances Google Calendar with a compilation of user scripts and styles.   All scripts copyright their original authors. Click on the script homepage in the Help tab for more information.</li>
<li><a href="http://ginatrapani.org/workshop/firefox/bettergmail2/" onclick="javascript:urchinTracker ('/outbound/article/ginatrapani.org');">Better Gmail 2 0.6.1</a>Enhances Gmail with a compilation of user scripts and styles.   All scripts copyright their original authors. Click on the script homepage in the Help tab for more information.</li>
<li><a href="http://ginatrapani.org/workshop/firefox/bettergreader/" onclick="javascript:urchinTracker ('/outbound/article/ginatrapani.org');">Better GReader 0.3</a>Enhances Google Reader with a compilation of user scripts and styles.</li>
<li><a href="https://addons.mozilla.org/en-US/firefox/addon/7458" onclick="javascript:urchinTracker ('/outbound/article/addons.mozilla.org');">Callout 0.3.2.1</a>Notification Services for Javascript</li>
<li><a href="http://www.customizegoogle.com/" onclick="javascript:urchinTracker ('/outbound/article/www.customizegoogle.com');">CustomizeGoogle 0.75</a>Enhance Google search results and remove ads and spam.</li>
<li><a href="http://www.cybernetnews.com/cybersearch" onclick="javascript:urchinTracker ('/outbound/article/www.cybernetnews.com');">CyberSearch 0.9.10</a>Adds advanced Google Search capabilities to the Firefox 3 address bar.</li>
<li><a href="http://delicious.com" onclick="javascript:urchinTracker ('/outbound/article/delicious.com');">Delicious Bookmarks 2.0.95</a>Access your bookmarks wherever you go and keep them organized no matter how many you have.</li>
<li><a href="http://downloadstatusbar.mozdev.org/" onclick="javascript:urchinTracker ('/outbound/article/downloadstatusbar.mozdev.org');">Download Statusbar 0.9.6.3</a>View and manage downloads from a tidy statusbar</li>
<li><a href="http://sogame.awardspace.com/" onclick="javascript:urchinTracker ('/outbound/article/sogame.awardspace.com');">Dummy Lipsum 2.3.0</a>Generate &#8220;Lorem Ipsum&#8221; dummy text.</li>
<li><a href="http://www.ryanscook.com" onclick="javascript:urchinTracker ('/outbound/article/www.ryanscook.com');">Extended Copy Menu 1.5</a>Provides the option to copy selection as plain text or html.</li>
<li><a href="https://addons.mozilla.org/en-US/firefox/addon/1433" onclick="javascript:urchinTracker ('/outbound/article/addons.mozilla.org');">Extended Statusbar 1.2.8</a>A Statusbar with Speed, Percentage, Time and loaded size (like Opera&#8217;s one)</li>
<li><a href="http://sogame.awardspace.com/" onclick="javascript:urchinTracker ('/outbound/article/sogame.awardspace.com');">Extension List Dumper 1.14.1</a>Dumps a list of the installed extensions.</li>
<li>Find In Tabs 0.3.1.1Searches for text in all tabs.</li>
<li><a href="http://www.getfirebug.com/" onclick="javascript:urchinTracker ('/outbound/article/www.getfirebug.com');">Firebug 1.1.0b12</a>Web Development Evolved.</li>
<li><a href="http://showcase.uworks.net/" onclick="javascript:urchinTracker ('/outbound/article/showcase.uworks.net');">Firefox Showcase 0.9.4.9</a>Easily locate any tab you&#8217;ve opened in Firefox.</li>
<li><a href="http://www.firephp.org/" onclick="javascript:urchinTracker ('/outbound/article/www.firephp.org');">FirePHP 0.1.1</a>Firebug Extension for AJAX Development</li>
<li><a href="http://flagfox.servehttp.com/" onclick="javascript:urchinTracker ('/outbound/article/flagfox.servehttp.com');">Flagfox 3.2.8</a>Displays a flag depicting the location of the current server</li>
<li><a href="http://flashblock.mozdev.org/" onclick="javascript:urchinTracker ('/outbound/article/flashblock.mozdev.org');">Flashblock 1.5.6</a>Replaces Flash objects with a button you can click to view them.</li>
<li><a href="http://www.stemhaus.com/firefox/foxclocks/" onclick="javascript:urchinTracker ('/outbound/article/www.stemhaus.com');">FoxClocks 2.4.91</a>Displays local times around the world in the statusbar/toolbar. Supports virtually all time zones.</li>
<li><a href="http://www.longfocus.com/firefox/gmanager/" onclick="javascript:urchinTracker ('/outbound/article/www.longfocus.com');">Gmail Manager 0.5.5</a>Gmail accounts management and new mail notifications.</li>
<li><a href="http://gears.google.com/" onclick="javascript:urchinTracker ('/outbound/article/gears.google.com');">Google Gears 0.4.15.0</a>These are the gears that power the tubes! <img src='http://mamchenkov.net/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
<li><a href="http://www.google.com/" onclick="javascript:urchinTracker ('/outbound/article/www.google.com');">Google Toolbar for Firefox 3.1.20080605L</a>Take the power of Google with you anywhere on the Web!</li>
<li><a href="http://www.gridpulse.com/gutil/" onclick="javascript:urchinTracker ('/outbound/article/www.gridpulse.com');">GUtil! 2.3.2</a>Google® Utilities in your Firefox Menu and Toolbar</li>
<li><a href="http://forums.mozillazine.org/viewtopic.php?t=408043" onclick="javascript:urchinTracker ('/outbound/article/forums.mozillazine.org');">IMDb Preview 0.5</a>Preview movie &amp; actor posters when hovering over their IMDb links.</li>
<li><a href="http://yellow5.us/firefox/linkification/" onclick="javascript:urchinTracker ('/outbound/article/yellow5.us');">Linkification 1.3.5</a>Converts text links into genuine, clickable links.</li>
<li><a href="http://www.evolus.vn/Pencil/" onclick="javascript:urchinTracker ('/outbound/article/www.evolus.vn');">Pencil 1.0.3</a>Sketching, simplified</li>
<li><a href="http://sessionmanager.mozdev.org/" onclick="javascript:urchinTracker ('/outbound/article/sessionmanager.mozdev.org');">Session Manager 0.6.1.13</a>Saves and restores the state of all windows.</li>
<li><a href="http://jomel.me.uk/software/firefox/tabkit/" onclick="javascript:urchinTracker ('/outbound/article/jomel.me.uk');">Tab Kit 0.4.3</a>Tab grouping, multi-rows, tree view, and other tweaks.</li>
<li><a href="http://jomel.me.uk/software/firefox/tabsopenrelative/" onclick="javascript:urchinTracker ('/outbound/article/jomel.me.uk');">Tabs Open Relative 0.3.3</a>Tabs open to the right of the current one.</li>
<li><a href="http://www.usablehack.com" onclick="javascript:urchinTracker ('/outbound/article/www.usablehack.com');">TimeTracker 1.2.4</a>Track the time you spend browsing.</li>
<li><a href="http://engel.uk.to/twitkit/" onclick="javascript:urchinTracker ('/outbound/article/engel.uk.to');">TwitKit 1.1</a>An extension that adds a Twitter sidebar to your browsing experience!</li>
<li><a href="http://www.naan.net/trac/wiki/TwitterFox" onclick="javascript:urchinTracker ('/outbound/article/www.naan.net');">TwitterFox 1.6.1</a>This extension lets you know twitter statuses.</li>
<li><a href="http://www.longfocus.com/firefox/updatenotifier" onclick="javascript:urchinTracker ('/outbound/article/www.longfocus.com');">Update Notifier 0.1.5.4</a>Notifies you when updates are available for your extensions and themes.</li>
<li><a href="http://www.fnxweb.com/software-mozilla" onclick="javascript:urchinTracker ('/outbound/article/www.fnxweb.com');"><acronym title="Uniform Resource Locator">URL</acronym> Link 2.02.2</a>Allow navigation to broken/unlinked URLs</li>
<li><a href="http://mozilla.queze.net" onclick="javascript:urchinTracker ('/outbound/article/mozilla.queze.net');">View Dependencies 0.3.3.0</a>Adds a tab listing dependencies and their sizes in the Page Info window.</li>
<li><a href="http://chrispederick.com/work/web-developer/" onclick="javascript:urchinTracker ('/outbound/article/chrispederick.com');">Web Developer 1.1.6</a>Adds a menu and a toolbar with various web developer tools.</li>
<li><a href="http://developer.yahoo.com/yslow" onclick="javascript:urchinTracker ('/outbound/article/developer.yahoo.com');">YSlow 0.9.5b2</a>Make your pages faster with Yahoo!&#8217;s performance lint tool.</li>
</ul><!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://mamchenkov.net/wordpress/2008/08/23/firefox-extensions/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SugarCRM deployment efforts</title>
		<link>http://mamchenkov.net/wordpress/2008/08/19/sugarcrm-deployment-efforts/</link>
		<comments>http://mamchenkov.net/wordpress/2008/08/19/sugarcrm-deployment-efforts/#comments</comments>
		<pubDate>Tue, 19 Aug 2008 00:50:39 +0000</pubDate>
		<dc:creator>Leonid Mamchenkov</dc:creator>
		
		<category><![CDATA[All]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Sysadmin]]></category>

		<category><![CDATA[deployment]]></category>

		<category><![CDATA[development]]></category>

		<category><![CDATA[patching]]></category>

		<category><![CDATA[Software]]></category>

		<category><![CDATA[sugarcrm]]></category>

		<category><![CDATA[tools]]></category>

		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://mamchenkov.net/wordpress/?p=11339</guid>
		<description><![CDATA[Since we started working on SugarCRM in the office, one of the hardest tasks that we had was solving the deployment issue.  On one hand, SugarCRM comes with some really nice GUI tools, such Studio and Module Builder.  On the other hand, the system is large and complex and should be developed and tested in [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>Since we started <a href="http://mamchenkov.net/wordpress/2008/07/15/migrating-ms-dynamics-crm-to-sugarcrm/" >working on SugarCRM</a> in the office, one of the hardest tasks that we had was solving the deployment issue.  On one hand, SugarCRM comes with some really nice <acronym title="Graphical User Interface">GUI</acronym> tools, such <strong>Studio</strong> and <strong>Module Builder</strong>.  On the other hand, the system is large and complex and should be developed and tested in a separate, non-production environment.</p>
<p>We&#8217;ve spent a lot of effort over the last couple of month trying to solve the puzzle.  The problem is that there is a tricky combination of files updates and database changes, some of which can be just copied over while others have to be executed from the destination machine&#8217;s administration.</p>
<p>So, what we did first was complete separation of environments.  Each developer had his own machine on which he could install and configure as many instances of SugarCRM as he saw fit.  Also, each developer had a separate branch in the Subversion, so that he could work on his own stuff without being afraid to run into conflict with anyone.</p>
<p>After that, we created a development server with a checkout of common trunk.  For extra insurance, we did a checkout from a system user, who does not have any write permissions in the repository.  In this case, even if someone will accidentally try to commit from the development server, we would be sure that it fails.</p>
<p>Now, each developer had to merge his changes into trunk, and then test them on the development server.  This procedure is very similar to the production deployment and consisted of two parts.  Firts part was updating all the relevant files (a bit more on this in a moment) with <em>svn update</em>.  Second part was logging into SugarCRM and doing <em>Admin -&gt; Repair -&gt; Quick Repair and Rebuild</em>.</p>
<p>The graphical tools that come with SugarCRM are powerful, but a bit confusing.  The biggest confusion for me was (and maybe still is) between Module Builder and Studio.  Studio can be used to customize core modules that are shipped with SugarCRM.  The results of these customizations are stored in <em>custom/modules</em> directory, and when loaded into the database, can be observed in _cstm tables (for example, <em>accounts_cstm</em>).  This is where new custom fields and things like that are going.  Module Builder is a tool which can help you customize existing modules or build the new ones. The confusion here is because both of these tools can be used to do the same things.  But with Module Builder you&#8217;d be working closer to the core system and modifying &#8220;original&#8221; functionality.  You can build your own modules too, by the way.  The results of the Module Builder work with go into <em>modules/</em> directory, and changes in the database will take place in the original tables.  One thing to remember though, is that you&#8217;ll need to push <em>Save &amp; Deploy</em> button every time you are finished with changes in Module Builder.  This is like compiling and building a module.  If you forget this step, then your module will hang in its source somewhere around <em>custom/modulebuilder</em> directory.</p>
<p>Another thing to keep in mind is the sillyness of the machine trying to figure out another machine.  Meaning that Subversion will often have issues trying to figure out the changes from the last commit, and these issues would be often caused by a lot of automatically generated code by SugarCRM.  In most of these problematic cases, Subversion will just merge the changes, and this would often result in a broken system.  I&#8217;ve found at least two reasons behind these: small context size that Subversion uses (3 lines or so) confuses it sometimes, bringing it to a wrong place in the file to do the merging; and rather messy automatically generated stuff by SugarCRM - unnecessary reordering and mixed (DOS and UNIX) ends of lines in a single file.  These problems are mostly related to vardef files (vardef.php and anything *def.php) and language dictionaries (anything with *en_us*php, or whatever your locale is).  The solution we are using at the moment is simple, although a bit heavy on the manual work - instead of merging the changes and checking them every time we simply remove old versions of files and add the new ones in two separate commits.  These way Subversion treats the files as completely different ones and real removes and re-creates them instead of trying to merge.</p>
<p>We follow exactly the same procedure now to deploy to the production server.  We just merge code from <em>trunk/</em> to <em>branches/stable</em> , commit, then update the files on the production server, and then do the <em>Quick Repair and Rebuild</em>.</p>
<p>The thing about Quick Repair and Rebuild is that it takes the update definitions of your forms and layouts and rebuilds compiled templates.  It also compares the structure of the database with the update definitions in the files and, if needed, updates the database scheme too.  Sometimes you&#8217;d get an error of missing table (usually custom tables with _cstm suffix) - just create an empty table manually.  Put a couple of standard fields like id_c, date_modified, and date_entered.  After that, field modifications should be OK.  In case you run into a problem with updates to several fields at once, make sure that SugarCRM put a semicolon (;) at the end of each <acronym title="Structured Query Language (a database standard)">SQL</acronym> statement that it shows you in a popup window.  For some weird reason, sometimes it just works, and sometimes it tries to execute several queries without separating them one from another.</p>
<p>So far the setup seems to be working for us just fine, but I&#8217;m sure that we&#8217;ll have a few changes here and there.  I&#8217;ll let you know once we find any better way of doing things.  In the meantime, here are some links that might help your development efforts:</p>
<ul>
<li><a href="http://www.sugarcrm.com/wiki/index.php?title=Model-View-Controller_(MVC)" onclick="javascript:urchinTracker ('/outbound/article/www.sugarcrm.com');">SugarCRM Model-View-Controller (MVC)</a></li>
<li><a href="http://www.sugarcrm.com/wiki/index.php?title=SugarBean" onclick="javascript:urchinTracker ('/outbound/article/www.sugarcrm.com');">SugarCRM SugarBean</a></li>
<li><a href="http://www.sugarcrm.com/wiki/index.php?title=Vardefs" onclick="javascript:urchinTracker ('/outbound/article/www.sugarcrm.com');">SugarCRM Vardefs</a></li>
<li><a href="http://www.sugarcrm.com/wiki/index.php?title=Performance_Tweaks_for_Large_Systems" onclick="javascript:urchinTracker ('/outbound/article/www.sugarcrm.com');">SugarCRM Performance Tweaks for Large Systems</a></li>
</ul><!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://mamchenkov.net/wordpress/2008/08/19/sugarcrm-deployment-efforts/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Vacancy for Python or C++ programmers and Linux sysadmins</title>
		<link>http://mamchenkov.net/wordpress/2008/07/24/vacancy-for-python-or-c-programmers-and-linux-sysadmins/</link>
		<comments>http://mamchenkov.net/wordpress/2008/07/24/vacancy-for-python-or-c-programmers-and-linux-sysadmins/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 08:56:51 +0000</pubDate>
		<dc:creator>Leonid Mamchenkov</dc:creator>
		
		<category><![CDATA[All]]></category>

		<category><![CDATA[Cyprus]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Sysadmin]]></category>

		<category><![CDATA[jobs]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[Python]]></category>

		<category><![CDATA[vacancy]]></category>

		<guid isPermaLink="false">http://mamchenkov.net/wordpress/?p=11316</guid>
		<description><![CDATA[Point Nine is looking for some talanted people.  They are working in the financial sector, and seeking Python and C++ programmers, as well as Linux system administrators.  They seem to be an interesting company, judging both by their technology stack and hiring techniques.   For example, I&#8217;ve spotted their job ad on The Daily WTF.  Cool [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p><a href="http://www.p9ft.com/" onclick="javascript:urchinTracker ('/outbound/article/www.p9ft.com');">Point Nine</a> is looking for some talanted people.  They are working in the financial sector, and seeking Python and C++ programmers, as well as Linux system administrators.  They seem to be an interesting company, judging both by their technology stack and hiring techniques.   For example, I&#8217;ve spotted their <a href="http://jobs.thedailywtf.com/1001/listing.aspx?JobId=1001379" onclick="javascript:urchinTracker ('/outbound/article/jobs.thedailywtf.com');">job ad on The Daily WTF</a>.  Cool stuff.  If I wasn&#8217;t working where I am working, I would have applied for the job already.</p><!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://mamchenkov.net/wordpress/2008/07/24/vacancy-for-python-or-c-programmers-and-linux-sysadmins/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Migrating MS Dynamics CRM to SugarCRM</title>
		<link>http://mamchenkov.net/wordpress/2008/07/15/migrating-ms-dynamics-crm-to-sugarcrm/</link>
		<comments>http://mamchenkov.net/wordpress/2008/07/15/migrating-ms-dynamics-crm-to-sugarcrm/#comments</comments>
		<pubDate>Tue, 15 Jul 2008 09:08:49 +0000</pubDate>
		<dc:creator>Leonid Mamchenkov</dc:creator>
		
		<category><![CDATA[All]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Sysadmin]]></category>

		<category><![CDATA[Technology]]></category>

		<category><![CDATA[crm]]></category>

		<category><![CDATA[experience]]></category>

		<category><![CDATA[management]]></category>

		<category><![CDATA[microsoft]]></category>

		<category><![CDATA[migration]]></category>

		<category><![CDATA[software development]]></category>

		<category><![CDATA[sugarcrm]]></category>

		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://mamchenkov.net/wordpress/?p=11313</guid>
		<description><![CDATA[I&#8217;ve been a bit quiet for the last couple of month.  That&#8217;s because I was leading an ambicious project at my new job - migration of a Microsoft Dynamics CRM version 3 to SugarCRM Community Edition version 5.0.0.  There were only three people involved, non of us could afford to work full time on the [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>I&#8217;ve been a bit quiet for the last couple of month.  That&#8217;s because I was leading an ambicious project at my new job - migration of a Microsoft Dynamics CRM version 3 to SugarCRM Community Edition version 5.0.0.  There were only three people involved, non of us could afford to work full time on the project, and we only had three weeks to do it.</p>
<p>Read on for a story on why it took us longer, how we did, and if it was a success at all.</p>
<p><span id="more-11313"></span></p>
<p>First of all, a little background.  The company that I work for now is in financial services sector.  CRM is one of the two vital systems, with trading platform being the second one.  All processes are tied into CRM - registrations of new clients, incoming and outgoing money, email tracking, and so on and so forth.  The system has been installed about a year ago and has accomodated data for a few thousands of clients.</p>
<p>Another important bit to know is that CRM is used quite a lot 24 hours a day, 5 days a week.  Some data is coming in over the weekends too, but there are no real users who access the system.  Also, since the company is working with global clientele, weekend is really between 23:00 of Friday and 23:00 of Sunday.</p>
<p>By now you probably have this question in your head: &#8220;Why migrate?&#8221;.  What is so wrong with the existing system that it needs to be replaced so fast and so furious?</p>
<p>The company was preparing for a huge expansion.  Firtst of all, there was a take over of another company scheduled later that month.  That meant an almost sudden expansion of a few thousands of clients to a few tens of thousands of clients.  Secondly, a huge marketing campaign was starting up.  Thirdly, a few key processes were about to be change (the way new clients were registered).  Fourthly, there was a huge need for automation and extended functionality.</p>
<p>With all that, there was a very limited in-house expertise for the existing system.   SugarCRM had this nice advantage of being implemented with LAMP stack (Linux, Apache, MySQL, <acronym title="Hypertext PreProcessing">PHP</acronym>), which was way more familiar to most of the IT people in the company.  And all the source code was there.</p>
<p>Another big reason for a change, was realization of how tied in the <acronym title="Microsoft">MS</acronym> CRM is into company&#8217;s network.   While considering the upgrade of the <acronym title="Microsoft">MS</acronym> Dynamics CRM to version 4, most of the people were horrified of the upgrade path.  In order to upgrade the CRM, we first had to upgrade our <acronym title="Microsoft">MS</acronym> Exchange server.  Which meant that we had to upgrade the operating system of the machine.  Which meant that we had to upgrade the hardware of the server.  And <acronym title="Microsoft">MS</acronym> Exchange upgrade was strongly suggesting upgrades of quite a few other bits and pieces of software and hardware.  Seemed like a really complicated and dangerous thing to do.</p>
<p>One thing I wanted to note separately, was how easy it was to sell SugarCRM to the management.  An open source stack meant that we were could be in full control of the system.  Independent software pieces meant that we could replace and upgrade them separately.  Fully web based technology aligned very well with many other company tools.  The brief demonstration of SugarCRM got them totally convinced that the system is mature enough and can handle everything the company needs, and more.  The fact that SugarCRM could be easily installed on a laptop in just a couple of minutes helped.  The nice look and selection of themes in default out of the box installation helped.  The selection of modules in out of the box installation helped.  And the possibility to install the system with plenty of sample data helped too.  Overall, it took me less than two hours to convince the management that the system is good enough.  And I wasn&#8217;t even trying hard.</p>
<p>So, what&#8217;s with the timing?  We were given three weeks.  In fact, it was two weeks for migration and one week for user training.  We had to create a full replica of the existing system.  Migrate all the data and implement all the functionality to support all the company processes.  It took us three weeks to do it.  Because we had no time to train the users, and because the company was on the doorstep of a large take over, we had to suspend the CRM migration efforts.</p>
<p>It took the company about three weeks to integrate all the new data.  Also, quite a few processes were changed.  And the company grew plenty of new staff in all departments.</p>
<p>When the question of the CRM migration was important once again, we had to face quite a few changes.  Much much much more data than we originally tested with.  A lot of changes in the ways things were handled.  More users.  And more automation was needed.  The replica of the old CRM was of no value anymore.</p>
<p>It took us about three more weeks to adjust our installation of SugarCRM to fit the new requirements.  Even now that the migration is officially over, we still have quite a few things to fix and improve.  But that&#8217;s going to be a live process from now on.</p>
<p>The project was very challanging for the company, the team, and me personally.  It was a complex thing technically, politically, and socially.  For me personally, it was also quite a new management experience.  I&#8217;ve been doing some project management before, but never had to deal with such magnitude, and especially in such tight deadlines.  The good thing though was that I had to pick my own team.</p>
<p>Here are a few things that I&#8217;ve learned and a few things that I think are important to share.</p>
<p>Technology-wise, thanks heavens for CSV (file format for comma separated values).  This was the backbone of the whole migration process.  Here is how it works.  <acronym title="Microsoft">MS</acronym> Dynamics CRM has a very limited exporting functionality.  Getting things directly out of the database don&#8217;t make sense at all.  For example, our specific installation had more than 220 tables, all linked to each other.  On top of that there were almost 400 views and something around 60 stored procedures.  There was no way that we could analyze these structures in any meaningful period of time.  So we did an export with entity by entity method.  Gladly, there weren&#8217;t that many entities.  There is a way to list all entities in tabular form, with columns upon columns of entity values.  The only sensible format to save that list was in <acronym title="HyperText Markup Language">HTML</acronym>.</p>
<p>Because we had huge sets of data, <acronym title="Microsoft">MS</acronym> CRM couldn&#8217;t handle the listing properly.  So we had to come up with search criterias to separate the listings into smaller chunks of about 10,000 records each.  Now, I&#8217;ll give you a second to imagine an <acronym title="HyperText Markup Language">HTML</acronym> file with a table, which has around 10,000 rows and anywhere from 100 to 500 columns.</p>
<p>The way to handle these <acronym title="HyperText Markup Language">HTML</acronym> files was to load them up in <acronym title="Microsoft">MS</acronym> Excel.  It should also better be a newer version of Excel, that can handle more than 256 columns.  <acronym title="Microsoft">MS</acronym> Excel is wonderful at pasing those <acronym title="HyperText Markup Language">HTML</acronym> tables, but it doesn&#8217;t offer much help in saving them in CSV.  CSV in <acronym title="Microsoft">MS</acronym> Excel is weird.  So, what we ended up doing was using <acronym title="Microsoft">MS</acronym> Excel to convert <acronym title="HyperText Markup Language">HTML</acronym> tables into older version of Excel, so that we could open them up in OpenOffice.  OpenOffice is wonderful at saving CSV.  You can pick and choose delimeters, quoting symbols, etc.  The point is to make CSV files which can be parsed by <acronym title="Hypertext PreProcessing">PHP</acronym>.</p>
<p>Here are two things to remember.  First, older Excel formats can&#8217;t work with more than 256 columns.  The trick we were using was the sheets.  Copy data of the extra columns into another sheet of the same file, and it will be much easier to process later.  Second, if you will do several exports of data from <acronym title="Microsoft">MS</acronym> CRM, remember that columsn won&#8217;t necessarily be in the same order.  In fact, chances are that columns won&#8217;t be in the same order.  The way go about it is to use hashes, or, sorry, associative arrays.  Take the first row, of data, which has the column titles, build an index array out of it, and then go through data rows, assigning values to appropriate keys.  Don&#8217;t use indexes for data, or you will have to inspect the order and adjust your SugarCRM importing scripts on every export.</p>
<p>Another technical issue is the deployment process of SugarCRM.  We are still in the mess with this and haven&#8217;t solved it properly.  We used Subversion for the version control of all the files.  But it&#8217;s not enough for SugarCRM, since some of the modules are bulit with its own Studio, and loaded with its own Module Loader.  When this happens, the database is modified, and a few local files are changed also.  We sort of have it working now, with plenty of magic and strict procedure involved, but it&#8217;s far from perfect, requires too much manual labour, and is very prone to problems still.  If you have any suggestions for this one, please let me know.</p>
<p>Something else worth noting, is a very unpleasant behavior of SugarCRM in terms of usage tracking.  Surely, there is an option to not send anything, but somehow I find it always sending way too much stuff out.  And the worst part is that these things are hidden, and written in a way that makes them hard to find.  have a look in <em>include/utils/mvc_utils.php</em> and in <em>include/utils/tracker_utils.hp</em> .  These are the two ugliest places.  There is another one which deals with update notifications, which I think I found, but didn&#8217;t have time to cut out yet.  I am really surprised to see these in an open source project.  And then again, I&#8217;m glad to have all the sources and being able to remove this stuff.  Who knows what goes on in closed source applications&#8230;</p>
<p>In terms of project management, I&#8217;ve learned to talk to people a lot.  Talking to all the people all the time was the bigger part of my participation in the project actually.  I think I&#8217;ve spent close to 80% of time just talking.  I was talking to the members of the team, trying to figure out the best ways to approach problems.  I was talking to people who were supporting <acronym title="Microsoft">MS</acronym> CRM installation, trying to get as much as possible from them regarding the details of the running system.  I was talking to each user and each user group trying to see what they were using, how they were using it, and what they wanted and needed from the new system.  I was talking to the management a lot, trying to figure out where the company was going and what would be the changes in the near, intermediate and far away future.  I was also talking to a lot of  people outside of the company, trying to see how similar problems were solved there, how they managed projects of this magnitude, how they were dealing with their users, developers, and managers.</p>
<p>I know that many projects take a lot of talking, but in this one we had practically no documentation of the existing system and process, and we had very tight deadlines, so talking ended up being a very effecient way of getting information.</p>
<p>Also, talking helped a lot in extending deadlines where needed, and in keeping users calm.  Somehow, people are taking delays and system limitations very much easier if they know why those limitations are in and when there are problems will be solved.  Sometimes I had to go into technical details explaining why certain things weren&#8217;t working or were working different from the previous system.  Sometimes I had do a totally non-technical talk showing to people which other departments exist in the company and how they interact, and how things are prioritiezed and why.</p>
<p>As I said, I did a lot of talking.  More than during any other project that I ever handled.  Of course, I was blessed with excellent teammates who were handling the technical parts of the project.  One person was doing everything and anything about SugarCRM.  Another one was working on all the exports, figuring out other systems and getting stuff off of them.  He also helped a lot with integration of SugarCRM with the other company tools.  Great guys both of them!</p>
<p>Now, this pretty much covers the migration process.  But since the SugarCRM saga in our company is just started, expect more stuff posted.  In the mean time, if you have any questions regarding any aspect of this migration, feel free to ask in the comments.</p><!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://mamchenkov.net/wordpress/2008/07/15/migrating-ms-dynamics-crm-to-sugarcrm/feed/</wfw:commentRss>
		</item>
		<item>
		<title>BLOB is bad for your (mental) health</title>
		<link>http://mamchenkov.net/wordpress/2008/06/16/blob-is-bad-for-your-mental-health/</link>
		<comments>http://mamchenkov.net/wordpress/2008/06/16/blob-is-bad-for-your-mental-health/#comments</comments>
		<pubDate>Mon, 16 Jun 2008 18:23:29 +0000</pubDate>
		<dc:creator>Leonid Mamchenkov</dc:creator>
		
		<category><![CDATA[All]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[bugs]]></category>

		<category><![CDATA[databases]]></category>

		<category><![CDATA[development]]></category>

		<category><![CDATA[mysql]]></category>

		<category><![CDATA[sql]]></category>

		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://mamchenkov.net/wordpress/?p=11301</guid>
		<description><![CDATA[If you ever mention that your web application uses database to store files, you risk being flamed into oblivion.  Indeed, in most cases, it is a bad idea, since file system is more effecient when it comes to files.  However, there are cases when it makes sense to have files saved in the database.
Maybe I [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>If you ever mention that your web application uses database to store files, you risk being flamed into oblivion.  Indeed, in most cases, it is a bad idea, since file system is more effecient when it comes to files.  However, there are cases when it makes sense to have files saved in the database.</p>
<p>Maybe I am doing something wrong, but in the last six month, I had to develop at least three systems that used MySQL for file storage (uploaded files that have to be synchronized across several hosts, etc).  Yesterday, for the third time I stumbled across the same problem, that almost drove me insane.</p>
<p>MySQL has <a href="http://dev.mysql.com/doc/refman/5.0/en/blob.html"title="MySQL reference : BLOB and TEXT"  onclick="javascript:urchinTracker ('/outbound/article/dev.mysql.com');">four data types for storing binary data</a> - TINYBLOB, BLOB, MEDIUMBLOB, and LONGBLOB.  Somehow I always forget about these and use BLOB.  BLOB works just fine, but it has a limit on size, which is rather low - 64 KBytes.  The mean thing here is that it will work just fine with most of the test data - text files, short PDFs, and small pictures.  Once the application is tested and put into production, the corrupted files will start coming in.  Re-writing all parts that deal with uploading, moving, cleaning, escaping, and encrypting binary data takes time.  Going through file reading and writing routines is boring too, and it won&#8217;t help either.</p>
<p>By the time, the issue is discovered and all fields are changed to LONGBLOB, it is often very late, and you&#8217;ve lost your weekend, as well as a lot of large files. This post is an attempt to save my (and your) sanity.</p>
<p>Reminder: <strong>use LONGBLOB instead of BLOB for file storage, unless you are absolutely sure about the maximum size of incoming data</strong>.</p><!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://mamchenkov.net/wordpress/2008/06/16/blob-is-bad-for-your-mental-health/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Programming language barrier</title>
		<link>http://mamchenkov.net/wordpress/2008/06/07/programming-language-barrier/</link>
		<comments>http://mamchenkov.net/wordpress/2008/06/07/programming-language-barrier/#comments</comments>
		<pubDate>Fri, 06 Jun 2008 21:51:30 +0000</pubDate>
		<dc:creator>Leonid Mamchenkov</dc:creator>
		
		<category><![CDATA[All]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[career]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[languages]]></category>

		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://mamchenkov.net/wordpress/?p=11298</guid>
		<description><![CDATA[One of the frequent things that I hear about programmers is that it doesn&#8217;t matter which language the person is using and which language you need him to use, because if he is any good he&#8217;ll learn and catch up pretty fast.  In other words, if you take a decent Java programmer and push him [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>One of the frequent things that I hear about programmers is that it doesn&#8217;t matter which language the person is using and which language you need him to use, because if he is any good he&#8217;ll learn and catch up pretty fast.  In other words, if you take a decent Java programmer and push him to write <acronym title="Hypertext PreProcessing">PHP</acronym> code for you, you&#8217;ll only have issues for a few days.  Or weeks, at most.</p>
<p>I understand the reasons for this statement, but I don&#8217;t agree with it.  At least not completely.</p>
<p>Firstly, the reasons.  They are rather obvoius, but I&#8217;d rather stagte them anyway.  Computer Science is not specific to any programming language.  The concepts and approaches are more or less the same everywhere.  Flow control, data structures, and algorithms are not language specific.  Each language has its own best practices and recommended variations, but a bubble sort in <acronym title="Hypertext PreProcessing">PHP</acronym> will be very similar to bubble sort in Java.   Then you need some common sense, which is also not laguage bound at all.</p>
<p>Secondly, the disagreement.  I think that the Computer Science theory and common sense aren&#8217;t the only things that make up a programmer.  What makes a lot of difference is experience.  Programming languages, in their practical applicatoin, are just collections of software - compilers, linkers, debuggers, libraries, IDEs, etc.  Like any other software, programming language software has bugs, undocumented features, and Days When Things Don&#8217;t Just Work.  It&#8217;s the experience with the language that teaches the programmer how to handle the issues of each software piece.  And that experience is priceless (almost).</p>
<p>Even if you&#8217;d manage to push a Java programmer into writing <acronym title="Hypertext PreProcessing">PHP</acronym> code, that would a waste of resources.  A Java programmer is a Java programmer, not <acronym title="Hypertext PreProcessing">PHP</acronym> programmer.  He will, of course, learn <acronym title="Hypertext PreProcessing">PHP</acronym> nuances with time, but, he&#8217;ll probably lose a part of his priceless (almost) bagage.  Sounds a lot like misuse of resources.</p>
<p>Another part of my disagreement is not so much reasoned as emotionalized.  I&#8217;ve seen a few C and Java developers switch to Perl and <acronym title="Hypertext PreProcessing">PHP</acronym> for their new positions.  Not that I was forcing them to or anything, but they did.  And the switch was moslty painful to say the least.  Here are some of the areas that I noticed as being hard to comprehend.</p>
<p><strong>Compiling vs. interpreting.</strong> Those people who were used to their compilation process were missing something for the first few days.  Some needed as much as a week to adopt, even though write-save-reload browser was done a few hundred times a day.</p>
<p><strong>Debugging.</strong> There are two major camps here.  In the first one are all those people who live in the debugger.  They know all the keyboard shortcuts and they have their highlighting customized.  In another camp are people of the simpler nature, those who use <em>print()</em> and <em>die()</em> for most of their debugging needs.  It seems that most people coming from C and Java prefer the debugger way.  Most of the interpretted languages do have either a standalone debugger or a built in debugging tool, but it seems that the majority of interpretted language crowd use the <em>print()</em> and <em>die()</em> approach.</p>
<p><strong>Sigils.</strong> If you don&#8217;t know what a sigil is, read <a href="http://en.wikipedia.org/wiki/Sigil_(computer_programming)" onclick="javascript:urchinTracker ('/outbound/article/en.wikipedia.org');">this Wikipedia page</a>.  Because you do know what it is.  Many strong type language don&#8217;t use any sigils.  Most of the loosely typed languages do.  Furthermore, when both the language from which you are changing and the language to which you are changing use sigils, chances are there will still be a difference.  <acronym title="Hypertext PreProcessing">PHP</acronym>, for example, uses $ for both scalars and arrays.  In Perl though, you&#8217;ll get a $ for scalar, @ for array, and % for hash.  Perl&#8217;s sigils are extremely helpful when figuring out someone else&#8217;s code. I remember the pain of having just a $ in <acronym title="Hypertext PreProcessing">PHP</acronym>, when I was learning it.  And I can&#8217;t even imagine how confusing it is for people who are used to non-sigilized programming languages.</p>
<p><strong>Types.</strong> As already mentioned above, strong typed language programmers can be often confused with the fact that variables can change their type on the fly, and that they don&#8217;t even need to be declared before use.  Loosely typed language programmers will often complain about the requirement to define their types.  Three of the most common questions that I&#8217;ve heard regarding this matter were:</p>
<ul>
<li>&#8220;How do I define an array of elements of a certain type of a certain length?&#8221;</li>
<li>&#8220;Is this line a piece of non-sense or does it really do something:   $sum += 0; ?&#8221;</li>
<li>&#8220;What&#8217;s wrong with writing:  int amount; amount = 2.5; ?&#8221;</li>
</ul>
<p>There are, of course, more areas than just those - include pathes, include files, OOP, database abstraction, loops (&#8221;What the heck is foreach?&#8221;), memory management, libraries, and so on and so forth.</p>
<p>Even the list of the resources for each programming language takes time to build.   Yes, time.  And time is one thing that&#8217;s always against us.  Everything else we ca handle.</p><!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://mamchenkov.net/wordpress/2008/06/07/programming-language-barrier/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Follow-up to &#8220;Where did all the PHP programmers go?&#8221;</title>
		<link>http://mamchenkov.net/wordpress/2008/06/05/follow-up-to-where-did-all-the-php-programmers-go/</link>
		<comments>http://mamchenkov.net/wordpress/2008/06/05/follow-up-to-where-did-all-the-php-programmers-go/#comments</comments>
		<pubDate>Thu, 05 Jun 2008 14:29:01 +0000</pubDate>
		<dc:creator>Leonid Mamchenkov</dc:creator>
		
		<category><![CDATA[All]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Technology]]></category>

		<category><![CDATA[interviews]]></category>

		<category><![CDATA[jobs]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[vacancy]]></category>

		<guid isPermaLink="false">http://mamchenkov.net/wordpress/?p=11295</guid>
		<description><![CDATA[This is a quick follow-up to yesterday&#8217;s post - &#8220;Where did all the PHP programmers go?&#8220;.
First of all, let me take the moment and say &#8220;Wow!&#8221;.  Somebody submitted the post to Reddit and it made it to the front page and got an unbelievable amount of comments.  Almost 500, and still coming.  Thank you all.
Secondly, [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>This is a quick follow-up to yesterday&#8217;s post - &#8220;<a href="http://mamchenkov.net/wordpress/2008/06/04/where-did-all-the-php-programmers-go/" >Where did all the <acronym title="Hypertext PreProcessing">PHP</acronym> programmers go?</a>&#8220;.</p>
<p>First of all, let me take the moment and say &#8220;Wow!&#8221;.  Somebody <a href="http://www.reddit.com/info/6m1wk/comments/" onclick="javascript:urchinTracker ('/outbound/article/www.reddit.com');">submitted the post to Reddit</a> and it made it to the front page and got an unbelievable amount of comments.  Almost 500, and still coming.  Thank you all.</p>
<p>Secondly, the comments on this blog are fixed finally.  Murphy&#8217;s Law in action - they got broken just before the wave came in and they got fixed shortly after.</p>
<p>Thirdly, I should clear up a few things.  My apologies for getting you guys confused.  I never asked any candidate to compare sorting algorithms, much less to implement them.  I asked to sort an array.  I was expecting one of those <acronym title="Hypertext PreProcessing">PHP</acronym> function calls in return.  But I only got it a few times.  Many candidates didn&#8217;t know how to sort an array (apparently they use MySQL to sort an array).  A few suggested &#8220;bubble sort&#8221;.  Probably thinking that the tasks for testing sorting algorithms.  One even went as far as implementing a bubble sort in <acronym title="Hypertext PreProcessing">PHP</acronym>.  With pen and paper.  This one was the toughest to decide about, by the way.</p>
<p>Fourthly, the correction.  The language is indeed called Ruby, not Ruby on Rails. I am aware of that.  I was just trying to catch a thought.  Thanks for pointing it out though.</p>
<p>Fifthly, explanation for the pen and paper.  Yes, I know that programmers are used to typing code.  I know that they are used to their tools and online references.  But.  This is an interview.  My time is limited and I have to make a decision.  If I give all the tools and references to my mother, she will be able to solve the problem I am giving in reasonable time.  She is not a <acronym title="Hypertext PreProcessing">PHP</acronym> developer.  She has no experience with <acronym title="Hypertext PreProcessing">PHP</acronym>.  But she has enough of common sense to do it.  If I take everything away - she won&#8217;t be able to do that.  But any semi-decent programmer will do.  Further on, I am not feeding the resulting paper into the machine.  The only parser that sees that code is the one embedded in my brain.  And I assure you it is very tolerant to minor syntax errors and missing parameters.  I want to see the process.  The approach. Some data structures and algorithms.  A bit of style in variable names, indentation, and empty lines, if I am lucky.  That&#8217;s all.</p>
<p>Sixthly, on the exercise itself.  I like to think that I am pretty flexible with answers.  For this particular exercise, a Perl programmer inside me thinks associative array is the best data structre.  (And yes, before you start bashing further, I know that associative arrays in <acronym title="Hypertext PreProcessing">PHP</acronym> aren&#8217;t the same as hashes in Perl.)  I can accept an OOP solution just fine.  What I find hard to accept is a single dimensional array with hopping over a pre-defined number of fields per record.</p>
<p>Seventhly, this post, once it got to reddit and then furthermore to other news streams, generated more candidates and hints to where to find them, then all of my prevoius efforts.  Thanks to all of you who sent me resumes, links, and pointers.  My inbox is a bit overwhelmed right now, but I&#8217;ll reply to everyone over the next few days.</p>
<p>Thanks a lot to all of you.</p><!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://mamchenkov.net/wordpress/2008/06/05/follow-up-to-where-did-all-the-php-programmers-go/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Where did all the PHP programmers go?</title>
		<link>http://mamchenkov.net/wordpress/2008/06/04/where-did-all-the-php-programmers-go/</link>
		<comments>http://mamchenkov.net/wordpress/2008/06/04/where-did-all-the-php-programmers-go/#comments</comments>
		<pubDate>Wed, 04 Jun 2008 09:26:56 +0000</pubDate>
		<dc:creator>Leonid Mamchenkov</dc:creator>
		
		<category><![CDATA[All]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Technology]]></category>

		<category><![CDATA[Cyprus]]></category>

		<category><![CDATA[jobs]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[vacancy]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[During the last six month or so, I&#8217;ve been looking to hire a PHP programmer for at least three companies.  I have spoken to quite a few people on the phone, reviewed a bunch of resumes, and even interviewed a few.  Out of all those candidates I recommended to hire exactly zero.
Before you start bashing [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>During the last six month or so, I&#8217;ve been looking to hire a <acronym title="Hypertext PreProcessing">PHP</acronym> programmer for at least three companies.  I have spoken to quite a few people on the phone, reviewed a bunch of resumes, and even interviewed a few.  Out of all those candidates I recommended to hire exactly zero.</p>
<p>Before you start bashing my high standards, let me explain.  I wasn&#8217;t looking for a rocket scientist or anything remotely similar.  Not even a senior <acronym title="Hypertext PreProcessing">PHP</acronym> developer.  Someone with enough knowledge to take over maintenance of a couple of projects, both of which are based on famous open source software - <a href="http://mamchenkov.net/wordpress/2008/05/29/toolbox-wordpress-cakephp-sugarcrm-rt/" >CakePHP and WordPress</a>.</p>
<p>I can understand that not everyone have worked with or even heard of CakePHP or WordPress.  I can understand that getting used to that source code and going through documentation might need some time.  I can understand that not everyone is familiar with open source software development model and that not everyone has worked in groups, so familiarity with version control software, documentation tools, and bug tracking was never a requirement.</p>
<p>What I cannot understand is why a person who have (according to him) developed more than two dozens of web projects with <acronym title="Hypertext PreProcessing">PHP</acronym> and MySQL cannot write the simplest piece of code with pen and pencil.  What I cannot undertand is how a &#8220;senior web developer&#8221; with years of <acronym title="Hypertext PreProcessing">PHP</acronym> experience and team leading becomes useless when his Dreamweaver is taken away.  What I cannot understand is why people with more than one Bachelor Degree in Computer Science recommend using bubble sort.  What I cannot understand is why programmers start teaching the potential employer about the interviewing process instead of answering technical questions.  And what I don&#8217;t understand is why technical people with years of team work, get pissed off or burst into tears when you ask them a technical question, and a simple one at that, during the job interview.</p>
<p>If you are wondering what sort of questions I&#8217;ve been asking, here is an example.  A simple questions would be something like: &#8220;<em>What is the difference between the stack (also known as FILO) and the queue (also known as pipe, also known as FIFO)?</em>&#8220;.  Most of the answer is already in the questions, isn&#8217;t it?</p>
<p>Those of the candidates who were boasting about their years of experience and prevoius projects, were given a simple programming task, which could be something like: &#8220;<em>Using <acronym title="Hypertext PreProcessing">PHP</acronym> programming language, create a list to store information about people.  For each person you&#8217;ll need to store name, age, and gender. Populate the list with three sample records.  Then, print out an alphabetically sorted list of names of all males in that list. Bonus points for not using the database.</em>&#8220;.  Each candidate was given a piece of paper, a pen, and unlimited amount of time.  And in the last six month I haven&#8217;t seen one candidate who could write the code to solve that problem.</p>
<p>We&#8217;ve been through all job sites, newspapers, local and foreign forums, and recruiting agencies, trying to find the candiate.  We haven&#8217;t found even one.  At least three are needed right now.  More will be needed in the nearest future.</p>
<p>Hopefully, by now you will agree with me on that the situation with the human resources on the island of Cyprus is disastrous.  There is more demand than there is supply, and it&#8217;s not getting any better.</p>
<p>Those of you who argue in favour of Cyprus being a small, unimportant country in the middle of technological nowhere, might want to wait.  Last year I&#8217;ve been in Greece at the Greek Blogger Camp.  This year I&#8217;ve been in Amsterdam at The Next Web Conference.  At both events I&#8217;ve chatted with a lot of people from all over Europe and the USA.  I&#8217;ve also been all over forums and job web sites both local and foreign.  And the feeling I&#8217;ve got is that the problem is not Cyprus specific, although, of course, Cyprus has it a bit worse than others, due to its position in the technology world, as well as geographical location.</p>
<p>While still spending a lot of time looking for a <acronym title="Hypertext PreProcessing">PHP</acronym> programmer, I was thinking about the roots of the problem.  <acronym title="Hypertext PreProcessing">PHP</acronym> seems to be quite a popular language.  So, why is it such a problem to find a good <acronym title="Hypertext PreProcessing">PHP</acronym> programmer? (note: &#8220;good&#8221;, not &#8220;great&#8221; or even &#8220;very good&#8221;) Thinking about the roots of the problem, I got this theory, which isn&#8217;t even a theory yet, but rather a raw chain of assumptions and conclusions.  Here is how it goes.</p>
<p><strong><acronym title="Hypertext PreProcessing">PHP</acronym> is an ugly language</strong></p>
<p>I know a few good programmers personally.  I also read blogs and comments of a few more good programmes on the Web.  And even though many of them use <acronym title="Hypertext PreProcessing">PHP</acronym> often, or even on a daily basis, I don&#8217;t remember anyone of them every saying that they enjoy <acronym title="Hypertext PreProcessing">PHP</acronym>.  If given the choice of a programming language for a new project, they&#8217;ll pick anything - Java, C, Python, Perl, Ruby, Haskell&#8230; Anything, but not <acronym title="Hypertext PreProcessing">PHP</acronym>. <acronym title="Hypertext PreProcessing">PHP</acronym> has its pros, but being a beautiful or convenient language is not one of them.</p>
<p><strong><acronym title="Hypertext PreProcessing">PHP</acronym> is newbie safe</strong></p>
<p>One of the reasons for why <acronym title="Hypertext PreProcessing">PHP</acronym> is so popular is because it is newbie safe.  You don&#8217;t need to know much about anything to start programming in <acronym title="Hypertext PreProcessing">PHP</acronym>.  Most of the hosting companies will provide you with a <acronym title="Hypertext PreProcessing">PHP</acronym> enabled hosting account for just a few dollars a month.  You can write <acronym title="Hypertext PreProcessing">PHP</acronym> in any text editor, so you won&#8217;t need a high end machine or expensive IDE.  <acronym title="Hypertext PreProcessing">PHP</acronym>.net web site has all the documentation and examples that you&#8217;ll ever need, so you don&#8217;t need to study hard in college or pay for subscription to developers&#8217; network.  All of these make <acronym title="Hypertext PreProcessing">PHP</acronym> very attractive to beginner programmers.</p>
<p><strong><acronym title="Hypertext PreProcessing">PHP</acronym> avoidance</strong></p>
<p>Most of the good programmers that I know, have learned <acronym title="Hypertext PreProcessing">PHP</acronym> to some degree.   Most of the bad programmers that I know, have also learned <acronym title="Hypertext PreProcessing">PHP</acronym> to some degree.  But for good programmers <acronym title="Hypertext PreProcessing">PHP</acronym> was either not the first programming language under their belt, or they&#8217;ve moved forward to some other programming language.  Most of the bad programmers that I know, only know one programming language - <acronym title="Hypertext PreProcessing">PHP</acronym> - and they don&#8217;t know it good enough.  So, for good programmers, learning and using <acronym title="Hypertext PreProcessing">PHP</acronym> is more like a temporary state, while for the bad programmers using <acronym title="Hypertext PreProcessing">PHP</acronym> is more like a constant state.</p>
<p><strong><acronym title="Hypertext PreProcessing">PHP</acronym> is rich with secondary reasons</strong></p>
<p>There are many reasons for why <acronym title="Hypertext PreProcessing">PHP</acronym> is so popular.  It is free.  It is open source.  It is easy to setup.  Most hosting companies offer <acronym title="Hypertext PreProcessing">PHP</acronym>-enabled packages, as well as a lot of <acronym title="Hypertext PreProcessing">PHP</acronym> software pre-installed.</p>
<p>With primary technical reasons (execution speeds, required resources, development speed, etc) not being very different from many other programming languages, <acronym title="Hypertext PreProcessing">PHP</acronym> wins a lot of popularity with its secondary powers.</p>
<p><strong><acronym title="Hypertext PreProcessing">PHP</acronym> is getting mature</strong></p>
<p><acronym title="Hypertext PreProcessing">PHP</acronym> started off as a handy Perl library for web development.  It grew and expanded over time.  And so did the projects which were written in <acronym title="Hypertext PreProcessing">PHP</acronym>.  If, before, most of <acronym title="Hypertext PreProcessing">PHP</acronym> scripts were doing the simplest of things, such as contact and registration forms, visitor counters and some templating, then now most projects are closer to full scale applications with user management, financial operations, high availability and load balancing setups, etc.</p>
<p><strong>The moment of conflict</strong></p>
<p>And here comes the moment of conflict.  The complexity of <acronym title="Hypertext PreProcessing">PHP</acronym> applications is growing higher and higher (see above).  And the language is not beautiful enough to attract good programmers and make them stay (see above).  The result?  More and more applications are written by underqualified programmers, and it becomes harder and harder to find qualified personnel (the complexity of your own projects are growing too).</p>
<p><strong>Questions?</strong></p>
<p>How can we attract good programmers to <acronym title="Hypertext PreProcessing">PHP</acronym> development?  What are really the reasons for using <acronym title="Hypertext PreProcessing">PHP</acronym> all that often, if it shares the biggest problem with the other languages - impossibility of finding qualified personnel.  Is there any other programming language that can solve this problem?  Is there any solution at all?</p>
<p><strong>Solutions</strong></p>
<p>These, of course, I don&#8217;t have, as usual.  But.  I am looking with interest at hosted application services.  The ones like from Amazon and Google.  I think these will mature of the next few month and years.  And there will be a few more (Yahoo, Microsoft, and IBM maybe?).</p>
<p>The way I see hosted application services is like this.  They will split the programmers into two categories.  The first category will be all those novice programmers, who don&#8217;t know how or don&#8217;t have the resources to take care of everything.  They&#8217;ll be using hosting, databases, libraries, and programming interfaces provided by hosting application services. (Of course, good programmers will be using these too, but they will have a choice, not like the newbies).  Hosted application services will (not yet though) make it easy to cover the ignorance and help to make a few bucks here and there.  Exactly like <acronym title="Hypertext PreProcessing">PHP</acronym> has been doing it for years now.  The good programmers though will mostly participate in in-house projects and customization developments, which won&#8217;t be fitting into hosted application services, and will require additional knowledge and experience.</p>
<p><strong>Summary</strong></p>
<p>If you are a <acronym title="Hypertext PreProcessing">PHP</acronym> developer looking for a job in Cyprus, please <a href="http://mamchenkov.net/wordpress/contact-me/" >let me know</a>.</p><!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://mamchenkov.net/wordpress/2008/06/04/where-did-all-the-php-programmers-go/feed/</wfw:commentRss>
		</item>
		<item>
		<title>More on PHP</title>
		<link>http://mamchenkov.net/wordpress/2008/05/21/more-on-php/</link>
		<comments>http://mamchenkov.net/wordpress/2008/05/21/more-on-php/#comments</comments>
		<pubDate>Wed, 21 May 2008 12:19:52 +0000</pubDate>
		<dc:creator>Leonid Mamchenkov</dc:creator>
		
		<category><![CDATA[All]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[languages]]></category>

		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://mamchenkov.net/wordpress/?p=11208</guid>
		<description><![CDATA[I&#8217;ve recently posted some of my thoughts on PHP.  If you enjoy the topic, here is an excellent post over at Coding Horror, which reminds why PHP sucks so badly and also why it will stick around for some time to come.]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>I&#8217;ve recently posted some of <a href="http://mamchenkov.net/wordpress/2008/05/19/php-6-hopefully-not-the-end-of-the-road/"title="PHP 6 - hopefully not the end of the road"  >my thoughts on <acronym title="Hypertext PreProcessing">PHP</acronym></a>.  If you enjoy the topic, here is an <a href="http://www.codinghorror.com/blog/archives/001119.html"title="PHP Sucks, But It Doesn't Matter"  onclick="javascript:urchinTracker ('/outbound/article/www.codinghorror.com');">excellent post over at Coding Horror,</a> which reminds why <acronym title="Hypertext PreProcessing">PHP</acronym> sucks so badly and also why it will stick around for some time to come.</p><!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://mamchenkov.net/wordpress/2008/05/21/more-on-php/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PHP 6 - hopefully not the end of the road</title>
		<link>http://mamchenkov.net/wordpress/2008/05/19/php-6-hopefully-not-the-end-of-the-road/</link>
		<comments>http://mamchenkov.net/wordpress/2008/05/19/php-6-hopefully-not-the-end-of-the-road/#comments</comments>
		<pubDate>Mon, 19 May 2008 08:18:25 +0000</pubDate>
		<dc:creator>Leonid Mamchenkov</dc:creator>
		
		<category><![CDATA[All]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[languages]]></category>

		<category><![CDATA[Perl]]></category>

		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://mamchenkov.net/wordpress/?p=11200</guid>
		<description><![CDATA[I&#8217;ve heard plenty of positive buzz about PHP 6 in the last few weeks.  Yes, it&#8217;s coming out.  Yes, it brings quite a few improvements, including better Unicode support, better security, and more help for larger projects through namespaces.  However, I hope that it won&#8217;t be the last PHP release, since there are so many [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>I&#8217;ve heard plenty of positive <a href="http://blogsearch.google.com/blogsearch?q=%22php+6%22"title="Google Blog Search results for 'php 6'"  onclick="javascript:urchinTracker ('/outbound/article/blogsearch.google.com');">buzz about <acronym title="Hypertext PreProcessing">PHP</acronym> 6</a> in the last few weeks.  Yes, it&#8217;s coming out.  Yes, it brings quite a few improvements, including better Unicode support, better security, and more help for larger projects through namespaces.  However, I hope that it won&#8217;t be the last <acronym title="Hypertext PreProcessing">PHP</acronym> release, since there are so many other things that need fixing.</p>
<p>Here is <a href="http://www.tnx.nl/php"title="PHP in contrast to Perl"  onclick="javascript:urchinTracker ('/outbound/article/www.tnx.nl');">a good overview</a>, as compared to the best programming language ever - Perl.  But this probably reminds you of a <a href="http://www.jokes-o-matic.com/jokes/Euro-English-Instead-of-German.html" onclick="javascript:urchinTracker ('/outbound/article/www.jokes-o-matic.com');">famous Euro-English joke</a>, no?   But I do miss sigils and proper hashes.  I&#8217;d love to see better memory management when programming objects.  I&#8217;d love to see improved database interfaces with prepared statements and database abstraction layer.  I would really welcome a cleanup in function names and return values. I &#8230; I &#8230; I &#8230; I hope that <acronym title="Hypertext PreProcessing">PHP</acronym> 6 is not the end of the road, and that <acronym title="Hypertext PreProcessing">PHP</acronym> 7, <acronym title="Hypertext PreProcessing">PHP</acronym> 8, and <acronym title="Hypertext PreProcessing">PHP</acronym> 9 will follow.</p><!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://mamchenkov.net/wordpress/2008/05/19/php-6-hopefully-not-the-end-of-the-road/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
