Thoughts: What is a technical evangelist?

I’m in between jobs after spending 15 years as a developer evangelist.

Last week I lost out on a position for a REST API Developer Evangelist role that I had interviewed for primarily because I lacked in-depth knowledge of a specific PHP API that I had never used.

I’m not going to name the company because I like their product and the well known developer that I interviewed with, but it started me thinking about the role of technical evangelist and how technophiles often confuse the nature of the role and it’s success.

A number of other people with extensive developer evangelism experience have shared with me in the past that they were rejected out of hand for what they believed was a lack of “bit level” experience.

Lets start with understanding what a Technical Evangelist is (and from here on in I’ll be specifically referring to Developer Evangelism). The Technical Evangelist’s role ( for a software vendor as opposed to a consultancy) is to produce two sets of results.

1.) Net New Adoption
2.) Increased Customer Satisfaction & Dependence

Technical Evangelists that represent consulting companies have a bit of a mission. That of presenting the technical expertise of their firm in the hopes of selling its services.

Even technical evangelists that don’t represent a specific company still have the goal of encouraging adoption of the technologies that they evangelise (usually because it’s the one THEY have chosen).

You will often hear Developer Evangelists describe themselves as “Impartial Trusted Advisors”, and becoming “trusted” is a great way for a technical evangelist to increase their influence but in actuality, there is no such thing as a truly “impartial” technical advisor.

So this bears the question, what does it take to be a really successful Technical Evangelist and how does that translate to a really valuable technical evangelism program?

Sure, a technical evangelist need a strong technical acumen. When I joined Microsoft to do Technical Evangelism for .NET it was an unreleased product. I’d played with it for about a week before I started the interview process at Microsoft. When I joined Mozilla to catalyze HTML5 App Evangelism I was far from a client side expert. After all, one of the fundamental tenants of ASP.NET (before MVC and Razor) was that you didn’t do client side work. It was all drag and drop.

So in taking various evangelism roles that focused on technologies in which I was not omnipotent, how did I succeed?

The dictionary includes a definition of an evangelist as : “a zealous advocate of a cause”.

This is true of Technical Advocates as well.

Remember that I suggested the primary goals of a technical evangelist are to deliver “net new” adoption and increased user (customer) satisfaction.

The technical evangelist has secondary goals as well, like product feedback, support costs reduction, customer specific problem solving, direct sales opportunity support, etc. and some of those can be facilitated by low level expertise, but in general – bits and bytes hacking is of secondary value.

I mean, once you have written a for loop, they are pretty much in the same whether you’re writing C#, PHP,JavaScript, Python, etc.

I suggest that you don’t think about Technical Evangelism as “here’s what my product can do”, but rather “look what you can do with my product”. It may sound like a semantic nuance at first blush, but it’s not.

Let me share a couple of examples.

In 2001 when I started working to drive ASP.NET adoption (.NET was in Beta havng been previewd at the 2000 PDC) I focused on Web Services. The big deal about Web Services was not the technical details of building or calling a service in ASP.NET becuase ASP.NET and Visual Studio made the syntax pretty much the same as working with any .NET object.

What resonated most with the (literally) thousands of developers I presented .NET to was not the new / diferent ways they could do things with Microsoft’s shiny new technology, it was how the simplicity of .NET would let them change the KIND of development they could do. How they could build features and applications that were impractical or impossible with earlier tool sets.

In 2008 we (Microsoft) released the ASP.NET AJAX extensions and the initial uptake from developers was “different” than we expected. The reason, I felt, was that while we were showing developers “how” to use the new “APIs”, we weren’t really doing anything to help change their thought process in regards to ASP.NET based problem solving.

After all, ASP.NET developers weren’t used to thinking in terms of how world wide web apps really work, their model at the time was really designed to emulate the “client server” paradigm. The idea that an application could have functionality apart from “full server round trips” was foreign.

So I built a series of 30 or 40 concise videos with sample code that demonstrated “AJAX Patterns”. Patterns like “Predictive Fetch” , “Partial Page Updates”, “Display Paging”, “Incremental Display”, “After Processing” and “Persistent Communications” (http://www.asp.net/web-forms/videos/aspnet-ajax). What mad people excited was not new ways to do old things, it was NEW THINGS that could do in general.

The right content, demonstrations and sample code made people say “I need to move to .NET because I can easily build great apps (or great features into my apps) with that tool set.

While some amount of technical expertise was prerequisite, it wasn’t a deep expertise that made the evangelists on my team successful. To the contrary, I think only a couple of the folks on my team of a dozen or so ever developed really deep expertise. What made them great technical evangelists was their mix of technical aptitude and exceptional communication skills.

As a team we learned to answer the questions prospective customers had, even if they were as yet unasked. We learned to match customers needs with the capabilities that our products could provide and we learned to “shorten” the learning curve by creating content and giving presentations made complex problems and solutions simpler – rather than getting lost in the weeds of technical minuta.

So (IMO) Technical Developer Evangelists are …..

- Engaging speakers and recruiters
- Pre Sales Engineers
- Post Sales Support Engineers
- Solutions Consultants
- Cheerleaders
- Coaches
- Social Directors
- Authors
- Organizers
- Managers (or events or projects)
- Applications Developers

Have you even met great developer evangelist ?

What made him or her great in your eyes ?

PATTERN : Dynamic HTML elements and context specific access via jQuery.

I think all web developers have a love / hate relationship with HTML.

HTML is by it’s very definition a MARKUP language. Markup meaning it’s category of utility is to represent data. HTML is fine for representing data for display but less perfect when it comes to use case’s that require the manipulation of that data once it’s been rendered. As a “markup” language, the semantic values are not innately coupled to the markup items that contain them.

The software development industry continuously invents new ways to improve the ways that we solve this relationship problem.

I’ve been working on a Single Page HTML App which will be data drivel via a JSON file retrieved from the server.

That JSON file will contain some number of data records and the app will need to create one container div for each of those records. Since the number of those records is variable, the App won’t know until run time (when the page is loaded) how many of those sections will be needed.

Each of the container divs will contain HTML elements that will need to be manipulated at run time. (In fact, in the app I’m forking on each container will have a variable number elements, also dynamically created at run-time but for the purposes of this sample we’ll keep thinks to a single level of dynamics).

Dynamically naming elements can quickly become complex with dynamic HTML pages and, as is always there are many ways to solve the same problem. (Yes, I know, your way is better :) )

Here is a documented example of ONE way to accomplish this content / data dynamics using jQuery (though you could use the same pattern in plain old JavaScript).

It takes very little code, but several people have questioned me as to how to do this so I thought I’m post a sample.


<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<script 
   src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js">
</script>

<script>
var numberOfDivsToCreate=10;
//---------------------------------------------------------------------------+
// Note the id of the div to be appended is dynamic comprised of the static
// text "DIV-NUMBER" and the current value of the i variable of the for loop.
//---------------------------------------------------------------------------+
$(document).ready(function () {
    //-----------------------------------------------------------------------+
    // for loop create the total number of divs specified in the
    // numberOfDivsToCreate variable above. In a real app this would probably
    // be determined at run time
    //-----------------------------------------------------------------------+
    for (var i = 1; i <= numberOfDivsToCreate; i++) {
        $('#mainpage').append("<div id='DIV-NUMBER-" + i + "'>" +
                          "<span id='myInput''>" + i + "</span>" +
                          "&nbsp;--&nbsp;<span id='myVal'></span></div>");
    }

    //-----------------------------------------------------------------------+
    // Use the jQuery.on method to specify an event delegate to handle click
    // events for all the divs inside the div who's id="mainpage"
    // Note: In this sample we arw catching the click event for ALL divs
    // In a real world app your mainpage div may contain divs that you do not
    // want to fire a click event on, In that case use a class on the
    // clickable ones and change the jQuery selector below accordingly,
    //-----------------------------------------------------------------------+
    $( "#mainpage" ).on( "click", "div", function() {

        //-------------------------------------------------------------------+
        // The for loop above creates 10 divs and this click event delegate
        // is a SINGLE method (lives in memory once) to handle the click
        // events for all 10 divs
        // $this is a jQuery reference to the element that threw the click
        // event in our case one of the 10 divs
        //-------------------------------------------------------------------+
        // we'll use .find() to look inside the div that threw the click
        // event and find the elements we wish to manipulate, note that
        // those elements are not dynamically named (myInput & myVal) so
        // there are 10 of each on our page and we are using context to
        // determine which to manipulate
        //-------------------------------------------------------------------+
        // jQuery .find() can be a performance problem if misused, make
        // sure to minimise the find scope as much as possible
        //-------------------------------------------------------------------+
        var MyInput =$(this).find("#myInput");
        var MyDisplay = $(this).find("#myVal");

        //-------------------------------------------------------------------+
        // Note that MyInput & MyDisplay local variables that we cast to
        // jQuery objects on order to access the text properties via jQuery
        // syntax.
        //-------------------------------------------------------------------+
        $(MyDisplay).text($(this).attr("id") +
                "   -   Value = " + $(MyInput).text())
    });
});
</script>

</head>
<body>
<div id="mainpage">
</div>
</body>
</html>

Life is a series of near misses !

“I believe life is a series of near misses. A lot of what we ascribe to luck is not luck at all. It’s seizing the day and accepting responsibility for your future. It’s seeing what other people don’t see and pursuing that vision.” – Howard Schultz, founder of Starbucks

jQuery Accordion and Dynamic Runtime Population

As I mentioned in my last post I’m playing with this idea of building a scoring application for boxing / mma events.

I want it to be a single page web application that scales to fit phones, tablets, etc.

An event contains a number of “bouts” and each bout will be a section in a jQuery UI Accordion control.

However, as is often the case, there are a couple of real world conditions that I couldn’t find documentation of sample to demonstrate.

1.) Event event can have a different number bouts.

This means that the accordion sections have to be dynamically built at runtime in the html page.

2.) The order of the events can change right up to the event time.

This means that the USER needs to be able to change the visual sequence of the bouts.

3.) The click-able header needs to be multiple elements.

All the demos I found assumed the headers were simple H3 elements.

You can play with a working version by clicking the image below.

Note that you can not only open and close the “bouts” but you can re-order them using drag-n-drop on the title bars.

– - – THIS IS A UI PROTOTYPE – - –

FightCard- 001

Built this way I can now add the AJAX logix fo recieve a JSON package that contains the event detail and use that data to populate the event.

Here is the code as it exists so far.

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Fight Card</title>
<link rel="stylesheet"
 href="http://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
<link rel="stylesheet" href="css/style.css">
<style>
    /* IE has layout problems when sorting  */
    .group { zoom: 1 }
</style>

<script>

//-----------------------------------------------------------+
// addBout() - Add a single node to the accordian
// TODO: add JSON object as input parameter and build the
//       bout with that data,
//-----------------------------------------------------------+
function addBout(){
    var bout =
        "<div class=\"group\">" +
            "<span class=\"handle\"> " +
                "<div class=\"table\">" +
                    "<div class=\"row\">" +
                        "<span class=\"cell width33pct align-left\">" +
                            "<strong>Blue Fighter TBD</strong>" +
                        "</span>" +
                        "<span class=\"cell align-center valign-middle\">" +
                            "vs." +
                        "</span>" +
                        "<span class=\"cell width33pct align-right\">" +
                            "<strong>Red Fighter TBD</strong>"+
                        "</span>" +
                    "</div>" +
                "</div>" +
            "</span>" +
            "<div>" +
                "<div class=\"table\">" +
                    "<div class=\"row\">" +
                        "<span class=\"cell width150 align-center\">" +
                            "<img src=\"images/silhouette.jpg\" alt=\"\">" +
                        "</span>" +
                        "<span class=\"cell align-center valign-middle\">" +
                            "Round<br />0" +
                        "</span>" +
                        "<span class=\"cell width150 align-center\">" +
                            "<img src=\"images/silhouette.jpg\" alt=\"\">" +
                        "</span>" +
                    "</div>" +
                "</div>" +
                "<span>" +
                "Mauris mauris ante, blandit et, ultrices a, suscipit , " +
                "quam. Integerut neque. <br /> Vivamus nisi metus molestie" +
                " vel, gravida in, condimentum sit amet, nunc. Nam a nibh." +
                "accordion .ui- iconDonec suscipit eros. Nam mi. Proin " +
                " viverra leo ut odio. Curabitur malesuada. Vestibulum a " +
                "velit eu ante scelerisque vulputate." +
                "</span>" +
            "</div>" +
        "</div>";
    return bout;
}

$(function() {

    $( "#accordion" )
            .accordion({
                header: "> .group > .handle",
                heightStyle: "content"
            })
            .sortable({
                axis: "y",
                handle: ".handle",
                stop: function( event, ui ) {
                    // IE doesn't register the blur event when sorting
                    // so trigger focusout handler to remove .ui-state-focus
                    ui.item.children(".handle").triggerHandler("focusout");
                }
            });

    //-----------------------------------------------------------+
    // This for loop is just for testing.
    // The real app will iterate a JSON collection and send
    // each bout node to the addBout function for insertion
    // into the accordion
    //-----------------------------------------------------------+
    for (var i=0;i<5;i++) {
    $("#accordion").append(addBout()).accordion("refresh");
    }
});
</script>

</head>

<body>

<div id="main-container" class="main-container">
    <div id="accordion">
    <!-- Bouts will be inserted here -->
    </div>
</div>

</body>
</html>

And the CSS

body {
   font-family: "Trebuchet MS","Helvetica","Arial","Verdana","sans-serif";
   font-size: 62.5%;
   background: url('../images/background.gif') repeat;
}

.main-container {
    width: 96%;
    max-width: 960px;
    min-width: 300px;
    height: 100px;
    position: absolute;
    top:20px;
    left: 0;
    right: 0;
    margin: auto;
}

/*---------------------------------------*/
/*   Styles for table like formatting.   */
/*---------------------------------------*/
.table {
    display: table;
    width: 100%;
}
.row {
    display: table-row;
}
.cell {
    display: table-cell;
}

/*---------------------------------------*/
/*   Styles for width specification.     */
/*---------------------------------------*/
.width150 {
    width: 150px;
}

.width33pct {
    width: 33%;
}

.width34pct {
    width: 34%;
}

/*---------------------------------------*/
/*   Styles for various alignments.      */
/*---------------------------------------*/
.align-right {
    text-align: right;
}
.align-left {
    text-align: left;
}
.align-center {
    text-align: center;
}

.valign-middle {
    vertical-align: middle;
}

/*-------------------------------------------*/
/*   Style overrides for jQuery accordion.   */
/*-------------------------------------------*/
.ui-state-default{
    background-color: #3173a5;
    background-image: none;body {
	font-family: "Trebuchet MS","Helvetica","Arial","Verdana","sans-serif";
	font-size: 62.5%;
    background: url('../images/background.gif') repeat;
}

.main-container {
    width: 96%;
    max-width: 960px;
    min-width: 300px;
    height: 100px;
    position: absolute;
    top:20px;
    left: 0;
    right: 0;
    margin: auto;
}

/*---------------------------------------*/
/*   Styles for table like formatting.   */
/*---------------------------------------*/
.table {
    display: table;
    width: 100%;
}
.row {
    display: table-row;
}
.cell {
    display: table-cell;
}

/*---------------------------------------*/
/*   Styles for width specification.     */
/*---------------------------------------*/
.width150 {
    width: 150px;
}

.width33pct {
    width: 33%;
}

.width34pct {
    width: 34%;
}

/*---------------------------------------*/
/*   Styles for various alignments.      */
/*---------------------------------------*/
.align-right {
    text-align: right;
}
.align-left {
    text-align: left;
}
.align-center {
    text-align: center;
}

.valign-middle {
    vertical-align: middle;
}

/*-------------------------------------------*/
/*   Style overrides for jQuery accordion.   */
/*-------------------------------------------*/
.ui-state-default{
    background-color: #3173a5;
    background-image: none;
}
.ui-accordion-header {
    background-color: #333333;
    color:  #BDC3C7;
    font-size: 16;
}

.ui-accordion-header.ui-state-active {
    background-color: #BDC3C7;
    color: #333333;
    font-size: 16;
}

}
.ui-accordion-header {
    background-color: #333333;
    color:  #BDC3C7;
    font-size: 16;
}

.ui-accordion-header.ui-state-active {
    background-color: #BDC3C7;
    color: #333333;
    font-size: 16;
}

A simple HTML/CSS adaptive container.

So if you’ve been reading me for a while or you follow me on Twitter you probably know I’m a fight fan.

I’ve started building a sports app related to fighting sports and I’m starting with an HTLM5 app that will run adaptively in any size browser.

I didn’t find an example that did what I want.

My desire was to place the functionality inside a DIV that would take up most of the width of the screen, scale with the size of the screen but ONLY up to 960 pixels.

Like this is the browser window is greater that 960px.

adapt-proto-1

And like this when the browser window is less than 960px.

adapt-proto-2

Here’s the code I came up with.

Simple, but meets my needs.

<html>
    <head>
        <title></title>
        <style type="text/css">
		body {
			background-color:#b0c4de;
		}

		div {
		    width: 96%;
		    max-width: 960px;
		    height: 100px;
		    background-color: white;
		    position: absolute;
		    top:20px;

		    left: 0;
		    right: 0;
		    margin: auto;

		}
        </style>
    </head>
    <body>
	    <div>
	    	--- app content ----
		</div>
    </body>
</html>

Fix for Ubuntu 13.10 64 bit crashing caused by Nvidia drivers.

About a year ago I switched from Linux Mint to Ubuntu because I had gone to work for Zend and Zend did not support Mint.

I had been running Ubuntu 12.04  32 bit on a Thinkpad T61 and kept that version because Ubuntu 13.10 comes with Apache 2.4 which was not supported in Zend Server until version 6.3  (Feb 2014)

Having left Zend I though I would upgrade my Linux boxes to 13.10 and installed Ubuntu 13.10 64 bit on my Thinkpad 13.10.

Everything went as expected with the install but actually using Ubuntu 13.10 on my T61 was frustrating.

Ubuntu 13.10 64 bit began crashing a lot !

Click on the Unity Icon – CRASH (well, a bit more than 1/2 the time).

Open lots of Windows in Firefox, CRASH.

After a bit of searching I discovered that there seems to be a universal issue with the default (one source) drivers on Debian based distros and Nvidia graphics sets.

It turns out that Nvidia makes proprietary Linux drivers for their graphics sets as well.

Note: The hard core open source folks will tell you not to use closed source drivers and not to installed from unverified PPA sources.

In my case the steps below not only seems to ave stopped the crashing and increased my graphics performance.

Your mileage may vary.

sudo add-apt-repository ppa:xorg-edgers/ppa
sudo apt-get update
sudo apt-get install nvidia-current nvidia-settings
sudo apt-get remove --purge xserver-xorg-video-nouveau

Choosing AbiWord as the Word Processor for Blogging.

images

For the past few years I’ve created a long list of topics I wanted to blog about but the day to day demands of my job prevented me from finding the time to actually do the writing.

Now that I’m“in between adventures”, I’m working on blogging more and I hope, what ever I do next career wise, I’ll be able to write regularly again.

For blogging I generally use WordPress, though I also write content that gets published on Joomla & Drupal sites.

Embedded editors tend to be compromises at best and when I write I want to use a word processor. Yes, I know, how 1990s.

I generally have a number of writing efforts under way simultaneously, some are under way for hours, others for many weeks.I find WordPress (etc.) drafts to be a sub-optimal choice for work in process version management.

I also need to write off line. Why? I fly (a lot), I have active children and I live in the country where even cellular data services is not ubiquitous.Horse riding lessons,singing lessons, gymnastics, soccer, school play rehearsals, etc, etc add up to a LOT of potential writing time.

My needs for blog writing are not that complex, I want a word processor loads quickly and has a fast UI,has goods pell checking, supports hyper-links and can save as HTML.Since I also use Linux, Windows and Mac, I want to be able to move my documents easily between platforms.

There are lots of those (MS Word, LibreOffice, OpenOffice, Apple Pages) so what’s the problem.

Well the problem is that all the“big”ones pollute the HTML when they save the document. Microsoft Office is famous for he mess it makes of HTML.

Lets look at the output of a document saved by html from LibreOffice Writer

Here is a snippet form the CSS that LibreOffice Writer Writer creates.


.P1 { font-size:12pt; font-family:Liberation Serif; writing-mode:page; }
.P2 { font-size:12pt; font-family:Liberation Serif; writing-mode:page; }
.P3 { font-size:12pt; font-family:Liberation Serif; writing-mode:page; }
.P4 { font-size:12pt; font-family:Liberation Serif; writing-mode:page; }
.P5 { font-size:12pt; font-family:Liberation Serif; writing-mode:page; }
.P6 { font-size:12pt; font-family:Liberation Serif; writing-mode:page; }
.P7 { font-size:12pt; font-family:Liberation Serif; writing-mode:page; }

And here is a snippet of the HTML mess it produces in the same file.

Note that even basic paragraphs have custom classes and Writer generates them for html paragraphs even if nothing changes from one paragraph to the next.

And, of course, the html is ugly.



Since some will ask.....

Yes, I considered going back to Microsoft. I think they
are doing some interesting things and the recent changes in senior management
should be good for Microsoft's developer focus over the next few years.

No, I didn't get the job. The heaviest focus
for the position was on driving apps into the Windows Phone Store and
engaging college students. I don't have any apps in the Windows Phone Store,
wasn't really a Silverlight guy and am 53 years old.

But the interview process caused me to update my look at
Microsoft developer focused strategy and the  state of affairs of Windows
Phone 8 and the mobile apps development landscape.


Enter AbiWord. AbiWord is a light but well featured word processor available for Linux, Windows and Mac.

It’s fast, supports the features I want and DOES NOT pollute the markup it generates when I save as HTML.

Now lets look at the HTML created by AbiWord when I save a document as HTML.


p, h1, h2, h3, li {
	color:#000000;
	font-family:'Times New Roman';
	font-size:12pt;
	text-align:left;
	vertical-align:normal;
}

Note the more standard use of CSS ad the absence of custom classes.


And, the simple, formatted HTML.


      For the past few years I’ve created a long list of topics
         I wanted to blog about but the day to day demands of my job
         prevented me fromfinding the time to actually do the writing.


So……

That makes is EASY for me to do my writing in the AbiWord word processor, save as HTML, then publish in WordPress, etc. with minimal work required to customize the markup for my specifc blogging platform requirements.

Why Windows Phone has a future.

A couple of weeks ago I interviews with the field developer evangelism group at Microsoft New England.

Since some will ask…..

Yes, I considered going back to Microsoft. I think they are doing some interesting things and the recent changes in senior management should be good for Microsoft’s developer focus over the next few years.

No, I didn’t get the job. The heaviest focus for the position was on driving apps into the Windows Phone Store and engaging college students. I don’t have any apps in the Windows Phone Store, wasn’t really a Silverlight guy and am 53 years old.

But the interview process caused me to update my look at Microsoft developer focused strategy and the  state of affairs of Windows Phone 8 and the mobile apps development landscape.

According to Business Insider, Windows Phone & Skype lose Microsoft about a half a billion dollars per year. Meanwhile, Microsoft’s revenue from the sale of Android Phones tops two billion dollars.

This makes sense if you think about it because Microsoft’s revenue on Android phones is basically patent insurance. Android manufacturers pay Microsoft in agreements that keep Microsoft from suing those manufacturers for what Microsoft claims are patent infringements present in Android. Thanks means the per device cost to Microsoft is ZERO and the revenue is 100% profit.

So as I look at Microsoft’s huge focus on growing the Windows Phone market share I’ve been thinking about WHY Microsoft would bother. I mean Android is king and enjoys something like 1.5 million activation EVERY DAY!  With Microsoft being paid between $5.00 and $10.00 per Android handset, that seems like a ton of net new profit for Microsoft with absolutely no ongoing investment necessary to sustain that revenue stream.

So why would Microsoft bother to continue to sink money and time into a phone operating system on which they have spend many billions of dolars to develop and market only to achieve 5% (USA) market share to date.

I think there are several reasons.

1.) Microsoft controls the licensing fees for the Windows Phone OS and their per devices licensing fee is greater than the patent fee they receive from the sale of Android phones.  So, the more new Windows Phones they can sell and the more they can displace existing phone customers, even Android users, the larger the per device dollar figure they receive.

2.) There are SEVERAL ancillary revenue streams that come with winning the device market share for Microsoft

- Microsoft charges developers an annual membership to submit apps to the store and takes 30% of all app revenue.

- The greater the use of Windows Phones the greater the demand for apps. Microsoft’s Visual Studio, Expression and MSDN sales go up.

- Microsoft’s developer tools simplify the integration of Microsoft Azure based cloud services with will make their use preferential to other cloud services.

3.) There is a combinatorial benefit across form factors in that today I can share large portions of code across Windows Phone, Tablet, and Phone devices. (And it appears that Microsoft will continue the runtime convergence that makes this possible.)

4.) Microsoft’s Android patent revenue trick may not last forever. The actually validity of Microsoft’s patent claims have not been really tested in court. Especially outside the USA, Microsoft may not find courts favorable to their patent claims.

So it’s good for Microsoft but is it good for me, the developer, if Microsoft succeeds in making Windows Phone successful at the expense of Android or iOS?

I have enough experience with the iOS and Android development tool stacks to comfortably say the Windows Phone 8 development experience puts the others to shame, but event the best development experience may not be interesting to me if the market share hovers at 5%.

IDC says Windows Phone 8 is the fastest growing mobile phone operating system. I’m not sure that means anything though. When your competitors have 96.1% of the existing market share, virtually any growth in your market share makes you the fastest growing.

Still, there are compelling reasons to develop for Windows Phone and there are reasons to think Microsoft might continue to grow the Windows Phone market share.

1.) Windows users are used to paying for premium software (and Android users are notoriously not). So developers may experience better financial success with apps in the Windows Phone Store than in the Android / Google Play store or the saturated Apple Store.

2.) The hardware is better. Yes, I know you may want to argue about this but if you look at the cool new devices coming out of Nokia (which is being acquired by Microsoft) and the sheer pace of new device appearance, he cool hardware factor has to go to Microsoft’s favor.

3.) Desktop Synergy. Microsoft still owns over 90% of the desktop market share. Yes, I know that only 10% of that is Windows 8 but it still leaves Microsoft with the customers ears and the PC manufacturer relationships to keep their hold on the desktop user (especially “consumer” users).

4.) With Xamarin’s products I can take my Microsoft code and target Android, iOS and OSX users as well.

So as of today, the reach opportunity on mobile is Android and the revenue opportunity slights favors Android but if Microsoft gets Windows Phone 8.1 & 9 right, if it gets the legacy Windows Desktop upgrade story right and drives the OS and Tablet prices down (I know, some big ifs) Microsoft has a good chance to become a really significant player in the mobile space.

Enough so that, while I probably won’t be deploying FirefoxOS or Ubuntu Phone apps for my upcoming applications venture, I’m definitely adding Windows Phone to iOS and Android in my mobile plans,

My last days at Zend.

This weekend I told a developer friend that I would be leaving Zend in a couple of weeks.

His response was, “wow, when I talked to you at ZendCon you were really bullish on Zend”.

I was, and even tough I’m leaving, I still am.

I know that sound’s like PR spin, but it’s not. Zend has some GREAT products and I’ll keep using them.

So, if the products are great and the company is growing, why am I leaving?

Well, I’m a “developer” guy. That’s my thing.

I’ve been developing software, or working on developer related products and communities for over 30 years.

Zend will always be involved in PHP development technologies like Zend Studio and Zend Framework – but Zend Server is the product that pays the bills.

In the last year we’ve come to understand that Operations (DevOps) is where Zend’s Enterprise Server has it’s strongest value proposition. With this understanding Zend has devoted a great deal of engineering resources to enhance the Zend Server offering with a new and growing collection of Continuous Delivery integration patterns.

To do a great job engaging the right potential audience for Zend server, Zend’s primary community strategy needs to move in the right (operations / CD) direction.  Zend has always focused on developers and they assure me that won’t change, but the focus for Zend Server will be at a higher level. VP of Development / VP of Operations.

I’m not an ops guy :)

Sure, I could spend a year developing operations center experience and “faking it” – but I don’t want to BE an operations guy. And Zend doesn’t need a operations and continuous delivery expert a year from now – that conversation has already started. (http://www.zend.com/en/solutions/continuous-delivery/)

I joined Zend because it’s co-founder Andi Gutmans has been a friend for many years.

When the my needs and experience are no longer a match for the company’s needs and opportunities, its a bit sad, but the right choice is obvious.

And so, February 14th will be my last official day at Zend.
My friendships will stay in place, I’ll keep using Zend’s Products, and I’ll still be at ZendCon :)

A quick note of thanks to my coworkers at Zend. Especially Andrea for the laughs, Mathew, Zeev, Guy & Natalia for all the technical support and Maurice – the tireless & expert developer !

So what will I be doing next ?

As of today, I have no idea. :)

I’ll be looking for a full time gig, doing some contract writing & video work in the meantime and writing some code (something my duties over the past few years have forced me to do less of than I would have liked.)

I’ll be doing some Drupal development and I have a few mobile apps in mind for WM8, IOS & Android.

Maybe I’ll even have time to get back to blogging.

In the meantime, if you have any ideas for me ?

My home office isn’t my kitchen table !

If you follow me on Twitter or Facebook you probably saw this morning that I’m moving on to my next career challenge – though I don’t yet know what it will be other than that I’ll be paying special attention to finding a great fit.

Though I’m not “stuck here” … I’ve worked from a “home office” for over 15 years with most of that time being based on the west coast – the opposite side of the country form which I live. (Yes, I travel :) )

A team that I’ve been talking  to about some consulting work asked me what it looks like to “work from home”.

For me, it’s a bit like any other office.

Except…….

My commute is about 30 yards. (I live on am 8 acre lot in the woods of New Hampshire and built a separate building.)

Office upstairs, gym & garage downstairs.

It has great band width, a great technical library (yes kids, I still read books printed on paper), everything except plumbing (which I had planned to before the bubble burst – add and still will some day.)

I built the building during the “dot com” boom when I was sort of a serial “start-up” guy. It was originally configured with modular capacity for up to 12 people.

HomeOffice_01

 

Yup – tons of hardware. When you do lots of competitive analyses – it helps to be able to go hands on with everything.

 

HomeOffice_02

I’ve done tons of technical “how-to” and product marketing videos and podcast so at one point I built a micro studio. Note the green screen to the left !

HomeOffice_03

It’s a great place for long hours !

HomeOffice_04

Yes, I’m sorry to my young eco-friendly friends – I’m an old guy who still prefers books printed on paper :)

Maybe an article on the “art of working remotely” might be of interest to people.