<?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-1013953411233367131</id><updated>2011-08-21T04:21:13.254-07:00</updated><category term='english'/><category term='Web Forms ASP.NET MVC'/><title type='text'>Alex Ilyin's blog</title><subtitle type='html'>About design, code and how to make them better.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://alexilyin.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://alexilyin.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Alex Ilyin</name><uri>http://www.blogger.com/profile/13553194641939208996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>19</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1013953411233367131.post-8775159963749722438</id><published>2010-11-22T10:27:00.000-08:00</published><updated>2010-11-22T10:41:52.754-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Understanding english speech</title><content type='html'>Hi, I learn english myself and about couple of monthes ago I wished to practice in understanding english speech. Of course, I've googled and there are many resources. But no one was friendly enough for me, so I decided to make one myself, now I did it and published there &lt;a href="http://english-player.com"&gt;http://english-player.com&lt;/a&gt;. &lt;br /&gt;You are wellcome to play with it :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1013953411233367131-8775159963749722438?l=alexilyin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alexilyin.blogspot.com/feeds/8775159963749722438/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alexilyin.blogspot.com/2010/11/understanding-english-speech.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/8775159963749722438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/8775159963749722438'/><link rel='alternate' type='text/html' href='http://alexilyin.blogspot.com/2010/11/understanding-english-speech.html' title='Understanding english speech'/><author><name>Alex Ilyin</name><uri>http://www.blogger.com/profile/13553194641939208996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1013953411233367131.post-520356291413121819</id><published>2010-08-14T10:43:00.001-07:00</published><updated>2010-08-14T10:43:32.529-07:00</updated><title type='text'>Usability group</title><content type='html'>&lt;p&gt;About month ago I visited usability lection and there are key points.    &lt;br /&gt;1. UX professionals show UI prototypes to users before ANY programming. Obviously, everybody else should do the same.     &lt;br /&gt;2. Paper is better for prototyping than any software (including Balsamiq Mockups).     &lt;br /&gt;3. Very small changes in visual design can make big difference in profit. The only way to find out how to change the design is experimenting with real users.    &lt;br /&gt;4. There was a link to &lt;a href="http://uxmatters.com"&gt;http://uxmatters.com&lt;/a&gt; – I find it interesting.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1013953411233367131-520356291413121819?l=alexilyin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alexilyin.blogspot.com/feeds/520356291413121819/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alexilyin.blogspot.com/2010/08/usability-group.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/520356291413121819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/520356291413121819'/><link rel='alternate' type='text/html' href='http://alexilyin.blogspot.com/2010/08/usability-group.html' title='Usability group'/><author><name>Alex Ilyin</name><uri>http://www.blogger.com/profile/13553194641939208996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1013953411233367131.post-2702400798061579864</id><published>2010-07-15T09:47:00.001-07:00</published><updated>2010-07-15T09:53:54.253-07:00</updated><title type='text'>Progress report.</title><content type='html'>&lt;p&gt; Couple of years ago my colleague told me that my code is shit and is not going to improve. For last 5 months I’m told almost every day that my design decisions are bad and project architecture sucks. And today I’ve got new level. Marat Faskhiev told me that I’m extremely bad in project management decisions and never ever will be any better. I can’t even imagine what is going to be next... :)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1013953411233367131-2702400798061579864?l=alexilyin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alexilyin.blogspot.com/feeds/2702400798061579864/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alexilyin.blogspot.com/2010/07/progress-report.html#comment-form' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/2702400798061579864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/2702400798061579864'/><link rel='alternate' type='text/html' href='http://alexilyin.blogspot.com/2010/07/progress-report.html' title='Progress report.'/><author><name>Alex Ilyin</name><uri>http://www.blogger.com/profile/13553194641939208996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1013953411233367131.post-1946714781963298375</id><published>2010-07-01T09:43:00.001-07:00</published><updated>2010-07-01T09:43:52.168-07:00</updated><title type='text'>Rework</title><content type='html'>&lt;p&gt;I’ve just finished “Rework“ – a new book from 37signals guy. Very cool and very useful. It is about how to work better. After reading it I realized there are things I do wrong constantly. Three is my confession :&lt;/p&gt;  &lt;p&gt; I use word “easy” far to often. Others’ job seems to me more simple than it really is. I’ll try to use word “simple” about my job only. If you find me telling you that your job is simple I owe you $5. Seriously. &lt;/p&gt;  &lt;p&gt;Next sin is I work too much. Usually, 9+ hours a day without reading news or blogs or something, that’s too much. I do not fill very tired but I want to stop it anyway. Fortunately, my employee does not pay me for extra hours which should help. &lt;/p&gt;  &lt;p&gt;And one more thing to think about. I’ve not considered writing as something serious. I write this blog like a small game with myself. Alex Yakunin once advised me to write something more useful than posts like this one. Probably, he was right.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1013953411233367131-1946714781963298375?l=alexilyin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alexilyin.blogspot.com/feeds/1946714781963298375/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alexilyin.blogspot.com/2010/07/rework.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/1946714781963298375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/1946714781963298375'/><link rel='alternate' type='text/html' href='http://alexilyin.blogspot.com/2010/07/rework.html' title='Rework'/><author><name>Alex Ilyin</name><uri>http://www.blogger.com/profile/13553194641939208996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1013953411233367131.post-4393438256392892858</id><published>2010-06-10T09:53:00.001-07:00</published><updated>2010-06-10T09:53:02.433-07:00</updated><title type='text'>Why visit events?</title><content type='html'>&lt;p&gt;4 days ago I visited a local conference called “Agile days” where team leaders from different companies explained which agile practices they use and why. Of course, nothing has been said you can't read in books and articles in the internet. It is always so. Obviously, that’s why 80% of my colleagues do not visit such events. So it seems to be an interesting question &lt;strong&gt;Why I’ve spent my time and money if I could have not ?&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;Surprisingly, knowledge is not what I was looking for. Real profit events like this give is energy. All good speakers radiate positive and creative energy. It is a psychological phenomenon - when one passionately tells you about agile practices it gives you charge to do something about it. It does not mean you turn into scrum master next morning but it helps to make a step forward.In my case it was enough to have a look at new &lt;a href="http://www.pivotaltracker.com/"&gt;issue tracker&lt;/a&gt; and even to start using it. Moreover, may be I’ll agitate my teammates for scrum meetings or something.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1013953411233367131-4393438256392892858?l=alexilyin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alexilyin.blogspot.com/feeds/4393438256392892858/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alexilyin.blogspot.com/2010/06/why-visit-events.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/4393438256392892858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/4393438256392892858'/><link rel='alternate' type='text/html' href='http://alexilyin.blogspot.com/2010/06/why-visit-events.html' title='Why visit events?'/><author><name>Alex Ilyin</name><uri>http://www.blogger.com/profile/13553194641939208996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1013953411233367131.post-1214926705888659578</id><published>2010-05-27T10:03:00.001-07:00</published><updated>2010-05-27T10:06:43.608-07:00</updated><title type='text'>How to layout forms?</title><content type='html'>&lt;p&gt;There are many simple rules to follow designing forms. For example, logically related fields should be located near each other, most important fields should be visible at once when form is opened and so on. In this post I would like to share my personal preference for how form fields should be arranged. In fact, it is easer to express using images than words. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_CdFyKdXiua0/S_6lva2J6dI/AAAAAAAAABI/GSzzNibVI-8/s1600-h/myImage%5B5%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="myImage" border="0" alt="myImage" src="http://lh3.ggpht.com/_CdFyKdXiua0/S_6lv1_xJcI/AAAAAAAAABM/RGjZibE5ULg/myImage_thumb%5B3%5D.png?imgmax=800" width="638" height="216" /&gt;&lt;/a&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_CdFyKdXiua0/S_6lwiPZ88I/AAAAAAAAABQ/2PUq68qD2JE/s1600-h/layout2%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="layout2" border="0" alt="layout2" src="http://lh4.ggpht.com/_CdFyKdXiua0/S_6lxNVFhII/AAAAAAAAABU/YWscVrYIRx0/layout2_thumb%5B2%5D.png?imgmax=800" width="658" height="178" /&gt;&lt;/a&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_CdFyKdXiua0/S_6lx78lZEI/AAAAAAAAABY/-lM7BqdcPvo/s1600-h/layout3%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="layout3" border="0" alt="layout3" src="http://lh4.ggpht.com/_CdFyKdXiua0/S_6lyXCch2I/AAAAAAAAABc/yGbWwpqTQ4E/layout3_thumb%5B1%5D.png?imgmax=800" width="658" height="173" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_CdFyKdXiua0/S_6lyyH8sSI/AAAAAAAAABg/CYrox2jHLxI/s1600-h/layout4%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="layout4" border="0" alt="layout4" src="http://lh5.ggpht.com/_CdFyKdXiua0/S_6lznm83bI/AAAAAAAAABk/GanWZq_94OM/layout4_thumb%5B1%5D.png?imgmax=800" width="667" height="175" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_CdFyKdXiua0/S_6l0ovSWPI/AAAAAAAAABo/_ueAoXC_3LA/s1600-h/layout5%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="layout5" border="0" alt="layout5" src="http://lh3.ggpht.com/_CdFyKdXiua0/S_6l1VULasI/AAAAAAAAABs/EmX30rEqPNo/layout5_thumb%5B1%5D.png?imgmax=800" width="670" height="179" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_CdFyKdXiua0/S_6l13En42I/AAAAAAAAABw/N-bvETw8jYM/s1600-h/layout6%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="layout6" border="0" alt="layout6" src="http://lh4.ggpht.com/_CdFyKdXiua0/S_6l2QHkY2I/AAAAAAAAAB0/xLUXXlyTaxY/layout6_thumb%5B1%5D.png?imgmax=800" width="677" height="181" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_CdFyKdXiua0/S_6l2yzUgcI/AAAAAAAAAB4/ljtXAfwDz-c/s1600-h/layout7%5B5%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="layout7" border="0" alt="layout7" src="http://lh3.ggpht.com/_CdFyKdXiua0/S_6l3ZIvDFI/AAAAAAAAAB8/WHKolvj8UzI/layout7_thumb%5B3%5D.png?imgmax=800" width="681" height="178" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_CdFyKdXiua0/S_6l31ssHfI/AAAAAAAAACA/A7CX45e7fs0/s1600-h/layout8%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="layout8" border="0" alt="layout8" src="http://lh4.ggpht.com/_CdFyKdXiua0/S_6l4v6jmcI/AAAAAAAAACE/yY3pb3VJLrw/layout8_thumb%5B1%5D.png?imgmax=800" width="688" height="181" /&gt;&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/1013953411233367131-1214926705888659578?l=alexilyin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alexilyin.blogspot.com/feeds/1214926705888659578/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alexilyin.blogspot.com/2010/05/how-to-layout-forms.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/1214926705888659578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/1214926705888659578'/><link rel='alternate' type='text/html' href='http://alexilyin.blogspot.com/2010/05/how-to-layout-forms.html' title='How to layout forms?'/><author><name>Alex Ilyin</name><uri>http://www.blogger.com/profile/13553194641939208996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_CdFyKdXiua0/S_6lv1_xJcI/AAAAAAAAABM/RGjZibE5ULg/s72-c/myImage_thumb%5B3%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1013953411233367131.post-335168411940073822</id><published>2010-05-19T08:58:00.001-07:00</published><updated>2010-05-19T09:13:39.524-07:00</updated><title type='text'>LiveUI postmortem</title><content type='html'>&lt;p&gt;Had an interesting experience yesterday – I’ve opened LiveUI project after 3 month's pause. (Project is &lt;strike&gt;dead&lt;/strike&gt; frozen since January). And there are several lessons I’ve learned. First one is:&lt;strong&gt; &lt;/strong&gt;It is difficult to develop a framework and have a fresh look at the same time. Now I see many mistakes&amp;#160; I did not notice earlier. The biggest one is that it solves too many problems. For example, LiveUI provides special infrastructure to make sure client side objects are disposed correctly. Now it is obvious to me that 99.99% of ASP.NET developers do not care about memory leaks at client side and therefore feature development was not cost effective. &lt;/p&gt;  &lt;p&gt;So, how could features like mentioned one be implemented at all? The reason is that applications we developed using LiveUI needed these features and it seemed natural to include them in a framework. (we developed LiveUI and used it in parallel). Unconsciously I followed the pattern – If feature has nothing to do with specific business logic and can be implemented as a part of a framework then it should be implemented as a part of framework. It was foolish and that’s why. When you implement a product for some customer then cost of feature is just cost of its implementation but when you develop a framework it is much more expensive. Firstly, because API reviews, documentation and samples take time, secondly, because it makes framework more difficult to learn. Every public class and every public method kills simplicity which is precious resource. Once it is written it seems obvious, but, unfortunately, it was not. &lt;/p&gt;  &lt;p&gt;So there is the second lesson I learned. What I had to do was to split projects in groups like these: &lt;/p&gt;  &lt;li&gt;Framework &lt;/li&gt;  &lt;li&gt;Common code for applications &lt;/li&gt;  &lt;li&gt;Application A &lt;/li&gt;  &lt;li&gt;Application B &lt;/li&gt;  &lt;li&gt;Application C    &lt;p&gt;But our project structure was&lt;/p&gt; &lt;/li&gt;  &lt;li&gt;Framework &lt;/li&gt;  &lt;li&gt;Application A &lt;/li&gt;  &lt;li&gt;Application B &lt;/li&gt;  &lt;li&gt;Application C    &lt;p&gt;As a result, framework included too many features and was not finished in time. May be, in the future I’ll find time to throw away 60% of LiveUI which would make it finished at once :)     &lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt; &lt;/li&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1013953411233367131-335168411940073822?l=alexilyin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alexilyin.blogspot.com/feeds/335168411940073822/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alexilyin.blogspot.com/2010/05/liveui-postmortem.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/335168411940073822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/335168411940073822'/><link rel='alternate' type='text/html' href='http://alexilyin.blogspot.com/2010/05/liveui-postmortem.html' title='LiveUI postmortem'/><author><name>Alex Ilyin</name><uri>http://www.blogger.com/profile/13553194641939208996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1013953411233367131.post-7529914605375867337</id><published>2010-05-09T02:00:00.001-07:00</published><updated>2010-05-09T02:00:43.724-07:00</updated><title type='text'>Myths Of Innovations – Book Review</title><content type='html'>&lt;p&gt;I’ve just finished Scott Berkun’s “Myths of Innovations” and would recommend it to everybody. It is very easy and interesting reading, something you can read after 9 hours of programming. It would be especially interesting and useful for those who want to invent something cool and make million dollars out of it (I used to think that way myself). Basic topic of the book is comparison of what we think about how inventions and products appear with how it really happens. There are many good jokes and interesting facts, do not miss it, it worth your time for sure.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1013953411233367131-7529914605375867337?l=alexilyin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alexilyin.blogspot.com/feeds/7529914605375867337/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alexilyin.blogspot.com/2010/05/myths-of-innovations-book-review.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/7529914605375867337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/7529914605375867337'/><link rel='alternate' type='text/html' href='http://alexilyin.blogspot.com/2010/05/myths-of-innovations-book-review.html' title='Myths Of Innovations – Book Review'/><author><name>Alex Ilyin</name><uri>http://www.blogger.com/profile/13553194641939208996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1013953411233367131.post-3227474899935278130</id><published>2010-04-26T09:44:00.001-07:00</published><updated>2010-04-26T09:44:55.048-07:00</updated><title type='text'>Design Of Design – Book review</title><content type='html'>&lt;p&gt;If you do not know, Design of Design is a new book of Fred Brooks, author of world famous “The Mythical Man-Month&lt;em&gt;”. &lt;/em&gt;I am not arrogant enough to call this book bad or good, I can just tell what is is about. 50% of books is about how Brooks designed his house, what tools he would like to use designing it, how he bough land from his neighbor and so on... 40% about how IBM OS 360 and other old good computers were designed, 10% devoted to philosophic problems such as “What is design?”, “How to design?”&amp;quot; and “What are the toughest problems of design”. If you design software there is not much practically useful information, but it is just interesting and I do not regret I’ve spent time reading it.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1013953411233367131-3227474899935278130?l=alexilyin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alexilyin.blogspot.com/feeds/3227474899935278130/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alexilyin.blogspot.com/2010/04/design-of-design-book-review.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/3227474899935278130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/3227474899935278130'/><link rel='alternate' type='text/html' href='http://alexilyin.blogspot.com/2010/04/design-of-design-book-review.html' title='Design Of Design – Book review'/><author><name>Alex Ilyin</name><uri>http://www.blogger.com/profile/13553194641939208996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1013953411233367131.post-5778763332731207956</id><published>2010-04-18T03:00:00.001-07:00</published><updated>2010-04-18T03:05:54.881-07:00</updated><title type='text'>Build server benefits for small project</title><content type='html'>&lt;p&gt;If software project consists of hundreds of modules and takes hours just to compile then, of course, project would would benefit of using automated build server but is it really needed when project is small and complies in a few seconds? Surprisingly, the answer is YES. Initially I was almost sure in opposite, but once we tried it I’ve changed my mind. I thought main benefit of build server is that it tells you when you broke something, but it turns out that main benefit is that it tells you when others broke something. Suppose you want to commit some code and have to update project from SVC. Logic is very simple: If there is no build server then update is a risk, you can get spoilt version from repository which would paralyze your work for at least 10 minutes. And if there is build server you can just wait with commit until build errors are fixed.&lt;/p&gt;  &lt;p&gt;PS: If truth be told build server has not saved me a minute yet because my colleagues are very accurate committers but it saved their time because I am not :)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1013953411233367131-5778763332731207956?l=alexilyin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alexilyin.blogspot.com/feeds/5778763332731207956/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alexilyin.blogspot.com/2010/04/build-server-benefits-for-small-project.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/5778763332731207956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/5778763332731207956'/><link rel='alternate' type='text/html' href='http://alexilyin.blogspot.com/2010/04/build-server-benefits-for-small-project.html' title='Build server benefits for small project'/><author><name>Alex Ilyin</name><uri>http://www.blogger.com/profile/13553194641939208996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1013953411233367131.post-5125039942075398183</id><published>2010-04-11T02:36:00.001-07:00</published><updated>2010-04-11T03:45:44.055-07:00</updated><title type='text'>My vision of Storage API</title><content type='html'>Without boring preface I’m going to describe Storage API I would like to use, that imaginary storage has just two basic types end user has to deal with: Storage and Entity. One can consider Storage as a big Collection of Entities. For example, one can add or remove Entities from a Storage almost the same way as&amp;#160; from ArrayList. There are many different storages: SqlServerStorage, OracleStorage, InMemoryStorage, OfflineStorage. Different storage have different policy for transactions. For example, OracleStorage requires all operations for reading and writing data to be performed in transactions whereas offline storage does not. Let’s take a look at samples illustrating basic functionality:   &lt;br /&gt;Example 1 : Using SqlServerStorage  &lt;br /&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;var storage = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SqlServerStorage {&lt;br /&gt; ConnectionString=”Server=(local);DataBase=MyDB;”};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (var t=storage.BeginTransaction()) {&lt;br /&gt; var person = storage.Get&amp;lt;Person&amp;gt;(5);&lt;br /&gt; storage.Remove(person);&lt;br /&gt; t.Commit();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Example 2 : Queries &lt;br /&gt;&lt;br /&gt;&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;var storage = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SqlServerStorage {&lt;br /&gt; &lt;br /&gt;ConnectionString=”Server=(local);DataBase=MyDB;”};&lt;br /&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (var t= storage.BeginTransaction()) {&lt;br /&gt; var person = storage.Query&amp;lt;Person&amp;gt;().Where(p=&amp;gt;p.ID=5);&lt;br /&gt; storage.Remove(person);&lt;br /&gt; t.Commit();}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;These samples work almost the same way as DataObjects usually do, just syntax is a bit different. Offline storage is more interesting. Offline storage deals with object the same way as Svn works with files. One can get objects which are in consistent state with each other but the whole storage state is not guaranteed to be in a consistent state. For example, that is how objects can be loaded &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Example 3 :&amp;#160; Using OfflineStorage &lt;br /&gt;&lt;br /&gt;&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;var storage = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SqlServerStorage {&lt;br /&gt;ConnectionString=”Server=(local);DataBase=MyDB;”};&lt;br /&gt;var offlineStorage = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; OfflineStorage(storage);&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (offlineStorage.BeginTransaction()) { &lt;span style="color: #008000"&gt;// Real transaction was created&lt;/span&gt;&lt;br /&gt; var person = offlineStorage.Get&amp;lt;Person&amp;gt;(4); &lt;br /&gt; var book = offlineStorage.Get&amp;lt;Book&amp;gt;(5);&lt;br /&gt;}&lt;br /&gt;var person = offlineStorage.Get&amp;lt;Person&amp;gt;(6);&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Person #4 and Book #5 are guaranteed to be in a consistent state but Person #4 and Person #6 are not. Offline storage never updates real data, one should call “Commit” manually. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Example 4: OfflineStorage changes &lt;br /&gt;&lt;br /&gt;&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;var storage = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SqlServerStorage {&lt;br /&gt;ConnectionString=”Server=(local);DataBase=MyDB;”};&lt;br /&gt;var offlineStorage = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; OfflineStorage(storage);&lt;br /&gt;var person = offlineStorage.Get&amp;lt;Person&amp;gt;(6);&lt;br /&gt;person.Name = “Alex”;&lt;br /&gt;offlineStorage.SaveChanges();&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Of course, SaveChanges call leads to to creation of new Transaction at real storage. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Another interesting moment is transferring data over network. It is achieved using special storage called StorageProxy. There is an example of using StorageProxy: &lt;br /&gt;&lt;br /&gt;&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;var storage = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StorageProxy(“tcp:/myServer.com:5040”);&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (storage.BeginTransaction()) {&lt;br /&gt; var p = storage.Get&amp;lt;Person&amp;gt;(5);&lt;br /&gt; storage.Remove(p);}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;So one can make n-tier application just plugging proxies one to another. I could continue examples, but for one post it seems to enough.&lt;br /&gt;&lt;br /&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1013953411233367131-5125039942075398183?l=alexilyin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alexilyin.blogspot.com/feeds/5125039942075398183/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alexilyin.blogspot.com/2010/04/my-vision-of-orm-api.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/5125039942075398183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/5125039942075398183'/><link rel='alternate' type='text/html' href='http://alexilyin.blogspot.com/2010/04/my-vision-of-orm-api.html' title='My vision of Storage API'/><author><name>Alex Ilyin</name><uri>http://www.blogger.com/profile/13553194641939208996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1013953411233367131.post-1572691821903857174</id><published>2010-03-20T11:33:00.001-07:00</published><updated>2010-03-30T10:58:40.694-07:00</updated><title type='text'>About general solutions.</title><content type='html'>&lt;p&gt;In this post I would like to discuss an interesting problem all software developers periodically face. Question is whether to implement general solution to solve specific problem or not. How to choose ? Unfortunately, many developers use following approach: “If I can implement general solution quickly then I’ll do it”. Just yesterday I have an argument with one programmer who told these very words.&amp;#160; It is wrong because &lt;strong&gt;&lt;em&gt;General solution is not always better than specific one.&lt;/em&gt;&lt;/strong&gt; Truth is that decisions like this have nothing to do with Code Quality, Readability, Design patterns and other things developers used to work with, it is manager’s decision. If you really were trusted to make such decisions, look at problem from manager’s point view. Think about cost of development, cost of failure, cost of maintenance, cost of testing, risk management, estimate everything and only then make a decision. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1013953411233367131-1572691821903857174?l=alexilyin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alexilyin.blogspot.com/feeds/1572691821903857174/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alexilyin.blogspot.com/2010/03/about-general-solutions.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/1572691821903857174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/1572691821903857174'/><link rel='alternate' type='text/html' href='http://alexilyin.blogspot.com/2010/03/about-general-solutions.html' title='About general solutions.'/><author><name>Alex Ilyin</name><uri>http://www.blogger.com/profile/13553194641939208996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1013953411233367131.post-186394880324495402</id><published>2010-03-03T09:24:00.001-08:00</published><updated>2010-03-05T09:36:59.806-08:00</updated><title type='text'>WPF Resources</title><content type='html'>&lt;p&gt;My new project is enterprise level business application with WPF based user interface, so I learn WPF intensively and I’ll use this blog to collect useful links and resources about WPF. There are many resources in the internet so trick is to filter, not to find.&amp;#160; &lt;/p&gt;  &lt;h3&gt;Books&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://www.amazon.com/Essential-Windows-Presentation-Foundation-WPF/dp/0321374479"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="essential wpf" border="0" alt="essential wpf" src="http://lh6.ggpht.com/_CdFyKdXiua0/S46bY2A0lsI/AAAAAAAAABA/132Jj5FDdw0/essentialwpf4.jpg?imgmax=800" width="240" height="240" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The best book I found so far. It is written by WPF architect Chris Anderson and describes principles and philosophy behind WPF. Something you won’t find in technical documentation.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.amazon.com/Windows-Presentation-Foundation-Unleashed-WPF/dp/0672328917"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wpf unleashed" border="0" alt="wpf unleashed" src="http://lh6.ggpht.com/_CdFyKdXiua0/S46bZPnHZRI/AAAAAAAAABE/tbJxNm2C3u0/wpf%20unleashed%5B5%5D.jpg?imgmax=800" width="240" height="240" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This book provides many interesting tips and notes, it is not as&amp;#160; interesting as the first one, but even more useful :) &lt;/p&gt;  &lt;h3&gt;Articles and Tutorials&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc785480.aspx"&gt;Routed events and commands.&lt;/a&gt;&amp;#160; &lt;br /&gt;&amp;#160; &lt;a href="http://blog.raffaeu.com/archive/2010/01/02/build-enterprise-application-with-wpf-prism-and-wcf.-tutorial-07.aspx"&gt;Build enterprise application with WPF, Prism and WCF.&lt;/a&gt;     &lt;br /&gt;&amp;#160; &lt;a href="http://www.codeproject.com/KB/WPF/MVVMForDummies.aspx"&gt;MVVM For Dummies&lt;/a&gt;     &lt;br /&gt;&amp;#160; &lt;a href="http://www.codeproject.com/KB/WPF/WpfDataVirtualization.aspx"&gt;Async Data Loading in WPF&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Blogs&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://blog.galasoft.ch/Default.aspx"&gt;Laurent Bugnion (GalaSoft)&lt;/a&gt;. Loads of useful posts.     &lt;br /&gt;&amp;#160; &lt;a href="http://sweux.com/blogs/smoura/index.php/category/wpf/"&gt;http://sweux.com/blogs/smoura/index.php/category/wpf/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://cid-1f72da7294089597.profile.live.com/Lists/cns!1F72DA7294089597!405/"&gt;Other guy's WPF Resources :)&lt;/a&gt;    &lt;br /&gt;&amp;#160; &lt;a href="http://blogs.msdn.com/devkeydet/archive/2008/05/07/wpf-for-line-of-business-applications.aspx"&gt;wpf-for-line-of-business-applications.aspx&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Usage&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://dotnet.org.za/rudi/archive/2008/08/28/wpf-in-lob.aspx "&gt;There&lt;/a&gt; are nice links:     &lt;br /&gt;&lt;a href="http://channel9.msdn.com/shows/Continuum/LawsonSmartOffice/"&gt;Lawson Smart Office brings WPF goodness to the enterprise&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://www.dnrtv.com/default.aspx?showNum=115"&gt;Billy Hollis on Getting Smart with WPF&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://herdingcode.com/?p=28"&gt;Episode 11- Glenn Block on Prism, Unity, and MEF (part 1)&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Frameworks&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://stackoverflow.com/users/43635/pete-ohanlon"&gt;Pete OHanlon&lt;/a&gt; provides description of several frameworks &lt;a href="http://stackoverflow.com/questions/1409553/what-framework-for-mvvm-should-i-use"&gt;here&lt;/a&gt;. To make navigation simpler, I cite him:&lt;/p&gt;  &lt;p&gt;Microsoft’s &lt;a href="http://www.codeplex.com/wpf/Release/ProjectReleases.aspx?ReleaseId=14962"&gt;MVVM Toolkit&lt;/a&gt; - this is still very much in the alpha stages. When it was originally released, it took a bit of a savaging from the Disciples because of what it didn't do. Saying that, MS is looking to beef this framework up so it's one to watch - it's just not ready yet.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://mvvmfoundation.codeplex.com/"&gt;MVVM Foundation&lt;/a&gt; - ah Josh Smith's version of the framework. Josh is one of the daddies of MVVM, and has been a huge advocate and teacher of the pattern. As a result, a lot of what you'll find in other frameworks has Josh's fingerprints all over it. This framework is intended to provide the basics of MVVM, and not to address some of the more esoteric issues. Originally this was intended only for WPF, but people such as Laurent Bugnion and myself have added functionality/projects that mean this will be a Silverlight compatible framework as well.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://waf.codeplex.com/"&gt;WAF&lt;/a&gt; - no experience of it, so I can't comment on it I'm afraid.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geekswithblogs.net/lbugnion/archive/2009/09/06/mvvm-light-toolkit-v1.1.1-whatrsquos-new.aspx"&gt;MVVM Light&lt;/a&gt; - Laurent Bugnion's take on it, and just updated to version 2. This is a very good framework, but again it's not intended to cover every single aspect of MVVM applications. Given Laurent's background, it has very strong Silverlight and Blendability support in it.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://sachabarber.net/?p=527"&gt;Cinch&lt;/a&gt; - Sacha Barber's excellent WPF only MVVM framework. This covers more ground than the frameworks I've talked about above. It's an excellent framework, and takes advantage of concepts covered in Bill Kempf's excellent &lt;a href="http://wpfonyx.codeplex.com/"&gt;Onyx&lt;/a&gt; project. Onyx is intended to complement MVVM frameworks, and adds in functionality that's typically been hard for people to do in MVVM/WPF. Again, originally intended to be WPF only, Onyx has progressed to include SL compatibility - work I am particularly proud to have been involved in.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://karlshifflett.wordpress.com/mvvm/wpf-line-of-business-demo-application-source/"&gt;Ocean&lt;/a&gt; - Karl Shifflett, Program Manager on the Cider team, recently released a fully featured WPF MVVM framework. Again, this is an excellent framework and has lots to recommend it.&lt;/p&gt;  &lt;p&gt;-- end of citation.&lt;/p&gt;  &lt;h3&gt;Controls&lt;/h3&gt;  &lt;p&gt;I would recommend to take a look at    &lt;br /&gt;&amp;#160; &lt;a title="http://xceed.com" href="http://xceed.com"&gt;http://xceed.com&lt;/a&gt;     &lt;br /&gt;&amp;#160; &lt;a href="http://www.devexpress.com/"&gt;http://www.devexpress.com/&lt;/a&gt;&amp;#160; &lt;br /&gt;&amp;#160; &lt;a href="http://www.telerik.com"&gt;http://www.&lt;b&gt;telerik&lt;/b&gt;.com&lt;/a&gt;     &lt;br /&gt;    &lt;br /&gt;I should mention that I was searching for a grid which could load data from the server asynchronously in small portions and I failed to find any. Even those I mentioned do not provide the functionality out of the box.&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;If you know something worth reading, please, leave comment :)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1013953411233367131-186394880324495402?l=alexilyin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alexilyin.blogspot.com/feeds/186394880324495402/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alexilyin.blogspot.com/2010/03/wpf-resources.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/186394880324495402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/186394880324495402'/><link rel='alternate' type='text/html' href='http://alexilyin.blogspot.com/2010/03/wpf-resources.html' title='WPF Resources'/><author><name>Alex Ilyin</name><uri>http://www.blogger.com/profile/13553194641939208996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_CdFyKdXiua0/S46bY2A0lsI/AAAAAAAAABA/132Jj5FDdw0/s72-c/essentialwpf4.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1013953411233367131.post-5606499983379381161</id><published>2010-02-20T02:14:00.001-08:00</published><updated>2010-02-20T02:29:45.005-08:00</updated><title type='text'>CSLA – First impression</title><content type='html'>&lt;p&gt;I’ve spent a day learning CSLA framework and I would like to share my impression. Of course, first question is “&lt;strong&gt;What is it for?”.&lt;/strong&gt; Following &lt;a href="http://en.wikipedia.org/wiki/Component-based_Scalable_Logical_Architecture"&gt;wikipedia&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;em&gt;Component-based Scalable Logical Architecture (CSLA) is a &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Software_framework"&gt;&lt;em&gt;software framework&lt;/em&gt;&lt;/a&gt;&lt;em&gt; created by &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Rockford_Lhotka"&gt;&lt;em&gt;Rockford Lhotka&lt;/em&gt;&lt;/a&gt;&lt;em&gt; that provides a standard way to create robust &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Object_oriented"&gt;&lt;em&gt;object oriented&lt;/em&gt;&lt;/a&gt;&lt;em&gt; programs using &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Business_object_(computer_science)"&gt;&lt;em&gt;business objects&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Business objects are objects that abstract business entities in an object oriented program.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Definitions like this make me confused because essentially it says nothing.&amp;#160; For example, DataObjects.NET have nothing to do with CSLA but also fits the definition. So, I would like to give another one: CSLA is a framework to make&amp;#160; objects which are smart enough to provide&lt;strong&gt; &lt;em&gt;binding, undo-redo, validation&lt;/em&gt;&lt;/strong&gt; and at the same time simple enough to be &lt;strong&gt;&lt;em&gt;serializable&lt;/em&gt;&lt;/strong&gt;. These objects should be organized in a hierarchical structure matching specific use case.&lt;/p&gt;  &lt;p&gt;If I understand things right, then basic scenario is following: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Create UI Form. &lt;/li&gt;    &lt;li&gt;Create CSLA objects with Data and Logic this Form needs. &lt;/li&gt;    &lt;li&gt;Bind Form fields to CSLA object properties. &lt;/li&gt;    &lt;li&gt;Implement logic to fill and persist CSLA objects. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;In my opinion concept is very good and it is exactly the way I would like to work with Data. Realization is also OK: It is not complex, it does not use black magic like code generation or aspect oriented tricks (AFAIK), it is easy to plug to your project (just one assembly reference). &lt;/p&gt;  &lt;p&gt;One thing I &lt;strong&gt;DO&lt;/strong&gt; &lt;strong&gt;NOT&lt;/strong&gt; like about CSLA is that it uses&lt;strong&gt; STATIC&lt;/strong&gt; methods to transport data, which means that you can not fully control data transport. Though it should not be a problem for most scenarios, from design point of view it looks ugly. It is like if SqlConnection’s ConnectionString property were static.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1013953411233367131-5606499983379381161?l=alexilyin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alexilyin.blogspot.com/feeds/5606499983379381161/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alexilyin.blogspot.com/2010/02/csla-first-impression.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/5606499983379381161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/5606499983379381161'/><link rel='alternate' type='text/html' href='http://alexilyin.blogspot.com/2010/02/csla-first-impression.html' title='CSLA – First impression'/><author><name>Alex Ilyin</name><uri>http://www.blogger.com/profile/13553194641939208996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1013953411233367131.post-558843807580825823</id><published>2010-02-07T10:04:00.001-08:00</published><updated>2010-02-07T10:06:42.593-08:00</updated><title type='text'>Code quality test</title><content type='html'>&lt;p&gt;There are many signs of bad code, repeatable code fragments, long methods, unclear variable names and so on... Many books have been written on the subject, nevertheless sometimes programmers can not agree whether specific code is good or bad. A few days ago I’ve got the idea of very simple and (in my opinion) good test allowing to check code quality in a few minutes.&lt;/p&gt;  &lt;p&gt;That’s what you have to do: select randomly one of the classes and remove one of its methods, after that call one of the programmers and ask him to write removed method again, from scratch. That’s it :). If code looks the same way or almost the same way then everything is OK. If code looks differently than there is a problem. If nobody can implement removed method again then system needs refactoring.&amp;#160; (You can also remove the whole class or a couple of classes, it would be also interesting experiment).&lt;/p&gt;  &lt;p&gt;Small portion of philosophy behind. Good software is like bad movies. 100% predictable, 100% boring. Everything is absolutely clear from declarations. If so then it is easy to rewrite any code portion. On contrary, if code is complex and full of tricks then it is bad and difficult to repeat. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1013953411233367131-558843807580825823?l=alexilyin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alexilyin.blogspot.com/feeds/558843807580825823/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alexilyin.blogspot.com/2010/02/code-quality-test.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/558843807580825823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/558843807580825823'/><link rel='alternate' type='text/html' href='http://alexilyin.blogspot.com/2010/02/code-quality-test.html' title='Code quality test'/><author><name>Alex Ilyin</name><uri>http://www.blogger.com/profile/13553194641939208996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1013953411233367131.post-4646406689426491833</id><published>2010-01-29T11:16:00.001-08:00</published><updated>2010-01-30T02:43:43.479-08:00</updated><title type='text'>Inventing Log module.</title><content type='html'>&lt;p&gt;This week I’ve added Log module to LiveUI and I would like to share my experience. I should mention firstly that I was very busy and I did not want to spend more than one hour for the whole thing, it was reasonable deadline because functionality I needed was very simple: I wanted several methods to write arguments they receive to the text file, file name and format should have been configurable. Firstly I’ve invented syntax I would like to use. &lt;/p&gt;&lt;p&gt;Let’s assume, we need to log MyMethod calls of MyType,&amp;#160; I wanted code to look like: &lt;/p&gt;&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; MyType {&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; MyMethod(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; arg1, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; arg2) {&lt;br /&gt;    Log.Get(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;).Message(&lt;span style="color: #006080"&gt;&amp;quot;method call: MyMethod({0}, {1})&amp;quot;&lt;/span&gt;, arg1, arg2);&lt;br /&gt;    ...&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;After that I needed some logging framework and adapter to my syntax. Let’s talk about adapter first, I’ve followed straightforward way and created interface ILogProvider&lt;/p&gt;&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;interface&lt;/span&gt; ILogProvider {&lt;br /&gt;  Log GetLog&amp;lt;TContext&amp;gt;(TContext context)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;abstract&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Log&lt;br /&gt;{&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;abstract&lt;/span&gt; Message(...);&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;abstract&lt;/span&gt; Warning(...);&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;abstract&lt;/span&gt; Error(...)&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Log Get&amp;lt;TContext&amp;gt;(TContext context)&lt;br /&gt;  {&lt;br /&gt;    ILogProvider logProvider = ...; &lt;span style="color: #008000"&gt;// Nothing interesting there.&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;logProvider.GetLog&amp;lt;TContext&amp;gt;(context);&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The only thing left is to implement ILogProvider. I had been choosing between log4net and NLog for implementation (both are open source and popular). Comparing code and configuration samples I’ve chosen NLog because its samples do not contain ugly words like “NullAppender” and it has better web site (yes, it does matter) :) That’s how NLog based ILogProvider implementation looks&lt;/p&gt;&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; NLogProvider : ILogProvider {&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Log GetLog&amp;lt;TContext&amp;gt;(TContext context) {&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; NLog&amp;lt;TContext&amp;gt;.Instance;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; NLog&amp;lt;T&amp;gt; : Log &lt;br /&gt;{&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; NLog&amp;lt;T&amp;gt; Instance = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; NLog&amp;lt;T&amp;gt;();&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; Logger logger;&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; Message(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; format, args) {&lt;br /&gt;    logger.Info(...);&lt;br /&gt;  }  &lt;br /&gt;&lt;br /&gt;  &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; NLog(){&lt;br /&gt;    logger = LogManager.GetLogger(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(T).FullName));&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;That’s it. After that we can configure logging using Nlog configuration section like following&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&amp;lt;nlog&amp;gt;&lt;br /&gt;  &amp;lt;logger name=&lt;span style="color: #006080"&gt;&amp;quot;MyNamespace.MyType&amp;quot;&lt;/span&gt; minlevel=&lt;span style="color: #006080"&gt;&amp;quot;Debug&amp;quot;&lt;/span&gt; writeTo=&lt;span style="color: #006080"&gt;&amp;quot;MyLog&amp;quot;&lt;/span&gt; /&amp;gt;&lt;br /&gt;  &amp;lt;target name=&lt;span style="color: #006080"&gt;&amp;quot;MyLog&amp;quot;&lt;/span&gt; xsi:type=&lt;span style="color: #006080"&gt;&amp;quot;File&amp;quot;&lt;/span&gt; filename=&lt;span style="color: #006080"&gt;&amp;quot;${basepath}/log.txt&amp;quot;&lt;/span&gt;/&amp;gt; &lt;br /&gt;&amp;lt;/nlog&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;a style="display: none" href="http://alexilyin.blogspot.com/" rel="tag"&gt;CodeProject&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1013953411233367131-4646406689426491833?l=alexilyin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alexilyin.blogspot.com/feeds/4646406689426491833/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alexilyin.blogspot.com/2010/01/inventing-logger-module.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/4646406689426491833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/4646406689426491833'/><link rel='alternate' type='text/html' href='http://alexilyin.blogspot.com/2010/01/inventing-logger-module.html' title='Inventing Log module.'/><author><name>Alex Ilyin</name><uri>http://www.blogger.com/profile/13553194641939208996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1013953411233367131.post-3314740884052814047</id><published>2010-01-24T01:36:00.000-08:00</published><updated>2010-01-24T23:17:40.721-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Forms ASP.NET MVC'/><title type='text'>Web forms and ASP.NET MVC</title><content type='html'>I was not going to write about Web.Forms and ASP.NET MVC comparison, but I happen to read &lt;a href="http://dotnetslackers.com/articles/aspnet/Sparse-Thoughts-on-ASP-NET-MVC-Controllers.aspx"&gt;that &lt;/a&gt;article of Dino Esposito and it confused me. The reason is that at the end of the article author rises the question -&lt;span&gt;&lt;span&gt;&lt;i&gt; What would be the difference between ASP.NET MVC and Web Forms then? Oh well, controllers are separated from views and offer SoC and testability.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"   style="  color: rgb(51, 51, 51); font-family:'Lucida Grande', Verdana, Arial, sans-serif;font-size:14px;"&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;In my opinion, that difference is not essential. One can create a presenter or controller as a separated testable class and use it in ASP.NET page. And it is not difficult to make this presenter or controller instantiated automatically by IoC container. It is really simple and will not take more than hour to implement if you understand how ASP.NET works. And that is the key. You have to understand ASP.NET to use it efficiently. The same it true about MVC but&lt;b&gt; it is much easier to understand.&lt;/b&gt; That is what matters. I consider ASP.NET MVC as "&lt;i&gt;ASP.NET Lite"&lt;/i&gt; like &lt;i&gt;ICQ Lite &lt;/i&gt;or &lt;i&gt;Facebook lite&lt;/i&gt;. It provides less features but it is more simple and more friendly. Principially, I like this approach but I am used to ASP.NET, I use its features and I would implement them myself if there were only Lite version. &lt;br /&gt;&lt;a href="http://alexilyin.blogspot.com/" rel="tag" style="display: none;"&gt;CodeProject&lt;/a&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;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1013953411233367131-3314740884052814047?l=alexilyin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alexilyin.blogspot.com/feeds/3314740884052814047/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alexilyin.blogspot.com/2010/01/web-forms-and-aspnet-mvc.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/3314740884052814047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/3314740884052814047'/><link rel='alternate' type='text/html' href='http://alexilyin.blogspot.com/2010/01/web-forms-and-aspnet-mvc.html' title='Web forms and ASP.NET MVC'/><author><name>Alex Ilyin</name><uri>http://www.blogger.com/profile/13553194641939208996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1013953411233367131.post-6140600190455555985</id><published>2010-01-16T03:03:00.000-08:00</published><updated>2010-01-18T23:04:39.364-08:00</updated><title type='text'>Between Tirany and Democracy</title><content type='html'>&lt;div&gt;&lt;div&gt;&lt;div&gt;There are many models of how software development team can be organized. In Xtensive company we drift somewhere between SCRUM and traditional hierarchical structure. In this post I would like to share my opinion about reasons and consequences of this drifting. It should be noted that my opinion, probably, does not correlate with company executives'.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Nowadays everybody wants to be agile, there are hundreds of books about advantages of agile project management and they make SCRUM look attractive. Indeed, If team members make valuable decisions together they should feel responsible for the project which improves both product quality and morale. On other hand, Xtensive company was founded by very qualified programmers and it would be waste of talent if they did not participate in development process. As a result, we have following project management methodology:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Get several developers and let them think they all are system architects.&lt;/li&gt;&lt;li&gt;Let them design and implement different project parts on their own. &lt;/li&gt;&lt;li&gt;Let product owner look at their source code and to tell what is wrong. &lt;/li&gt;&lt;li&gt;Let product owner design and implement something when he feels like that. &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;This approach turns out to be very flexible. If project owner uses 3) and 4) actively then decision making process turns into tyranny, otherwise it gets closer to democracy. So we are balancing between these options permanently. This management policy has many positive and negative consequences, the most interesting is that it leads to good product quality and low popularity&lt;b&gt; at the same time!&lt;/b&gt; Quality is high because it is controlled by product owner and popularity is low for the same reason. If you know how product works and read its source code every day then it's VERY difficult to look at the product from user's point of view. &lt;/div&gt;&lt;div&gt;So, it is fun to develop products in Xtensive, we are fond of our products but almost nobody else is :)&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;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1013953411233367131-6140600190455555985?l=alexilyin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alexilyin.blogspot.com/feeds/6140600190455555985/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alexilyin.blogspot.com/2010/01/between-tirany-and-democracy.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/6140600190455555985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/6140600190455555985'/><link rel='alternate' type='text/html' href='http://alexilyin.blogspot.com/2010/01/between-tirany-and-democracy.html' title='Between Tirany and Democracy'/><author><name>Alex Ilyin</name><uri>http://www.blogger.com/profile/13553194641939208996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1013953411233367131.post-5265171112084773946</id><published>2009-05-07T21:47:00.000-07:00</published><updated>2009-05-07T21:57:21.179-07:00</updated><title type='text'>LiveUI.net release</title><content type='html'>I work at asp.net/ajax framework (LiveUI.net), which should simplify web development a lot. We have released 0.4 version which already provides  loads of cool features. The problem now is how to make people know how cool it is.&lt;br /&gt;First step I've done is creating Web Site, Live Demo and Documentation, they are available for free at &lt;a href="http://liveui.net"&gt;http://liveui.net&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1013953411233367131-5265171112084773946?l=alexilyin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alexilyin.blogspot.com/feeds/5265171112084773946/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://alexilyin.blogspot.com/2009/05/liveuinet-release.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/5265171112084773946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1013953411233367131/posts/default/5265171112084773946'/><link rel='alternate' type='text/html' href='http://alexilyin.blogspot.com/2009/05/liveuinet-release.html' title='LiveUI.net release'/><author><name>Alex Ilyin</name><uri>http://www.blogger.com/profile/13553194641939208996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
