Just Do It Part 1: 25 Steps

The stars have aligned and I have enough impetus to Just Do It. On Tuesday, Microsoft announced the Windows 8 App Store beta (along with the Windows 8 beta) will arrive in February, and revealed the Windows 8 First Apps contest. I’ve been following the Lean Startup community over the past few years (even engaging in conversation) and purchased Eric Ries’ book day one (highly recommended). Today, marks day one of my new Micro ISV endeavor. I’m going to put to use a lot of the ideas I’ve been learning through the discussions in LSC and in the book. I am also going to follow Secret Geek’s 25 Steps to Build Your Own Micro ISV. I’ve already registered the domain, secured reliable hosting (and here too), started writing content, and installed traffic monitoring. I’m 20% of the way through the list in one night.

Join me at Incipire.com to find out what I’ve got brewing. And follow along with the blog at blog.incipire.com.

Posted by Mike Brown | with no comments
Filed under:

Just ___ It

There is a recurring theme that I’ve been coming across over the past few weeks. And a recurring message that I’ve been reminding myself.

Just Effin’ Do It

The worst kind of procrastination is procrastination that disguises itself as productivity. You know what I mean. Stop going on Stack Overflow to figure out the best approach to appropriately separate concerns in your n-tier, cloud based, social networking, NoSQL, DDD application. Just Code It

Stop asking the Lean Startup Circle what the best approach to customer discovery is and whether you should fill in your Startup Canvas clockwise or Counter Clockwise. Just Start It

Stop reading books on how to stop procrastinating or to become more productive. I’ve actually tweeted on how ironic it was for me to procrastinate by reading a book on stopping procrastination. Just Do It

You know what it is. And the longer you sit there pretending to do it, it ain’t getting done. Put away your personal Kanban boards, and your Gantt charts, and your Pomodoro techniques, and all that crap that lets you pretend like you’re doing something without really doing something (zero inbox and GTD, I’m looking at you). You know how to get to zero inbox? Look at your inbox. anything that’s over a day old and you haven’t responded to…delete it. If it’s important, you’ll get a follow up. If it’s not important enough for the other person to follow up again, then why the hell are you prioritizing it?

This post is me doing it. I have been neglecting my blog resorting to tweeting for sharing with the world. But I wasn’t scratching that itch that a full blog post would give me. I have about 20 queued posts that I haven’t completed because I wanted to make them perfect. And that is the problem, for some reason, I have this strange craving for perfection. It materializes in multiple ways. I overcame “Analysis Paralysis” by releasing this silly concept that my code is written in stone and has to be perfect the first time I write it. It’s called software for a reason. Once I accepted that Coding is Design, I realized that the best way to write the best code for a problem is to make it work. Then make it pretty. That’s my mantra now.

Note I’m not advocating that we should eschew all specifications whatsoever. After a certain scale, you need to make sure everyone is on the same page, and you’re going to have to write specs to do that. “I might as well write the code at that point,” you might argue.  Trust me, if you’re making the technical decisions for a group of more than 6 developers, you’ll scale quicker if you write the specs and trust your developers to write the code. I’ve tried the other path, and it leads to burnout and frustration. You lose the bigger picture because you’re so focused on the details of a specific piece of code.

I’ve listened to arguments from “Senior” developers saying otherwise. “Well I guess you can go and write specs, on my team, all of my developers are capable of making the right decisions.” It’s not a matter of your developers’ aptitude. A good codebase should be consistent and have no surprises. You should be able to tell by the conventions of that system where you’re likely to find what you’re looking for. Good code should be like a book. How jarring would it be if you were reading a John Steinbeck novel and halfway through Ernest Hemingway suddenly took the helm? What if Picasso took over half of the Sistine chapel and used his style? We limit the number of brains making technical decisions not because we don’t think the developers are capable. We know that it’s easier to maintain consistency when there are less decisions being made. “Well why not just use standards and guidelines?” So, you’re saying we should specify how the code should be written? That’s my point exactly.

Anyway, now that I’ve diverted from my original path enough (read The Mythical Man Month for more on the topic of the Unified voice), let me get back to my point. Perfectionism. That is just another lie we tell ourselves when we want to procrastinate. In reality, you’re not going to get anything of substantial size done in one sitting. So just keep doing it, little by little, until it adds up to that big thing. But make sure you are honest with yourself. Ask, is this me Just Doing It? Or am I pretending to do it?

Posted by Mike Brown | 2 comment(s)

Am I a Fanboy?

{EAV:435579fc06d84e62}

It’s pretty obvious that I like Microsoft products. A lot. I have an Xbox, Windows Phone, and AT&T U-Verse (running Microsoft Media Room). My platform of choice for technology is Microsoft (Windows, SQL Server, Hyper-V, Azure, .NET, Visual Studio, Systems Center, etc.). I am so quick to jump on an attack of Microsoft products that you would think the person was insulting my mom.

From all outside appearances it would seem that yes I am a fanboy. And I will go on record and admit right here that indeed I am. But there’s a reason. Microsoft specializes in making what’s normally difficult in technology easy. Case in point let’s look at Novell Netware. Novell was the king of the Network OS space in the early 90s. Entering the world of Network Administration in 96 meant that I needed to learn Netware…period. And learn it I did. Netware was powerful. You could do a lot with it. Once you learned HOW to do it. 96 was also the year that Microsoft introduced Windows NT 4. And it was the dawn of destruction for Netware. NT4 had a wizard for everything and it was obvious what any given setting would do. It was the release of Windows Server 2000 and Active Directory (Microsoft’s equivalent of Novel Directory Services) that put the nail in the coffin of Netware. Having had experienced the difficulty of installing and configuring NDS I was amazed at how easy Active Directory was to configure.

We geeks pride ourselves on becoming masters over what many fear. And there is a tendency to look down our noses at those who use tools to accomplish what can be done by hand.

  • “I never use an HTML designer, I write it by hand.”
  • “Visual Debuggers make programmers lazy.”
  • “Why do I need a GUI to do the same thing I can do by command prompt.”

All of these arguments basically boil down to “I learned how to do this task the hard way, and so should you.” I do agree to an extent…everyone should learn how to do things manually for those occasions when the tool messes stuff up. But why use a scrub-board when there’s a perfectly fine washing machine right there? The reason I like Microsoft’s products is that they simplify difficult tasks so that you can be more productive. From a programming stand point what does that mean? Here are a few examples:

  • Instead of mapping objects to a database by hand, I can use EF to do it for me. On the flip side, I still need to understand how it works so that when an error pops up (why isn’t this object that inherits from an abstract class getting mapped to my database) I know how to fix it. For 80% of the scenarios, it just works. For those final 20%, a solid foundation in database design is necessary.
  • WCF RIA services lets me pretend that there isn’t a “cloud” between my rich client and my database. Again 80% of the time it will just work. The other 20%, understanding how WCF works, and good SOA design (because there IS a cloud between your rich client and database after all) is helpful.
  • Just this week, having never configured a firewall more complex than what comes on my wireless router, I successfully installed Forefront Threat Management Gateway in a 3 Legged Network Configuration, and used it to publish a Remote Desktop Gateway from my internal network. Now I can connect to any machine on my network over RDP without having to VPN in first. (Oh yeah I got the VPN working as well for those times when the Gateway is overloaded.)

These are just a few examples of how Microsoft gets it right. Yes I can take the effort of building my own service framework that exposes my rich server-side model over the web to my Silverlight Client, but that is a detail which doesn’t add value to the product. The sooner you get to solving your customer’s problems the better. Microsoft has excelled at providing solutions that allow me to do just that.

Posted by Mike Brown | 2 comment(s)

BUILDing the Future Part 1: Windows 8

I’ve been stewing on what came out of BUILD for the past few weeks. There’s a lot to talk about: WinRT, .NET vs. HTML vs. native, C# vNext, Visual Studio vNext, Windows Server 8, desktop vs. “Metro”. It’s hard to know where to get started. The most obvious place to me is the star of the stage. The bell of the ball. The Helen of Troy. Windows 8 itself. Forget about the development story (although there’s a big one that has caused much speculation and moaning and gnashing of teeth), what does Windows 8 mean for the market?

Dual Nature

In case you haven’t noticed there are two sides to Windows 8. There is the “classic” desktop that is pretty familiar to us. There are some nice additions here and there (ribbon on the explorer shell, improved file copy) but for the most part there’s nothing really to see here. No new driver upgrades necessary, all the old apps run just fine Windows 8 classic desktop is just a perfunctory upgrade to Windows 7. If that was the entire story there wouldn’t be much to see here. Until you press the start button…

The Start Button has been a Windows mainstay since Windows 95 was released. It has undergone several changes but has served the same functionality for the past 16 years as a program launcher. I remember sinking a lot of time into organizing my start menu so that I could easily find my applications that I needed. When Vista came along and provided start menu search, my primary interaction with the start menu became as a searcher. I didn’t care anymore about organizing the program shortcuts because I could just type ‘visual studio’ and the start menu would find it for me. With Windows 7’s super app bar (or whatever they call it). I have more than enough room for my most common apps and the rest are a few keystrokes away from being found.

Regardless of the changes that have occurred over the years there is no denying the significance of the Start button (try finding a non-mac keyboard without one). It has become synonymous with Windows. That’s why tying the new experience to the start button is a bold and powerful statement by Microsoft (the Building Windows 8 Blog has a few posts on the topic of the Start Menu). There are a few subtle points to realize.

The Start Menu is the Default View

The first thing a user sees when she turns on her Windows 8 device is the Start Screen (very similar to the start screen for WP7). You have to “launch” the desktop view. This is a new canvas just waiting to be painted and Microsoft will be placing it (and potentially your app) in front of hundreds of millions of Windows users at power on. Think of that for a second. There are hundreds of millions of Windows 7 users right now. The adoption rates for new versions of Windows (barring Vista and me) have historically been high, so we can expect there to be a huge number of Windows 8 devices in users hands after launch.

Windows 8 Tablets are Hybrid Devices

Microsoft is creating an entirely new market with Windows 8. The Samsung device given out at Build is much more than a tablet, and much more than a Windows Desktop with touch. Today’s tablets (Android, iPad) are great at consumption and very light production. They are designed for the user on the go. The Samsung device with the new Start Menu is also designed for mobile users. Here’s the difference. Once you’re back at your desk, you can dock your Windows 8 tablet and it becomes a full Windows desktop. This seamless transition from tablet to computer is something that hasn’t been done in the tablet space yet.

I don’t think you heard me there. People buy PCs to get stuff done, they buy tablets to supplement their PCs. Windows 8 allows you to purchase one device to serve both purposes. The devices that pick up on that cue (like the Samsung or the Acer Iconia) will be the winners in the new market.

Posted by Mike Brown | with no comments
Filed under: ,

Slide Deck and Code Sample for St. Louis DoDN

Editor's note: I wrote this back in August, shortly after the STLDoDN but for some reason my blog decided not to make it public.

This past weekend I spoke at the St. Louis Day of .NET, presenting a talk on MVVM. I was honored to actually have my session double-booked speaking on both Friday and Saturday. The first session, I showed some pre-canned code that showed the concepts I was covering. In the second session, I tried a different approach: I refactored a simple task management application to show how the patterns come into play as an application evolves. I demonstrated the basic View Model, Delegate Command, and Event Aggregator. I’ve uploaded the slide deck and code to Codeplex under the MVVM Unleashed project.

As part of creating the slide deck, I came across some excellent “Motivational Posters” created by Derrick Bailey to visualize the SOLID principles. I used the same technique to make additional posters for YAGNI and DRY

yagni

dry

Feel free to use the code, slide deck, and new posters as you see fit (of course you might want to change the personal information about me if you’re presenting it).

Quick Tip: Entity Framework DB Initialization with ASP.NET Providers

I have a database with the ASP.NET providers already installed…I don’t have them represented in my Object Model for Entity Framework 4.1 but I don’t want to put them on a separate Database from my main application data.

The solution was rather easy:

public class UpdateDatabaseSchemaStrategy:IDatabaseInitializer<KharaSoftIncipireWebContext>
{
  public void InitializeDatabase(KharaSoftIncipireWebContext context)
  {
    var script = ((IObjectContextAdapter) context).ObjectContext.CreateDatabaseScript();
    context.Database.ExecuteSqlCommand(script);
  }

I just asked the ObjectContext for the DBScript and call ExecuteSQLCommand using it. This is great for development where I’m rapidly pushing changes to the object model and want to see it in action. I just delete all the application tables and don’t have to worry about recreating the provider tables every round.

Posted by Mike Brown | with no comments

Silverlight: The Rumors of My Death Have Been Greatly Exaggerated!

Update 3: Things are very interesting. Look for a "what we know" post over the next few days.

Update 2: Thanks to MyDigitalLife forum user NaiveUser we have hard evidence that XAML is indeed supported through DirectUI. Also with his process explorer dump it looks like GDI and User are still around.

Update: According to "Ricky" who identifies himself as a Microsoft Employee. WPF doesn't rely on DWM. It uses DirectX natively. Performance issues aren't caused from User/GDI limitations but more resource issues when rendering a large number of items on screen. That does not invalidate the rest of the discussion...just a minor flub or two on my part.

So the Net is all abuzz about the freshly unveiled “Windows 8” and it’s impact on the Microsoft developer ecosystem. A lot of people feel that the fact that Silverlight, WPF, and .NET weren’t mentioned in the demo implied they wouldn’t be supported. I must admit that was my first knee-jerk reaction as well. Let’s take a step back for a second and analyze what’s going on.

Windows 8 Immersive UI has been shown to support HTML5 + JS for writing apps. But here’s the kicker…Microsoft doesn’t control the HTML5 standard. There is no way they are going to have their premiere platform limited by an external standard. They’ve already gone through that with Java in the late 90s. “Embrace and Extend” just doesn’t cut it today. So naturally there HAS to be another framework for developing against Windows 8. Make no mistake, the “classic desktop” is essentially the equivalent of Mac OS X support for legacy apps, the only thing that Windows 8 spells death for is User and GDI. If you look closely at the demo, the Classic shell is a Window within MoSH.  If you are developing against frameworks targeting them, then it’s time to upgrade your skills.

HTML5 + JS is an interesting combination. HTML5 is markup, JavaScript is code. Applications = Code + Markup get my drift? By teaching us XAML and having us focus on declarative UIs, Microsoft is now free to swap out the how because our code only says “what we want”. If anything, the only people who should be worried are those still using Windows Forms for development.

Microsoft has been trying to make this break for quite a while. Did you know that the IE Engine, Trident, was originally designed to be a replacement for GDI/User? Microsoft was attempting to provide a declarative UI platform for Windows since Windows 95. The problem back then was performance. They could not get the horsepower needed to render the full desktop and all the applications at a suitable speed under Trident. So they backed off. However, we got the remnants of the effort in IE3 and the Active Desktop. Remember when Microsoft said in their anti-trust suit that IE was a core part of Windows. They weren’t lying. Trident shipped with Windows 95 Desktop Update and Windows 98 not as a gimmick but because there was so much written in the OS that leveraged it, stripping it out would have involved a lot of rewriting.

Fast forward to Longhorn. Again, Microsoft was attempting to bring a declarative UI layer to Windows core. From that effort we got the DWM and WPF (which sits atop DWM). They stopped short of fully stripping out User and GDI, but they telegraphed their punch so to speak. With Silverlight, and Windows Phone 7, Microsoft took off the glove. You get XAML and the .NET framework that they allow. No Windows Forms, no GDI, no User unless you break out of the sandbox and perform all kinds of obscene acts. Effectively the past 5 years has served to wean developers off what came before and start learning the future of Windows development.

There are still performance issues in WPF…there are performance issues in Silverlight on Windows Phone. This is because when you go far enough down it’s not turtles all the way. It’s still the same old stuff that Windows has been hobbled with since version 1. User and GDI.

Until now. Windows 8 introduces DirectUI. And with Direct UI the gauntlet has been thrown down. It’s time to stop doing things in code and on the processor that the GPU is best equipped to handle. It’s time to learn how to tell the framework what we want it to do instead of telling it how to do it. It’s time to realize that whether it’s called Silverlight, WPF, Jupiter, or Uranus, the future of Windows Client development is declarative. HTML just happens to fit the model…but XAML was born to do it.

kick it on DotNetKicks.com

There’s No Free Lunch

In light of Hammet’s recent resignation from the MEF team, I decided to finish up this post discussing other self-indulgent monologues that have been floating through the net. There was a recent post (well not so recent anymore, I first started writing this a few months ago) where someone decided to publicly reject his MVP award. I think he’s gotten enough traffic from the fact that he was linked from a popular newsletter so I’m not going to add to it here. Let’s put aside the fact that he could have told his lead during his review period that he wasn’t interested in renewing. What I have issues with is his overgeneralization of the program and it’s participants. Let’s look at some of the fallacies in his self-indulgent gibberish.

I’m No Expert, So MVPs Aren’t Experts

Expertise is a relative term. Case in point when I was invited to become moderator on the MSDN Forums, I didn’t feel at the time that I had contributed significantly. I was told by the Program Manager that fewer than 2% of the visitors answer more than two questions that are accepted (I had about 20 within a month). The MVP program has around 4000 awardees worldwide. Their criteria in selection is like KFC’s secret formula, but I’m pretty sure somewhere in there is “shows deeper knowledge than the average user of the product.”

Also the award is given strictly for your community participation during the year leading up to your award. It doesn’t say anything about what you do after receiving it. Strictly speaking the MVP program recognizes people who are enthusiastic about Microsoft products and voluntarily share their enthusiasm with the community. That’s all there is to the program. On average, an MVP will be a good person to ask for a quick “how do I…” question in their field of Technical Expertise (what they were given the award for). Because it’s likely they have come across the answer.

Also, different teams have different criteria for acceptance. I had written a lot of blog posts; was a moderator in the forums, answering a good number of questions; and spoke at several user groups and regional conferences for two and a half years before I was given an MVP award. So while YOU may not consider yourself an expert, don’t imply that your own incompetence applies to the rest.

The Product Teams/Microsoft Don’t Listen

First of all, from what I read, this guy was an MVP in Developer Security. As I understand it, there is no product team attached to that specific expertise (I could be mistaken). Most MVP areas are attached to a product team (for instance my award is in Client App Development which is attached to the WPF team). Through the program there are opportunities to engage with the team (in addition by the time I was awarded, I had already been engaging team members) both at the MVP summit and through occasional teleconferences.  They listen…they may not move as fast as you want them to but they listen.

It’s funny that he brought up the EF vote of no confidence. The V1 of EF was not equal to NHibernate. Of course NHibernate has been in development since 2003 and started as a port of Java Hibernate which had been around for a few years itself. So expecting a V1 to be on par with an 8 year old product is a bit over the top. The team focused on features that would cover 80% of the usage scenarios. Those scenarios were enabled by a convenience layer (the EDM Designer, the ObjectContext Generator are not the Framework itself). Looking at the core framework, it was apparent that a future release could provide a convenience layer to enable the scenarios they were clamoring for (pure POCO entities). The next release, took a step closer to that goal and 4.1 supports it fully. Now it’s up to NH to catch up with EF in terms of LINQ support.

What people seem to forget is that Microsoft is a product company and they need to support a wide array of developers. Like it or not, for better or worse, the majority of .NET developers are not immersed in the world of advance patterns, TDD, SoC, etc. The majority have a database and want to quickly have a working application that uses it. What they also forget is that even though it SEEMS Microsoft has unlimited resources. They really don’t. Even if they did, we all know how the mythical man month works by now. No matter how much money is thrown at a project, only so much can get delivered within a given time frame. The team had to prioritize which features had to be in V1 and which could wait until a later delivery. It’s not a matter of not listening. It’s a matter of how much can be done in a given amount of time.

I’ve had experiences where I felt the team has listened to my feedback…I’ve also had experiences where I felt that because of my expertise, my feedback was marked as outside of the target zone. It was only after pushing back that no, this isn’t just for me this is my customer who is very much in your target zone speaking, did I get my opinion listened to. The FixWPF.com website is similar to the EFVoNC except it’s less political posturing and more of a request to address known issues within the framework.

Of particular note is his comment about the response to telling his lead that he didn’t want the award anymore:

The most surprising thing to me was when I told my MVP lead that I was not interested in participating in the program. The response was: “No problem. Thanks for letting me know Dave. Good luck in the future”. I expected maybe a bit more of a “Why?” response but I am not surprised that MS does not care about what other people think. Maybe, because I have become harder on MS that they are happy to be rid of me. Who knows.

Seriously, what did he expect them to do crawl on their knees begging him to stay? Again, he could have let them know BEFORE he was awarded so that his seat could be given to someone who deserved it.

Beside the Free MSDN Subscription, There’s No Value

I’ve got to give a full quote here because I can’t believe I saw this in writing:

Unfortunately it costs a lot of time and money to contribute to the community. If I give a talk I have spent 40 to 200 hours preparing (yes 200 hours on a 1 hour talk) plus the costs to travel to another city, food, and accommodation. MS’s reward is a MSDN subscription and half of a hotel room if I attend the summit (there used to be more benefits but they have been rolled back to save costs). It would probably be more affordable for me to purchase an MSDN subscription on my own and stop speaking entirely. I have gained no additional work from the MVP program, no additional speaking gigs, and have not made relatively few connections to others because of the MVP program.

There are a number of benefits outside of the MSDN Subscription that come with the MVP Award. No one is going to come pounding on your door to make you take advantage of them. I don’t want to go into too much detail here but suffice it to say that as much value as I receive from the MSDN Subscription (and believe me I wouldn’t give that up for the world), I wouldn’t even put it as the 5th most valuable benefit I get from the program. If the Subscription is the most valuable benefit you receive from the MVP program, you’re doing it wrong.

Also spending 200 hours prepping a talk for a presentation is sad. I think I would quit speaking too if it took me that long. The fact that he says spending that time and effort just for an MVP award isn’t worth it is sadder. While it’s nice to get the recognition, the award is not why I do what I do. And I’ve had the exact opposite experience. I’ve gained additional work through the program and connections made there, I’ve been invited to submit to more conferences (and not just the open call for Mix), and I’ve networked my butt off with the program. How could you go to the summit and NOT make new connections unless you’re a social leper?

Fin

It seems to me this is just a pure misunderstanding of what the award entails. Dave obviously felt that the award would come with keys to the kingdom and his word should be the rule of the land. The reality is that the door has been slightly opened for you, it’s up to you to barge in and take advantage of the opportunities.

Posted by Mike Brown | with no comments

Recruiter Etiquette 101

I was inspired by another blogger (specific blog and name slips my mind right now) who was fed up with emails from recruiters that make it evident they aren’t trying to personalize their efforts. This will probably become a series because I get a lot of recruitment letters. So as not to appear mean, just providing some professional critique, I will alter names and and companies out of these messages.

This one comes from Jack Flowers from Critical Mass Technologies (remember all names are fictitious, if there is a recruiter named Jack Flowers at a Critical Mass Technologies, I’m NOT talking about you):

Hi Michael:

I am contacting you in regards to an opportunity with our company in the [Midwest City] area.

Please let me know if you would be interested.

Regards,

Jack Flowers

Recruiter

It also included a link to Critical Mass’s website, Jack’s phone numbers, the company byline and some best place to work in the state award. First instinct was to delete (I get about 20 of these a week). Instead I decided to let Jack know why I wasn’t interested:

Jack,

                Imagine you received an unsolicited two-line email that said the following:

“I’m contacting you in regards to being a candidate for an opportunity with your company in the Indianapolis area. Please let me know if you would be interested”

What would happen to that email? You’ve provided me no information about your company, or the opportunity. So no you haven’t piqued my interest at the moment.

--Mike

I don’t think I was very mean with the statement. I attempted to point out why this Jack’s email didn’t make the cut to get a response from me. It’s like Jack expected me to follow the link (which I did and it appears to be a run of the mill technology consulting firm) and dive around the company’s job board to guess which project Jack had in mind for me. I guess that works for some people. I wonder how it would work as a pick up line:

“Hi, I have an opportunity to sleep with me tonight. Let me know if you’re interested.”

I saw a response from Jack and was hoping that it would contain more information:

Michael:

Sorry to hear that.  We are an amazing company and should your interest ever be piqued to hear more, do give me a call.

Regards,

Jack Flowers

Recruiter

Guess my message flew right over Jack’s head. Against my better judgment I replied to Jack after looking at the company site and seeing some information about Jack. It appears Jack had worked at a company that I had a lot of good experience with. Here’s the ironic part about Jack’s profile (emphasis mine)

Jack's role is to locate, interview and hire top talent to Fusion. Written as well as verbal communication is crucial to Jack’s success as is networking within the IT community. Writing is a hobby of Jack's and he once [worked for a company that I am familiar with and fond of]

So I took some time to compose a thoughtful response explaining why Jack was failing to attract me.

Jack,

I’m going to help you here because you seem like a nice person (I read on the Critical Mass Blog that you used to write for Acme Corp. They were one of the first ___ companies out there. [Insert anecdote about my experience with Acme Corp here]) What I was getting at is that you haven’t told me anything about Critical Mass or how you think I might be a good fit for you or what would attract a person like me to your company. To me the employment process is a two way activity, somewhat similar to dating. I get 20 emails just like yours a week. And countless more that provide just a cursory description of the job and/or company. And normally, I delete them because I don’t have the time.

I’m not sure what made me respond to you, or to look at your website because I normally don’t do either. But here we are. In the real world, you don’t get a second chance to make a good impression. Here’s your third. Tell me about Critical Mass. How did you find me? What about my profile, resume, background, etc. makes you feel that I would be a good fit with your organization? I know that it’s possible that you get responses to your original email (otherwise I doubt you would be where you are now). But think about who it is who would respond to that message. It’s possible you’ll get a few good candidates that way. But more likely you’ll find someone who will jump on the first opportunity presented because they said yes. The very best candidates aren’t even going to give your message a second look. True, the effort of writing a customized email to an individual candidate takes more time but it will also make you focus on whether that person is worth the effort or not. Having less candidates in the pipe is a good thing because you’re spending less time communicating with a candidate who’s likely to go nowhere in the recruitment process.

I’d suggest asking some of your tech staff to help screen resumes for you. They would help you cut through the chaff and find a higher ratio of qualified candidates. If you’d like I could help screen for a nominal rate. Either way, I’ll be waiting for your response.

--Mike

I could be wrong with my interpretation but I did not attempt to come across as arrogant. I just told Jack again that it takes a little more to attract me. I’m not a cheap date. I even took the first step in finding out more about Jack and gave Jack something to start the conversation off with. I was sincerely hoping to start a meaningful discussion there. I guess I didn’t do well with my written communication skills:

Michael:

Thank you for your response and for your insight.  I have been very successful here at Critical Mass for 7 years and for a number of years in this industry to need advice on how to do my job.  I have hired many quality people to our firm (we have about 240 consultants on staff) and will continue to do so to need or want advise from someone that I have reached out to  speak with about an opportunity.

I am sure that you are successful with your current role and would be insulted if I tried to tell you without knowing the first thing about your role or company, how “better” to do that.

Best of luck to you.

Regards,

Jack Flowers

Recruiter

First let me remind you that the only alterations I did to these are changing/obscuring names. So the multiple grammatical errors (possibly because Jack was insulted that I tried to tell him “without knowing the first thing about his role or company”) are all Jack’s. There’s those written communications skills Jack touts on display again. Let’s forgive the fact that Jack assumed (rightly in this case) that I had no recruiting experience. Jack missed the point of my prior email altogether. So I sent a final reply to explain to Jack what I was getting at:

As I said, I’m sure that the way you’ve been doing things work. I sense hostility in your response, all I was trying to do was give constructive criticism. As I mentioned, for me with fifteen years of experience and recruiters sending emails left and right it takes a little more to capture my attention. That was my second attempt to ask you to provide a little more information than you did. Obviously you preferred to take offense to a suggestion on how to streamline your recruitment process rather than sell me on your company.

I know a number of highly qualified individuals. And to a man they say that unless they are in dire straits the kind of email you sent me goes straight in the trash. Keep on spamming out one-line emails. I’m sure you’re getting a lot of “quality” recruits that way.

Yes I did get a little acerbic with my last comment. But as I said, it’s insulting to me that employers expect an essay showing that I’ve researched them and how much you’ll be a great fit with their culture but they’ll have the nerve to send out the employment equivalent of “Nice shoes. Let’s !” and expect me to jump at the chance. And here’s Jack’s last response

No hostility intended as I am far too busy talking to and hiring quality people to our company to be bothered by unwanted criticism.   Just wanted to respond back and will not be doing so after this email is sent.

I’m sure there is someone reaching out to you that gets lucky enough to “capture” your attention.

Regards,

Jack Flowers

Recruiter

In fact, I’ve engaged with a number of recruiters who were considerate enough not to waste my time with a two sentence email. The type of projects I work on make those engagements quite lucrative for both parties (the recruiter and me). I understand how the business works and I’m a bit discriminating in whom I’ll work through. It makes me question what kind of company would want to hire a person who jumps on the first email that mentions some vague unknown “opportunity”. I guess that’s how the industry works. And people wonder why IT projects fail at such alarming rates. Final note: as everyone knows, just because you’re good at what you do, doesn’t mean you can’t take the time to be better.

Posted by Mike Brown | 2 comment(s)

IQueryable<T> and IUnitOfWork Revisited

So I’m on a pretty cushy government contract (turns out that if you want to have a low stress job in software development, taking a public sector job is the way to go) right now. Microsoft stack all the way down except…Oracle on the backend (*doh*). I have become an EF Code First Zen Master (cutting my teeth on the various CTPs as they were released) and love how well it stays out of my way. My IQueryable<T>/IUnitOfWork combo that I blogged about before have become my bread and butter in creating rich domain models mapped to a database. I was really dreading giving that advantage up. I got approval from the manager to use NHibernate which provides a great LINQ implementation out of the box and decided to try it out using NH.

If you recall, because of the design, the only element of the combo that even cares about persistence is the concrete unit of work implementation. So far I have an InMemoryUnitOfWork (for mocking/testing purposes), and an EfUnitOfWorkBase (that manipulates a DbContext), now I need to make an NhUnitOfWork.

    public class NhibernateUnitOfWorkBase:IUnitOfWork
    {
        private ISession _session;

        public NhibernateUnitOfWorkBase(ISession session)
        {
            _session = session;
        }

        public void Commit()
        {
            _session.Flush();
        }

        public void Attach<T>(T obj) where T : class
        {
            _session.Update(obj);
        }

        public void Add<T>(T obj) where T : class
        {
            _session.Save(obj);
        }

        public IQueryable<T> Get<T>() where T : class
        {
            return _session.Query<T>();
        }

        public bool Remove<T>(T item) where T : class
        {
            _session.Delete(item);
            return true;
        }
    }

That’s it. I tested it out by making swapping the EfUnitOfWork in Pigskin with this one and configuring the mapping for NHibernate (which for the most part only needed a few explicit configurations). Bada-bing, bada-boom, I’ve switched O/RMs just like that.

Posted by Mike Brown | with no comments

Bigotry and Software

This may sound like it’s a post about race/gender tensions in the industry. I’m not quite ready to tackle that topic just yet. What I’m talking about is language/platform bigotry. And to me it’s as idiotic as cultural bigotry. I’ve sat back and listened to various arguments against Windows and Microsoft products for years. Sometimes when I see that the person actually would be open to logical discourse, I will engage with them. Many times it’s not even worth discussion: they are as blinded by unmitigated hatred for all things Microsoft as a neo-Nazi is toward…well practically everyone but themselves. I used to write it off as some kind of technology non-conformist club. Then I saw this post on the expensify blog.

I’ll save you the trouble of following the link by summarizing it here: anyone who uses the Microsoft platform for development can’t possibly be a good developer or the chances are very slim that they are. Let’s look at his reasoning, item by item with a clear head. Actually the argument is so full of metaphors it’s hard. Something about .NET being the McDonald’s of the development world and he wants a 1.7 oz. burger instead of a 1.6 oz. burger (personally I’d have to question anyone who thinks a burger smaller than six oz. is satisfying). His argument is that .NET developers can’t think outside the box enough for the needs of a startup. He says that the .NET platform is designed for incremental changes not the revolutionary leaps that a startup needs. He argues that although .NET allows you to get started quickly, the framework makes it difficult to step outside of the scenarios it’s designed for. .NET development to him is a matter of clicking a few buttons and out pops a fully working application. He also argues that the .NET community doesn’t embrace open source. He also says that the majority of startups don’t use .NET for development (somehow implying that it validates his statement that .NET is not a good platform for startups). In addition he makes some claims that make it patently obvious that he hasn’t even used Microsoft platforms beyond surfing the web and making powerpoint slides (my notes in red):

Big things, like obscuring the networking stack under so many countless layers of abstraction that it’s virtually impossible to even imagine what bytes are actually going over the wire (ever hear of System.Net.Sockets). And a thousand other things in between: programming tools that generate a dozen complex files before you even write your first line of code (if only there was an empty project template in visual studio…oh wait there is now let me import the frameworks, create a global.asax page, write my web.config file, setup my MVC routes, add jQuery.js, and my CSS file, and a MasterPage now I can start writing code.), expensive servers that force a remote GUI terminal on you to do essentially anything despite a few keystrokes being perfectly adequate for everybody else (if only there were a way to remotely manage my windows server or some kind of remote shell) ,

It almost sounds like he’s complaining that .NET makes it convenient to do common things. Oh my God I wonder how good of a housekeeper that person is…they use a washing machine instead of scrubbing their clothes on a scrub-board in a tub of water. Gotta question how well that guy drives…his car has anti-lock breaks, power steering, and traction control. Even more pathetic is that everything he claims Microsoft tools don’t have IS RIGHT THERE! Now let’s discuss the rest of his hole-ridden argument.

First let’s talk about the “revolutionary” expensify application. It generates expense reports from online credit card statements. I’m sorry but that doesn’t quite pass my “wow” test. Revolutionary is a computer that can beat Jeopardy champions at their own game, or a $150 piece of hardware that enables gesture-based interaction, even a service that lets you do a git push and see your website running a few minutes later in the cloud. There’s nothing I’d call revolutionary about screen scraping a credit card statement and parsing it. And that’s what I really want to get to. Doing something that’s been solved already is the PERFECT time to pick a tool that does all the crappy stuff for you and lets you get to adding value quicker.

The argument that it’s hard to break out of the box on the .NET platform had more merit 3-4 years ago for web applications (Web Forms did require a lot of skill to implement new controls or even override behavior on existing controls). And WPF wiped out that argument for the desktop more than 5 years ago. Today, that argument doesn’t hold water. Web or desktop, the .NET platform is all about doing the tedious work for you and getting out of the way so you can add your “ground breaking” changes.

Speaking of ASP.NET MVC, it’s open source. As is Mono (the .NET implementation that Attachmate is apparently killing). Iron Ruby is an open source implementation of Ruby for the .NET platform including full integration with Visual Studio. Hibernate, spring, quartz, and dozens of other open source frameworks have been ported to .NET. There are over 5000 open source projects listed on Codeplex as stable. MonoDevelop and SharpDevelop are open source IDEs built on and targeting .NET. To say that the .NET community doesn’t foster open source is either ignorant (as in not being aware) or deceitful (knowing and purposely pretending not to). Either way, it makes me question the technical acumen of someone making those statements.

Moving on to the argument that most startups don’t use .NET. It’s very easy to see why. When given a choice between two platforms, most decision makers in a startup will choose the “free” one. Think of it this way…if I’m a college kid making Facebook, I probably don’t have 10000 dollars to buy an MSDN subscription. In addition, most web hosts charge a premium for .NET hosting. What it boils down to is that the low adoption rate for .NET in the startup world is a sign of frugality, not a reproach of the technical merit of the platform. Microsoft is doing a lot to lower the barrier of entry. The Dreamspark program provides free MSDN subscriptions to students (this subscription includes usage on the Azure platform). Bizspark provides 3 years of MSDN Subscriptions for multiple developers to startups plus corporate use licenses for Windows, Office, and other Microsoft apps for running the business. While it may be true that today .NET isn’t the dominant platform in the startup community, Microsoft has removed the cost barrier. If more people are aware of these programs, let’s see which one they choose.

Finally, we come to the argument that .Net experience on a resume makes a developer suspect. This is why I used the term bigotry. It’s very little different from saying that a black person or a woman will have to work harder to prove themselves worthy of a job with your company. Of course choice of development platform isn’t a protected status; but it is a POOR discriminator for what makes a “good” developer versus a “bad” developer.

As a startup I want to know what kind of experience a developer has had with scale (unless you have no intention of being successful, it’s a bit important). Using Ruby, PHP, or Java doesn’t guarantee you know anything more than the next guy about scalability. Using .NET doesn’t mean you know any less. Also important is how well the candidate is at algorithms and optimization (again a 1 second query over ten thousand records turns into practically 2 minutes over a million). Ruby, PHP, and Java doesn’t make you any better at this than .NET. So basically the things that matter – algorithms, scalability, creativity – the stuff that makes your startup different is not impacted by choice of platform. In fact, I would be more impressed by a developer who found creative solutions to work around limitations of the .NET framework.

I don’t care what platform you’ve used, I care about what challenges you’ve taken on. I care what attitude you take about your profession. Do you punch in 9-5 and don’t think about computers after (nothing inherently wrong just obviously not the right mindset for a startup) or are you so passionate that you write code just to keep your skills sharpened like a razor.

Sidenote: Many corporate developers take the 9-5 attitude. Microsoft is the leading platform in the corporate world. Standard corporate development doesn’t break outside the box. I actually think this is what he’s trying to say but instead of saying that he makes flawed arguments about the technical capabilities of the Microsoft stack. .NET isn’t allergic to Open Source…corporate and government IT is allergic to Open Source. There are many .NET developers who don’t follow the corporate mold. You’d be better off looking for and hiring them than some guy who shuns Microsoft because all the cool kids are on Macs programming Ruby.

I care that you’re not some know-it-all *** who thinks that you’re the smartest programmer on the planet even if you are (software is a team sport, you can bring individual performers together all you want, until they learn how to work as a team, you’re not going to win a championship). And I definitely care that you take the time to actually research your assumptions before you make them, or that when you realize you’re wrong you’re man (or woman) enough to accept it. These things are more important to a startup than what platform you’re using.

That and having someone at the helm that actually has a clue of what he’s talking about.

Posted by Mike Brown | 3 comment(s)

This IS Azure Coding After All

Today’s post is going to take a decidedly different angle. I’m going to actually talk about coding for Windows Azure. I know, I know. After two years of posts with nary an Azure sample in sight, why should I start now? I feel that now more than ever, making the decision to leverage the Azure platform is for all practical purchases a non-decision. Creating an application to deploy to Azure is as easy as creating an application to any other webhost. In some regards it’s easier.

What prompted me to take the plunge was Code Project’s Azure DataMarket Contest. After looking around at the available datasets, I came across the Stats, LLC NFL and MLB Stats feeds. I’ve wanted to learn ASP.NET MVC3 for a while, and make a Windows Phone App while making a program that takes advantage of all that Azure has to offer…I can’t find much better than an NFL Statistics app. (It also might give me a chance to learn some data-mining/data warehousing skills). Not to mention there was a nice prize involved.

So without further ado, let me introduce Pigskin:

newpigskin

Right now Pigskin shows NFL game by game statistics from the Azure Datamarket. The only data currently in place is from the 2010 season. I will be adding MLB Live and Game By Game stats as well soon (and perhaps changing the name since Pigskin doesn’t really make sense when talking about baseball). Rather than pulling data on each request and formatting it, I currently dump the data into a SQL Azure database and use Entity Framework queries to pull the information into a format ready for consumption by the web page. Because of the generic nature of the data structures, the queries take some time to run so I’m adding code to take advantage of the AppFabric Caching service and will also use the Azure Table Storage to dump the views into a format that is de-normalized and more efficient for reading.

The interesting thing is how rapidly I have been able to iterate and add features to the site using the Microsoft stack:

  • ASP.NET MVC 3
  • Entity Framework 4.1 Code First API
  • Windows Azure
  • SQL Azure
  • Azure Datamarket
  • Azure Blob Storage
  • Azure Table Storage

Case in point here is one of the earlier versions of the same Game Details screen

oldpigskin

You can see it was very much a vanilla ASP.NET MVC site and I had only exposed a few key points of data. I went from this page to the new design very rapidly. This included updating the color schemes and layout and displaying more data from the database. Interesting fact, I didn’t change the schema at all between the two revisions, and the new version gets all of its data with a single query.

I will be making the code for Pigskin available under the MS-PL so that the community can see the guts of the application and learn how to leverage Azure for their next great app. I will update this post when I make the code available. I will also be following up with a series of blog posts discussing various aspects of the application.

How “Done” Is WPF?

Recently, Michael Neel (@vinull on twitter) made an interesting statement on Twitter:

I love WPF but it still feels only 50% implemented - Ex. why is there no built in support for closing a tab in the TabControl?

It sparked off a long discussion on a private mailing list. I joined in the conversation very belatedly with this post:

Funny thing, you don't hear web developers complaining that Ruby on Rails or ASP.NET MVC doesn't come with control x or feature y out of the box. I've said it many times that WPF is more akin to a web framework than a desktop framework. People coming from Winforms where everything is RAD RAD RAD expect a rich toolbox primed and ready for them because it's a pain in the ass to implement your own feature if Winforms is missing it. The simple fact is that with WPF it is easier to customize a control to fit your needs. Web Developers are used to this (well as long as they aren't coming from Web Forms). WPF developers with experience are used to this as well. I've come to realize that the difficulty in learning WPF is more of a difficulty in unlearning Winforms.
 
With regards to an official MVVM framework, while Microsoft could develop a prescriptive framework for MVVM (in fact Acropolis was an aborted effort at such), I don't think it's worthwhile. ASP.NET MVC was necessary because Web Forms, despite the loud arguments to the contrary abstracted too much to support such a thing. Case in point the Web Client Software Factory used MVP instead of MVC because Web Forms pretends to be stateful. ASP.NET MVC is to web forms what WPF is to Win Forms. The Separated Presentation is more explicit for consumers of the web framework than for WPF...but as has been discussed MVVM is the CORE of WPF.
 
Looking at both perspectives, I feel that WPF is where it needs to be with regard to controls and pattern support. Could there be more? Sure but features aren't free. I'd prefer the time be spent improving the foundation (e.g. performance, airspace, better DirectShow integration) as only Microsoft can do.

Posted by Mike Brown | with no comments
Filed under: , ,

How to Convince Management to Clear Some Technical Debt

This is a common question I hear. The general sentiment expressed is “I want to do things the right way, but management won’t approve.” The person asking the question usually leaves out the details of what clearing out technical debt entails. Digging deeper, you usually find that the person wants to spend a few weeks cleaning up code. No one in their right mind would sign off on that.

“Sure Bill, we’re a month out from delivery but you’ve convinced me that it’s worth while to let you spend the next two weeks re-working existing code instead of adding new features to the system.”

Now Bill has grandiose schemes about building a rich domain layer using IOC and fluent interfaces with loosely coupled REST services and an event driven CQRS infrastructure. Once he gets that in place, he can start “refactoring” the old code to use the new super-duper framework. Then going forward, development will be so much faster!

[Two weeks later:] “Bill, show me what you’ve been working on, we’re really excited about the opportunities to speed up development this will bring.”

Bill shows his manager a basic O/RM that he built by hand because it would have taken too long to integrate one of the existing solutions. Unfortunately, it only works in a very specific scenario and relies on a direct mapping between properties on the class and columns on the database. He tries to show his manager how it works with a simple demo (he didn’t have time to do test driven development so he cant just show a test suite). And of course it crashes spectacularly.

“Oh, I forgot to check for IsDbNull for nullable columns.” Bill realizes he painted himself into a corner. “This will take a day or two to fix.”

“We don’t have a day or two, we need you working on features, the deadline is approaching.”

Frustrated because he was so close to getting everything working, Bill goes back to working on stories, lamenting that the work would be so much easier if his manager would just give him time to fix the framework.

If this sounds familiar to you, stop!

YOU’RE DOING IT WRONG

First of all, I think people get the wrong idea when they hear the term technical debt. Poorly written code is not technical debt, bad code is more like a technical slum. You know what I’m talking about:

  • Thousand line functions
  • God classes that do everything
  • Poorly named variables and functions
  • Five levels of if nesting
  • Feeping creaturitis
  • Pattern fever

If this is what you deal with on a daily basis, you don’t have technical debt, your code should be condemned. You’ve still got an impending deadline and more work to do, so throwing it out is not an option. But cleaning up as you go is. When writing code, Uncle Bob suggests that we follow the simple boy scout rule: Leave each campsite better than when you arrived. Our task when faced with unmanageable, hideous code is simple, clean up as we go along.

Take that one thousand line function that you need to comprehend in order to fix a bug. Instead of just trying to wedge the fix in there and pray that it works, cover the function with unit tests and refactor it into smaller methods. (Resharper’s extract method refactoring comes in very handy for this task.) At the very worst if you break something it will be a lot easier to isolate and track down the bug. Assuming you have successfully performed the refactoring, go ahead and write a unit test for the bug fix and make it go green. (This is the gist of Michael Feathers’ Working Effectively with Legacy Code).

But I have REAL Technical Debt

So you’ve been writing Clean Code with good unit test coverage and the like but haven’t been refactoring where appropriate? Well the same rules apply to you, except you might have a slightly easier path than the guy in the code slum. When you touch existing code for a bug fix or to add a feature, look at ways to make it better. If you have test coverage, you can refactor with impunity, before or after you make the change (just be sure to add tests for the new/changed functionality).

That’s Great but How Do I Get Approval

Plain and simple, you don’t. When a manager asks for your estimate for a task (you DO give input into how long a task will take? If not you have bigger problems than technical debt), make sure you take into account the time it will take to refactor/clean up the code you’ll be dealing with. No one is going to give you cart blanche to go on an architectural fiasco. But it should be expected that you are improving the code you work on instead of just sticking a finger in a leaky damn.

Inspiration for MVVM Unleashed

There are a number of timeless books that you’ll hear mentioned in technology circles. They are respected as treasure troves of information for the software craftsman looking to hone his skill. I have a confession to make. While I have referenced these books and discussed their ideas in conversations. Many of them I hadn’t taken time to read. There are a few that I had read cover to cover e.g. Gang of Four Design Patterns, Fowler’s Patterns of Enterprise Application Architecture (which I referenced heavily in my MSDN Article). And some that I had read enough to get a good understanding (Eric Evans Domain Driven Design). And still others that I flat out hadn’t read. Like Clean Code; Refactoring to Patterns; The Pragmatic Programmer; and Uncle Bob’s Principles, Patterns, and Practices. I took two weeks off at the end of 2010 and downloaded the last four to my Kindle (well I bought the physical edition of triple P because it’s not available on Kindle in either the Java or C# edition).

I started by reading the intros to all of the books and their first chapters. Then I honed in on Clean Code and Refactoring to Patterns since I feel that they harmonize well with the approach I’m taking with my book. I’ve finished Clean Code fully and am a quarter of the way through Refactoring to Patterns (taking copious notes using Kindle’s markup feature). I was pleasantly surprised to find that I had already internalized a lot of the ideas discussed in Clean Code. It was nevertheless enlightening because it made some of the lessons that I had learned more explicit.

My interest in Refactoring to Patterns came from my inference of what the book would be about from it’s title. It looks like Kerievsky followed the principle of least surprise in naming his book because right off the bat, he said exactly what I had been thinking and planning for MVVM Unleashed:

If you’d like to become a better software designer, studying the evolution of great software designs will be more valuable than studying the great designs themselves. For it is in the evolution that the real wisdom lies. The structures that result from the evolution can help you, but without knowing why they were evolved into a design, you’re more likely to misapply them or over-engineer with them on your next project.

Of course I highlighted that passage and made a comment about it. I’ve seen MVVM misused very tragically misused. I’ve seen countless cases of people saying that they don’t see the big benefit of MVVM. I’ve encountered misunderstandings of just what MVVM is and what it isn’t. The goal of my book is to impart the knowledge of MVVM, the associated patterns, and its benefits by helping my readers “discover” MVVM for themselves. It’s a lofty goal, but in my eyes it’s attainable. Of course I could just be swinging my sword at a windmill but time will tell.

More Posts Next page »