Getting Closer To The Fine Line In Software

My latest blog post touched on the fine line between no architecture and over architecture in software.  I talked a lot about technical debt and why it’s bad. I got some feedback and some were wondering exactly how do you find that fine line, so here are some suggestions for improving in order to get closer to that fine line.

There are a lot of factors to look at to find that ‘fine line’ between over architecture and no architecture.  If we are looking at a team, some questions to ask might be – How well is the team working together?  What are the team dynamics like?  Solid trust within the team?  Is the team focused on team goals and team wins or is it more or less individuals on the team looking more for personal glory or wins as a higher priority than the teams goals?  Or, does the team even have any team goals – is it strictly individual goals that are being strived for?  Are people afraid of their superiors and feel free to provide their own opinion even if it seems constructive in order to better achieve the right team solution?

Asking these questions can help narrow down if there are general team problems that are contributing to the software problems…

If it’s a team problem, I’d suggest starting improvements at that level.  Strategize some team building sessions, meet weekly to discuss and resolve any issues from the prior week (in agile environments, this would be done at the retrospective at the end of each sprint/iteration.). Get the team working together, setting goals together, and build a culture where the team is working together all the time.  People aren’t afraid to speak up and everybody is working together to improve because the only goals that are important are the team goals.  If the team wins, everybody wins, if the team loses everybody loses.  

The teams that are the most successful are the teams that work well together.  This creates a much bigger win than individuals working in silos would be able to do.  The result in software is much much improved software and less technical debt.  The same could be said for a sports team or a team of any nature.  

Ok, so that’s some basics around team stuff and sorting out team dysfunction.

Once that is sorted out you need to collectively create goals.  With mutual respect in place among team members, better architectural discussions can be had with everybody speaking up about the architecture and coding standards.  And do some pair programming as well :)…

Some say code reviews are ineffective and don’t work.  They do work, I’ve seen them work.  So, try code reviews.  A great way for the entire team to review and interact on existing code and talk about refactoring for future software updates.

Understand the business requirements as best as you can up front, ask the right questions, and get everyone on board with where the software is going.

One thing I’ve always done when thinking about what to include in an architecture is come up with a scenario where the said architecture or pattern will help solve a problem (problems could be barriers to implementation, complexity concerns, business use cases, etc) and think about how the architecture lends itself to that.  Look at the cost of implementing and maintaining the architecture and also the learning curve required versus the added value you are providing.  Sometimes, I’ll only partly implement a pattern or architecture just so it’s there and if I really need to fully implement it in the future, the refactoring is simplified to make it so.  This is to have a minimal affect on maintainability and over architecture as it creates a scenario where you can do the architecture up later when needed without mega refactoring.  

Also – try not to create lists, weighting scales, or pro and con arguments on paper or a white board in coming up with your design.  If you are solo just take some time out and really think about it, and talk to colleagues about it.  In a team, get the team together and pound it out.  Don’t analyze it to death though, it’s not worth the cost of that ;)

Have the architects create a vision and strategy and then discuss it with the entire team to come up with something even better. Implement it and continually review and adapt it as necessary.  Don’t have someone make an individual decision about an architecture or pattern and then leave it to the other developers to have to deal with it and the technical debt it could create. Always get team buy in for technical strategy.  

Someone at the Senior Architect level, by my standard, should surely know how to listen and communicate with the developers on these types of decisions in order to get the best possible outcome.

Technical Debt In Software – The Fine Line Between No Architecture and Over Architecture

As I am writing this, I am sitting on my condo’s terrace in downtown Toronto, baking in the sun while I take in the noise of the city and cars and people down below at the street level.  There is a helicopter that seems to be circling the downtown core for quite a while now.  It’s freaking hot today and I could probably use some water.  Be right back.

At the time of writing...

At the time of writing...

(1 minute later…)

Ok – water has been acquired….. I also grabbed a Kilkenny and poured it into my Kilkenny glass (Kilkenny requires the right glass to be enjoyed properly)

It’s been a while since I’ve posted, and career wise a lot of big and exciting changes have been made.  I made the move to independent consulting, and I am enjoying it big time!  Now my efforts are shifting from helping one organization develop bleeding edge scalable systems to helping many organizations with development, architecture, minimizing technical debt, and team building.

Along the lines of the type of work I’m focusing on, I want to write a bit about bad architecture, over architecture, and technical debt.

Ok, so I’m going to talk about the benefits of a “value added approach” to software.  I’ve seen a lot of systems in my day – ranging from poorly architected apps that deliver high amounts of business value to over architected systems that, instead of delivering their expected business value, became a total utter failure for a multitude of reasons… and everything between.

To the business, a successful system is typically one that delivers on it’s promises on value to the business.  The negative impact of technical debt is not always seen by the business teams and is sometimes seen, albeit indirectly, as “necessary”.  So, in these scenarios – why is it necessary?  is it job security for the dev team? Lack of training?  Lack of standards?  There could be a plethora of reasons, but in the end the technical debt introduced by these systems is high and could cost the organization millions of dollars.

High business value systems and mission critical systems can suffer from an endless amount of technical debt due to lack of design standards and architecture.  This technical debt is not always apparent to the senior business teams. The business loves the system however, but they sure don’t understand why it takes such a long time to add new features or track down bugs.  The business leaders at the top see the system as great too, but the fact that it’s overly fragile, requires daily maintenance and an overly large team just to support it seems somewhat necessary – plus it’s “just the way it is”, right?

The real deal here is that technical debt, and overly large dev support teams are just not necessary at all.  The right people, training, technical skills, system architecture, and business leaders have the potential to create the right systems and find that fine line between a proper development architecture and business value.

Yet, there is another extreme…..Over architecting and big ego’s….

People have ego’s… Fact of life .. When architecting a system, I’ve seen many software architects with an ego.  Their system is great, using all the right design patterns.. Look at how cool my undo system is with the command pattern implementation I came up with.  Watch how I can add one entry to the configuration file and all the sudden the entire behavior and business logic of the app can be changed… Our customers can now create their own custom modules using my handy dependency injection techniques and augment the app with their own fancy things they want to do…..  Pretty sweet eh?

I agree, ok it’s pretty sweet (and fun to work on) and I’ve seen and created my fair share of ‘coolness’ in my systems.  There are always business cases for these types of things and having the right technical team and abilities to implement them properly is key.  The problem is over architecting when they aren’t needed or for the dreaded reason ‘just in case in the future’.  The fact is, this can sometimes delay shipping the product and complicate the development.  There is typically a big disconnect between the development team and the business value in these scenarios.  You end up having a technical team who is more focused on architecting than on providing business value.  Focus on what’s needed, and if it is, and there is a case for having it… Build away and have fun!

Both of these scenarios above can lead to long term technical debt.  The trick in software is building a team who can leave their ego’s out of it, share knowledge of the system and the business value proposition, and focus on what’s important for the long term success of the project while minimizing technical debt.  Doing this has the potential to create phenomenal systems that are well architected, bugs become easy to track down, the system can grow organically the way it needs to, the size of the development team can remain minimal, and the business is happy knowing that maintenance costs are reduced and new features can be added to the system quickly.  There is no more fragility – the system becomes clear and small changes are less likely to have unexpected bad consequences.

There is a fine line between both of these scenarios and it requires practice and discipline to build the right team who can achieve and continually create well architected solutions that maximize business value and eliminate technical debt.  It can be done and can be done very successfully.  To truly master this as a software/business team, it needs to be instilled as part of the culture of the team.  The right leaders and people are very important in truly creating world class software solutions.

Event: Starting a Software Business, Dec 14 @ Gigs Grillhouse

On Tuesday, December 14, 2010.  The Canadian Information Processing Society is holding our holiday event.  Our featured speaker, Robert McCarter will be doing a talk on “Starting a Software Business”.  This promises to be a top notch event. 

Robert has been working on a phenomenal software application for the last several years and has started his own software company.  At this event he’ll explain why he decided to start the business, what was required, where he is at so far, and more. 

The event starts at 7pm and goes until 9pm.  The event is free for CIPS and PMI members.  The cost of the event for non-members is $10 at the door, but if you contact me through my blog, we’ll waive the admission – better yet, just mention this free admission promotion at the door, and we’ll waive the $10 admission fee.

Free appetizers and $200 worth of door prizes for this event!

Location: Gigs Grillhouse @ the corner of Talbot and Carling – London, Ontario

CIPS Flyer: http://local.cips.ca/london/pdfs/cips-london-poster-starting-a-software-business.pdf

Posted in Event. Tags: , . Leave a Comment »

Software Development, Mission Statements, Business Alignment, and Identifying the Job to Be Done

In my last blog post Software Development and Steven R. Covey on Leadership, I wrote about an interesting audio excerpt relating to IT departments and Software Development from Steven R. Coveys audiobook “Stephen R. Covey on Leadership: Great Leaders, Great Teams, Great Results” .

As an exercise, I put some of my own thoughts together while reflecting on some of my current and past projects.

Mission Statements

As Software Developers, instead of saying “Our job is to have world class technology” we could become much more specific on a project by project basis. There should be a specific mission statement for each solution: For example, a Part Inspection solution being developed for a large automotive manufacturing organization could have the following mission statement – which helps identify the job to be done: “Use technology to eliminate paperwork distribution on the shop floor and reduce the quantity of scrapped parts”.

A global Subject Matter Expert team of Software Developers that comes together to collaborate and help solve technical challenges within a large global organization needs a mission statement too so that every member of the team can truly understand how initiatives and ideas fit into the mission of the team. Amongst other things, ideas, initiatives, and discussions can be evaluated against the mission statement to ensure these are in alignment with it.

How are we aligned with the business?

Being aligned with the business is extremely important and all team members need to be aligned with the business in supporting the right goals. We need to understand the metrics used buy the organization to determine which goals are being achieved and what the objectives are. We should only exist to help the business achieve their objectives. This holds true for both employees and consultants and neither should lose sight of the goals of individual projects or the goals of the organization. It’s also important to understand how they fit together.

How do we identify the job to be done?

Working with the business, the users, and their current processes with or without the use of technology will help us identify how they are currently working and where innovation in technology will help.

Based on discussions, meetings, our own business knowledge, etc we get a good idea of what needs to be done technically. Depending on the project the team will have a combination of developers + project managers + architects and every team member needs to be aligned and understand the job to be done.

To identify the job to be done, we ask questions about how the technology will add value to the business to get an understanding of what specifically the problem is and how innovation in technology could remove the problem and really add business value. We need to understand how the solution has a big effect on the bottom line of the business, or more specifically, how it either increases profits or reduces expenses. It’s also important to see how not implementing a solution could pose its own negative consequences (ex: Mission critical legacy systems which lack vendor support). We need to remember that EBIT (earnings before interest and taxes) is the bottom line and it’s what is most important to the organization and therefore most important to us.

In Conclusion….

After reading this above post, I challenge the readers of my blog to share some of their own thoughts and opinions. If you wish to share you could either contact me directly to discuss, email me, or leave a comment on this blog page. Use the template below if you wish.

  1. Mission Statements
  2. How are we aligned with the business?
  3. How do we identify the job to be done?

Software Development and Steven R. Covey on Leadership

As part of my audible.com subscription I had the opportunity to listen to “Stephen R. Covey on Leadership: Great Leaders, Great Teams, Great Results” It’s a really good listen and has some very good ideas. I recommend purchasing it and listening to it in its entirety.

Specifically, I thought this excerpt of audio I took from the audiobook would be valuable to share with my blog readers as it is an example related to IT departments and specifically Software Development within an organization. Please find the audio excerpt here.

Take a listen (audio excerpt is attached) – it’s only a few minutes long. I also think it would be a good catalyst for future discussion.

Notes from the audio:

  • Adding bells and whistles with nothing to do with the needs of the users
  • Look at key jobs that technology is supposed to do
  • Instead of saying “Our job is to have world class technology” they might say “our job is to increase sales by 15% through proper use of our technology”
  • How does the company identify the job to be done?
  • To understand what features should go into the product Intuit would watch their customers installing and learning how to use the product. Have a conversation with the customer and watch what features they used. Get a better sense of how the software can even do a better job for those customers.
  • Went from 0% to 85% of the Software Small Business Market in 2 years. All the other vendors were focusing on improving functions that were irrelevant.
  • Identify the job to be done will influence the choices you make

In my follow up article, I’ve written my own thoughts on this subject – please continue reading at Software Development, Mission Statements, Business Alignment, and Identifying the Job to Be Done

Software Development At My Organization, An Article

I was asked if I would be willing to write an article for our organization’s newsletter. I didn’t mind. I’d like to share the newsletter article I wrote with the readers of my blog…

Software Development is an important piece of what is happening at Presstran every day.  You can see this by looking at the applications that are used and relied upon at Presstran every day, including, NCR, Weld Inspections, Part Manager, Production Sheet Scanning, Training, Lot Making (Kanban), and many others.  We are continually improving these systems as well as creating new solutions that add value and automate other areas within Presstran. 

Built on experience, we’re getting better at helping you solve problems by using technology.  Many of our projects we’ve developed for Presstran have also found their way to other divisions.  As part of this unified effort, I’m also championing a “Subject Matter Expert –  Software Architecture Team”.  We’re doing some exciting things.  Currently we have myself, and developers from the Cosma Group Office, Formet, Drive Automotive, Modatek, Presstec, and Integram participating.  We’re coming up with standards and guidance for software development within Cosma.

We try hard to make sure there is a solid ROI for any software project that we take on and therefore we do an upfront analysis of requests to change existing software, add new features, or create entirely new applications.  We have a Unified Development Process that we follow to determine the process we take in regards to implementing a new solution.   The Unified Development Process was developed by the Cosma Group Office with participation and review from Cosma International (and Magna) divisions, including Presstran.  It follows industry accepted guidelines along with the realities and culture of our business.

In determining which projects or requests will have the highest priority we look at a number of factors.  Typically the higher priority requests have the following attributes:

  • A clear business stakeholder who understands the request from the business standpoint, and who will take responsibility for the request from a business perspective
  • Built on top of a defined business process that is properly defined and working successfully
  • Request clearly indicates how the proposed solution solves the problem
  • The proposed solution will have a solid ROI (Return on Investment)
  • The request uses technology to make things easier, save time, or add capabilities that were previously unavailable

Although it’s important to look at the projected ROI of a project at the beginning stages of a project, it’s also important for us to audit the results of a completed project.  Routinely we will contact project stakeholders to get an understanding of how well a solution we’ve implemented is working for them or to understand the actual value being realized in the completed project.  Sometimes there are clear indicators that allow us to successfully measure how successful a project implementation has been and the value added.  Other times it’s difficult to measure, but it’s something we’re trying to get better at. 

Dan Douglas

Notes From DevTeach Toronto 2010

I attended DevTeach Toronto 2010 in early March and have found some time to finally summarize my notes. There is certainly value in being able to network with other developers in the community and learn from some of the top people in the industry who are speaking on many different developer related subjects. I tend to write a lot down while attending these kinds of events. I have about 34 pages of notes and chicken scratch written down, and after reviewing them I decided to summarize them and take the most memorable and useful points I jotted down and put them together in a blog post. Along with the 3 days of sessions in which I mostly attended the sessions in the Software Architecture track, I also attended a pre-conference workshop on Agile Application Architecture. Many of the concepts and ideas in the training I was already familiar with but I will still include them here to further emphasize their importance.

You can download my summarized notes by clicking the following link: http://dandouglas.files.wordpress.com/2010/04/devteach.doc

Measuring the Time Saved When Reusing a Well Architected Component

A well architected component is easy to develop given the right technical knowledge, practice, skill, and motivation to do the right thing.  I’m taking a practical example of a component I developed recently, described in the blog post titled Getting to the Monetary Value of Software Architecture.  Relatively speaking this component wasn’t complex to develop, but it did require some trial and error and some clever thinking to perfect it.  Development of this component took just over 4 hours to complete – and contains 80+ lines of code (that’s code, not including comments or blank lines), and once it was complete we could apply and reuse this functionality in various places with extreme simplicity.  Actually, with only one line of code!!  That’s the power of simplicity and reusability.  See the actual code for the component here: Class to Add Instant ‘As You Type’ Filter Functionality to Infragistics UltraCombo Control

In a recent blog post, I talked about the monetization of well architected solutions.  Here I am going to put some hard values against it.  I used the following variables to come up with the data to put into the chart.

Initial development time required: 240 mins

Time required to duplicate this functionality once (non architected solution): 15 mins (assuming the user is somewhat familiar with the code and is copying and pasting) – I would comfortably say it could take 30 mins for someone who isn’t quite sure how the code worked to begin with and therefore not knowing exactly which code is required to be copied – this would double the blue time line as shown on the char below.

Time required to duplicate this functionality once (well architected solution): 1 min  (it’s literally one line of code!)

These numbers were taken from the time it took to actually do the implementation several time.  The 15 mins value required to duplicate the functionality for the non architected solution was derived from practicing a copy and paste scenario to integrate code to add the functionality required. 

image

This does not account for the extra effort required in the future to maintain the code or make updates and enhancements.  With the well architected component you have to make an update somewhere in 80 lines of code to fix a bug or add an enhancement.  In the non architected version, you would be making a change within (80 x N) lines of code where N is the number of implementations.  Let’s say 10 – so we’ve got 800 lines of this code that essentially do the same thing over again that need to be looked at to make a code change!  Plus all of the other application code intertwined within it that you have to ignore.

This is just one example!  There are great architectures all over the place and we all (mostly) know how valuable they are.  Other than just saying “Yeah, they save tons of time..”, I’m here putting some hard values against it. 

This is one scenario, but there are many more scenarios that save even more time – I’d even say, exponentially save more time!

Class to Add Instant ‘As You Type’ Filter Functionality to Infragistics UltraCombo Control

In my last blog post, I talked about a filter enhancement to a ComboBox that could be added to a single combo box with just one line of code. The blog post wasn’t necessarily to talk about the code, but was to talk about a good architecture and the importance of a good architecture for a system or application.

The filter component follows a sound architectural strategy as it is something that we could write once and easily reuse many times. Please see the blog post about the architecture here: Getting to the Monetary Value of Software Architecture

This post will focus on the actual class that was created in order to allow us to have this functionality.
The code was designed for WinForms Infragistics UltraCombo controls (v6.2 CLR2.0). These controls are multi column drop down lists, essentially. We’re using this control and not the native WinForms ComboBox because of the multi column ability. In this organization, we use a lot of Infragistics controls, but there are other vendors who make very good controls as well.

Before (without filter functionality):
image

After (with new filter functionality enabled):
image

(Some information in screen shots above is blurred out to protect customer confidentiality)

As the user is typing into the UltraCombo control the list filters based on what they are typing. In the example above the user has typed in ’007′, so the list shows any items that have ’007′ somewhere in the value. As the user is typing in order to filter, a filter icon is displayed in the UltraCombo. All of this functionality is encapsulated in the UltraComboTypeFilter class.

Here is the code for the UltraComboTypeFilter class that will give any UltraCombo control this functionality:

''' <summary>
''' Class is used to encapsulate functionality to allow user to type into 
''' ultra combo drop down and have the list display and filter the list as 
''' the user types 
''' Dan Douglas Mar 5, 2010 http://dandouglas.wordpress.com
''' </summary>
''' <remarks></remarks>
Public Class UltraComboTypeFilter
    Dim UltraComboControl As Infragistics.Win.UltraWinGrid.UltraCombo
    Dim KeyColumn As String
    Dim _FilterImage As Image

    ''' <summary>
    ''' Create a new instance of the UltraComboTypeFilter class
    ''' </summary>
    ''' <param name="UltraCombo">The Infragistics UltraComboBox control to apply the filter functionality to</param>
    ''' <param name="ColumnToFilter">The key of the column you want to be searched for filtering</param>
    ''' <remarks></remarks>
    Public Sub New(ByVal UltraCombo As Infragistics.Win.UltraWinGrid.UltraCombo, ByVal ColumnToFilter As String)
  
UltraComboControl = UltraCombo

        'Add handlers so that the methods in this class can handle the events from the control
        AddHandler UltraComboControl.KeyUp, AddressOf ucbo_KeyUp
        AddHandler UltraComboControl.AfterCloseUp, AddressOf ucbo_AfterCloseUp
        AddHandler UltraComboControl.TextChanged, AddressOf ucbo_TextChanged
        AddHandler UltraComboControl.BeforeDropDown, AddressOf ucbo_BeforeDropDown

        KeyColumn = ColumnToFilter

        FilterImage = My.Resources.FilterIcon() 'the filter icon is storred as an embedded resource in the resource file

        'turn off automatic value completion as it can potentially interfere at times with the search/filter functionality
        UltraComboControl.AutoEdit = False

        HideFilterIcon()
        UltraComboControl.Appearance.ImageHAlign = Infragistics.Win.HAlign.Right 'filter icon will be always displayed on the right side of the text area of the control

        ClearCustomPartFilter() 'by default, clear filters
    End Sub

    Private Sub ShowFilterIcon()
        'add the filter icon to the ComboBox
        UltraComboControl.Appearance.Image = FilterImage
    End Sub

    Private Sub HideFilterIcon()
        UltraComboControl.Appearance.Image = Nothing
    End Sub

    Private Sub ucbo_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs)
        If Trim(UltraComboControl.Text) = "" Then
            ClearCustomPartFilter() 'if there are no characters in the textbox (from dropdown) then remove filters
        End If
    End Sub

    Private Sub ClearCustomPartFilter()
        'clear any filters if they exist 
        UltraComboControl.DisplayLayout.Bands(0).ColumnFilters.ClearAllFilters()
        HideFilterIcon()
    End Sub

    Private Sub DoPartDropDownFilter()
        UltraComboControl.DisplayLayout.Bands(0).ColumnFilters.ClearAllFilters()
        UltraComboControl.DisplayLayout.Bands(0).ColumnFilters(KeyColumn).FilterConditions.Add(Infragistics.Win.UltraWinGrid.FilterComparisionOperator.Like, "*" & UltraComboControl.Text & "*")
        ShowFilterIcon()
    End Sub

    Private Sub ucbo_BeforeDropDown(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs)
        'clear any filters if they exist before the user drops down the list, if the user starts typing again - filter will be shown
        'this is done so that if the user leaves the combo box and then goes back to it and drops down the list the full list will be 
        'there until they start typing a filter again; this is by design
        ClearCustomPartFilter()
    End Sub

    Private Sub ucbo_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        'the code in this method is to start the filtering process to filter the drop down list if the drop down isn't 'dropped'
        'with thi procedure the user can just start typing into the combo box and have the box drop down automatically and filter
        'KeyPress event is not used because of timing issues - the timing of the event is too late for us to filter properly

        'Do not do filter or drop down if user hits ESC - also we will check other non entry keys like Left, Right, etc)
        ''Array of keys that we won't do anything with

        Dim IgnoreKeys As New List(Of Integer)
        IgnoreKeys.Add(Keys.Left)
        IgnoreKeys.Add(Keys.Right)
        IgnoreKeys.Add(Keys.Up)
        IgnoreKeys.Add(Keys.Down)
        IgnoreKeys.Add(Keys.Escape)
        IgnoreKeys.Add(Keys.Enter)

        If IgnoreKeys.Contains(e.KeyCode) = False Then
            'if inputted key press is valid for drop down filtering
            Dim iSelLoc As Integer = UltraComboControl.Textbox.SelectionStart 'get location of cursor
            If UltraComboControl.IsDroppedDown = False Then
                UltraComboControl.ToggleDropdown()
                'toggling drop down causes all text to be highlighted so we will deselect it and put the cursor position back where it was instead of being at 0
                UltraComboControl.Textbox.SelectionLength = 0
                UltraComboControl.Textbox.SelectionStart = iSelLoc
            End If

            DoPartDropDownFilter()
        End If

    End Sub

    ''' <summary>
    ''' The image to use for the filter icon shown on the control to be displayed while the control is filtered
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property FilterImage() As Image
        Get
            Return _FilterImage
        End Get
        Set(ByVal value As Image)
            _FilterImage = value
        End Set
    End Property

    Private Sub ucbo_AfterCloseUp(ByVal sender As Object, ByVal e As System.EventArgs)
        ClearCustomPartFilter()
    End Sub

    Protected Overrides Sub Finalize()
        RemoveHandler UltraComboControl.KeyUp, AddressOf ucbo_KeyUp
        RemoveHandler UltraComboControl.AfterCloseUp, AddressOf ucbo_AfterCloseUp
        RemoveHandler UltraComboControl.TextChanged, AddressOf ucbo_TextChanged
        RemoveHandler UltraComboControl.BeforeDropDown, AddressOf ucbo_BeforeDropDown
        MyBase.Finalize()
    End Sub
End Class

Now, to enable the functionality on any UltraCombo control just use one single line of code.

Dim PartFilterFunction As New UltraComboTypeFilter(ucboPart, "CustPartNo")

Add the filter icon/image as a resource to the project that contains the UltraComboTypeFilter class and name the resource FilterIcon.

Getting to the Monetary Value of Software Architecture

Software Architecture is a huge topic and it’s something I am passionate about. I believe, and can prove, that continuous improvement in this area will contribute to overall better system design, faster bug tracking and fixing, reduced maintenance time, faster development time, developer happiness, quicker time to market, and allowing you to allocate more time to keep up to date on the newest technology – to name just a few things….

Now, translate this into the Bottom Line of the Business….

  • Faster ROI for software projects
  • Reduced Downtime
  • Faster time to market for new features
  • Reduced labour costs on software projects where the additional labour can be put towards additional stages of the project or other areas
  • Bottom Line -> Reduced Costs, Greater Profits

Let me share a case in point that compliments this theory nicely along with details to indicate the higher monetary value of the well architected solution …..

I’m going to discuss a feature we added to an existing project and how it was implemented using a sound architectural strategy. This is just a small piece, an enhancement really, to an existing system that has been well architected.  

We developed a solution to allow users to search and filter a combo box while typing into the text area of the combo. This allowed users to find what they were looking for faster. The before and after scenarios are contrasted below…

Before:

User had to know the complete item name in the list of potentially thousands of items and carefully scroll through the list to find the item.

image

After:

Users only need to know part of the item name that they are looking for and just have to type it into the ComboBox to filter. This is an incredibly quick and easy feature for the user and eliminates time required for them to scroll through the list. As an added feature, a little filter icon is shown in the combo box to denote that the combo box list is only showing items that match the filter criteria.

image

(Note: Some data has been blurred to keep certain customer information confidential)

As you can see above, the user just types in ‘007’ which is the suffix to the part they were looking for in the list. This enabled them to quickly find what they were looking for; in this case, only one part had that specific suffix. In this case, there are over 240 items in the drop down list that the user would have to navigate through to find what they were looking for if this filter functionality was not in place.

Implementation Scenarios

I could have implemented this in many ways, but I decided on an architecture that would allow me to reuse this functionality many times over with little effort. I created a class that encapsulated all of the functionality required for the filter functionality to work. This approach requires no additional filter specific code in the main application. With this new class (about 64 lines of new code), I can create a new instance of it in any project and have instant and seamless filter/search functionality for any Combo Box.

It’s now literally one line of code to add this functionality (essentially 64 lines worth of functionality) to any of our ComboBoxes. You could loosely (very loosely) say that your productivity is increased by 64 times when implementing this filter functionality in any new scenario using this approach. However, read further and I’ll cover a more accurate metric.

I’ll contrast this implementation scenario with another very common scenario:

clip_image006User: “This application is great, but man it sure is hard to find the information I need sometimes – especially when I only know the suffix to the part I am looking for”

clip_image008 Developer: “I have a great idea, let me add filter functionality for you to search your list and find what you need. “

clip_image009User: “That sounds great! That’ll save me a ton of time!”

The developer opens the project and finds the Combo Box he is going to add the filter functionality to and starts coding away by handling the events of the Combo Box, adding code to various places, debugging, and a few hours later he has something that works pretty well. He/she does a bit more testing, fixes some bugs, makes a few changes, and here we have something that seems to be perfected.

The change is rolled into production and the users LOVE it! They can think of how useful it would be to have this functionality on a few more Combo Boxes.

(this is where it all goes wrong)

The developer goes to add this functionality to a few more Combo Boxes. For each combo box the developer is doing the following:

1) Find all the code in another area of the application that has the filter combo box functionality and copy it …. (“Where is all the code I need?  Grrr – which pieces of it do I need again?”)

2) Paste it into the code module in another area of the application where the new functionality is needed

3) Look through all of the code and replace control names, key strings, and other variables with the ones we want to use for this instance

4) Test everything to make sure we aren’t missing anything

5) Ooops, something is not working right – maybe I forgot to copy something or change a value somewhere?

6) Ahh found it, I didn’t handle one of the events of the Combo Box properly and this was causing all kinds of problems

7) Copy and paste this piece of it

8) Code has been added in various places to support this new functionality, I need to do some serious integration testing to make sure I didn’t screw something else up

9) Ok, finally, everything is a go – let me post this.

Now the user wants the functionality in a few more places. The developer finds this tedious, but continues to do it this way for each combo box. This is tedious and time consuming and introduces more opportunity for bugs due code integrated into multiple places and tightly coupled within the system; due to time constraints it becomes tougher to introduce this functionality in too many additional areas.

With the well architected solution we get the following direct benefits that we would not see in the above scenario:

  • Write once, reuse many times – easily!
  • Effort does not need to be repeated for each place we want to use this functionality
  • Changes to functionality are made in the Class and bug fixes and enhancements do not need to be manually replicated for as many times as the functionality has been implemented
  • Code is refined, tested, and encapsulated from the rest of the project and from the ComboBox itself
  • Test Driven Development is supported as the idea is to de-couple the functionality from the system so that it can be reused – this decoupling makes it easy to write automated tests if necessary
  • Testing of the main components limits any re-testing required because the code is always the exact same code and not just copied and re-integrated from place to place


How can we put a monetary value on this?

Now, add up the time it took to create, test, and debug the initial filter component and get it working once. This is your Y value.

Now, add up the time it takes to copy the functionality to one more area as per the steps listed above and multiply that by the number of times you need to duplicate the functionality. This is your X value.

Now, come up with a number as to how many places could benefit from this new introduced functionality. This is your N value.

Now, add up the time it takes to add one line of code to a project to enable this filter functionality on an additional Combo Box. This is your Z value.

Cost of a well architected approach to implement: Time = Y + (N x Z)

Non architected solution: Time = Y + (N x X)

This just shows the initial up front cost savings. Take the other benefits into account, as listed above, and you can see a much higher monetary value.

To Add Insult To Injury…..

Now, wouldn’t it be great if we could have the filter search all of the columns for the combo box instead of just the one. We could just add a new option to the class to allow that or enable it by default for all ComboBox’s using the filter. Let’s hope they are all using this architecture – I don’t know a developer who would enjoy going back and modifying (or adding) the code for every combo box so that it can support this extra functionality. Unfortunately, in that scenario you’ll have added unnecessary labour cost to the project to get this additional functionality or the functionality just wouldn’t be added and the feature set of the system would suffer.

In a follow up blog post, I’ll actually discuss the code used and the approach taken with the code for this solution in particular. I will however share, in this blog post, the one line of code required to duplicate this functionality (64 lines of dispersed code, reduced to 1):

Dim partfilter As New UltraComboTypeFilter(ucboPart, “PartNo”)

IT Training and Justification

As IT professionals we need to be continually up to speed on new technology and continually striving to become masters of existing technology.  It doesn’t matter if you are a developer, systems analyst, business analyst, IT architect, whatever – to be at the top of our game we need to continually challenge ourselves in new ways and continually add to our skill set.  IT professionals learn things every day – we learn by doing, reading articles, writing blog posts, talking to peers, attending community events, classroom training, online training, etc.  Sometimes there is a huge benefit to attend a professional training class that could be anywhere from a day long to five days long. 

It’s easy for IT professionals to “know” that we require training in a certain area – sometimes it takes some time to think about how we can actually justify the training.  If you or your company are paying for the training you might want to make sure that the training will be beneficial and valuable and, if someone else is paying for it, communicate the potential value or ROI of the training.  This will take some thinking, but it’s a good exercise none the less.   Think that training costs are easily between $2,000 to $5,000 (or more in some cases) a week for the training + travel and accommodations if required. 

I came up with a quick template that could be used to justify training – weather you plan on justifying it verbally or on paper to whoever is approving the training this kind of template may help.  Of course, if you only need to justify it to yourself then you wouldn’t need this – or if the person signing the checks is ‘easy’ then you may not need this either ;)  Of course, I would never expect someone to just copy this template and fill in the blanks (unless you are a mindless drone) – it’s not meant to be a formal letter either, but just meant to give an idea of the type of ammo to bring with you if you are trying to justify training for yourself or your team.

The {length of training} {course name} training program being held at {location/building} focuses on creating the proper architecture of software solutions and familiarizes us with creating architectures for newer technology.  Continuous training in the area of Software Architecture will allow us to be able to better architect and develop our solutions for {Company Name}.  Solutions with a great and solid architecture have fewer bugs and allow features and improvements to be added with ease and with less time.  The advantages of this have been seen with {explain how value has been added to an existing project due to past training or knowledge in the specific area you are seeking training – try to include real numbers and hard values if possible}.  This ease of integration freed our time to focus on the core functionality of {Reference same project as above} rather than building all of the pieces from scratch.

As new technologies emerge we need to be able to take advantage of them in order to continually create better systems with a minimal learning curve.  This training will allow us to make better decisions on the use of technology in our solutions and gives us a better understanding of the best way to implement the technology to meet both current and long term objectives.  Better decisions up front when building a solution means less time and money required to initially develop the solution, add features, and expand functionality.

Toronto WinMoDevCamp Coming November 11, 2009

Anthony Bartolo from Microsoft asked if I’d help spread the word about the Toronto WinMoDevCamp coming to Mississauga on November 11, 2009.  It’s free Windows Mobile development training, and it’s hosted by Microsoft.  
 
It looks like a fantastic event! 

 image002 
 
 

Learn about Windows Mobile Development at WinMoDevCamp Toronto – November 11, 2009 

Interested in learning how easy it is to build applications for Windows Mobile? Want to know more about getting your app in the Windows Mobile Marketplace?

 

WinMoDevCamp is a series of not-for-profit gatherings to develop applications for the newly released Microsoft Windows Phone 6.5 O/S. Attendees will include mobile developers, web developers, .Net Developers, UI designers, testers, device manufactures and Canadian Carriers, all working together. Development projects will include both solo and team efforts. While some attendees will wish to work solo during the event, we encourage attendees to team up, based on expertise, to work in ad-hoc project development teams. All attendees should be prepared to work on a development project during the event.

  • Create new applications for the Windows Mobile Platform.
  • Meet and work side-by-side with team members from the
  • Microsoft Mobile Developer Experience team.
  • Gain assistance in migrating existing mobile applications from the iPhone, Blackberry and Palm Pre to the Windows Mobile Platform.
  • Create applications to support Windows Enterprise Applications.
  • Interact with Canadian Wireless Carrier representatives
    (Bell, Telus, Rogers & WIND)

Many thanks to the Microsoft Mobile Developer Experience team for their support in making these events happen! I want to specifically thank Loke Uei, Senior Technical Project Manager on the Microsoft Mobile Developer Experience team for not hesitating in giving his full support to the community.  Register here: http://bit.ly/3E7Emm.

 This Just In!

—————————————————————–

Gentlemen,
 
Also I just announce three Call of Duty Prize give-a-ways (One is the complete XBOX 360 Modern Warfare Console) for WinMoDevCamp Toronto.  I have posted details on my blog here:
 
http://wirelesslyobsessed.com/2009/11/10/winmodevcamp-toronto-call-of-duty-modern-warfare-2-give-a-way/

Screencast: A ‘Hello World’ Example of .NET Reflection in Action

As part of my presentation at the October 2009 London .NET User Group event on .NET Attributes and Reflection (see: http://dandouglas.wordpress.com/2009/10/25/my-talk-titled-net-attributes-and-reflection-what-a-developer-needs-to-know/ ) i did a walkthrough on how to use .NET reflection.

This demonstration walks you through the source code of creating a late-bound instance of a class from an assembly that was instantiated using reflection methods.  Once we have the instance of the class created we use reflection again to call one of its methods.

Click this link to view the screencast recording from the presentation:  http://www.screencast.com/t/XtlsjQCldFR

I do not yet have the source code available to download because wordpress.com doesn’t allow me to post a .zip file.  Once I find another location to post it, I will share the link.  In the meantime feel free to contact me for it.

Dan

Screencast: Redgate .NET Reflector Demo From My Last Presentation

In a follow up to my last post, I talked about Redgate’s .NET Reflector during my presentation at the London .NET User Group event last week (see: http://dandouglas.wordpress.com/2009/10/25/my-talk-titled-net-attributes-and-reflection-what-a-developer-needs-to-know/ )

I recorded the entire presentation using Camtasia Studio, but here is just a snippet from the presentation. A small piece about Redgate .NET Reflector and a little demo on how to use it and how it works.

Check out the screencast here:

http://www.screencast.com/t/e300Ok5eh7

The volume is a little low at the beginning because I was using my laptop mic as the audio input and I had walked away from the laptop while presenting the slide.  Once I got into the demo, I was right at my laptop so the audio quality is much better.

Dan

My Talk Titled, “.NET Attributes and Reflection – what a developer needs to know……”

On October 19, 2009, the first official meeting of the London .NET User Group met at Fanshawe College.  There were at least 45 people attending!  Great job Tony

Including my presentation, we also had a presentation on ASP.NET MVC and the featured presentation by Rob Labbe from Microsoft (security consultant from the ACE team) on Web Threats and how to Mitigate them.  Rob is a fantastic speaker and really captivated the audience. 

My presentation ran about 22 minutes including a couple of Q and A’s.  Here’s the link to the PowerPoint as well as the source code I used for the live example of .NET reflection in action.

http://dandouglas.files.wordpress.com/2009/10/dotnet-reflection-oct-2009-fcdnug.pptx

Here are the live recordings (screencasts) of the 2 demos I did during the presentation:

Using .NET Reflection In Code Demo  http://dandouglas.wordpress.com/2009/10/25/screencast-a-hello-world-example-of-net-reflection-in-action/

Redgate .NET Reflector Demo   http://dandouglas.wordpress.com/2009/10/25/redgate-net-reflector-demo-from-my-last-presentation/

Here’s a link to the write up of the event on the user group home page.  It includes a few pictures as well. http://www.forestcityasp.net/post/2009/10/21/Hack-And-Defend-Session.aspx

Hmm – well I was about to upload the .zip file for the source code of the reflection example I walked through as part of the presentation, but unfortunately wordpress.com doesn’t allow me to upload zip files.  :(  I’ll try and figure out an alternative place to upload them.  If anyone wants them in the meantime just let me know and I’’ll arrange to send the samples to you.

Also, as of today I’ve joined the Executive Committee for the London .NET User Group.  I’m looking forward to it!

My Video Interview From TechDays Toronto 2009 (SharePoint and BI)

On the final day of TechDays 2009 in Toronto, I was interviewed by It in Canada (http://www.itincanada.ca) about my experience at TechDays and specifically about one of the sessions involving BI and SharePoint.  I’d like to share the link to the interview.  It was completely ad-hoc and they caught me at the end of the day, and after asking me a few questions about my experience at TechDays they asked me if I’d like to do an interview. 

It’s part of something called “The Efficiency Platform” and is sponsored by Microsoft.

You can get to the video from the main site by scrolling to the bottom of the page.  They have a little sub site there at the bottom where you can scroll through the videos.  Mine is listed as SharePoint with Dan Douglas

This direct link also works to direct straight to the video with no bells and whistles. 

http://www.qmpmedia.com/tv/itvideo.php?vid=130&ser=itc&sor=1&cat=

Near the end of the video the background noise really seemed to pick up, so you might need to adjust the volume to hear everything properly at the end.

Screen shot from the site:

image

Dan

My Experience With the VS 2008 Documentation…..

I was using Visual Studio today, like I do most days J, and I wanted context sensitive help. I thought, maybe I’ll try it – I haven’t used it in a while and I know Document Explorer 2008 is installed as well (this is a newly built Win 7 development box). I remember the value of the MSDN Library back in the VB 6 days, but as we got into VS.NET, VS.NET 2003 and so on, it seemed the MSDN Library took a wrong turn somewhere. It was slow and typically gave us pretty irelevant infrmation.

So, I was looking for help on a .NET method I was planning on using (I don’t recall the exact method) and I clicked on F1 to bring up help in the MSDN Library. I knew the .NET MSDN Library files were not installed, but I set the MSDN Library to look online first for content. I figured this should work ok without having to install the files locally as it was looking online. Wrong! “Information Not Found!” L Crap…..

So, I thought – meh – I’ll just suck it up and install the entire .NET MSDN library to my hard drive. After installing a couple gigs of data to my hard drive I was ready to roll…. I thought….

I wanted to take it for a trial run, so I started selecting code in the Visual Studio editor and pressing the F1 key. I selected Add from the Data Dictionary object of the Exception class hoping that it would be accurate and give me context help on the IDictionary.Add method.

To my disgust :), I got help for some Add method in the Office API L

Grrr. After trying a few more and noticing I was getting completely irrelevant results, I thought I must be missing something.

I tried it again, and in this example I left the carot on Add but didn’t highlight the text and then clicked F1.

Presto! Well not quite, because the documentation gave me results for Silverlight for some reason – but hey – it’s pretty close!

 

L

What I Learned At TechDays 2009 Toronto! Part 3

This will be my last post in my Tech Days 2009 blog post “series” or “trilogy?”.  I just finished soldering some wires for my car stereo – I can listen to my iPod in my car again :) … Now, I figured I could score a few minutes (well much more than that) of free time while supper is cooking, so here we go with my last update on my experience at Tech Days 2009 in Toronto.

In a quick update to yesterday’s posting What I Learned At TechDays 2009 Toronto! Part 2 Business Intelligence where I talked about the BI session and how useful the session was to me.  Today, I’ve started going through Analysis Services and Integration Services in more detail than I ever had before.  As already planned, an Analysis Services and Integration Services implementation will be a part of our SQL Server 2008 migration (migrating from SQL Server 2000).  I’m currently setting up some proof of concept Analysis Services projects in our SQL Server 2008 test environment that will allow me to demonstrate the power of Business Intelligence to our power users.

Before I had attended this session at TechDays I was aware of these services as well as Microsoft’s BI option in general.  I’ve dabbled in it before and have watched demos and played around with it, but now I have a renewed interest in this – especially since we have some great projects in the works where strong Business Intelligence will be a powerful addition. 

Ok, so on with the new.  As continued from my previous postings, I want to briefly discuss a few more of the sessions I attended at TechDays 2009 Toronto.

 

3. C# Advanced Features

 

In the “Going From 0 to 100 Dollars Per Hour with the .NET you never knew” session, I had the opportunity to see explanations and examples of advanced C# language features.  The presenters did a great job in explaining the content, and I definitely learned a few things.  Some of the features that were discussed such as Best Practices for Exception Handling and Generics, I already am taking advantage of and using quite often.  I’ve found generics to be extremely powerful and really can add a lot of value to the architecture of an application.  One interesting point that came up was that “Exceptions are for exceptional errors, not for process flow”.  Although I agree with this, I have (once or twice), by design, had my data layer or facade layer raise it’s own custom exception that signified that, for example, a duplicate entry was being added and told the UI to “change course” and notify the user that this is not allowed.  I didn’t (and still don’t) see any real harm in this :). 

Some other things discussed in this session are things that would be useful in some scenarios and can contribute to a great architecture, but you just need to know when and how they should be used in cases where they will add value.  Let me briefly mention these things along with the big “take-aways” I took from each item. 

  • Anonymous Methods – Keeping method concerns from leaking into class interface – don’t use for repeatable logic
  • Lambdas – Not for anything re-usable; like an anonymous method on steroids
  • Extension Methods – Add behaviour to types without modifying types -  Good for string manipulation, enumerations
  • LINQ To Objects – The SQL of Collections
  • Closures – Powerful way of creating delegate with context

 

4. Team System

The “Database Change Management with Team System” session was important, because I think (like us) there are many people using Team System (and TFS) that are not using it effectively.  At the beginning of the session, the question was asked “How many people in the room have a good change management process?” – no one in the room raised their hand – and the room was packed! 

We’ve been using Team System and Team Foundation Server for years, and it’s a big improvement from Visual Source Safe; we are familiar with work items and bug tracking, etc, but we still aren’t getting the best value out of it.  This session explained various important features that would be valuable to our organization. 

  • Branching – This is probably one of the biggest areas we could add value to.  We don’t currently branch effectively and with TFS you can branch and merge quite well.
  • Managing Change Sets
  • Work Items
  • Classifications
  • Build Automation

The ideas presented in this session will be useful in improving our processes around Team System.

5. Layering

I’m all about layering really.  I’ve done a few presentations on layering, but in the “Layers – The Secret Language of Architects” session I learned about some new things as well.  By the way, the title of this session holds true, in my opinion – layering is one of the fundamental cores in software development that an application architect should understand.  This session, by Adam Dymitruk along with John Bristowe, touched on some new topics for me, including, MVVM (Model-View-View-Model) which has been recently introduced by Microsoft but is not yet standardized.  This session also touched on the following topics (ASP.NET MVC, Domain Model, Design by Contract, Domain Driven Design, and more).  Domain Driven Design really interests me and I am in the process of learning much more about it.

It was also strongly recommended that you check out MSMQ as it is very useful for message queuing.  This is something I’ve used a little bit and I will agree can be pretty valuable.

This was a great session as it introduced different layering models and design patterns used for an application architecture. 

So, that wraps up the top 5 sessions (in no particular order) that I attended from TechDays 2009 Toronto.  If anyone reading this has any comments on any of the three articles I would welcome them very much.  I’d also welcome any comments on how I could improve this type of blog posting in the future.

 

(I know I left some names out – credit to many of the points listed above goes to the individuals presenting the content – I am hoping to get names to fill in more of the details about the individuals doing the presentations – I didn’t write them all down)

 

Dan

What I Learned At TechDays 2009 Toronto! Part 2 Business Intelligence

In follow up to my last article What I Learned At TechDays 2009 Toronto! Part 1 Windows Mobile 6.5, in this article I will talk about the session I attended on BI. 

At the end of the final day of the event, I was video-interviewed by ITInCanada.com about my thoughts on TechDays 2009 Toronto and my specific thoughts about what I took away from the session on BI.  The interview required some quick thinking, but I feel I did well for an impromptu 3-minute interview.  The point I made at the end of the interview, that I’d like to re-iterate is that when attending an event like this it’s important to really think about the sessions in terms of value to the organization – and how you can use the information and advice to bring value back to your organization.  When I get the link to the video I will post it on my blog. 

Ok, so I’d like to move on with more of my “take-aways” from TechDays 2009 Toronto –

2. Business Intelligence

I took a lot out of the  “Using Microsoft Dashboards, Scorecards, and Analytics to Monitor the Health of your IT Infrastructure” session, and for me, it was probably one of the most valuable sessions I attended at TechDays this year.  It focused on Micorosft’s BI offering, and also used practical examples of using BI for monitoring the health of your IT infrastructure (as repeated from the title of the session :))

I feel there is a large amount of value for good Business Intelligence, especially in my current organization (a global automotive parts manufacturer).  We have some power users that can do incredible things with Excel as is, but they’ve also become incredibly reliant on IT to provide them with all kinds of custom reports, graphs, etc.  I’ve seen the work they can do with data analysis and charting data in Excel, and if we empowered them to take advantage of data, that lets say we make available through Analysis Services, they would have a plethora of data at their disposal to easily consume, chart, and analyze in Excel or other tools.  This would take strain off of IT development in providing reports along with many custom reporting options and allow users to create, share, and manipulate the exact data reports and charts they need.  We have a global corporate intranet hosted at our head office that is SharePoint based that would be a perfect location for users to manage and share this content that they create.

The demos in this session were great.  I got a good look at how to use Excel 2007 to analyze analytical data from Analysis Services.  It was literally drag and drop, point and click, to embed and aggregate this data in excel as a chart or table. 

There was a lot more to this session as well, and it dug pretty deep into using Integration Services, Analysis Services, Cube Design, Star Schema, Data Source Views, Fact Tables, SharePoint, PerformancePoint Server, etc – each of these technologies can contribute to making a BI solution work!

 

- to be continued -

What I Learned At TechDays 2009 Toronto! Part 1 Windows Mobile 6.5

TechDays Toronto 2009 wrapped up nicely on Wednesday, and I’ve finally had a chance to go through and review my pages and pages of notes (writing, diagrams, and chicken scratch).  I learned a lot at this event, and I’m planning on blogging a few posts over the next few days about it.  I find that just by blogging and thinking about the things I wrote down at the event helps me to retain a lot more than I would have otherwise, and it gives me another opportunity to think about these topics more deeply.

Ok – before I get to the sessions, let me start with lunch –> Lunch the 1st day was satisfactory at best, but lunch redeemed itself on the second day with the Chicken Salad Sandwich.  There were some booths and tables set up outside the lunch area demoing products and other things, but I didn’t see much there for developers – albeit I gave it a quick “twice-over” and didn’t look too deeply at any of the tables.

The power of Twitter!  I’ve been able to get involved with the TechDays twitter conversation with the tag #TechDays_ca – this was a powerful way to connect with many people attending the event and also many of the speakers and organizers.  I’d recommend to anybody to hit up the Twitter bandwagon.  I use TweetDeck to manage my tweets and twitter conversations.

So, in no particular order, I want to talk about some of the top things I learned and that interested me the most….. Let me start with the Windows Mobile Session…..

1.Windows Mobile 6.5

 In the “Taking Your Application on the Road with Windows Mobile Software” session, Mark Arteaga and Anthony Bartolo did a presentation on Windows Mobile 6.5 development and the Windows Mobile Marketplace.  This was a session I was really looking forward to, and it didn’t disappoint.  I have done some mobile development as it relates to the manufacturing environment that’s mostly related to data collecting, bar code scanning, etc.  I’ve done some interesting things around queuing to local SQL databases when the server is unavailable and things like that.  However, in this session Marc explained things in Windows mobile 6.5 that were just completely cool, but not only cool – practical demos and applications were also discussed.  The potential with Windows Mobile 6.5 is really exciting.

Let me summarize the key points, from my notes, that were most interesting to me:

Fake GPS

  • Used for development of GPS enabled applications
  • Emulates a physical GPS
  • Uses a text file for reading raw GPS data

Cellular Emulator

  • Integrate with Pocket Outlook (contacts, email, SMS, appointments, tasks)
  • In the development environment (Visual Studio .NET)
  • Send phone calls to the emulated phone
  • Send SMS messages

Windows Mobile Marketplace

  • Launch to coincide with the release of Windows Mobile 6.5
  • A market place for developers to sell their applications to Windows mobile users (my impression is that it will be similar to the app store on the iPod)
  • Developers get 70% of money for the purchase of the software by consumers.  Microsoft gets 30% which goes directly into the infrastructure of the Marketplace

WM 6.5 & Misc

  • Full IE browser with the same capabilities as the desktop browser (Note: This is a huge feature in my opinion.  I’m a Windows Mobile user and the browser is very limited.  Although I hear positive things about Opera, my experience with is has left me wanting to go back to Pocket IE)
  • Gestures (I can see these touch gestures being useful and allowing the developer to create better mobile apps with native gestures built in for flipping, panning, etc)
  • Widgets – similar to gadgets available in Windows XP
  • System state – trapping phone calls, SMS, media player song information, etc
  • Accelerometer available on certain devices – Unified Sensor API is available on codeplex
  • GSensor – Shake and Drop detection

Although I don’t see the new features having a big impact right now on the type of mobile application development that I’m currently involved with on the shop floor, there is definitely potential in the future as more device manufacturers provide hardware that is compatible with the latest Windows Mobile OS.  The move to include a full IE browser, as I understand it, will give the mobile device the same IE functionality as with a desktop PC, but I don’t believe that this functionality will take away from the types of applications that are currently developed natively for Windows Mobile (versus running in a browser) using .NET, C++, etc…. but in the realm of mobile browser based applications this is a huge step forward.  It also guarantees that any existing website should work on the mobile browser – however, if it is not customized for the mobile screen display resolution it may not look correctly or will require you to pan and scan the page. 

I do see a huge impact for mobile development in the areas outside the shop floor environment with Windows Mobile 6.5.  For anybody interested in (or currently) developing mobile applications on the .NET framework, WM 6.5 is very promising.  Based on what I’ve seen, the quality of available applications should be increased with WM 6.5, and time to market from development to production will likely be able to decrease due to the addition of new native functionality.

At the end of the session they gave away Rock Band Beatles Edition to the winner of an audience competition where audience members got up in front of everyone to describe the mobile application they’ve been working on.  Cool!

To be continued – I will post again shortly about some more things I learned at TechDays Toronto 2009. 

 

Dan

Follow

Get every new post delivered to your Inbox.