Monday, May 10, 2010

Component Switching Follow up

As I noted in my last post, I had switched component vendors. So far I'm quite happy with DevExpress and the tools I purchased. But I would be remiss if I didn't mention the follow up from Telerik. As I mentioned in my earlier post, the sales rep from Telerik wanted what amounted to a 2500 word essay. I was contacted by Brandon Strange the Customer Advocate Manager for Telerik. He stated that the original requirement was for 200 to 300 words total and that the sales rep had misstated the requirements. In addition he said they would evaluate this requirement in the future on a case by case basis. I think it was great that they should reach out like this to potential customers. Telerik is big enough that they could have blown my comments of and that would have been the end of the story. They didn't and that is very important. Also to make up for lost business, Telerik provide me with a complimentary license, now I have two great sets of components.

The flip side of course is the vendor I left after nearly 9 years of business. I know based on the traffic reports for this blog that Infragistics has in fact visited over a dozen times since my post. Yet they have not made any attempt to contact me and attempt to win my business back or even find out why I chose another vendor. That is poor customer relations in its most simple form. If you don't value you customers enough to engage with them, you should close your doors and sell of your assets. I for one will never recommend them, where in the past I would have. Instead I'd recommend DevExpress and Telerik because they take the time to listen and engage and provide quality tools.

Thursday, April 29, 2010

Switching from Infragistics to DevExpress

I have been an Infragistics customer for a number of years; as a matter of fact it's been over 9 years since I purchased my first controls from them. Recently though I've become quite unhappy with my experience with their products. Over the years they went from having a great set of UI tools to having one of the most complicated and useless sets of tools. Let me elaborate on what I mean; let's take the ASP.NET components for example. These components come in two flavors, 3.5 and 2.0; a lot of the functionality is similar if not the same. Yet they are not interchangeable. If you add a 3.5 component and then choose to add a 2.0 component your application will break in new and unusual ways. To fix this takes some time and manual intervention on the developer's part. I also have an issue with their increasing use of the nickel and dime sales approach. When the introduce a new product line , Data Visualization for example you'll get the first barely functional release for free, but then to maintain and get updates, you'll be forced to pay for version 2. At the end of the day, this just causes frustration and headache and unnecessary expense.

Since this is an out of pocket expense, I started with some simple criteria that I used to evaluate the competition.

  1. What does the toolset contain and the core quality and functionality of the tools?
  2. How responsive is support to inquiries and requests?
  3. How often is the product updated and new functionality added and does it cost extra?
  4. How responsive is sales to inquires?
  5. Do they offer upgrade pricing?
  6. Do they offer flexible Product Licensing?

Armed with this criteria is set out to evaluate the competition. I looked at a fair number of tool sets but, many of them didn't meet the first criteria, so that left me with two, Telerik and DevExpress.

Telerik has a decent suite of tools which I had used in the past and they meet all of the criteria except for the upgrade pricing. They wanted an essay 300 – 500 words for 7 questions, a minimum of 2100 words, about why you're leaving the other vendor in order to qualify for a competitive upgrade. This in my opinion is completely absurd. First since this was a personal purchase, I shouldn't also have to elaborate on why, if they don't want new customers then don't advertise upgrades. Secondly my time is valuable; I shouldn't have to justify my decision in writing.

So that left DevExpress. To be honest, I have used Code Rush and Refactor Pro for almost two years and have been completely satisfied with the sales and support from DevExpress. The tool set is fantastic so far, a really positive change from the hassles I encountered with Infragisitics. They have a complete set of ASP.NET (a single set) WPF, Silverlight, Windows Forms and Reporting. All of the products are easy to use and look great. The only real issue is documentation, which they have indicated is being updated, but asking a question in the forum yielded an almost instant, accurate, response. So I'm now using DevExpress going forward and I have some really exciting UI ideas to try out.

Monday, April 12, 2010

Microsoft burps another launch

VS2010 and SQL Server 2008 R2 are available to MSDN subscribers. But you'll be better off to wait. Apparently they once again failed to estimate the bandwidth requirements. Attempting to download will just lead to frustration as the transfer client continually tries to connect, then pops some obscure missing info message. Even after taking MSDN downloads over the weekend to "do maintenance".

Follow up 12:05 PM MST, it looks like they have the Akami download manager up and working. So downloads should be smoother

Thursday, March 25, 2010

Top 10 reasons to migrate to Visual Studio 2010

The release of Visual Studio 2010 is just weeks away and if your organization is typical, they will take a wait and see upgrade approach. Visual Studio 2010 has so many great productivity enhancements that it makes no sense to wait. The problem is most of the decision makers will not have had much exposure to make an informed decision so here are 10 reasons why you should upgrade immediately.

  1. Multi-Targeting support. Many of us have code in multiple .Net versions and many of spend time switching between Visual studio versions. Visual Studio 2010 greatly enhances multi – targeting between 2.0, 3.0, 3.5 and 4.0. In addition VS2010 can be installed side by side with Visual Studio 2003.
  2. Call Hierarchy. If you've ever spent hours staring at a complex piece of legacy code trying determining calls made from it of finding callers to it the Call Hierarchy tool will solve your problems. Select the method in question and it will map all the calls from and to the method.
  3. Zoom. What else can I say zooming in the editor is a great feature for working with just a single block of code or if you have old tired eyes.
  4. Navigate To. Rather than using Find All Navigate to allows you to search on types and filters the list while you type you can then jump directly to the code you're looking for.
  5. Highlight References. Selecting a reference highlight all instances in the method or class allowing you to quickly navigate between them.
  6. Improved Intellisense. Intellisense now has partial string matching as well as consume first mode.
  7. Add Reference Improvements. Anyone whose added references in earlier versions know how painfully slow it was to load. Now it loads asynchronously and starts at the "Projects" tab.
  8. Break point improvements. Break points can now be labeled, imported and exported allowing you to save break point setups and even share them with team members.
  9. Expanded Code Generation. Visual Studio 2010 expands the create method stub functionality allowing you to create classes, enums, structs and interfaces.
  10. WPF Editor. What else can you say? WPF comes of age in Visual Studio 2010, the font clarity and responsiveness of the editor will make you drool.

These 10 items are the tip of the iceberg when it comes to Visual Studio, there is some much more that greatly enhances developer productivity. Waiting to migrate to Visual Studio 2010 is like waiting until the 4th of July to open last year's Christmas presents, there is no reason to wait.

 

Monday, February 8, 2010

Visual Studio 2010 RC

Visual Studio 2010 RC is available to MSDN subscribers here. General availability is set for the 10th of February. The RC includes a "Go Live License" and upgrade from RC to RTM.

Saturday, February 6, 2010

Things keep changing

It's obviously been a while since the last post. In that time I've changed jobs, not by choice, but definitely for the better. My previous employer had an issue managing cash flow and like many other companies, cried recession and let go some of the best talent in the organization. Interestingly enough it appears that all of the development staff including myself found employment within just a few days.

So the past couple of months have been about integrating into a new organization and attempting to become a contributor as quickly as possible. One of the things that irritate me when changing jobs is that you have to completely reestablish yourself. This is an issue that I never dealt with in my military career.

I'll be continuing the workflow series shortly, as Microsoft is set to release VS2010 RC, so I'll pick up with that release so stay tuned.

Monday, November 2, 2009

Workflow foundation 4.0 part 4

It’s taken a while to get to this point but based on the changes in beta 2 of Visual Studio 2010 and the .Net Framework 4.0 it was probably prudent to wait.

There are a number of changes in beta 2, for one the designer has been revised again. Also there is only a single workflow. To create the the different workflows, sequence or flow chart, you start by dragging the appropriate activity container onto the design surface. The tool box has also been reorganized. The different components are organized by functionality.

In this post, I’m going to build a simple console workflow to read RSS feeds, in future posts I’ll enable WCF communications and workflow persistence. This workflow will read any number of feeds passed in as a workflow argument and returns the results from the workflow instance to the console.

To get started, open Visual Studio and create a new Workflow console application named RSSReaderWorkflow. You can change the name of the workflow to anything you like or leave it as is. I renamed the workflow to ReaderWorkflow for this project. One thing to note, you may have to open the workflow in xml mode to change the class name. The designer seems to pass this by when you rename from the solution explorer.



Now we need to a couple of container classes. The first, RSSFeeds contains a list of feed uri’s. This is the list of feeds read.

using System;
using System.Collections.Generic;


namespace RSSReaderWorkflow
{
public class RSSFeeds
{
public List<Uri> Feeds { get; set; }
}
}
 
 The second class we need to add is the RSSItem class. This class will contain the news items from the rss feeds that we read.

 
using System;

namespace RSSReaderWorkflow
{
public class RSSItem
{
public string Title { get; set; }

public string Link { get; set; }

public string Description { get; set; }
}
}




With that out of the way, drag a sequence activity from Control Flow section of the tool box. This is going to be a simple sequence workflow, so this activity serves as the container for the other activities we’ll add.


Next we’ll add two arguments one of the input named RssFeeds which is a type of RSSFeeds and is required.



The second argument is an out argument and will be a list of RSSItem. This will contain our feed results which we will display to the console.





Next drag an If activity from the tool box, we’ll add a condition to check that we have at least one feed to read.





Next in the else side of the if activity, we’ll add a throw activity. This activity will throw an argument out of range exception if the feeds count is zero.





Next we need to add a new code activity to read the feeds an populate the results. From the solution explorer right click –> add new item and select workflow and Code activity. Since we want to return the results of the rss feeds we’ll need to derive from TResult and add a bit of code. Here is the ReadFeedActivity class.






using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Activities;
using System.Xml.Linq;

namespace RSSReaderWorkflow
{

public sealed class ReadFeedActivity : CodeActivity<List<RSSItem>>
{
// Define an activity input argument of type string
public InArgument<List<Uri>> FeedUri { get; set; }


// If your activity returns a value, derive from CodeActivity<TResult>
// and return the value from the Execute method.
protected override List<RSSItem> Execute(CodeActivityContext context)
{
List<RSSItem> results = new List<RSSItem>();

foreach (var f in FeedUri.Get(context))
{
XDocument doc = XDocument.Load(f.ToString(), LoadOptions.None);
results.AddRange( (from i in doc.Descendants("channel").Elements("item")
select new RSSItem()
{
Title = i.Element("title").Value,
Link = i.Element("link").Value,
Description = i.Element("description").Value
}).ToList());
}
// Obtain the runtime value of the Text input argument
return results;
}
}
}
 
Now Build the project and the new activity will be avaliable in the tool box. You can simply drag it to the if activity.


 

 Set the FeedUri Property to the RssFeeds.Feeds argument property.







Set the Result to the Results output argument property.



Now we need to update the main. It will create and pass in the the feeds and display the results.


class Program
{
static void Main(string[] args)
{
// set up a list of input feeds
Dictionary<string,object> wfArgs = new Dictionary<string,object>();

// the workflow is expecting a feed list object
RSSFeeds list = new RSSFeeds()
{
Feeds = new List<Uri>()
{
//usa today
new Uri("http://rssfeeds.usatoday.com/usatoday-NewsTopStories"),
//cnn
new Uri("http://rss.cnn.com/rss/cnn_topstories.rss")
}
};
// add the input to the args dictionary
wfArgs.Add("RssFeeds",list);


try
{
// the workflow will return a dictionary with the rss items
IDictionary<string, object> wfResults = WorkflowInvoker.Invoke(new ReaderWorkflow(), wfArgs);

// loop through the keys
foreach (var item in wfResults)
{
// cast the value as an RSSItem list
List<RSSItem> res = item.Value as List<RSSItem>;

// display the results
res.ForEach(i => Console.WriteLine(i.Title));

}
}
catch(ArgumentOutOfRangeException e) // if you comment out the feeds, you can watch the throw in acction
{
Console.WriteLine(e.Message);
}

Console.Read();
}
}



Now we have a simple workflow that reads RSS feeds.