I’m Not Looking, But These Job Posts Just Suck

BEWARE:  This is the beginning of a rant.  If you’re temperamental it might piss you off.  You’ve been warned, prepare to have a bit of rant with reality thrown on top for good measure.

I’m not looking for another gig.  I’m extremely happy with what I’m doing right now.  The Russell Team I’m working with absolutely rocks!  On our worst days we kick ass and on our best we kick ass, take names, and build lots of software with value for the company and users.  We produce software, with reasonable timelines, timelines that we have input into, with good business proponents, solid technology, quality code, and generally sound process.  All this with strong overtones of Scrum influence ala from the Agile Manifesto.  People on the team actually KNOW and have READ the Agile Manifesto – which is AWESOME!!!!  🙂

So now that I’ve got that declaration out of the way I want to write a very serious rant to managers who have never read the manifesto and claim they use an “Agile Process” or “agile” or whatever.  This is a statement and rant to those companies that go recruiting for top tier people (and rarely get them) with horribly written job descriptions and practices.  So let’s get started, and the developers out there, let me know if you are annoyed by these practices too!  I’d love to get an ear full form anyone from any side of this equation.

If you use an Agile influenced process (notice I said influenced, because really there is no such thing as an Agile Process – it’s an ideal, kind of like freedom and liberty) nobody should be reading or printing things like;

  • Agile = Agile Principles U Agile Best Practice

    Agile = Agile Principles U Agile Best Practice

    “This project is being run using agile methodology.” < Really? Which one? That isn’t very descriptive. It’s kind of like me saying, “I like to eat food, the cooked kind, sometimes, cuz it’s good!”  Yeah, really! Dear oh dear. Translation: “I went to a management conference and somebody said that I HAVE to use agile methodologies or I’d be a failure.”

  • Yeah, It's In There Somewhere, The Piece That Will Bind the Meaning of this Description Request!!

    Yeah, It’s In There Somewhere, The Piece That Will Bind the Meaning of this Description Request!!

    “Good understanding of software design and concepts and patterns.” <  First things first, there are way to many ands in that sentence. Second, Which design, concept, and patterns?  Microsoft’s, Computer Science, or Agile Manifesto related concepts. This again is a very vague statement.  Kind of like stating, “We want someone to write software that can write software”. For real!  😮

  • “Experience using Visual Studio 2008 and the .NET Framework V4 with experience using Framework 3.5 with SQL Server.” WTF?!?!  Ok, you state you’re using the “agile process” but the first thing this does is prove you’ve probably broken the first manifesto point, people over tools. You’ve just declared tools, and in addition to that the tools are correlated incorrectly. Using SQL Server has ZERO to do with what .NET Framework you’re using. Using .NET 4 is almost identical to 3.5.  Declaring the version really isn’t necessary.  In addition, declaring a framework version with SQL Server would lead any decent developer to think that the project is already messed up since the tools description is correlating .NET 3.5 to SQL Server – which should make absolutely no difference.  Zero, Zilch, Nada!!!
  • “Familirarity with the basics of WPF, Silverlight, WCF, and Azure.” <- So every application in the universe is getting built?  This just adds to the confusion already generated by the oddball descriptions above. At this point a GOOD software developer would either stop reading and ignore the posting or be so curious as to why its screwed up they’d contact the recruiter or posting company. I know some developers that have literally contacted a company to ask, “what is being stated” in a job description.
  • “Awareness of Microsoft TSQL and database design principles.” <- Again, ok, but you already said SQL Server.  Maybe you mean some magical mystical unicorn generating SQL Server in that previous request and this is for just the SQL in the magical mystical unicorn SQL Service generating Unicorn TSQL Microsft TSQL Database Widget! Yeah, that’s it.
  • “Demonstrated ability to follow through with all tasks, promises, and committments.” <- Ok, I’ll admit, some places probably need to post this.  But when I see this, I’m putting my money on the idea the management probably sucks, and not a little bit but a whole lot. The other possibility is that the hiring staff have no idea how to communicate or infer if a person has basic abilities A company demanding the basic fealty of honesty and integrity in their employees in the job description something is SERIOUSLY wrong already.
  • Bad Communication Happening

    Bad Communication Happening

    “Ability to communicate and work effectively within priorities” <- Ok, with that previous demand of fealty and competence, this request right after is a HUGE read flag screaming that communication is most like NOT good in the environment the job is in.

  • Yeah, Do It, Do it RIGHT NOW!!!

    Yeah, Do It, Do it RIGHT NOW!!!

    “Ability to work under tight timelines in a fast-paced environment” <- Again, this completely throws out any concept of maintained velocity, a good agile understanding, or any hope that someone actually read or understands the Agile Manifesto and Principles. It also provides the hint that maybe, with a high likely hood, management is grasping at straws trying to keep things going in the right direction.

I wouldn’t be very likely to respond to this job entry if I was looking. Matter of fact I’d warn people (kind of like I’m doing with this blog entry). In my next entry I’ll provide some actual GOOD job descriptions and things that I would look for, if I were looking (which I’m not, as I’ve pointed out).

Frustrated...   looks like it.

Frustrated… looks like it.

…and don’t get confused, I’m not being a prima donna or demanding blue M & Ms only. I’m merely asking that people get their shit together and treat their prospective employees with some honesty and integrity also. Hiring practices leave a LOT to be desired in the world of the tech industry. They’re horribly inefficient from both perspectives.  It is hard to find people and hard to find good gigs that one can truly be happy with. I honestly feel though that getting this straightened out, if it is to be straightened out, is a better understanding on the hiring side and on maintaining a healthy, functional, and productive work environment.

Stay tuned, and I’ll have the “much closer to ideal” job posting ideas up here in the near future.  For now, I’m done ranting about this.

A Short Introduction to Windows Azure AppFabric

Windows Azure AppFabric is arguably the main feature set that truly sets Windows Azure apart from any cloud services on the market today. The AppFabric allows cloud users to hookup on-premises services to their cloud services, to secure cloud & on-premises services with new or existing security frameworks (identity based, active directory, or otherwise), cache Internet or other content, and on top of all that build out and enable composite application integration.

At the same time that Windows Azure AppFabric is one of the main features that sets Windows Azure apart from the competition, it is often one of the most misunderstood or unknown parts of the entire offering. In this chapter I’ll cover the main parts of the AppFabric including the service bus, access control, caching, integration, and patterns for integrating composite applications.

Home of Windows Azure AppFabric

The first thing to do in order to begin building with the Windows Azure AppFabric is to download the SDK, check out the various Windows Azure AppFabric Sites and familiarize yourself with what it is and how it works into the Windows Azure Platform.

The main web presence is located at http://www.microsoft.com/windowsazure/AppFabric/Overview/default.aspx

Windows Azure AppFabric Site

Windows Azure AppFabric Site

On the main site you will primarily find a marketing presence, but with links to many locations with useful architectural, development, and related technical information.  On the left hand side of the site there is a navigation bar that provides access to specific information describing the service bus, access control, and other features of the Windows Azure AppFabric.

The next major web presence that is extremely useful for Windows Azure AppFabric is the Windows Azure AppFabric Team Blob. It is located at http://blogs.msdn.com/b/windowsazureappfabric/. This site is regularly updated with development tips, patterns and practices, related MVP and Microsoft Enangelist links, updates on the SDK, CTPs, and other technical information.

The last major link that should be reviewed and checked often in relation to Windows Azure AppFabric Development is the Windows Azure AppFabric Developers’ Center located at http://msdn.microsoft.com/en-us/windowsazure/appfabric.aspx. Next to the blog, which often links to this page, this site is probably the most useful in relation to AppFabric Development. There are headlines, quick starts, and other documentation related to AppFabric Development with Ruby, Java, and other languages and technology stacks.

I don’t want to provide a direct link to the SDK. The reason is that Microsoft’s method for tracking and providing download links to SDKs, CTPs, and other related software often changes. The best way to find the current download location for the Windows Azure AppFabric SDK is to use a search engine and enter the keywords “Windows Azure AppFabric SDK” (click the link as I setup the search for you). The first links provided will get you to the current location to download the SDK & other related files discussed below.

As of the current v1.0 release of the SDK there are several downloads that are matched along with it for documentation and samples. There is also a specific WindowsAzureAppFabricSDK-x64.msi and a WindowsAzureAppFabricSDK-x86.msi.  Each of these are different and specific to the 32 or 64 bit architecture. Along with the SDK there is a v1.0 C# and Visual Basic file available for download that includes multiple examples of how Windows Azure AppFabric works. The last file that is included with the Windows Azure AppFabric download page is the WindowsAzureAppFabric.chm. This is simply a documentation file for the Windows Azure AppFabric SDK.

What Exactly is Windows Azure AppFabric?

Windows Azure AppFabric can be seen as the all encompassing fabric that interconnects on-premises solutions to Windows Azure solutions, and even Windows Azure solution to other solutions within the cloud. Windows Azure AppFabric is broken down into two main feature offerings simply called the service bus and access control. Some new features are coming online in the very near future; the main one I’ll discuss is the Windows Azure AppFabric Caching.

Windows Azure AppFabric

Windows Azure AppFabric

That’s all I have right now, and would love any feedback on things I should mention, discuss or otherwise add to this write up.  I’m thinking of using it as an intro to AppFabric in some of the pending presentations I have coming up.  So please throw in some feedback on what else you might like.  -thanks

Put Stuff in Your Windows Azure Junk Trunk – Windows Azure Worker Role and Storage Queue

Click on Part 1 and Part 2 of this series to review the previous examples and code.  First and foremost have the existing code base created in the other two examples opened and ready in Visual Studio 2010.  Next, I’ll just start rolling ASAP.

In the JunkTrunk.Storage Project add the following class file and code to the project. This will get us going for anything else we needed to do for the application from the queue perspective.

public class Queue : JunkTrunkBase
{
    public static void Add(CloudQueueMessage msg)
    {
        Queue.AddMessage(msg);
    }

    public static CloudQueueMessage GetNextMessage()
    {
        return Queue.PeekMessage() != null ? Queue.GetMessage() : null;
    }

    public static List<CloudQueueMessage> GetAllMessages()
    {
        var count = Queue.RetrieveApproximateMessageCount();
        return Queue.GetMessages(count).ToList();
    }

    public static void DeleteMessage(CloudQueueMessage msg)
    {
        Queue.DeleteMessage(msg);
    }
}

Once that is done open up the FileBlobManager.cs file in the Models directory of the JunkTrunk ASP.NET MVC Web Application. In the PutFile() Method add this line of code toward the very end of that method. The method, with the added line of code should look like this.

public void PutFile(BlobModel blobModel)
{
    var blobFileName = string.Format("{0}-{1}", DateTime.Now.ToString("yyyyMMdd"), blobModel.ResourceLocation);
    var blobUri = Blob.PutBlob(blobModel.BlobFile, blobFileName);

    Table.Add(
        new BlobMeta
            {
                Date = DateTime.Now,
                ResourceUri = blobUri,
                RowKey = Guid.NewGuid().ToString()
            });

    Queue.Add(new CloudQueueMessage(blobUri + "$" + blobFileName));
}

Now that we have something adding to the queue, we want to process this queue message. Open up the JunkTrunk.WorkerRole and make sure you have the following references in the project. Windows Azure References

Windows Azure References

Next create a new class file called PhotoProcessing.cs. First add a method to the class titled ThumbnailCallback with the following code.

public static bool ThumbnailCallback()
{
    return false;
}

Next add another method with a blobUri string and filename string as parameters. Then add the following code block to it.

private static void AddThumbnail(string blobUri, string fileName)
{
    try
    {
        var stream = Repository.Blob.GetBlob(blobUri);

        if (blobUri.EndsWith(".jpg"))
        {
            var image = Image.FromStream(stream);
            var myCallback = new Image.GetThumbnailImageAbort(ThumbnailCallback);
            var thumbnailImage = image.GetThumbnailImage(42, 32, myCallback, IntPtr.Zero);
            thumbnailImage.Save(stream, ImageFormat.Jpeg);
            Repository.Blob.PutBlob(stream, "thumbnail-" + fileName);
        }
        else
        {
            Repository.Blob.PutBlob(stream, fileName);
        }
    }
    catch (Exception ex)
    {
        Trace.WriteLine("Error", ex.ToString());
    }
}

Last method to add to the class is the Run() method.

public static void Run()
{
    var queueMessage = Repository.Queue.GetNextMessage();

    while (queueMessage != null)
    {
        var message = queueMessage.AsString.Split('$');
        if (message.Length == 2)
        {
            AddThumbnail(message[0], message[1]);
        }

        Repository.Queue.DeleteMessage(queueMessage);
        queueMessage = Repository.Queue.GetNextMessage();
    }
}

Now open up the WorkerRole.cs File and add the following code to the existing methods and add the additional even method below.

public override void Run()
{
    Trace.WriteLine("Junk Trunk Worker entry point called", "Information");

    while (true)
    {
        PhotoProcessing.Run();

        Thread.Sleep(60000);
        Trace.WriteLine("Working", "Junk Trunk Worker Role is active and running.");
    }
}

public override bool OnStart()
{
    ServicePointManager.DefaultConnectionLimit = 12;
    DiagnosticMonitor.Start("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString");
    RoleEnvironment.Changing += RoleEnvironmentChanging;

    CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
    {
        configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));
        RoleEnvironment.Changed += (sender, arg) =>
        {
            if (arg.Changes.OfType<RoleEnvironmentConfigurationSettingChange>()
                .Any((change) => (change.ConfigurationSettingName == configName)))
            {
                if (!configSetter(RoleEnvironment.GetConfigurationSettingValue(configName)))
                {
                    RoleEnvironment.RequestRecycle();
                }
            }
        };
    });

    Storage.JunkTrunkSetup.CreateContainersQueuesTables();

    return base.OnStart();
}

private static void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e)
{
    if (!e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange)) return;

    Trace.WriteLine("Working", "Environment Change: " + e.Changes.ToList());
    e.Cancel = true;
}

At this point everything needed to kick off photo processing using Windows Azure Storage Queue as the tracking mechanism is ready. I’ll be following up these blog entries with some additional entries regarding rafactoring and streamlining what we have going on. I might even go all out and add some more functionality or some such craziness! So hope that was helpful and keep reading. I’ll have more bits of rambling and other trouble coming down the blob pipeline soon! Cheers!

Egads! This Week Has Been a Complete Failure!!!

Aaaaaaggghhh!! I just want to scream. I can’t though because I’m still recovering from a crazy flu/cold/allergy attack like I’ve not had since I lived in the deep south were the pollen piles up so deep a black car looks yellow during season changes! The powdery mess would knock me out every other year when I was younger.

Well, here in Seattle, travelling down for the Agile Open Northwest Conference I at some point got nailed with the combo attack again. I’ve been out of commission and thus have failed to put together the entries I’d hoped for on Agile Open Northwest (#AONW from here on) and also didn’t meet my original release date of the 11th for my third in a series of Windows Azure Posts. Fear not, they’re on their way, all of em’. Even though I didn’t get to attend the later 2/3rd’s of #AONW I’m putting together what I’ve accrued from what attendance I did make and what my cohorts managed to put together.  Overall, the part I attended and the rest I hear about was awesome!  Will definitely be returning next year!!!

Again, thanks to Amtrak for getting me back swiftly and in one piece. (No fear, I wasn’t contagious, just beaten up by allergies!)