<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5013989326299900663</id><updated>2012-02-16T04:25:41.055-06:00</updated><category term='stored procedures'/><category term='SQL'/><category term='anti-pattern'/><category term='HL7'/><category term='Authorization filters'/><category term='ADT'/><category term='Membership provider'/><category term='ASP.NET MVC 3'/><category term='Visual Studio 2010'/><category term='ASP.NET MVC'/><category term='remote teams'/><category term='ASP.NET'/><category term='C#'/><category term='oData'/><category term='discharge'/><category term='transfer'/><category term='CDA'/><category term='TDD'/><category term='scrum'/><category term='Agile'/><category term='Composition'/><category term='admission'/><category term='ADO.NET Entity Framework'/><category term='offshore'/><category term='Razor'/><category term='code smells'/><category term='OOP'/><category term='Areas'/><category term='Open Data Protocols'/><category term='Http404'/><category term='Github'/><category term='off-shore teams'/><category term='data'/><category term='BDUF'/><category term='System.Web.Routing'/><category term='ASP.NET MVC 2'/><category term='Inheritance'/><category term='.NET'/><category term='It Depends'/><title type='text'>iterate{ design; develop; test; release }</title><subtitle type='html'>discussions of software technology, applications and development</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tapkan.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tapkan.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Baskin Tapkan</name><uri>http://www.blogger.com/profile/16745523698419707042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_ZuHHjM8p4AQ/SZXkIFSPdjI/AAAAAAAAA60/Vsz2d7pAP3M/S220/BaskinTapkan_linkedin.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5013989326299900663.post-6453664139519147256</id><published>2011-12-17T16:34:00.001-06:00</published><updated>2011-12-17T16:39:10.576-06:00</updated><title type='text'>Tapkan Top Three of 2011</title><content type='html'>&lt;p&gt;Well yet another new year is upon us, I would like to share with you my list of top three. It certainly has been a productive year and without further due, here is my list:&lt;/p&gt; &lt;h3&gt;&lt;a href="http://lh6.ggpht.com/-HOcCvBSF07M/Tu0Y0OuATxI/AAAAAAAAB_I/sxfw_jCCsDk/s1600-h/ipad2_picture%25255B6%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="ipad2_picture" border="0" alt="ipad2_picture" align="right" src="http://lh5.ggpht.com/-KZqgwZg_u0A/Tu0Y0UEaaII/AAAAAAAAB_Q/N6YALA8ZgEU/ipad2_picture_thumb%25255B4%25255D.png?imgmax=800" width="352" height="243"&gt;&lt;/a&gt;&lt;/h3&gt; &lt;h3&gt;1.&amp;nbsp; iPad 2&lt;/h3&gt; &lt;p align="justify"&gt;Got my mine a few weeks after the initial release and had it inscribed as well (being geek), but it certainly has been a game changer in many ways I consume news, read books and communicate. The battery life, size, weight, and dimensions are almost perfect. The only gripe I may have is the screen resolution. The Retina display for the next generation of iPad will be very nice. The other nice thing going for iPad is the corporate executives are all over it and they are forcing the corporate IT to adopt and accommodate them in the network. I am certainly taking advantage of this, even though I am not an executive. This is certainly not the case with Android tablet at this time. &lt;/p&gt; &lt;p align="justify"&gt;With the acquisition of my iPad in mid April, I stopped buying physical books. Thanks to O’Reilly Media and their facebook page, I acquired legally a slew of technical books. The Amazon Kindle for iPad is sufficient but there is also room for improvement. I did test drive the Amazon Kindle Fire for the weekend, but being an iPad user, it was not the same. And it should not be (perhaps you may argue), it is an “e-reader”. Anyway, if you are in the market and can afford one, I would highly suggest in getting an iPad.&lt;/p&gt; &lt;h3&gt;2.&amp;nbsp; Ubuntu (Desktop + Server)&lt;/h3&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-XcscDpD6pN0/Tu0Y0zndrxI/AAAAAAAAB_Y/byzNY0tG1OU/s1600-h/ubuntu-logo-apr08%25255B4%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="ubuntu-logo-apr08" border="0" alt="ubuntu-logo-apr08" align="left" src="http://lh5.ggpht.com/-dp6ylw5c3RQ/Tu0Y0zTcqpI/AAAAAAAAB_g/vEpvmNyj9kk/ubuntu-logo-apr08_thumb%25255B2%25255D.jpg?imgmax=800" width="191" height="198"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align="justify"&gt;I have been dabbling with the Linux distributions for awhile, started back in early 2000’s with the SuSE, which got acquired by Novell. I have a dedicated machine running SuSE for many years, but just over a year ago, I switched to Ubuntu, starting with 9 (I think), but 10.04 was a great stable release. I had been mostly running desktop editions but recently I also started using the servers, as part of my job. I am impressed by the features, the performance. &lt;/p&gt; &lt;p align="justify"&gt;Being open source is both a blessing and curse, when it comes to desktop though. One can easily ditch Windows or Mac OS’es if there were support for certain applications, but there is always a need for Windows and Mac OS since not everything is available. I really like to see cloud based storage and computing environments support Linux flavors. Netflix, Amazon Kindle Reader and Evernote. If you’re reading that goes out to you. Get on aboard!&lt;/p&gt; &lt;h3&gt;3.&amp;nbsp; VMware vSphere Hypervisor™ (ESXi)&lt;/h3&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-jNiOIqCmZQk/Tu0Y1E6KFmI/AAAAAAAAB_o/qYNS3Pt5q0Q/s1600-h/vmware-esxi-client-connect%25255B4%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="vmware-esxi-client-connect" border="0" alt="vmware-esxi-client-connect" src="http://lh6.ggpht.com/-afbCq-GDgXM/Tu0Y1XOfETI/AAAAAAAAB_w/0QwwZwgKR8Q/vmware-esxi-client-connect_thumb%25255B2%25255D.jpg?imgmax=800" width="382" height="336"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Hypervisor! Huh, what is that? Well, that is about virtualization, my friends. I am not going to discuss what virtualization is here, but if you are developing and writing software and targeting many other platforms, you have to know about this stuff. I had been dragging my feet in getting a decent hypervisor because of time and resources and the difficulty of perceived configuration.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-pUNF7J5aBOw/Tu0Y1oUimTI/AAAAAAAAB_4/NjJLc2a0Uqg/s1600-h/esx21admin_architecture%25255B5%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="esx21admin_architecture" border="0" alt="esx21admin_architecture" src="http://lh4.ggpht.com/-knZhDbO8QXU/Tu0Y1_dPWJI/AAAAAAAACAA/qSk0tSighOE/esx21admin_architecture_thumb%25255B2%25255D.jpg?imgmax=800" width="446" height="282"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Fear no more! ESXi is a breeze to install and it is FREE (so is Ubuntu) for one server up to 32 GB of RAM. As recommended by two partners at work, we downloaded and installed on one Dell T310 server (initially 8 GB of RAM, then we upgraded to 32 GB). I have been concurrently running 3-4 configurations with very little contention. Although I really have not done any bare metal comparison but they run quite decent. A subsequent system crash at home (my poor Ubuntu desktop on DIY hardware ;-( created an opportunity to try it at home/office, and it certainly changed my computing landscape. FTW! I have consolidated my old VHDs onto vmWare and haven’t looked back. Go check them out!&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-5QjZ0ZRnOxE/Tu0Y2KvEv_I/AAAAAAAACAI/kzDZ16HHHXc/s1600-h/xmas-tree%25255B4%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="xmas-tree" border="0" alt="xmas-tree" src="http://lh4.ggpht.com/-3jV6hc8IxM0/Tu0Y2SqZe6I/AAAAAAAACAQ/Ni7CYJrYrus/xmas-tree_thumb%25255B2%25255D.jpg?imgmax=800" width="76" height="110"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;What an amazing year with certainly sad news! “Staying foolish, staying hungry”[Steve Jobs], looking forward to 2012… Seasons’ Greetings Everyone!&lt;/p&gt; &lt;p&gt;Happy Coding,&lt;/p&gt; &lt;p&gt;Baskin&lt;/p&gt; &lt;p&gt;direct links: &lt;br&gt;[1] &lt;a href="http://www.apple.com/ipad/"&gt;http://www.apple.com/ipad/&lt;/a&gt;&lt;br&gt;[2] &lt;a href="http://www.ubuntu.com/"&gt;http://www.ubuntu.com/&lt;/a&gt;&lt;br&gt;[3]&lt;a href="http://www.vmware.com/products/vsphere-hypervisor/overview.html"&gt;http://www.vmware.com/products/vsphere-hypervisor/overview.html&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5013989326299900663-6453664139519147256?l=tapkan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tapkan.blogspot.com/feeds/6453664139519147256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tapkan.blogspot.com/2011/12/tapkan-top-three-of-2011.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/6453664139519147256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/6453664139519147256'/><link rel='alternate' type='text/html' href='http://tapkan.blogspot.com/2011/12/tapkan-top-three-of-2011.html' title='Tapkan Top Three of 2011'/><author><name>Baskin Tapkan</name><uri>http://www.blogger.com/profile/16745523698419707042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_ZuHHjM8p4AQ/SZXkIFSPdjI/AAAAAAAAA60/Vsz2d7pAP3M/S220/BaskinTapkan_linkedin.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-KZqgwZg_u0A/Tu0Y0UEaaII/AAAAAAAAB_Q/N6YALA8ZgEU/s72-c/ipad2_picture_thumb%25255B4%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5013989326299900663.post-8828038787069021215</id><published>2011-09-09T08:11:00.001-05:00</published><updated>2011-09-09T08:23:18.835-05:00</updated><title type='text'>Case for Cloud/Online Storage and why you need one</title><content type='html'>&lt;p&gt;Increasingly with the information and content we generate we rely on various devices to store our digital data. Recently this has been emphasized with the fact that we all use some sort of digital medium at an increasing rate. The content we generate on a day-in/day-out basis is not always in our control and this can become an issue when the content leaves our hands or when you lose it unexpectedly. &lt;/p&gt; &lt;p&gt;For example, I typically use external HD's in various sizes to move content around and archive. As early as few years back, I have purchased a 160GB Seagate Travel drive, then got a few more later 250GB to 320GB. Couple of months back I purchased a 2 TB Western Digital driver for a little over $100. Now just yesterday read about Seagate's announcement of availability of a 4 TB drive. As you see capacities are growing, but our digital media are getting scattered than ever. Oh, don't forget the fact that these devices can and will fail... &lt;/p&gt; &lt;p&gt;So what are the alternatives? In the last six months or so, as part of my job at &lt;a href="http://imation.com"&gt;Imation&lt;/a&gt;, I have been involved in planning, configuring, and testing various cloud storage technologies and benchmarked a few along the way. These include &lt;a href="http://mozy.com"&gt;Mozy&lt;/a&gt;, &lt;a href="http://crashplan.com"&gt;CrashPlan&lt;/a&gt;, &lt;a href="http://carbonite.com"&gt;Carbonite&lt;/a&gt;, &lt;a href="http://ninetechnology.com"&gt;Nine Technology&lt;/a&gt;, &lt;a href="http://remote-backup.com"&gt;Remote-Backup systems&lt;/a&gt;, &lt;a href="http://backblaze.com"&gt;Backblaze&lt;/a&gt;, etc. I have done comparisons in terms of speed, back-end efficiency (as applicable, compression, deduplication), and of course, usability. All of them works and they do a decent job depending on your requirements and environment settings, your flavor of the OS, etc. &lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://lh3.ggpht.com/-31_ni4RB4KU/TmoSlLEU0cI/AAAAAAAABXc/mXU1B6nwmkk/s1600-h/iCloud%25255B2%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="iCloud" border="0" alt="iCloud" src="http://lh6.ggpht.com/-A62qdSYYwOE/TmoSlrs9K0I/AAAAAAAABXg/B-x_9-SNXLI/iCloud_thumb.png?imgmax=800" width="220" height="196"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Also Apple's iCloud is just around the corner if you are a Mac-Head. Google has started integrating its Android content with Google+ and I am sure Microsoft and others won't be too far behind by pushing their service users' digital content to their online services and applications.&lt;/p&gt; &lt;p&gt;But don’t wait! If you haven't checked out a cloud/online storage solution by now, you are certainly missing out and leaving yourself vulnerable to an unexpected external hard disk crash or lost media by any means (my dog ate my SD-card ;-). If you have tons of content and limited bandwidth, some do off-line cloud seeding which is a way to load your data off-line to their cloud. This involves shipping a physical medium to the cloud storage vendors’ site.&lt;/p&gt; &lt;p&gt;So go check out those and many other Cloud Storage Vendors and decide which one you like best. I have a few favorites and you should ping me if you want to hear about them. Meantime, do your homework and consolidate your digital content online. Concerned about privacy? Really? (just kidding, that is probably another blog post coming out later). &lt;/p&gt; &lt;p&gt;Baskin&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5013989326299900663-8828038787069021215?l=tapkan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tapkan.blogspot.com/feeds/8828038787069021215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tapkan.blogspot.com/2011/09/case-for-cloudonline-storage-and-why.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/8828038787069021215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/8828038787069021215'/><link rel='alternate' type='text/html' href='http://tapkan.blogspot.com/2011/09/case-for-cloudonline-storage-and-why.html' title='Case for Cloud/Online Storage and why you need one'/><author><name>Baskin Tapkan</name><uri>http://www.blogger.com/profile/16745523698419707042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_ZuHHjM8p4AQ/SZXkIFSPdjI/AAAAAAAAA60/Vsz2d7pAP3M/S220/BaskinTapkan_linkedin.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-A62qdSYYwOE/TmoSlrs9K0I/AAAAAAAABXg/B-x_9-SNXLI/s72-c/iCloud_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5013989326299900663.post-3911077329151842058</id><published>2011-04-03T08:24:00.003-05:00</published><updated>2011-04-03T08:34:44.410-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Http404'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET MVC 3'/><category scheme='http://www.blogger.com/atom/ns#' term='Razor'/><category scheme='http://www.blogger.com/atom/ns#' term='Github'/><title type='text'>404–This is not the web page you are looking for</title><content type='html'>&lt;p&gt;On a given website, not all users will type the right link, and your ASP.NET MVC pages will have the exact controller action to render a given view.&amp;nbsp; In such cases, you need a nice 404 page.&amp;nbsp; You can go as fancy as &lt;a href="http://github.com/404"&gt;github’s&lt;/a&gt; 404.&amp;nbsp; Check this out.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_ZuHHjM8p4AQ/TZh1G79wYfI/AAAAAAAABCY/flFLyH8Z0AE/s1600-h/github_404%5B3%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="github_404" border="0" alt="github_404" src="http://lh5.ggpht.com/_ZuHHjM8p4AQ/TZh1HeKHXmI/AAAAAAAABCc/RcTWvc7rDXY/github_404_thumb%5B1%5D.png?imgmax=800" width="465" height="200"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;You can achieve this and similar other errors tapping into the Application_Error handler in your&lt;em&gt; Global.asax&lt;/em&gt; file:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:27ef462f-e261-487f-8f6b-7a3bde6a39b0" class="wlWriterEditableSmartContent"&gt;&lt;pre style=" width: 483px; height: 604px;background-color:Silver;overflow: auto;;font-family:Consolas;font-size:12"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;protected&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Application_Error(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, EventArgs e)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;            var app &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (MvcApplication)sender;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;            var context &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; app.Context;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;            var ex &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; app.Server.GetLastError();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;            context.Response.Clear();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;            context.ClearError();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;            var httpException &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; ex &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt; HttpException;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;            var routeData &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; RouteData();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;            routeData.Values[&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;controller&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;] &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;Error&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;            routeData.Values[&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;exception&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;] &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; ex;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;            routeData.Values[&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;action&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;] &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;http500&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (httpException &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;switch&lt;/span&gt;&lt;span style="color: #000000;"&gt; (httpException.GetHttpCode())&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;                {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;404&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; &lt;span style="color: #000000;"&gt;                        routeData.Values[&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;action&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;] &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000;"&gt;http404&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt; &lt;span style="color: #000000;"&gt;                        &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="color: #000000;"&gt;                   &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; implement other http statuses here as well.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt; &lt;span style="color: #000000;"&gt;            IController controller &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ErrorController();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt; &lt;span style="color: #000000;"&gt;            controller.Execute(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; RequestContext(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; HttpContextWrapper(context), &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt; &lt;span style="color: #000000;"&gt;                routeData));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Then add an &lt;em&gt;ErrorController.cs&lt;/em&gt; file and implement the below:&lt;/p&gt;&lt;br /&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:2d3b78d2-d7b0-4075-aafe-cda361e0a9cd" class="wlWriterEditableSmartContent"&gt;&lt;pre style=" width: 473px; height: 258px;background-color:Silver;overflow: auto;;font-family:Consolas;font-size:12"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; Http404NotFound.Controllers&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; ErrorController : Controller&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; ActionResult Http404()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; View();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; implementation of other status can go here...&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Using the new Razor syntax and file format, The &lt;em&gt;Http404.cshtml&lt;/em&gt; can look like this:&lt;/p&gt;&lt;br /&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:947e968a-107d-47cb-a316-fe4a2f7784bb" class="wlWriterEditableSmartContent"&gt;&lt;pre style=" width: 482px; height: 169px;background-color:Silver;overflow: auto;;font-family:Consolas;font-size:12"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #000000;"&gt;@{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt; &lt;span style="color: #000000;"&gt;    ViewBag.Title = &amp;quot;Http404&amp;quot;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;4&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;5&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;h2&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Http404&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;h2&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;6&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;img &lt;/span&gt;&lt;span style="color: #FF0000;"&gt;src&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;=&amp;quot;../../Content/images/github_404.PNG&amp;quot;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;7&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;8&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;You can find more MVC Cook book recipes in &lt;a href="http://www.packtpub.com/asp-net-mvc-2-cookbook/book"&gt;ASP.NET MVC 2 Cookbook&lt;/a&gt;. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Happy Coding! &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5013989326299900663-3911077329151842058?l=tapkan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tapkan.blogspot.com/feeds/3911077329151842058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tapkan.blogspot.com/2011/04/404this-is-not-web-page-you-are-looking.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/3911077329151842058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/3911077329151842058'/><link rel='alternate' type='text/html' href='http://tapkan.blogspot.com/2011/04/404this-is-not-web-page-you-are-looking.html' title='404–This is not the web page you are looking for'/><author><name>Baskin Tapkan</name><uri>http://www.blogger.com/profile/16745523698419707042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_ZuHHjM8p4AQ/SZXkIFSPdjI/AAAAAAAAA60/Vsz2d7pAP3M/S220/BaskinTapkan_linkedin.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_ZuHHjM8p4AQ/TZh1HeKHXmI/AAAAAAAABCc/RcTWvc7rDXY/s72-c/github_404_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5013989326299900663.post-873499288820815449</id><published>2010-12-30T14:22:00.001-06:00</published><updated>2010-12-30T14:24:38.332-06:00</updated><title type='text'>Red-Green-Refactor</title><content type='html'>&lt;p&gt;Quite possibly the last blog of the year, and want to wish everyone a Happy and Productive 2011.&amp;nbsp; Well, what a year it has been.&amp;nbsp; I should probably do a 2010-Retrospective at a later post, but for now, I want to stress out the importance of unit testing.&lt;/p&gt; &lt;p&gt;Currently with my team, we are working on a partner integration project where we call a few web services to initiate a process, and in return expose a few services (URI’s) to receive process results.&amp;nbsp; We are using WCF, C#, .NET 3.5, Linq-to-SQL, and SQL Server as the backend.&lt;/p&gt; &lt;p&gt;Although a few months into design, specification and development of the project, we have made decent progress.&amp;nbsp; There are two separate projects used for testing the code base.&amp;nbsp; The code has been factored out into three separate projects, Services – Business and Data Access, which is quite typical for .NET enterprise type projects.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Not sure if you belong to the camp of testing your code, or you rather use the FDD method (Faith-Driven-Development : “I believe my code will work”).&amp;nbsp; This is plucked from a relatively recent tweet by @lazycoder, but I think he also retweeted.&amp;nbsp; You have to look into it to see who originally coined the term.&amp;nbsp; But FDD is a practice which one can easily follow especially when you are time constrained and just want to call “I am done”.&amp;nbsp; I hope you belong to the TDD camp (Test Driven Development).&lt;/p&gt; &lt;p&gt;So, why unit test?&amp;nbsp; I have seen and read many blogs about this, but rather share with you my opinion why and how it works for me.&amp;nbsp; First, and foremost, it makes me to “think” about my code and what I want to deliver.&amp;nbsp; You have one piece of feature you want to develop and develop well.&amp;nbsp; Once you test and worked out the feature-set, you move to the next.&amp;nbsp; &lt;/p&gt; &lt;p&gt;It makes you think writing code that is decoupled from each other.&amp;nbsp; Ask yourself. How many times do you “new up” an object in your method?&amp;nbsp; Can you do dependency injection?&amp;nbsp; By the way, there is a great book (currently in MEAP) by Mark Seeman which I have reading along, called &lt;a href="http://www.manning.com/seemann/"&gt;Dependency Injection .NET&lt;/a&gt;.&amp;nbsp; I suggest you check it out. Anytime you create an instance of an object in your method, you are creating coupling.&amp;nbsp; This could cause some pain when those instances are not available and you decide not to unit test.&amp;nbsp; But you already know that right? &lt;/p&gt; &lt;p&gt;Majority of the time, you get to see and test for the edge cases even though they could be overlooked. So you can easily fake/stub/mock an object and create the test case for those edge cases.&amp;nbsp; You can plan and execute exceptions in isolation.&amp;nbsp; Don’t let the user/interface find out what you are about to do.&amp;nbsp; &lt;/p&gt; &lt;h2&gt;Increased Decoupling&lt;/h2&gt; &lt;p&gt;Can’t say more.&amp;nbsp; Do you want decoupled code?&amp;nbsp; Better design?&amp;nbsp; You should unit test. Refactoring, what an easy thing to do!&amp;nbsp; Because unit testing allows you to focus on one thing at a time.&amp;nbsp; Not the three-four levels up or down.&lt;/p&gt; &lt;p&gt;In short (and I want to keep it short), if you are writing enterprise applications, I see no way around doing it without unit tests (plus integration tests).&amp;nbsp; Oh, before I leave, please check out &lt;a href="http://www.jetbrains.com/resharper/"&gt;Resharper&lt;/a&gt; which is a great plugin for Visual Studio which especially helps with the process plus many other enhancements.&lt;/p&gt; &lt;p&gt;Thanks for reading and Happy New Year!&lt;/p&gt; &lt;p&gt;Baskin&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5013989326299900663-873499288820815449?l=tapkan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tapkan.blogspot.com/feeds/873499288820815449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tapkan.blogspot.com/2010/12/red-green-refactor.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/873499288820815449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/873499288820815449'/><link rel='alternate' type='text/html' href='http://tapkan.blogspot.com/2010/12/red-green-refactor.html' title='Red-Green-Refactor'/><author><name>Baskin Tapkan</name><uri>http://www.blogger.com/profile/16745523698419707042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_ZuHHjM8p4AQ/SZXkIFSPdjI/AAAAAAAAA60/Vsz2d7pAP3M/S220/BaskinTapkan_linkedin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5013989326299900663.post-6030144269530523953</id><published>2010-09-02T09:50:00.002-05:00</published><updated>2010-09-02T11:01:59.465-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='stored procedures'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='code smells'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='offshore'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>When everyone agrees</title><content type='html'>&lt;p&gt;Don’t you find it odd when everyone agrees, or it feels like at times?&amp;nbsp; Then there is an eerie silence… Even odder in remote WebEx/Skype type meetings.&amp;nbsp; I have been working with off-shore development over a year now and have mixed feelings during this interaction.&amp;nbsp; Most of the time, it feels like we all agree but tangible outcomes are not happening.&amp;nbsp; &lt;/p&gt; &lt;p&gt;First of all, I am not sure if the rules of the game are set the same both for on-shore (US-based) or off-shore (outside of US).&amp;nbsp; Definitely there are differences in our training background and our craftsmanship and values. As a software sr. developer, jr. architect who is trained in the US and actively practicing over 13 years, I value good software craftsmanship, applications which are tested, designed and developed according to some best practices that maintainable and scalable.&amp;nbsp; This is really what I strive for and encourage &amp;amp; mentor others do so, including soon to be my past my off-shore team as well.&amp;nbsp; However the road traveled was rocky, and ran into a few obstacles.&amp;nbsp; &lt;/p&gt; &lt;p&gt;So what happened?&amp;nbsp; Good question. My off-shore team has an engraved way of doing things and it was hard for them to learn test-driven development, understanding tier-based architecture, not creating large “GOD” classes, writing explicit, modular functions rather than monolithic top-to-bottom “Know-it-all, Do-it-all” methods, avoiding code duplication&amp;nbsp; Quite a few are documented by &lt;a href="http://www.codinghorror.com/blog/2006/05/code-smells.html"&gt;Jeff Atwood back in 2006&lt;/a&gt; (Coding Horror) and many others in the past.&amp;nbsp; Unfortunately my team was mostly VB6 developers with a few exceptions.&amp;nbsp; How do I know?&amp;nbsp; Because I was one.&amp;nbsp; I am not saying that being a VB6 developer is bad, but times have changed and maybe you should too.&amp;nbsp; And please stop using Hungarian notation for crying out loud… #pet_peeve&lt;/p&gt; &lt;h5&gt;Writing Legacy Code and continuing to do so&lt;/h5&gt; &lt;p&gt;Yet with the releases of .NET 2.0, 3.5, and now 4.0, and influences of Open Source (especially for the web), and changing face of software development (Agile development, Scrum, TDD, BDD, etc), it was time for me to change then back in 2005 change others.&amp;nbsp; Can’t write code the way it was written 10 years ago (Waterfall, monolithic, client/server etc.)&amp;nbsp; Somehow my off-shore team haven’t received this message because no one probably delivered.&amp;nbsp; They were content delivering applications with looks and feels of the late 90’s and early 2000’s.&amp;nbsp; Eyebrows raised and points made over WebEx, but not much happened.&amp;nbsp; I bet they did not see my eyebrows though :)&lt;/p&gt; &lt;p&gt;According to Michael Feather’s “Working Effectively with Legacy Code”, legacy code is code that has no tests.&amp;nbsp; I am not going to discuss the details of his book and why writing "zero” tests is not good, but the point is, if you want to write good, scalable, readable, and usable applications, you better have tests around your code and features.&amp;nbsp; This is one of the first things I tried to set guidelines around with the off-shore team with partial mixed results.&amp;nbsp; Yes, they are writing tests, but most of them are fulfilling a requirement rather than testing their code or logic, or help refactor their code. Ugh.&lt;/p&gt; &lt;p&gt;Usage and throwing exceptions created another interesting exchange with the off-shore.&amp;nbsp; In .NET, exceptions should be used judiciously, and as the name implies, they should be an “exception”, like an “accident”, you didn’t see it coming – not to be used in regular workflow, such as enters a wrong password(?) In once incident, I seemed to have convinced the developer this being the case, but come next day, you find the same type of code with a different signature.&amp;nbsp; A totally a “Gaaa!” moment! Yikes.. Again there was really not much re-enforcement,&amp;nbsp; application works, users are happy*. Next feature please..&lt;/p&gt; &lt;h5&gt;N-Tiered Architecture and Separation of Concerns&lt;/h5&gt; &lt;p&gt;Even though you may have created a multi project solution, it does not guarantee that your project is tiered and respects the notion of separation of concerns.&amp;nbsp; When I joined, I introduced the Model-View-Controller architecture for the ASP.NET development.&amp;nbsp; At first I had a different off-shore team and we also had struggles especially with less than stellar user experience requirements.&amp;nbsp; You have to understand how difficult it could be if you try to write a windows application on a web browser.&amp;nbsp; And my team is set to achieve just that with the support product owners.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Another sticking point with my off-shore was overuse of stored procedures.&amp;nbsp; Okay there are two camps out there on this, but come on, it is 2010, and we have OR/M tools including Linq and Entity Framework, data transfer objects, business classes, etc.&amp;nbsp; And how do you test it, especially edge conditions? Below is a part of one of those sprocs.&lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:206f139b-c6fd-491c-9dfb-32bcbdfedde6" class="wlWriterEditableSmartContent"&gt;&lt;pre style=" width: 545px; height: 82px;background-color:White;overflow: auto;;font-family:Consolas;font-size:12"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;   &lt;/span&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; ...&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;   My_DateTime &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #FF00FF;"&gt;DATEADD&lt;/span&gt;&lt;span style="color: #000000;"&gt;(minute, &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;59&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #008000;"&gt;@MyDatetime&lt;/span&gt;&lt;span style="color: #000000;"&gt;))&lt;br /&gt;   &lt;/span&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt; ...&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Above, what happens the programmer uses “&amp;lt;” instead.&amp;nbsp; How do you catch that? What does “59” mean? Hint: minutes.&amp;nbsp; Let me tell you long stored procedures with convoluted business logic is certainly not my cup of tea.&amp;nbsp; With the existing legacy database we had a few thousand stored procedures written over the lifetime of applications.&amp;nbsp; God knows which ones are in use and which are deprecated, but can you imagine the amount of effort to review those and clean them up? I digress.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Anyway, it has been a quite an interesting journey and experience.&amp;nbsp; I have some good takeaways, and developed very good friendships over WebEx and Skype.&amp;nbsp; But I do miss the opportunity of having face time, have a chat with the developer/peer, preferably over a beer on some design pattern or an intense code review.&amp;nbsp; Thus turned in my resignation, and now off to new ventures.&amp;nbsp; Let us not forget to have discussions and does not mean it is all good when everyone agrees.&amp;nbsp; Because, really, they don’t!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Happy Coding! (just be sure to leave “code smells” in rear-view mirror)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5013989326299900663-6030144269530523953?l=tapkan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tapkan.blogspot.com/feeds/6030144269530523953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tapkan.blogspot.com/2010/09/when-everyone-agrees.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/6030144269530523953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/6030144269530523953'/><link rel='alternate' type='text/html' href='http://tapkan.blogspot.com/2010/09/when-everyone-agrees.html' title='When everyone agrees'/><author><name>Baskin Tapkan</name><uri>http://www.blogger.com/profile/16745523698419707042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_ZuHHjM8p4AQ/SZXkIFSPdjI/AAAAAAAAA60/Vsz2d7pAP3M/S220/BaskinTapkan_linkedin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5013989326299900663.post-4547017448558088784</id><published>2010-05-10T12:02:00.022-05:00</published><updated>2010-05-10T14:29:42.853-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Areas'/><category scheme='http://www.blogger.com/atom/ns#' term='System.Web.Routing'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET MVC 2'/><title type='text'>Handling duplicate Area/Controller names in ASP.NET MVC 2</title><content type='html'>When dealing with duplicate names for an "Area" and "Controller" in ASP.NET MVC, we could run into issues.  The ASP.NET routing mechanism needs to be understood to produce the proper links.  In this post, I will walk through the problem, and the fix for ASP.NET MVC 2 on Visual Studio 2010.&lt;br /&gt;&lt;br /&gt;First create an ASP.NET MVC 2 application from File -&gt; New -&gt; Project, and choose the project type shown below.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZuHHjM8p4AQ/S-g9gbWD4TI/AAAAAAAAA-c/srI9-A3hixk/s1600/create_project.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 237px;" src="http://3.bp.blogspot.com/_ZuHHjM8p4AQ/S-g9gbWD4TI/AAAAAAAAA-c/srI9-A3hixk/s320/create_project.png" alt="" id="BLOGGER_PHOTO_ID_5469689374746861874" border="0"&gt;&lt;/a&gt;&lt;br /&gt;Next create an "AdministrationController" and an associated folder, called "Administration" inside the "Views" folder. Also create an empty view page (Index.aspx) inside this folder.&lt;br /&gt;&lt;br /&gt;Place the below text inside the Content2 section of this view page.&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;font class="lnum"&gt;   1:  &lt;/font&gt; &lt;font class="kwrd"&gt;&amp;lt;&lt;/font&gt;&lt;font class="html"&gt;h2&lt;/font&gt;&lt;font class="kwrd"&gt;&amp;gt;&lt;/font&gt;Administration in Root&lt;font class="kwrd"&gt;&amp;lt;/&lt;/font&gt;&lt;font class="html"&gt;h2&lt;/font&gt;&lt;font class="kwrd"&gt;&amp;gt;&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;Then create a link to this controller/view from the "Home/Index.aspx" file as shown below. &lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;font class="lnum"&gt;   1:  &lt;/font&gt; &amp;lt;%=Html.ActionLink(&lt;font class="str"&gt;"Administration in Root"&lt;/font&gt;, &lt;font class="str"&gt;"Index"&lt;/font&gt;, &lt;font class="str"&gt;"Administration")&lt;/font&gt; %&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;Make sure the link works as supposed to.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZuHHjM8p4AQ/S-hGWTn5aoI/AAAAAAAAA-k/8xmg16bQo4s/s1600/AdministrationInRoot.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 274px; height: 112px;" src="http://1.bp.blogspot.com/_ZuHHjM8p4AQ/S-hGWTn5aoI/AAAAAAAAA-k/8xmg16bQo4s/s320/AdministrationInRoot.png" alt="" id="BLOGGER_PHOTO_ID_5469699096480148098" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZuHHjM8p4AQ/S-hG1KS1PII/AAAAAAAAA-s/H-dSpiGFCRw/s1600/AdministrationInRootIndex.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 186px;" src="http://4.bp.blogspot.com/_ZuHHjM8p4AQ/S-hG1KS1PII/AAAAAAAAA-s/H-dSpiGFCRw/s320/AdministrationInRootIndex.png" alt="" id="BLOGGER_PHOTO_ID_5469699626551819394" border="0"&gt;&lt;/a&gt;Stop debugger, and add a new area by right clicking on the solution, selecting "Area".  Give the Area as "Administration".&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZuHHjM8p4AQ/S-hH1VOJkII/AAAAAAAAA-0/Sc_mnG0RlSs/s1600/AdministrationArea.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 114px;" src="http://1.bp.blogspot.com/_ZuHHjM8p4AQ/S-hH1VOJkII/AAAAAAAAA-0/Sc_mnG0RlSs/s320/AdministrationArea.png" alt="" id="BLOGGER_PHOTO_ID_5469700728996597890" border="0"&gt;&lt;/a&gt;&lt;br /&gt;Create an "Administration" controller as in the application's root, but this time inside the "Administration" area.  Create the associated view folder/index.aspx page.Place the following text in the content area.&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;font class="lnum"&gt;   1:  &lt;/font&gt;&lt;font class="kwrd"&gt;&amp;lt;&lt;/font&gt;&lt;font class="html"&gt;h2&lt;/font&gt;&lt;font class="kwrd"&gt;&amp;gt;&lt;/font&gt;Administration in Area&lt;font class="kwrd"&gt;&amp;lt;/&lt;/font&gt;&lt;font class="html"&gt;h2&lt;/font&gt;&lt;font class="kwrd"&gt;&amp;gt;&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Run the application as before, and verify that "Administration in Root" this time fails with a message similar to below:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZuHHjM8p4AQ/S-hJa-6pPKI/AAAAAAAAA-8/P0oh5JDveGo/s1600/ServerError.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 153px;" src="http://3.bp.blogspot.com/_ZuHHjM8p4AQ/S-hJa-6pPKI/AAAAAAAAA-8/P0oh5JDveGo/s320/ServerError.png" alt="" id="BLOGGER_PHOTO_ID_5469702475355864226" border="0"&gt;&lt;/a&gt;&lt;br /&gt;Add another link to the "Administration" area from the "Home/Index.aspx". &lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;font class="lnum"&gt;   1:  &lt;/font&gt;&amp;lt;%= Html.ActionLink(&lt;font class="str"&gt;"Adminstration in Area "&lt;/font&gt;, &lt;font class="str"&gt;"Index"&lt;/font&gt;, &lt;font class="str"&gt;"Administration"&lt;/font&gt;, &lt;font class="kwrd"&gt;new&lt;/font&gt; { area = &lt;font class="str"&gt;"Administration"&lt;/font&gt; }, &lt;font class="kwrd"&gt;null&lt;/font&gt;)%&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;This link now will work from the Home/Index.aspx page hitting the "Administration in Areas" as shown below:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZuHHjM8p4AQ/S-hLPY7o-sI/AAAAAAAAA_E/zYPs2vr9RXU/s1600/AdministrationReach.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_ZuHHjM8p4AQ/S-hLPY7o-sI/AAAAAAAAA_E/zYPs2vr9RXU/s320/AdministrationReach.png" alt="" id="BLOGGER_PHOTO_ID_5469704475204188866" border="0"&gt;&lt;/a&gt;&lt;br /&gt;Now we need to fix the "Administration" in the application's root path. &lt;br /&gt;To do that, we add the "namespaces" optional parameter in the routes.MapRoute function as shown below.&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;   routes.MapRoute(&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;                &lt;span class="str"&gt;"Default"&lt;/span&gt;, &lt;span class="rem"&gt;// Route name&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;                &lt;span class="str"&gt;"{controller}/{action}/{id}"&lt;/span&gt;, &lt;span class="rem"&gt;// URL with parameters&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; { controller = &lt;span class="str"&gt;"Home"&lt;/span&gt;, action = &lt;span class="str"&gt;"Index"&lt;/span&gt;, id = UrlParameter.Optional },  &lt;span class="rem"&gt;// Parameter defaults&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;[]{&lt;span class="str"&gt;"DuplicateAreaControllerName.Controllers"&lt;/span&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            );&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;By adding namespace to the routes.MapRoute(...), the previous Html.ActionLink(..) to the application's root "Administration" screen will work as before.  Ideally, you will not run into this, but my team had this problem while trying to develop a similar feature set inside the areas with the same name.  Looks like ASP.NET MVC 1.0 does not have a direct solution, but ASP.NET MVC 2.0 has better built-in support, although not very obvious at first.  Hopefully you will be careful with your naming and avoid such situations in the first place.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5013989326299900663-4547017448558088784?l=tapkan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tapkan.blogspot.com/feeds/4547017448558088784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tapkan.blogspot.com/2010/05/handling-duplicate-areacontroller-names.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/4547017448558088784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/4547017448558088784'/><link rel='alternate' type='text/html' href='http://tapkan.blogspot.com/2010/05/handling-duplicate-areacontroller-names.html' title='Handling duplicate Area/Controller names in ASP.NET MVC 2'/><author><name>Baskin Tapkan</name><uri>http://www.blogger.com/profile/16745523698419707042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_ZuHHjM8p4AQ/SZXkIFSPdjI/AAAAAAAAA60/Vsz2d7pAP3M/S220/BaskinTapkan_linkedin.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ZuHHjM8p4AQ/S-g9gbWD4TI/AAAAAAAAA-c/srI9-A3hixk/s72-c/create_project.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5013989326299900663.post-7826736270707912705</id><published>2010-04-05T14:24:00.007-05:00</published><updated>2010-04-05T16:43:16.693-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='oData'/><category scheme='http://www.blogger.com/atom/ns#' term='ADO.NET Entity Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Data Protocols'/><title type='text'>A tour around Open Data Protocol (OData)</title><content type='html'>It should come as no surprise that the amount of data collected in many places are hard to get to.  Given the ubiquity of web technologies, the need for information from the silo’ed databases, file systems and static web sites are increasing more than ever.  Google has already established its own GData and offering solutions.  Representational State Transfer (REST) and the simplicity of web protocols are also driving these initiatives.    &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_ZuHHjM8p4AQ/S7o48-bYFuI/AAAAAAAAA8Y/UKtea1WmVrk/s1600-h/OpenDataProtocol%5B3%5D.png"&gt;&lt;img style="border-width: 0px; display: inline;" title="OpenDataProtocol" alt="OpenDataProtocol" src="http://lh4.ggpht.com/_ZuHHjM8p4AQ/S7o49XHwFBI/AAAAAAAAA8c/JKh2UUXL-_E/OpenDataProtocol_thumb%5B1%5D.png?imgmax=800" border="0" height="91" width="317" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Microsoft recently rebranded its ADO.NET Data Services (formerly known as “Astoria”) to OData.  I have been dabbling with the OData recently and it is quite impressive what is possible just from out-of-the-box.  Then again I haven’t built a full-fledged application yet, but first looks are pretty decent.&lt;/p&gt;  &lt;p&gt;OData comprises a bunch of well-established protocols helping the creation of HTTP-based data services.  It enables access and exposure of variety of sources (database, file systems and web sites).  For in depth look, please check out &lt;a href="http://odata.org/"&gt;Odata.org&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As of today, using Visual Studio 2010 RC, we can build applications and there are few blog posts out there.  On VS 2010, start by creating a ASP.NET Web Application from File –&amp;gt; New –&amp;gt; Project, and choose ASP.NET Web Application (see below).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_ZuHHjM8p4AQ/S7o8Uz9m8eI/AAAAAAAAA8g/2fo1rGwEtSM/s1600-h/CreateNewSampleWebOData%5B5%5D.png"&gt;&lt;img style="border-width: 0px; display: inline;" title="CreateNewSampleWebOData" alt="CreateNewSampleWebOData" src="http://lh5.ggpht.com/_ZuHHjM8p4AQ/S7o8VsnIsZI/AAAAAAAAA8k/A5dSnDqN2CI/CreateNewSampleWebOData_thumb%5B3%5D.png?imgmax=800" border="0" height="380" width="532" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Next add a new ADO.NET Entity Model for the project.  Right-click project and say “Add –&amp;gt; New” and choose ADO.NET Entity Model.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_ZuHHjM8p4AQ/S7o8WUYhREI/AAAAAAAAA8o/MWiwe8pnwRo/s1600-h/ADONETEntityModel%5B3%5D.png"&gt;&lt;img style="border-width: 0px; display: inline;" title="ADONETEntityModel" alt="ADONETEntityModel" src="http://lh4.ggpht.com/_ZuHHjM8p4AQ/S7o8XCWlg8I/AAAAAAAAA8s/m_e71ubkIhY/ADONETEntityModel_thumb%5B1%5D.png?imgmax=800" border="0" height="379" width="539" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Give it a proper name.  In this example, I am going to use the Northwind database since it is pretty common for SQL Server and at one point, shipped with SQL Server.  Now you can download it from &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-46A0-8DA2-EEBC53A68034&amp;amp;displaylang=en"&gt;here&lt;/a&gt;.   Once you run the installer you need to attach the database files to your pertinent SQL Server instance.  &lt;/p&gt;  &lt;p&gt;The wizard will walk you through the Generation of EDMX file.  First "Generate from database” option, then point to your SQL Server instance and pick Northwind database.  &lt;/p&gt;  &lt;p&gt;As shown below, I used “Categories” and “Products” tables for this. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_ZuHHjM8p4AQ/S7pJxweAx8I/AAAAAAAAA8w/sLL35Dg4VlU/s1600-h/GenerateDatabaseObjects%5B3%5D.png"&gt;&lt;img style="border-width: 0px; display: inline;" title="GenerateDatabaseObjects" alt="GenerateDatabaseObjects" src="http://lh5.ggpht.com/_ZuHHjM8p4AQ/S7pJy4Uzl3I/AAAAAAAAA80/D1pHq2pwbKU/GenerateDatabaseObjects_thumb%5B1%5D.png?imgmax=800" border="0" height="504" width="562" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Now pay attention to your Model namespace, because this will impact your Web.config file.  Subsequent attempts of doing the same steps will clutter your file, and you may end up with **Model1, **Model2 names in your configuration file.  Click “Finish”.  Now you have created a simple ADO.NET Entity model.  It is time to expose it via WCF Data service.&lt;/p&gt;  &lt;p&gt;In the same web project, add new WCF Web Service.  Right-click on the project, and “Add –&amp;gt; New Item…” and choose “WCF Data Service” under “Web” tab.  I am starting to like the VS2010’s organization of items, but sometimes things still don’t make sense, or “haven’t adjusted to it yet”. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_ZuHHjM8p4AQ/S7pJz81MnvI/AAAAAAAAA84/W8i-_i2HV4o/s1600-h/CreateNewWCFDataService%5B4%5D.png"&gt;&lt;img style="border-width: 0px; display: inline;" title="CreateNewWCFDataService" alt="CreateNewWCFDataService" src="http://lh3.ggpht.com/_ZuHHjM8p4AQ/S7pJ1PJ0sFI/AAAAAAAAA88/8Lmk99xCJnM/CreateNewWCFDataService_thumb%5B2%5D.png?imgmax=800" border="0" height="410" width="580" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Once you have created the service, go ahead and open it up source editor.  Notice the first line.  Change it to say the name of your entities.  &lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:navy;"&gt;public class &lt;/span&gt;&lt;span style="color: rgb(166, 83, 0);"&gt;WcfDataService1 &lt;/span&gt;: &lt;span style="color: rgb(166, 83, 0);"&gt;DataService&lt;/span&gt;&amp;lt;&lt;span style="color:maroon;"&gt;NorthwindEntities&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Next, add the below two lines to indicate you are setting these access rules on these entities. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:maroon;"&gt;config&lt;/span&gt;.&lt;span style="color:maroon;"&gt;SetEntitySetAccessRule&lt;/span&gt;(&lt;span style="background: none repeat scroll 0% 0% rgb(255, 255, 230);"&gt;"Categories"&lt;/span&gt;, &lt;span style="color: rgb(43, 145, 175);"&gt;EntitySetRights&lt;/span&gt;.&lt;span style="color:maroon;"&gt;All&lt;/span&gt;);&lt;br /&gt;&lt;span style="color:maroon;"&gt;config&lt;/span&gt;.&lt;span style="color:maroon;"&gt;SetEntitySetAccessRule&lt;/span&gt;(&lt;span style="background: none repeat scroll 0% 0% rgb(255, 255, 230);"&gt;"Products"&lt;/span&gt;, &lt;span style="color: rgb(43, 145, 175);"&gt;EntitySetRights&lt;/span&gt;.&lt;span style="color:maroon;"&gt;All&lt;/span&gt;);&lt;br /&gt;…&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Those two lines in place, you can check your work up-to now by simply setting the service as “Start page” and view the results in browser.  (shown below for IE-8).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_ZuHHjM8p4AQ/S7pJ1zr-49I/AAAAAAAAA9A/oSlj2Yo76cY/s1600-h/baseEntity%5B3%5D.png"&gt;&lt;img style="border-width: 0px; display: inline;" title="baseEntity" alt="baseEntity" src="http://lh4.ggpht.com/_ZuHHjM8p4AQ/S7pJ2mpXH5I/AAAAAAAAA9E/Kj64DaSXb18/baseEntity_thumb%5B1%5D.png?imgmax=800" border="0" height="271" width="451" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Finally to consume and query this service, we can create a simple console application and add it to this project.  I wrote this simple function to display products on the query window (borrowed a few ideas from Scott Hanselman’s a much better and elegant “&lt;a href="http://www.hanselman.com/blog/CreatingAnODataAPIForStackOverflowIncludingXMLAndJSONIn30Minutes.aspx"&gt;Creating an OData API for StackOverflow including XML and JSON in 30 minutes&lt;/a&gt;”.  For in depth coverage, please check out his blog.  &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;First we need to add a service reference, right click on the Console project and choose “Add Service Reference”.  You have to copy and paste the web service URL you created in the previous step.  Paste the address and hit “Discover”.  Again pay attention to your name spaces.  &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_ZuHHjM8p4AQ/S7pJ30f2IPI/AAAAAAAAA9I/cVR3xBjQRXU/s1600-h/TechMasterService%5B4%5D.png"&gt;&lt;img style="border-width: 0px; display: inline;" title="TechMasterService" alt="TechMasterService" src="http://lh3.ggpht.com/_ZuHHjM8p4AQ/S7pJ48Zp3uI/AAAAAAAAA9M/EQh4vNGaLrY/TechMasterService_thumb%5B2%5D.png?imgmax=800" border="0" height="421" width="500" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Again if you think this is too simplistic, you are not alone.  At some point we have to worry about security/credentials and maybe performance, but not right now.  But impressive what you can accomplish with a few mouse-clicks out of the box. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;For VS-2010 RC, you can also download and install “Open Data Protocol Visualizer” from “Tools –&amp;gt; Extension Manager” menu item.  Once that is place, it is pretty slick to see it in action.  &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Right click on the service name from the Solution Explorer and choose “View in Diagram” option.  This will open up a nice canvas for object visualization.  Notice the new tab called “Open Data Model Browser” .  Very nice I thought.  You can drop your entities and look at your columns, etc.  &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_ZuHHjM8p4AQ/S7pJ5vGv7HI/AAAAAAAAA9U/4iD6j9q3-EE/s1600-h/OpenDataModelBrowser%5B3%5D.png"&gt;&lt;img style="border-width: 0px; display: inline;" title="OpenDataModelBrowser" alt="OpenDataModelBrowser" src="http://lh5.ggpht.com/_ZuHHjM8p4AQ/S7pJ6o6IkOI/AAAAAAAAA9Y/1lEHTRX7WRQ/OpenDataModelBrowser_thumb%5B1%5D.png?imgmax=800" border="0" height="398" width="524" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Finally to query referenced entity model, I added below to the start-up of this console application. &lt;/p&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;   {&lt;/pre&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;       &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;       {&lt;/pre&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;           CallingODataService();&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;       }&lt;/pre&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; CallingODataService()&lt;/pre&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;       {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;           var tm = &lt;span class="kwrd"&gt;new&lt;/span&gt; TechMasterEntities(&lt;/pre&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;               &lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(http:&lt;span class="rem"&gt;//localhost:xxxx/TechMasterService.svc));&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;           var products = from p &lt;span class="kwrd"&gt;in&lt;/span&gt; tm.Products&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                          select p;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;           &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (Product p &lt;span class="kwrd"&gt;in&lt;/span&gt; products)&lt;/pre&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;           {&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;               Console.WriteLine(p.ProductName);&lt;/pre&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;           }&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;           Console.ReadLine();&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;       }&lt;/pre&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;   }&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Don’t forget to change your port number to your own as well as your service name.  The partial results from the console are shown below.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_ZuHHjM8p4AQ/S7pJ7Zi-gFI/AAAAAAAAA9c/dVHwBGDStQo/s1600-h/partialResults%5B3%5D.png"&gt;&lt;img style="border: 0px none; display: inline;" title="partialResults" alt="partialResults" src="http://lh3.ggpht.com/_ZuHHjM8p4AQ/S7pJ8TAjm0I/AAAAAAAAA9g/6TMj9dbHje0/partialResults_thumb%5B1%5D.png?imgmax=800" border="0" height="370" width="312" /&gt;&lt;/a&gt;&lt;br /&gt;That is pretty much it for now.  Looking forward to finding more about oData protocols and exposing silo’ed data using HTTP protocol in secure and simple ways.  Happy Coding!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5013989326299900663-7826736270707912705?l=tapkan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tapkan.blogspot.com/feeds/7826736270707912705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tapkan.blogspot.com/2010/04/tour-around-open-data-protocol-odata.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/7826736270707912705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/7826736270707912705'/><link rel='alternate' type='text/html' href='http://tapkan.blogspot.com/2010/04/tour-around-open-data-protocol-odata.html' title='A tour around Open Data Protocol (OData)'/><author><name>Baskin Tapkan</name><uri>http://www.blogger.com/profile/16745523698419707042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_ZuHHjM8p4AQ/SZXkIFSPdjI/AAAAAAAAA60/Vsz2d7pAP3M/S220/BaskinTapkan_linkedin.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_ZuHHjM8p4AQ/S7o49XHwFBI/AAAAAAAAA8c/JKh2UUXL-_E/s72-c/OpenDataProtocol_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5013989326299900663.post-6668862868104618611</id><published>2009-12-09T11:24:00.002-06:00</published><updated>2010-04-05T16:40:43.593-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='Membership provider'/><category scheme='http://www.blogger.com/atom/ns#' term='Authorization filters'/><title type='text'>Implementing Custom Security in ASP.NET MVC framework</title><content type='html'>Securing a web site and web page is the most critical task a developer has to accomplish and get it right.  In ASP.NET MVC, we are presented with membership and role providers to achieve the security.  We can also use authorization attributes and write our own to lock down controller actions. &lt;br /&gt;&lt;br /&gt;Security can be broken down to two aspects.  First one is authentication, which is validating you are who you say you are.  This is typically done through a username and password against a common repository.  Second one is authorization, which is you, as an authenticated user, are allowed/denied certain actions on a given website/webpage.&lt;br /&gt;&lt;br /&gt;ASP.NET MVC framework allows custom membership (authentication piece) and role (authorization piece) providers.  Although this is fine for most applications, creating/editing roles can require a recompile of the whole application and redeployment.  To get around this, you can create another layer, let's call, Context (or Features) if you will, and associate each role with multiple features.&lt;br /&gt;&lt;br /&gt;I have done a sample application, and published the CodePlex.  You can find the link &lt;a href="http://pragmaticmvcsecurity.codeplex.com/"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Let me know if/when you check it out and what you think about it.  Thanks for reading and happy coding!&lt;br /&gt;&lt;br /&gt;Baskin&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5013989326299900663-6668862868104618611?l=tapkan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tapkan.blogspot.com/feeds/6668862868104618611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tapkan.blogspot.com/2009/12/implementing-custom-security-in-aspnet.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/6668862868104618611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/6668862868104618611'/><link rel='alternate' type='text/html' href='http://tapkan.blogspot.com/2009/12/implementing-custom-security-in-aspnet.html' title='Implementing Custom Security in ASP.NET MVC framework'/><author><name>Baskin Tapkan</name><uri>http://www.blogger.com/profile/16745523698419707042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_ZuHHjM8p4AQ/SZXkIFSPdjI/AAAAAAAAA60/Vsz2d7pAP3M/S220/BaskinTapkan_linkedin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5013989326299900663.post-1727925404780418241</id><published>2009-09-30T11:49:00.000-05:00</published><updated>2009-09-30T14:54:46.692-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inheritance'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='OOP'/><category scheme='http://www.blogger.com/atom/ns#' term='Composition'/><title type='text'>Composition vs. Inheritance</title><content type='html'>Reusing existing code and avoiding code duplication lands itself to better, scalable and maintainable design and application architecture and is practiced by the Object-Oriented Programming (OOP) community.  Inheritance is officially  one of the three pillars of OOP, although composition isn't.  The difference between the two is, inheritance depicts a "Is-A" relationship where composition is "Has-A" relationship.&lt;br /&gt;&lt;br /&gt;As an example, let's take the object "book".  I have a special type of book, called "technical book" which derives from the object "book".  Certainly a technical book is a special type of book, but it is a book.  Composition on the other hand is the having one object containing another object, hopefully related, but not necessarily.  Check out the object of "Cover".  The "book" has a "cover".   Here is a C# code snippet.&lt;pre&gt;&lt;div class="csharpcode"&gt;&lt;span class="Apple-style-span" style="white-space: pre-wrap;font-family:Consolas,'Courier New',Courier,monospace;" &gt; &lt;style type="text/css"&gt; .csharpcode, .csharpcode pre {  font-size: small;  color: black;  font-family: Consolas, "Courier New", Courier, Monospace;  background-color: #ffffff;  /*white-space: pre;*/ }  .csharpcode pre { margin: 0em; }  .csharpcode .rem { color: #008000; }  .csharpcode .kwrd { color: #0000ff; }  .csharpcode .str { color: #006080; }  .csharpcode .op { color: #0000c0; }  .csharpcode .preproc { color: #cc6633; }  .csharpcode .asp { background-color: #ffff00; }  .csharpcode .html { color: #800000; }  .csharpcode .attr { color: #ff0000; }  .csharpcode .alt  {  background-color: #f4f4f4;  width: 100%;  margin: 0em; }  .csharpcode .lnum { color: #606060; } &lt;/style&gt;&lt;div class="csharpcode"&gt; &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; TechnicalBook : Book&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;  &lt;span class="rem"&gt;// every method &amp;amp; property of Book class (protected + public) &lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;  &lt;span class="rem"&gt;// other methods and properties of TechnicalBook&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;}&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; TechnicalBook&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;   &lt;span class="kwrd"&gt;private&lt;/span&gt; technicalBookCover = &lt;span class="kwrd"&gt;new&lt;/span&gt; Cover();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;   &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Title()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;   {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;      technicalBookCover.Title = &lt;span class="str"&gt;"Design Patterns"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;      &lt;span class="kwrd"&gt;return&lt;/span&gt; technicalBookCover.Title;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;   } &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Cover()&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  {&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;   &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; title;   &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Title { get &lt;span class="kwrd"&gt;return&lt;/span&gt; title; set title = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="Apple-style-span" style=";font-family:Georgia,serif;font-size:130%;"  &gt;&lt;span class="Apple-style-span" style="white-space: normal;font-size:16px;" &gt;&lt;span class="Apple-style-span"  style="font-family:Consolas,'Courier New',Courier,monospace;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;font-size:small;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;&lt;br /&gt;Why is this important? Well, if we want to create applications which will be maintained over time and be used and extended in the future, I believe it is critical we make this distinction and model our applications accordingly.&lt;br /&gt;&lt;br /&gt;My past experience had been more towards inheritance, but I resented the times that I have painted myself to a corner, since the dependencies created via inheritance becomes a burden to carry forward.  Inheritance always exposes every public member in the base class while composition gives you an option to selectively choose, if any&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;By using Composition, the TechnicalBook class is insulated against changes of the inner class, Cover.  With Inheritance any modifications to the base class Book, the TechnicalBook class is affected.  If you want to bind the two classes, you can use an interface as a binding contract and let the two classes implement that interface.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In conclusion, Composition requires more work to expose the implementation of inner class objects, but the decoupling achieved by between the current type and the base type can quite valuable.  Inheritance still holds true in cases where a clear "Is-A" relationship holds true, but in the long run things may need to be tweaked.  And that's when you may want to favor Composition. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;References:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;1. &lt;/span&gt;&lt;a href="http://srtsolutions.com/blogs/billwagner/archive/2008/10/17/more-effective-c-available-now.aspx"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;More Effective C# - 50 Specific Ways to Improve Your C#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;2. &lt;/span&gt;&lt;a href="http://www.eflorenzano.com/blog/post/inheritance-vs-composition/"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Die in a Fire - Eric Florenzano's Blog&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://srtsolutions.com/blogs/billwagner/archive/2008/10/17/more-effective-c-available-now.aspx"&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5013989326299900663-1727925404780418241?l=tapkan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tapkan.blogspot.com/feeds/1727925404780418241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tapkan.blogspot.com/2009/09/composition-vs-inheritance.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/1727925404780418241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/1727925404780418241'/><link rel='alternate' type='text/html' href='http://tapkan.blogspot.com/2009/09/composition-vs-inheritance.html' title='Composition vs. Inheritance'/><author><name>Baskin Tapkan</name><uri>http://www.blogger.com/profile/16745523698419707042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_ZuHHjM8p4AQ/SZXkIFSPdjI/AAAAAAAAA60/Vsz2d7pAP3M/S220/BaskinTapkan_linkedin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5013989326299900663.post-891442670899453008</id><published>2009-08-20T11:14:00.000-05:00</published><updated>2009-08-20T11:58:39.690-05:00</updated><title type='text'>Why Change?</title><content type='html'>Pretty sure this happens to everyone.  One day, some higher authority comes along and tells you that what you have been doing is not quite "right" anymore and there is a new way of doing things.  Not only that, along the way, while you are in transition, even the new way is changed.  What do you do? Do you change your ways of doing things?&lt;br /&gt;&lt;br /&gt;This is how I perceive Microsoft's data access technology.  Don't get me wrong - it is great to have choice and the future of data access is getting better (okay I am hopeful and I am not even blaming Al Gore on this one).  I joined the data access technology evolution in middle 90's.  Back then we have ODBC, OLE DB, and ADO.  Programming with recordsets in ADO in VB 6 has always been cumbersome, but had my fun of coding.  While Not rst.EOF .. Wend anyone?&lt;br /&gt;&lt;br /&gt;Then early 2000's, started with .NET 1.0, quickly became 1.1 in 2002.  We were introduced to ADO.NET.  Between ADO and ADO.NET, there were a lot of changes (besides the addition of .NET). Old way of doing things was not recommended.  Now we had datasets and datareader, and data adapters.  The relational database is still there (and it will be there for awhile!), but how we shuffle the data between the application tiers was altered.  Besides the data access, finally OOP became first class citizen in VB.NET.  And that's when I switched to C#.  I was getting too confused between VB-6 and VB.NET, but still I did application development in VB.NET.  Besides it is really not too hard to program between the languages.  It all comes down to Common Language Runtime (CLR.  Not a big fan of language wars... just use the right tool for the right job. Maybe Ruby on Rails...&lt;br /&gt;&lt;br /&gt;Meantime I delivered and worked with ADO.NET 2.0 projects along with ASP.NET.  Things were working out okay, then around 2003, started hearing about eXtreme Programming (XP), writing tests first like Test Driven Development, then came Ajax.  Was not quite getting it for awhile.  But the best thing to learn a new technology is doing a project with it.  Using NUnit framework, did a few applications I realized how easy and fun to write code and test it right there, without launching the debugger, using Asserts and such.  And I changed once again and I don't ever want to go back to the old way, especially for enterprise applications.  Like Michael Feathers tells you in his book "Working Effectively with Legacy Code", legacy code is code which does not have tests.&lt;br /&gt;&lt;br /&gt;In 2005, I attended my first Professional Developers Conference in Los Angeles.  The highlight of this conference was the announcement of Linq (stands for Language Integrated Query).  Using this colorful, a little terse (at first) syntax, one can get intellisense code from the database.  Thought it was very powerful and can't wait to use it.  Just as ramping up with this Linq-to-SQL technology (by the way, it only worked with SQL Server), and I was supporting a few Oracle databases (I was using Oracle's .NET library and there is no Linq in that).  Thus I did not get ramp up too far ahead.&lt;br /&gt;&lt;br /&gt;Meantime around 2007, we heard another technology called ADO.NET Entity Framework.  With EF, other databases besides SQL Server can also be accessed  using entityclients and object contexts.  It's not even done yet.  After version 1.0, Microsoft is delivering EF v.4 (what? is that a typo? no, that's MS. they can do that, ver.2 &amp;amp; 3. are skipped) Here we go again...&lt;br /&gt;&lt;br /&gt;My point is the change is going to happen, whether you like it or not.  If you don't change, you take the risk of being obsolete.  Be flexible and learn the new technologies.  Master them as much as you can, but when it is time to jump and move on, do not resist and adapt as soon as you can.  Software project delivery time-lines are usually set aggressively.  How do you factor this in your project delivery timeline.  Hmmm.. That may be another blog post.&lt;br /&gt;&lt;br /&gt;Again the mantra is sometimes, the old technology is fine and it works, hopefully testable.  Now do we want to change it?  It works, right?.  Is it worth changing it? Maybe.  But I know I will be changing, hopefully for the better when it comes to data access.&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;&lt;a href="http://www.objectmentor.com/resources/articles/WorkingEffectivelyWithLegacyCode.pdf"&gt;Working Effectively with Legacy Code&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5013989326299900663-891442670899453008?l=tapkan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tapkan.blogspot.com/feeds/891442670899453008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tapkan.blogspot.com/2009/08/why-change.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/891442670899453008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/891442670899453008'/><link rel='alternate' type='text/html' href='http://tapkan.blogspot.com/2009/08/why-change.html' title='Why Change?'/><author><name>Baskin Tapkan</name><uri>http://www.blogger.com/profile/16745523698419707042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_ZuHHjM8p4AQ/SZXkIFSPdjI/AAAAAAAAA60/Vsz2d7pAP3M/S220/BaskinTapkan_linkedin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5013989326299900663.post-5929334885708141355</id><published>2009-07-13T10:56:00.001-05:00</published><updated>2009-07-13T13:29:16.508-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='off-shore teams'/><category scheme='http://www.blogger.com/atom/ns#' term='remote teams'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='offshore'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>Working with Offshore</title><content type='html'>The increased efficiency of the online communications tools, offshore software development has become more prominent in the IT industry.  Currently I am working with a bright off-shore development team located eight time zones away.  There are some challenges, but overall things are moving well.  In this blog, I would like to share my experiences and give a few tips, if I may.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;Communication&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Obviously not everyone speaks, writes and reads English as their first language.  English is also my second language, but living in the States for over fifteen years, I seem to do well and even blog about it. Specifically with software development, getting one's point across is very essential when the team is not co-located.  We use a few online, instant messaging and audio/video programs.  Earlier we tried ooVoo, however the off-shore team found that it was CPU intensive (with all the ads and everything on the side which I am not too surprised), and they suggested we use Skype.  So we switched.  It works pretty well and adds to our daily email exchanges.  Definitely pick an instant online communication tool which all the team uses &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Within the team, our direct point of contact speaks the best English as expected, yet others are good in writing.  There was one time that I called one of the developers and could not understand what he was saying, and he probably did not understand what I was saying either because he requested that I speak slowly.   And yes, I could speak quite fast at times.  Then I quickly switched to instant messaging.  This allowed my offshore developer to think more over the text he reads, then respond.  I don't plan on calling him directly anymore.  Although a conversation is good thing, but it feels odd when the other party is not sure what is being said.  Video definitely helps with sending the gestures and such.  But in general it is good to keep things in writing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Get to know your team&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Haven't got the chance to meet the team in person, but initially I mentioned that I was going to visit their country and asked and requested for certain information.  They were quite excited and eager to share the info and their culture.  I inquired from one of the developers about his beer tastes and whether he drank it or not.  Again myself being from overseas, which is not too far off from this location, exchanged a few other stories and got a little more personal.  I think this really helps in creating a more friendly and understanding atmosphere.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Don't be a dictator&lt;/b&gt;&lt;/div&gt;&lt;div&gt;One of the lessons, no matter how smart you are (or think you are), hopefully learned is to cultivate a shared development environment.  Recently the off-shore team went ahead without checking with us and completed major refactoring.  That caught me off-guard, but there is a lesson in that.  First, the project needed refactoring and I was reluctant to do that right away due to another pending major integration (back-end) process.  But that was all right.  We regrouped and just this morning we had a teleconference call and discussed our refactoring process where I think everyone got on the same page.  I did answer a few follow-up clarification questions but everyone is on the same page.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Let them have time to ramp up and study&lt;/b&gt;&lt;/div&gt;&lt;div&gt;In this project we are using ASP.NET MVC framework.  Early in the project, one of the developers decided to take the M (Model)  from MVC of the web project into an outside class library project.  After checking and figuring out the reasoning, we found out that it was not such a good idea since ASP.NET MVC dictates convention over configuration. Yet the idea is to let the team find out and try to improve the code through refactoring and remodeling.  My advice to team was, okay, there is another way of doing, but prove that why that way is better and if it makes the most sense.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Respect gets respect&lt;/span&gt;&lt;br /&gt;This goes without saying, but it is better to state it anyway.  Just because you are supervising, there is no point in being arrogant or bullish when discussing issues with the team.  Everyone has opinion and when time comes, it is best to discuss.  Try to understand where the team is coming from and give them respect for their idea and creativity.  There is always more than one of peeling the cat ;-)&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Try to stay ahead of them&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Okay, this is my current challenge right now.  We added two additional developers and it is getting harder for me to stay ahead, but I will keep reviewing the code base and provide feedback as it fits.  I also have the other integration project which is ramping up as well.  Anyway that is what I got to do.  But the point is, it is important to stay ahead of them and give them direction and try to anticipate the changes in business and requirements.  The one thing that is certain is things are going to change.  Be responsive and reactive to changes, hopefully proactive more.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There will be many more tasks for us to do in this project.  We have an agressive timeline, but using agile methodologies, specifically Scrum really fitst the model.  We modified the process a little to meet our needs but it is going through.  Our business analysts are creating documentation everyday which the development team is consuming.  The TDD approach is really getting up there.  Just today we got notification that our initial code coverage setups and implementation are taking place.   These are great signs of progress and will hopefully allow us to deliver this product on time and within budget.  I am stoked to work with these bright guys and I am glad to mentor and learn from them as project moves forward.  But understanding each others' culture, either onshore or offshore and working on the communication skills are essential to what we do which is creating functioning software applications for healthcare business.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;References:&lt;/div&gt;&lt;div&gt;&lt;a href="http://bit.ly/EkbMn"&gt;10 secrets of successful offshore developmen parts 1 &amp;amp; 2&lt;/a&gt; &lt;/div&gt;&lt;div&gt;&lt;a href="http://bit.ly/DbuBC"&gt;25 Rock Solid Tips to Supervise Offshore Development&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&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;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5013989326299900663-5929334885708141355?l=tapkan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tapkan.blogspot.com/feeds/5929334885708141355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tapkan.blogspot.com/2009/07/working-with-off-shore.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/5929334885708141355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/5929334885708141355'/><link rel='alternate' type='text/html' href='http://tapkan.blogspot.com/2009/07/working-with-off-shore.html' title='Working with Offshore'/><author><name>Baskin Tapkan</name><uri>http://www.blogger.com/profile/16745523698419707042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_ZuHHjM8p4AQ/SZXkIFSPdjI/AAAAAAAAA60/Vsz2d7pAP3M/S220/BaskinTapkan_linkedin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5013989326299900663.post-7906959965349997577</id><published>2009-05-27T22:24:00.000-05:00</published><updated>2009-05-27T22:44:05.361-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='anti-pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='It Depends'/><category scheme='http://www.blogger.com/atom/ns#' term='BDUF'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>It Depends...</title><content type='html'>Wonder how many times you heard this as an answer to a specific question by an expert of the matter. Scratched your head about what it means and question their authority. Yes?And it is true in many respects too given the choices we have around our technologies.  That is a good thing, right? Well, guess what... it depends...&lt;br /&gt;&lt;br /&gt;Recently I have been tasked with creating a technical specification document for a given application module.  I delivered the document knowing what I know at the time and tried to avoid Big Design Up Front (BDUF) anti-pattern.  I have to admit there are quite a few holes in my document but my goal is to fill up them as I find more about the requirements and increase my understanding of the application.  So far we have is a few screens of wire-frames, an initial functional specification document.  The business analysts are hard at work in peeling those requirements and creating/modifying the functional specifications.  It's all good in the end as long as we have a grasp on the amount of the documentation.  And, yes, we are using an agile methodology and have daily scrum meetings and two week Sprints.  We are staying focused.&lt;br /&gt;&lt;br /&gt;Including myself, the team is very new to this company.  What are some of the challenges?  Well, lack of requirements one might say, but I am yet to be on a project where this isn't the case.  The second that you think you nailed down the requirements, guess what happens.  It changes!  Head First Object Oriented Analysis and Design book had a good chapter for this, “You're perfect. Now change!” Exactly.  So I am not too hung on this.  Just get me enough to start coding...&lt;br /&gt;&lt;br /&gt;There is some worry about the business process, and lack of decisions.  We are also going to use an off-shore team as well  to do some of the development and testing. I expect to be working closely with this team at some level. I have a few questions and concerns with that, but I will bring it as it moves forward. Keeping development cycles short, feed-back loops tight and close. Wire-frame developers griped a little about not seeing the whole picture, but sometimes you don't need to.&lt;br /&gt;&lt;br /&gt;As far as technologies go, I am all about .NET development which is our platform.  This is a web-based application with multiple tiers, heavy emphasis on separation of concerns, testable, decoupled layers.   There will be WCF services used by the business tier as well as third parties.  I am pushing ahead with ASP.NET MVC framework with business objects (logic) in the middle, and ADO.NET Entity Framework in the data access layer.  We are going to use Test Driven Development, writing our tests first, thinking “unit testing”.  I realize that TDD is not  unit-testing, but I am already spreading the words/ideas about the functionalities to test. I really believe this will help us increasing our code-coverage numbers  as well as CCHIT requirements fulfilled.  My goal is when some one asks me how this works, I could just run a few unit/integration tests and show that they meet the requirements.  Yes, got to have tests... there is no other way around that!&lt;br /&gt;&lt;br /&gt;Meantime I plan to write quite a few throw-away proof of concept code to aid the actual coding.  I plan to address the cross-cutting concerns, exception management, authorization, authentication, logging, caching (defer it until I have more hands on with application), encryption and security.&lt;br /&gt;&lt;br /&gt;Our database is SQL Server with some interfaces to legacy DB2 databases,   We do have an aggressive time-line, as with most development teams.  We are definitely going to be busy. Well, if you are going to ask me how is it going?  You will know my answer...&lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5013989326299900663-7906959965349997577?l=tapkan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tapkan.blogspot.com/feeds/7906959965349997577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tapkan.blogspot.com/2009/05/it-depends.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/7906959965349997577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/7906959965349997577'/><link rel='alternate' type='text/html' href='http://tapkan.blogspot.com/2009/05/it-depends.html' title='It Depends...'/><author><name>Baskin Tapkan</name><uri>http://www.blogger.com/profile/16745523698419707042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_ZuHHjM8p4AQ/SZXkIFSPdjI/AAAAAAAAA60/Vsz2d7pAP3M/S220/BaskinTapkan_linkedin.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5013989326299900663.post-3629480446638903714</id><published>2009-04-08T08:24:00.001-05:00</published><updated>2009-04-09T08:18:12.948-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data'/><category scheme='http://www.blogger.com/atom/ns#' term='admission'/><category scheme='http://www.blogger.com/atom/ns#' term='transfer'/><category scheme='http://www.blogger.com/atom/ns#' term='HL7'/><category scheme='http://www.blogger.com/atom/ns#' term='CDA'/><category scheme='http://www.blogger.com/atom/ns#' term='ADT'/><category scheme='http://www.blogger.com/atom/ns#' term='discharge'/><title type='text'>Introduction to HL7</title><content type='html'>As part of my new role and job, I am getting up-to-speed with health care information systems.  A few backs during our TechMasters' meeting, I spoke briefly about HL7, but could not find enough material to summarize what it is.  As I researched more, I found more material.  So what is HL7?&lt;br /&gt;&lt;br /&gt;HL7 stands for Health Level Seven(7).  Why is seven? Accordingly the network protocol, if you have ever studied computer networks, the OSI (Open System Interconnection) model is typically conceived with seven layers.  The seventh layer correlates to the application layer.  Hence the HL7 focuses on the issues occur at the seventh layer.&lt;br /&gt;&lt;br /&gt;The standard deals with interfaces between systems that send/receive patient admissions/registrations, admission, discharge or transfer (ADT) data, queries, resource and patient scheduling, orders, results, and clinical observations, billing, master file update information, medical records, scheduling, patient referral and patient care. It's an effort to let disparate applications and data architectures in heterogeneous system environments operate and communicate with each other.&lt;br /&gt;&lt;br /&gt;A typical hospital today have its own (proprietary, from a specific vendor) computer systems for admission, discharge and transfer, billing and accounts receivable applications.  These systems may have been designed in a centralized or a distributed architecture.  Overtime, these applications are re-written or patched to meet current computing needs.  Remember Windows 95?  The security model which was perceived then is not what we use today.  Now think Windows Vista's security model.  If you put this in terms of health information systems, you will see a similar progression.  However, often the application development cycles are not well-defined, lots of patching and updating have to occur.  Having many vendors with their own protocols and applications, there raises a big need for interoperability.&lt;br /&gt;&lt;br /&gt;A framework is needed to minimize incompatibility and maximize information exchange between systems.  HL7 is deemed as a superstructure in this environment to facilitate a common specification and specifications methodology.&lt;br /&gt;&lt;br /&gt;So far, there has been three versions of HL7.  The first version was created in 1987 and subsequently the second version came out in 1988, but version 2 had a few revisions. HL7 version 3 came later (time frame?), and it's XML based.  I plan to blog more about HL7 versions separately later on.&lt;br /&gt;&lt;br /&gt;To summarize HL7 and what it tries to accomplish, here are some bullet points:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;HL7 is not a "complete solution", rather it provides a common framework for implementing interfaces between disparate vendors&lt;/li&gt;&lt;li&gt;Protection of Health care information&lt;/li&gt;&lt;li&gt;Roles and relationships, such as patients, physicians, providers.&lt;/li&gt;&lt;li&gt;Accountability, audit trails&lt;/li&gt;&lt;li&gt;Uniform data definition and data architecture&lt;/li&gt;&lt;li&gt;Integration of health record&lt;/li&gt;&lt;li&gt;Interface engines&lt;/li&gt;&lt;li&gt;Rules engines&lt;/li&gt;&lt;/ol&gt;Obviously there is a big need for standardization of communication protocols.  I am looking forward to learning more about HL7 and share my findings in this blog and other avenues.&lt;br /&gt;&lt;br /&gt;After the initial posting of this blog, I have been followed by "HL7-Tools", and it was mentioned that a link to their resources can be added.  Certainly.  Here is another resource for learning and practicing &lt;a href="http://www.hl7.org.au/HL7-Tools.htm"&gt;HL7 Tools, Utilities and Resources&lt;/a&gt;. Thanks for following.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5013989326299900663-3629480446638903714?l=tapkan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tapkan.blogspot.com/feeds/3629480446638903714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tapkan.blogspot.com/2009/04/introduction-to-hl7.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/3629480446638903714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/3629480446638903714'/><link rel='alternate' type='text/html' href='http://tapkan.blogspot.com/2009/04/introduction-to-hl7.html' title='Introduction to HL7'/><author><name>Baskin Tapkan</name><uri>http://www.blogger.com/profile/16745523698419707042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_ZuHHjM8p4AQ/SZXkIFSPdjI/AAAAAAAAA60/Vsz2d7pAP3M/S220/BaskinTapkan_linkedin.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5013989326299900663.post-3374757093098659541</id><published>2009-03-23T05:25:00.000-05:00</published><updated>2009-03-23T05:52:09.854-05:00</updated><title type='text'>Remember... it all starts small</title><content type='html'>Recently I have been working on a Windows client VB.NET project. With my client, we took some time to re-design the solution, project files and created layers to handle certain tasks, decoupled interfaces.  I took charge of creating a simple database to support configuration and automatic/batch processing of certain tasks.&lt;br /&gt;&lt;br /&gt;I opted to use Linq-to-SQL, but still have a separate business layer, and data access objects to talk to the UI.  I still favor this approach. It is going slow, but working nicely.&lt;br /&gt;&lt;br /&gt;Now couple of sticking points... first of all, I did underestimate the time to integrate the database/business object layer to the existing UI.  This is a very small project, at least on my side, don't have any software specification.  Made the database model after looking at the existing XML files.  Used a Linq-to-Sql Dbml file to generate the model in the code, implemented CRUD's with TDD.  Created a test harness, and that good stuff...&lt;br /&gt;&lt;br /&gt;The biggest problem is lack of time and testing the UI.  Since I took over an existing UI, it wasn't all clear what each button would do, what the states are, where is it going to be stored and such.  &lt;br /&gt;&lt;br /&gt;Looking a week or so back, what I should have done prior to giving an estimate was put down the UI as I see it, map out the functionality and give a more granular &amp; accurate estimates on how long each task takes.  You know you can always write a piece of functionality pretty quickly.  But to test it, integrate with the other components of the project, take time and need to be refactored. &lt;br /&gt;&lt;br /&gt;And communication is also key. My client is also pressed in time and resources and is running into issues with code integration.  We are having a few problems and I am trying to help out as much as I could.  Last week not being available for a quick call and not getting feedback threw me off and it was hard to get back to it after that.  &lt;br /&gt;&lt;br /&gt;On top of it, I got busier with my main task, finding another full time position. At the end of February, the consulting company I have been with laid me off along with a few other consultants due to economic downturn and lack of projects.  Fortunately, I was offered a full time position last Thursday and expecting to start full time next week. This is obviously good news and sigh of relief in this economy.  I would like to thank all my friends and family during this transition.  Their support and friendship really made it happen and gave me focus. &lt;br /&gt;&lt;br /&gt;Meantime, I really appreciate the fact that I have a side project to work on and yet stayed (staying) busy, however need to do a better job with giving work estimates.  And remember it all starts small...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5013989326299900663-3374757093098659541?l=tapkan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tapkan.blogspot.com/feeds/3374757093098659541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tapkan.blogspot.com/2009/03/remember-it-all-starts-small.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/3374757093098659541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/3374757093098659541'/><link rel='alternate' type='text/html' href='http://tapkan.blogspot.com/2009/03/remember-it-all-starts-small.html' title='Remember... it all starts small'/><author><name>Baskin Tapkan</name><uri>http://www.blogger.com/profile/16745523698419707042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_ZuHHjM8p4AQ/SZXkIFSPdjI/AAAAAAAAA60/Vsz2d7pAP3M/S220/BaskinTapkan_linkedin.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5013989326299900663.post-9148470195387324615</id><published>2009-02-13T15:37:00.001-06:00</published><updated>2009-02-13T16:05:54.818-06:00</updated><title type='text'>putting it altogether</title><content type='html'>In the last few days, I have been diving into a variety of .NET technologies.  This should be no surprise to anyone in this industry if one wishes to stay current and employed.  Especially in this economy. So there it goes...&lt;br /&gt;&lt;br /&gt;Well, I started dabbling with Silverlight 2.0.  Creating XAML pages, simple Silver application which is available once you install the Silverlight 2.o SDK. The place to start is &lt;a href="http://silverlight.net/learn"&gt;Learn Silverlight&lt;/a&gt;. Creating circles and elipses, buttons, stackpanels and grids on usercontrol is cool, but does not help my business.  So after reading a few chapters in one certain &lt;a href="http://www.amazon.com/Silverlight-2-Unleashed-Laurent-Bugnion/dp/0672330148"&gt;book&lt;/a&gt; and watching a few videos from the official site, I have decided to give it a go. &lt;br /&gt;&lt;br /&gt;As it turns out, Silverlight was just the prelude and wetted my appetite to dig deeper.  Since I am data oriented, I started creating a SQL Server database in SQL Server express.  Created a four-table data model which I will provide details later, but I just want to summarize the work I have done as of this Friday afternoon.&lt;br /&gt;&lt;br /&gt;With the database in place, created a Data Access Layer project in Visual Studio, using C# (.NET framework 3.5).  According to the feedback and posts I have read, I felt inclined to use Entity Framework.  As you may know, Entity Framework is available in Visual Studio 2008 SP1.  Setting this object/file up in Visual Studio is pretty easy, but I have ran into a few snags in my data model, especially with the associations.  And my version of Visual Studio does not open the modeller at first, but there is a trick which I found out.  If I open and close the file with the XML editor, the modeller becomes available.  &lt;br /&gt;&lt;br /&gt;With the model in place, I wrote data object classes to enable basic CRUD operations.  I made sure I created a separate test project/class to run my unit, I mean integrity tests.  After the model checked out fine, I moved on the next stage.&lt;br /&gt;&lt;br /&gt;Next was creating a WCF service which exposes the above data object. I created separate classes and host the service on the local IIS (running on XP, so IIS is 5.1).  Have to remind myself of certain WCF command line utils.  &lt;br /&gt;&lt;br /&gt;Then I created a WCF client to test the service I hosted on IIS.  Used the "svcutil" utility to create a proxy class and included the app.config file.  My client was a simple console application, don't include the service client.  So far so good.&lt;br /&gt;&lt;br /&gt;Then early this afternoon, I watched another video for consuming WCF services using Silverlight.  There were a few things I have to do and I have a few gripes about why certain things are done that way, but again will talk about that later. Oh, have I mentioned I am using ASP.NET MVC as my web.host project.  So hooking up separate XAML pages (or &lt;usercontrols&gt;) I should, was fun.  &lt;br /&gt;&lt;br /&gt;I have really worked on each individual component separately and just an hour ago, I was able to put it altogether. I got it working. And of course, there is a lot more work.  I will update this post as I find time.  Thanks for reading.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5013989326299900663-9148470195387324615?l=tapkan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tapkan.blogspot.com/feeds/9148470195387324615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tapkan.blogspot.com/2009/02/putting-it-altogether.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/9148470195387324615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5013989326299900663/posts/default/9148470195387324615'/><link rel='alternate' type='text/html' href='http://tapkan.blogspot.com/2009/02/putting-it-altogether.html' title='putting it altogether'/><author><name>Baskin Tapkan</name><uri>http://www.blogger.com/profile/16745523698419707042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_ZuHHjM8p4AQ/SZXkIFSPdjI/AAAAAAAAA60/Vsz2d7pAP3M/S220/BaskinTapkan_linkedin.jpg'/></author><thr:total>2</thr:total></entry></feed>
