I learned to program…

I forget who exactly did, but someone not too long ago mentioned Ben Chun’s ilearnedtoprogram project, and I submitted my programming start. Apparently Ben has moved on to other things; so, I doubt that what I submitted with ever be shown at http://ilearnedtoprogram.com/.

Therefore, here is what caused me to learn how to program…

I learned to program…

using a Commodore 64 to replace my 3×5 card based stick figure animations after my Dad told me about sprites–that I could manipulate no less than 8 of them at a time!

New custom-built Wenge desk

Before I started my current position at Oracle, I took a short break from work and entered into one of my Dad’s hobbies: woodworking. Since he retired, he has assembled quite a workshop that has already produced many fine results enjoyed by family and friends. Instead of purchasing a new desk from a store, we decided to design and build my new desk ourselves. After looking over my Dad’s woodworking books on hardwood, I decided that the desk would be built out of the African hardwood Wenge.

The following pictures capture the process from sourcing the wood to realizing the finished desk. They are in chronological order.

MacBeath Hardwood
The Wenge hardwood for this project was sourced from MacBeath Hardwood‘s Berkeley location.
Wenge boards
The finished desk below began its life as a humble set of boards.
Prepare untapered leg
Some of the boards became legs.
Determine desktop grain
Other boards were selected for their grain pattern to form the desktop.
Learned a new power tool
I got to learn how to use a new power tool (i.e. a plate joiner) and apply biscuit joins.
Prepare center of desktop
At this point, my regular involvement in the project lessened quite a bit as I started my new job, but my Dad kept making steady progress.
Leg tapering jig
My Dad built a custom jig for the legs, which would become tapered along both sets of opposing sides.
Tapered legs in two dimensions
Model leg assembly
Each step involving the Wenge legs was preceded by a prototype in lesser wood.
Model leg assembly detail
Loose side assemblies
Loose bottom assembly
Before finally glueing pieces of the desk together, a dry assembly was made to confirm fit.
Securing side assembly to desktop
By now you can appreciate why my Dad insights that a woodworker can never have too many clamps (or too many gift cards to Rockler).
Unfinished grain pattern
The wood for the legs was selected to achieve a particular grain pattern, too.
Capture of 3D tampering
This shows the overall taper of the legs more clearly.
Sketching ideas for drawers and center shelf
At this point, it was clear that I needed to treat my Dad to a ØL Beercafe & Bottle Shop visit in order to spark our creativity over a Ægir Natt Imperial Porter and an Upright Engelberg Pils.
Preparing desktop underside for shelf and drawers
Unfinished side drawers
Unfinished center shelf
At this point, my Dad worked on the desk’s undercarriage.
Sanded, unfinished desktop
Here is the desktop grain pattern detail after sanding and before finishing.
Desk before delivery for finishing
Desk before delivery for finishing
Here is how the desk appeared before it was delivered to be finished by Englund Studio in Oakland.
Finished desk
Here is how the desk appeared after it was finished.
Finished shelf and drawers
So as not to draw attention away from the Wenge, the center pull-out shelf and side drawers were painted in matte black.
Finished desk
Finished desk
Here you can see the detail that my Dad put into the front of the pull-out shelf, which is held magnetically at an angle matching that set by the legs of the desk.
Finished desktop
Here is the desktop grain pattern after finishing. It’s what I get to enjoy now every time I sit down to work at home.

Now I am the very proud owner of a custom-built Wenge desk, all the more special since my Dad was essentially its maker. He was kind enough to put his wood mark on the right leg facing me as I work; so, I can glance down at any time to be reminded of this project and all I learned working at his side.

Thanks, Dad!

About open community – a tale of two tools

When you take a step back from a community for spell after being in the thick of it for some time, it’s interesting to see what you find upon return.

In this case, I’m referring to the .NET community and there are two stories that I want to highlight:

  • Documentation automation
  • Decompilation

Town of NDoc

Once upon a time, there was NDoc, a convenient tool to help developers produce reference-level documentation for their .NET assemblies and solutions.

A force from the Pacific Northwest determined that there was much value in NDoc, and Sandcastle was born. (Note: The chapter on NIH isn’t covered here, nor are the alleged actions of an individual in the NDoc “community.”)

Sandcastle was more about the command line than NDoc, and eventually Sandcastle Help File Builder arose:

Sandcastle was originally created by Microsoft back in 2006. The last official release from Microsoft occurred in June 2010. Until October 2012, it was hosted at the Sandcastle project site on CodePlex. In October 2012, Microsoft officially declared that they were ceasing support and development of Sandcastle. The Sandcastle tools have been merged into the Sandcastle Help File Builder project and all future development and support for them will be handled at this project site. The Sandcastle tools themselves remain separate from and have no dependency on the help file builder. As such, they can be used in a standalone fashion with your own scripts and build tools if that is your preference.

Assuming that Kevin Downs and others who originally contributed to NDoc are happily pursuing new ventures (and satisfied to see their initial efforts validated by SHFB et al), it seems like documentation automation is alive and well in the .NET community.

City of .NET Reflector

Once upon a time, Lutz Roeder authored and maintained the most excellent .NET Reflector decompilation tool for the .NET developer community. At its prime, I didn’t know a .NET developer who wasn’t actively using the tool and who wouldn’t readily nominate Lutz for knighthood.

But then .NET Reflector’s future changed

Red Gate will continue to provide the free community version…

Well, until they didn’t!

Other than referencing ZDnet’s coverage at the time, I’ll leave you to Google the rest of the flames that resulted from this decision. Suffice it to say that it got ugly, and the $35 price is now no less than $95 and as high as $195.

The severe curve in price hikes tends to indicate a sharp drop in demand. Furthermore, the original Reflector add-ins portal seems to have been abandoned, which is a shame–lots of solid contributions were made therein that I use to leverage frequently (er, once upon a time)…

So, in the face of a tool that was free but now costs almost a benjamin for the basic version, what to do?

Two potential alternatives quickly present themselves: Telerik JustDecompile and JetBrains dotPeek. Let’s start with dotPeek

I’ve had some experience working with JetBrains in the past to establish a more open stance. Unfortunately, that didn’t result in any great or lasting success:

It’s interesting to see other potential similarities, too, between the Omea progression and the dotPeek progression. For example, JetBrains originally realized Omea by hiring Dmitry Jemerov who authored Syndirella–ironically an open source project. More recently, the first dotPeek plug-in author, Matt Ellis joined JetBrains as a .NET development tools evangelist. Assembly list support is already baked into dotPeek 1.0 directly.

As I remarked on Twitter, I sincerely hope that JetBrains has embraced open development for dotPeek; otherwise, I fear reactions to dotPeek such as this one for Omea.

Switching to JustDecompile, one of my first (positive community-oriented) impressions came from reading the (timely) comments on this blog post.

Even the blog’s first criticism–needs registration for download–has been addressed. I agree that this was a bit heavy-handed, but now you can download JustDecompile straightaway and only provide/create account information if you want support for the free tool (during JustDecompile installation).

Telerik has posted two, free plugins, which installed easily (after I realized that you have to expand the .sflb files for JustDecompile to find the entry points as otherwise instructed). (Telerik, please update your instructions to make this clear.)

Time will tell if the .NET community will rally around this tool by submitting new plugins. It’s clear that Telerik is listening to the community it has (e.g. this feature came directly from the UserVoice site for JustDecompile), and that is a good start.

I wonder if things would have worked out differently if GitHub had been around at the time the original transitions for .NET Reflector and NDoc had occurred. (Lutz is on GitHub, just not including .NET Reflector due to its aforementioned transfer.)

Is it too late for .NET decompilation to become truly open, supported by a vibrant community?

In the tale of two tools, the formative city of decompilation could take some cues from the happy town of documentation.

Inspiration

Every once in a while, something truly inspirational occurs. Earlier today I was able to witness one such event live with my kids via YouTube: the Mach 1.24 freefall by “Fearless Felix” (Felix Baumgartner) from over 24 miles above the earth.

The following pictures are courtesy of the iPad’s screen capture facility while watching the jump live on YouTube. They are in chronological order.

Felix Baumgartner
Vertical track
View of Earth below
Temperature and pressure
Inside closed capsule
Inside opened capsule
Stepping out
Stepping out
Stepping out
Jumping off toward Earth
Speed record achieved
Freefall short of record
Guided flight
Guided flight
Home sweet home

Although the world may have been focused on Felix (and his mom), I reminded my kids that even a seemingly individual event involves a team. This event was no different and the Stratos team is probably significantly larger than those captured on the video:

Stratos Mission Control Team

Thanks again, Felix and team, for inspiring me and my kids today, and congratulations on your accomplishments!

Integration

Integration. This word/concept similar to application, component, data, service and so many other concerns in the software realm: it’s often the case that there are N + M meanings floating around a conversation with N people on the subject. :-)

If you provide a portfolio of products to customers, integration is typically an important aspect of your offering. Do these products play well with each other? Can there inputs and outputs be combined into broader workflow, etc.?

Unfortunately I find that many integrations seems to be merely technical in nature–as if to answer “yes” to “can I technically integrate?” Much like answering “yes” to “do you know the time?” this strikes me as missing the point altogether.

Integrations must be about how should I deliver the right experience to my user. That is, integrations should be experience-driven.

So, what may be some of the signs that indicate a need for focused improvement?

  • Workflows that span across products involve multiple login experiences (interruptions).
  • Users are forced to deal with experiences designed for a persona other than their own.
  • Software concerns are not consistent and therefore are not intuitive (e.g. able to be reused spontaneously in new business contexts).
  • Integration gaps in product must be addressed via professional services, consulting or directly by customers.

Any of this sound familiar?

When I get involved in an integration-related project, I tend to think about the following layered concerns:

This approach involves:

  • an experience-driven focus on key business roles/personas and their workflows – user objective over product feature/function (seamless)
  • data and insight in context for better decisions and actions – mere hand-offs don’t add value (frictionless)
  • social as glue across users (relational) – provide others’ insights in context[1] to facilitate further insight and action

How do you view and tackle integration in your own products?

[1] e.g. http://craigrandall.net/archives/2012/09/queue-and-flow/