Saturday, October 15, 2016

Lightweight Software Development Life Cycle with Aptana and Github

Like many of us, I suspect, the software development life cycle (SDLC) for my personal projects is quite different from that of my work.  Obviously, I have complete autonomy when it comes to deciding what tools and processes to use for my personal projects.  Much less so at work.  I recently took a fresh look to identify opportunities to standardize and simplify my personal projects' process.

I was able to distill my process down to the use of just two (free) tools:
  1. Aptana IDE
  2. GitHub
With just these two tools plus some first time setup and a little coding (which I will explain in more detail below), I am able to do all of the following:
Aptana has been my favorite Windows IDE for a number of years now.  It is closely linked and mostly compatible with Eclipse, the de-facto standard IDE at my work.  However, unlike Eclipse, Aptana is targeted more at general web development and less at Java.  Both tools offer tight integration with Git, providing rock-solid version control.  GitHub provides a SaaS-based, highly intuitive UI layer around Git.  However, it also offers so much more, including simple but effective ways to manage your issues, releases, and portfolio.

My simplified process flow looks like this:


 

First Time Aptana Project and GitHub Repos Setup


  1. Launch Aptana
  2. Select Remote tab
  3. Select Transfer Files and copy entire directory representing project to local machine
  4. Select Project Explorer tab
  5. Select Import... -> Git Repository as New Project
  6. Select URI and input corresponding URL for that repository as displayed in Github website (for example, https://github.com/yourid/your-new-project)
  7. Select Project Explorer tab
  8. Copy entire directory representing project to the new Aptana project
  9. Select Team -> Commit...
  10. Select Team -> Push
Your local Aptana project and Git repository is now linked to your GitHub repository.

 

Create Release in GitHub

  1. Refer to:

https://help.github.com/articles/creating-releases


IMPORTANT: Before deploying the release to your remote host, be sure to save off the directory representing the replaced release (i.e., don't simply overwrite).  This provides you with an easy way to toggle back to your "working version" if you encounter issues during your sanity checks.  It also ensures that any post-deployment customization is retained and available to copy to the new release.

 

Generate Portfolio/Project List from GitHub

Use GitHub API to build your portfolio or list of projects.
Refer to:
https://developer.github.com/v3/

You can see my implementation of this at
http://www.logixware.com

 

Bonus Tips

If you are like me, you often need to move issues from one GitHub repository to another.  This tool provides a simple and easy way to do it:
https://github-issue-mover.appspot.com/

Do you like to receive digest emails reminding you of the outstanding issues in your GitHub queue?  If so, IFTTT has a "recipe" for that. 




Thursday, August 18, 2016

Acting Jobs

I just watched the Danny Boyle directed movie Steve Jobs.
It left me wondering what makes a good boss? Are these the same characteristics needed to be a good leader?
More on those questions later. First, though, my review of the movie itself.


The film is essentially a three act play centering around product events:
  • The launch of the Macintosh
  • The launch of the Next
  • The launch of the iMac
Aside from these 3 product launches, the movie includes a sprinkling of flashbacks.  Some depict Steve Jobs and Steve Wozniak in the iconic garage, pre-fame and long before Apple became "the most valuable company in the world". I like the pared down scope of the movie. It reminded me of Apple's legendary clean design. The focus on (mostly) just 3 events is a significant departure from many of the other books and movies about Apple and/or Jobs, which typically join many more of the dots for us. The latter approach includes Walter Isaacson's excellent book and biography, also titled Steve Jobs. However, for a 2 hour movie to cover all of that ground would, by definition, lead to dilution and lack of depth.  I also appreciated the choice of Michael Fassbender in the title role.

Fassbender (right) plays Jobs

The actor does not look much like Steve Jobs but he (and the film) manages to convince you that you are watching the opinionated genius himself. The other main character in the movie is Joanna Hoffman.  Coming in, I knew little about her, but I am now interested in better understanding her role in the Apple/Jobs legend.  According to the movie, Hoffman was Jobs's closest confidant at both Apple and Next, and he actually respected her forthright personality.
The movie also does a nice job of representing the Jobs-Wozniak dynamic.  Somehow managing to be best friends despite possessing seemingly opposing value systems.  The story does this without picking a winner.  Jeff Daniels is memorable as John Sculley, a father figure who tragically, in Jobs' view, betrays him.  Finally, the movie riffs on Jobs denial of, and subsequent relationship with, his out-of-wedlock daughter.  The film succeeds in presenting each of these relationships as nuanced, allowing the viewer to empathize with -- and  dare I say understand -- each party.

In summary, a very good movie which I expect to see again.

Genius?  Tyrant?  Both? 

So should we view Steve Jobs as "a good boss"?  Should he be considered "a great leader"?
He seemed to break -- with relish in some cases -- the conventionally held rules about leadership.  For example he would regularly:
  • Humiliate subordinates (both publicly and privately)
  • Display an extreme lack of flexibility
Yet despite that, he seemed to be able to inspire many around him.  There is also no question that he was genuinely passionate.  Clearly that inspired some around him.
Do we judge a person's "ability to lead" based solely on his/her results and/or legacy?  By that measure, Jobs is, without question, one of the best.  Or must we factor in the methods used to obtain those results?  If so, surely he could not be considered "great".  My theory is that his personality was so polarizing that it resulted in two phenomena.  The first was that he effectively chased away good people who realized they could not work with him.  As a result, many of those that remained were steadfastly loyal, even while recognizing his "quirks".  The Apple/Jobs phenomenon was also, perhaps, largely a result of the place and time (post-hippie, pre-Silicon Valley Palo Alto).

We have not seen a tech visionary or leader like Jobs since his death, almost 5 years ago.  I suspect that we never will. 

Saturday, September 12, 2015

Hybrid Mobile App Development with Intel XDK

About a year ago, the lure of developing my very first app and the opportunity to partner with a group of extremely creative people finally drove me to take the plunge into mobile app development.  This blog entry documents the odyssey of a 25 year software development veteran into "uncharted waters".

Native versus Hybrid 

Traditionally -- it seems odd to associate that word with something that has been around for little more than 5 years -- all mobile apps were native.  That is, native mobile apps are developed directly for a particular target device family.  Specifically, a native app is developed for iOS devices and written in Objective-C or developed for Android OS and written in Java.  However, there is now another option; a so-called hybrid mobile app.  Hybrid mobile apps are developed without (direct) concern for the target device.  Instead, the app is written using standard web technologies -- HTML5, CSS3 and Javascript -- and "wrapped" in a lightweight, native WebView.  By using such technologies, we are promised portability.

As you might expect, the primary trade-off to consider when selecting between the 2 approaches is improved performance (native) versus greater compatibility (hybrid).

Mostly because I use these standard web technologies on an almost daily basis, and I have not touched any variation of the C language in over 10 years, plus the fact that I did not anticipate any particular need for blazing performance, I chose to travel the hybrid mobile app path.

Tool Selection

The incredible churn in the range, capabilities and even branding of hybrid mobile app tools was intimidating, making my second decision much trickier than the first.  I considered many of the tools recommended by a variety of technical websites including:
  • app.js
  • jQuery Mobile
  • Kendo UI
  • Sencha Touch
  • Ionic
  • Intel XDK
  • Titanium Mobile
  • Knockout
  • Montage
For me, my first gate was cost.  If I perceived any possibility of an expense in implementing a tool, it was eliminated from the shortlist.  Out went Kendo UI.  Secondly, I looked at server/hosting complexity.  I also expected to use a pre-existing domain/host that offered no support for Angular or node.js.  Goodbye app.js and Ionic.  Thirdly, given my experience with them, I wanted to ensure that the tool offered tight integration with jQuery and Bootstrap.  Finally, I looked at intangibles.  Based upon some negative comments and my own lukewarm experience using it as part of a webapp project, I eliminated jQuery Mobile.

In the end, I think what really sold me on Intel XDK was the breadth of functionality provided right out-of-the-box and its intuitive workflow.  In particular, Intel XDK offered direct support for many UI frameworks, including Bootstrap, its own App Framework, and, later, Framework7.  It provided in-the-cloud support for backbone.  It included a slick way to test and integrate web services.  The tool was tightly integrated with Cordova/PhoneGap and its family of plugins.  It offered multiple emulation and testing "modes".  It interfaced with each of these and more through an IDE that also offered a WYSIWYG builder.  I found the latter to be particularly useful during the first few months, trying to figure out the art of the possible.

Understanding Intel XDK's Project Options

Now that I had selected Intel XDK, I was then confronted with the selection of project options within the tool itself.   Like similar frameworks and IDEs, Intel XDK organizes solutions into projects (i.e., each of my hybrid mobile apps would have a corresponding project).  At project creation, Intel XDK presented me with a series of options that boiled down to this:
  • Do I want to use Cordova plugins in my app?
  • Do I want to build my app using the App Designer WYSIWYG builder?
  • Do I want to base my app on an existing sample or demo?
  • Which of the supported UI frameworks do I want to use in my app?
After a little experimentation, I arrived at the following answers:
  • Yes; unless you are building a truly trivial (or perhaps totally innovative app) there is almost certainly a Cordova plugin that you can leverage
  • Yes; in future, however, I might explore building an app without App Designer as its use can make for some tricky debugging and/or unnecessary code
  • No; although it was useful to independently review the code behind some of the samples and demos
  • App Framework; although I am already exploring the Bootstrap3 and Framework7 options

Apple Developer iOS Certificates, Identifiers and Profiles

There is also considerable set up required simply to allow your app be installed on iOS devices.  The dependencies are a little confusing but Intel XDK provides a guide, under the BUILD tab, that helps to clarify.  You need an Apple Developer ID with which you create certificates, define your apps, register devices (on which you want to test), and then generate a profile (typically, one per app).  This is all accomplished through the Apple Developer website.  You download the resulting profile file and install it into the Intel XDK project repository.  You then update the Intel XDK PROJECTS tab Build Settings to match the Apple Developer managed values (for App ID, App Name, Provisioning File, etc).

What Went Well

As previously mentioned, Intel XDK's focus on a soup-to-nuts solution really helped me to stay above water on a project that was my introduction to many terms, concepts and processes.  It really seemed intuitive and logical, to me at least, which is particularly impressive given the relative immaturity of app development.

I was also impressed with Intel XDK's efforts to provide responsive components out-of-the-box that I could easily test emulating multiple form factors.

I already had an inkling of the App Store Submission/Apple Developer process's labyrinthine nature.  Without Intel XDK's related guide, I might still be thrashing around trying to understand those dependencies.

The ability to easily deploy my app builds on device for "beta testing", before the actual App Store submission process, was a godsend.  I don't have any point-of-comparison, but I feel it unlikely that any other tool could make this more straightforward.

Not So Much

Even with Intel XDK's impressive breadth of functionality, I still needed to supplement my project development with:
  • Issue tracking (I used Github)
  • Authentication and authorization (I used Auth0)
  • Backend tools (I used PHP and MySQL, for which I needed separate IDEs)
Lack of built-in source code control was, perhaps, the most disconcerting aspect of working with the Intel XDK.  I did see a couple of general references to integration with tools (Github again, I think), but I never explored how practical that is.  The need for this was underscored by somewhat frequent crashing of the tool itself, although it is fair to say that the frequency of such crashes diminished as subsequent upgrades to the Intel XDK were made available (currently, I have been through about 5 such upgrades).

There is an almost dizzying array of variations within the Intel XDK, some that seemingly overlap (for example, the options under the BUILD tab).  Some of that seems to be the result of Intel's purchase and re-branding of what was once referred to as AppMobi.  This general sense of confusion around the plethora of decisions and options is further compounded by the lack of a single unifying and coherent set of documentation.

Next Time

For my next round of mobile app development, I will certainly consider the Intel XDK again.  Intel seems to be providing the resources to maintain and update its features.  This is absolutely critical given the ever-growing list of competitors and the rapid churn in the associated technologies.  I will also take a second look at Ionic and React.js.  You can be sure that I will also see what other tools have emerged in mobile app development.  I fully expect there to be a bunch more.

Sunday, July 27, 2014

Cloudy with a Chance of Data

The over-use, misuse and hijacking of the term cloud computing has been with us for some time now.  It has become the buzzword-du-jour of the technology industry, with ever more specialized variants emerging. With increasing frequency, we hear related terms such as software-as-a-service (SaaS), infrastructure-as-a-service (IaaS) and platform-as-a-service (PaaS).
The emerging data-as-a-service (DaaS) is, perhaps, the most interesting.  The barriers to entry for a startup or new player in this field are, potentially, the lowest of any of the as-a-service sub-genres.  Firstly, unlike IaaS or PaaS, there is no implied customer hardware leasing with this type of service.  Secondly, unlike its elder and more celebrated cousin SaaS, DaaS does not necessarily require providing customer access to software packages (in this case that might be structured or unstructured data management software such as relational database management systems (RDBMS)).  Instead, a compelling DaaS solution need only provide a logical and robust API to a set of data -- potentially stored elsewhere and managed by a different third-party -- served up in a variety of formats for the contemporary web.  Such formats would currently include variants of XML, JSON, and CSV.
When the dust settles, I can conceive that the principles behind DaaS provide the infrastructure for maintaining data synchronization between our devices.  Currently, such synchronization is hidden behind proprietary and opaque processes designed and maintained exclusively by hardware and software vendors such as Apple, Google and Microsoft.
I am mildly optimistic that the industry standards committees will forge a path to empower such innovation. With the expected continued dominance of mobile devices and the relative immaturity of both DaaS and data synchronization, I think I see a big, juicy plum.

Wednesday, March 23, 2011

So Much Data Yet So Little Time

Today, we are subjected to vast amounts of data. Nowhere is that truer than on the web. So, it is absolutely imperative that, for that fleeting moment while we have our viewer's attention, we present in an informative, appealing and interactive way. The emerging field known as data visualization aims to provide both the software tools and best practices to achieve those goals.
On the lighter side, taking the tried-and-trusted "Six Degrees..." concept, the Oracle of Bacon combines an extremely simple user-interface with the invitation to find two people in Hollywood who are more than 3 "degrees" apart. It is addictive and the simplicity of the website masks the complex algorithms based on the concept of breadth-first search (BFS) and the volume of data, courtesy of IMDB.
Top-notch data visualization is equally effective in presenting serious and sobering information. The University of Victoria, Canada website includes an interactive graphic presentation of catastrophic earthquakes. A quick study of this excellent page helped to identify my own misconceptions (killer earthquakes were relatively equally spread throughout the continents and they occurred with increasing frequency as the decades passed).

Tuesday, March 8, 2011

The (Hidden) Dangers of Functional Specialization

Like so many things in modern life, software development has become an exercise in absolute functional specialization. That is a single-minded goal of increasing levels of specialization. Economic specialization, whereby an individual worker has a single function, is at the heart of today's global capitalist system. This phenomenon is described in Adam Smith's seminal book The Wealth of Nations.

Economic specialization encourages each contributor to focus on a single goal or very limited set of goals. The payoff is efficiency. Each of us becomes an expert in a single endeavor, enabling a "group of highly optimized individuals" to team together. The proverbial whole is greater than the sum of its parts. There are, of course, darker aspects to this specialization fixation, many of which affect the individual contributors themselves (monotony, lack of motivation, reduced artistic expression, dependency upon others, etc), but it is difficult to argue with the theoretical gains in efficiency of such a system.

Those same efficiencies and "economies of scale" that are a result of specialization must transfer to software development, right?

It has long been argued, in software development circles, that two of the foundational premises upon which absolute functional specialization is based are bogus. The first is that there is some sort of median productivity against which to measure each individual. The second is that by "adding more bodies" we will always reduce the effort of each individual. Each of these assertions has been largely discredited in works such as the Mythical Man Month. This book claims, instead, that the range of productivity amongst individuals is so vast, depending upon expertise and experience, that it is meaningless to try to establish placeholder estimates. Secondly, through a series of case studies at IBM, it shows that the expected "reduction of effort" by continuing to add resources to a team not only fails to materialize but actually has the opposite effect. In other words, there is an optimal size for a team...and it is not infinity! Although written way back in the 1970s, I believe that this book remains highly relevant in today's Web 2.0 world.

As with any engineering project, multiple disciplines must be mastered to ensure quality. For software development, those are typically defined as:
  1. Analysis
  2. Architecture/Design
  3. Development
  4. Testing
  5. Maintenance
Conventional absolute functional specialization wisdom would have us believe that we should employ sub-teams of experts within each of these disciplines. It would also suggest that we decompose those sub-teams further. Perhaps we would create a "Black Box Testing Team" or a "User Experience Design Team"? Further, we might be tempted to create a "Back-End Development Team" or a "Java Development Team", perhaps even before we have defined the architecture? These tendencies toward absolute functional specialization, although logical in the abstract, reveal a subtle difference between creating software and creating something tangible. There is only one "raw material" used by each and every one of the software development disciplines: "words" (either written or verbal).

Think about the raw materials needed to build a house. Here are just a few examples:
  • Lumber
  • Brick
  • Concrete
  • Sheet metal
  • Stucco
  • Paint
Given the array of raw materials needed to build a house, it is little wonder that such a project results in teams of sub-contractors (foundation pourers, framers, carpenters, electricians, plumbers, etc). However, software development, in my opinion, is not nearly so complicated as we have made it...and there is just one raw material! Many of the aforementioned software development disciplines are the result of artificial distinctions. Why would someone who can develop software be unable to test it? Is it unreasonable to expect the business analyst to implement his "words" in today's software languages? Why should there be separate "Test Specifications" or "Test Plans" when each is really only a different lens through which to view the Analyst's requirements?

Since the publication of the Mythical Man Month, other factors have emerged (some simply as a result of the maturation of software development industry). These new factors further discredit the notion of absolute functional specialization:
- Democratization/technology mainstreaming: a much broader section of the population is exposed to and comfortable with technology
- Increased demand for software: including "Internet time" releases
- System fragmentation: open-source and other factors have led to a much wider set of tools, technologies and languages that contribute to each "software system solution"

In conclusion, I believe that there is such a thing as "functional over-specialization" in software development.

A better approach, I argue, is to empower a single team to perform all of the necessary disciplines. It is also important to stay current with the disciplines best-practices, allowing you to limit the toolset up-front. (Although common-sense, the "limited toolset" restriction is oftentimes loosened as a compromise that is felt necessary because a sub-team, for example, "only does testing".) Finally, it is critical to enable efficiencies not by defining further functional specialization but by instead enforcing use of a team-wide content management system.

Thursday, February 10, 2011

Tune-Up Your Win2K Pro PC

MS Word Document
*** Click link above to view blog entry in MS Word format ***