<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://devlicious.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>The Bolla Blog</title><link>http://devlicious.com/blogs/jim_bolla/default.aspx</link><description>I got a fever, and the only cure is more unit tests.</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>A Better Continuous Integration + Version Control System?</title><link>http://devlicious.com/blogs/jim_bolla/archive/2008/04/03/a-better-continuous-integration-version-control-system.aspx</link><pubDate>Fri, 04 Apr 2008 01:39:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:39921</guid><dc:creator>Jim Bolla</dc:creator><slash:comments>9</slash:comments><description>&lt;p&gt;Imagine this workflow...&lt;/p&gt;&lt;ol&gt;&lt;li&gt;You open your project in your IDE.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The IDE automatically updates your working copy with any new changes on the server.&lt;/li&gt;&lt;li&gt;You begin your work, using TDD or &amp;quot;test after&amp;quot;.&lt;/li&gt;&lt;li&gt;You run your tests and they pass.&lt;/li&gt;&lt;li&gt;The locally passing tests trigger the process of your changes being sent to the CI server.&lt;/li&gt;&lt;li&gt;The CI server does a full build + test run.&lt;/li&gt;&lt;li&gt;If the full build/test completes, your changes are automatically committed to the VC server. The commit message is the concatenation of the new test names.&lt;/li&gt;&lt;li&gt;Your teammate&amp;#39;s IDE polls the VC server for changes once per minute, and automatically updates his working copy when new changes are available.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;His IDE is smart enough to merge changes in a way that does not disrupt his typing. Projects are updated &amp;quot;silently&amp;quot; and merges are performed successfully even with files that are open with unsaved changes.&lt;/li&gt;&lt;li&gt;This process is repeated thoughout the day between all team members.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br /&gt;The concept here, is that passing tests trigger integration. The benefits are less excise of having to do updates and commits, as well as a better sense of &amp;quot;trust&amp;quot; in the latest version because it is always compiling and passing tests. The test-driven commit encourages effective test writing.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;This obviously puts the burden on the codebase to be testable. Some parts of the application, UI for example, are notoriously difficult to test. This &amp;quot;Continuously Integrating Version Control System&amp;quot; (CIVCS) would need ways to manually trigger commits as well. Plus for updating non-functional parts of the application, such as your spinning company logo graphic.&lt;/p&gt;&lt;p&gt;Also we need an IDE that can load changes to a project file without interrupting the user. VS 2005 is horrible at this. One way to cheat this would be for the CIVCS IDE plugin to simulate the changes being made manually though the UI.&lt;/p&gt;&lt;p&gt;There are a few places where our currently tools aren&amp;#39;t quite ready to make this a reality, but I don&amp;#39;t think we&amp;#39;re that far either. I image it would be rather easy to add a feature to Resharper&amp;#39;s test runner to trigger a process if all the tests pass. TeamCity already has a feature to do a &amp;quot;&lt;a href="http://www.jetbrains.com/teamcity/features/continuous_integration.html#Pre-tested_Commit"&gt;pre-tested commit&lt;/a&gt;.&amp;quot; Determining new tests should be as easy as comparing all the test names to the previous build&amp;#39;s list of tests. Polling for changes... trivial. Merging changes without interrupting the user... ok we need to work on this one. The &amp;quot;only tested code&amp;quot; concept could be handled with a branch that gets sync&amp;#39;d with the main branch. Most of the puzzle pieces are there. We just need someone (*cough* Jetbrains *cough*) to put them all together. Thoughts?&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicious.com/aggbug.aspx?PostID=39921" width="1" height="1"&gt;</description><category domain="http://devlicious.com/blogs/jim_bolla/archive/tags/VCS/default.aspx">VCS</category><category domain="http://devlicious.com/blogs/jim_bolla/archive/tags/CI/default.aspx">CI</category></item><item><title>Analyzing NHibernate.dll with NDepend</title><link>http://devlicious.com/blogs/jim_bolla/archive/2007/12/01/Analyzing-NHibernate.dll-with-NDepend.aspx</link><pubDate>Sat, 01 Dec 2007 22:00:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:38943</guid><dc:creator>Jim Bolla</dc:creator><slash:comments>4</slash:comments><description>
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I&amp;#39;d like give a big thanks to &lt;a href="http://codebetter.com/blogs/patricksmacchia/" target="_blank"&gt;Patrick Smacchia&lt;/a&gt; for offering me a free license for &lt;a href="http://www.ndepend.com/" target="_blank"&gt;NDepend&lt;/a&gt;, a code analysis tool. I&amp;#39;ve spent the past couple days experimenting, watching &lt;a href="http://www.ndepend.com/GettingStarted.aspx"&gt;tutorial videos&lt;/a&gt;, reading his articles, and running the tool against my work project and also &lt;a href="http://www.nhibernate.org/"&gt;NHibernate&lt;/a&gt;, for which I am an occasional contributor. My opinion of NDepend is very high. As a metrics-junkie, this tool is my Columbian drug lord. I won&amp;#39;t bother rehashing all the information already provided on the product website, but, as an example, you can do stuff like this...&lt;/p&gt;
&lt;code&gt;WARN IF Count &amp;gt; 0 IN SELECT METHODS WHERE IsUsing &amp;quot;System.Web&amp;quot; AND IsUsing &amp;quot;System.Data.SqlClient&amp;quot;&lt;/code&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; And you will get a result set of any methods in your project that are doing web stuff and SQL stuff in the same method! COOL! Now you know which n00b programmers you need to go &lt;strike&gt;slap&lt;/strike&gt; mentor. In other words, you can define NDepend &lt;a href="http://www.ndepend.com/CQL.htm" target="_blank"&gt;CQL&lt;/a&gt; queries to find methods that violate the Separation of Concerns principle. Another feature of NDepend that is very fascinating is the &lt;a href="http://www.theserverside.net/tt/articles/showarticle.tss?id=ControllingDependencies" target="_blank"&gt;dependency matrix&lt;/a&gt; and how it visualizes dependency levelization. (Go read that article, it&amp;#39;s ok, I&amp;#39;ll wait...)&amp;nbsp; I was very interested to see how well NHibernate levelizes its inner-namespace dependencies. Here&amp;#39;s the results...&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;a href="http://devlicious.com/blogs/jim_bolla/NHibernate-DependencyMatrixSnapshot.png"&gt;&lt;img src="http://devlicious.com/blogs/jim_bolla/NHibernate-DependencyMatrixSnapshot-preview.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; That big red box that nearly encompasses the entire grid indicates that all of those namespaces have a cyclical dependency. That kinda sucks. The black squares that are peppered about the grid indicate a cyclical dependency between that row and column.&amp;nbsp; Looking closer,&amp;nbsp; there are four namespaces in particular that heavily used (as indicated by a high density of blue and black squares):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; NHibernate (row 51)&lt;/li&gt;
&lt;li&gt;NHibernate.Engine (row 16)&lt;/li&gt;
&lt;li&gt;NHibernate.Type (row 37)&lt;/li&gt;
&lt;li&gt;NHibernate.Util (row 33).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If properly leveled, these namespaces should drop to the bottom of the grid. In order to achieve namespace levelization, refactoring effort would focus on the details of the black boxes on these rows. There are several difficulties in doing this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NHibernate is a public API. Making API changes to break dependencies will annoy current users when they upgrade to a new version with a changed API. This would have to be mitigated by making some changes transitional by leaving the offending members and marking them with the [Obsolete] attribute.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;NHibernate has tried to maintain a similar API to the Java version in order to be able to reuse documentation and make porting of features easier. Much of this problem is &amp;quot;sins of the father.&amp;quot;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Many of these refactorings are likely to be broad in scope. This will require extra coordination amongst the team to make sure refactoring doesn&amp;#39;t conflict with feature development. There is also the chance of introducing bugs. Making sure the relevant code is being tested effectively would be important.&lt;/li&gt;
&lt;li&gt;The open-source nature of the application means there isn&amp;#39;t necessarily a central architect to enforce these constraints.&amp;nbsp; But we could beef up the build script to run NDepend with a defined set of queries to inform the developer if he is deviating from the intended design.&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  What is the next step? I&amp;#39;m not sure. It&amp;#39;s likely that many of the cyclical dependencies may be easy to bust up with minimal effort. Is that effort even worth it if no work is being done in that part of the code? The areas of code that are modified most are probably the ones with the most coupling. I&amp;#39;m having a fantasy where some master tool could combine the data from NDepend (which files hurt the most) with the Subversion commit log (what files are changed most), the JIRA issue tracking data (what files need changed the most), and dotTrace profiling data of any defined NUnit tests (what files get used most) into some uber-report.&lt;br /&gt;&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicious.com/aggbug.aspx?PostID=38943" width="1" height="1"&gt;</description><category domain="http://devlicious.com/blogs/jim_bolla/archive/tags/Featured/default.aspx">Featured</category><category domain="http://devlicious.com/blogs/jim_bolla/archive/tags/tools/default.aspx">tools</category><category domain="http://devlicious.com/blogs/jim_bolla/archive/tags/NDepend/default.aspx">NDepend</category><category domain="http://devlicious.com/blogs/jim_bolla/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://devlicious.com/blogs/jim_bolla/archive/tags/metrics/default.aspx">metrics</category></item><item><title>C# 4.0 Feature Request: "??=" the Lazy load operator...</title><link>http://devlicious.com/blogs/jim_bolla/archive/2007/10/26/c-4-0-feature-request-quot-quot-the-lazy-load-operator.aspx</link><pubDate>Fri, 26 Oct 2007 23:06:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:38751</guid><dc:creator>Jim Bolla</dc:creator><slash:comments>7</slash:comments><description>
&lt;p&gt;A cool C# 2.0 feature is the &amp;quot;??&amp;quot; coalesce operator, which lets you do this:&lt;/p&gt;
&lt;pre&gt;public ISomeService Service&lt;br /&gt;{&lt;br /&gt;    get { return service = service ?? LazyLoadSomeService(); }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;For the noobs, this code is equivalent to this:&lt;/p&gt;
&lt;pre&gt;public ISomeService Service&lt;br /&gt;{&lt;br /&gt;    get { return service = service == null ? LazyLoadSomeService() : service; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;Which is the same as:&lt;/p&gt;
&lt;pre&gt;public ISomeService Service&lt;br /&gt;{&lt;br /&gt;    get&lt;br /&gt;    {&lt;br /&gt;        if (service == null)&lt;br /&gt;            return service = LazyLoadSomeService();&lt;br /&gt;        else&lt;br /&gt;            return service;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;Now it would be great if we could trim this up just a little bit more...&lt;/p&gt;
&lt;pre&gt;public ISomeService Service&lt;br /&gt;{&lt;br /&gt;    get { return service ??= LazyLoadSomeService(); }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;This is similar to +=, *=, and family. This seems like the logical progression to me. I guess this would be called &amp;quot;coalescing assignment operator&amp;quot; or something like that. And we could take this one step even further... C# 3.0 has Automatic properties that alleviates the need for an explicitly declared backing field. What happens when my suggested &amp;quot;coalescing assignment operator&amp;quot; and automatic properties do the nasty...&lt;/p&gt;
&lt;pre&gt;public ISomeService Service&lt;br /&gt;{&lt;br /&gt;    get?? { LazyLoadSomeService(); }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;The syntax is debatable but I think the concept is nice and useful.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicious.com/aggbug.aspx?PostID=38751" width="1" height="1"&gt;</description></item><item><title>Finding A New Job, Week 2 - Observations From The Interview</title><link>http://devlicious.com/blogs/jim_bolla/archive/2007/09/15/finding-a-new-job-week-2-observations-from-the-interview.aspx</link><pubDate>Sun, 16 Sep 2007 02:20:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:38413</guid><dc:creator>Jim Bolla</dc:creator><slash:comments>8</slash:comments><description>&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; What a week! It started with the &lt;a href="http://devlicious.com/blogs/jim_bolla/archive/2007/09/11/finding-a-new-job-week-2-how-to-waste-five-hours-of-my-time.aspx"&gt;lousy first in-person interview&lt;/a&gt; on Tuesday, and then several phone interviews, and concluded with another in-person (Friday) morning. From these interviews, and also from interviewing candidates for my current employer, I&amp;#39;ve made a few observations worth sharing:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Figure out what your deal-breakers are.&lt;/b&gt; Address those a soon
as possible with each employer, preferably during the phone interview
or before it. Always do a phone-interview first. This will save you
from having to take time off work, putting on your suit and tie, and
traveling. Before you start scheduling interviews, spend some time
reflecting on what&amp;#39;s most important to you. &lt;a href="http://devlicious.com/blogs/jim_bolla/archive/2007/09/10/finding-a-new-job-week-2-preparing-for-the-interview-what-to-ask-employers.aspx"&gt;Make a list&lt;/a&gt;
of everything that might affect your decision whether or not to work there. Be thorough with your list but then really focus on the ones that
matter most. No place is going to be perfect but you gotta get the big
stuff right.&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;&lt;b&gt;It&amp;#39;s possible to be overqualified for a job.&lt;/b&gt; By the end of the first interview I had, it was obvious I was years beyond those clowns. They had neither the technology nor the process in place to keep a developer like me happy. The wrong tools, no unit testing, no automated build, no continuous improvement. &amp;quot;Once we hire 15 more people we&amp;#39;ll have some time to implement those things.&amp;quot; &lt;a href="http://www.amazon.com/Mythical-Man-Month-Software-Engineering-Anniversary/dp/0201835959/"&gt;The Mythical Man-Month&lt;/a&gt; much? Make sure during the phone interview that you weed these places out.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Watch out for arrogance.&lt;/b&gt; This can happen on either side of the table (or phone line). I interviewed with company that sounded like they had a very mature process and was doing cutting-edge stuff... SOA/WCF. The attending staff seemed pretty smart and &amp;quot;with it.&amp;quot; The phone-interview went well but afterwards I started analyzing the conversation and realized a few things that bothered me. One thing in particular, when asked what I felt was one greatest strengths, I went with something like &amp;quot;I think I work very well in a leader/mentor role and enjoy teaching other team members about various technologies and practices.&amp;quot; The lead interviewer&amp;#39;s response was &amp;quot;Well our team is mostly senior developers and we don&amp;#39;t &lt;i&gt;need&lt;/i&gt; mentoring.&amp;quot; Perhaps we misunderstood each other, but that came across to me as very arrogant. I also like to think I&amp;#39;m a pretty good developer, but I know there is always more to learn and ways to improve. I proudly subscribe to Jeff&amp;#39;s &amp;quot;&lt;a href="http://www.codinghorror.com/blog/archives/000530.html"&gt;Sucking Less Every Year&lt;/a&gt;&amp;quot; mentality. I want to work with people that feel the same way.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Sell your strengths.&lt;/b&gt; (But don&amp;#39;t be cocky.) From the resume to the interview, the point is to make yourself desirable. Tailor your sales-pitch to each employer. (Check out their website ahead of time to get an idea for what they do.) If the employer does a lot of data-centric applications, talk about your database experience... normalization, optimization, O/R mapping, whatever. If you find out during the interview that the employer has not yet embraced automated testing, tell them about how and why you write automated tests. That one in particular has been a hot topic in every interview I have done. I always discuss the mechanics (nunit... cruise control...), the realized benefits (verify requirements, performance, bug fixes), the impact on design (dependency inversion... single responsibility principle...), and even the pains (refactoring for testability... mock objects...). After the interview, the employer is going to review all of the applicants to decide who they want. I want to stack the deck in my favor by focusing in on a few key items that I think will make me stand out from the crowd. &lt;span style="font-style:italic;"&gt;&lt;span style="text-decoration:underline;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;It&amp;#39;s OK to talk about mistakes and weaknesses.&lt;/b&gt; (But don&amp;#39;t overdo it.) We&amp;#39;ve all made mistakes before and employers know that. What&amp;#39;s important is to show that you understood why/how you screwed up and that you learned something from it. Some interviewers will throw in questions design with this purpose. &amp;quot;How do you handle times when you go over budget/estimate?&amp;quot; is a good example. This is a good opportunity to show some personality. Turn it into a war story: &amp;quot;Oh man this one time I had this project...&amp;quot; When asked about a technology/practice that you&amp;#39;re unfamiliar with, go with something like &amp;quot;I&amp;#39;ve never heard of Technology Z. What is that? ... How do you use that here at Company X? ... That sounds pretty cool. Can you recommend a good book or website I could check out to learn more about that?&amp;quot; Just like that you spun the fact that your clueless about that tech into a chance to show you&amp;#39;re interested in what the company is doing and that you are enthusiastic to learn new things.&lt;br /&gt; &lt;/li&gt;&lt;li&gt;&lt;b&gt;People skills are as important as technical skills.&lt;/b&gt; Chief amongst these are good communication skills. Be a good listener and a good speaker. When an employer asks a question, be sure to answer it. Try not to off on too many unrelated tangents. Personality is also important. No one wants to work with an a-hole or a robot. Show some humility and a sense of humor. Hygiene is important too. Would you want to pair program for eight hours with a mouth-breather who hasn&amp;#39;t quite mastered deodorant and toilet paper? Neither did I. Show that you are a good team player.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Be professional.&lt;/span&gt; Unless explicitly told otherwise, wear a nice suit. Show up about 15 minutes early. Watch the profanity. Depending on your rapport with the interviewer, you may be able to toss in a damn or hell, but definitely avoid f-bombs and genitalia references. I once interviewed a guy that threw in a &amp;quot;Cleveland Steamer&amp;quot; reference during a follow-up interview. Lucky for him I found it freakin&amp;#39; hilarious in context, but I would not recommend you try that one yourself. Present yourself as someone who could be trusted to meet with clients or upper management.&lt;/li&gt;&lt;/ul&gt;That&amp;#39;s what I&amp;#39;ve got so far. Stay tuned for more.&lt;br /&gt;&lt;br /&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicious.com/aggbug.aspx?PostID=38413" width="1" height="1"&gt;</description><category domain="http://devlicious.com/blogs/jim_bolla/archive/tags/job/default.aspx">job</category></item><item><title>Conflict</title><link>http://devlicious.com/blogs/jim_bolla/archive/2007/09/12/conflict.aspx</link><pubDate>Thu, 13 Sep 2007 03:04:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:38393</guid><dc:creator>Jim Bolla</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Earlier this week, a coworker was doing a &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; merge conflict resolution because he and another dev modified the same file. That got me thinking how freakin&amp;#39; sweet it
would be if Subversion knew about potential conflicts in my working
copy sooner than commit time. My idea was to have a running process on each dev machine that talked home to the server on an interval (maybe 1 minute) to tell it which files I&amp;#39;ve modified and find out what files other developers have modified but not committed. Well apparently &lt;a href="http://notdennisbyrne.blogspot.com/"&gt;Dennis Byrne&lt;/a&gt; had the same idea &lt;a href="http://notdennisbyrne.blogspot.com/2007/07/introducing-conflict.html"&gt;a few months ago&lt;/a&gt; and &lt;a href="http://conflict.sourceforge.net/"&gt;created Conflict&lt;/a&gt;:&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;Conflict notifies a software developer of potential conflicts between his/her work and that of other developers, before the commit.&lt;br /&gt;&lt;br /&gt;Conflict is an open source project composed of two parts: Conflict clients and a Conflict server. A Conflict client is a transparent process running on the workstation of each developer. It stays in the background, reporting local file system changes to the Conflict server. When the Conflict server detects a conflict between two or more developers, each developer is notified. The Conflict project improves feedback and communication while encouraging developers to check in code frequently.&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I&amp;#39;m finding this at 11:15 and I&amp;#39;m supposed to be going to bed but instead I will be tossing and turning thinking about playing with this shiny new toy tomorrow. Found via &lt;a href="http://blogs.thoughtworks.com/"&gt;blogs.thoughtworks.com&lt;/a&gt;, which I found via &lt;a href="http://codebetter.com/blogs/jeremy.miller/"&gt;Jeremy Miller&lt;/a&gt;&amp;#39;s blogroll while reading about &lt;a href="http://structuremap.sourceforge.net/"&gt;StructureMap&lt;/a&gt;. Now I have &lt;b&gt;two&lt;/b&gt; new tools to learn how to use this week.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicious.com/aggbug.aspx?PostID=38393" width="1" height="1"&gt;</description><category domain="http://devlicious.com/blogs/jim_bolla/archive/tags/tools/default.aspx">tools</category></item><item><title>Finding A New Job, Week 2 - How to Waste Five Hours of My Time</title><link>http://devlicious.com/blogs/jim_bolla/archive/2007/09/11/finding-a-new-job-week-2-how-to-waste-five-hours-of-my-time.aspx</link><pubDate>Tue, 11 Sep 2007 22:59:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:38371</guid><dc:creator>Jim Bolla</dc:creator><slash:comments>15</slash:comments><description>&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Today I had my first on-site interview, set up via an IT staffing agency. The position was described to me as a contract position in Cleveland Ohio with a company looking for .NET developers with strong database skills. I checked out the company&amp;#39;s website which looked nice enough and agreed to the interview. This morning, I made the almost-two-hour drive to meet with my interviewers &amp;quot;Van ***&amp;quot; and &amp;quot;Slick&amp;quot; (as I will call them), which was to be my first (and last) direct contact with this employer. Van *** was the head project manager and in charge of the current development team of approximately roughly twenty. Slick was one of the lead developers who would conduct much of the technical screening portion of the interview. After ten minutes of small talk... what the company does... why I am jobseeking... bleh bleh bleh... we started the technical screening.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Not surprisingly, the 45 minute technical screening consisted of roughly half database questions and half .NET questions. The database questions were pretty easy stuff... What&amp;#39;s the difference between an inner join versus left join. Write a query (on paper) that joins two tables. What&amp;#39;s the difference between primary keys, foreign keys, and indexes. Clustered vs non-clustered indexes? Advantages of stored procedures? Explain Cartesian product. Those are the few I remember. I thought most of the database questions were fairly good questions to ask. Slick&amp;#39;s last question to me during the database part was &amp;quot;When can you start?&amp;quot; I was also feeling good about the way things were going at this point.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The .NET questions were of the same caliber... What is the advantage of the ViewState? What&amp;#39;s the difference between app.config, web.config, and machine.config? (Doesn&amp;#39;t this question kinda answer itself?) Have you used web services, windows services? C&amp;#39;mon guys, try harder than that.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  We also went over several of the technologies on my resume that they were not familiar with... Subversion (never heard of it? bad sign #1), NHibernate in particular. I explained how Subversion&amp;#39;s update/merge/commit paradigm differed from SourceSafe&amp;#39;s check-in/check-out paradigm. I explain the basic concept of O/R mapping. We also talked about unit tests and automated builds and their current lack of said items. Ok that&amp;#39;s bad but here&amp;#39;s a great opportunity for me to come in and put boots to ass. Those are things they are looking into but haven&amp;#39;t had time due to having too much work to do. They are currently looking to expand from 20 to 35 to handle the current workload. Once they have the people on board to support the workload, they will begin to add some more process improvement procedures such as automatic builds and unit tests.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The next big red flag was when Van *** explained that the company didn&amp;#39;t allow the use of open source tools because they want to have a company to hold accountable (read: sue) when things go wrong. Wow. Let&amp;#39;s see... Subversion, TortoiseSVN, VisualSVN (not OSS but dependent on it), KDiff3, NHibernate, NUnit, NAnt, RhinoMocks, CruiseControl.NET... all gone from my toolbox? And those are just the ones I know I use every day! There&amp;#39;s another question to add to &lt;a href="http://devlicious.com/blogs/jim_bolla/archive/2007/09/10/finding-a-new-job-week-2-preparing-for-the-interview-what-to-ask-employers.aspx" title="my list"&gt;my list&lt;/a&gt;. I guess if you gave me Team Foundation Server and upped my salary another 30K I might take the job. Then the deal breaker...&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Van *** says &amp;quot;...blah blah blah the main VB6 application...&amp;quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I ask &amp;quot;So is the project a migration of the VB6 application to .NET?&amp;quot; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Van *** replies &amp;quot;No we do not have time to do that with our current workload. You would be doing maintenance development on the application.&amp;quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I respond with&amp;nbsp; &amp;quot;I was under the impression that this was a .NET job. I guess the VB6 thing would be kind of a deal breaker for me, because I feel that is actually a step backwards for my career. But if you&amp;#39;re in need of fifteen more developers, it sounds like you could specialize with some .NET developers and some VB devel...&amp;quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;No that is a deal breaker for us too. We need someone who is willing to do whatever it takes to get the job done. Thanks for your time.&amp;quot; says Van *** as he stands up, opens his office door, and points with an outstretched hand.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I start &amp;quot;Are you sure? I think...&amp;quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Van *** injects &amp;quot;Thank you for your time.&amp;quot;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  As I stand up and am escorted out the front door, I bewilderedly say &amp;quot;Ok. Uh well thank you for your time. I&amp;#39;m sorry things didn&amp;#39;t work out. Good luck.&amp;quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  I got in my car and began my 100 mile trek in the opposite direction, thinking &amp;quot;What the f*** just happened?&amp;quot; After taking a half day off from work, putting 200 miles on my car, and going through their interview process, I expected a little more professional courtesy at the end of the interview, even if I&amp;#39;m not the right man for the job. He could have entertained me for a few minutes with some shop talk before wrapping up in a friendly manner. (That&amp;#39;s what I&amp;#39;ve always done when interviewing candidates that I wasn&amp;#39;t gonna hire.) Instead he burned the bridge beyond repair. Not only will I never work there, but I will tell any of my peers who might happen to be looking in the Cleveland area to avoid this place.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; The irony of the situation is that what they actually need is a full time developer who&amp;#39;s job is process improvement and mentoring of their current staff. They need to commit a number of hours per week to augmenting their process with some automated builds, unit tests, some proper object orientation of the code base, and so on. In given time, maybe six months to a year, those twenty would be doing the work of thirty five or more. They are too busy working hard to start working smart. These are all things a person like myself could bring to the company, but if they treat other interviewees with the same disrespect with which I was treated today, then they will have a hard time finding such a person.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;Update: PS: The profanity filter is blocking my nickname for him, which was a reference to his facial hair. Which is also a derogatory term for a lady who has relations with other ladies. Hah! &lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicious.com/aggbug.aspx?PostID=38371" width="1" height="1"&gt;</description><category domain="http://devlicious.com/blogs/jim_bolla/archive/tags/job/default.aspx">job</category><category domain="http://devlicious.com/blogs/jim_bolla/archive/tags/WTF/default.aspx">WTF</category></item><item><title>Finding A New Job, Week 2 - Preparing for the Interview... What to ask employers</title><link>http://devlicious.com/blogs/jim_bolla/archive/2007/09/10/finding-a-new-job-week-2-preparing-for-the-interview-what-to-ask-employers.aspx</link><pubDate>Tue, 11 Sep 2007 00:54:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:38353</guid><dc:creator>Jim Bolla</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;&lt;img src="http://devlicious.com/blogs/jim_bolla/TheIncredibleDevelopmentMachine.png" title="It works on my machine!" alt="It works on my machine!" height="312" hspace="20" width="500" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I&amp;#39;ve begun compiling a list of questions and discussion points for potential employers. Many of these are lifted verbatim from &lt;a href="http://www.joelonsoftware.com/articles/fog0000000043.html"&gt;Joel Spolsky&lt;/a&gt;, &lt;a href="http://devlicious.com/blogs/derik_whittaker/archive/2007/05/09/questions-every-candidate-should-ask-a-potential-new-employer.aspx"&gt;Derik Whittaker&lt;/a&gt;, and &lt;a href="http://codebetter.com/blogs/eric.wise/articles/64975.aspx"&gt;Eric Wise&lt;/a&gt;. *YOINK* If anyone has more, please leave a comment and I will continue the harvest. I will also continue to update this post as I think of more of my own. Onto the list...&lt;/p&gt;&lt;b&gt;Openers&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What does your organization do? How do you utilize IT to accomplish that more effectively?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;What is your role at the organization?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;How many full-time employees and contractors do you employ? In IT?&lt;/li&gt;&lt;li&gt;What are the company&amp;#39;s future plans for utilizing IT?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;The Position&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What are the job duties of the position for which you are considering?&lt;/li&gt;&lt;li&gt;Tell me about the average workday of a developer of my level.&lt;/li&gt;&lt;li&gt;What is the nature of the project(s)?&lt;/li&gt;&lt;li&gt;How often do you extend contracts or offer full-time placement to contractors?&lt;/li&gt;&lt;li&gt;How many bosses will the employee have? Direct reports? Teammates?&lt;/li&gt;&lt;li&gt;Does this position have the authority to enhance/improve the development process or team behavior?&lt;/li&gt;&lt;li&gt;What opportunity for advancement is available at your company?&lt;/li&gt;&lt;li&gt;What is the typical process a candidate goes through before he is hired and sitting at his desk working? How long does that usually take?&lt;/li&gt;&lt;li&gt;Does your company have policies regarding employee blogging or contributing to open source projects?&lt;/li&gt;&lt;li&gt;What is the appropriate dress code?&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Project Management&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Does your development staff follow an agile/iterative methodology? (XP, Scrum)&lt;/li&gt;&lt;li&gt;How do you define project requirements?&lt;/li&gt;&lt;li&gt;How do you determine whether a project was successful?&lt;/li&gt;&lt;li&gt;How do you test your software? (Unit, integration, QA, usability, acceptance)&lt;/li&gt;&lt;li&gt;How do you deploy your software?&lt;/li&gt;&lt;li&gt;How do you manage bugs and change requests?&lt;/li&gt;&lt;li&gt;What form of stake holder involvement is there in the development cycle?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Development Environment&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What types of tools do you provide your developers? Hardware/software/furniture? Resharper?&lt;/li&gt;&lt;li&gt;Do you have a VPN?&amp;nbsp; What is your work from home policy?&lt;/li&gt;&lt;li&gt;Are employees allowed to provide their own hardware/software?&lt;/li&gt;&lt;li&gt;To what extent does the development team use version control? Branching?&lt;/li&gt;&lt;li&gt;Does the development team utilize an automated/continuous build process?&lt;/li&gt;&lt;li&gt;Does your version control repository contain everything needed to build the project? [Added 9/12]&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Do programmers have quiet working conditions?&lt;/li&gt;&lt;li&gt;What proportion of development is done in a team environment? Pair-programming? Code-review?&lt;/li&gt;&lt;li&gt;Do you have a knowledge center for the team such as a team portal, wiki, etc?&lt;/li&gt;&lt;li&gt;Do you have documented coding standards? Are they followed?&lt;/li&gt;&lt;li&gt;Does the development team have established mentoring/training practices?&lt;/li&gt;&lt;li&gt;Can I see the (physical) development environment and/or meet some of the team? (Some employers may not allow this, but it&amp;#39;s worth a shot. This would go a long way in my book. Their answer might also depend on their opinion of you.)&lt;/li&gt;&lt;li&gt;Does you company have a policy on the use of open source tools? [Added 9/11]&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;Compensation&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;How many hours per week do your developers realistically work?&lt;/li&gt;&lt;li&gt;Do you compensate for overtime?&lt;/li&gt;&lt;li&gt;What type of benefits are offered to full-time employees? Do you have any education benefits?&lt;/li&gt;&lt;li&gt;Do you have a documented process for rewarding extraordinary work?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;Closers&lt;/b&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;What&amp;#39;s the best thing about working here? The worst?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Obviously one shouldn&amp;#39;t just enumerate the list and recite verbatim, but this is meant as a guide to refer back to at natural conversation endpoints. Some of these may not be relevant to the position for which you are interviewing. Also, many companies will answer some of these questions on their website. Do your homework and look at their website ahead of time. At my current job, I&amp;#39;ve interviewed many people who didn&amp;#39;t even go to our website before the interview.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight:bold;"&gt;Something for the &lt;/span&gt;&lt;span style="text-decoration:line-through;font-weight:bold;"&gt;ladies&lt;/span&gt;&lt;span style="font-weight:bold;"&gt; employers:&lt;/span&gt; If you answer many of these questions on your website, motivated developers such as myself would be much much much more likely to want to work for you.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicious.com/aggbug.aspx?PostID=38353" width="1" height="1"&gt;</description><category domain="http://devlicious.com/blogs/jim_bolla/archive/tags/job/default.aspx">job</category><category domain="http://devlicious.com/blogs/jim_bolla/archive/tags/Featured/default.aspx">Featured</category></item><item><title>Finding A New Job, Week 1 -- Recruiters and the demand for .NET</title><link>http://devlicious.com/blogs/jim_bolla/archive/2007/09/08/finding-a-new-job-part-1.aspx</link><pubDate>Sat, 08 Sep 2007 18:15:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:38340</guid><dc:creator>Jim Bolla</dc:creator><slash:comments>8</slash:comments><description>&lt;p&gt;After eight years at the same (and my only ever) employer, I have decided it is time to move on to bigger and hopefully better things; not only professionally, but also personally. Yesterday my boss and I discussed my intentions to move out of the Erie area by the end of September. I have begun to cast my net (pun!) into the nearby Cleveland and Pittsburgh job markets, via dice.com and monster.com. So far during my first real experience as a job seeker, I have made some observations that maybe useful to others...&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;The Demand for .NET&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Demand is high for .NET workers. There are pages of current openings posted on dice.com in these two cities. Since posting my resume a week ago, the number of calls and emails has been overwhelming, almost to the point that getting a second phone line would be worthwhile. (I have one cell and no home phone.) Sorting between new callers and known contacts is quickly becoming a chore. I have had to put my phone on silent/vibrate and screen the calls via caller ID. Email inbox filtering rules are also now a necessity. My advice to other job seekers is to &lt;b&gt;set up separate email accounts and phone numbers to use as your posted contact information&lt;/b&gt;, and then once you get serious with a potential employer, give them your real contact details. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Demand is especially high for those with greater than five years experience with it. We are five and a half years since the platform officially launched in early 2002. This means early adopters are the target demographic. No joke, I&amp;#39;ve seen at least one posting that explicitly stated 5-7 years of .NET experience required. Seven years? I guess if you worked at Microsoft on the CLR/BCL teams you could claim this. I wonder what proportion of these companies are truly that progressive in their adoption of new technology versus ignorantly inflating the requirement beyond the point of reality. I am anxious to find out if these companies, so anxious to scoop up early adopters, continually support the adoption of new technology. Mr. Employer, will you continue to buy us the latest versions of Visual Studio and Resharper and invest the time and money in upgrading projects to new platform versions? I expect this to be and give and take relationship. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;IT Staffing Agencies&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Many posted jobs are handled through a third party IT staffing agency, affectionately referred to as head-hunters. These jobs are usually contact or contract-to-hire. This means you make an hourly rate instead of a salary. Many of the agencies offer benefits such as insurance to their contractors. At the end of the contract, the client will either extend the contract, offer a full time position to the developer, or tell you to not let the door hit you on the ass on your way out.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; My experience with the recruiters themselves so far has been mixed...&lt;/p&gt;&lt;ul&gt;&lt;li&gt;On the low end, there is what amounts to spam. I have gotten several emails that were not even addressed to me, but someone else, and I was a BCC on the email. My resume and email address were harvested, keywords were found, and fed through someone&amp;#39;s mass mailing. No human being actually read my resume.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; The second worst are those that have perhaps a slightly better spamming engine that at least appears to personalize the email. On both Dice and Monster, I explicit stated that I am only willing to relocate to Cleveland and Pittsburgh, yet I am still getting solicitations for Nebraska, Texas, Connecticut, and Georgia. Either they&amp;#39;re spamming me or they are incapable of reading or doing basic geography. Also important is getting my first name right.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Next up are those that send a personalized messages that are too informal. Lack of capitalization, abbreviations such as &amp;quot;plz&amp;quot; and &amp;quot;ur&amp;quot;, and so forth. This is unprofessional and makes a bad first impression.&lt;/li&gt;&lt;li&gt;I have received several phone solicitations from individuals with a foreign accent so thick that I could not understand their name, the name of their company, or other key details.&lt;/li&gt;&lt;li&gt;One recruiter hung up on me when I told him I was already in contact with the client he was representing. This was after spending fifteen minutes of asking me questions about my background. I will never accept solicitation from his company again.&lt;/li&gt;&lt;li&gt;In the &amp;quot;not bad&amp;quot; category are plenty of recruiters that are doing a decent job with whom I have had email/phone discussion. While not bad, they also are nothing special.&lt;/li&gt;&lt;li&gt;Finally I get to the good news. There are some recruiters that really kick ass at their job. They have great people skills, get back to you in a timely fashion, are show a real motivation to set up interviews quickly. They go above and beyond. I am moving forward with several of them to the interview phase of the job hunt. I actually feel bad that at some point I will have to tell all but one of them that I can&amp;#39;t take the position they are setting up for me.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;One lady in particular has been extraordinary. She has given me guidance on how to edit/format my resume to make it more appealing, helped with determining appropriate salary requirements and so forth. If the quality of service she has provided so far continues throughout the process, then I will write a future blog post giving her and her company a glowing recommendation.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;On a Personal Note&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; While I&amp;#39;m exciting to be moving on to this next chapter of my professional career, I&amp;#39;m also a bit anxious. For my own experiences with some clients, tales from coworkers, and from years of reading &lt;strike&gt;The Daily WTF&lt;/strike&gt; Worse Than Failure, I&amp;#39;m worried about ending up some place that has a development process that would give Rube Goldberg nightmares. I&amp;#39;m trying to come up with questions to ask potential employers to weed these places out. Unless of course they are looking for somebody to come in and whip them into shape... deploy Subversion/CC.NET and teach the team dependency injection, design patterns, automated testing and all of those awesome things that give my brain a chubby. I&amp;#39;m also worried about changing from big-fish-in-a-small-pond into little-fish-in-a-big-pond. Right now I&amp;#39;ve got my own office with a couch, a 3GHz machine with 4GB of RAM and a 30&amp;quot; monitor, and I can (diplomatically) tell clients and coworkers that they are being idiots because they love me. Next month I&amp;#39;m gonna be &amp;quot;the new guy&amp;quot; and will be giving up many of the comforts I currently have. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The next step for me is the in-person interviews. I&amp;#39;m not used to being on this side of the interview. Right now I&amp;#39;m trying to mentally prepare myself... what are the key topics to discuss? I should make a list. During the next couple of weeks I will write about my experiences. Stay tuned...&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicious.com/aggbug.aspx?PostID=38340" width="1" height="1"&gt;</description><category domain="http://devlicious.com/blogs/jim_bolla/archive/tags/job/default.aspx">job</category></item><item><title>An ASP.NET site to add DVDs to your Netflix queue via your camera phone</title><link>http://devlicious.com/blogs/jim_bolla/archive/2006/10/05/An-ASP.NET-site-to-add-DVDs-to-your-Netflix-queue-via-your-camera-phone.aspx</link><pubDate>Thu, 05 Oct 2006 22:24:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:229</guid><dc:creator>Jim Bolla</dc:creator><slash:comments>3</slash:comments><description>Have you heard of &lt;a href="http://localhost/"&gt;this site&lt;/a&gt;? You use your camera phone to   get product information, comptetive pricing, Netflix integration, etc by simply taking a picture of the UPC barcode on any product!&lt;br /&gt;&lt;br /&gt;   You send the image to the site&amp;#39;s servers via SMS or email (depending on your phone&amp;#39;s capabilities) and it does image processing to translate the barcode into a number, which is then looked up in some combination of databases such as &lt;a href="http://www.barcodepedia.com/"&gt;barcodepedia&lt;/a&gt;. Once the product is identified, it&amp;#39;s name can be used against a variety of web sites, such as Netflix, Amazon, Google, Froogle, Wikipedia, just to name a few. Online pricing details, product reviews, and summaries are sent back to your phone. All your searches are saved with your registered profile so you can review them later to allow you to further act on it, such as Rent from Netflix or Purchase at Amazon.&lt;br /&gt;&lt;br /&gt;   Based on your activity, the site learns your preferences and begins to make reccomendations similar to Amazon, contextual advertising via Google Adwords, and more. Usage data is also aggregated for use my retailers and marketing to track &amp;quot;What&amp;#39;s Hot.&amp;quot; The service is being postured for partnership with the likes of Verizon or Motorola for seemless integration with the handsets and services. So why haven&amp;#39;t you heard of it (and why is the link broken)? Because it only exists in my head. :-( Anyone want to give me a big pile of cash to build this beast?&lt;br /&gt;&lt;br /&gt;    PS: This is just one of many crazy ideas I&amp;#39;ve got floating around upstairs. Expect to see them occasionally sprinkled amongst my more technical posts. &lt;br /&gt;&lt;br /&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicious.com/aggbug.aspx?PostID=229" width="1" height="1"&gt;</description><category domain="http://devlicious.com/blogs/jim_bolla/archive/tags/ideas/default.aspx">ideas</category></item><item><title>Model View Presenter mutated: Observable View</title><link>http://devlicious.com/blogs/jim_bolla/archive/2006/10/03/ObservableViewPattern.aspx</link><pubDate>Tue, 03 Oct 2006 22:25:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:194</guid><dc:creator>Jim Bolla</dc:creator><slash:comments>10</slash:comments><description>&lt;h3&gt;Transgression&lt;/h3&gt;&lt;p&gt; One of my crusades of the past year has been to break myself and my team of the habit of embedding domain logic into the code-behinds of our ASP.NET pages. For me, this is a habit that has carried over from the ASP 3.0 days of old. More recently, we have a nice domain layer that is persisted to the database using &lt;a href="http://www.nhibernate.org/"&gt;NHibernate&lt;/a&gt;. Classes are created that encapsulate specific functionality, whether through design or refactoring. We have even adopted &lt;em&gt;Dependency Inversion&lt;/em&gt; through use of interfaces, which has allowed for unit testing of these classes. But many of our pages still contain too much logic about the process of how to perform a given task. This means a significant portion of code was not being tested. &lt;/p&gt;&lt;h3&gt;Repentance&lt;/h3&gt;&lt;p&gt; The first source to shed some light about how to extract this remaining logic from the pages was Martin Fowler&amp;#39;s &lt;a href="http://www.martinfowler.com/books.html#eaa"&gt;Patterns of Enterprise Application Architecture&lt;/a&gt; in which he covers the Model View Controller pattern. Much googling lead to my discovery of Model View Presenter. The most enlightening source on this was Jean Paul Boodhoo&amp;#39;s &lt;a href="http://www.dnrtv.com/default.aspx?showID=14"&gt;Model View Presenter video&lt;/a&gt; on dnrTV. We began experimenting with MVP in our designs shortly afterwards. &lt;/p&gt;&lt;h3&gt;Transcendence&lt;/h3&gt;&lt;p&gt; Finally, extraction and unit-testability of the logic that once existed in our code-behind. But there was still something I didn&amp;#39;t like about our implementation of MVP. The code-behind was still responsible for calling the correct method on the presenter whenever a control&amp;#39;s event was raised. I felt like we were 90% there. Through experimentation, I eventually came up with what I call the &amp;quot;Observable View&amp;quot; pattern: &lt;/p&gt;&lt;strong&gt;The interface:&lt;/strong&gt;     &lt;pre&gt;interface IManageCustomerView&lt;br /&gt;  {&lt;br /&gt;        string Name { get; set; }&lt;br /&gt;        // etc...&lt;br /&gt;  &lt;br /&gt;        void DisplayValidationErrorMessage(string errorMessage);&lt;br /&gt;        void DisplaySavedSuccessullyMessage();&lt;br /&gt;        // etc...&lt;br /&gt;  &lt;br /&gt;        // The interesting part...&lt;br /&gt;        event EventHandler Initialize;&lt;br /&gt;        event EventHandler SaveCustomer;&lt;br /&gt;        event EventHandler DeleteCustomer;&lt;br /&gt;  } &lt;/pre&gt;&lt;strong&gt;The code behind:&lt;/strong&gt;     &lt;pre&gt;class ManageCustomer : Page, IManageCustomerView&lt;br /&gt;  {&lt;br /&gt;       protected override void OnInit(EventArgs e)&lt;br /&gt;       {&lt;br /&gt;           new ManageCustomerViewObserver().Observe(this);&lt;br /&gt;  &lt;br /&gt;           if (Initialize != null)&lt;br /&gt;               Initialize(this, EventArgs.Empty);&lt;br /&gt;       }&lt;br /&gt;  &lt;br /&gt;       protected void OnSaveButtonClick(object sender, EventArgs e)&lt;br /&gt;       {&lt;br /&gt;           if (SaveCustomer != null)&lt;br /&gt;               SaveCustomer(this, EventArgs.Empty);&lt;br /&gt;       }&lt;br /&gt;  &lt;br /&gt;       // etc.&lt;br /&gt;  } &lt;/pre&gt;&lt;strong&gt;The observer:&lt;/strong&gt;     &lt;pre&gt;class ManageCustomerViewObserver&lt;br /&gt;  {&lt;br /&gt;       public void Observe(IManageCustomerView view)&lt;br /&gt;       {&lt;br /&gt;           view.Initialize += delegate&lt;br /&gt;           {&lt;br /&gt;               new ManageCustomerViewInitializationProcess(view).Execute();&lt;br /&gt;           };&lt;br /&gt;  &lt;br /&gt;           // repeat for each event&lt;br /&gt;       }&lt;br /&gt;  &lt;br /&gt;  } &lt;/pre&gt;&lt;p&gt;&lt;em&gt;(Note: The code above probably has typos... wanna fight about it?)&lt;/em&gt; &lt;/p&gt;&lt;p&gt; The key element is the use of events. This allows the view implementation to forget about observer after calling the Observe() method. The reference that keeps it from falling out of scope is the observer&amp;#39;s subscription to the view&amp;#39;s events. The .NET framework&amp;#39;s event mechanism hides makes this slightly less than obvious. The events&amp;#39; presence in the interface also assist the implementation in hooking to the presenter observer correctly. The observer simply delegates the logic to a process class (one per event) which is an implementation of the Command pattern. The observer class only contains the Observe() method, which is simply glue code that doesn&amp;#39;t warrant unit testing. Each process class can be tested independently or as a group. All in all, I&amp;#39;m pretty satisfied with this design. It does lead to a lot more class files in the project, but unit testing, the Single Responsibility Principle&amp;#39;s biggest cheerleader demands most of this anyways. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicious.com/aggbug.aspx?PostID=194" width="1" height="1"&gt;</description><category domain="http://devlicious.com/blogs/jim_bolla/archive/tags/design+patterns/default.aspx">design patterns</category><category domain="http://devlicious.com/blogs/jim_bolla/archive/tags/testing/default.aspx">testing</category><category domain="http://devlicious.com/blogs/jim_bolla/archive/tags/MVP/default.aspx">MVP</category></item><item><title>Who is Jim Bolla?</title><link>http://devlicious.com/blogs/jim_bolla/archive/2006/09/30/Who-is-Jim-Bolla_3F00_.aspx</link><pubDate>Sat, 30 Sep 2006 15:47:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:176</guid><dc:creator>Jim Bolla</dc:creator><slash:comments>0</slash:comments><description>&lt;blockquote&gt;&lt;em&gt;Oh no. Another introductory post.&lt;/em&gt;&lt;/blockquote&gt;&lt;p&gt; *ducking* OK I know. I&amp;#39;m sorry. Please stop throwing rotten fruit and garbage at me. I&amp;#39;ll try to make this as quick as possible... &lt;/p&gt;&lt;h3&gt;The Man&lt;/h3&gt;&lt;p&gt; I develop custom business software for a small consultant in Erie, Pennsylvania as lead of small dev team, creating solutions on the Microsoft .NET platform (ASP.NET + C# + MS SQL). November 1&lt;sup&gt;st&lt;/sup&gt; will mark the seven year anniversary of my professional career. Before that, I was just another computer nerd lurking in his darkened room, making BASIC programs on his TRS-80, Apple IIc, Compaq Persario 66 MHz 486 with 4 MB of RAM... Turbo Pascal, C++, Java and finally a one year stint in college with Eiffel. My career has involved ASP (VBScript), HTML, Javascript, database design, T-SQL, IIS administration, MS SiteServer (*shudder*), VB6, XML... I dabbled with ASP+ (before MS renamed it to ASP.NET) and began developing production code with it almost as soon as VS.NET 2002 was gold. I have a &amp;quot;.NET guy&amp;quot; ever since. &lt;/p&gt;&lt;p&gt; The past two years have seen a renewed growth in learning and process improvement for me. I&amp;#39;ve been learning about and implementing many technologies and methodologies in the name of &lt;strong&gt;Quality&lt;/strong&gt;... source control (Subversion), O/R mapping (NHibernate), refactoring (Resharper), continuous integration (CruiseControl.NET), code analysis (FxCop, SourceMonitor), OOP (design patterns, dependency inversion, SRP), unit testing (NUnit)... I&amp;#39;m still trying to come to terms with TDD, but I will keep at it until I &amp;quot;catch the bug.&amp;quot; I&amp;#39;m sure there is plenty more I am forgetting to mention. About a year ago I took on the duties of project manager, which has added even more to my plate... customer management (requirements analysis, estimation, controlling scope creep) and helping my team stay productive (design meetings, code review, agile practices). &lt;/p&gt;&lt;h3&gt;The Blog&lt;/h3&gt;&lt;p&gt; The previous paragraph was intentionally buzz-word heavy. This is my reminder to myself as to why I&amp;#39;m blogging; these are the topics on which I might have something (&lt;em&gt;useful? insightful? interesting?&lt;/em&gt;) to say. My goal for this blog is to post one or two quality posts per week on topics such as those above, being between one half and two pages of well formed English prose containing coherent (&lt;em&gt;original?&lt;/em&gt;) thoughts. I also intend to comment more often on posts by fellow bloggers. I&amp;#39;m looking forward to doing my small part towards the enlightenment of the .NET community. &lt;/p&gt;&lt;p&gt; OK, that is all. You can resume the garbage tossing. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicious.com/aggbug.aspx?PostID=176" width="1" height="1"&gt;</description></item></channel></rss>