<?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:blogger='http://schemas.google.com/blogger/2008' 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-3186574916549921356</id><updated>2025-11-10T20:11:13.648+05:30</updated><category term="agile"/><category term="inception"/><category term="architecture"/><category term="CMS"/><category term="DPA"/><category term="QA"/><category term="agile project inception"/><category term="data anonymization"/><category term="data masking"/><category term="data protection act"/><category term="data sanitisation"/><category term="data security"/><category term="inception game"/><category term="software testing"/><category term="RWD"/><category term="amazon"/><category term="aws"/><category term="blacklist"/><category term="communication plan"/><category term="continuos delivery"/><category term="cross functional requirement"/><category term="design pattern"/><category term="devops"/><category term="distributed team"/><category term="glossary terms"/><category term="html5"/><category term="https"/><category term="mongodb"/><category term="non functional requirement"/><category term="non-blocking architecture"/><category term="nosql"/><category term="performance"/><category term="process map"/><category term="product map"/><category term="production dump"/><category term="project inception"/><category term="project management"/><category term="pubnub"/><category term="push notification"/><category term="pusher"/><category term="requirement study"/><category term="responsive web design"/><category term="s3"/><category term="scalability"/><category term="software architecture"/><category term="software delivery"/><category term="system study"/><category term="term cloud"/><category term="testing"/><category term="timeline"/><category term="web 2.0"/><category term="websockets"/><category term="whitelist"/><title type='text'>sUnit blog space: moved to http://www.sunitparekh.in/home</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://sunitspace.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://sunitspace.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15892638558536899020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3186574916549921356.post-4089203443941950454</id><published>2014-09-08T15:32:00.004+05:30</published><updated>2014-09-08T15:32:43.180+05:30</updated><title type='text'>Blog moved to http://www.sunitparekh.in/home</title><content type='html'>&lt;h2&gt;
&lt;a href=&quot;http://www.sunitparekh.in/home&quot; target=&quot;_blank&quot;&gt;Blog moved to http://www.sunitparekh.in/home&lt;/a&gt;&lt;/h2&gt;
</content><link rel='replies' type='application/atom+xml' href='http://sunitspace.blogspot.com/feeds/4089203443941950454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sunitspace.blogspot.com/2014/09/blog-moved-to-httpwwwsunitparekhinhome.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/4089203443941950454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/4089203443941950454'/><link rel='alternate' type='text/html' href='http://sunitspace.blogspot.com/2014/09/blog-moved-to-httpwwwsunitparekhinhome.html' title='Blog moved to http://www.sunitparekh.in/home'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15892638558536899020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3186574916549921356.post-8579213348566102148</id><published>2013-10-23T21:35:00.002+05:30</published><updated>2013-10-23T22:43:23.712+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="agile"/><category scheme="http://www.blogger.com/atom/ns#" term="continuos delivery"/><category scheme="http://www.blogger.com/atom/ns#" term="devops"/><category scheme="http://www.blogger.com/atom/ns#" term="software delivery"/><title type='text'>Zero downtime during deployment using modified blue-green deployment strategy</title><content type='html'>&lt;b&gt;Zero downtime during application deployment&lt;/b&gt; is one of the key requirements for continuos delivery. And no business would like their site to be down and showing maintenance page every few days/weeks during deployment.&lt;br /&gt;
&lt;br /&gt;
To achieve this we decide to go for &lt;a href=&quot;http://martinfowler.com/bliki/BlueGreenDeployment.html&quot; target=&quot;_blank&quot;&gt;blue-green deployment&lt;/a&gt;. However, we were challenged with how to do this in legacy style infrastructure where we are,&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Not able to spin new machines dynamically and throw away stacks&lt;/li&gt;
&lt;li&gt;Don&#39; have ability to add/remove instances dynamically using scripts from load-balancer&lt;/li&gt;
&lt;li&gt;Network level configurations are done manually like firewall setting&lt;/li&gt;
&lt;/ol&gt;
Also keeping full in-active stack didn&#39;t sound good idea. Now we had to made some modifications to achieve zero downtime using blue-green deployment.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Decision 1:&lt;/u&gt; We took out database from the application deployment stack. Since we were using NoSQL MongoDB database, it didn&#39;t require any schema migration etc. However, we required to follow design principle, &lt;b&gt;always write code which is backward compatible with the data models&lt;/b&gt;. And if there is any database migration required it should be run after deployment.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Decision 2:&lt;/u&gt; Use RPM to package apps and run like a service to start and stop. This enabled us to deploy application easily with the standard chef recipes. All application components are packaged as RPMs and published to repository from CI pipeline.&amp;nbsp;&lt;b&gt;Standardise&amp;nbsp;deployment process across all components/application. &lt;/b&gt;We used &lt;a href=&quot;https://github.com/jordansissel/fpm/wiki&quot; target=&quot;_blank&quot;&gt;FPM&lt;/a&gt; gem to build RPMs.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Decision 3:&lt;/u&gt; All application/component should provide 2 state heartbeat, &lt;i&gt;live&lt;/i&gt; or &lt;i&gt;standby,&lt;/i&gt; with ability to change the current state of the heartbeat at runtime using api call. Configure one load-balance to listen to &lt;i&gt;live&lt;/i&gt; heartbeat and another to &lt;i&gt;standby&lt;/i&gt;. &lt;b&gt;Allows to add/remove instances from load-balancer by changing heartbeat state.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
And with above changes the deployment steps are,&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAE4yUudHPk_MsSDVFSNCexjc0G1jQvHZS0j0eyuh-T3QA8JzZPuOIQFGyFqhdX98zYmGAZW6z9y4fYDvgtiGik5DImxFGh_7DU6dCf2cnhFWZQXGdcTmmLZ9_JAkR6NVkZlCena9KCBA/s1600/Blue+Green+Deployment+for+Zero+Downtime+(8).png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;172&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAE4yUudHPk_MsSDVFSNCexjc0G1jQvHZS0j0eyuh-T3QA8JzZPuOIQFGyFqhdX98zYmGAZW6z9y4fYDvgtiGik5DImxFGh_7DU6dCf2cnhFWZQXGdcTmmLZ9_JAkR6NVkZlCena9KCBA/s640/Blue+Green+Deployment+for+Zero+Downtime+(8).png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;b&gt;Step 1:&lt;/b&gt; Change heartbeat of the green stack&amp;nbsp;to state &#39;standby&#39;. This will remove green stack&amp;nbsp;from LIVE load-balancer pool and no new request send to green stack.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKZgdI4LBiZSzPNC52jXHxarC0_tmHucmQY4Kelhbv4Lagu7JziF8C-fNCfmLqZRTLnfDMSHAjsYRNVKys9qn7tMl0PSFpyiCDdJI0N3r75IEhBmvAMHPG6PU_nbugY6cJk9r3nEzjkgY/s1600/Blue+Green+Deployment+for+Zero+Downtime+(9).png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;172&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKZgdI4LBiZSzPNC52jXHxarC0_tmHucmQY4Kelhbv4Lagu7JziF8C-fNCfmLqZRTLnfDMSHAjsYRNVKys9qn7tMl0PSFpyiCDdJI0N3r75IEhBmvAMHPG6PU_nbugY6cJk9r3nEzjkgY/s640/Blue+Green+Deployment+for+Zero+Downtime+(9).png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;b&gt;Step 2:&lt;/b&gt;&amp;nbsp;Deploy latest version of the application to green stack. Wait sometime to complete&amp;nbsp;the inflight request on green stack before deployment.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmRf_ysDi1o0iMRLl0ZQiPsTJ2Jf-Fo6mIfklYOYjIK7kaJEgscWRw9gbrttqoFz4ayMGaAfae6Dg6mJBdDF8_wzFmOvDXd_hoUOOJNxOVMdmP1xLA2y8LN5ATB_kHrTEHjSP6yjJ6hhI/s1600/Blue+Green+Deployment+for+Zero+Downtime+(3).png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;172&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmRf_ysDi1o0iMRLl0ZQiPsTJ2Jf-Fo6mIfklYOYjIK7kaJEgscWRw9gbrttqoFz4ayMGaAfae6Dg6mJBdDF8_wzFmOvDXd_hoUOOJNxOVMdmP1xLA2y8LN5ATB_kHrTEHjSP6yjJ6hhI/s640/Blue+Green+Deployment+for+Zero+Downtime+(3).png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;b&gt;Step 3:&lt;/b&gt;&amp;nbsp;Sanity test green stack&amp;nbsp;using standby load-balancer. Ideally automated, this will make sure deployment&amp;nbsp;is good.&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Step 4:&lt;/b&gt;&amp;nbsp;Revert heartbeat of the green stack&amp;nbsp;to state &#39;live&#39;. This will put the green stack&amp;nbsp;back to LIVE load-balancer&amp;nbsp;pool.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5TQqV711qC-9Ucg7GJip9EmPit6f9mXi3JUYFuzr2WT8yLzxHtP0qHWS6-UYdo1DpAsTToeB9as4xqamGe7rTnB6_UmqlBibRDjutPilVfq9J33aVN8bcwliFyls5WL5Y1Bec7tT0GeM/s1600/Blue+Green+Deployment+for+Zero+Downtime+(4).png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;172&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5TQqV711qC-9Ucg7GJip9EmPit6f9mXi3JUYFuzr2WT8yLzxHtP0qHWS6-UYdo1DpAsTToeB9as4xqamGe7rTnB6_UmqlBibRDjutPilVfq9J33aVN8bcwliFyls5WL5Y1Bec7tT0GeM/s640/Blue+Green+Deployment+for+Zero+Downtime+(4).png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
If you notice the blue stack running on v1 and green stack running on v2. And both the stacks are connected to same database. Which means v2 codebase should work with old data models. And if there is any database migration should be carried only after all stack upgraded to latest version.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Step 5:&lt;/b&gt; Repeat above steps for blue stack,&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNVfC0XHMMHJ_7UdtK-2rm8mg3zUNlh6agQRaSZPYqCE848EN3vRRTW8YnwfsLUAhNM7E85FPBE-kYjFuoLBEyEjSamg868xZGStedg0jOU0wc6wkKCgmQrBfUPOVFLudnu_djPamVP_8/s1600/Blue+Green+Deployment+for+Zero+Downtime+(5).png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;172&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNVfC0XHMMHJ_7UdtK-2rm8mg3zUNlh6agQRaSZPYqCE848EN3vRRTW8YnwfsLUAhNM7E85FPBE-kYjFuoLBEyEjSamg868xZGStedg0jOU0wc6wkKCgmQrBfUPOVFLudnu_djPamVP_8/s640/Blue+Green+Deployment+for+Zero+Downtime+(5).png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_dQJfFdbkb78bWtm4bZ3ZqY8t6cJAwm6JHsB9KCxOjZQ2WGrLs-KxVAx_bHM5p0Xm_gCbUJBCyqDaOArnsu03-BzZqO7MHEh-Ooo6qoI1skUcRzfgbEQ3rYIUrE_iDqRxNid3PZSzwro/s1600/Blue+Green+Deployment+for+Zero+Downtime+(6).png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;172&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_dQJfFdbkb78bWtm4bZ3ZqY8t6cJAwm6JHsB9KCxOjZQ2WGrLs-KxVAx_bHM5p0Xm_gCbUJBCyqDaOArnsu03-BzZqO7MHEh-Ooo6qoI1skUcRzfgbEQ3rYIUrE_iDqRxNid3PZSzwro/s640/Blue+Green+Deployment+for+Zero+Downtime+(6).png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
And finally v2 deployed fully,&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzBKisASkp7BnodhX26D6DolKS-9xgTMuOEk0jxR0MpxWJLVF1iv_9xvQZmokeFRUR8rKX4vuf7xSL2wMTPsIKVrCvisajGofky1l03livR6VjEUvl3kcSOJe5gDIp1ORKzboZc1OsGJY/s1600/Blue+Green+Deployment+for+Zero+Downtime+(7).png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;172&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzBKisASkp7BnodhX26D6DolKS-9xgTMuOEk0jxR0MpxWJLVF1iv_9xvQZmokeFRUR8rKX4vuf7xSL2wMTPsIKVrCvisajGofky1l03livR6VjEUvl3kcSOJe5gDIp1ORKzboZc1OsGJY/s640/Blue+Green+Deployment+for+Zero+Downtime+(7).png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;b&gt;Step 6:&lt;/b&gt;&amp;nbsp;Optional, run database migration (independent of the deployment)&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
What we achieved is, at any give point of time either blue or green&amp;nbsp;stack&amp;nbsp;is actively servicing the requests&amp;nbsp;without downtime. &amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
However, the one point to note here is that during deployment only half capacity available, which means deployment should be avoided at peak load time.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://sunitspace.blogspot.com/feeds/8579213348566102148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sunitspace.blogspot.com/2013/10/blue-green-deployment.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/8579213348566102148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/8579213348566102148'/><link rel='alternate' type='text/html' href='http://sunitspace.blogspot.com/2013/10/blue-green-deployment.html' title='Zero downtime during deployment using modified blue-green deployment strategy'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15892638558536899020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAE4yUudHPk_MsSDVFSNCexjc0G1jQvHZS0j0eyuh-T3QA8JzZPuOIQFGyFqhdX98zYmGAZW6z9y4fYDvgtiGik5DImxFGh_7DU6dCf2cnhFWZQXGdcTmmLZ9_JAkR6NVkZlCena9KCBA/s72-c/Blue+Green+Deployment+for+Zero+Downtime+(8).png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3186574916549921356.post-1214915597137151064</id><published>2013-05-07T15:30:00.002+05:30</published><updated>2013-05-07T15:30:33.426+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="design pattern"/><category scheme="http://www.blogger.com/atom/ns#" term="non-blocking architecture"/><category scheme="http://www.blogger.com/atom/ns#" term="performance"/><category scheme="http://www.blogger.com/atom/ns#" term="scalability"/><category scheme="http://www.blogger.com/atom/ns#" term="software architecture"/><title type='text'>Building highly scalable and performant application using non blocking architecture</title><content type='html'>I have been working on web application development since last 12+ years and had&amp;nbsp;privileged&amp;nbsp;to work on more than 20+ different project. Now days the&amp;nbsp;expectations&amp;nbsp;from web apps are totally different than it was few years back. End users are provided with rich content on single page (Amazon, CNN, ...). On a single page, lots of data needs to be mashed up and data may come from different sources.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizXrpLOAJvZNjXpguzHsTM02x2wiCLy-C2o6g6P0TfTHG7vn8OSv2pGhvPTobUdR1syNmCuoMThvd0lvDKmmTffOOmi5zjbH0QKl4eop55zGlKmlgus5_MqA3LPL_qwPjf0euf_hlkq6U/s1600/Slide05.jpg&quot; imageanchor=&quot;1&quot; style=&quot;display: inline !important; margin-left: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizXrpLOAJvZNjXpguzHsTM02x2wiCLy-C2o6g6P0TfTHG7vn8OSv2pGhvPTobUdR1syNmCuoMThvd0lvDKmmTffOOmi5zjbH0QKl4eop55zGlKmlgus5_MqA3LPL_qwPjf0euf_hlkq6U/s640/Slide05.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
We know how to put together the N-tier architecture.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-DUMRrgu_4Q2Dv-yX9lfYYJDgoM4EAKLZSJJXiYx1hm2W-KnQPA3qKVttJ9O7gxUoe375nPfIZ-kQOLi1242y-yyvsZtnMRZf2bIuvqHx5ywKglyh7Aw1kzXIqGUxJaPesgWE1ZfA6X4/s1600/Slide06.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;307&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-DUMRrgu_4Q2Dv-yX9lfYYJDgoM4EAKLZSJJXiYx1hm2W-KnQPA3qKVttJ9O7gxUoe375nPfIZ-kQOLi1242y-yyvsZtnMRZf2bIuvqHx5ywKglyh7Aw1kzXIqGUxJaPesgWE1ZfA6X4/s640/Slide06.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
And the request workflow will be as following,&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQzLIKtA9dP9TNYxvOVNbHvVEN-Tz8TGv98E-8YEO0Erk7gUEgePxAP20AfWspuXuvK9Z4r7Kwf4ADc9SPDhrEtpUeT9U6K6rIn8GnMDNDM3m8zsqniln3vdxUmyeLP3vwb3ANLry-SGU/s1600/Slide07.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQzLIKtA9dP9TNYxvOVNbHvVEN-Tz8TGv98E-8YEO0Erk7gUEgePxAP20AfWspuXuvK9Z4r7Kwf4ADc9SPDhrEtpUeT9U6K6rIn8GnMDNDM3m8zsqniln3vdxUmyeLP3vwb3ANLry-SGU/s640/Slide07.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Now if we notice the above workflow, it is sequential and most of the time thread on web server and app server spend is waiting for response form app server and database respectively rather than doing some meaningful work (processing). This is what is called BLOCKING. Lets take same example and try to draw web server thread timeline.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVfBc__U3k79mkNvTcqKnEqLrboQWcVvSDsU8oD_HIOmGqnPMsBDNko2WuLiJfcarkMnFMeDEBMn0SjzbtQCSCtSs4wudl6rXffAhL__piUa-WZE8fWry94_4C5JA5hxq6PIwRr3hppk8/s1600/Slide08-1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;161&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVfBc__U3k79mkNvTcqKnEqLrboQWcVvSDsU8oD_HIOmGqnPMsBDNko2WuLiJfcarkMnFMeDEBMn0SjzbtQCSCtSs4wudl6rXffAhL__piUa-WZE8fWry94_4C5JA5hxq6PIwRr3hppk8/s640/Slide08-1.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTX1HpluZlMOQ4Wcy9M5W1PAXfwcvbSYstzPTkbnZmBZU-beuvUl1AkKRw-NQVZbSPtLTfDGIpWwMZ5fM0pDiSnpIfKqk55JVk9-UvZrRSgYZ3XN9mJZ1ObdctaR125fuvz0Ptj4DZVlY/s1600/Slide08-2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;33&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTX1HpluZlMOQ4Wcy9M5W1PAXfwcvbSYstzPTkbnZmBZU-beuvUl1AkKRw-NQVZbSPtLTfDGIpWwMZ5fM0pDiSnpIfKqk55JVk9-UvZrRSgYZ3XN9mJZ1ObdctaR125fuvz0Ptj4DZVlY/s320/Slide08-2.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
RED is time spend by thread waiting for response/result from app server. And GREEN is the time spend doing some meaningful processing by web server. In above example it was total 10 sec response time and 1 thread involved in processing. Lets assume that above 3 calls to app server can be parallelise to optimise response time to end user.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYIqg378SCQi95gS6cFkxK0swX3tndQdkx7JTmgDPtChSMVHWl8zWJ7SwFcmqo_Nyemz3P-B8hGatOwJEslhxrcSt3zwNxRE77j9B9csMGZdYAiaaQHYZ5nzsBLojB7n3OE7sEGPwTyRg/s1600/Slide10-1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;170&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYIqg378SCQi95gS6cFkxK0swX3tndQdkx7JTmgDPtChSMVHWl8zWJ7SwFcmqo_Nyemz3P-B8hGatOwJEslhxrcSt3zwNxRE77j9B9csMGZdYAiaaQHYZ5nzsBLojB7n3OE7sEGPwTyRg/s400/Slide10-1.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
In parallel processing the response time was reduced to 7 sec. However, total 4 threads participated in processing and in total 13 sec of thread time it took. Again here also the processing was BLOCKING. Which means parallel processing provides better performance in terms of response time, but required more resources to process the request.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What we need is parallel processing with non-blocking threads.&lt;/b&gt; Means when the thread is waiting for the response from other systems, it should be made available to do some other meaningful work. Something like following,&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW787aDLjRIDff0hdVrTwQ4gqo3E5QYKrFc18GRLWOoXTnWAnGEWNxpuZExAjmXF1el7-Bypqm9rOCsyt3irVfExHA2mwKZ5B4ugShRHwOiIlA0K97K11FHGCQmIN-M11vldBhdaWJyfQ/s1600/Slide15-1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;267&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW787aDLjRIDff0hdVrTwQ4gqo3E5QYKrFc18GRLWOoXTnWAnGEWNxpuZExAjmXF1el7-Bypqm9rOCsyt3irVfExHA2mwKZ5B4ugShRHwOiIlA0K97K11FHGCQmIN-M11vldBhdaWJyfQ/s640/Slide15-1.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
If we can achieve non-blocking architecture than the response time goes down to as low as 5 sec. And also consumes less thread resources. Now the question is how I can achieve this? In today&#39;s polygot programming world, we have&amp;nbsp;plenty&amp;nbsp;of alternatives available.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrtp7599qXomqQ-E4bYRgI_15hGZTJ8VEdFPhStCy16Czm1x0MEDpMkbyibRw5VGYybaFUsG2HTGhPoxgu54IlV316177l6fYqjh67MIJohcCksbFMPERQIZm3_6C-JePmhnFBaDvSW9c/s1600/Slide23.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrtp7599qXomqQ-E4bYRgI_15hGZTJ8VEdFPhStCy16Czm1x0MEDpMkbyibRw5VGYybaFUsG2HTGhPoxgu54IlV316177l6fYqjh67MIJohcCksbFMPERQIZm3_6C-JePmhnFBaDvSW9c/s400/Slide23.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Non-blocking is not new, Nginx is event based and uses&amp;nbsp;similar&amp;nbsp;principle, Messsage based architecture is another classical example to solve similar problems, however that brings in asynchronous complexity. &amp;nbsp;MongoDB and similar polygot&amp;nbsp;persistence&amp;nbsp;works on same principles and provides eventual&amp;nbsp;consistency.&lt;br /&gt;
&lt;br /&gt;
I recommend trying out following technology/framework choices to achieve non-blocking&amp;nbsp;architecture,&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;&lt;a href=&quot;http://nodejs.org/&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;NodeJS&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;, this is the most popular choice so far in today&#39;s technology choices. And &lt;a href=&quot;http://www.modrails.com/&quot; target=&quot;_blank&quot;&gt;Passanger&lt;/a&gt; can provide NodeJS cluster running multiple process on one machine. However, programming in NodeJS is all about callbacks. And lots of OO programmers don&#39;t like it. There are plenty of frameworks in NodeJS for web application, the popular ones are is &lt;a href=&quot;http://expressjs.com/&quot; target=&quot;_blank&quot;&gt;express.js&lt;/a&gt;, &lt;a href=&quot;http://meteor.com/&quot; target=&quot;_blank&quot;&gt;meteor&lt;/a&gt; ...&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href=&quot;http://www.playframework.com/&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;Play Framework&lt;/span&gt;&lt;/a&gt; 2.1.1&lt;/b&gt;, this is Scala based web application framework. &lt;i&gt;Framework is&amp;nbsp;very mature and easy to adpat for Java shop organisations&lt;/i&gt;. It uses internally Netty, Scala and Akka and provides very nice abstracts to avoids callbacks hell. Based on Scala means love for OO programmers as well. Akka can also be used&amp;nbsp;independently.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;i&gt;&lt;u&gt;Disclaimer:&lt;/u&gt;&lt;/i&gt; Consider non-blocking architecture when your application have blocking calls and wait times. If your application has more about computation/processing and less or negligible blocking/waiting time the above architecture pattern may not provide better or favorable results.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://sunitspace.blogspot.com/feeds/1214915597137151064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sunitspace.blogspot.com/2013/05/scalable-non-blocking-architecture.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/1214915597137151064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/1214915597137151064'/><link rel='alternate' type='text/html' href='http://sunitspace.blogspot.com/2013/05/scalable-non-blocking-architecture.html' title='Building highly scalable and performant application using non blocking architecture'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15892638558536899020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizXrpLOAJvZNjXpguzHsTM02x2wiCLy-C2o6g6P0TfTHG7vn8OSv2pGhvPTobUdR1syNmCuoMThvd0lvDKmmTffOOmi5zjbH0QKl4eop55zGlKmlgus5_MqA3LPL_qwPjf0euf_hlkq6U/s72-c/Slide05.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3186574916549921356.post-797004800199379004</id><published>2013-05-04T20:50:00.002+05:30</published><updated>2013-05-04T20:50:15.058+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="agile"/><category scheme="http://www.blogger.com/atom/ns#" term="cross functional requirement"/><category scheme="http://www.blogger.com/atom/ns#" term="inception"/><category scheme="http://www.blogger.com/atom/ns#" term="non functional requirement"/><title type='text'>Identifying Cross-Functional and Non-Functional requirement during agile project inception</title><content type='html'>It&#39;s always been difficult to identify and easy to miss-out on creating stories for cross functional requirement (XFR) a.k.a NonFunctional requirements (NFR) during inception. Inception is a short, time boxed, 2-3 weeks initial requirement gathering phase of the software development project lifecycle. I have been to multiple inception and figured out a nice and&amp;nbsp;collaborating&amp;nbsp;way of capturing and converting cross functional requirements into stories. We run it like a workshops, collaborating with&amp;nbsp;client to identify and capture XFRs.&lt;br /&gt;
&lt;br /&gt;
After understanding and going to functional requirement, plan for XFR session with all the members of the team including stakeholders. We have list of XFRs printed on the cards at ThoughtWorks similar to the one shown below.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlZGMOvYxhusiS7Gp30OSZOWj9tHiR-yi4RPjjmCakhib680Jb-AKxdWbiVw8Far_-SbHlmutmJWNn4ai0RSWceBtPi1E6We352fLKVphhaiO8ntbkRzrPt8Twx2G6uDRk3HZWptR7Z_Y/s1600/cards.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img alt=&quot;sample cross functional cards&quot; border=&quot;0&quot; height=&quot;149&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlZGMOvYxhusiS7Gp30OSZOWj9tHiR-yi4RPjjmCakhib680Jb-AKxdWbiVw8Far_-SbHlmutmJWNn4ai0RSWceBtPi1E6We352fLKVphhaiO8ntbkRzrPt8Twx2G6uDRk3HZWptR7Z_Y/s200/cards.png&quot; title=&quot;&quot; width=&quot;200&quot; /&gt;&amp;nbsp;&lt;/a&gt;&lt;br /&gt;
There are around 35 such &quot;bility&quot; that need to be discussed. During the session we take one &#39;bility&#39; at a time and not down on stickies what are the requirements related to that &#39;bility&#39;. It is important to discuss each and every &#39;bility&#39; and there is a&amp;nbsp;possibility&amp;nbsp;few are not application to the project we are working on. Mark them as NA.&lt;br /&gt;
&lt;br /&gt;
Once all the &#39;bility&#39; is discussed break out in small team, discuss each XFR requirements and convert them into stories.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdsr3vmgHnAZmHAGSggwQ9VDR6k73q3D1XCB93eINh5WmUrzdneNJE6lExuYTGOvx3OOlml5TnzkUr6AvltsZAyvbi-LE83KHdrVSP0JiW310-Zz3A3rXi8XwZ9oe62VvHZmzSuM8Iu8c/s1600/cards_with_stories_low_rez.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;193&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdsr3vmgHnAZmHAGSggwQ9VDR6k73q3D1XCB93eINh5WmUrzdneNJE6lExuYTGOvx3OOlml5TnzkUr6AvltsZAyvbi-LE83KHdrVSP0JiW310-Zz3A3rXi8XwZ9oe62VvHZmzSuM8Iu8c/s640/cards_with_stories_low_rez.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
After creating the story list of XFRs, treat them as other stories. Combine the backlog of functional and XFR stories, estimate and&amp;nbsp;prioritise&amp;nbsp;stories together.&lt;br /&gt;
&lt;br /&gt;
As&amp;nbsp;documentation,&amp;nbsp; I like to use mind map since it fits that format nicely. Please have a look at the one displayed below for your reference.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgumbB8ABU4et__LjR8B6JqK38XSzNF7SyWkPeNyvJNVuUVregLnxeePXro0xe7i_F3q7sFTeBX9-oTMmkUR9tReMq0PN3yOoLi1I1Lt-DYbnntw8WCX9roqOqx5Pjhsoq5gFLcLMbxZSk/s1600/cross+functional+requirements+mind+map.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;208&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgumbB8ABU4et__LjR8B6JqK38XSzNF7SyWkPeNyvJNVuUVregLnxeePXro0xe7i_F3q7sFTeBX9-oTMmkUR9tReMq0PN3yOoLi1I1Lt-DYbnntw8WCX9roqOqx5Pjhsoq5gFLcLMbxZSk/s640/cross+functional+requirements+mind+map.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br class=&quot;Apple-interchange-newline&quot; /&gt;I like more calling NFRs as cross functional requirements rather than non-functional, since most of the non-functional requirements are kind of indirect functional requirements. e.g. page load time for end user is performance requirement which indirectly related to better user experience.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://sunitspace.blogspot.com/feeds/797004800199379004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sunitspace.blogspot.com/2013/05/identifying-cross-functional-and-non.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/797004800199379004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/797004800199379004'/><link rel='alternate' type='text/html' href='http://sunitspace.blogspot.com/2013/05/identifying-cross-functional-and-non.html' title='Identifying Cross-Functional and Non-Functional requirement during agile project inception'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15892638558536899020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlZGMOvYxhusiS7Gp30OSZOWj9tHiR-yi4RPjjmCakhib680Jb-AKxdWbiVw8Far_-SbHlmutmJWNn4ai0RSWceBtPi1E6We352fLKVphhaiO8ntbkRzrPt8Twx2G6uDRk3HZWptR7Z_Y/s72-c/cards.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3186574916549921356.post-4327799560166149517</id><published>2013-02-12T11:16:00.001+05:30</published><updated>2013-02-12T11:16:04.550+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="responsive web design"/><category scheme="http://www.blogger.com/atom/ns#" term="RWD"/><title type='text'>Why Responsive Web Design?</title><content type='html'>&lt;div&gt;
Lots of time when I discuss Responsive Web Design (RWD), I realise that we don&#39;t understand the problem we try to solve with RWD. And the objective of this blog post is look into the history and learn what problem we try to solve with RWD.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The multiple device/screen size/resolution problem is not new, even in old days the monitors had &amp;nbsp;different screen resolution. The problem exist from old days.&lt;i&gt; In &lt;b&gt;first attempt&lt;/b&gt; we solved multiple screen resolution problem with Fixed Width web page design (&lt;b&gt;Fixed Width Layout Approach&lt;/b&gt;).&lt;/i&gt; &amp;nbsp;960px based fixed width design were very common for websites. One of the most popular CSS framework with fixed width was &lt;a href=&quot;http://www.blueprintcss.org/&quot; target=&quot;_blank&quot;&gt;blueprint&lt;/a&gt;. The problem with fixed-width layout is white (empty) space on side of the screens. Designer also used that space by having creative backgrounds for the page.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikdI8sNE2Rm8g7CJNAJFVuS5JkIs5EoB52MbWzTDWHAjQbOv5z734S8ro8JxDeRL_kgRS-nLiTPqmfpeNU4OYzqOStRWCzY_t4Dbynohqav-XdGCApJBcYRdJvG6wXIh3jbvFxrPAZ6qs/s1600/espncricinfo+white+space.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;176&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikdI8sNE2Rm8g7CJNAJFVuS5JkIs5EoB52MbWzTDWHAjQbOv5z734S8ro8JxDeRL_kgRS-nLiTPqmfpeNU4OYzqOStRWCzY_t4Dbynohqav-XdGCApJBcYRdJvG6wXIh3jbvFxrPAZ6qs/s320/espncricinfo+white+space.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0q4cxLQNt75l1jK9Fdyhb1DR3wfBV5fJLtOzKylk6lEpkLV0P1ldtzhueMB3uT7k6_xcMHlKlaeRNxZEV1SYNQ7VB1ajGnSNx-K33SZeLVsAQuVT2TMhJtIE97CTbu08xUYTWPWxNG0g/s1600/apple+with+white+space.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;177&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0q4cxLQNt75l1jK9Fdyhb1DR3wfBV5fJLtOzKylk6lEpkLV0P1ldtzhueMB3uT7k6_xcMHlKlaeRNxZEV1SYNQ7VB1ajGnSNx-K33SZeLVsAQuVT2TMhJtIE97CTbu08xUYTWPWxNG0g/s320/apple+with+white+space.png&quot; width=&quot;320&quot; /&gt;&amp;nbsp;&lt;/a&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The multiple screen resolution problem didn&#39;t go away, after smartphones and tablets the problem became more&amp;nbsp;prominent. &lt;i&gt;In &lt;b&gt;second attempt &lt;/b&gt;to solve the problem, used multiple templates for different devices on server side (&lt;b&gt;Seperate Mobile Website Approach)&lt;/b&gt;. &lt;/i&gt;The downside of using the server side device specific templating is that, HTTP caching can&#39;t be done. Which is non-negociable for scalability, and to overcome caching issues, on first request the application server recognises the browser agent and redirects the site to device specific page like www.cricinfo.com or m.cricinfo.com By using different sites/urls for different devices &amp;nbsp;HTTP caching problem was solved. &amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikdI8sNE2Rm8g7CJNAJFVuS5JkIs5EoB52MbWzTDWHAjQbOv5z734S8ro8JxDeRL_kgRS-nLiTPqmfpeNU4OYzqOStRWCzY_t4Dbynohqav-XdGCApJBcYRdJvG6wXIh3jbvFxrPAZ6qs/s1600/espncricinfo+white+space.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;179&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikdI8sNE2Rm8g7CJNAJFVuS5JkIs5EoB52MbWzTDWHAjQbOv5z734S8ro8JxDeRL_kgRS-nLiTPqmfpeNU4OYzqOStRWCzY_t4Dbynohqav-XdGCApJBcYRdJvG6wXIh3jbvFxrPAZ6qs/s320/espncricinfo+white+space.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin0tS-a433DglAMXjhm9X_lcV0Pq_Ks8chsubA3ochMSumzOzr2X8KaHp192JlG_WW7MeTr0kz6o0U_61ICTQdaSwihGut6EiKdNBYRcnVwER4TVuEyHDGVyJUWfQLgF487U_lu2ZdMNw/s1600/IMG_1748.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin0tS-a433DglAMXjhm9X_lcV0Pq_Ks8chsubA3ochMSumzOzr2X8KaHp192JlG_WW7MeTr0kz6o0U_61ICTQdaSwihGut6EiKdNBYRcnVwER4TVuEyHDGVyJUWfQLgF487U_lu2ZdMNw/s200/IMG_1748.PNG&quot; width=&quot;133&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Try visiting page: &lt;i&gt;&lt;a href=&quot;http://www.guardian.com/&quot;&gt;www.guardian.com&lt;/a&gt;&lt;/i&gt; and &lt;a href=&quot;http://www.cricinfo.com/&quot;&gt;&lt;i&gt;www.cricinfo.com&lt;/i&gt;&lt;/a&gt; on mobile device and notice the redirect.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now the problem started with maintaining multiple sites/applications. Use experience was not consistant across devices. It was very difficult to keep the feature parity across the device specific sites. Application development,&amp;nbsp;maintenance&amp;nbsp;&amp;amp; production cost &amp;amp; effort increased&amp;nbsp;significantly.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
During same time period people realised that we are wasting so much screen real estate by doing the fixed grid layout, and the &lt;a href=&quot;http://fluidgrids.com/&quot; target=&quot;_blank&quot;&gt;fluid grid&lt;/a&gt; layout design started becoming popular for desktops.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu9ktuUW5DgJ0TDsyDQauYhHduQ1S4n11HOUOz-9tF4YV7Co3l8GNbFF7XHmsMSv08PPShUp4PATOfsq4hIesnPcRZ02JlfDHwbF3DL7pNGB5cD1TCbrPDYQfQtttsyJzp0AgQXvctWnQ/s1600/fluid+grid+layout.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;178&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu9ktuUW5DgJ0TDsyDQauYhHduQ1S4n11HOUOz-9tF4YV7Co3l8GNbFF7XHmsMSv08PPShUp4PATOfsq4hIesnPcRZ02JlfDHwbF3DL7pNGB5cD1TCbrPDYQfQtttsyJzp0AgQXvctWnQ/s320/fluid+grid+layout.png&quot; width=&quot;320&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqp14RGdHnIYr_X35RrW0HrVUrGDbDJ_Yu5HUHGYAei4JfwP1aoyBNPR5jpBId0e9X4Y9shrRfLqA4o7W2Ya7YXA_wFLAWzPh0bGuxflINDep3cE680W0bGMc81QQ7ih9_ElvbbsW8qOA/s1600/photo.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqp14RGdHnIYr_X35RrW0HrVUrGDbDJ_Yu5HUHGYAei4JfwP1aoyBNPR5jpBId0e9X4Y9shrRfLqA4o7W2Ya7YXA_wFLAWzPh0bGuxflINDep3cE680W0bGMc81QQ7ih9_ElvbbsW8qOA/s200/photo.PNG&quot; width=&quot;133&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
However, fluid grid system depends&amp;nbsp;heavily&amp;nbsp;on browser support and performance. Making it old browser compatible was a big task.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;i&gt;The latest attempt of providing best viewing experience on all devices &amp;amp; screen resolution at client side (browsers) is known as Responsive Web Design.&lt;/i&gt;&lt;/b&gt; &amp;nbsp;With frameworks like &lt;a href=&quot;http://twitter.github.com/bootstrap/&quot; target=&quot;_blank&quot;&gt;Twitter Bootstrap&lt;/a&gt;, &amp;nbsp;it has become easy to get started learning and using Responsive Web Design concept.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGsrjUP_Hy41nEkCP4LleqRUxhE175WjaU-lccdET1L_wjvZbkIjRh7A7BxtBKvE8J7t5beVSmbzZZokgcUi3s8eiA8zMVX-2-b5mzPljnCEifKtEd9u_Fz6iWlZdfSOb7vXWO-ht_wFY/s1600/Screen+Shot+2013-02-10+at+11.19.28+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;179&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGsrjUP_Hy41nEkCP4LleqRUxhE175WjaU-lccdET1L_wjvZbkIjRh7A7BxtBKvE8J7t5beVSmbzZZokgcUi3s8eiA8zMVX-2-b5mzPljnCEifKtEd9u_Fz6iWlZdfSOb7vXWO-ht_wFY/s320/Screen+Shot+2013-02-10+at+11.19.28+PM.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&amp;nbsp;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglaVhisYOWC6mwA_tGgAs3HNqvzufVcJp2EO6TTPO-WLhErhZdhkfrtMmGC-nmQg-bHIMX1wBF9f8uQLxL-C1WCR6AzY_wtaVHz42nBJ7jcUpuASpDOTaE3AuKUxm7NOlaSmpCr4R1us0/s1600/IMG_1750.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglaVhisYOWC6mwA_tGgAs3HNqvzufVcJp2EO6TTPO-WLhErhZdhkfrtMmGC-nmQg-bHIMX1wBF9f8uQLxL-C1WCR6AzY_wtaVHz42nBJ7jcUpuASpDOTaE3AuKUxm7NOlaSmpCr4R1us0/s200/IMG_1750.PNG&quot; width=&quot;133&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Notice menu, text, links and buttons in above two screenshots. Same site visited in desktop browser and mobile browser.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;i&gt;To achieve HTTP caching it was very important that all this dynamic&amp;nbsp;behaviour&amp;nbsp;to be kept on&amp;nbsp;&lt;b&gt;client side&lt;/b&gt;, so server has to render the same page for all devices irrespective of the screen sizes and resolutions. With this approach HTTP caching CDN/Reverse proxy can be&amp;nbsp;leveraged&amp;nbsp;agin to achieve high scalability.&amp;nbsp;&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Be aware when using Responsive Web Design,&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;i&gt;Works best with latest browsers and high end smartphones,&amp;nbsp;&lt;/i&gt;Since RWD relies heavily on client side&amp;nbsp;optimisation&amp;nbsp;and adoption, client needs be powerful.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Slow internet connection speed will give bad user&amp;nbsp;experience&amp;nbsp;since it might take very long to load page.&amp;nbsp;&lt;/i&gt;Since all content irrespective of the device is transferred to client. Sometime multiple variations are kept like Menu and the overall web page size increases. Specially for mobile the page size might be very large. Checkout the &lt;a href=&quot;https://github.com/twitter/bootstrap&quot; target=&quot;_blank&quot;&gt;size of twitter bootstrap&lt;/a&gt;.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
Next I will talk more about different solutions for achieving responsive web design.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://sunitspace.blogspot.com/feeds/4327799560166149517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sunitspace.blogspot.com/2013/02/why-responsive-web-design.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/4327799560166149517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/4327799560166149517'/><link rel='alternate' type='text/html' href='http://sunitspace.blogspot.com/2013/02/why-responsive-web-design.html' title='Why Responsive Web Design?'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15892638558536899020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikdI8sNE2Rm8g7CJNAJFVuS5JkIs5EoB52MbWzTDWHAjQbOv5z734S8ro8JxDeRL_kgRS-nLiTPqmfpeNU4OYzqOStRWCzY_t4Dbynohqav-XdGCApJBcYRdJvG6wXIh3jbvFxrPAZ6qs/s72-c/espncricinfo+white+space.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3186574916549921356.post-6127132523928284126</id><published>2012-09-04T12:08:00.002+05:30</published><updated>2012-09-04T12:41:30.177+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="blacklist"/><category scheme="http://www.blogger.com/atom/ns#" term="data anonymization"/><category scheme="http://www.blogger.com/atom/ns#" term="data masking"/><category scheme="http://www.blogger.com/atom/ns#" term="data protection act"/><category scheme="http://www.blogger.com/atom/ns#" term="data sanitisation"/><category scheme="http://www.blogger.com/atom/ns#" term="data security"/><category scheme="http://www.blogger.com/atom/ns#" term="DPA"/><category scheme="http://www.blogger.com/atom/ns#" term="QA"/><category scheme="http://www.blogger.com/atom/ns#" term="software testing"/><category scheme="http://www.blogger.com/atom/ns#" term="testing"/><category scheme="http://www.blogger.com/atom/ns#" term="whitelist"/><title type='text'>Data Anonymization approaches Blacklist or Whitelist?</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
Continuation of my previous &lt;a href=&quot;http://sunitspace.blogspot.com/2012/09/data-anonymization.html&quot; target=&quot;_blank&quot;&gt;post&lt;/a&gt; about the need for anonymized production data dump, here is more details on two anonymization approaches blacklist and whitelist. Lets take one simple example and understand both the approaches.&amp;nbsp;Consider two tables of database:&amp;nbsp;&lt;i&gt;Customers&lt;/i&gt;&amp;nbsp;and&amp;nbsp;&lt;i&gt;Config&lt;/i&gt;.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXS0F8RnAagfyvfQ5dGDWXLQwgd_Pl84FAjW2HeF-XH1clwhyphenhyphensZRCkQfn-cNMq47sTEapnwn-s0fwsEOeAMq1Gr4kH6ppsDOdRsYvMJaid7L6Dy4k6D3tV5BJ93qutlMYFRzzMWuwHhbw/s1600/Screen+Shot+2012-09-04+at+10.50.11+AM.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;112&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXS0F8RnAagfyvfQ5dGDWXLQwgd_Pl84FAjW2HeF-XH1clwhyphenhyphensZRCkQfn-cNMq47sTEapnwn-s0fwsEOeAMq1Gr4kH6ppsDOdRsYvMJaid7L6Dy4k6D3tV5BJ93qutlMYFRzzMWuwHhbw/s640/Screen+Shot+2012-09-04+at+10.50.11+AM.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;clear: both;&quot;&gt;
&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Blacklist&lt;/h3&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
This approach essentially leaves all fields unchanged with the exception of those specified by the user, which are scrambled/anonymized (hence the name Blacklist!).&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
For Blacklist, create a copy of the prod database and choose the fields to be anonymized e.g. username, password, email, name, geo location etc. Fields are anonymized based on user-defined rules. Most of the fields have different rules e.g. password should be set to same value for all users, email needs to be valid.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Considering above example. Lets anonymize data&amp;nbsp;using blacklist approach. In above we want to anonymize Customers.Name and Customers.Email, so that we can not identify user. After anonymization the data will look like following.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS6cYzFfFpq4xI7w9DZ48Enk-72neKO9H7vQtwcCe9SKqAz2y8xYxn9RXJu_oDwM0M1Kp9g89c5gGXXriyA0Mtzj9N21wfO2UU3x8v-VLVs_6-bV9FNqbWGvO4WOhFNuq9FGcxQ-3y3Sg/s1600/Screen+Shot+2012-09-04+at+10.48.26+AM.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;112&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS6cYzFfFpq4xI7w9DZ48Enk-72neKO9H7vQtwcCe9SKqAz2y8xYxn9RXJu_oDwM0M1Kp9g89c5gGXXriyA0Mtzj9N21wfO2UU3x8v-VLVs_6-bV9FNqbWGvO4WOhFNuq9FGcxQ-3y3Sg/s640/Screen+Shot+2012-09-04+at+10.48.26+AM.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;clear: both;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Look at the Age field and config table, they remained as is. &amp;nbsp;That is, apart from data specified in anonymization rules, all other data remains as is after anonymization. This could be a data security issue. Such as&amp;nbsp;when new fields are added they will not be anonymized by default. Human error in missing any users personal data could be damaging.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3 style=&quot;text-align: justify;&quot;&gt;
Whitelist&lt;/h3&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
This approach, by default scrambles/anonymizes all fields except a list of fields which are allowed to copied as is. Hence the name whitelist! By default all data needs to be anonymized. So from production database data is sanitized record by record and inserted as anonymized data into destination database. Source database needs to be read-only.&amp;nbsp;All fields would be anonymized using default anonymization strategy which is based on the datatype, unless an anonymization strategy is specified. For instance, special strategies could be used for emails, passwords, usernames etc.&amp;nbsp;A whitelisted field implies that it&#39;s okay to copy the data as is and anonymization isn&#39;t required.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Using whitelist approach and applying similar rules to anonymize only Name and Email&amp;nbsp;for above example&amp;nbsp;will produce output like following.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0tK-jepXSyO9DtmGzYMNzlCc9QC-a7d7UCpNKQrXTLIVzPdgLee2hIKytIYfNbC1czDZ1H8B-d9w3x_v1SaNTIHBZeG7M9ghnKpoB-_ctrvc-KM3wgt0NWjwzdkkiUBerIu0L_iKfpgk/s1600/Screen+Shot+2012-09-04+at+11.02.41+AM.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;108&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0tK-jepXSyO9DtmGzYMNzlCc9QC-a7d7UCpNKQrXTLIVzPdgLee2hIKytIYfNbC1czDZ1H8B-d9w3x_v1SaNTIHBZeG7M9ghnKpoB-_ctrvc-KM3wgt0NWjwzdkkiUBerIu0L_iKfpgk/s320/Screen+Shot+2012-09-04+at+11.02.41+AM.png&quot; title=&quot;&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;clear: both;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;i&gt;Age&lt;/i&gt; field value is anonymised. Which means if u haven&#39;t specified any rule for anonymization the system should anonymize it using default anonymization rules for the data type. To get Age field as-is it is required to mention it as whitelist. Also, the config table didn&#39;t show up at all, means if I don&#39;t ask for the table explicitly it should not be&amp;nbsp;copied&amp;nbsp;at all.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
This way any new field will be anonymized by default and if we need them as is add it to the whitelist explicitly. This prevents any human error and protects sensitive information.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
Data Anonymization tool supports both&amp;nbsp;&lt;i&gt;blacklist&lt;/i&gt;&amp;nbsp;and&amp;nbsp;&lt;i&gt;whitelist&lt;/i&gt;&amp;nbsp;approach for anonymization. Read more&amp;nbsp;&lt;a href=&quot;http://sunitparekh.github.com/data-anonymization&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;&amp;nbsp;about the tool and how easy to use&amp;nbsp;it is&amp;nbsp;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Data Anonymization home page:&amp;nbsp;&lt;a href=&quot;http://sunitparekh.github.com/data-anonymization&quot;&gt;http://sunitparekh.github.com/data-anonymization&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://sunitspace.blogspot.com/feeds/6127132523928284126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sunitspace.blogspot.com/2012/09/data-anonymization-blacklist-whitelist.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/6127132523928284126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/6127132523928284126'/><link rel='alternate' type='text/html' href='http://sunitspace.blogspot.com/2012/09/data-anonymization-blacklist-whitelist.html' title='Data Anonymization approaches Blacklist or Whitelist?'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15892638558536899020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXS0F8RnAagfyvfQ5dGDWXLQwgd_Pl84FAjW2HeF-XH1clwhyphenhyphensZRCkQfn-cNMq47sTEapnwn-s0fwsEOeAMq1Gr4kH6ppsDOdRsYvMJaid7L6Dy4k6D3tV5BJ93qutlMYFRzzMWuwHhbw/s72-c/Screen+Shot+2012-09-04+at+10.50.11+AM.png" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>National Highway 4, Kasba Peth, Pune, Maharashtra, India</georss:featurename><georss:point>18.5204303 73.8567437</georss:point><georss:box>18.4000008 73.6988152 18.6408598 74.014672199999993</georss:box></entry><entry><id>tag:blogger.com,1999:blog-3186574916549921356.post-8763076830036366085</id><published>2012-09-04T12:08:00.000+05:30</published><updated>2012-09-04T12:40:52.757+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="data anonymization"/><category scheme="http://www.blogger.com/atom/ns#" term="data masking"/><category scheme="http://www.blogger.com/atom/ns#" term="data protection act"/><category scheme="http://www.blogger.com/atom/ns#" term="data sanitisation"/><category scheme="http://www.blogger.com/atom/ns#" term="data security"/><category scheme="http://www.blogger.com/atom/ns#" term="DPA"/><category scheme="http://www.blogger.com/atom/ns#" term="production dump"/><category scheme="http://www.blogger.com/atom/ns#" term="QA"/><category scheme="http://www.blogger.com/atom/ns#" term="software testing"/><title type='text'>Data Anonymization, need for every site in production</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;
On one of my previous projects, we wrote a jMeter performance test suite, which runs periodically on performance environment. Once the application was in production, we enhanced our performance test suite based on actual user&amp;nbsp;behaviours from Apache access logs and Omniture analytics. That provided us a great level of confidence in development for scaling. Now the next step was to get the production dataset so our performance testing becomes almost like production peak load.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Also we had few bugs manifesting themselves only in production and we were not able to reproduce the same on our local&amp;nbsp;environment&amp;nbsp;due to the dataset. &lt;span style=&quot;background-color: white;&quot;&gt;In production the data has evolved over a period of time and might have some bad/inconsistent data leading to edge cases or defects not happening in other&amp;nbsp;environments.&amp;nbsp;&lt;/span&gt;To fix such issues it was required to have a production dataset to enable our team to debug and fix such issues with confidence rather than guess-work.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
One other time, we had issues with our migration scripts, when the migration script failed during production release. The reason was again the kind of data that had evolved in the production system. It could have been avoided if we had a production dump to rehearse the production deployment.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigscn_PaFD3hP4qvrAzoMY85-03PPpKuj673H6hw-8ZDcAIrWZ_lL94_Tg0NOxx_ICkumW6a_-GfaaW-fGQt3dh73bOnnxolzqNuCrJ-st2QdrSMUc9VfLTDqHYJU5CaVbV5r5aD5MWdI/s1600/Screen+Shot+2012-09-03+at+4.23.28+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;168&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigscn_PaFD3hP4qvrAzoMY85-03PPpKuj673H6hw-8ZDcAIrWZ_lL94_Tg0NOxx_ICkumW6a_-GfaaW-fGQt3dh73bOnnxolzqNuCrJ-st2QdrSMUc9VfLTDqHYJU5CaVbV5r5aD5MWdI/s640/Screen+Shot+2012-09-03+at+4.23.28+PM.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;clear:both;&quot; &gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Considering all the above hurdles, we got together our Product Owner, and the Dev ops and Security team mates for a production dump. The initial reaction was a NO: the primary reason it being &#39;Users&#39; Personal Data&#39; and according to Data Protection Act &quot;No one should have access to users personal data&quot;. Now what? the answer was, we can get production dataset if we sanitize/mask/anonaymize users personal data, we can get the data from production. &amp;nbsp;We quickly started googling around to findout is there a quick and easy tool available to achieve anonymization of the database. Hmm.... no luck.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Considering distributed teams spanning out of country, concern of security with data is increased multiple fold.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
We thought lets write some scripts and anonymize production data. However, it has some serious security and data protection issues. Such as there is possiblity of missing out on certain attributes at all and those data slips into non production&amp;nbsp;environments. Also it has issues with new content gets passed into non production as is without anonymization by default. There are two approaches for anonymization &lt;i&gt;blacklist&lt;/i&gt; and &lt;i&gt;whitelist&lt;/i&gt;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXJ4xb-WO0qIYVgFctaYe9PPr3AoEoCwx6k-TUYVJbUGypmc5W3cOcCLbXLme1M8v52J-zXikAdipOK2JimWA6bLXMr1nd73BWKWxXUeR7kFMhz-EKCV4FlOQ15xu59eL9mk00-X46Guc/s1600/Screen+Shot+2012-09-03+at+4.23.12+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;110&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXJ4xb-WO0qIYVgFctaYe9PPr3AoEoCwx6k-TUYVJbUGypmc5W3cOcCLbXLme1M8v52J-zXikAdipOK2JimWA6bLXMr1nd73BWKWxXUeR7kFMhz-EKCV4FlOQ15xu59eL9mk00-X46Guc/s640/Screen+Shot+2012-09-03+at+4.23.12+PM.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;clear:both;&quot; &gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
As this is quite a common requirement across projects, I started working on this idea with a few&amp;nbsp;colleagues&amp;nbsp;at ThoughtWorks to build a simple tool in Ruby based on ActiverRecord to support multiple databases.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Data Anonymization tool supports both &lt;i&gt;blacklist&lt;/i&gt; and &lt;i&gt;whitelist&lt;/i&gt; approach for anonymization. Read more &lt;a href=&quot;http://sunitparekh.github.com/data-anonymization&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt; about the tool and how easy to use&amp;nbsp;it is&amp;nbsp;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Data Anonymization home page:&amp;nbsp;&lt;a href=&quot;http://sunitparekh.github.com/data-anonymization&quot;&gt;http://sunitparekh.github.com/data-anonymization&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
In my &lt;a href=&quot;http://sunitspace.blogspot.com/2012/09/data-anonymization-blacklist-whitelist.html&quot; target=&quot;_blank&quot;&gt;next post&lt;/a&gt; I describe &lt;i&gt;blacklist&lt;/i&gt; and &lt;i&gt;whitelist&lt;/i&gt; anonymization approaches in more detail. Write to me (Twitter: @sunitparekh) or comment on this blog for any questions, feedback and suggestions.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://sunitspace.blogspot.com/feeds/8763076830036366085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sunitspace.blogspot.com/2012/09/data-anonymization.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/8763076830036366085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/8763076830036366085'/><link rel='alternate' type='text/html' href='http://sunitspace.blogspot.com/2012/09/data-anonymization.html' title='Data Anonymization, need for every site in production'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15892638558536899020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigscn_PaFD3hP4qvrAzoMY85-03PPpKuj673H6hw-8ZDcAIrWZ_lL94_Tg0NOxx_ICkumW6a_-GfaaW-fGQt3dh73bOnnxolzqNuCrJ-st2QdrSMUc9VfLTDqHYJU5CaVbV5r5aD5MWdI/s72-c/Screen+Shot+2012-09-03+at+4.23.28+PM.png" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Pune, Maharashtra, India</georss:featurename><georss:point>18.5204303 73.8567437</georss:point><georss:box>18.3999798 73.6988152 18.6408808 74.014672199999993</georss:box></entry><entry><id>tag:blogger.com,1999:blog-3186574916549921356.post-1293958235290300650</id><published>2012-07-13T10:32:00.000+05:30</published><updated>2012-07-13T11:05:00.147+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="html5"/><category scheme="http://www.blogger.com/atom/ns#" term="pubnub"/><category scheme="http://www.blogger.com/atom/ns#" term="push notification"/><category scheme="http://www.blogger.com/atom/ns#" term="pusher"/><category scheme="http://www.blogger.com/atom/ns#" term="web 2.0"/><category scheme="http://www.blogger.com/atom/ns#" term="websockets"/><title type='text'>Get notified with push notification</title><content type='html'>&lt;span style=&quot;background-color: white;&quot;&gt;Now days it&#39;s kind of defacto that every website requires&amp;nbsp;some sort of mechanism to update changes dynamically.&amp;nbsp;&lt;/span&gt;On my last project we had a specific need to keep updating the count of messages like Facebook does for unread messages. The website is a dot com site with&amp;nbsp;reasonable user base online. It was challenging to come up with a solution so that we can get this developed quickly and scale well with the load.&lt;br /&gt;
&lt;br /&gt;
We discussed multiple approach and chose one for development.&lt;br /&gt;
&lt;h3&gt;


&lt;b&gt;Approach 1) Poll for changes&lt;/b&gt;&lt;/h3&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK0E8p1rjpEQpWrr6i5AD-a_Ecpjvifzgw4mTkoxy8KhazDRXNDS_qR0zhLdUN6TWInuC7m6pLSh7rTpN6jRreEP2_D_myw1CRr9DSzSMevg4hjU1WY0FLcH1ON0qSGAoUdDL34WRcnyA/s1600/poll.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;475&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK0E8p1rjpEQpWrr6i5AD-a_Ecpjvifzgw4mTkoxy8KhazDRXNDS_qR0zhLdUN6TWInuC7m6pLSh7rTpN6jRreEP2_D_myw1CRr9DSzSMevg4hjU1WY0FLcH1ON0qSGAoUdDL34WRcnyA/s640/poll.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
This is kind of classical pull approach where every &#39;n&#39; second poll for changes and update UI. The problem with polling every 30 sec were,&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;&lt;span style=&quot;background-color: white;&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Unnecessary&amp;nbsp;extra load on the server means&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;fake http requests, 1 will have new message out of 100+ requests. Major hurdle in scaling app, suddenly the no of requests on server will increase multiple fold.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Delay in data refresh based on poll frequency and it won&#39;t be realtime.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;We can&#39;t http cache the request using reverse proxy since it is user&#39;s personal data&lt;/span&gt;&lt;/li&gt;
&lt;/span&gt;&lt;/ol&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
Approach may be okay for sites like live cricket scores where requests can be http cached and served to multiple users and data changes frequently.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;h3&gt;

&lt;b style=&quot;background-color: white;&quot;&gt;Approach 2) Push for changes&lt;/b&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6-eOrEqaFyZnm7jiJOREWzGAcwdfKC_qpNp6rY22GRs5v5AQUuXTOoB7gVEHaaPLl1LJgi4UKKmIpQU38v5MfBk21BcgF-NYeej5s3kcdAyvCh46t59jJh7bX2NS96EDLmUXb1KrQQxc/s1600/push.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;496&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6-eOrEqaFyZnm7jiJOREWzGAcwdfKC_qpNp6rY22GRs5v5AQUuXTOoB7gVEHaaPLl1LJgi4UKKmIpQU38v5MfBk21BcgF-NYeej5s3kcdAyvCh46t59jJh7bX2NS96EDLmUXb1KrQQxc/s640/push.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Second approach we came up with was push messages using websockets and libraries like socket.io etc. &amp;nbsp;Using push the user experience is really awesome, user gets notified&amp;nbsp;instantaneously&amp;nbsp;about the new messages. No extra fake requests on the server and helps in scaling easily.&lt;br /&gt;
&lt;br /&gt;
However, there are challenges&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Setting up the Notification Server. We were using Apache server and it doesn&#39;t support websocket connections. Needs upgrade to our&amp;nbsp;infrastructure.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Implementing server side component for Notification Server with security and authentication was significant effort. &amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;More effort as compared to poll for maintaining&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;state logic on Notification server &amp;amp;&amp;nbsp;Javascript, requires resilience&amp;nbsp;in building edge&amp;nbsp;cases around&amp;nbsp;data loss&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
To overcome over challenges we though of going to PaaS for Push Notification like &lt;a href=&quot;http://www.pubnub.com/&quot; target=&quot;_blank&quot;&gt;PubNub&lt;/a&gt; and &lt;a href=&quot;http://pusher.com/&quot; target=&quot;_blank&quot;&gt;Pusher&lt;/a&gt;. However the challenge with PaaS is data security. Is it okay to send user personal data to 3rd party? The answer in our case of NO.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h3&gt;

&lt;b style=&quot;background-color: white;&quot;&gt;Approach 3) Push notification for changes&lt;/b&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLImh4Gk0edUEom4jNM07LtvLtSsLp-zRYgOfsMPslYH7uKSw1XLHt2V4pwuhuEoFWdLX-DuXqKF6o6bYpPiCqFVRmV6RPheAJ_SOWuZjNuDp28_M8jHttVhhzTDydPPNk2sW1TC8FVyM/s1600/push-notify.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;474&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLImh4Gk0edUEom4jNM07LtvLtSsLp-zRYgOfsMPslYH7uKSw1XLHt2V4pwuhuEoFWdLX-DuXqKF6o6bYpPiCqFVRmV6RPheAJ_SOWuZjNuDp28_M8jHttVhhzTDydPPNk2sW1TC8FVyM/s640/push-notify.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
To overcome the problem of data security we came with the tweaked approach as shown above. We use PaaS for Push Notification only to notify end user about there is new message and no data. When the notification is received we do the poll request on main server to refresh the UI.&lt;br /&gt;
&lt;br /&gt;
Key advantages of using this approach:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;No effort required for building &amp;amp; maintaining Notification Server. Leverage the PaaS.&lt;/li&gt;
&lt;li&gt;Just send the change notification, so issues with data security.&lt;/li&gt;
&lt;li&gt;Less development effort since most of the PaaS provider has their own library to support all browsers.&lt;/li&gt;
&lt;li&gt;Realtime updates to end user. Better user experience.&lt;/li&gt;
&lt;li&gt;High&amp;nbsp;availability&amp;nbsp;and scalability using PaaS&lt;/li&gt;
&lt;/ol&gt;
We are using &lt;a href=&quot;http://www.pubnub.com/&quot; target=&quot;_blank&quot;&gt;PubNub&lt;/a&gt; as PaaS and experience so far is really good.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;/ul&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sunitspace.blogspot.com/feeds/1293958235290300650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sunitspace.blogspot.com/2012/07/get-notified-with-push-notification.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/1293958235290300650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/1293958235290300650'/><link rel='alternate' type='text/html' href='http://sunitspace.blogspot.com/2012/07/get-notified-with-push-notification.html' title='Get notified with push notification'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15892638558536899020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK0E8p1rjpEQpWrr6i5AD-a_Ecpjvifzgw4mTkoxy8KhazDRXNDS_qR0zhLdUN6TWInuC7m6pLSh7rTpN6jRreEP2_D_myw1CRr9DSzSMevg4hjU1WY0FLcH1ON0qSGAoUdDL34WRcnyA/s72-c/poll.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3186574916549921356.post-7281542798743232607</id><published>2012-05-13T17:58:00.002+05:30</published><updated>2012-05-13T21:53:42.488+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="agile"/><category scheme="http://www.blogger.com/atom/ns#" term="communication plan"/><category scheme="http://www.blogger.com/atom/ns#" term="distributed team"/><category scheme="http://www.blogger.com/atom/ns#" term="project inception"/><category scheme="http://www.blogger.com/atom/ns#" term="project management"/><title type='text'>Distributed team communication plan with help of anatomy of an iteration during project inception</title><content type='html'>&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;Agile software development is getting more and more attention now a days. One of the variations of it is called ‘Distributed Agile Development’. And a key ingredient for distributed teams to work effectively is “communication”. Quote from Kent Back on communication &quot;&lt;/span&gt;Problems with projects can invariably be traced back to somebody not talking to somebody else about something important.&quot;&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Currently we are doing an inception with a client and their past experience with distributed team has left them with some bitterness. In addition, the client has just started adopting agile practices in their software development cycle, so along with delivery we are also doing enablement for them. Also making sure business and new team member understand the different buzzwords of agile software development is very important.&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;In my experience every team has variations in mechanics of implementing agile, keeping all the principles intact. For example, story prioritization for some teams is Iteration Planning Meeting (aka Iteration Kick Off) and&amp;nbsp; some teams go for &amp;nbsp;more lean &amp;nbsp;like method of story prioritization and adopts an iteration-less Kanban style pull mechanism.&amp;nbsp;&lt;/span&gt;For &amp;nbsp;distributed teams, the variations are important to know and everyone should understand the why’s of it.&amp;nbsp;Daily standup need to be little different when working in distributed model, Iteration showcase and iteration length varies too from team to team. In my opinion all such mechanics are decided and derived based different parameters. However, the important part is to discuss, decide and communicate &amp;nbsp;the mechanics &amp;amp; process of project’s agile development with all team members including business.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;And its very important to plan for some session during inception to address need around all of the above.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
Taking “Story Lifecycle” and “Anatomy of Iteration” our team (&lt;a href=&quot;http://sunitspace.blogspot.com/&quot; target=&quot;_blank&quot;&gt;Sunit Parekh&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/#!/_birinder&quot; target=&quot;_blank&quot;&gt;Birinder Singh&lt;/a&gt;, &lt;a href=&quot;http://pandafunda.blogspot.com/&quot; target=&quot;_blank&quot;&gt;Sarbashrestha Panda&lt;/a&gt; &amp;amp; Amit Dhakad) did the following session in little different settings and format. This blog is all about sharing the mechanics of running the session. I am calling it “Communication plan using anatomy of iteration lifecycle” and some of following is for the distributed team structure, where the business, SMEs, Product Owner and Product Sponsor are in UK and the development team is back in India.&amp;nbsp; Hence few of the mechanics differ from co-located team structure.&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;br /&gt;
&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;&lt;u&gt;Topics to broadly cover during session are,&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;
&lt;ul class=&quot;ul1&quot;&gt;
&lt;li class=&quot;li1&quot;&gt;&lt;span class=&quot;s1&quot;&gt; What is a story? &amp;amp;&amp;nbsp; Story lifecycle&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;&lt;span class=&quot;s1&quot;&gt; What is an iteration? &amp;amp;&amp;nbsp; Anatomy of iteration&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;&lt;span class=&quot;s1&quot;&gt; Definition of Done (Story)&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;&lt;span class=&quot;s1&quot;&gt; Testing approach (automated and manual)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
We created a timeline on the board to start the session with first talking about what is story and story lifecycle.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6uo6A865ikYV7ymjwdkiujxdHav_JHyt6DUEmN8GEfO7Mp_0tiDAIs2ACoj-NUKRDIvSj-hpOqGpQ9vk5mQs8jxLBcKTf8v5HBApG9rT4bGssxOKfzBh8VWClwCUb0HwQpwaUb-UfSWo/s1600/anatomy+of+iteration+1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6uo6A865ikYV7ymjwdkiujxdHav_JHyt6DUEmN8GEfO7Mp_0tiDAIs2ACoj-NUKRDIvSj-hpOqGpQ9vk5mQs8jxLBcKTf8v5HBApG9rT4bGssxOKfzBh8VWClwCUb0HwQpwaUb-UfSWo/s400/anatomy+of+iteration+1.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
As we kept discussing about the iteration, we started moving story stages onto iteration lifecycle. Also started building the events as shown in the picture below. Session took an hour to run.&lt;br /&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfCI-gSkoOQ2KEySKZF2P49MUw12XyTwCp-WSlhRfBzz4ppGFUmX5rd1KQRIM1qrFHmze9DkQIR4yIsb5b988dB4AU4rQBMbKn2JhwLsIeRfK3sqNs3cSBE6OuPqjakwtYVk4MeNy0v5Q/s1600/anatomy+of+iteration+2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfCI-gSkoOQ2KEySKZF2P49MUw12XyTwCp-WSlhRfBzz4ppGFUmX5rd1KQRIM1qrFHmze9DkQIR4yIsb5b988dB4AU4rQBMbKn2JhwLsIeRfK3sqNs3cSBE6OuPqjakwtYVk4MeNy0v5Q/s640/anatomy+of+iteration+2.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
Keep most of the stickies written before the session. This helps to remember all points to cover and running the session quickly. Have discussions during the session and make it as interactive as possible. As a team decides most of the stuff (e.g.&amp;nbsp;definition&amp;nbsp;of story done, iteration length, meetings/calls, Skype or Google Hangout) rather than&amp;nbsp;dictating&amp;nbsp;to others, this is very important as that makes it team&#39;s plan.&lt;br /&gt;
&lt;br /&gt;
Here are a few things, that is different for a distributed agile team:&amp;nbsp;&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;li1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt; Standup&lt;/b&gt;, can be little different format. We use mingle card wall to just talk about cards updates if there are any queries or updates, achievements of the team during day, along with any blockers and show-stoppers for team. Keep it short. 15 min.&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt; BA Catchup&lt;/b&gt;, business is busy most of the day with their job and so it is important to block SMEs calendar for certain time of the day so that can be utilized for any questions, queries and demo’s for feedback. Daily 1 hr. We do it just followed by distributed team standup.&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt; Story prioritization&lt;/b&gt;, continuos process like Kanban. Regularly and BA Catchup call is used for story&amp;nbsp;prioritization.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt; Iteration Kickoff and Iteration Showcase&lt;/b&gt;, we like Kanban style prioritization however it is good to get everyone together and share the project status, updates and showcase key features build since last meet and what’s the plan ahead for team. We do this as one meeting scheduled at the end of iteration as iteration showcase.&lt;/span&gt;&lt;/li&gt;
&lt;li class=&quot;li1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt; Tech Huddles&lt;/b&gt;, during initial stage of the project couple of times a week and later it’s kind of need basis once or twice a week.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Please share your comments,&amp;nbsp;suggestions&amp;nbsp;&amp;amp; experiences about this kind of sessions. What more we should cover, what we should watch out for...&lt;br /&gt;
&lt;br /&gt;
Special thanks to&amp;nbsp;&lt;a href=&quot;http://pandafunda.blogspot.com/&quot; target=&quot;_blank&quot;&gt;Sarbashrestha Panda&lt;/a&gt; for reviewing the post and recommending valuable&amp;nbsp;amendments.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sunitspace.blogspot.com/feeds/7281542798743232607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sunitspace.blogspot.com/2012/05/distributed-team-communication-plan.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/7281542798743232607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/7281542798743232607'/><link rel='alternate' type='text/html' href='http://sunitspace.blogspot.com/2012/05/distributed-team-communication-plan.html' title='Distributed team communication plan with help of anatomy of an iteration during project inception'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15892638558536899020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6uo6A865ikYV7ymjwdkiujxdHav_JHyt6DUEmN8GEfO7Mp_0tiDAIs2ACoj-NUKRDIvSj-hpOqGpQ9vk5mQs8jxLBcKTf8v5HBApG9rT4bGssxOKfzBh8VWClwCUb0HwQpwaUb-UfSWo/s72-c/anatomy+of+iteration+1.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Liverpool, Merseyside, UK</georss:featurename><georss:point>53.41154 -2.990116</georss:point><georss:box>53.2601065 -3.305973 53.562973500000005 -2.674259</georss:box></entry><entry><id>tag:blogger.com,1999:blog-3186574916549921356.post-8038083998306695997</id><published>2012-05-07T21:13:00.001+05:30</published><updated>2012-05-07T23:37:08.788+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="agile"/><category scheme="http://www.blogger.com/atom/ns#" term="agile project inception"/><category scheme="http://www.blogger.com/atom/ns#" term="inception"/><category scheme="http://www.blogger.com/atom/ns#" term="process map"/><category scheme="http://www.blogger.com/atom/ns#" term="timeline"/><title type='text'>Inception Board: Process timeline map using stickies</title><content type='html'>One of the key challenges in an inception is to learn about the business processes and its workflow in a fair amount of detail in a relatively quick amount of time. The idea is, not to just learn about the client&#39;s business processes, but also to ensure that various stakeholders within the client actually share that understanding instead of having varying ideas in their own heads.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
There are plenty of methods to study business processes but they are time consuming and heavy weight and may be not as collaborative. A classical way is to create process map diagram &amp;amp; value stream mapping. Such methods are valuable in different settings. In our context, an inception, we try to uncover information in enough detail to be able to kickstart delivery without spending loads of time and making it a formal inception phase.&lt;br /&gt;
&lt;br /&gt;
During a recent inception,&amp;nbsp;we&amp;nbsp;(&lt;a href=&quot;https://twitter.com/#!/sunitparekh&quot; target=&quot;_blank&quot;&gt;Sunit Parekh&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://twitter.com/sarbashrestha&quot; target=&quot;_blank&quot;&gt;Sarbashetha Panda&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://twitter.com/#!/_birinder&quot; target=&quot;_blank&quot;&gt;Birinder Singh&lt;/a&gt;&amp;nbsp;&amp;amp; Amit Dhakad)&amp;nbsp;combined ideas from different process analysis methods and came up with this hybrid light weight approach. It is not full blown value stream mapping but this approach does have elements of it and highlights the processes that are most time consuming and potentially wasteful.&lt;br /&gt;
&lt;br /&gt;
The process map was built on a large canvas/wall, so that it would constantly be visible to all the participant in the inception.&amp;nbsp;We started building the process map&amp;nbsp;by plotting a timeline on x axis and noting different steps in the process flow on the&amp;nbsp;y axis. Also, the&amp;nbsp;actors/roles involved in the process were indicated for each process. A&amp;nbsp;legends for&amp;nbsp;denoting the actors&amp;nbsp;was also put up on the wall for the ease of identification.&amp;nbsp;Building this full as-is process map of the as-is process was done over multiple sessions spanning a couple of days.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Stage 1:&lt;/b&gt; After couple of session with business first cut of the as-is process timeline map looked something like this&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivhSqGTV7AAr3hbiGv92Xkzs9NYrCu0m7UorKBnyO83TvhsdHBw8agttEAKW3yNHb0bJVX-M38A-rab5q_ohDaHMIG573hrucaXAVbRzHEpictsLEpfHVydgicPfK55rxg-waUqZfnnz8/s1600/process+timeline+map+-+as+is+partial.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;310&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivhSqGTV7AAr3hbiGv92Xkzs9NYrCu0m7UorKBnyO83TvhsdHBw8agttEAKW3yNHb0bJVX-M38A-rab5q_ohDaHMIG573hrucaXAVbRzHEpictsLEpfHVydgicPfK55rxg-waUqZfnnz8/s640/process+timeline+map+-+as+is+partial.jpg&quot; title=&quot;First cut of the process timeline map on wall&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
&lt;/div&gt;
&lt;b&gt;Stage 2:&lt;/b&gt; After another iteration, the as-is process&amp;nbsp;shaped up to something like this. It was also clearer&amp;nbsp;in the client stakeholders&#39; minds. It also had functional area clearly called out.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5FoS-C9ky-Ehjr7q1UG1dLTkguqnjweFdJqtRwniqYYCQ4nuZmaayT80mTrqeLyYWCt_4wVqW4rnIHqlEWQxdKLc7qVdKknTu5WZ_rqNhZNXpvoDt9Rtn-mqbuVgrDBsNbT8HdcKZF7c/s1600/process+timeline+map+-+as+is-1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;243&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5FoS-C9ky-Ehjr7q1UG1dLTkguqnjweFdJqtRwniqYYCQ4nuZmaayT80mTrqeLyYWCt_4wVqW4rnIHqlEWQxdKLc7qVdKknTu5WZ_rqNhZNXpvoDt9Rtn-mqbuVgrDBsNbT8HdcKZF7c/s640/process+timeline+map+-+as+is-1.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
&lt;/div&gt;
Advantage of having large visible canvas for the current as-is model is that it provided us a reference point at all times in inception. It became one of the living document for the team.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
&lt;/div&gt;
&lt;b&gt;Stage 3:&lt;/b&gt; We then took this forward and mapped the future to-be process on top of it by putting magic chart in-between.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjKrT617dERZhr5Ni_KqgrpOQBjNLZLoSCfFV75nMx19-Q0XL94I6XibFeV_L3xEMTh-1VVLWnLV9p7okqdXr3jw7Ds18y69gEJDLcQo4fh5vdq6oZrw9Du0UU1spXEJyAUz60JKikwcI/s1600/process+timeline+map.+-+to+be.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;276&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjKrT617dERZhr5Ni_KqgrpOQBjNLZLoSCfFV75nMx19-Q0XL94I6XibFeV_L3xEMTh-1VVLWnLV9p7okqdXr3jw7Ds18y69gEJDLcQo4fh5vdq6oZrw9Du0UU1spXEJyAUz60JKikwcI/s640/process+timeline+map.+-+to+be.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
Being able to superimpose the potential &#39;to-be&#39; process on top of the &#39;as-is&#39; process allowed everyone to be able to &#39;see&#39; how it was lighter weight in comparison. It also allowed us to ensure and double check that we were indeed covering the key activities / steps from the current process and losing / getting rid of only the non value adding ones.&lt;br /&gt;
&lt;br /&gt;
At the end, we digitalized this using&amp;nbsp;&lt;a href=&quot;http://www.gliffy.com/&quot; target=&quot;_blank&quot;&gt;Gliffy&lt;/a&gt;. &amp;nbsp;This structure / format / way of creating a process map was very well received by the&amp;nbsp;business teams as well. They, in fact, suggested that the maps should be left as is in the room for anyone new to the business to use as a starting point for understanding their business processed. That feedback was indeed awesome. :) To me, this is called innovation and collaborative&amp;nbsp;effort was what made it possible.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Stationary used for building such map:&lt;/b&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.magicwhiteboard.co.uk/magic-whiteboard/order/&quot; target=&quot;_blank&quot;&gt;Magic Charts&lt;/a&gt; with Grid&lt;br /&gt;
Mulitcolor Stickies &amp;nbsp;(pink was used for timeline event/instances, yellow for activities in business process)&lt;br /&gt;
Arrow Stickies (cut sticky in arrow shape or get 3M arrow tags)&lt;br /&gt;
Small Dot Stickers (used for legends such as actors for activities)&lt;br /&gt;
Sharpies&lt;br /&gt;
&lt;br /&gt;
Post written&amp;nbsp;collaboratively&amp;nbsp;by&amp;nbsp;&lt;a href=&quot;https://twitter.com/#!/sunitparekh&quot; target=&quot;_blank&quot;&gt;Sunit Parekh&lt;/a&gt;&amp;nbsp;&amp;amp;&amp;nbsp;&lt;a href=&quot;https://twitter.com/#!/_birinder&quot; target=&quot;_blank&quot;&gt;Birinder Singh&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://sunitspace.blogspot.com/feeds/8038083998306695997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sunitspace.blogspot.com/2012/05/inception-board-process-timeline-map.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/8038083998306695997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/8038083998306695997'/><link rel='alternate' type='text/html' href='http://sunitspace.blogspot.com/2012/05/inception-board-process-timeline-map.html' title='Inception Board: Process timeline map using stickies'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15892638558536899020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivhSqGTV7AAr3hbiGv92Xkzs9NYrCu0m7UorKBnyO83TvhsdHBw8agttEAKW3yNHb0bJVX-M38A-rab5q_ohDaHMIG573hrucaXAVbRzHEpictsLEpfHVydgicPfK55rxg-waUqZfnnz8/s72-c/process+timeline+map+-+as+is+partial.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Liverpool, Merseyside, UK</georss:featurename><georss:point>53.41154 -2.990116</georss:point><georss:box>53.2601065 -3.305973 53.562973500000005 -2.674259</georss:box></entry><entry><id>tag:blogger.com,1999:blog-3186574916549921356.post-1510027182841507268</id><published>2012-04-29T16:40:00.001+05:30</published><updated>2012-04-29T16:40:17.156+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="agile project inception"/><category scheme="http://www.blogger.com/atom/ns#" term="inception"/><category scheme="http://www.blogger.com/atom/ns#" term="inception game"/><category scheme="http://www.blogger.com/atom/ns#" term="product map"/><category scheme="http://www.blogger.com/atom/ns#" term="requirement study"/><title type='text'>Inception Game: Product Map</title><content type='html'>One of the key factors for our project is that the client is almost 80+ yrs old in business. There are multiple products with different variations of it in the market. Now one of the task/session was to understand their product space, their groupings and how they differ from each other.&lt;br /&gt;
&lt;br /&gt;
For understanding product and its family and how they differ from each other, we (Inception team - Sunit, Amit, Panda and Birinder) came up with a simple idea of creating a &quot;Product&amp;nbsp;Map&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Game:&lt;/b&gt; &lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;Product Map&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Objective:&lt;/b&gt; To understand the breadth and depth of the products and their variations.&lt;br /&gt;
&lt;b&gt;Duration:&lt;/b&gt; 30 min to 1 hr (depends on the # of products and product families)&lt;br /&gt;
&lt;b&gt;Participants:&lt;/b&gt; SMEs and Business Stakeholders&lt;br /&gt;
&lt;b&gt;Preparation:&lt;/b&gt; Create large board with matrix/grid having products on rows and comparison&amp;nbsp;factors as columns.&amp;nbsp;Write down all the known products and&amp;nbsp;comparison&amp;nbsp;factors on stickies to save time.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;How to Play:&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;First steps to ask business to complete the product list, and then group them based&amp;nbsp;similarities&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Rearrange product list, keep the most popular product family and product on top&lt;/li&gt;
&lt;li&gt;Discuss&amp;nbsp;comparison&amp;nbsp;factors, against which the products need to be compared or studied. Few options to consider are,&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;User base for the product&lt;/li&gt;
&lt;li&gt;Process steps/work-flow the product goes through&lt;/li&gt;
&lt;li&gt;Numbers related to product, such as revenue, time factors etc.&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;Start with most popular product first and considering it as the base, discuss the variations in other products in the same family. Put notes on small stickies for each variation discovered.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh43brNMGwsCnEnbcrumDdX_l4lobx7dHDbuqt2BdlcPDpKimQKDjHBvsH4tgcEPV7cqlJtPoCQNjmH9kM9l4UfzGDBICAMXAz4PDRPlg6kdstXzC4VvxdQwTACB47HlbsWhilHm-6Go50/s1600/products+difference+grid.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;394&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh43brNMGwsCnEnbcrumDdX_l4lobx7dHDbuqt2BdlcPDpKimQKDjHBvsH4tgcEPV7cqlJtPoCQNjmH9kM9l4UfzGDBICAMXAz4PDRPlg6kdstXzC4VvxdQwTACB47HlbsWhilHm-6Go50/s640/products+difference+grid.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;&lt;br /&gt;Variation:&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Can be used for &lt;b&gt;technical debt matrix&lt;/b&gt; e.g. put different modules/areas of codebase as rows, technical parameter such as complexity, test coverage, clean code etc as columns and start populating matrix. Can be very useful for creating visuals for legacy codebase.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;b&gt;How we did it?&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;In our case we put products as rows grouped together with same product family&amp;nbsp;(yellow stickies in picture)&amp;nbsp;&amp;nbsp;and different processes steps followed for the product as&amp;nbsp;columns&amp;nbsp;(pink and blue stickies in picture - blue stickies are sub steps).&amp;nbsp;.&lt;/li&gt;
&lt;li&gt;We used different colors and size of stickies to show products (yellow), process steps (pink &amp;amp; blue small) and how they differ from each other (orange small).&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sunitspace.blogspot.com/feeds/1510027182841507268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sunitspace.blogspot.com/2012/04/inception-game-product-map.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/1510027182841507268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/1510027182841507268'/><link rel='alternate' type='text/html' href='http://sunitspace.blogspot.com/2012/04/inception-game-product-map.html' title='Inception Game: Product Map'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15892638558536899020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh43brNMGwsCnEnbcrumDdX_l4lobx7dHDbuqt2BdlcPDpKimQKDjHBvsH4tgcEPV7cqlJtPoCQNjmH9kM9l4UfzGDBICAMXAz4PDRPlg6kdstXzC4VvxdQwTACB47HlbsWhilHm-6Go50/s72-c/products+difference+grid.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Liverpool, Merseyside, UK</georss:featurename><georss:point>53.41154 -2.990116</georss:point><georss:box>53.2601065 -3.305973 53.562973500000005 -2.674259</georss:box></entry><entry><id>tag:blogger.com,1999:blog-3186574916549921356.post-4582890161505544967</id><published>2012-04-28T22:45:00.001+05:30</published><updated>2012-04-29T02:31:42.490+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="glossary terms"/><category scheme="http://www.blogger.com/atom/ns#" term="inception"/><category scheme="http://www.blogger.com/atom/ns#" term="inception game"/><category scheme="http://www.blogger.com/atom/ns#" term="system study"/><category scheme="http://www.blogger.com/atom/ns#" term="term cloud"/><title type='text'>Inception Board: Term Cloud</title><content type='html'>During inception one of the job of the inception team is to learn the terminology used by the business. Generally the board is put up with all the business buzzwords, terms that they use in their day to day job. We&amp;nbsp;started&amp;nbsp;doing that on one board called &#39;Term Cloud&#39;. Generally this board gets populated as side effect of all the games &amp;amp;&amp;nbsp;exercise&amp;nbsp;we do during inception also know as glossary, domain terms.&lt;br /&gt;
&lt;br /&gt;
Our team came with an idea to play &#39;term cloud&#39; as one of the&amp;nbsp;exercise&amp;nbsp;during the inception in initial days.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Exercise:&lt;/b&gt; &lt;span style=&quot;color: blue;&quot;&gt;Build Term Cloud&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;Objective:&lt;/b&gt; Everyone speaks the same business terms including development team, SMEs and stakeholders. Helps with more&amp;nbsp;collaborative&amp;nbsp;communication during inception. Better domain understanding. Less confusions with buzzwords having same &amp;amp; different meanings.&lt;br /&gt;
&lt;b&gt;When to play:&lt;/b&gt; After a few sessions (preferably on the second day after you get a critical mass of terms)&lt;br /&gt;
&lt;b&gt;Duration:&lt;/b&gt; 15-20 min&lt;br /&gt;
&lt;b&gt;Participants:&lt;/b&gt; Business SME&#39;s &amp;amp; Stakeholders&lt;br /&gt;
&lt;b&gt;Preparation:&amp;nbsp;&lt;/b&gt;Prepare board having &#39;Term Cloud&#39; written on it with few samples.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQz1idEC86SJ9uBOR9MyH8z3-_0InrHYG9IFbBZmM_WR2GuESAifO2kuzScM5AvMi5ExuH0KR0iUdTLHZqQ3pFRJbWYSYElMXcYoxeljeFp-GWiZvnoRP4NgWwg7lk35msRLCYJ2OXJQw/s1600/term+cloud+sample.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;475&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQz1idEC86SJ9uBOR9MyH8z3-_0InrHYG9IFbBZmM_WR2GuESAifO2kuzScM5AvMi5ExuH0KR0iUdTLHZqQ3pFRJbWYSYElMXcYoxeljeFp-GWiZvnoRP4NgWwg7lk35msRLCYJ2OXJQw/s640/term+cloud+sample.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;b&gt;How to Play:&amp;nbsp;&lt;/b&gt;very simple &amp;amp; easy to facilitate.&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Distributes stickets to write buzzwords, jargons, terms.&lt;/li&gt;
&lt;li&gt;Remember one term one sticky.&lt;/li&gt;
&lt;li&gt;Give 5 min to write all the terms.&lt;/li&gt;
&lt;li&gt;Ask participant to go in round robin fashion, explain the term and put it up on the board.&lt;/li&gt;
&lt;li&gt;Put small sticky if that term requires&amp;nbsp;explanation.&lt;/li&gt;
&lt;li&gt;If different terms has same meaning, club them together.&lt;/li&gt;
&lt;li&gt;If same terms has multiple meaning, come up with new term for&amp;nbsp;less&amp;nbsp;used meaning.&lt;/li&gt;
&lt;/ol&gt;
&lt;b&gt;Variations:&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Instead of everyone writing stickies, go in round robin and facilitator writes it on the board.&lt;/li&gt;
&lt;li&gt;Create Term Cloud board and keep populating as and when new terms pops up. (old style)&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;How we did it?&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
Following is the sample from the inception that we are going through. Yellow sticky is the term and Orange is used as note to explain the term.&lt;/div&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfLCkFD7Stz42iSBcl31mV8FMD8uGQ_0CtQk7_4iIH62tYKhraAH4JWQSOeIDq-bkutUrJOBFatka-NMZEc0i3QBX-R0gCfTYnS3A5VzSpKFf1dHIAkapYrqydmq11Uxos18QYqcEyHSU/s1600/term+cloud+blured+text.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;386&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfLCkFD7Stz42iSBcl31mV8FMD8uGQ_0CtQk7_4iIH62tYKhraAH4JWQSOeIDq-bkutUrJOBFatka-NMZEc0i3QBX-R0gCfTYnS3A5VzSpKFf1dHIAkapYrqydmq11Uxos18QYqcEyHSU/s400/term+cloud+blured+text.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Sample Term Cloud Board&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://sunitspace.blogspot.com/feeds/4582890161505544967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sunitspace.blogspot.com/2012/04/inception-board-term-cloud.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/4582890161505544967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/4582890161505544967'/><link rel='alternate' type='text/html' href='http://sunitspace.blogspot.com/2012/04/inception-board-term-cloud.html' title='Inception Board: Term Cloud'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15892638558536899020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQz1idEC86SJ9uBOR9MyH8z3-_0InrHYG9IFbBZmM_WR2GuESAifO2kuzScM5AvMi5ExuH0KR0iUdTLHZqQ3pFRJbWYSYElMXcYoxeljeFp-GWiZvnoRP4NgWwg7lk35msRLCYJ2OXJQw/s72-c/term+cloud+sample.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Liverpool, Merseyside, UK</georss:featurename><georss:point>53.41154 -2.990116</georss:point><georss:box>53.260077 -3.305973 53.563003 -2.674259</georss:box></entry><entry><id>tag:blogger.com,1999:blog-3186574916549921356.post-3370977390574820853</id><published>2012-04-25T18:44:00.000+05:30</published><updated>2012-04-25T18:45:23.427+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="agile"/><category scheme="http://www.blogger.com/atom/ns#" term="architecture"/><category scheme="http://www.blogger.com/atom/ns#" term="inception"/><title type='text'>Ruby vs Java vs .NET - How much does it matter on web projects?</title><content type='html'>&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;I was looking into some statistics on my&amp;nbsp;&lt;/span&gt;multiple&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;web project and found one very interesting stats on simple Lines of Code (LOC)&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: inherit;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV453TmvdqvnA2DaOi4eHSVJlfrVp0eIoJFJakiw8_v5KuMXLXEfBG6-2uVrsiZQiX13ej013c9mY9hY36toLSK25uCzSx79QDsuEhxKxPxrAYyV1shHzCAWSrfVjVtnstSUD0n9eGwKw/s1600/Website+Project+Code+Distribution+Metrics.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;260&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV453TmvdqvnA2DaOi4eHSVJlfrVp0eIoJFJakiw8_v5KuMXLXEfBG6-2uVrsiZQiX13ej013c9mY9hY36toLSK25uCzSx79QDsuEhxKxPxrAYyV1shHzCAWSrfVjVtnstSUD0n9eGwKw/s640/Website+Project+Code+Distribution+Metrics.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: inherit;&quot;&gt;
&amp;nbsp;* numbers are pure production code and does not include test code&lt;/div&gt;
&lt;div style=&quot;font-family: inherit;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;After looking at above&amp;nbsp;&lt;/span&gt;metrics&lt;span style=&quot;font-family: inherit;&quot;&gt;, I asked myself:&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;during initial stage of the project, are we thinking enough about every part of the software and doing enough research around which language, technology &amp;amp; framework to use for project?&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;On most of the projects we just talk and talk about which language is the right choice (Java vs Ruby vs .NET vs ...) for your web application development. W&lt;/span&gt;e are in so much rush to start that we don&#39;t even have time to do enough study/spike on each technology decision and provide right technical solution to client.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;b&gt;So what should I be thinking about, apart from core language and framework while deciding on architecture in initial stage of the project?&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;Understand project and its components/parts during inception, discuss &amp;amp; make initial decision about choosing framework &amp;amp; library of different technologies. Make sure all components fit well with each other.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Web 2.0:&lt;/b&gt; JavaScript, HTML and CSS is big part of your web application code. Do not ignore that.&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Is my application AJAX heavy? (page reload is kind of old fashioned now days). Choosing framework like&amp;nbsp;&lt;a href=&quot;http://angularjs.org/&quot; target=&quot;_blank&quot;&gt;angularjs&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;http://documentcloud.github.com/backbone/&quot;&gt;backbone.js&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;http://knockoutjs.com/&quot; target=&quot;_blank&quot;&gt;knockoutjs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Does my application has image cropping or chart need. Should I do it in browser using JavaScript such as&amp;nbsp;&lt;a href=&quot;http://raphaeljs.com/&quot; target=&quot;_blank&quot;&gt;raphaeljs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Check out templating engine and its support e.g. &lt;a href=&quot;http://mustache.github.com/&quot; target=&quot;_blank&quot;&gt;mustache&lt;/a&gt;, &lt;a href=&quot;http://haml-lang.com/&quot; target=&quot;_blank&quot;&gt;haml&lt;/a&gt;&amp;nbsp;and its port for specific language.&lt;/li&gt;
&lt;li&gt;how about using &lt;a href=&quot;http://lesscss.org/&quot; target=&quot;_blank&quot;&gt;less&lt;/a&gt;&amp;nbsp;or&amp;nbsp;&lt;a href=&quot;http://sass-lang.com/&quot; target=&quot;_blank&quot;&gt;saas&lt;/a&gt;&amp;nbsp;for CSS. This can help reducing your css effort significantly and more beautiful, concise, clean code.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;Data Store:&lt;/b&gt; Which data store is the right choice for kind of data processed and maintained by application?&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Choices are plenty now days, starting from traditional relational database, NoSQL databases (mongodb, riak, couchdb ...), graph database (neo4j), fast in-memory&amp;nbsp;like&amp;nbsp;databases (redis &amp;amp; memcached).&lt;/li&gt;
&lt;li&gt;Can I leverage client side data store (browser datastore) for features like&amp;nbsp;storing user preferences, session information etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;Evaluate Product as a Service:&lt;/b&gt; Can I leverage on PaaS for any feature in application?&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Do I need push notification service to serve dynamic content on my pages? checkout &lt;a href=&quot;http://www.pubnub.com/&quot; target=&quot;_blank&quot;&gt;pubnub&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Is image processing such as resize and cropping is required for website? checkout services like&amp;nbsp;&lt;a href=&quot;http://www.lightspun.com/&quot; target=&quot;_blank&quot;&gt;lightspun&lt;/a&gt; and &lt;a href=&quot;http://boxresizer.com/&quot; target=&quot;_blank&quot;&gt;boxresizer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;Go Could:&lt;/b&gt; Discuss and make initial thoughts on production&amp;nbsp;environment&amp;nbsp;setup and deployment. This helps on setting up local env which can be as close as production env and other non production setup.&amp;nbsp;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Leverage could as much as possible.&lt;/li&gt;
&lt;li&gt;Do I need to provision env using Chef or Puppet? Can I use same for local env setting and using tools like &lt;a href=&quot;http://vagrantup.com/&quot; target=&quot;_blank&quot;&gt;vagrant&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;Can I use S3 with ColudFront to serve my static content?&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;Automated testing:&lt;/b&gt; how much and at which level? Decide on unit tests, integration tests and functional tests&amp;nbsp;distribution.&amp;nbsp;Make sure not to repeat same tests. &amp;nbsp;Follow &lt;a href=&quot;http://watirmelon.com/tag/software-testing-pyramid/&quot; target=&quot;_blank&quot;&gt;software testing pyramid&lt;/a&gt;&amp;nbsp;structure.&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Unit can be at different levels&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;core programming level unit tests&lt;/li&gt;
&lt;li&gt;javascript unit tests are important since most of the sites now days are javascript heavy. &amp;nbsp;Check out &lt;a href=&quot;http://pivotal.github.com/jasmine/&quot; target=&quot;_blank&quot;&gt;Jasmine&lt;/a&gt; for JavaScript unit testing.&lt;/li&gt;
&lt;li&gt;template level unit tests&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Service level integration tests using your choice of unit testing framework.&lt;/li&gt;
&lt;li&gt;end2end functional tests, their are plenty of tools now days for browser functional testing. checkout &lt;a href=&quot;http://phantomjs.org/&quot; target=&quot;_blank&quot;&gt;phantomjs&lt;/a&gt;, &lt;a href=&quot;https://github.com/LearnBoost/tobi&quot; target=&quot;_blank&quot;&gt;tobi&lt;/a&gt;, cucumber, &lt;a href=&quot;http://jnicklas.github.com/capybara/&quot; target=&quot;_blank&quot;&gt;capybara&lt;/a&gt;&amp;nbsp;and last but most popular &lt;a href=&quot;http://seleniumhq.org/projects/webdriver/&quot; target=&quot;_blank&quot;&gt;selenium&amp;nbsp;webdriver&lt;/a&gt;.&lt;/li&gt;
&lt;ul&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/ol&gt;
Rest all that should continue such as choosing right technology with framework for server side development such as RoR or Java/Spring or Python/django etc...&lt;br /&gt;
&lt;br /&gt;
Happy inception.&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;font-family: inherit;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sunitspace.blogspot.com/feeds/3370977390574820853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sunitspace.blogspot.com/2011/11/ruby-vs-java-vs-net-how-much-does-it.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/3370977390574820853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/3370977390574820853'/><link rel='alternate' type='text/html' href='http://sunitspace.blogspot.com/2011/11/ruby-vs-java-vs-net-how-much-does-it.html' title='Ruby vs Java vs .NET - How much does it matter on web projects?'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15892638558536899020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV453TmvdqvnA2DaOi4eHSVJlfrVp0eIoJFJakiw8_v5KuMXLXEfBG6-2uVrsiZQiX13ej013c9mY9hY36toLSK25uCzSx79QDsuEhxKxPxrAYyV1shHzCAWSrfVjVtnstSUD0n9eGwKw/s72-c/Website+Project+Code+Distribution+Metrics.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3186574916549921356.post-4987994372506289819</id><published>2012-02-25T23:01:00.001+05:30</published><updated>2012-02-25T23:01:02.819+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="amazon"/><category scheme="http://www.blogger.com/atom/ns#" term="aws"/><category scheme="http://www.blogger.com/atom/ns#" term="https"/><category scheme="http://www.blogger.com/atom/ns#" term="s3"/><title type='text'>Amazon S3 learning with HTTPS serving very slow</title><content type='html'>On our site we have lots of images thumbnail getting served on HTTPS by Amazon S3. We were seeing very high load time in browsers upto 2-3 sec for approx 40-50KB size.&lt;br /&gt;
&lt;br /&gt;
We tried following load test on S3 and the results helped us making decision.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkGgj_yMlLx0x_jesYoaPhkU1kWy8iiu9LVDz53ZWeGwHIdClr1ry1kPmRE-cDvl1kM3RC7jna3aYiUEzmaZ-OgGjgvtdbYtT8t63txsyt1OqpYNdL0iksipkRE4b7lvL2ZLjbGzsERvw/s1600/s3+bucket+perf+test.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; margin-bottom: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;302&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkGgj_yMlLx0x_jesYoaPhkU1kWy8iiu9LVDz53ZWeGwHIdClr1ry1kPmRE-cDvl1kM3RC7jna3aYiUEzmaZ-OgGjgvtdbYtT8t63txsyt1OqpYNdL0iksipkRE4b7lvL2ZLjbGzsERvw/s640/s3+bucket+perf+test.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Conclusion:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Serving S3 content over HTTPS is slow&lt;/li&gt;
&lt;li&gt;S3 performance is not effected (does not degred by # of objects in bucket&lt;/li&gt;
&lt;li&gt;Using CloudFront to serve S3 content over&amp;nbsp;HTTPS&amp;nbsp;gives significant improvement in time&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://sunitspace.blogspot.com/feeds/4987994372506289819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sunitspace.blogspot.com/2012/02/amazon-s3-learning-with-https-serving.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/4987994372506289819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/4987994372506289819'/><link rel='alternate' type='text/html' href='http://sunitspace.blogspot.com/2012/02/amazon-s3-learning-with-https-serving.html' title='Amazon S3 learning with HTTPS serving very slow'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15892638558536899020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkGgj_yMlLx0x_jesYoaPhkU1kWy8iiu9LVDz53ZWeGwHIdClr1ry1kPmRE-cDvl1kM3RC7jna3aYiUEzmaZ-OgGjgvtdbYtT8t63txsyt1OqpYNdL0iksipkRE4b7lvL2ZLjbGzsERvw/s72-c/s3+bucket+perf+test.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3186574916549921356.post-1067344936984840417</id><published>2012-02-14T09:13:00.002+05:30</published><updated>2012-02-14T09:21:08.461+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="architecture"/><category scheme="http://www.blogger.com/atom/ns#" term="mongodb"/><category scheme="http://www.blogger.com/atom/ns#" term="nosql"/><title type='text'>NoSQL learnings &amp; gotchas based on MongoDB experience</title><content type='html'>I have been working on NoSQL database since last 6 months and had some interesting learning on when not to use NoSQL database.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;All following learning are based on my 6+ months NoSQL experience with mongoDB. This is an ongoing document which I am planning to keep updating as I keep learning.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8v9ATrnS_lsoKwEQlSqDqK3xBSDuSoFtplDd52VwYtimvL7ZhgLAERQ1o3irCbqRGCbPEffVc2KRq6fnG9bhMB5Bl72vIzrFzhuf6aEo1SX40A1AQ-6wcVcu974-3X0JA6aMYsv5o5CM/s1600/Screen+Shot+2012-02-14+at+9.20.07+AM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8v9ATrnS_lsoKwEQlSqDqK3xBSDuSoFtplDd52VwYtimvL7ZhgLAERQ1o3irCbqRGCbPEffVc2KRq6fnG9bhMB5Bl72vIzrFzhuf6aEo1SX40A1AQ-6wcVcu974-3X0JA6aMYsv5o5CM/s1600/Screen+Shot+2012-02-14+at+9.20.07+AM.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
One primary gotcha of new technology is, when to use it by knowing when not to use it.&amp;nbsp;Here is list of reasons, when you have to be careful choosing NoSQL,&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;i&gt;If your data is structured&lt;/i&gt;. Means your data follows predefined structure for all records like online web store, ticketing system etc. &lt;i&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;[Added: 10 Feb 2012]&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Your data has lots of relationships&lt;/i&gt;&lt;b&gt;,&lt;/b&gt; including bidirectional like many to many etc. You need to carry&amp;nbsp;references&amp;nbsp;around in the dataset like customer has orders and order belongs to customer.&amp;nbsp;&lt;i&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;[Added: 10 Feb 2012]&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Need lots of indexes on a document.&lt;/i&gt; You need search your document by multiple search criteria, means either your data is structured or multiple document stored as single document in database. Need to revisit your document design.&amp;nbsp;&lt;i&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;[Added: 10 Feb 2012]&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Transaction is important&lt;/i&gt;. need to update multiple dataset and it should either all succeed or fail like financial transaction of transfer from one account to another and required multiple data updates.&amp;nbsp;&lt;i&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;[Added: 10 Feb 2012]&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ol&gt;
Once you choose NoSQL don&#39;t fall into trap of designing and applying SQL best practices to NoSQL. Here is few example where SQL and NoSQL database differs.&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;i&gt;Do not assume your query is successful if it returns successfully&lt;/i&gt;. MongoDB query returns&amp;nbsp;immediately&amp;nbsp;and queues up queries on server for execution.&amp;nbsp;&lt;i&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;[Added: 10 Feb 2012]&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;It&#39;s not good practice to let your document grow over time.&lt;/i&gt; &amp;nbsp;MongoDB stores document in&amp;nbsp;sequential&amp;nbsp;manner without much buffer, assuming the document doesn&#39;t grow over a period of time. And if you add more content in your document it has to move your whole document in new place. &lt;i&gt;Trick&lt;/i&gt; is to create document with full content and default values OR adding some temp content while creating and removing it&amp;nbsp;immediately.&amp;nbsp;&lt;i&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;[Added: 10 Feb 2012]&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Indexes are more costly in NoSQL than standard SQL database.&amp;nbsp;&lt;i&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;[Added: 10 Feb 2012]&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ol&gt;</content><link rel='replies' type='application/atom+xml' href='http://sunitspace.blogspot.com/feeds/1067344936984840417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sunitspace.blogspot.com/2012/02/nosql-learnings-gotchas-based-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/1067344936984840417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/1067344936984840417'/><link rel='alternate' type='text/html' href='http://sunitspace.blogspot.com/2012/02/nosql-learnings-gotchas-based-on.html' title='NoSQL learnings &amp; gotchas based on MongoDB experience'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15892638558536899020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8v9ATrnS_lsoKwEQlSqDqK3xBSDuSoFtplDd52VwYtimvL7ZhgLAERQ1o3irCbqRGCbPEffVc2KRq6fnG9bhMB5Bl72vIzrFzhuf6aEo1SX40A1AQ-6wcVcu974-3X0JA6aMYsv5o5CM/s72-c/Screen+Shot+2012-02-14+at+9.20.07+AM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3186574916549921356.post-8019219819889601964</id><published>2012-02-07T14:37:00.000+05:30</published><updated>2012-02-07T14:37:43.514+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="architecture"/><category scheme="http://www.blogger.com/atom/ns#" term="CMS"/><title type='text'>CMS usage pattern - choose your CMS</title><content type='html'>&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Now days every business wants CMS capability in their app, at minimum for home page 
to show promotions, alerts, news &amp;amp; messages to end users. On each and every project I have been on in last 5 odd years, CMS was part of application in one or the other way. &lt;/span&gt;At the start of the project I always had to think and decide which CMS system should I go for.&amp;nbsp; &lt;span style=&quot;font-size: small;&quot;&gt;And working with 
different domain, some patterns started emerging in my thoughts and helped me making decision.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit; font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEix2hAk8S036N6Sz_qycbi-1nO1jWuvDFlqDzP9sfvMaNVO4-yTXpQoCQvEVa-Ow9jWdrLJh1s9VmC3tnqYzPC_i3Sr93LH3uvouImqFwbe67MAA7nTtYRps7L8fFPWkiY3CKROKYY7CVs/s1600/CMS.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi1cQu47-HjLWYdrZ-WR2yIS6wbtvKg8c3SvYEoAT_6bmB32jOT8cxrIYrXvO6TLGr4MkRxyr2yHeP8U5XUnNUAGvrub36-j0bxQvJMcBydXv5Fz5B5xSGGxoKc4SOFpVrHN7U7Z-TLfg/s1600/CMS.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;338&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi1cQu47-HjLWYdrZ-WR2yIS6wbtvKg8c3SvYEoAT_6bmB32jOT8cxrIYrXvO6TLGr4MkRxyr2yHeP8U5XUnNUAGvrub36-j0bxQvJMcBydXv5Fz5B5xSGGxoKc4SOFpVrHN7U7Z-TLfg/s640/CMS.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: inherit; font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;ol&gt;&lt;ul&gt;
&lt;/ul&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;I have worked with multiple feature rich CMS products, which provides business critical features such as versioning, publishing work flow, content promotion... . However, one of the key pain area in all of this feature rich CMS products is that development of remaining custom components either as plugins or customization modules if very difficult. Developing these ~20% of the custom components takes lot of time &amp;amp; effort with specialized skills. Most of the time we need to hack to get custom component build in existing CMS.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;And another pattern of CMS stated building in my mind, 1) Obtrusive and 2) Unobtrusive CMS. What I mean by obtrusive is, CMS doesn&#39;t integrate seamlessly in your application. Application needs to be developed within CMS. So now while choosing CMS I started looking into how easy or difficult it is to develop custom features/components within CMS.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;And I started looking into following criteria while choosing CMS:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Support for digital asset management (image repository with resizing) are very important for CMS. Look for Amazon S3 support too. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Content promotion from non-production env to production env is one of the most used feature. e.g. Create all the required content in stage and promote it to production before launch. Gives more flexibility to push release early to stage and get the content ready and later deploy and publish content in one go to production.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Free text search has become defacto requirement now days for any website. And hence more critical feature for CMS to have. Don&#39;t forget to try and see how good SEO support and inbuilt search is. This could become make and break deal for some business while choosing CMS. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Be aware of oversold CMS features which are hardly used in production.&amp;nbsp; 
Work flow management within CMS. Sounds good but practically what end 
user wants is just the option to preview and publish&amp;nbsp;(as review mode)&amp;nbsp;. &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-family: inherit; font-size: large;&quot;&gt;Which CMS to choose?&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;u&gt;&lt;b&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Type 1: Full CMS - P&lt;span style=&quot;font-size: small;&quot;&gt;ublishing &amp;amp; media websites&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;If you have capacity Build your own CMS. &lt;a href=&quot;http://sunitspace.blogspot.com/2012/02/build-your-own-cms.html&quot; target=&quot;_blank&quot;&gt;Here&lt;/a&gt; are some thoughts I have on the CMS system architecture.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Or&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Based on the requirement and skills available within the team decide on the full featured CMS system such as Liferay, Drupal etc.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;u&gt;&lt;b&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Type 2: Partial CMS - Online business websites&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Take any of-the-shelf lightweight CMS, which integrates seamlessly (unobtrusively)&amp;nbsp;in your application.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;e.g. taking open source CMS as rails 3 mounted application (www.locomotivecms.com or http://refinerycms.com/ or http://www.browsercms.org) and build you application as normal rails 3 application. hint: opensource CMS can be forked if required.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Or&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Build your own simple&amp;nbsp;unobtrusive&amp;nbsp;CMS. Checkout &lt;a href=&quot;http://sunitspace.blogspot.com/2012/02/build-your-own-cms.html&quot; target=&quot;_blank&quot;&gt;this&lt;/a&gt; article and build your own core component.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;u&gt;&lt;b&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Type 3: CMS for the namesake - few pages in application&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Build your own wiki style CMS with lightweight admin interface to update markups. e.g. Markdown is very popular and available in all languages. &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;My take?&amp;nbsp;&lt;b&gt;just build what you need.&lt;/b&gt;&amp;nbsp;initial investment will be more but it will save on customization, learning &amp;amp; lot with maintenance cost later. Spend time in development rather than learning, researching and hacking into CMS product.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Hope this article helps you in deciding your next CMS system. &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sunitspace.blogspot.com/feeds/8019219819889601964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sunitspace.blogspot.com/2011/12/cms-usage-pattern-choose-your-cms.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/8019219819889601964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/8019219819889601964'/><link rel='alternate' type='text/html' href='http://sunitspace.blogspot.com/2011/12/cms-usage-pattern-choose-your-cms.html' title='CMS usage pattern - choose your CMS'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15892638558536899020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi1cQu47-HjLWYdrZ-WR2yIS6wbtvKg8c3SvYEoAT_6bmB32jOT8cxrIYrXvO6TLGr4MkRxyr2yHeP8U5XUnNUAGvrub36-j0bxQvJMcBydXv5Fz5B5xSGGxoKc4SOFpVrHN7U7Z-TLfg/s72-c/CMS.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3186574916549921356.post-3561168148336868881</id><published>2012-02-07T08:51:00.000+05:30</published><updated>2012-02-07T09:47:29.516+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="architecture"/><category scheme="http://www.blogger.com/atom/ns#" term="CMS"/><title type='text'>Build your own CMS</title><content type='html'>&lt;span id=&quot;internal-source-marker_0.630654972512275&quot;&gt;&lt;span style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h1 dir=&quot;ltr&quot; style=&quot;font-weight: bold;&quot;&gt;

&lt;/h1&gt;
&lt;h1 dir=&quot;ltr&quot;&gt;

&lt;span style=&quot;background-color: #d9ead3; font-family: inherit; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;h1 dir=&quot;ltr&quot;&gt;

&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;background-color: #d9ead3; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Unobtrusive CMS&lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; - that integrate with your web application seamlessly. &lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;h1 dir=&quot;ltr&quot;&gt;



&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-size: large; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Yet Another CMS (YACMS)&lt;/span&gt;&lt;span style=&quot;vertical-align: baseline;&quot;&gt;&lt;br class=&quot;kix-line-break&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;span style=&quot;font-family: inherit; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Why build your own CMS? &lt;/span&gt;&lt;br /&gt;
&lt;ol style=&quot;font-weight: bold;&quot;&gt;
&lt;li style=&quot;font-size: 15px; font-weight: normal; list-style-type: decimal; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-family: inherit; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;CMS can’t be integrated within application, the application needs to be written in CMS. Drupal is written in PHP and it is full stack end2end. To develop application which is half &amp;amp; half, we need developer who can code in PHP Drupal way.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; font-weight: normal; list-style-type: decimal; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-family: inherit; white-space: pre-wrap;&quot;&gt;Some CMS are bound to frameworks - Radiant is written in RAILS and it ties down to specific version of rails and on top of that it changes rails default behavior so now I have to code according to radiant standard and not rails way.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; font-weight: normal; list-style-type: decimal; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-family: inherit; white-space: pre-wrap;&quot;&gt;Its quite difficult o migrate data from one env to another (test -&amp;gt; stage -&amp;gt; prod), take dumps from production to test/dev env, migration on version upgrade . One of the reason for this problem is use of RDBMS, which doesn’t suite the kind of data.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; font-weight: normal; list-style-type: decimal; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-family: inherit; white-space: pre-wrap;&quot;&gt;Editors friendly - users need to learn CMS way to create content. And its quick difficult for business users to create content in CMS due to its complexity. Should be able to see preview of the page before publish. Easy versioning and restore feature.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; font-weight: normal; list-style-type: decimal; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-family: inherit; white-space: pre-wrap;&quot;&gt;CMS doesn’t provide effective asset management within CMS. Integrating with other systems makes it really difficult for such tasks.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Goals:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ol style=&quot;font-weight: bold;&quot;&gt;
&lt;li style=&quot;font-size: 15px; font-weight: normal; list-style-type: decimal; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Unobtrusive &amp;amp; Light Weight&lt;/span&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;- I should be able to use CMS anyway I want to. Means I already have an application, I want to add CMS to it and not other way round.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; font-weight: normal; list-style-type: decimal; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Easy migration&lt;/span&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt; - be it from one env to another or upgrades.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; font-weight: normal; list-style-type: decimal; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;background-color: #d9ead3; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Platform &amp;amp; Framework agnostic&lt;/span&gt;&lt;span style=&quot;font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;- I should be able to integrate &amp;amp; deploy on any platform. &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; font-weight: normal; list-style-type: decimal; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Easy to extend&lt;/span&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt; - easy to create, integrate &amp;amp; extend features by means of plugins.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; font-weight: normal; list-style-type: decimal; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;background-color: #d9ead3; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Integrated Asset Management &lt;/span&gt;&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;- with base feature such as upload, resize, crop images within CMS.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;span style=&quot;font-family: inherit; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h2 dir=&quot;ltr&quot; style=&quot;font-weight: bold;&quot;&gt;



&lt;span style=&quot;font-family: inherit; font-size: small; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Architecture:&lt;/span&gt;&lt;/h2&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;CMS build as 3 independent components, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;core&lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; (yacms-core) - engine that builds pages using modules (goal: Unobstrusive, Platform &amp;amp; Framework agnostic). this is the component this can be plugged into existing application unobtrusively. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;admin web app &lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;(yacms-admin) - cool &lt;/span&gt;&lt;span style=&quot;background-color: #d9ead3; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;drag &amp;amp; drop UI for new page creation&lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;. allows editor to &lt;/span&gt;&lt;span style=&quot;background-color: #d9ead3; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;edit pages inline &lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;on actual site. (goal: Editor friendly), draft preview of the page. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;web&lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; (yacms-web) - web app provides front end for end users to view pages. Allows different front ends such as for Sinatra, Spring MVC based Java, Mobile App.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit; font-size: 15px; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit; font-size: 15px; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigsEZ4qwRNmlFZdSceq_ZHAFB45T3jXpH93XumDurH3eW70RlG9MHVkeYxuZzq9vEhIJivjFWz63nXkdn1tBpwzY5PA-71_bMf2FF88xObyr3K7DVQUrdd_QJPOLl6RSQusggNIDRUWVc/s1600/Screen+Shot+2012-02-07+at+9.23.14+AM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;440&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigsEZ4qwRNmlFZdSceq_ZHAFB45T3jXpH93XumDurH3eW70RlG9MHVkeYxuZzq9vEhIJivjFWz63nXkdn1tBpwzY5PA-71_bMf2FF88xObyr3K7DVQUrdd_QJPOLl6RSQusggNIDRUWVc/s640/Screen+Shot+2012-02-07+at+9.23.14+AM.png&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-size: 15px; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;plug-in architecture for modules &lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;(goal: easy to extend and add new features to CMS)&lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; page is made of modules. allows user to create their own module and integrate easily. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;type of modules &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ol style=&quot;font-weight: bold;&quot;&gt;
&lt;li style=&quot;font-size: 15px; font-weight: normal; list-style-type: decimal; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-family: inherit; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;page modules - page modules define page data e.g. paragraph, video, commenting etc. &lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 15px; font-weight: normal; list-style-type: decimal; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-family: inherit; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;application modules - modules that apply across pages such as navigation, tagging, google analytics etc.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;modules/plugins has directory structure similar to rails applications, (this is just the draft to understand modules)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;….&lt;/span&gt;&lt;span style=&quot;font-size: 12px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;modules&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;namespace&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;modulename&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;views&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;controllers&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #d9ead3; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;dream goal is to make modules to be added/removed/upgraded using rake task and we need to provide module market place which will allow user to easily find modules.&lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h3 dir=&quot;ltr&quot; style=&quot;font-weight: bold;&quot;&gt;

&lt;span style=&quot;font-family: inherit; font-size: small;&quot;&gt;

&lt;span style=&quot;vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Technologies stack&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Ruby &lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;as development language for most of the components. This allows to run core on any platform e.g. using JRuby to run in container with Java web app and also planning to expose RESTful services if this needs to be out of container. &lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Rails &lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;for admin web app component and Sinatra, Rails as sample web front end for CMS.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;NoSQL&lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; - to store all page data as one record with page content, other data like tagging, comments, etc. also store all the customization such as layouts, snippets etc (goal: easy migration, versioning)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Domain Specific Language -&lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; to define page with layout, areas, block &amp;amp; modules (goal: Easy migration, Easy to extend, Framework agnostic)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;Markup Language&lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; - to create page content&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;RMagick or ImageScience&lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt; - for image processing&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sunitspace.blogspot.com/feeds/3561168148336868881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sunitspace.blogspot.com/2012/02/build-your-own-cms.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/3561168148336868881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/3561168148336868881'/><link rel='alternate' type='text/html' href='http://sunitspace.blogspot.com/2012/02/build-your-own-cms.html' title='Build your own CMS'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15892638558536899020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigsEZ4qwRNmlFZdSceq_ZHAFB45T3jXpH93XumDurH3eW70RlG9MHVkeYxuZzq9vEhIJivjFWz63nXkdn1tBpwzY5PA-71_bMf2FF88xObyr3K7DVQUrdd_QJPOLl6RSQusggNIDRUWVc/s72-c/Screen+Shot+2012-02-07+at+9.23.14+AM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3186574916549921356.post-4608373663981559052</id><published>2011-04-15T19:15:00.016+05:30</published><updated>2011-06-08T17:42:23.697+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="agile"/><title type='text'>Design for Feature, Code for Story</title><content type='html'>I have been practicing agile development engineering practices for almost more than 4 yrs now.  One of practice about agile development is it talks about ‘code for story’, which means you just do simple enough implementation required for the story. Why? because you don’t know what’s required in future and will remain as it is or change.&lt;br /&gt;
&lt;br /&gt;
Now considering ‘code for story’ practice, this is what happens on the ground. Pair picks up a first story of a feature and ‘just did what was required for the story to implement’, after few days another pair picks up a story on same feature and says ‘Ohh… I have to first refactor the code so that it can be extended to implement next story’, which means the work done by first story is partially or fully refactored. Fine, but similar approach continues as we keep picking up subsequent stories and Project Manager freaks out saying ‘Refactoring is good, but when it required for every story that we implement is not just right OR something wrong with my understanding of refactoring.’ &lt;br /&gt;
&lt;br /&gt;
Let me take a very trivial example to explain above scenario. For the first story, I just used simple member variable since that story deals with only one item, &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;public class Employee {
    String department;
}
&lt;/pre&gt;&lt;br /&gt;
next story extends the feature by changing simple member variable to List of objects which means changing all signatures and yes changing all tests as part of refactoring. &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;public class Employee {
    List&amp;lt;Department&amp;gt; departments;
}
&lt;/pre&gt;&lt;br /&gt;
Now next story requires extending the feature again with changing List to Map and again same refactoring but more tedious. &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;public class Employee {
    Map&amp;lt;string, Department&amp;gt; departments;
}
&lt;/pre&gt;&lt;br /&gt;
And we end up refactoring (throwing away) work done in previous stories. This scenario happens quite lot of time on projects. &lt;br /&gt;
&lt;br /&gt;
We can avoid such scenarios on project by redefining a practice as ‘Design for Feature and Code for Story’. Which means when I am working on any story I keep in mind the all feature stories and design my application to cater for feature while making sure I just code what is required for the story in play. &lt;br /&gt;
&lt;br /&gt;
To achieve this &lt;ul&gt;&lt;li&gt; developers and business analyst needs to make sure developers implementing the story has enough context about feature and understands the story scope within feature. &lt;/li&gt;&lt;li&gt; leads on the project to participate in discussion during first few stories of the feature development, call huddles initially to gather different ideas in designing for feature. &lt;/li&gt;&lt;li&gt; it might be that your first few stories takes little extra time that just doing simple way, however make sure to weight that extra time &amp;amp; effort vs. benefits in future story implementation. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;
Doing high level design early in cycle helps in faster development due to reduced rework and less throw away on project.&lt;br /&gt;
&lt;br /&gt;
Watch Out and avoid following when you ‘Design for Feature and Code for Story’, &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Doing low-level design and putting lots of effort in just design. Going into mode of ‘upfront low level design for feature’. &lt;/li&gt;
&lt;li&gt;Do not implement or start writing code for future stories. It’s okay if your future stories may take just few hours, don’t do it now. &lt;/li&gt;
&lt;li&gt;Design for Feature doesn’t mean you freeze it once decided. Let design still evolve as you keep implementing stories of the feature.&lt;/li&gt;
&lt;/ul&gt;</content><link rel='replies' type='application/atom+xml' href='http://sunitspace.blogspot.com/feeds/4608373663981559052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sunitspace.blogspot.com/2011/04/design-for-feature-code-for-story.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/4608373663981559052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3186574916549921356/posts/default/4608373663981559052'/><link rel='alternate' type='text/html' href='http://sunitspace.blogspot.com/2011/04/design-for-feature-code-for-story.html' title='Design for Feature, Code for Story'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15892638558536899020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>