<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en"><title type="text">assumption of advancement</title><link rel="alternate" type="text/html" href="http://blog.eweibel.net" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/AssumptionOfAdvancement" /><subtitle type="html">Blog about software architecture</subtitle><updated>2012-04-29T13:09:34+00:00</updated><generator>http://wordpress.org/?v=</generator><sy:updatePeriod xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">hourly</sy:updatePeriod><sy:updateFrequency xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">1</sy:updateFrequency><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/AssumptionOfAdvancement" /><feedburner:info uri="assumptionofadvancement" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-nd/3.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><entry><title type="text">Are stale data evil?</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AssumptionOfAdvancement/~3/HW_8NVi5_XM/" /><category term="Software architecture" /><author><name>Patrick</name></author><updated>2012-02-27T03:38:51-08:00</updated><id>http://blog.eweibel.net/?p=1198</id><summary type="html">When you&amp;#8217;re a software engineer who produces software for enterprises like banks or assurances, then it is normal you have huge databases (several gigabytes). Such systems have an operative application where users do the daily business of the company and there are more informative parts (or strategic parts) of the systems which the management uses. [...]</summary><content type="html">&lt;p&gt;&lt;a href="http://blog.eweibel.net/wp-content/uploads/Fotolia_37310173_S.jpg" rel="lightbox[1198]"&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="Sexy young woman as devil in fire" border="0" alt="Sexy young woman as devil in fire" align="right" src="http://blog.eweibel.net/wp-content/uploads/Fotolia_37310173_S_thumb.jpg" width="242" height="272" /&gt;&lt;/a&gt;When you&amp;#8217;re a software engineer who produces software for enterprises like banks or assurances, then it is normal you have huge databases (several gigabytes). Such systems have an operative application where users do the daily business of the company and there are more informative parts (or strategic parts) of the systems which the management uses. At a first glance, there isn&amp;#8217;t a problem with those two views, but as you probably know, those companies have for the second part for the management a data ware house solution.&lt;/p&gt;
&lt;p&gt;But what if your customer doesn&amp;#8217;t want a data ware house solution? Or if he couldn&amp;#8217;t afford one? Then you will probably add reports, search views to your application. In this blog post I describe some of the aspects if you&amp;#8217;ve to choose this variation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stale data as a requirement&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Unfortunately the question &amp;quot;how old can the data on this report/search be?&amp;quot; is rarely asked. When the answer is &amp;quot;The report/search has to show the right data&amp;quot;, then you have to ask the customer again. The problem is, the data is maybe already stale after the query, because somebody changed some data.&lt;/p&gt;
&lt;p&gt;In my experience there are only a few reports, which need as little as possible stale data. But it is essential that you ask this question.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Isolate only as far as needed&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Most searches or reports need essential tables in your relational database, so it is important that those searches or reports don&amp;#8217;t have an effect to your daily business. You ask yourself maybe now, how those queries could have any impact?&lt;/p&gt;
&lt;p&gt;If you use Microsoft SQL Server, then the default isolation level is &amp;quot;Read committed&amp;quot;. If a query isn&amp;#8217;t that clever made, it could happen, that the query blocks a whole table (Intended Shared Lock which blocks any inserts or updates). If that happen, your users will remark that by waiting while they try to save their data.&lt;/p&gt;
&lt;p&gt;When you create a search or an report you have to ask yourself always, which Isolation level you will use. When you use dirty reads (Isolation level &amp;quot;Read uncommitted&amp;quot;), then you&amp;#8217;ll probably never generate any locks, but you have to deal with data which is wrong. This because data could be roll backed and the same query wouldn&amp;#8217;t bring the roll backed data again.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Stale data or even wrong data on a search or an informational report hasn&amp;#8217;t to be wrong or a mistake. Sometimes it&amp;#8217;s just good enough to fulfil the requirements and make the customer happy. And that&amp;#8217;s what it&amp;#8217;s all about.&lt;/p&gt;
&lt;p&gt;&lt;a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.eweibel.net%2F%3Fp%3D1198&amp;amp;title=Are%20stale%20data%20evil%3F" id="wpa2a_2"&gt;&lt;img src="http://blog.eweibel.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Related posts:&lt;ol&gt;
&lt;li&gt;&lt;a href='http://blog.eweibel.net/?p=677' rel='bookmark' title='Round-up of a data centric architecture'&gt;Round-up of a data centric architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href='http://blog.eweibel.net/?p=1033' rel='bookmark' title='Data quality as a business value'&gt;Data quality as a business value&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href='http://blog.eweibel.net/?p=367' rel='bookmark' title='Reason of silence'&gt;Reason of silence&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qRmoMjOrkKYHX9EMTZ9wlsuwHM4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qRmoMjOrkKYHX9EMTZ9wlsuwHM4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qRmoMjOrkKYHX9EMTZ9wlsuwHM4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qRmoMjOrkKYHX9EMTZ9wlsuwHM4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AssumptionOfAdvancement/~4/HW_8NVi5_XM" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.eweibel.net/?feed=rss2&amp;p=1198</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://blog.eweibel.net/?p=1198</feedburner:origLink></entry><entry><title type="text">Anti-Pattern ‘Validation by Execute ‘n’ Rollback’</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AssumptionOfAdvancement/~3/tYCmJ3-BSqU/" /><category term="Anti patterns" /><category term="Software engineering" /><author><name>Patrick</name></author><updated>2012-02-21T12:53:12-08:00</updated><id>http://blog.eweibel.net/?p=1182</id><summary type="html">Recently in some reviews I saw an anti-pattern. First you have to know, in the code, there was a validation of the data before it was stored in the database. So far so good. But when I looked at the validation code, I saw the following: public void Validate() { DoProcess(true); } And the persist [...]</summary><content type="html">&lt;p&gt;Recently in some reviews I saw an &lt;a href="http://en.wikipedia.org/wiki/Anti-pattern" target="_blank"&gt;anti-pattern&lt;/a&gt;. First you have to know, in the code, there was a validation of the data before it was stored in the database. So far so good. But when I looked at the validation code, I saw the following:&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:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:4784647f-555d-445a-b026-eff18742640e" class="wlWriterEditableSmartContent"&gt;
&lt;pre class="brush: c#;"&gt;public void Validate()
{
	DoProcess(true);
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;And the persist logic (with some business logic) looked like this:&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:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:2984d7b9-08dc-4564-b9ca-ec0282a83dea" class="wlWriterEditableSmartContent"&gt;
&lt;pre class="brush: c#;"&gt;public void Process()
{
	DoProcess(false);
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;So, I asked myself, what the Boolean means. Well, here is the method signature:&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:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:f3969625-29f1-43dc-9d12-6aa1c2b25bc3" class="wlWriterEditableSmartContent"&gt;
&lt;pre class="brush: c#;"&gt;public void DoProcess(bool bValidate)&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Hmm, the code looks quite magic so far and the argument (and the method name) itself is more or less an anti-pattern already. But when I checked the DoProcess method, I saw something more or less like this:&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:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:99c75cc4-33a5-4803-a995-3b49ff14fcb3" class="wlWriterEditableSmartContent"&gt;
&lt;pre class="brush: c#;"&gt;public void DoProcess(bool bValidate)
{
	using (SqlConnection con = new SqlConnection(connectionString))
	{
		con.Open();
		SqlTransaction transaction = con.BeginTransaction();

		// Some business logic here...

		if(bValidate)
		{
			transaction.Rollback();
		}
		else
		{
			transaction.Commit();
		}
	}
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://blog.eweibel.net/wp-content/uploads/Fotolia_20233238_S1.jpg" rel="lightbox[1182]"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Fotolia_20233238_S" border="0" alt="Fotolia_20233238_S" align="right" src="http://blog.eweibel.net/wp-content/uploads/Fotolia_20233238_S_thumb1.jpg" width="103" height="103" /&gt;&lt;/a&gt;The idea behind this code is, if it could be executed successfully, that means a successful validation. If there are any problems during the execution, those problems are the result of the validation. The execution itself wouldn&amp;#8217;t be a problem after a successful validation (now I need a drink&amp;#8230;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Doing it better&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s easy to find bad things, but it&amp;#8217;s sometimes harder to do things right. But in this case, the better way is easy. First, you have to separate your business logic from the data access logic. This means following the &lt;a href="http://en.wikipedia.org/wiki/Separation_of_concerns" target="_blank"&gt;separation of concern principle&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The next point is, that you&amp;#8217;re able to validate your model. So put the logic where it should be. If you use a &lt;a href="http://en.wikipedia.org/wiki/Domain_model" target="_blank"&gt;domain model&lt;/a&gt;, the logic to validate an entity has to be on that entity. Or if you have a &lt;a href="http://martinfowler.com/eaaCatalog/tableModule.html" target="_blank"&gt;table module approach&lt;/a&gt;, the logic to validate an entity has to be on the corresponding table module.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Side effects&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There are also other problems with this anti-pattern. There are some side effects with the data.&lt;/p&gt;
&lt;p&gt;As you know, transactions should be as short as possible to prevent lock problems with your data. But if you have combined the business logic and data access logic, your transactions are much longer than needed. To make it worse, this anti-pattern forces you to do it at least twice.&lt;/p&gt;
&lt;p&gt;There are reasonable use cases for &lt;a href="http://en.wikipedia.org/wiki/Isolation_%28database_systems%29" target="_blank"&gt;dirty reads&lt;/a&gt;: For example fast searches. In this case you accept dirty reads and you don&amp;#8217;t want any locks on your data in the database. Normally, the chance to have a dirty read isn&amp;#8217;t that high, but with this anti-pattern the chances to get a dirty read are significantly higher.&lt;/p&gt;
&lt;p&gt;&lt;a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.eweibel.net%2F%3Fp%3D1182&amp;amp;title=Anti-Pattern%20%E2%80%98Validation%20by%20Execute%20%E2%80%98n%E2%80%99%20Rollback%E2%80%99" id="wpa2a_4"&gt;&lt;img src="http://blog.eweibel.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Dc4k6u7DaUQXCi070PXKjaWWGk0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Dc4k6u7DaUQXCi070PXKjaWWGk0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Dc4k6u7DaUQXCi070PXKjaWWGk0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Dc4k6u7DaUQXCi070PXKjaWWGk0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AssumptionOfAdvancement/~4/tYCmJ3-BSqU" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.eweibel.net/?feed=rss2&amp;p=1182</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><feedburner:origLink>http://blog.eweibel.net/?p=1182</feedburner:origLink></entry><entry><title type="text">Who should make decisions about technologies?</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AssumptionOfAdvancement/~3/WDJnjDdNeZ4/" /><category term="New technology" /><category term="Software engineering" /><author><name>Patrick</name></author><updated>2012-02-13T08:00:00-08:00</updated><id>http://blog.eweibel.net/?p=1167</id><summary type="html">One of the biggest problems of software engineering companies in Switzerland is currently to get new software developers. To get new employees there are several points as for example salary, environment, career possibilities and technologies. The last point looks easy but in reality it isn&amp;#8217;t that easy. Why are essential technology decisions (like languages, frameworks, [...]</summary><content type="html">&lt;p&gt;&lt;a href="http://blog.eweibel.net/wp-content/uploads/Fotolia_36561464_S.jpg" rel="lightbox[1167]"&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="Stay on course" border="0" alt="Stay on course" align="right" src="http://blog.eweibel.net/wp-content/uploads/Fotolia_36561464_S_thumb.jpg" width="280" height="222" /&gt;&lt;/a&gt;One of the biggest problems of software engineering companies in Switzerland is currently to get new software developers. To get new employees there are several points as for example salary, environment, career possibilities and technologies. The last point looks easy but in reality it isn&amp;#8217;t that easy. Why are essential technology decisions (like languages, frameworks, application servers or big libraries) not only made by developers? Why does the management mostly make those decisions?&lt;/p&gt;
&lt;p&gt;In this blog post I try to see the technology aspect for creating software from different perspectives. Those views based on experiences and talks I had during the last ten years.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Customer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As expected the technology used for the software is for the customer irrelevant. But for him counts the working functionality and some non-functional requirements as usability or performance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Product owner or product manager&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The product owner neither is interested in the used technology directly. He&amp;#8217;s mainly interested to get the functionality in time and in budget. But he&amp;#8217;s also interested to get a good quality of the product, else he&amp;#8217;ll receive complaints from the users (of the customer).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IT department&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The IT department who has to operate the system is somehow interested in technology. They usually don&amp;#8217;t like new technology. One reason is for sure &amp;quot;never change a running system&amp;quot;. Another reason is the needed knowhow for every technology. They have to concern the cost of maintaining that knowhow. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Software Architect&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The software architect (and I am currently one) is special. When he&amp;#8217;s interested in technology, he should take responsibility in the project. If not, you have an architect who lives in the &amp;quot;ivory tower&amp;quot;. Mainly the architect should concern more about structure, integration of components or other systems, maintainability and quality.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Human resource management&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In most of the companies this part get lost. Today it is hard (specially in Switzerland) to get new developers. So, new and fancy technologies make a job or company more attractive. This means, that the human resource management is interested to use up-to-date technologies.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Developer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Well, most developers care about technology. Specially younger developers more because they had the possibility to try those at the university or in little projects with their colleagues. For those developers technology is essential for the daily job and to be motivated. If they have not the possibility to use new technology they will leave the company after one or two years. And that isn&amp;#8217;t cheap for the company.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Management&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Today most companies use some self-made frameworks. One reason they spent money to create one is the fear of creative developers who want &amp;quot;to fulfil themself&amp;quot;. This means for the management that those developers are out of control and create overcomplicated things with a lot of different technologies. I think this fear is unjustified today, but in the days when everybody could call himself a developer it was not only rightless.   &lt;br /&gt;But the management has the difficult task to concern all the roles I described before and make a reasonably decision.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It seams there is a fight between the developers and the management who should make decisions about technologies. It is important that the management has all the information it needs and can concern all the risks of an introduction of a new technology. But the management has to be open to all the facts and arguments and should not presume to make a decision based on old experiences, assumptions or prejudices.   &lt;br /&gt;If the decisions are too offensive, then you have at the end quite everything in the IT department (for example all java application server products). On the other hand, if the decisions are too defensive, then you will have a stagnation. This will be very expensive to solve because you have to spend a lot of many to get up-to-date again.&lt;/p&gt;
&lt;p&gt;&lt;a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.eweibel.net%2F%3Fp%3D1167&amp;amp;title=Who%20should%20make%20decisions%20about%20technologies%3F" id="wpa2a_6"&gt;&lt;img src="http://blog.eweibel.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qMTv2kdXmtzebd0jxHquC2a2Yg4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qMTv2kdXmtzebd0jxHquC2a2Yg4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qMTv2kdXmtzebd0jxHquC2a2Yg4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qMTv2kdXmtzebd0jxHquC2a2Yg4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AssumptionOfAdvancement/~4/WDJnjDdNeZ4" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.eweibel.net/?feed=rss2&amp;p=1167</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://blog.eweibel.net/?p=1167</feedburner:origLink></entry><entry><title type="text">TF.exe or maybe the most useful tool for TFS</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AssumptionOfAdvancement/~3/rDK2BbD7oQ8/" /><category term=".NET" /><category term="Good practices" /><author><name>Patrick</name></author><updated>2012-01-31T14:51:17-08:00</updated><id>http://blog.eweibel.net/?p=1154</id><summary type="html">When you&amp;#8217;ve to use TFS, then there are moments when you&amp;#8217;re missing some features in the UI tools in Visual Studio. In those situations the console tool tf.exe is very useful. In this short blog post I summarized the commands I used the most. Update an old version of a branch It could happen, that [...]</summary><content type="html">&lt;p&gt;&lt;a href="http://blog.eweibel.net/wp-content/uploads/visualstudio.png" rel="lightbox[1154]"&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="visualstudio" border="0" alt="visualstudio" align="right" src="http://blog.eweibel.net/wp-content/uploads/visualstudio_thumb.png" width="181" height="54" /&gt;&lt;/a&gt;When you&amp;#8217;ve to use &lt;a href="http://en.wikipedia.org/wiki/Team_Foundation_Server" target="_blank"&gt;TFS&lt;/a&gt;, then there are moments when you&amp;#8217;re missing some features in the UI tools in Visual Studio. In those situations the console tool &lt;a href="http://msdn.microsoft.com/en-us/library/z51z7zy0.aspx" target="_blank"&gt;tf.exe&lt;/a&gt; is very useful. In this short blog post I summarized the commands I used the most.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update an old version of a branch&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It could happen, that the production branch or an older feature branch isn&amp;#8217;t up-to-date, because somebody forgot one or several merges from the main branch. To fix that, there could be used the following statement:&lt;/p&gt;
&lt;p&gt;tf.exe merge /recursive /force /version:T $/Project/Main/Source $/Project/Production/Source&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Delete a branch permanently&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After a while the number of merged feature branches increase. Normally, you would delete the merged feature branches, so they aren&amp;#8217;t any longer visible in Visual Studio. But in my case, I display also the deleted items and this means, that I see all the deleted feature branches. To remove the old merged feature branches, there could be used the following statement:&lt;/p&gt;
&lt;p&gt;tf.exe destroy $/Project/Development/FeatureX&lt;/p&gt;
&lt;p&gt;&lt;a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.eweibel.net%2F%3Fp%3D1154&amp;amp;title=TF.exe%20or%20maybe%20the%20most%20useful%20tool%20for%20TFS" id="wpa2a_8"&gt;&lt;img src="http://blog.eweibel.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Related posts:&lt;ol&gt;
&lt;li&gt;&lt;a href='http://blog.eweibel.net/?p=622' rel='bookmark' title='Branching practices'&gt;Branching practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href='http://blog.eweibel.net/?p=1082' rel='bookmark' title='Branch or not to branch'&gt;Branch or not to branch&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Zyzo_VSKYu03QUsIVbaqZIva0_E/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Zyzo_VSKYu03QUsIVbaqZIva0_E/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Zyzo_VSKYu03QUsIVbaqZIva0_E/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Zyzo_VSKYu03QUsIVbaqZIva0_E/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AssumptionOfAdvancement/~4/rDK2BbD7oQ8" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.eweibel.net/?feed=rss2&amp;p=1154</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">2</slash:comments><feedburner:origLink>http://blog.eweibel.net/?p=1154</feedburner:origLink></entry><entry><title type="text">Education in companies</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AssumptionOfAdvancement/~3/1NxhOeYhGW4/" /><category term="Good practices" /><author><name>Patrick</name></author><updated>2012-01-31T09:00:00-08:00</updated><id>http://blog.eweibel.net/?p=1150</id><summary type="html">I do a lot of trainings and courses in the company where I work currently. And I was also in a lot of courses too. But I think, that those courses or trainings don&amp;#8217;t work really. The reason, why is that they are just so called &amp;#34;sheep dips&amp;#34;. Sheep dip training doesn’t work The first [...]</summary><content type="html">
&lt;p&gt;&lt;a href="http://blog.eweibel.net/wp-content/uploads/image19.png" rel="lightbox[1150]"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" align="right" src="http://blog.eweibel.net/wp-content/uploads/image_thumb19.png" width="191" height="231" /&gt;&lt;/a&gt;I do a lot of trainings and courses in the company where I work currently. And I was also in a lot of courses too. But I think, that those courses or trainings don&amp;#8217;t work really. The reason, why is that they are just so called &amp;quot;sheep dips&amp;quot;. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sheep dip training doesn’t work&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The first time when I heard the expression &amp;quot;sheep dip&amp;quot; was in the excellent book &amp;quot;&lt;a href="http://www.amazon.de/gp/product/1934356050/ref=as_li_tf_tl?ie=UTF8&amp;#038;tag=assumptiofadv-21&amp;#038;linkCode=as2&amp;#038;camp=1638&amp;#038;creative=6742&amp;#038;creativeASIN=1934356050" title="Pragmatic Thinking &amp;#038; Learning" target="_blank"&gt;Pragmatic Thinking and Learning&lt;/a&gt;&amp;quot;. It means a training where a lot of people receive a lot of information, mostly just by sitting, listening and watching a lot of PowerPoint slides.&lt;/p&gt;
&lt;p&gt;A sheep dip is in real the following (from &amp;quot;Pragmatic Thinking &amp;amp; Learning&amp;quot;):&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;A sheep dip (for real) is a large tank in which you dunk the unsuspecting &lt;br /&gt;sheep to clean them up and rid them of parasites (see picture). The sheep line up (as sheep do) you grab one and dunk in the tank for an intensive, alien, and largely toxic experience. It wears off, of course, so you have to dip them again.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The problem is the exact same with the education trainings in companies. A lot of employees spend time and the revenue is very, very little.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Doing it better&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The question is &amp;quot;How can we do education better?&amp;quot;. In my experience there are some better ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pair programming &lt;/li&gt;
&lt;li&gt;Little workshops (just the team) &lt;/li&gt;
&lt;li&gt;Collaboration platforms &lt;/li&gt;
&lt;li&gt;Good documentation &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One of the best ways to learn is to get feedback fast. In a &amp;quot;sheep dip&amp;quot; training/course there is nearly no chance to have a such feedback. Therefor pair programming is very good, but hard to do. At least one of the two developers has to be experienced, so the knowledge transfer could happen.&lt;/p&gt;
&lt;p&gt;Another way I like very much are little workshops. Normally I ask a developer team, if they are interested in some kind of workshops (reviews, designing, architecture, etc.) based on some reviews of their outcome. The feedback what I received so far is very positive.&lt;/p&gt;
&lt;p&gt;I think collaboration platforms, like wikis or OneNote, are still underestimated in corporate environments. But I had a chance to participate in a team where they used OneNote. It was really great, because they added all little tricks and tips how to handle problems with the frameworks and tools in this collaborative platform.&lt;/p&gt;
&lt;p&gt;The last way is a good documentation. But what is a good documentation? Well, for me it has to be up-do-date, clear, short, contains examples and easy to read. Another point is, that the documentation has to be searchable. It should be easy to find things fast and just in one place.&lt;/p&gt;
&lt;p&gt;&lt;a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.eweibel.net%2F%3Fp%3D1150&amp;amp;title=Education%20in%20companies" id="wpa2a_10"&gt;&lt;img src="http://blog.eweibel.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dmtVhqkQPApIvwxUdvegyJezpmQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dmtVhqkQPApIvwxUdvegyJezpmQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dmtVhqkQPApIvwxUdvegyJezpmQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dmtVhqkQPApIvwxUdvegyJezpmQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AssumptionOfAdvancement/~4/1NxhOeYhGW4" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.eweibel.net/?feed=rss2&amp;p=1150</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">3</slash:comments><feedburner:origLink>http://blog.eweibel.net/?p=1150</feedburner:origLink></entry><entry><title type="text">Services and customer orientation</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AssumptionOfAdvancement/~3/0e-mjBRc4NY/" /><category term="Private" /><author><name>Patrick</name></author><updated>2012-01-31T08:30:00-08:00</updated><id>http://blog.eweibel.net/?p=1143</id><summary type="html">Usually I don&amp;#8217;t blog here about personal topics. But as some friends know, I was some days ago in the united states &amp;#8211; to be more precise, at the west coast. I visited the cities San Francisco, Las Vegas and Los Angeles. I was a great trip and I enjoyed the cities, the landscape (Grand [...]</summary><content type="html">&lt;p&gt;&lt;a href="http://blog.eweibel.net/wp-content/uploads/GrandCanyon.jpg" rel="lightbox[1143]"&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="GrandCanyon" border="0" alt="GrandCanyon" align="right" src="http://blog.eweibel.net/wp-content/uploads/GrandCanyon_thumb.jpg" width="318" height="213" /&gt;&lt;/a&gt;Usually I don&amp;#8217;t blog here about personal topics. But as some friends know, I was some days ago in the united states &amp;#8211; to be more precise, at the west coast. I visited the cities San Francisco, Las Vegas and Los Angeles. I was a great trip and I enjoyed the cities, the landscape (&lt;a href="http://en.wikipedia.org/wiki/Grand_Canyon" target="_blank"&gt;Grand Canyon&lt;/a&gt;) and a lot more.&lt;/p&gt;
&lt;p&gt;To be honest, one of the most things which impressed me on the trip was the service and customer orientation of the staff in the hotels, restaurants or taxis. I think there is a gap between what Europe (specially Switzerland) and the USA regarding services and customer orientation. The old world &amp;#8211; or Europe &amp;#8211; could learn one or more things from the USA.&lt;/p&gt;
&lt;p&gt;In the following chapters I try to describe some experiences and conclusion about my experiences during the trip.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Be professional&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When I did the helicopter flight to the Grand Canyon, the whole service chain (chauffeur from the hotel, the pilot, the service staff) was just perfect and everything works. They know what they are doing and how the whole process works.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s a great experience for a customer when he feels, when a service provider has everything under control and his a master at what he&amp;#8217;s doing. Such an experience builds also trust and the customer will return again.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Be personal&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This point is where I think the biggest gap between Europe and the USA is. For example at Starbucks they ask you for your first name so they call you when they finished the coffee or bagels. In Switzerland for example you have to guess if the coffee which was finished is for you or not.&lt;/p&gt;
&lt;p&gt;One of the most important things to do as a service provider is to make the customer happy. For that you have to build trust and make him feel safe. To build trust, the customer has to know you, so it isn&amp;#8217;t unprofessional to speak not only about things which are work related.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It was a great experience to see another way of customer orientation. But there were also some problems, which also exists in Europe. As a service provider you need very good and competent staff. Unfortunately, in some hotels I met a concierge, which wasn&amp;#8217;t able to help or understand my need really. And that is what destroy trust, which is unfortunately a really fragile thing.&lt;/p&gt;
&lt;p&gt;&lt;a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.eweibel.net%2F%3Fp%3D1143&amp;amp;title=Services%20and%20customer%20orientation" id="wpa2a_12"&gt;&lt;img src="http://blog.eweibel.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XPoqmjHrVunvy0c8nnlyss2R_Yg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XPoqmjHrVunvy0c8nnlyss2R_Yg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XPoqmjHrVunvy0c8nnlyss2R_Yg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XPoqmjHrVunvy0c8nnlyss2R_Yg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AssumptionOfAdvancement/~4/0e-mjBRc4NY" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.eweibel.net/?feed=rss2&amp;p=1143</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://blog.eweibel.net/?p=1143</feedburner:origLink></entry><entry><title type="text">DataSet and deleted rows</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AssumptionOfAdvancement/~3/yYZhnahyfaM/" /><category term=".NET" /><author><name>Patrick</name></author><updated>2012-01-31T08:00:00-08:00</updated><id>http://blog.eweibel.net/?p=1132</id><summary type="html">Yes, I know, the DataSet isn&amp;#8217;t the leading edge technology, but as the company where I work currently, there are several companies who use DataSet as data access technology. Recently, I had to migrate the DataSet subclasses of the framework of my current employer to .NET 4.0 and add LINQ support. After this migration I [...]</summary><content type="html">&lt;p&gt;&lt;a href="http://blog.eweibel.net/wp-content/uploads/Fotolia_23504153_S.jpg" rel="lightbox[1132]"&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="Pair of cubic eggs" border="0" alt="Pair of cubic eggs" align="right" src="http://blog.eweibel.net/wp-content/uploads/Fotolia_23504153_S_thumb.jpg" width="145" height="145" /&gt;&lt;/a&gt;Yes, I know, the DataSet isn&amp;#8217;t the leading edge technology, but as the company where I work currently, there are several companies who use &lt;a href="http://msdn.microsoft.com/de-de/library/system.data.dataset.aspx" target="_blank"&gt;DataSet&lt;/a&gt; as data access technology.&lt;/p&gt;
&lt;p&gt;Recently, I had to migrate the DataSet subclasses of the framework of my current employer to .NET 4.0 and add &lt;a href="http://de.wikipedia.org/wiki/LINQ" target="_blank"&gt;LINQ&lt;/a&gt; support. After this migration I made some unit tests and I found a surprising fact: If you using LINQ with a DataSet, then you have to handle deleted rows, which isn&amp;#8217;t as you would expecting the behaviour.&lt;/p&gt;
&lt;p&gt;First, here a little setup to run the tests:&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:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:84fec710-317d-48a5-bb2e-cead7d2175cb" class="wlWriterEditableSmartContent"&gt;
&lt;pre class="brush: c#"&gt;TestDataSet ds = new TestDataSet();
TestDataSet.BECRow row = ds.BEC.NewBECRow();
row.BecId = Guid.NewGuid();
row.RunDat = DateTime.Now;
row.MachineName = Environment.MachineName;
row.CrtDat = DateTime.Now;
row.CrtUsr = "pw";
ds.BEC.AddBECRow(row);
ds.AcceptChanges();
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;The old way&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the ages before LINQ you get the preferred rows in the following way out of a typed or untyped DataSet:&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:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:16a371ce-e9d8-46d5-9676-f3a90b1cb789" class="wlWriterEditableSmartContent"&gt;
&lt;pre class="brush: c#"&gt;string strFilter = string.Format("{0} = '{1}'", ds.BEC.CrtUsrColumn.ColumnName, "pw");
TestDataSet.BECRow[] rowsBEC = (TestDataSet.BECRow[]) ds.BEC.Select(strFilter);
Console.WriteLine("Row count: {0}", rowsBEC.Length);
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;As you expecting, the result here is one row. The ugly thing is the magic filter string and the casting for the variable rowsBEC. But if you&amp;#8217;re using DataSets, you are used to such code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The new way?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;With LINQ, the code could look much nicer:&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:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:ffde856c-e18b-4990-82a8-b1a0c8bc777a" class="wlWriterEditableSmartContent"&gt;
&lt;pre class="brush: c#"&gt;var query = from r in ds.BEC
			where r.CrtUsr == "pw"
			select r;
Console.WriteLine("Row count: {0}", query.Count());
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;That&amp;#8217;s better and I thought that I had the job done. But I was wrong, seriously wrong. This code behaves differently because you will get also the deleted rows (when no where clause exists) or even worse get a &lt;a href="http://msdn.microsoft.com/de-de/library/system.data.deletedrowinaccessibleexception.aspx" target="_blank"&gt;DeletedRowInaccessible&lt;/a&gt; exception. This exception occurs, when you try to access a property on a deleted row, which will be the case here, if there are deleted rows in the &lt;a href="http://msdn.microsoft.com/de-de/library/system.data.datatable.aspx" target="_blank"&gt;DataTable&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Why? Well, if you look at the code of the Select method (for example with the tool &lt;a href="http://www.reflector.net/" target="_blank"&gt;Reflector&lt;/a&gt;) you will see, that there is an implicit filtering on the current rows (added, modified and unchanged).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The solutions&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So, how could you fix this issue? There are at least two ways. First, the nearest one:&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:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:3a9fd99a-7c0b-45d6-9ed3-f762cfb539f7" class="wlWriterEditableSmartContent"&gt;
&lt;pre class="brush: c#"&gt;var query = from r in (TestDataSet.BECRow[]) ds.BEC.Select()
			where r.CrtUsr == "pw"
			select r;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This solution works, but you have to do the ugly cast. Well, because we have a framework and we subclassed every DataSet class, we could fix that by an override in the generic base class.&lt;/p&gt;
&lt;p&gt;If you don&amp;#8217;t have a framework, where you subclassed all the DataSet classes, then there is an alternative way:&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:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:dc59d94b-1d81-47a1-9bd1-11cdfe483fe3" class="wlWriterEditableSmartContent"&gt;
&lt;pre class="brush: text"&gt;var query = from r in ds.BEC
			 where r.RowState != DataRowState.Deleted &amp;amp;&amp;amp; r.CrtUsr == "pw"
			 select r;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The order here is important, because you have to check first the RowState and after that you can add the real where clause. Also the &amp;quot;&amp;amp;&amp;amp;&amp;quot; is important, because it has to break if the row is deleted.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There are some pitfalls with DataSet and LINQ, because you wouldn&amp;#8217;t expect that behaviour with deleted rows. It doesn&amp;#8217;t make any sense at all, because I nearly never saw a reason why my business logic would like to deal with deleted rows. Also the behaviour is unnatural because you think of the DataSet as an in-memory-database, and on the database you have not to deal with deleted rows, unless you have to implement a trigger.&lt;/p&gt;
&lt;p&gt;&lt;a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.eweibel.net%2F%3Fp%3D1132&amp;amp;title=DataSet%20and%20deleted%20rows" id="wpa2a_14"&gt;&lt;img src="http://blog.eweibel.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Related posts:&lt;ol&gt;
&lt;li&gt;&lt;a href='http://blog.eweibel.net/?p=17' rel='bookmark' title='Get the size of your tables'&gt;Get the size of your tables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href='http://blog.eweibel.net/?p=9' rel='bookmark' title='Filtering on DataTables'&gt;Filtering on DataTables&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FqEktAiiiHToAZQg5QlmKeBRlSA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FqEktAiiiHToAZQg5QlmKeBRlSA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FqEktAiiiHToAZQg5QlmKeBRlSA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FqEktAiiiHToAZQg5QlmKeBRlSA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AssumptionOfAdvancement/~4/yYZhnahyfaM" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.eweibel.net/?feed=rss2&amp;p=1132</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://blog.eweibel.net/?p=1132</feedburner:origLink></entry><entry><title type="text">Speaking at the .NET Usergroup Bern</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AssumptionOfAdvancement/~3/GGTQGFAi7xc/" /><category term="Design patterns" /><category term="Good practices" /><category term="Software engineering" /><author><name>Patrick</name></author><updated>2011-12-04T11:27:22-08:00</updated><id>http://blog.eweibel.net/?p=1121</id><summary type="html">During a Lunch event organized by the .NET Usergroup Bern at the 7 December 2011 in Bern I will speak about the following question: Is Software design overrated? Yes, I know, it&amp;#8217;s provocative. And obviously wrong. Really? I&amp;#8217;m not so sure. After 10 years as software engineer and some years as software architect I saw [...]</summary><content type="html">&lt;p&gt;&lt;a href="http://blog.eweibel.net/wp-content/uploads/image18.png" rel="lightbox[1121]"&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="image" border="0" alt="image" align="right" src="http://blog.eweibel.net/wp-content/uploads/image_thumb18.png" width="262" height="70" /&gt;&lt;/a&gt;During a Lunch event organized by the &lt;a href="http://dnug-bern.ch" target="_blank"&gt;.NET Usergroup Bern&lt;/a&gt; at the 7 December 2011 in Bern I will speak about the following question:&lt;/p&gt;
&lt;p&gt;Is Software design overrated?&lt;/p&gt;
&lt;p&gt;Yes, I know, it&amp;#8217;s provocative. And obviously wrong. Really? I&amp;#8217;m not so sure. After 10 years as software engineer and some years as software architect I saw too often no design, just a transformation from requirements directly in code. And what is the problem with that?&lt;/p&gt;
&lt;p&gt;Interested? So come to my talk, &lt;a href="http://dnug-bern.ch/Event2011.aspx" target="_blank"&gt;here&lt;/a&gt; is some more information. The twitter hashtag will be #dnugbesd.&lt;/p&gt;
&lt;p&gt;&lt;a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.eweibel.net%2F%3Fp%3D1121&amp;amp;title=Speaking%20at%20the%20.NET%20Usergroup%20Bern" id="wpa2a_16"&gt;&lt;img src="http://blog.eweibel.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Related posts:&lt;ol&gt;
&lt;li&gt;&lt;a href='http://blog.eweibel.net/?p=1117' rel='bookmark' title='Speaking at the .NET Usergroup Zentralschweiz'&gt;Speaking at the .NET Usergroup Zentralschweiz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href='http://blog.eweibel.net/?p=600' rel='bookmark' title='First developer meeting in Bern'&gt;First developer meeting in Bern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href='http://blog.eweibel.net/?p=718' rel='bookmark' title='Do frameworks kill design skills?'&gt;Do frameworks kill design skills?&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/So2ZHJPHxRf7f8KcZejdgt3IDgk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/So2ZHJPHxRf7f8KcZejdgt3IDgk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/So2ZHJPHxRf7f8KcZejdgt3IDgk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/So2ZHJPHxRf7f8KcZejdgt3IDgk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AssumptionOfAdvancement/~4/GGTQGFAi7xc" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.eweibel.net/?feed=rss2&amp;p=1121</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://blog.eweibel.net/?p=1121</feedburner:origLink></entry><entry><title type="text">Speaking at the .NET Usergroup Zentralschweiz</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AssumptionOfAdvancement/~3/G7y-CjtJH3I/" /><category term="Good practices" /><category term="Software engineering" /><category term="Speaking" /><author><name>Patrick</name></author><updated>2011-11-18T08:17:35-08:00</updated><id>http://blog.eweibel.net/?p=1117</id><summary type="html">I&amp;#8217;m holding at the .NET Usergroup Zentralschweiz a short talk about &amp;#34;Know your warm-up&amp;#34;, see my last blog post. I&amp;#8217;ll explain what I developed exactly and how I train new employees with this warm-up. I will also demonstrate the sample application which a new employee develops from scratch. Come to see me speaking the 24. [...]</summary><content type="html">&lt;p&gt;&lt;a href="http://blog.eweibel.net/wp-content/uploads/dotnetzentral.png" rel="lightbox[1117]"&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="dotnetzentral" border="0" alt="dotnetzentral" align="right" src="http://blog.eweibel.net/wp-content/uploads/dotnetzentral_thumb.png" width="234" height="71" /&gt;&lt;/a&gt;I&amp;#8217;m holding at the &lt;a href="http://www.dotnet-zentral.ch/" target="_blank"&gt;.NET Usergroup Zentralschweiz&lt;/a&gt; a short talk about &amp;quot;Know your warm-up&amp;quot;, see my &lt;a href="http://blog.eweibel.net/?p=1108" target="_blank"&gt;last blog post&lt;/a&gt;. I&amp;#8217;ll explain what I developed exactly and how I train new employees with this warm-up. I will also demonstrate the sample application which a new employee develops from scratch.&lt;/p&gt;
&lt;p&gt;Come to see me &lt;a href="http://www.dotnet-zentral.ch/?p=164" target="_blank"&gt;speaking&lt;/a&gt; the 24. November, 18:00 at the following address: bbv Software Service AG, Blumenrain 10, Luzern, 1. Stock.&lt;/p&gt;
&lt;p&gt;Thanks &lt;a href="https://twitter.com/#!/danielmarbach" target="_blank"&gt;@danielmarbach&lt;/a&gt; and &lt;a href="https://twitter.com/#!/ursenzler" target="_blank"&gt;@ursenzler&lt;/a&gt; for having me.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt;&lt;br /&gt;
There is a &lt;a href="http://www.dotnet-zentral.ch/?p=189" target="_blank"&gt;wrap-up on the site of the .NET Usergroup Zentralschweiz&lt;/a&gt; with some pictures. The &lt;a href="http://blog.eweibel.net/wp-content/uploads/Know-your-warm-up.pdf" target="_blank"&gt;slides are now available&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.eweibel.net%2F%3Fp%3D1117&amp;amp;title=Speaking%20at%20the%20.NET%20Usergroup%20Zentralschweiz" id="wpa2a_18"&gt;&lt;img src="http://blog.eweibel.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Related posts:&lt;ol&gt;
&lt;li&gt;&lt;a href='http://blog.eweibel.net/?p=1121' rel='bookmark' title='Speaking at the .NET Usergroup Bern'&gt;Speaking at the .NET Usergroup Bern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href='http://blog.eweibel.net/?p=1108' rel='bookmark' title='Know your warm-up'&gt;Know your warm-up&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iuYsozfspzB4T6_13NKrwDO0cu0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iuYsozfspzB4T6_13NKrwDO0cu0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/iuYsozfspzB4T6_13NKrwDO0cu0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iuYsozfspzB4T6_13NKrwDO0cu0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AssumptionOfAdvancement/~4/G7y-CjtJH3I" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.eweibel.net/?feed=rss2&amp;p=1117</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://blog.eweibel.net/?p=1117</feedburner:origLink></entry><entry><title type="text">Know your warm-up</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AssumptionOfAdvancement/~3/SIsR8RS9cYs/" /><category term="Good practices" /><category term="Software engineering" /><author><name>Patrick</name></author><updated>2011-10-31T08:00:00-07:00</updated><id>http://blog.eweibel.net/?p=1108</id><summary type="html">I was this month in Berlin at the NHL match between the LA Kings and the Buffalo Sables. Half an hour before the game you could watch both teams doing a warm up session (see photo). They practice the techniques, moves and collaboration which they will use during the game. After the match I asked [...]</summary><content type="html">&lt;p&gt;&lt;a href="http://blog.eweibel.net/wp-content/uploads/Berlin-0121.jpg" rel="lightbox[1108]"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="NHL in Berlin (LA Kings vs. Buffalo Sabres)" border="0" alt="NHL in Berlin (LA Kings vs. Buffalo Sabres)" align="right" src="http://blog.eweibel.net/wp-content/uploads/Berlin-012_thumb1.jpg" width="361" height="272" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I was this month in Berlin at the NHL match between the LA Kings and the Buffalo Sables. Half an hour before the game you could watch both teams doing a warm up session (see photo). They practice the techniques, moves and collaboration which they will use during the game.&lt;/p&gt;
&lt;p&gt;After the match I asked myself, how do we do a warm up? How were we introduced into the development environment of our current employer? After how many hours or days had we have to be productive? Fortunately I realized this gap already and I developed a training kit for a duration of a month for new employees for my current employer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The warm-up&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I recognized that the learning curve is quite steep for new employees and so it is a risk for the company to give them immediately productive tasks. Therefore I developed a training program for a duration of a month &amp;#8211; the warm-up. During this training the new employees learn the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Infrastructure of the company &lt;/li&gt;
&lt;li&gt;Frameworks and tools &lt;/li&gt;
&lt;li&gt;Responsible persons for the framework and tools &lt;/li&gt;
&lt;li&gt;Guidelines and good practices (not best practices)&lt;/li&gt;
&lt;li&gt;Realize software with the frameworks and tools based on uniformed requirements &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before the main part of the training starts there a two days of school where I teach them in traditional manner the architecture, the framework and the workflow component.&lt;/p&gt;
&lt;p&gt;The main part is the development of a little insurance application with the same tools, frameworks and libraries which the new employee has to use also in the production environment. For this little application I developed the requirements and also a guideline for the responsible person to teach the new employee. I also implemented the application as a reference solution.&lt;/p&gt;
&lt;p&gt;The insurance application itself is designed that the first tasks are easier than the last ones. This way gives the new employee constantly success experiences and he will be motivated to go on and have fun with the whole development environment.&lt;/p&gt;
&lt;p&gt;And yes, having fun is important to be motivated. Working doesn&amp;#8217;t mean that it isn&amp;#8217;t allowed to have fun.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Teaching and documentation aren’t enough&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There are several slides for the two school days and there are two papers for the school-application as well. Even for the whole framework exist a lot of paper. But this stuff is more or less useless if the new employee hasn&amp;#8217;t anybody who is there for him or her. As in agile practices, feedback is the most important thing. Only the contact person, who is responsible for the education, can give the exact feedback which the new employee need. This because the responsible person knows where the new employee currently stays and what the context is.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We had already several new employees which did the warm-up successfully. The feedback of the new employees was also very positive because they could learn the whole development environment in a protected manner and try out things without any risk.&lt;/p&gt;
&lt;p&gt;&lt;a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.eweibel.net%2F%3Fp%3D1108&amp;amp;title=Know%20your%20warm-up" id="wpa2a_20"&gt;&lt;img src="http://blog.eweibel.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Related posts:&lt;ol&gt;
&lt;li&gt;&lt;a href='http://blog.eweibel.net/?p=1117' rel='bookmark' title='Speaking at the .NET Usergroup Zentralschweiz'&gt;Speaking at the .NET Usergroup Zentralschweiz&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1RfsTTXcuEritqjqo6rfN3-756A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1RfsTTXcuEritqjqo6rfN3-756A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1RfsTTXcuEritqjqo6rfN3-756A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1RfsTTXcuEritqjqo6rfN3-756A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AssumptionOfAdvancement/~4/SIsR8RS9cYs" height="1" width="1"/&gt;</content><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.eweibel.net/?feed=rss2&amp;p=1108</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">3</slash:comments><feedburner:origLink>http://blog.eweibel.net/?p=1108</feedburner:origLink></entry></feed>

