Ellie Potvin – Rest High on that Mountain


Having a child that fought cancer and walked very close to the edge of the cliff changed our family forever. Fortunately, our dear Miranda walked through the fire and made it out of the other side of the valley. Below are two pictures. The first is from the first month of her treatment and the second from last Christmas:

MirandaTreatment MirandaChristmas

In the United States, 80% of childhood cancer patients survive. Through our journey, however, we have met more of those who did not. At first, I was really surprised by this, as the numbers did not work out. Then I found that the majority of the survivors are leukemia patients (primarily Acute Lymphoblastic Leukemia or ALL) and spend most of their time after the initial visit at home, only visiting the hospital when they get really sick with their counts bottomed out. The hospital is for the patients with really bad cancer (as if you can ever call it good).

Tiffany has decided to get together a group of 46 women to shave their heads for childhood cancer this September. The idea being that raising awareness also raises funding for a cure (less than 1% off the American Cancer Society budget currently goes to childhood cancer). I have reached out to families trying to give them hope and possibly lead them to complementary treatments to help their children get through the cancer treatment.

Today, one of the children we have followed for years earned her wings (a childhood cancer euphemism for passing away). We have watched the Potvins go through the throws of completing treatment, finding their dear Ellie had relapsed, go through even stronger treatments, and ultimately reach out for other options when the doctors said there was nothing more they could do.

That is the clinical side, but Ellie was not a patient, she was a lovely little girl. Below is a picture of Ellie, vibrant and full of life.
Ellie Potvin

A pictures paints a thousand words and the next picture had my heart yesterday:

EllieScan

The black on the scan is the part of her lungs not overcome by Rhabdomyosarcoma tumors. When I saw this, I knew that only God’s intervention would stop me from reading the following words soon.

Wednesday, June 23, 2010 11:42 AM, EDT
Ellie gained her angel wings at 11:35am and rest in my arms.

You can read her Caring Bridge journal at http://www.caringbridge.org/visit/elliepotvin/journal. This is a sad day for those of us who have followed Ellie’s battle. I find myself driven to tears, even knowing I would likely read this news soon.

I would like to say rest in peace, but in the words of Mimi Avery on Facebook (mother to Julian Avery, aka King Juju, who earned his wings in January 2008):

"Rest in Peace " is for old people, children should NOT be resting , they should be healthy, running ,jumping , swinging, climbing, skipping, winning and losing games of soccer, football or hockey, painting, kissing us every single day. RIP is not for kids… Just saying…

I dream of a day when kids no longer have cancer. I pray it is not just a dream.

Peace and Grace,
Greg

Twitter: @gbworld

The Dangers of Refusing to Shift Paradigms and Other Development Mistakes


I was examining some old code I still had on a hard drive and it made me think of this topic. This post can also be applied to some recent assignments I have had, so it is applicable. Even with a nearly 10 year old technology, there are still people writing code that would be better served by its predecessor. In particular, I am focused on ASP.NET and traditional ASP. 

The main thrust of this post is you have to make paradigm shifts in your life, as new technologies come out. In this post, I want to focus on ASP.NET in particular, as it has been a hot bed of people that have refused to make the paradigm shift from script based ASP code to compiled function-based (or event driven) ASP.NET code.

My first foray into ASP.NET was in 1999 or 2000. It was an early alpha build offered up for Microsoft MVPs. Shortly after, I got in touch with IDG, which became Hungry Minds, which was bought out by Wiley (who wanted Dummies) and wrote a book ADO.NET and XML: ASP.NET on the Edge. As I was writing, I quickly discovered I was writing my code in classic VB 6 style. To get into the .NET paradigm, I forced myself to learn C# (now my MVP designation) and then write the book in VB based on what I knew.

Most of the first ASP.NET books were atrocious, as author after author was doing the same thing. Most of the code was written like so:

<%
    Dim connection as New SqlConnection("string here")
    Dim command as New SqlCommand("command here", connection)

    …

    For Each (row as DataRow in ds.Rows)
        Response.Write(row(0))
    Next
%>

There were few books that even covered code behind and even the few books that covered code behind had one chapter. And this includes books from some authors who have written many great books about Microsoft web technologies.

Personally, I had to fight the editor on two points:

  1. The code should primarily be written in code behind – I lost this one overall, but had plenty of code behind samples in the later chapters when less attention was paid
  2. I wanted to code in Visual Studio .NET – My compromise is the sample code was done both with a Visual Studio .NET solution and a make.bat file to compile the solution
  3. I wanted to write the main code body in class files – Marginal success here despite the argument I wrote most of my traditional ASP applications with the majority of code in VB COM libraries hosted in MTS

You can probably still download the code at the Wiley extras site, if you are curious. But this is not the point, as most of the books actually had decent code. They just missed the paradigm shift to code behind. Let’s take this a step further.

Missing the entire paradigm shift

As late as three years ago, I was fixing a website written for my company by a vendor with code like this:

protected void Button1_Click(object sender, EventArgs e)
{
      Response.Write("<table>rn");

      foreach(DataRow row in ds)
      {
          //… Section writing Header Row Here

          Response.Write("t<tr>");

          while(counter < columnOrder.Count)
          {

            Response.Write("tt<td>");
            Response.Write(row[columnOrder[counter]);
            Response.Write("</td>rn");

            //… repeat for each column

           counter++
         }

         Response.Write("t<tr>");
      }

     Response.Write("</table>rn");
}

This was an improvement over the previous version found in some pages, which used this format:

            outputstring = outputstring + "tt<td>";
            outputstring = outputstring + row[columnOrder[counter];
            outputstring = outputstring + "</td>rn";

      //… finish entire grid here

     Response.Write(outputstring);

This page had the extra special benefit of being paged with a custom paging logic, all written out with concatenated strings. It was a nightmare to debug errors in as you had to examine the output in a browser and determine where it was wrong. In most cases, this meant putting the HTML through a checker or in an HTML editor program to find where it was broken. And since the JavaScript was also output in this string, rather than emitted (ASP.NET standard), you had to debug by running it. Ouch!

The code above was actually not completely horrendous in traditional ASP, as you had to loop through Recordsets to get data out on the page and Response.Write strWhatever was fairly standard code. The better developers would move the code into include files, but the model was interpreted, not compiled, so many of the kludges (from an ASP.NET standpoint) were dictated by the ASP model.

Not Invented Here (NIH)

I have seen this paradigm mistake taken to the nth by those who have the Not Invented Here syndrome. This syndrome is present when you have the smartest developer in the world working at your location. In general, this guy is pretty good, but has a serious phobia to anything that cannot be hand coded in notepad and a strong disdain for anything drag and drop. Rather than access what makes sense, he/she will rewrite everything. I am sure each of you has met this person at some time, and generally this person, through tenure, has risen to a high level in the company and is a strong silo of knowledge. As the current development efforts would tank without this person, he/she is normally treated with kid gloves. Clues that this person is present are (at least one of these):

  1. Everything that is simple in .NET has been rewritten (due to a lack of trust of visual designers?)
  2. They have coded their own custom method of output (rewrote ASP.NET delivery, for example)
  3. There are custom user or server controls for all of the standard Microsoft controls that ship with the framework
  4. Every ASPX page is thin and contains at least one user control
  5. Most pages are rather simple, containing only the page directive and a single user control (although none of the user controls are reused, everything is a user control)
  6. There is a complex hierarchy of container controls to help create the UI (in lieu of built in containers like panels, et al, or a use of divs with CSS for formatting (true separation of layout and tags))
  7. The entire visual part of the page is found in C# code in a library that write directly to the Response stream

In general, the code is very complex and advanced. It is quite obvious the person is very smart, as far as coding. And there is often a tendency to throw in every new technology, but not trust any of the helpers available.

These are some things I have seen in different projects I have had to clean up or have observed in client locations. Some are unique to a single client, while others have appeared time and again. The core takeaway is any time you see someone rewriting a core technology (ASP.NET, BizTalk, web service transports, etc), you should see red flags. In some rare instances, you might be wrong in your caution, but more often than not, rewriting a core system or technology from a major vendor indicates NIH and should be seen as a danger sign.

I will have to code a sample similar to some NIH implementations I have seen over the years. The code is most often NOT maintainable and the the founder of the code berates every newbie to the team. The assumption being that their “not getting it” is not seen as an artifact of manufactured complexity, but rather to their inferiority to the initial coder.

NOTE: If you are in an environment where you see all of your co-workers as idiots, it means one of two things. They are idiots and you should find a job with non-idiots. Or, more likely, that you are over-engineering your code base to the point it is becoming a detriment to your employer.

Note, if you are observing this person, that the person writing the overly complex code is often trying to ensure his/her job, consciously or unconsciously and that this is often a compensation for a low view of self. Then again, sometimes you have an egomaniac with sociopathic tendencies.

Is Complexity Bad?

Since I have strayed from the paradigm shift, I guess I have to state that complexity is not necessarily bad. When there are SLAs for performance, scalability, etc, you often have to create rather complex code to solve the problem. If the project is sane, this code is encapsulated in a library, however, and the rock stars in the organization have control of the code base. The rest of the team then consumes this complex code as a black box.

So, complexity is not bad, but overly complex systems that force a company to only hire rock stars are, in general, a sure sign that someone has grossly over-engineered the system.

In his book, C# in Depth, Jon Skeet gets into some rather complex topics. Not necessarily true, as they are not too complex, as presented. But, there is definitely a learning curve to concepts like lambda expressions, using func as a constructor argument, or properly using generics.

One thing he does show, however, is how taking the learning curve helps you write code that better shows intent. So, using generics, or lambdas, can make code cleaner, more concise and even easier to understand. If you see these constructs in a project that is very hard to understand intent, the person coding it is … well, doing it wrong.

Summary

Since it is late and I had a hard time sleeping last night, I am dealing with two points here. The first, and main point of the entry, is you have to shift your thinking when new technologies come out. If you continue to write COM in .NET, you may end up with code that works, but it will not be easy to maintain. If you continue writing the old way, and do not make the shift, you are not doing it the best way. Or, to cut through the crap and be blunt, you are doing it wrong.

The second is advances in languages are included to help you write cleaner code that is easier to understand. They are tools to make intent more clear. If your code is less clear, you are doing it wrong and need to reassess what you are doing (refactoring is your friend).

As an auxiliary point, drag and drop is not a bad thing. In the case of ASP.NET code, it helps you quickly build up the visual part of the page (the tags). Even in data, it can help you work RAD into the equation and quickly build sites. You do have to understand the underlying assumptions and use what helps you work faster towards quality and pitch out what creates bigger headaches.

As an example of drag and drop that helps, but is generally considered bad, consider the DataSet. There is so much code that comes from dragging and dropping that many developers detest the code.  But, if you look at it logically, it is much quicker, especially when you first develop the site, to use what you are given. When you reach later cycles, you can refactor out the garbage and do it “right”, but you do this in the optimization phase. Hand rolling may give you the “proper” implementation the first time, but a simple highlight and delete yields the same result and takes a fraction of the time of handwriting the data container.

Does this mean, you should use DataSets? In high volume Enterprise sites, probably not. And, hand rolling some things is not necessarily bad, and is often good. But you should ask “is this is first concern or something I can refactor out later?” before running with the “anything that can be dragged is a bad thing”.

My personal feelings? In general, everything Microsoft has requires a translation layer to get to domain models, especially if you have a heterogeneous application stack. Most of the drag and drop, while it can perform quite nicely (although not LINQ to SQL at the Enterprise level), adds extra FUD you don’t need in your Java apps. Just my two cents.

Peace and Grace,
Greg

Twitter: @gbworld

Mafia Wars is NOT a 5 Star Game


A friend of mine recently gave Mafia Wars, a Zynga game most commonly played on Facebook, a five star rating. While I play the game, I think the rating should be much lower. We have to give it a few stars because it appeals to man’s base nature of conquering things, thus becoming an addictive experience, but we also have to remove stars for the many bugs in the product as well as the shifting rules.

Let’s start with the later:

Shifting Rules

When I first started playing Mafia Wars last year, you had a fairly simple method of setting up properties. First, you had to buy land and then you had to buy properties to sit on the land. As the price went up each time you purchased, it made more sense to buy in lots of 10. If you played this correctly, you quickly got up to a level where you could get to billions of dollars of daily income rather quickly. In addition, you only had to pull the money out once per day and all of the properties were pulled at one time. And, if you continued to build this way, you could achieve the money accomplishments within a few months.

Rule Change #1 was to reorganize properties like so:

image

This gave us a very pretty reorganization. More importantly, it gave the advantage back to the house (Zynga) in this casino we call online games. Here is how it works.

  1. Reorganize properties, including getting rid of some that are very profitable for peeps – this reduced my daily take tremendously
  2. Make all properties expire at different times, making them easier to rob
  3. Only allow a person to buy one property at a time, so you can raise the price on each property instead of each 10

When robbing was reintroduced, you could only rob when a bar was full and you could collect. This was to illustrate you have to pay attention to avoid getting robbed, or something similar. In the past day or so another rule change has been instituted (Rule Change #2): people can rob you even when the bar is not full. What this means is even a person who stays on the game 24 hours a day can be robbed.

For evidence, the screen cap above was taken about 1 minute ago. Note that my Chop Shop and Weapons Depot, which take 24 hours to fill. This means I cleaned up my take about 4 hours ago. Below is a screen cap of my Mafia Wars home page taken right now:

image

This means the rule is no longer “if you don’t watch your properties, they get robbed”, but rather “to make sure people rob, you can get robbed at a point in time where you can’t collect”. If this is the way the game is changing, the fair thing should be that I can collect on my take at any moment to ensure I can’t get robbed. But, that type of change would not benefit Zynga, as their goal in rules changing is to ensure I eventually get tired enough of not making progress I will buy something from them.

I am personally hoping this second “change” is a bug, as it is really annoying enough to have to keep getting into the game to make sure a property with a full bar is not robbed. Getting robbed without having a chance to do something to prevent it lifts annoying to the level of aggravating. Making it nearly impossible to get the big money accomplishments pissed me off too. 🙂

NOTE: I am not talking about game additions here. Adding on additional features is a dynamite way to add more incentive to play the game. I have no problem with that. I am talking about core changes in the way the game works that make it harder to achieve goals. While it is their game, and they have the right to program it how they desire, I would not want to play a board game with a person who changed rules like this in mid stream. Especially if the rule changes he instituted were things like “when ever Greg passes Go, he goes to Jail and I collect $100,000”. That is how I feel about Zynga’s rule changing; they seem to only benefit the house.

Bugs

While rule changes might be okay in some people’s definition of a five star game, I have a feeling most would disagree that a buggy game should earn this designation. Here are just a few of the bugs I have encountered in the game over the past week or so:

  1. Can’t receive boost from self when clicking on friend’s link. First the link:
    image
    then the message
    image
    I am not, and have never been, Rob. As such, I think I can safely label this one a bug.
  2. Gifts expire shortly after someone sends them. I saw my Mafia Wars gift request change on FB and had this:
     image
    click on the Claim Rewards and get this
    image

    Unless near immediate gift expiration is a clever feature, I would call it a bug.

  3. Failure to give items it says you just collected. I have had this happen on skill points, reward points, experience (harder to gauge as you do not see experience without going to profile) and money:
    image
  4. Disappearing energy, etc. When I played this morning, I left nearly 300 points so I could play England in a few hours (currently working on something that costs 48 points and I can do it 6 times in a row before the authorities get suspicious). When doing the screen caps earlier, I was down to 232 points. Now I am at 153. WFT?
    image 
  5. Other strange point anomalies – This one shows points temporarily being reduced:

  6. Money shown in wrong currency:

These are not the only bugs I have seen and I am not even certain they are the most egregious. I have actually contacted Zynga about some of the bugs I have encountered and even received correspondence back, although I have never had my game adjusted. In short, it is not worth complaining unless you are paying and I am not convinced you will get much out of Zynga no matter how much you complained.

My Thoughts

Which of these better describes you?

  1. If someone produced a really good quality free game and gave me an offer to get additional features for money, I would pay it
  2. I pay money for games that make things really hard to progress just so I can get it over with

The point is you can provide a carrot (more stuff in a great game for people who buy) or a stick (make it harder to progress as time goes on so you spend). Zynga seems to focus on the stick. I am not a stick kind of guy, nor are most people I have talked to, so it is not working for us (perhaps it is for others?).

More importantly, even if the game was awesome I doubt I would purchase it when it is as broken as it routinely is. As a developer, I would cringe at the high number of bugs making it to production. Perhaps their crack dealer model, “the first one is free”, is not profitable enough to put a quality assurance department in place?

Last Bits

So why do I play? Frankly, because I hate to give something up before it is “done”. As the game always adds features and special bits, I doubt I will ever truly be done. But, once the bits in front of me are completed, I will pack up and leave.

But my point here was not “this is a game nobody should play”. I was simply stating this is not a 5 star game, as it was rated. If people were paying for this game, I am sure it would be skewered by sites like IGN and GameSpot and I don’t believe that free gives someone a 5 star game that would likely only get 1 star if it were a paid game.

Peace and Grace,
Greg

Twitter: @gbworld

46 Mommas Shave for the Brave – Updated Map


Tiffany sent me a list yesterday and stated the 46 mommas wanted an updated map. Okay, so here it is.

Full-Size-Map

Legend

Momma Momma

Volunteer Volunteer

Barber Barber

Here are the stats on mommas (shavees), volunteers and barbers:

  • Arizona – 1 momma
  • California – 4 mommas
  • Delaware – 1 Volunteer
  • Illinois – 3 mommas & 1 barber
  • Kansas – 2 mommas
  • Kentucky – 2 mommas
  • Louisiana – 5 mommas
  • Michigan – 1 momma
  • Missouri – 1 momma
  • New Hampshire – 1 momma
  • New Jersey – 3 mommas
  • New York – 1 momma
  • North Carolina – 2 mommas
  • Ohio – 5 mommas
  • Oklahoma – 1 momma
  • Pennsylvania – 5 mommas & 1 volunteer
  • Rhode Island – 2 mommas
  • Tennessee – 2 mommas
  • Texas – 2 mommas
  • Virginia – 3 mommas
  • Washington – 2 mommas

NOTE: There are alternates amongst the mommas, so the total ends up at 49 (if you are counting).

Here is a list of the participants (first name, last initial, state and type of participant) – click on links for donation page, where applicable:

MommaAmy P ( AZ) Shavee
MommaChrystine A. ( CA) Shavee
MommaShannon B. ( CA) Shavee
MommaKaren H. ( CA) Shavee
MommaPerla S. ( CA) Shavee
VolunteerCatherine K. ( DE) Volunteer
MommaAnnmarie C. ( IL) Shavee
BarberHelen F. ( IL) Barber
MommaJaclyn H. ( IL) Shavee
MommaLeanne L. ( IL) Shavee
MommaLisa G. ( KS) Shavee
MommaKarla K. ( KS) Shavee
MommaRenee C. ( KY) Shavee
MommaMandy Cherry L. ( KY) Shavee
MommaJaime B. ( LA) Shavee
MommaMelanie B. ( LA) Shavee
MommaAnnMarie I. ( LA) Shavee
MommaStacie R. ( LA) Shavee
MommaPaula S. ( LA) Shavee
MommaEllen R. ( MI) Shavee
MommaJill B. ( MO) Shavee
MommaDanielle C. ( NC) Shavee
MommaLorrie M. ( NC) Shavee
MommaJennifer R. ( NH) Shavee
MommaStephanie H. ( NJ) Shavee
MommaDena S. ( NJ) Shavee
MommaNorma Z. ( NJ) Shavee
MommaCarol B. ( OH) Shavee
MommaChristine B. ( OH) Shavee
MommaDarlene H. ( OH) Shavee
MommaLaurie H. ( OH) Shavee
MommaJennifer Jenni P. ( OH) Shavee
MommaAngela W. ( OK) Shavee
MommaHelen A. ( PA) Shavee
MommaAmy B. ( PA) Shavee
MommaAmanda D. ( PA) Shavee
MommaMonique G. ( PA) Shavee
MommaMichelle K. ( PA) Shavee
VolunteerDiane S. ( PA) Volunteer
MommaRebekah H. ( RI) Shavee
MommaDawn P. ( RI) Shavee
MommaMelissa H. ( SC) Shavee
MommaTiffany B. ( TN) Shavee, Team Captain
MommaRebecca "Becky" E. ( TN) Shavee
MommaMyriam "Mimi" A. ( TX) Shavee
MommaLisa S. ( TX) Shavee
MommaMelina B. ( VA) Shavee
MommaHeide R. ( VA) Shavee
MommaBrittany S. ( VA) Shavee
MommaAmy W. ( VA) Shavee
MommaKelly F. ( WA) Shavee
MommaCarla H. ( WA) Shavee

Peace and Grace,
Greg

Twitter: @gbworld

A brief lesson on government


The left/right explanation is a bit weak and misleading, but the main idea that most forms of government cannot be sustained is telling. As you watch, you should also think about the expansion of government and how the rich get richer, no matter who is in power, and see if you don’t see something in common with what is going on how in this country.

Note that this is not a knock on a particular person or party, but rather a statement on how both parties are leading us down a destructive path (perhaps one faster, but both are creating populist type laws that go against the Constitution to “help” the “people”). And the people then knee jerk and do something like http://www.thedailyshow.com/watch/mon-june-14-2010/alvin-greene-wins-south-carolina-primary.

Actually, I think it is a bit funny that someone who did not campaign wins the primary. To me, it shows how sick we are of Washington. Whether the people of South Carolina purposefully sent this as a message, or simply did not care enough to research candidates, it is very telling of the state of Washington power at this time. It is also kind of funny watching Rawl, the expected winner, who is now challenging the primary results … not that the people voted (he got his clock cleaned with Greene taking almost 60% of the vote) but that there are anomalies in the vote (which have been present for ages and elected him last time). The Democratic party is asking him to withdraw and Clyburne is asking for a probe of the election. The lesson: Don’t upset the apple cart by voting for commoners?

Peace and Grace,
Greg

Twitter: @gbworld

Blend Fundamentals Training (Silverlight OnRamp)


Microsoft has been running a 5 day training for those wishing to get up to speed on using Blend to create Silverlight applications. The assets have been released on the Microsoft download site (end of May through early June), but the videos have not been as easy to find. If you have been looking for a means of getting up to speed on these technologies, you can get to the videos here.

If you would much rather download the content, Sandrino Di Mattia has put together a method of downloading all of the videos in one big batch using the SDP downloader. You can read about it here. There well over 100 in the batch, so it can take a bit of time downloading the content. The videos range in time to about 3 minutes to a bit over 20 minutes, so there is more than 20 hours worth of material in the entire stack. As of today, Day 5 is not included in the mix, so you will have to go out and grab it yourself (try here) or wait until Sandrino is done.

I will update this thread some time tonight with a full listing of the contents, including those that are not available currently with the download. This OnRamp is based on Blend 3.0, but most of the skills should transfer nicely.

{TABLE TO GO HERE}

UPCOMING TECH TOPICS (will be linked when done):

  • Overview of PluralSight – learning portal
  • (possible) Overview of Inner Workings – learning portal
  • What is a Project – Paradigm Shifting Video Series
  • Agile versus Waterfall – Paradigm Shifting Video Series
  • The basics of Scrum – Paradigm Shifting Video Series
  • Refactoring Services: Two Perspectives – architecture and patterns advice

Peace and Grace,
Greg

Twitter: @gbworld

Expression 4 released


With the launch this morning at 11 AM, Microsoft has released Expression 4 to MSDN. You can now download from the MSDN subscription site. If you don’t have an MSDN subscription, you can download a trial here.

Peace and Grace,
Greg

Twitter: @gbworld