CodeBetter.Com
CodeBetter.Com
RSS 2.0 via Feedburner
           Do you Twitter? Follow us @CodeBetter

Jeffrey Palermo [MVP]

Software management consultant and CTO, Headspring Systems
  • Heard Mike Cohn speak at AgileAustin user group

    Today I had the pleasure of hearing Mike Cohn speak at an AgileAustin meeting. Below are some of my raw notes. I have not edited them. Just a brain dump of some of the presentation.

    - agile is all about continuous improvement
    - we cannot predict how an organization will respond to change.
    - We cannot plot an agile transition on a ghant chart.
    - When we break things apart to a small level, we sometimes lose sight of the whole
    - The steps necessary to become good at X cannot be enumerated and have them be correct for more than a single organization
    -

    Different mental model: CAS, Complex Adaptive System
    - many agents acting in parallel
    - Control is highly dispersed and decentralized
    - Overall system behavior is the result of a huge number of decisions made constantly by many agents

    Our organizations need to be networks, not a hierarchy

    Success:
    Newtonian: Success = closing the gab with the desired state and actual state

    CAS view: Success = achieving a good fit with the environment

    Agility is different for every company. We need to find how it fits with the environment.

    Vision should come from someone influential in the organization.
    - Local actions will be taken based on interpretation of the vision. Overall we can't predict local actions based on the communicated vision.

    CAS (agile) model of change:
    - Behavior is unpredictable and uncontrollable
    - Direction is determined through emergence and by many people
    - Every effect is also a cause
    - Relationships are empowering
    - Responsiveness to the environment is the measure of value
    - Decisions are based on patterns and tensions
    - Leaders are facilitators and supporters

    Traditional model of change
    - Behavior is predictable and controllable
    - Direction is determined by a few leaders
    - Every effect has a cause
    - Relationships are directive
    - Efficiency and reliability are measure of value
    - Decisions are based on facts and data
    - Leaders are experts and authorities

    ADAPT acronym
    - Awareness: Before an organization can change, the organization needs to be aware of the need to change. We have to be aware that what we are doing is not working as good as we would like it to work.
    - Desire to change
    - Ability to work in an agile manner
    - Promote early successes to build momentum and get others to follow
    - Transfer the impact of agile throughout the organization so that it sticks.

  • Registration now open for Party with Palermo: Tech Ed 2008 Developers edition

    If you are going to Tech Ed Developers, and you have a blog, add the badge below.  The Tech Ed party website is up.  Go RSVP now. 

    Party with Palermo is the place to be when you get in to town.  Meet up with your friends at Party with Palermo.  If you would like to sponsor, the information is there as well.  http://teched2008.partywithpalermo.com/ 

     

    Please add this badge to your website or blog to promote the event:

    Party with Palermo

  • Registration now open for Party with Palermo: DevTeach 2008 Toronto edition

    If you are going to DevTeach, and you have a blog, add the badge below.  The DevTeach party website is up.  Go RSVP now. 

    Party with Palermo is the official kick-off social event of DevTeach Toronto.  After the pre-con, the conference will move to Party with Palermo Monday night.

    If you would like to sponsor, the information is there as well.  http://devteach2008toronto.partywithpalermo.com/ 

     

    Please add this badge to your website or blog to promote the event:

    Party with Palermo

  • Alt.Net Attendees Video Posted

    Here is a 7-minute video of some Alt.Net attendees talking about why they came.

     

  • MvcContrib release now works with 4/16 MVC Framework drop

    MvcContrib is upgraded to account for the recent changes with the ASP.NET MVC Framework.  Eric Hexter has more details.

  • Video of Alt.Net Opening

    For those not at the Alt.Net Conference, here are videos of the opening.  I'm not a pro video guy, so there is a green bar across the bottom.


    Part 1

    Part 2

  • ASP.NET MVC Framework - new build available - source includes unit tests

    Just today, the MVC Framework team dropped the soure code refresh on its CodePlex workspace.  This includes a big controller base class refactoring along with other enhancements.

    A big deal, also, is that the source code drop now includes the unit tests!  That's awesome.  Great job Levi, Eilon, Phil and Rob!!

     

    Now we have some work to do to upgrade MvcContrib and CodeCampServer to the new drop. :-)

     

    The biggest deal is that controllers and actions are now more DRY and more SRP and much more testable because of the ActionResult that action methods now return.

     

    Keep in mind that the MVC Framework is still a work in progress so there are still many things that will change.

     

    I'll be reporting my findings with the new release, and from what I have found out this week at the MVP Summit, there are some big improvements.  I was also able to corner Phil Haack for a conversation, and when I started sharing my ideas, he was way ahead of me on almost all of them, so color me impressed.  Keep tabs at http://feeds.feedburner.com/jeffreypalermo

  • Finally trying out Twitter - we'll see how it goes.

    So after having a dormant Twitter account for a long time, I have finally found myself without a laptop, with a mobile phone, and with some 10 second increments in between things.

    So, here at the MVP Summit in Seattle, Washington, I've started to tweet, twoot, whatever it's called.  I'm twittering.

    You can waste you time reading them at http://twitter.com/jeffreypalermo

  • Action behavior using ASP.NET MVC and MvcContrib

    This post is a quick rundown of action method behaviors.  This will be halfway obsolete with the next MVC drop on codeplex, but here goes:

    You can download MvcContrib from http://mvccontrib.org.  The convention controller is there.  The ConventionController takes away nothing from System.Web.Mvc.Controller, but it adds some useful things on top.  My example controllers inherit from ConventionController.

    First, To get an action method to fire and run, just make it public.  Now it's web callable:

    public class TwitterController : ConventionController
    {
        public void SaveTweet(string tweet)
        {
            //integrate with twitter to do cool stuff.
            Response.Write("Wrote: " + tweet);
        }
    }

    If you run the above action with the default routes, you'll get the error:

    A public action method named 'Index' could not be found on the controller.

    To fix that, we can add MvcContrib.Attributes.DefaultActionAttribute and to to the url:  http://localhost:1308/twitter?tweet=howdy

     

    [DefaultAction]
    public void SaveTweet(string tweet)
    {
        //integrate with twitter to do cool stuff.
        Response.Write("Wrote: " + tweet);
    }

    And the output is:

    Wrote: howdy

     

    Now, what if I didn't want the SaveTweet method to be web-callable.  Perhaps it's a public method on a controller that isn't an action.  I can added System.Web.Mvc.NonActionAttribute, and I'll navigate to http://localhost:1308/twitter/savetweet?tweet=howdy.

     

    [NonAction]
    /twitter/savetweet?tweet=howdy.
    {
        //integrate with twitter to do cool stuff.
        Response.Write("Wrote: " + tweet);
    }

    Then I get the following error because now SaveTweet is not an action method:

    A public action method named 'savetweet' could not be found on the controller.

     

    Now, finally, if we look at the method name, we can see that SaveTweet(string tweet) is a non-repeatable action.  It has side effects.  It's pushing a tweet to twitter.  We probably don't want that to happen with a GET.  In other words, we don't want the mere act of navigating to /twitter/savetweet?tweet=howdy to cause a backend change in the system.  Because of this, it's reasonable to restrict this action to POSTs only.  We can do that by using the MvcContrib.Attributes.PostOnlyAttribute:

     

    [PostOnly]
    public void SaveTweet(string tweet)
    {
        //integrate with twitter to do cool stuff.
        Response.Write("Wrote: " + tweet);
    }

     

    If we attempt to run this with a GET, we'll see the following error:

    Action 'SaveTweet' can only be accessed using an HTTP Post.

     

    I've given a quick rundown of different ways to use action methods.  Note that the ASP.NET MVC Framework is still in flux, and things will still change dramatically.  I, and others, are expressing our constantly evolving understanding of how to use the ASP.NET MVC Framework as time goes on.  This understanding is expressed in the MvcContrib and CodeCampServer.  You can follow my understanding process on my feed at http://feeds.feedburner.com/jeffreypalermo.

    Also follow Phil Haack, who is a PM steering the evolution of the framework.

  • Project Manager needed for CodeCampServer open source project

    We have plenty of developers working on CodeCampServer, but we are in need of someone with the passion and time to manage the backlog, issues, and releases.  This is very important to have an organized project, so if you have interest in filling this role and you can commit to real time every week, please join the discussion list and volunteer.

  • Where you can find me this spring

    MVP Summit 2008:  Tomorrow I pray to God that American Airlines doesn't cancel my direct flight from Austin to Seattle for the 2008 MVP Summit where I will host another Party with Palermo.  As of this morning, over 220 have RSVPed for the party on April 13th at 7PM.  Eat supper before you come because the finger food will go fast!!  If you haven't RSVPed, please do so now so I have the best count possible.

    I'm also facilitating an open space session on Tuesday afternoon of the MVP Summit.  My accepted topic is:  "Why cheap developers are expensive and the unspoken quality variable."

    ALT.NET Seattle:  Next Friday and Saturday, I'll be attending the ALT.NET Conference in Seattle.  My goal will be to keep my mouth shut and absorb ideas from folks I don't have the benefit of being in constant contact.

    Agile Boot Camp:  April 3 - May 1, I'll be teaching another Agile Boot Camp, an agile developer training class put on by Headspring Systems.  There are still a few spots available.  Mike Palermo blogged about his experience at the March training.

    DevTeach Toronto: May 12th through 16th, I'll be speaking at DevTeach as well as throwing another Party with Palermo on the first day of the conference.  The RSVP site will go up right after the MVP Summit PwP.  I'll be speaking on software configuration management and the ASP.NET MVC Framework.

    Austin Code Camp 2008:  If I get back from DevTeach in time, I'll drop in to the Austin Code Camp hosted by the Austin .Net User Group.  I won't be speaking since I might not be back in time.

    AgileAustin Open Space:  I'm on the board of directors of the AgileAustin group, and we are holding our first conference on May 30, 31, and June1.  It's in Austin, TX, and you can see the website here.

    TechEd 2008 Developers:  Yes, I'll be throwing the biggest Party with Palermo of the year at TechEd 2008 Developers.  Last year saw 435 in attendance, so we'll see if we can break the fire code this year!  I have not set up the registration site yet, but it will go on www.partywithpalermo.com.  If you are interested in sponsoring this blowout bash, contact me at any time.  It's going to be huge!

    I'm also speaking at TechEd Devs.  Unfortunately, Doug Seven cancelled by Blackbelt Software Configuration Management breakout session in the development practices track because I don't use Team System.  I'm giving two talks in the Architecture track on architectural concerns of 1) the ASP.NET MVC Framework and 2) Object-Relational Mappers with examples using NHibernate.  See the list of sessions here.  There are 20 architecture track breakout sessions, so it's easy to find my 2.

    I'm also hosting a Birds of a Feather session of Agile Development with .Net.

    I'm looking forward to the summer when things settle down a bit so that I can devote more time to my book, ASP.NET MVC in Action with Manning.

    As always, you can subscribe to my feed at http://feeds.feedburner.com/jeffreypalermo

  • Austin Code Camp Call for Speakers, May 17, 2008

    The Austin Code Camp is ramping up and is looking for speakers.  Submit your sessions here.

    http://www.austincodecamp.com/

  • Agile Boot Camp for .Net developers: April 30-May 2 (spots available)

    On April 30th, 2008, I'll be teaching the 3rd class of the Agile Boot Camp.  This is an advanced course for .Net developers.  Students will learn about Agile, Scrum, Extreme Programming and will practice working as an agile team to extend an enterprise application using extreme programming engineering practices.

    Go to http://www.headspringsystems.com/training/ to get more details and to sign up.  Once it's full, it's full.  The course is also listed on the AgileAlliance events page.

    Here is what some of the past students are saying:

    "This was the best technical training course I've been to, period. No fluff here. The course was packed with information and best practices that I could start implementing immediately when I got back to work on Monday."
    Brad Mellen-Crandell
    Rapidparts Inc.

    "Jeff is an excellent teacher and practitioner of Agile principles and methods. His integration of open source tools to boost productivity will surely help me be more successful and confident in my daily working regimen."
    Ken Jackson
    Catapult Systems

    "A great start to Agile/XP development strategies and the tools needed to be successful at it!"
    Karthik Hariharan
    Telligent

    Some of the topics covered are:

    Domain Driven-Design

    • Test-Driven Development

    • Onion architecture

    • Inversion of Control

    • Resharper

    • Source control with Subversion

    • Pair programming

    • Refactoring

    • Build automation with NAnt and CCNet

    • Object-relational mapping with NHibernate

    • Automated unit and Integration testing

    • Interfaced-based programming

    • Team dynamics

    • Automated deployments

    • Redgate SQL Compare

    • SQL Profiler

    • Rhino Mocks

    • Separation of Concerns

    • Design patterns

  • Agile Coaching: The daily stand-up meeting

    I'm starting a new blog series based on my experiences doing agile coaching at clients.  Along with agile projects in .Net, my company also offers agile coaching and training.  Right now, the agile coaching practice consists of me, but I'm actively working on finding people to expand that practice.  I started doing this March 2007, and since then, I've seen some of the same patterns repeated in very different businesses.  In this series of posts, entitled "Agile Coaching", I'll talk about some of the common solutions to the common problems I'm finding.  This first installment is about a daily stand-up meeting.

    The daily stand-up meeting

    At several clients, I've seen developers who aren't co-located.  Many organizations value individual offices, and what I observed is that sometimes developer won't communicate much day-to-day.  Perhaps there is a weekly development meeting where folks report on status.  I attended one of these, and one developer reported spending the entire last week on a single blocking issue.  A whole week!  I recommended the instituting of a daily stand-up meeting immediately.  This would give a daily sync-up opportunity for the development team.  There are plenty of other things to improve, but a daily stand-up meeting is low-hanging fruit.  It is easy to implement and returns immediate gains.

    What is it?

    Every morning (I like 0830 or 0900), gather the development team in the same area.  That area could be a hallway, a meeting room or whatever space is available for standing.  No chairs allowed.  The meeting should be over in under 10 minutes.  The agenda:

    • What I accomplished yesterday
    • What I plan to accomplish today
    • What issues are blocking progress

    Every person in the development team reports on the three items to the rest of the team.  This is not a report to management or the coach/scrummaster/project manager.  This is so each person has a clear understanding of what is going on.  When issues are exposed early, others can help resolve them quickly.  I recommend this practice be used in every software organization. 

  • ASP.NET MVC: Goodbye SmartBag, Hello ViewDataExtensions

    A while back, I thought up the idea of the SmartBag, which has a very friendly API for working with viewdata objects.  With the December CTP, adding objects to ViewData was a bit difficult, but now that the ViewData property is an IDictionary on the Controller base class, getting objects in is very easy.  If you like this post, subscribe to my feed at http://feeds.feedburner.com/jeffreypalermo.

    Consider the following usage

    [Test]
    public void ShouldRetrieveSingleObjectByType()
    {
        var bag = new Dictionary<string, object>();
        var url = new Url("/asdf"); //arbitrary object
        bag.Add(url);
     
        Assert.That(bag.Get<Url>(), Is.EqualTo(url));
        Assert.That(bag.Get(typeof(Url)), Is.EqualTo(url));
    }

    We are adding a Url object to the dictionary, and then we can retrieve the object through the Get<T> method or by passing the type.  No need for a string key if only a single Url is in the dictionary.  If you have multiple Url objects, you can fall back to keys, or you can pass in a Url[] and then Get<Url[]>(). 

    In CodeCampServer, I've removed SmartBag and added these ViewDataExtensions.  These are extension methods to IDictionary<string, object> and System.Web.Mvc.ViewData.  In my opinion, System.Web.Mvc.ViewData should inherit from Dictionary<string, object>, so maybe that will happen in the next release.

    I've added ViewDataExtensions to MvcContrib, so you you'd like to use them, just build the trunk of MvcContrib, and you'll have them.  Look at CodeCampServer for widespread use of these extension methods.  Strongly typed views don't scale when the application complexity increases, but these view data extensions make working with the dictionary a snap.  My annoyance factor is very low with viewdata now.

    MvcContrib is a free, open-source project.  Feel free to use it and contribute patches to it.  Building it takes less than 1 minute on my box, and the build runs all 840 unit tests to verify the features continue to work.

More Posts Next page »

This Blog

Syndication