tag:blogger.com,1999:blog-26914117918462577952024-03-13T23:08:19.817-07:00Burch Software ManagementPassion For The Software Management ProcessUnknownnoreply@blogger.comBlogger20125tag:blogger.com,1999:blog-2691411791846257795.post-89743277128196595292013-07-14T09:23:00.001-07:002013-07-14T09:24:43.700-07:00Mobile App Journey - Part VITo recap:<br />
<ul>
<li>I assume you are able to code some rudimentary HTML, CSS, and javascript (which was my skill level when I started; and to make matters worse, I dislike javascript very much).</li>
<li>And that you can figure out how to make some jQuery AJAX calls. I never used jQuery before this and had to spend a number of hours searching posts and experimenting.</li>
</ul>
The PhoneGap Build dashboard will let you set some basic parameters, but you really should become comfortable with the <a href="https://build.phonegap.com/docs/config-xml" target="_blank">config.xml</a> file and use that. Once you do, the dashboard (for the most part) becomes read-only for that data. There ARE a lot of settings available to you -- but you do not need to use them all (at least to get started).<br />
<br />
Put the config.xml in your root directory, zip your application, and upload it into PGB. You will get various output files compiled for you in a minute or so.<br />
<br />
My config.xml is pretty simple (some would say incomplete). If/when I ready my app for the iPhone I'll have more details I'm sure:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-9xGuU9t8XhI/UeLPiVLIOAI/AAAAAAAAASk/oac_lrnqaPs/s1600/configXML.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="104" src="http://4.bp.blogspot.com/-9xGuU9t8XhI/UeLPiVLIOAI/AAAAAAAAASk/oac_lrnqaPs/s320/configXML.JPG" width="320" /></a></div>
<br />
I installed QR Droid on my Android phone and so I use that to download the APK file directly to my phone from the PG dashboard. Or you can just download to your PC and transfer to your phone.<br />
<br />
Again, I recommend you study the PhoneGap classes on PluralSight, particularly if you plan on putting your app on the Android or Apple stores.<br />
<br />
The conclusion is that in a couple of months, working perhaps 10-12 hours per week, I was able to:<br />
<ol>
<li>code a mobile app with 3 screens, (learning and) using jQuery and Twitter Bootstrap</li>
<li>incorporate PhoneGap Build, calling the native API when possible</li>
<li>write a .NET Web API service (my first) for my app to call and perform calcs</li>
<li>figure out how to make AJAX calls, and pass JSON packets around</li>
<li>navigate through the morass of details getting the app on Google Play; I'm pondering the $99 cost to become an Apple Dev so that I can run that gauntlet...</li>
<li>successfully launch my app (what a way to impress friends and family!)</li>
<li>I figure the same app would take me about 3 days now...</li>
</ol>
Hopefully this brief series, if nothing else, will encourage some to write an app!<br />
<br />
<ol>
</ol>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2691411791846257795.post-295965878585364842013-07-03T08:01:00.000-07:002013-07-06T08:33:27.555-07:00Mobile App Journey - Part VIn the prior post we briefly discussed calling the PG API in order to interact with the device's (such as a cell phone) API. Just because I glossed over it do not ignore reading the PG docs and exploring what is available.<br />
<br />
You will have more flexibility and power if you are building your app with say, PhoneGap + Eclipse + the Android SDK than you will if using PhoneGap Build. But you can still do a lot with PGB.<br />
<br />
One need for me was the ability to browse the web from within my app. Remember, a PG app <i>is</i> a native app, that is, it is a native "wrapper" around your HTML5/javascript/css. So when you are running your PG app that started out as HTML5/javascript/css, you are not running a web app -- you are running a native app. So, navigating to a web page from within your native app is different than simply navigating to a new page from a web app.<br />
<br />
I think there are primarily two choices: the PG API <a href="http://wiki.apache.org/cordova/InAppBrowser" target="_blank">InAppBrowser</a>, and the PGB Plugin <a href="http://phonegap.com/blog/build/childbrowser-plugin/" target="_blank">ChildBrowser</a> ( you can read more about what a PGB Plugin is <a href="https://build.phonegap.com/docs/plugins-using" target="_blank">here</a>).<br />
<br />
I used the ChildBrowser Plugin, so I have no experience with InAppBrowser.<br />
<br />
I had previously asked you to ignore the reference to <span style="color: blue;">childbrowser.js</span> in my <span style="color: blue;">Index.html</span> page. <strike>To get <span style="color: blue;">childbrowser</span> to work you will need to first have a childbrowser folder (off of your app's root folder) with the assets, which are some .png files -- see the link above.</strike><br />
<br />
[Edit on July 6, 2013 - assets folder for CB no longer needed]<br />
<br />
Next, you must reference <span style="color: blue;">childbrowser.js</span> in your page even though you do not have/need this file.<br />
<br />
So, in my Index.html:<br />
<br />
<span style="color: #073763;"> <script <span style="color: red;">src</span>="<span style="color: purple;">phonegap.js</span>"></script></span><br />
<span style="color: #073763;"> <b><script <span style="color: red;">src</span>="<span style="color: purple;">childbrowser.js</span>"></script></b></span><br />
<span style="color: #073763;"> <script <span style="color: red;">src</span>="<span style="color: purple;">js/jquery-1.9.1.min.js</span>"></script></span><br />
<span style="color: #073763;"> <script <span style="color: red;">src</span>="<span style="color: purple;">js/bootstrap.min.js</span>"></script></span><br />
<span style="color: #073763;"> <script <span style="color: red;">src</span>="<span style="color: purple;">js/main.js</span>"></script></span><br />
<span style="color: #073763;"> </body></span><br />
<br />
And finally, in your config.xml (more on this later) you need this line (for PGB):<br />
<br />
<span style="color: blue;"><gap:plugin</span> <span style="color: red;">name</span>="<span style="color: purple;">ChildBrowser</span>"<span style="color: blue;">/></span> <br />
<br />
So to browse, I could have something like this:<br />
<br />
<a <span style="color: red;">class</span>="<span style="color: purple;">link1</span>" <span style="color: red;">href</span>="#" <span style="color: red;">onclick</span>="<span style="color: purple;"><b>Navigate</b>('http://www.oppositecoast.com');</span>">Opposite Coast</a>.<br />
<br />
"Navigate" is a user function in my main.js:<br />
<br />
<span style="color: #073763;">function </span>Navigate(thisUrl) {<br />
<span style="color: #073763;">var </span>cb = window.plugins.childBrowser;<br />
<span style="color: #073763;">if</span> (cb != null) {<br />
cb.showWebPage(thisUrl);<br />
} <br />
<span style="color: #073763;">else </span>{<br />
showAlert("<span style="color: #999999;">Childbrowser does not exist", "Can't Browse"</span>);<br />
} <br />
}<br />
<br />
<span style="color: #38761d;"> </span><br />
First I try to initialize the <span style="color: blue;">cb</span> variable. If successful I can then call <span style="color: blue;">showWebPage</span>, else I let the user know things went wrong.<br />
<br />
I think the moral of this story is that when using PGB you will need to see (if the PG API doesn't have what you want) if a PGB Plugin exists that can be used, then learn how to use that plugin. PG people occasionally add new plugins so the list changes.<br />
<br />
to be continued...<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2691411791846257795.post-6948414974466190162013-06-27T19:40:00.003-07:002013-06-28T13:21:27.141-07:00Mobile App Journey - Part IVOnce you have a an editor and testing environment, you can write much of your mobile app without any regard to PG. This article will not attempt to teach you HTML, javascript, or CSS. Nor will it attempt to teach you how to call a web service and retrieve data. I will show you certain things I did, which may or may not be "best practices". I will show you how I got my idea on Google Play using HJC and PGB and how I handled various issues.<br />
<br />
<i>Disclaimer</i>: Much of what I share is not my own invention, nor is it meant to be the only or best way. I'm just trying to recount how I got from "nowhere" to an app that doesn't crash. :-)<br />
<br />
<h4>
Phonegap.js</h4>
Earlier I asked you to ignore this file in Index.html. When using PGB you don't actually need the physical file but you do need to reference it in your .html files. PGB needs to see the reference to it in order to do its build properly. I tried having it only in Index.html, but then I couldn't get PhoneGap functions to work on other pages, so I added it to each page. I don't know if this is optimum or correct. <br />
<br />
PG has an <a href="http://docs.phonegap.com/" target="_blank">API</a>, which allows you to communicate with the device itself. But, it's important that you do not call the API until PG has finished loading on that page! The PG <a href="http://docs.phonegap.com/en/1.0.0/phonegap_events_events.md.html#deviceready" target="_blank">deviceready</a> event will fire when PG has finished loading. For example, you wouldn't check <span style="color: blue;">navigator.connection.type</span> until <i>after </i>PG was done loading.<br />
<br />
While there is code that may need to be called in the user function called by the <span style="color: blue;">deviceready</span> event, you can call PG API code outside of the user function if you do it properly. Sometimes you are testing on your desktop, perhaps using Chrome + Ripple, so there is no PG loaded as PG is only "alive" inside a real PG build, on a device.<br />
<br />
You may want to leverage native device behavior when it's available because it may just look better than javascript.<br />
<br />
Take the beloved javascript <span style="color: blue;">alert()</span> function for example (I think I ripped off a variation of this routine from Ray Camden):<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-8ALWkazbNZ4/UczJ96ZW_-I/AAAAAAAAASU/lDfZSazrag0/s674/struct7.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="105" src="http://2.bp.blogspot.com/-8ALWkazbNZ4/UczJ96ZW_-I/AAAAAAAAASU/lDfZSazrag0/s320/struct7.JPG" width="320" /></a></div>
<br />
Rather than calling javascript <span style="color: blue;">alert()</span>, we call the user function <span style="color: blue;">showAlert()</span> with a message and an optional title as parameters. <span style="color: blue;">if (navigator.notification)</span> looks for the existence of PG's API. Either it hasn't been loaded yet or it won't be because we are running in desktop mode or the device doesn't support it. If the API doesn't exist on our page we fall back on the good old <span style="color: blue;">alert()</span>. Otherwise we call the device's <b>native</b> version of <span style="color: blue;">"alert"</span>, courtesy of PG's <span style="color: blue;">navigator.notification.alert</span>, which will probably look more, um, 'native-like' and polished than the javascript <span style="color: blue;">alert()</span>.<br />
<br />
I guess the moral is that I did not do any interaction with <span style="color: blue;">deviceready</span> here -- since normally PG will be loaded by the time the user does something, and I check for PG's "existence" first,<i> </i>and finally I have the javascript<span style="color: blue;"> alert()</span> as my fallback.<br />
<br />
But there are times that you will want to execute code when the page loads that does involve the PG API, and for that you'd better put that code into the function you have <span style="color: blue;">deviceready </span>calling.
<br />
<br />
to be continued...
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2691411791846257795.post-71596213555664287652013-06-26T10:28:00.003-07:002013-06-26T12:07:24.551-07:00Mobile App Journey - Part IIII highly recommend the PhoneGap (and other) articles by <a href="http://www.raymondcamden.com/" target="_blank">Raymond Camden</a>. I also encourage you to view the PhoneGap and Twitter Bootstrap classes on Pluralsight (even if you only get as much done as you can using the Trial license).<br />
<br />
Typically, your application will have a file/folder structure something like this (ignore the "childbrowser" folder for now, and all other files besides index.html are up to you):<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-2if83L25tuM/Ucsd24Ymi7I/AAAAAAAAAQ4/vu1RGCSwkOw/s1600/struct1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-2if83L25tuM/Ucsd24Ymi7I/AAAAAAAAAQ4/vu1RGCSwkOw/s1600/struct1.JPG" /></a></div>
<br />
Each of your .html files would need (given that I am using jQuery and Twitter Bootstrap) to look something like this at the top:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-bJAOOU1-T-E/Ucsi0tYzLWI/AAAAAAAAARI/9Aw6pVTIVs0/s1600/struct2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="80" src="http://2.bp.blogspot.com/-bJAOOU1-T-E/Ucsi0tYzLWI/AAAAAAAAARI/9Aw6pVTIVs0/s320/struct2.JPG" width="320" /></a></div>
<br />
And like this at the bottom (please ignore phonegap.js and childbrowser.js for now):<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-fWHQZhAaFh4/UcskumX63pI/AAAAAAAAARY/u0raGEtcYO4/s1600/struct3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="85" src="http://3.bp.blogspot.com/-fWHQZhAaFh4/UcskumX63pI/AAAAAAAAARY/u0raGEtcYO4/s320/struct3.JPG" width="320" /></a></div>
<br />
I would start out with downloading a Twitter Bootstrap template as your index.html, and add the jQuery references. "main.js" is my application's javascript file. Test your index.html both as a "normal" web page and also in an emulator (such as Google + Ripple).<br />
<br />
Learn how the Twitter Bootstrap menus work. Their responsive capabilities will cause them to display differently based on screen size. Learn the TB classes.<br />
<br />
As to user input, HTML5 has many validation niceties -- unfortunately many browsers do not use them! So while, yes, you should code them in your HTML, you will also need to manually validate in your javascript, and if you are passing the values up the wire somewhere to a service of yours, validate there too.<br />
<br />
My form code has this:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-MnsoqhlAQVg/Ucsp2tyTNTI/AAAAAAAAAR0/jdclfjsTOug/s1600/struct4.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="26" src="http://2.bp.blogspot.com/-MnsoqhlAQVg/Ucsp2tyTNTI/AAAAAAAAAR0/jdclfjsTOug/s320/struct4.JPG" width="320" /></a></div>
<br />
But since the validations are ignored on my phone's browser, I also have this code:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-kEhCsGFQU0I/Ucsp2l9y8MI/AAAAAAAAARw/ws779dH9-9c/s1600/struct5.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="89" src="http://2.bp.blogspot.com/-kEhCsGFQU0I/Ucsp2l9y8MI/AAAAAAAAARw/ws779dH9-9c/s320/struct5.JPG" width="320" /></a></div>
<br />
And this too, once I'm sure I have a number:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-Dh7QmNuVaDo/UcsraecnzMI/AAAAAAAAASA/TZ-yaDpI5VE/s1600/struct6.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="50" src="http://4.bp.blogspot.com/-Dh7QmNuVaDo/UcsraecnzMI/AAAAAAAAASA/TZ-yaDpI5VE/s320/struct6.JPG" width="320" /></a></div>
<br />
The code for <b>isNumber</b> (my apologies for forgetting the author whose post I lifted this from):<br />
<blockquote class="tr_bq">
<span style="color: #6aa84f;">// is it a number...</span>
<br />
<span style="color: blue;">function </span>isNumber(n) {
<br />
<span style="color: blue;">return </span>!isNaN(parseFloat(n)) && isFinite(n);
<br />
}</blockquote>
<br />
to be continued...Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2691411791846257795.post-72862253261555385682013-06-26T07:35:00.002-07:002013-06-26T09:50:42.455-07:00Mobile App Journey - Part IIFor convenience (mine namely), I shall refer to the HTML/javascript/CSS mixture as "HJC".<br />
<br />
The next major point to cover is that while I know some HTML, some CSS, and some javascript, I am by no means an expert, at all, in any of them. What I <i>am </i>good at is finding solutions to problems.<br />
<br />
I suggest you read up on <a href="http://phonegap.com/" rel="nofollow" target="_blank">PhoneGap</a>. Then read up on <a href="https://build.phonegap.com/" rel="nofollow" target="_blank">PhoneGap Build</a>. If I were just using PG, then I would perhaps be using Eclipse and compiling using various SDKs for Android, iOS, etc. PGB doesn't give me all the options that the Eclipse/SDK combination does, but it saves much time if you can live with what it does give you.<br />
<br />
Next, I needed to settle on an editor. Having a .NET background I could have used Visual Studio, but to try something (quite) different I chose JetBrains Webstorm, which ties nicely into Google Chrome (using the Ripple emulator) for testing. There are any number of combinations you can decide on. I'm not saying this is the best.<br />
<br />
Next, I decided on what extra libraries I wanted to use. My inclination is to use as few as possible. I chose the ubiquitous jQuery, and Twitter Bootstrap. I decided not to mix in jQuery Mobile. jQuery has ease of use with making AJAX calls, notation, etc., and TB's framework does a good job of allowing one to build a web app that fits on about any screen.<br />
<br />
We will leave PG out of the picture for now.<br />
<br />
A reminder: this series' purpose is not to teach you HJC (be thankful for that!). It's merely retracing the things I learned and went through to get an app to market, using HJC and PGB.<br />
<br />
to be continued...Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2691411791846257795.post-91590077655043644032013-06-25T14:22:00.000-07:002013-06-26T09:50:31.070-07:00Mobile App Journey - Part IAs for many, the idea of building and deploying a mobile app was for me a compelling idea. This series will recount my decisions and actions to bring my first app into fruition.<br />
<br />
Perhaps the first questions is: native or HTML/javascript/CSS (from now on I will refer to these as 'native' and 'mobile app')? For certain scenarios native is best or necessary, and yet for many applications a mobile app will suffice.<br />
<br />
The second question then became: if I go mobile app, should I try a hybrid approach such as PhoneGap (Cordova)? There are other good hybrid choices such as Xamarin (although not free).<br />
<br />
The advantages of a hybrid approach was that in theory I could write an app once, and have it deployed to Android, iOS, Windows, etc. The other advantage of course was that I wouldn't need to learn Java, Objective C, and other languages.<br />
<br />
Since my initial app was going to consist of gathering a few inputs from the user and sending the inputs off to a web service, then getting data back and displaying the results, I decided that the mobile app (HTML, javascript, CSS) approach was fine.<br />
<br />
I then decided that "yes, I would like to be able to install my mobile app as an 'app' on Android, iOS, and Windows", and therefore I wanted a build solution that packaged my HTML, javascript, and CSS into a native wrapper that could be deployed as a native app.<br />
<br />
After a week of back and forth I chose PhoneGap (PG), and more specifically PhoneGap Build (PGB). PGB allows me to zip up my mobile app and upload it, and then PGB dutifully generates native apps which are wrappers around my HTML, javascript, and CSS. Thus far I am happy with this decision, although there are some important details not obvious and which I learned about in Shawn Wildermuth's PhoneGap class on PluralSight.<br />
<br />
to be continued...Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2691411791846257795.post-14537089497116854992009-12-09T13:15:00.000-08:002009-12-10T13:04:29.549-08:00The Everybody Meeting<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4vdc1D3fLXc/SyFhqlAWLbI/AAAAAAAAAMc/sNDx3RaujOE/s1600-h/throng.jpg"><img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 96px;" src="http://4.bp.blogspot.com/_4vdc1D3fLXc/SyFhqlAWLbI/AAAAAAAAAMc/sNDx3RaujOE/s200/throng.jpg" alt="" id="BLOGGER_PHOTO_ID_5413715611192012210" border="0" /></a><br /><span style=";font-family:verdana;font-size:12px;" ><br /><span style="font-weight: bold;">Historically</span>, in software development, one sure way to kill developer enthusiasm and slow productivity is to have the infamous "everybody meeting", daily.<br /><br />These meetings come in many forms, but let's use the "defect call" call as our example. This is particularly painful when the team is large and spread across multiple physical locations. At any one time a particular defect may involve 5-10% of the people on the call. Rather than the developer, business stakeholder, and QA person discussing the defect together offline, they spend 30 minutes or so reviewing the ticket, re-visiting the actual business requirements, whether it really is a defect, etc.<br /><br />The other 15-20 people on the line may have no interest -- and they are relatively unproductive while the conversation continues.<br /><br />Let's assume $50 per hour per person. For 20 people this is $1,000 per hour. If 15 people are not engaged in the defect being discussed then $750 per hour is being wasted, NOT counting the work they could be doing which is going undone. NOT counting the "why did I just waste my time" de-moralization effect.<br /><br />Managers have a tendency to feel comfortable when everyone is attending the meeting and available for discussion. But caution must be exercised when these meetings involve more than 4 or 5 people. People need to do their "homework" first, and bring suggestions and solutions to the meeting if at all possible, reducing the negative effects (and costs) that a large meeting can cause.</span>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-2691411791846257795.post-89829826983802585642008-05-17T15:50:00.000-07:002008-05-17T16:02:40.969-07:00Finding Lost Family Members<span style=";font-family:verdana;font-size:10;" ><br /><span style="font-weight: bold;">This</span> post is completely off-topic, but is one that hit home personally and I felt deserved mention.<br /><br />Family members can become displaced from one another through divorces, war, moving, and traumatic events such as <i>Katrina</i>. What is needed is a free, electronic "bulletin board", where people can leave a "post-it" so they can be found, and likewise search for a missing loved one or friend.<br /><br />I came across such a site at <a href="http://FindMyFamily.LastISawYou.com">FindMyFamily.LastISawYou.com</a>. After a painless, non-invasive registration, you can leave an electronic "post-it", and also search the database for any family members you may be looking for.<br /><br />The downside is that the database is based upon participants who leave a message, but if the word gets out for this free service that should not be a problem.<br /><br />In this day of paid services for employees, classmates, matches, etc., it's nice to find a free site doing such a noble service. I encourage you to spread the word!<br /></span>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-2691411791846257795.post-9189399801403052832008-04-28T18:49:00.000-07:002011-04-11T16:52:12.577-07:00Screen scraping from Business Networks<span style="font-family:verdana;"><br /><span style="font-weight: bold;">Business</span> networks, such as LinkedIn, ZoomInfo, etc., can be a very helpful way to find professionals that may fit into your software development or management teams. LinkedIn has data that is entered by the individual, whereas ZoomInfo assembles data by scouring the 'net.<br /><br /><span style="font-weight: bold;">[Update April 6, 2011]</span><br /><br /><span style="font-style: italic;">Network Grabber can now scrape pages for the LinkedIn Recruiter pages. So, if you are paying for this high level feature of LinkedIn, you can now pull the data off your screen with a click of the mouse.</span><br /><br />However, getting information that exists in these networks into a usable format, even something as simple as an Excel spreadsheet, is not very easy. Some business networks (intentionally?) make the copy/paste process almost unusable.<br /><br />Fortunately, I found a very effective tool, "Network Grabber", at <a href="http://www.networkgrabber.com/">www.NetworkGrabber.com</a>. This handy tool is actually a browser, and with one click of a button allows one to copy what they have browsed into Tab or CrLf delimited format. What was taking me an hour, now takes less than 5 minutes.<br /><br />My friends and colleagues can now be put into a file where I don't have to log into the network and search.<br /><br />If you spend even a moderate amount of time trying to screen scrape your contacts, I suggest you give it a try. A real time saver!<br /></span>Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-2691411791846257795.post-48878921152146844312008-01-26T16:10:00.000-08:002008-01-27T14:26:06.988-08:00Seeds of Failure<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_4vdc1D3fLXc/R5vSMR1F1TI/AAAAAAAAABE/VyPybu7v2NE/s1600-h/thorns.jpg"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_4vdc1D3fLXc/R5vSMR1F1TI/AAAAAAAAABE/VyPybu7v2NE/s320/thorns.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5159948906469381426" /></a><br /><span style=";font-family:verdana;font-size:10;" ><br /><span style="font-weight: bold;">Managing</span> vendors (and their representatives) can present its own set of challenges.<br /><br />I was brought in to be Project Manager, support the IT Manager, and help oversee the replacement of their 3rd party loan package. The company in question makes loans and investments to companies that service the low income community -- loans to build housing, child care, etc. They borrow money and loan it out at a higher rate, just like a bank, but have a different business model.<br /><br />The kicker was that the well known loan package had never been installed at a low income investment fund before, so they were untested in this "space". The IT Manager had never overseen this type of installation before, and the PM for the vendor was long on promises and good will, but short on delivering proof that the software could do the job.<br /><br />The vendor's saleman was vague on the pricing, and when the vendor's PM came up with a quote for implementation that was near double the salesman's vagaries, there was added drama. Furthermore, the IT Manager thought the quote included the imaging module, and when it didn't they had to cough up additional money for that.<br /><br />This is where I came in. One of the first things the IT Manager did was to give me the vendor PM's Microsoft Project file, with the instructions to fill it out with "more stuff".<br /><br />The plan called for ONE data conversion, followed by a number of employees verifying the converted data. Then followed by workflow testing (assuming that the test scenarios could be modeled in the new system -- something that should have been done up front before selected the software package!). Then, there was ONE month of parallel testing and followed by going "live".<br /><br />What I am saying here is that this project was doomed near it's inception. When I would voice my concerns, the standard answers from the vendor's PM were "I don't see any red flags" or "I think we're good". While I was skeptical and voiced as much to the IT Manager, she discounted my concerns because there was a hard go-live date and my sense of risk went against this.<br /><br />As it turned out my duties were more along the lines of being an MS Project "updater", and none of my other PM skills were needed or wanted. The IT Manager and I developed a large credibility gap, and I was therefore limited in what I could do to help. There remained no real point in my staying on the project.<br /><br />As I later found out, there were numerous conversions and also problems with test case scenarios. The hard go-live date was missed and there were a variety of other problems too.<br /><br />As always, one reaps what they sow, and the seeds of failure were sown early-on for this project. Very unfortunate, since the the company's purpose is a noble one.<br /></span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2691411791846257795.post-34963276483348347472008-01-17T22:07:00.001-08:002008-01-17T22:22:22.902-08:00Halt the Train Wreck<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_4vdc1D3fLXc/R5BE_WK6a2I/AAAAAAAAAA0/7qBsS8D5WIU/s1600-h/train+wreck.jpg"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_4vdc1D3fLXc/R5BE_WK6a2I/AAAAAAAAAA0/7qBsS8D5WIU/s320/train+wreck.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5156697428413016930" /></a><br /><span style=";font-family:verdana;font-size:10;" ><br /><span style="font-weight: bold;">At</span> times a project is deemed to be "out of control", "a train wreck", or a "catastrophe". A time-out is required to assess the project, the team, and the management, and to see if the project can be salvaged.<br /><br />While it may seem reasonable to some that project development could continue in some way while these evaluations are being made, it is best to stop the project.<br /><br />Evaluation of a project disaster requires the full involvement of the key team members (stakeholders, development staff, key management), and if project development is taking place in parallel you will not get the time and focus from them required to salvage it.<br /><br />Unraveling the project will require decisions that may not be pleasant. These decisions can affect the team and project significantly. Allowing the project to limp along in catastrophe mode absorbs valuable resources without any real benefit to the project, and will allow important decisions to be put off. Halting the project will hopefully "light a fire" and drive home the point that the sooner decisions are made, the sooner the project can continue.<br /><br />Halting the project also sends the message that top level management is serious about the disentanglement process.<br /></span>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-2691411791846257795.post-38739247663711593402007-12-30T12:48:00.000-08:002007-12-30T12:52:03.117-08:00Death By Feature<span style=";font-family:verdana;font-size:10;" ><br /><span style="font-weight: bold;">The</span> Cutter Consortium, which has been analyzing data on software projects for many years, has found that an over aggressive feature list is the second most common reason for project overruns (the first is changing requirements). At times, trying to provide too many features actually ends up providing less (or none, in the case of a failed project).<br /><br />Reducing the feature list is a key step in recovering a software project that is on the road to ruin. Paring this list to an acceptable minimum is no easy task. Reducing the list too much will produce a deliverable that is completely ineffective and serves no business purpose.<br /><br />In the feature list reduction process, or more simply "goal reduction", is it essential to know who in the company sets the project goals. Any changes to the project's goals will require the approval of those who originally set them.<br /><br />When reducing the list of goals to those deemed "essential", there are three basic categories to keep in mind:<br /></span><ul><li><span style=";font-family:verdana;font-size:10;" >Essential: requirements without which the project will have no real value.</span></li><li><span style=";font-family:verdana;font-size:10;" >Important: requirements that significantly improve the project.</span></li><li><span style=";font-family:verdana;font-size:10;" >Would be nice: requirements that add things such as attractiveness, ease of use, bells and whistles, etc.</span></li></ul><span style=";font-family:verdana;font-size:10;" ><br />Remember: the longer you wait to define realistic goals, the less you can actually deliver.<br /></span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2691411791846257795.post-44896760763456511442007-12-17T10:03:00.000-08:002007-12-17T15:18:23.298-08:00Is Your Project A Budget Catastrophe?<span style=";font-family:verdana;font-size:10;" ><br /><span style="font-weight:bold;">E.M. Bennatan</span> states that "a project is a budget catastrophe if the remaining projected cost far exceeds what the development organization is willing to pay for it". Or as it often is, what the sponsoring department or customer has allotted for the project.<br /><br />Project overruns are often the result of schedule overruns, or of attempting to reduce these overruns (e.g., adding staff), so usually a schedule overrun is evaluated first.<br /><br />A budget alarm is usually triggered if the expected remaining cost <span style="font-style:italic;">far</span> exceeds its break-even value, however, many times this value is not given enough consideration up front.<br /><br />Should the project be canceled if the remaining projected cost far exceeds what the development organization is willing to pay for it? Not always, since it was the <span style="font-style:italic;">projected </span>cost that set off the alarm. Reducing the project scope may be an alternative, thus reducing the projected cost and allowing the project to continue. This is one of the key objectives in disentangling a software catastrophe.<br /></span>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-2691411791846257795.post-4215897502904800102007-12-09T11:40:00.000-08:002007-12-11T11:38:11.875-08:00Being Out Of Control<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_4vdc1D3fLXc/R1xFscNRauI/AAAAAAAAAAs/0hi-ZYsOmd8/s1600-h/ooc.bmp"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_4vdc1D3fLXc/R1xFscNRauI/AAAAAAAAAAs/0hi-ZYsOmd8/s320/ooc.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5142061504338684642" /></a><br /><span style=";font-family:verdana;font-size:10;" ><br /><span style="font-weight:bold;">Managing</span> a software project that is out of control is a miserable experience. It seems as everyone looks at you with anger or pity.<br /><br />Many times senior management does not know when a project is out of control, or why. Too often they think that it is the project manager's fault, even when it is not. A project can be out of control for many reasons: senior management, appeasing the stakeholders, no rigor to the development cycle, etc.<br /><br />Determining if a project is out of control is not always easy for in-house personnel to do. Many times it is best to bring in an outsider, much like a marriage counselor, to help evaluate and pose emotionally neutral conclusions and suggestions.<br /><br />Once this has been done, the project can either be sorted out and re-started with a fresh set of goals and a new focus, or it can be shut down entirely.<br /><br />Having a solid set of criteria with which to evaluate an out of control project, and the right evaluator, are paramount to the success of this process.<br /></span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2691411791846257795.post-27939328973829036362007-11-27T20:31:00.000-08:002008-01-01T17:32:28.975-08:00"Classic Mistakes"<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_4vdc1D3fLXc/R0z1AnXi6uI/AAAAAAAAAAc/JYospwtqJYc/s1600-h/hb.jpg"><img style="margin: 0pt 10px 10px 0pt; float: right; cursor: pointer;" src="http://bp2.blogger.com/_4vdc1D3fLXc/R0z1AnXi6uI/AAAAAAAAAAc/JYospwtqJYc/s320/hb.jpg" alt="" id="BLOGGER_PHOTO_ID_5137750665839438562" border="0" /></a><br /><span style=";font-family:verdana;font-size:10;" ><br /><br /><span style="font-weight: bold;">Without</span> knowing it, your company, department, or project can pick up bad habits. Some of these are so predictable they are known as <a href="http://www.stevemcconnell.com/rdenum.htm">"classic mistakes"</a>. I had a manager once who without fail would mis-manage a project, er, several of them, to the point that when faced with missing a delivery date he would hire many contract developers (this is Classic Mistake #5) to pull his fat out of the fire, but it never worked.<br /><br />The legendary Steve McConnell's excellent list should be on every manager's office wall, predominantly displayed so that their boss can read it, since project managers are often asked to come up with "creative solutions". Knowing what the classic mistakes are, in advance, helps one to avoid them.<br /></span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2691411791846257795.post-38459508861769189932007-11-22T10:06:00.000-08:002007-11-27T21:40:40.047-08:00Project Success Basics<span style=";font-family:verdana;font-size:10;" ><br /><span style="font-weight:bold;">Large</span> sums of money are spent along with many man-hours to establish frameworks and processes that will give a software project a fighting chance of success.<br /><br />However, there are fundamental (and less costly) measures that should be put into place first, as recommended by the <a href="http://www.infoq.com/articles/Interview-Johnson-Standish-CHAOS">Standish Reports</a>:<br /><br /><span style=";font-family:arial;font-size:10;color:navy;" >The project manager must have the full backing of executive management.</span> This requires a qualified executive decision (selecting the right project manager) by someone who knows the nature and abilities of their project manager, and a continued and close interaction with them during the project.<br /><br /><span style=";font-family:arial;font-size:10;color:navy;" >The business users must be involved during the entire project.</span> Whether or not they give clear cut specifications, change their minds, etc., a sure way to hinder the success of a project is to lose touch with the people who came to you for assistance in the first place.<br /><br /><span style=";font-family:arial;font-size:10;color:navy;" >Specifications are clear-cut and achievable.</span> At times it is all too easy to push fuzzy and unreasonable specifications over to the development staff, and then watch them fumble. Management must insist that the requirements are clear, and reasonable.<br /><br /><span style=";font-family:arial;font-size:10;color:navy;" >Responsibility and accountability: Each team member must have a clear understanding of their roles and duties.</span> Perhaps most importantly, the project manager must be given the authority to manage (see the first item in our list), since they will certainly get the blame if things go wrong. The project manager cannot be someone who just keeps a project diary or maintains the schedule.<br /><br />These are just a few of the fundamental principals that must be followed in all projects, regardless of the management software and tools that are used.<br /></span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2691411791846257795.post-11346463543282158662007-11-14T12:05:00.000-08:002007-11-27T21:40:53.342-08:00The Birth of Agile Development<span style=";font-family:verdana;font-size:10;" ><br /><span style="font-weight:bold;">Up</span> until around 1980 or so, many software projects were carried out by what is called the "waterfall" approach: painstaking effort spent eliciting user requirements, publishing design documents, and coding to the specification -- often using COBOL.<br /><br />The problem was that it was a rather slow process: no one can ever rattle off all of their requirements, accurately, and by the time the code was written the requirements may have genuinely changed. Using a language such as COBOL tends to make team write many lines of code.<br /><br />In the late 1970's and into the 1980's, there was a movement of <a href="http://www.decosta.com/Nomad/tales/history.html">"fourth generation languages"</a>. The most notable of course was NOMAD2, and to a lesser degree FOCUS. NOMAD2 had a highly sophisticated DBMS, high level programming language, extremely rich set of functions, and the best report writing language ever seen. Corporations such as Bank of America and Chevron were early adopters of NOMAD2 and each had millions of lines of code in it.<br /><br />This enabled developers to take the specifications and build a working prototype rather quickly, which in turn presented something visible and tangible to the user as opposed to having to rely on written documents and sketches of screen layouts. This process in turn fed back into a refinement of the specifications, and a better deliverable done more quickly than if previous methods had been used.<br /><br />Perhaps without knowing it, the "agile" methodology had been born (this will, I know, contradict the belief that it was born at a <a href="http://en.wikipedia.org/wiki/Agile_software_development#History">ski lodge in Utah</a>). 4GLs, as they were known, were used extensively in the '80s, but their use waned with the explosion of client/server technology (thus moving away from mainframes), Windows, event driven programming, and the rise of SQL as the <span style="font-style:italic;">de facto</span> query language (which has yet to equal 25% of the abilities found in NOMAD2).<br /><br />Like many worthy software products, most 4GLs did not make the transition to the Windows platform and we ended up with lots of C, C++, and VB, along with new DBMSs, most notably SQL Server and Oracle. In some ways we went back to 3GL coding, but with much more complexity, and so we rewound and the search for a "better way" got fresh legs.<br /><br />Too often one can become part of a religious war of waterfall vs. agile, rather than focus on what practices will work best for the project and the team available. These thoughts will be explored more in future articles.<br /></span>Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-2691411791846257795.post-62905037491291192722007-11-11T21:20:00.000-08:002007-11-27T21:41:09.214-08:00Project Manager Selection<span style=";font-family:verdana;font-size:10;" ><br /><span style="font-weight:bold;">Many</span> times the success of a project reflects favorably on senior management, while the failure of the same project will be blamed on the project manager. Without question the role of project manager is critical, but so is the quality of senior management's decision on which manager is being matched to a particular project and development team.<br /><br />Equally important is whether a project manager has been given the authority as well as the responsibility of managing a project. If a manager has little or no authority to enforce coding standards, source control, unit testing, or to resist scope creep foisted upon him by users or (even) senior management, then this manager can hardly be held accountable for failures in these areas.<br /><br />Senior management must not only correctly select the right manager for a project and the associated team, they must make it clear that their choice of manager has their support, and the authority to run their own show. Selecting a manager that has never done at least moderately agile development may not be the best choice when managing developers who have done nothing else. But, selecting a manager that has done <a href="http://www.codinghorror.com/blog/archives/000694.html">waterfall</a> and agile may be a very good choice since the manager is in a position to educate the development team.<br /><br />There are a number of key points for senior management to consider when assigning the manager. A project manager is not there just to take notes during meetings and send out updated status reports, or just add more detail to the project plan. A project manager is there, at least partly, to ensure that quality deliverables that meet the business specifications are built, on time. Many times this must be done while harmonizing with developers who are temperamental, for whatever reasons.<br /><br />Clearly, a large burden is put upon senior management to select the right manager for the project and personnel.<br /></span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2691411791846257795.post-45133605110893365002007-10-29T13:13:00.000-07:002007-11-27T21:41:41.211-08:00When Is Software Like A Fence?<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_4vdc1D3fLXc/Ryoh2k-S8yI/AAAAAAAAAAU/onfu8eolID8/s1600-h/fence.jpg"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_4vdc1D3fLXc/Ryoh2k-S8yI/AAAAAAAAAAU/onfu8eolID8/s320/fence.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5127948347236348706" /></a><br /><span style=";font-family:verdana;font-size:10;" ><br /><span style="font-weight:bold;">When</span> is a software project like a fence?<br /><br />Building a fence a time or two gives one a sense for how much time a fencing project will take. Removing the old fencing, old posts (and concrete), and cleaning up the work area for the new fence are all part of the project. (And so is hauling it away, but somehow I've failed to negotiate that point with tradesmen a time or two!). Computing how much and what types of wood one needs, how much concrete, and how much time is needed for each fence section are relatively straight-forward.<br /><br />Things that will affect a "linear" computation of cost and time will arise, such as terrain, difficulty removing concrete for the old posts, weather, permits, and so on. However, after doing a few fences one can become pretty accurate in estimating the cost and duration of a fence project.<br /><br />A few things that really help this are: the fence is tangible; one can see the terrain; one pretty much knows what the owner wants; it is unlikely the fence requirements will change drastically half-way through.<br /><br />But that is the art of software project management: reducing concepts and intangibles into "real" things that can be visualized, estimated, and built. Seeing the unforeseen. Letting the users know that changes to certain specifications are like tearing down a fence and starting over. That changing specs early on (before the concrete dries around the fence posts) are easier rather than doing them later. That changes are doable, but changes have two side effects: time and money.<br /><br />Just as building a fence requires a progression of tasks (e.g., one cannot put up the fencing until the posts are in place and the concrete is dry), so does software development. Just as there is a point where adding people to a fencing project will have no positive effect, so it is with software teams. Just as one can look at the amount of fence standing and conclude what percentage of the project is done, so must a manager know how much of the project's tasks are complete so he knows where the project stands.<br /><br />While a software project usually has many more complexities than a fence project, at times it is helpful to step back and try to see software projects from a more practical viewpoint and less as a morass of out of control details. A manager must be able to translate intangibles into tangibles.<br /></span>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-2691411791846257795.post-15804603297368428422007-10-26T10:51:00.000-07:002007-11-27T21:41:53.076-08:00Inauguration<span style=";font-family:verdana;font-size:10;" ><br /><span style="font-weight:bold;">For</span> this inaugural post I thought it appropriate to state what I hope to achieve here.<br /><br />Whether you have been at the helm of project management or directing technology efforts, have been at the "receiving end" of such, or perhaps you are a technician caught in the middle, you know the effort and frustration that can accompany software development.<br /><br />I have been in all of these places. I've been part of failures and successes, fun companies and miserable, profitable and not so much. I have worked with highly skilled people and with those who should not be responsible for managing a lemonade stand.<br /><br />What I have learned is what we all do: people (at least the ones you want on your team) like to be part of successes and to feel as though they have achieved something with their time. Your definition of success may differ from mine, but you know when you've had one. It usually involves staying within schedule, and budget, and delivering quality. Some fun along the way and a bonus is even better!<br /><br />So, this blog will attempt to deliver some practical advice and stir your thoughts towards more success in software project management -- whether you are a director, a project manager, a developer, or a user.<br /></span>Unknownnoreply@blogger.com0