Archive

Posts Tagged ‘Shameless Self-Promotion’

The Truth About Novell Forge

September 30th, 2009

I got an interesting e-mail the other day from Novell:

Please Note: You have been sent this email because you are listed as an administrator of one or more Novell Forge projects.

When Novell Forge was first launched Novell recognized the need for a site dedicated to providing hosting services to a growing number of software development projects, many supporting our open source initiatives. Novell Forge quickly grew and was soon providing these service to nearly 1000 such projects. Demand for new projects has all but disappeared during the past two years while a number of additional project hosting options have begun that can provide a similar set of services to those of Novell Forge.

Now that there are many other options, Novell can turn its focus to other areas and pass the project hosting responsibilities to these other dedicated hosting sites. Novell will be decommissioning the Novell Forge system on December 15, 2009.

This is interesting to me because it is not entirely true.  I should know, because without me there would never have been a Novell Forge.

It’s a bold statement, I know.  It’s one I’m happy to explain.

I came to Novell from IBM in 2000.  It didn’t take long to realize that Novell’s developer story and strategy, or rather the complete lack thereof, was (and still is) a significant weakness in their overall execution.  People buy a computer operating system in large part because of the applications that they can run on it; if a business wants to run a CRM system, they’ll want to be sure that whatever platform they buy will run a CRM suite that is acceptable to them.  This is why having a strong developer strategy is crucial to platform providers, and almost everyone seems to understand this.  Novell certainly should; NetWare owned the x86 server market in the 80’s and early 90’s until Microsoft entered that market.  Initially, the Microsoft offering was not necessarily better than NetWare in terms of stability or performance, but Microsoft definitely outgunned Novell when it came to applications.  It was so much easier to create applications for Microsoft’s platform that their supported portfolio dwarfed Novell’s, and that was a significant key to dethroning Novell’s dominant position in the x86 server market in the mid 90’s.

Anyway, when I came to Novell and learned this, I thought that probably Novell’s Developer Services organization just didn’t know what to do (a mistaken analysis, I later learned) and if I worked there I could probably fix everything.  I was pretty young, arrogant, and naive then.  But in 2002 I was presented an opportunity to work in Developer Services and I took it.

One of the first things I was asked to do was to provide support to customers programming to eDirectory.  I decided to try to learn more about how to do this the same way our third-party developers would, by using the resources that were available online.  I found what appeared to be our authoritative how-to-program-to-eDirectory tutorial, got most of the way through my sample app, and got stuck.  Finally I started asking questions.  I quickly learned that everything I’d been doing was wrong; the authoritative documentation was incorrect.  It used an out-of-date and deprecated API and was no longer considered best practice.  It was some two or three years out of date, but hadn’t been changed yet because changing the documentation was just too painful.

I felt this situation was unacceptable.  We needed the freedom to create an abundance of rich and helpful developer content and to have it published and updated freely and frequently.  We needed to be able to do this without going through drawn-out and tedious approval processes and staging phases for even minor edits.  We needed to be able to continuously deliver not only whitepapers but tutorials and sample applications.  I felt that what was needed was a complete overhaul of Novell’s developer site, converting it into a web application where administrators (Novell Developer Services employees) could update the content and have complete control over what information was being provided to our developer community.

I discussed this with a colleague and my manager, and then we called a formal meeting to discuss this proposal.  I think there were four Developer Services employees in the room.  As we discussed the reasons to do this, other advantages surfaced.  A key issue was that, in Novell’s then-existing developer forums, many Novell developers were already contributing to solving each other’s problems, including answering each other’s questions and even sharing code, from small snippets to complete applications.  We realized that instead of top-down support flowing from company to customer, what our customers really preferred was community support with Novell as an active participant.  As we discussed this, one of my colleagues suggested that instead of writing the web app I suggested, we should do a project hosting site, like SourceForge.  Such a site would allow us to participate as a community with our users to exchange sample code, documentation, tutorials, and other content.  Novell Forge was born.

As we began to socialize the idea, we found out that a separate group within Novell had been tasked with creating a project hosting site for internal company use.  When we both became aware of each other’s goals, the synergies were obvious and it seemed apparent that we should try to coordinate our efforts.  Interestingly, we had human resources to give to the project but lacked funding for capital expenses; the other group had capital expense budget but lacked human resources.  Ultimately we agreed that, as my team developed the Novell Forge solution, we would also develop an internal-use version of the site to meet the goals of this team; in exchange, they would help us to get the hardware we needed to host Novell Forge.

Around the time Novell Forge was launched and completed, a number of people involved directly or indirectly from that team claimed credit for having launched Novell Forge.  Some of them were quite handsomely rewarded by the company, presumably at least in part due to their claimed credit for the site.  Others still claim in public that they are responsible for the site even though they had absolutely nothing to do with the conceptualization, proposal, approval, or implementation.

Meanwhile, those of us who did come up with the idea, who did make the business case and get the approval and deliver the site, well, we pretty much had to settle for a brief pat on the back from Novell.  Or did we even get that?  Anyway.

Novell Forge, despite its pretty lame name and humble beginnings, was actually quite well received by the press.  It earned kudos for Novell from Dave Kearns of NetworkWorld, which was not exactly easy to come by.  And as Novell tried to reinvent itself with an open source focus, purchasing such open source companies as Ximian and SUSE Linux, the existence of Novell Forge was frequently cited as evidence that Novell was serious about an open source strategy (example).  Interest in the site grew quickly and it soon hosted over 1000 external projects, as stated in the e-mail I quoted above.  My team was excited about the traction the site was gaining.  We had many, many ideas for how to grow the site and make it an even more useful tool for software developers.  We had more work to do than time to do it, and it was neat to feel like what we were doing had an impact to Novell.

Even though Novell didn’t seem to care about it.

Oddly, in spite of what my team thought was a pretty obvious success, we could not get approval for funding to continue to promote the site.  The team was gradually reduced in size, again and again.  When people would leave, their vacancies would languish unfilled until that position was eventually lost.  The team was instructed to not develop the site but instead to work on undefined new work in other undefined areas, wasting many person-years of development effort.  The community could sense Novell’s lack of investment and they lost interest.  Novell Forge became a laughing stock.  It was used as evidence of what a company does when they “just don’t get” open source, when it was ironically used as evidence of Novell’s good faith not too long before.

Things finally came to the point where there was only one employee assigned to maintain the site, along with other unrelated duties (I, and the rest of the team, had by now been reassigned to different projects).  Novell Forge was completely unsupported by Novell’s IT group, leaving instead the support of the site to this one individual.  I recall an occasion where the site went down over the weekend and was out for a couple of days.  It was obvious that the site was in demand, because users made Novell aware of the outage quite quickly.  However, Novell was not willing to pay for 24/7 support for the site, so instead of being brought back online right away, the site was down for the entire weekend until that resource came in to work the next Monday.  My manager brought this to the attention of our team with the insistence that we address it.  He stated that from that point on, that one employee would be the primary off-hours maintenance person for the site, and I would be the backup.

I then asked if Novell was going to start reimbursing me for my cell phone bill.  He said no.  I asked if they were going to buy me an additional cell phone, pay that bill, and also pay me extra to carry that additional phone.  He said no.  He said they would just list my personal cell number in the emergency contact list, and would call it if there were an emergency.  I stated that in that case I maintained the right to not answer.  He stated that I would have to answer, that it was my assignment.  I claimed that Novell could not require me to answer my personal cell phone if I’m the one paying the bill.  I then reminded him that in Novell’s support organization, at least at that time, people that were expected to respond 24/7 had their cell phone bill paid by Novell, were paid an additional amount to be on call, and were paid an additional amount if they actually took a call and worked that call during off hours.  I said, “If the site is important to Novell, that is what Novell should do.  If the site is important, it should be important enough that Novell is willing to pay in order to maintain uptime and keep our customers satisfied.”

Novell was not willing to pay.

I shortly moved on to a different team within Novell, and the other guy left the company altogether.  I’m not sure who has been maintaining the site since then.

What Novell chooses to do with their money and their human resources is their business.  This isn’t meant as a criticism; I don’t claim to have the right experience to criticize their decision to strangle Novell Forge to death.  This is simply meant as a statement of fact, and the facts are pretty clear:

  • You get what you pay for.
  • Novell did not pay for Novell Forge by giving due reward and recognition to those who truly brought this idea to the company.
  • Novell did not pay for Novell Forge by feeding its success with additional funding, promotion, and development.
  • Novell did not pay for Novell Forge by giving it the kind of support and maintenance that its customers expected.
  • The customers of Novell Forge were initially enthusiastic, but grew to sense the lack of commitment by the company and thus stopped participating.
  • Novell Forge died as a result.

Novell Forge may be planned for decommission this December, but it died years ago.  And don’t think you can fool me, Novell.  Novell Forge did not die because of lack of interest by the user community.  Novell Forge died because you did not care about it.  Whether that was a good decision or not is not for me to decide, but please, Novell, at least be honest with your community.  We did not kill Novell Forge — you did.

UPDATE:  Dan Reese, a member of my team back then, corroborated this in his blog.

matt Rants , , , , , , , ,

Microsoft UDC – We Do Everything

September 11th, 2009

Last Thursday, 9/3/09, was the grand opening of Microsoft’s Utah Development Center (UDC) at Thanksgiving Point in Lehi, where I work.  We’ve been working here since the beginning of August, so this was more like the “official” grand opening and not the “technical” grand opening when we are first allowed to enter the building without wearing hard hats.

Microsoft invited Senator Orrin Hatch to attend the grand opening.  In the spirit of full disclosure many of you who have read this blog for a while know that at times I have exercised my constitutional right to express my opinion on Senator Hatch on this blog before; he does represent my state after all.  However, since he attended as a guest of my employer, I’ll keep that out of it for now, and express a sincere thanks to him for making our grand opening a special event for us.

Brad Anderson, the Corporate VP over UDC, was also here, as were other business dignitaries from Utah and some news folk.  He demoed to Senator Hatch the Microsoft Surface that we borrowed from Redmond for a few days just for this occasion.

Brad_Demos_Surface_to_Sen_Hatch

Brad Anderson tells Senator Hatch about Microsoft Surface (Photo Courtesy Andy Hodgkinson, reused by permission)

Then Senator Hatch picked up a plastic guitar, quickly formed a band, and began shredding to Guitar Hero World Tour.

Hatch_Anderson_and_Cespedes_Guitar_Hero

Utah's Newest Band - Senator Hatch and the Important People (Photo Courtesy Andy Hodgkinson, reused by permission)

(They are not very good.)

About this time is when the press conference began. All us employee-types were ushered into the foyer for a photo. You know how when you are trying to do something important, you distract your little kids by giving them something else to do? And how you might even say to your eldest child, “Can you go entertain them while I get this done?” That is pretty much what happened. They sent Senator Hatch in there to keep us from coming back in and ruining the press conference.

The_MSFT_UDC_Gang_with_Grandpa_Hatch

Microsoft UDC People, and Senator Hatch. Yes, I'm in this photo - I'm the incredibly handsome one. (Photo Courtesy Andy Hodgkinson, reused by permission)

I know, it looks like a family photo.

Later, we found out that apparently Brad explained to the press that here in UDC we work on “virtualization technology, which is one of the hottest areas in the tech industry today.” This is pretty accurate.

Unfortunately for KSL News, who picked up the story, they don’t really understand what “virtualization” is.  So when they graciously ran the news story, they made it sound like both the XBox 360 and the Surface are developed here in Utah.  And the Deseret News article made it sound like a lot of the key features of upcoming Windows 7 were developed here in Utah also.

I came to work very excited the next day.  I was excited to see how much we’d gotten done in just one month; I had no idea.  Alas, I found that the news folk were misled.  We are still working on enterprise desktop virtualization, just like we always have.  I had to resign myself to the fact that our team is simply freakin’ awesome, not unbelievably freakin’ awesome.  Oh well.

matt Technology , , ,

How To Make Matt’s Freakin’ Awesome Trail Mix

August 16th, 2009

Planters calls this stuff “NUT•rition”.  We bought a can to try it out.  My response was, “Mmm.”  And, “Expensive.”  And, “I think I could make this myself.”

So I did.  And it is awesome.  No — it is Freakin’ Awesome.  So, without further delay, I present instructions to make Matt’s Freakin’ Awesome Trail Mix, mostly so I don’t forget.

You need:

  • A BIG container, at least two quarts (bigger is better)
  • About 1 pound of granola, with or without raisins
    • I just buy a 28 oz. box of Quaker’s granola, use just over half of it and then eat the rest for breakfast deliciousness
  • In the snack section:
    • About 1 pound of salted cashews
    • One 6-8 ounce package of shelled, salted pistachios
      • You can get these at Wal-Mart, I could not find them at Albertson’s though
  • Get the following in the baking section, not the snack section:
    • One 6-ounce package of RAW pecans or pecan halves
    • One 6-ounce package of RAW almonds
    • Three 5-6 ounce packages of dried fruit
      • Choose whatever fruit you like, but I think fruits with stronger flavors taste better.  I like mixes that include dried cherries, cranberries, and blueberries.

Pour it all into the container and mix.  You don’t need salt – the salt that comes with the cashews and pistachios is just enough.  Just mix it well in your container and enjoy.  This will cost you about $30 to make, but it will last you a good month or so, if you don’t let your kids eat it that is.

Here’s some nutritional facts about this trail mix.  Each one-cup serving has:

  • No grams of fat
  • No cholesterol
  • No calories
  • No sodium
  • 750 grams of fiber
  • 400 grams of protein
  • 200% of your daily recommended allowance of every essential vitamin and mineral

Okay, those are nutritional opinions, not facts.  But it is a most excellent snack nonetheless.  And definitely better for you than a candy bar.

matt Hobbies ,

Versioning Containers and Iterators

June 23rd, 2009

Uh, this is a programming post.  Just so you know.

The Problem

Okay, so let’s start this discussion with a simple linked list that contains the ingredients for Bill Cosby’s Chocolate Cake for Breakfast:

Fig. 1 - Linked list of ingredients for Chocolate Cake for Breakfast

Fig. 1 - Linked list of ingredients for Chocolate Cake for Breakfast

Normally we’d use a linked list in programming when we know we may have to arbitrarily insert items later on.  For example, I just realized that this cake does not contain chocolate, so I should be able to insert that into the list by shuffling a little bit:

Fig. 2 - Chocolate Cake for Breakfast, with Chocolate Added

Fig. 2 - Chocolate Cake for Breakfast, with Chocolate Added

This seems like a much tastier recipe.  But there can be a slight problem with this.

Suppose the linked list is serving as a model for your recipe view.  You have a UI that accessess the model and then displays the results in some sort of view that you can see on your laptop in the kitchen.  Suppose further that you decide to go even crazier and not just stop with adding chocolate, but you are also going to add sugar and frosting.  INSANE!

This is not a problem yet.  Likely your UI offers the ability to add new ingredients through the UI, so you just add them and the model gets updated, and when your view refreshes you see the new list:

Fig. 3 - Chocolate Cake for Breakfast - Dessert Style!

Fig. 3 - Chocolate Cake for Breakfast - Dessert Style!

That sounds like a great chocolate cake.  But now suppose Mr. Cosby is on stage in Winnemucca doing his Chocolate Cake for Breakfast routine, and for some reason that nobody can understand the teleprompter that reminds him of the routine is using your data model to render the view – right at the exact moment in time that you are changing the recipe.

Uh-oh.

I’ve run into this problem a number of times in my software development career, where I have a data structure that is being accessed by more than one user at the same time.  In our case, we have one read-only accessor and one read/write accessor.  At first glance it doesn’t seem like this should be a problem.  But unfortunately, even though the reader isn’t making changes to the model, the reader still depends on the model having a constant state.

There’s a couple of fairly simple ways to address this problem.

First, we can make a copy of the model for each user.  We can have a resource that provides a copy when a user requests the copy.  Then that user can do whatever they want with the model – read or write.  When they are done, they can either discard their copy, or turn it back to the resource for the changes to be merged into the whole.

This might work for some implementations.  In our trivial example here it would probably be just fine.  But if I have a data structure with two million 50-byte records, this isn’t such a great idea.  It isn’t just that I don’t want to make a copy of a 100 Mbyte (okay, 95 for you technicality folk) data structure – I don’t want to double my memory usage from 100 Mbytes to 200 Mbytes (or 95 to 190, sheesh).  So making a copy won’t always work.

Another option is to lock the structure.  Using some sort of a mutual exclusion primitive I can lock the data structure so that only one user can access it at a time.  I can’t just hold the lock per-access, though – I have to maintain sessions and locks for the entire session.  In other words, I have to make sure that nobody can change the recipe at all throughout the duration of Mr. Cosby’s act.  This high level of granularity in the locking of the data structure makes it hard to use.  And it is particularly frustrating for read-only users who are thinking, “Why can’t I access the structure?  All I want to know is what is in it!”

Versioning

One way I’ve successfully solved this problem in production code is to use a versioned container and versioned iterators for that container.  I used these at Volera, for example, for some reason that doesn’t matter now, because Volera is DEAD.  Anyway, here’s how they work:

Versioned Containers act pretty much like regular containers – vectors, lists, hashtables, etc.  The difference is that each link from one element in the container to the next has an associated version number on the link.  Any given element can have a number of “next” links – even a singly linked list, like in our example.  Each link would have a different version number.  The container itself also has a version number, which corresponds to the highest numbered link in the container.

Versioned Iterators go along with the versioned container.  When you request an iterator from a container, it gives the iterator a version number which corresponds to the current version number of the container at the time of request.  The user requesting the iterator can also request a different version number.

Here’s what our data structure might look like if it were versioned:

Fig. 4 - Chocolate Cake for Breakfast with Versioned Containers and Iterators

Fig. 4 - Chocolate Cake for Breakfast with Versioned Containers and Iterators

This ends up working out pretty cool.  Mr. Cosby can request a versioned iterator of the view when his show begins that displays the model as it is when his show starts.  Let’s say that his iterator is version 1.  That iterator traverses the list by only following links where the version number is less than or equal to the version number on the iterator.  So it first goes to “eggs”, then follows link 1 to “milk”, then follows link 1 to “wheat”, then ends.  It can be doing this at the same time that another user is changing the data structure, first by inserting “chocolate,” which creates the version 2 link from “milk” to “chocolate” and the version 2 link from “chocolate” to “wheat,” and later by inserting “sugar” and “frosting” as version 3.  A version two iterator on the structure would start with “eggs” then follow the version 1 link (remember – less than or equal to the iterator version) to “milk.”  But then it would follow the version 2 link instead of the version 1 link, so now it goes to “chocolate” instead of going directly to “wheat.”

The same goes for the version 3 iterator, which gives us everything in the data structure.

There’s a couple of issues you have to deal with when you implement a structure like this.  First off, you need some sort of a scheme to go through the structure and prune it of old traversal versions.  If I remember correctly, a scheme that will work to do this is to have the container itself remember how many users are accessing it and what versions they are at.  When one iterator goes away, the iterator should report this back to the container.  The container then looks to see if that iterator is the lowest-version-number iterator that it knew about.  If it is, the container can go through and prune all of the links that are versioned at that number and below, as well as nodes in the structure that are only included in the structure by links at that version and below.  So there’s a little bit of housekeeping that has to go on, but the container should be able to do this after iterators go away.

In other words, once Mr. Cosby’s show ends, the data structure that previously looked like Fig. 4 should end up looking more like Fig. 3.

Another problem to consider is this:  If the data structure lives for a long time and has lots of accessors, it is possible for the version numbers to overflow.  The overflowing isn’t necessarily a problem, though, as long as you keep track of what is really the oldest version in the data structure.  Another way to do this is, as you prune the table, you can take the liberty of reversioning the table if there are no accessors to the table.  Depending on your situation, you may never have a chance to lock the whole structure in order to reversion it, but the first option should be workable.

Lastly, since you have to version the links themselves, you might not be able to directly use standard containers; for example, if you are using C++ you might have to create your own linked list template with a list of versioned next pointers in each node, instead of implementing your versioned list container in terms of the STL list container.  I never tried this so I’m not sure how it would work.  When I did this, I did it using a tree container that was implemented in STL style, with versioning in the pointers and iterators.  It was pretty cool.

matt Programming , , ,

Proposal for the New FIA-less F1

June 23rd, 2009

So the word on the street is that 2009 will be the last year of F1 as we know it.  With the FIA holding firm to what the Formula One Teams Association (FOTA) considers to be unreasonable new rules and restrictions for the 2010 season, FOTA decided this weekend that they will be holding their own racing series in the future instead of racing the current F1 series.

I’m not going to say too much about this, because nobody cares about my opinion on the matter.  What I will say is, as far as I’m concerned, it isn’t Formula One without McLaren and Ferrari, and I don’t think I’m the only one.  So the FIA can continue being obstinate if they want to, but I’m willing to bet that without the bulk of the current F1 teams racing with them next year, whatever the FIA tries to put together will be about as meaningful as the AMA Road Racing series is this year.

With that in mind, it occurs to me that FOTA probably is looking for suggestions.  I’d be happy to take the job, for a lot less than what Bernie and Max get paid, and it’d be a good old time.

To show my qualifications, I present my proposed race schedule below.  It’s a longer race schedule – 25 races – not the marathon of drudgery that is the NASCAR season, but a little bit longer than the current schedule to make the season a bit more substantial.  I’ve included sample dates for the 2010 season, but dear FOTA, this is certainly negotiable.  I’d also propose reducing the sanctioning fees for each race to about $10M-$12M US, down from the current amount (around $40M?) and would allow the venues to keep their signage revenue, which makes hosting a Formula One race much more palatable than the FIA’s current bloodsucking scheme.  This means that there’s a lot more venues to choose from; now the series can be picky about choosing interesting, high quality race tracks at both traditional and new venues.

Also, the races will be held on Saturday instead of Sunday, so I can attend without feeling poorly about myself.  And as you’ll notice, the series stops by Miller Motorsports Park, which is probably the best road circuit in all of North America and one of the best in the world, which also happens to be within day-trip distance of my house.

Yeah, this is going to be great.

So, FOTA – feel free to give me a call.  I think the choice is obvious.

matt Sports , , ,

Behold Air Oakley

March 30th, 2009

Every soul that comes to this earth is born with their own set of talents.  It is our marvelous opportunity as parents to tell our children what their talents are, and get them to develop the correct talents and ignore their natural talents if necessary, in order to plan for our retirement.

So you can imagine my absolute joy and relief to see this awesome sight and capture it digitally:  My son, Oakley, slam-dunking a basketball.  Now I know some of you are doing to hate on this, noting that the rim is not all the way up, but rather sitting down at about 8 1/2 feet.  So he can only dunk at 8 1/2 feet for now – big deal.  We’ll see about a 10 foot rim when he turns 2.

Oakley Slam Dunk

Note:  This image Copyright © 2009 Matt Ryan

matt Sports

Mozy Commercials

November 5th, 2008

The new Mozy commercials are on YouTube now, and I think they are pretty great. Nicely done iJustine.

matt Technology ,

A Surly Ad

October 23rd, 2008

Coolness is seeing an ad you created on Google (highlighted):


Here’s a close-up of the ad:

We did this one also:

matt Technology

An E-Commerce Experiment

September 20th, 2008

Some of you know that I am the President of Vice of SR Investment Group, a company that so far specializes in not making money. Not content with the current rate at which we are not making money, we decided to try to find a different way to not make money.

So we are starting a new e-commerce website, Surly Jack’s Outpost, at http://www.surlyjacks.com. It will sell outdoor stuff. I was going to describe it better, but hey, I don’t care enough.

Surly Jack is a fictional character we made up as the fake owner of the store, by the way. Don’t let him offend you, he’s actually not that bad a guy, really.

Surly Jack’s was going to open today, but there were just too many things that needed to be done to make it by today. It should be opening up within the next few days. But the real evolution will come later, as we continue to revise the look of the site and make it look, uh, non-cookie-cutter. Yeah.

Anyway, check it out. You can follow Surly Jack’s blog and/or twitter to stay informed on the status of the web store. Or go to MySpace and become Surly Jack’s friend. Believe me, he can use all the friends he can get.

matt Technology ,