Feb 04 2011

Continuous Integration Saga – The move to Jenkins…

Category: Continuous IntegrationPhil @ 2:35 pm

If you have ever looked at my blog, you know that I’m a huge advocate of Continuous Integration and have been pushing Hudson for several years now.  The end of SUN unfortunately had a significant impact on many open-source projects, including Hudson. Support for Hudson continued to work pretty smooth from a user perspective until last December. I don’t think the quality of Hudson changed, but the quality of the releases seemed to change.  The Hudson team had been extremely consistent with their weekly releases; the release notes were always updated, the download links always worked, life was good. As 2010 came to an end,  something seemed to change; links pointed to the wrong versions, releases seems inconsistent, release notes were out of date or lagged days after.  The most obvious indicator was that the community was very quiet… something was happening behind the scenes.

Fast forward to last week, an important vote was taken by the existing Hudson community. It overwhelming decided to break away from ORACLE, essentially forking Hudson into a new product called Jenkins. ORACLE apparently holds the rights to the Hudson name and has already revamped the Hudson website. It will be very interesting to see what happens next. I don’t think I’m a fan of forking. I lived through the remnants of the emacs/XEmacs split; where did that really get us? In the end, I think it is mostly about ego and control; as users, we ultimately end up being split into two camps, typically incompatible with lots of petty sniping. You can read this recent announcement from ORACLE and the follow up responses, it is pretty obvious that this was not a friendly breakup!

Question of the Day – Which side are you picking?
I’m going with Jenkins.

  • First, the community was very committed to the split. Considering they have been leading the product for a very long time, I don’t predict a major change in direction.
  • Second, is Kohsuke Kawaguchi. This is not to take anything away from the rest of the Hudson
    developers; they all seem to do an amazing job and I anticipate this will not change. I am just extremely impressed with what KK has produced over the years.
  • Finally, where will ORACLE go with Hudson? Will there be anyone actually using it? I predict that Hudson will quickly fall behind in functionality to Jenkins and be a “good” choice for large companies that are only concerned about “supportability”.

Alternate Question of the Day – Which butler image will change first?
They can’t be the same, right? I think Jenkins should get a new mascot, after all, it is a brand new world! And one small favor, please don’t make it Chuck Norris!

I recently had the opportunity to create a couple Hudson plug-ins, this was a very educational experience! There is a lot of information available on the process, but unfortunately, I found it more valuable to walk through the code of existing plug-in implementations.  I believe that one of the major advantages of the Hudson/Jenkins architecture is the plug-in infrastructure. With just a little bit of vision and support, teams (and organizations) could extend Hudson into so much more than basic CI server. All things take time…

I already have my Jenkin’s server up and running and hope to get it integrated with my GitHub account in the near future… I want to finish documenting my experience creating a custom plug-in, which I will hopefully share out with my sample implementation.

https://www.beilers.com/wp-content/plugins/sociofluid/images/digg_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/reddit_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/dzone_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/stumbleupon_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/delicious_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/blinklist_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/blogmarks_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/google_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/facebook_48.png


Feb 04 2011

Interview Question – Name Five reasons Java is not Object Oriented?

Category: Java,Software DevelopmentPhil @ 12:53 pm

I thought it would be a really good idea to share interesting interview questions, especially the ones that caught me off guard!

I found this title to be a very interesting question… I’m not sure it was intended as an open-ended question, as I don’t think there is a right or wrong answer. It really depends on your perspective. Are you looking at it from a purely technical or logical (modeling/solution) perspective?   Even though I might be considered very technical, I prefer to stay out of the really low level stuff. Sure it is fun, to get down to the bare metal once in a while, but I get more enjoyment out of the thought process. Claiming to be a very Object Oriented person and stumbling on this question really bothered me… I came home and did some Googling, but really never found the answers that seemed to live up my expectations. Next, I sent an mail to one of my pals who just loves the nuts and bolts… In his typically witty way, he rattled off: int, float, boolean, double, long, and char. A completely valid answer! He then have me six other bullets which I have merged into the table below and tried to expand upon.

Reason Explanation
Primitives The interviewer lead me with this one, which it is actually pretty obvious when you think about it! This is really not disputable, primitives are not truly objects. I think for historical reasons, namely performance and ease of use, developers were pushed to primitives. With modern JVMs and Java 1.5 autoboxing, I feel like this flaw is slightly minimized. However, from a purest OO perspective this is a valid reason.
Constructors The interviewer also talked about the limitation where constructors can only return an instance of itself, the specific class; which has lead to the creation of factory patterns and DI frameworks. Having been a Spring Framework fanatic for so many years, I have probably developed a different style of programming which as shielded me from this issue. With some of the more  dynamic OO languages, you can apparently return a different type instance from the constructor. I need to study some more on this, but did find an interesting Ruby thread.  Ruby is definitely on my learning list, so I have to stop blogging!
First Class Objects This reason takes us to pure object orientation. I’m going to gloss over this a little and let you read more on your own as I did today, try this simple search. One of the more obvious distinctions, would probably be the meta data / class model provided by Java.
Statics This is actually one of my pet peeves. I am a no fan of static methods.  For me it is simple, statics equal functions which equal non object oriented. I have always bought into the DI propaganda which states that static objects and methods are untestable, which I fundamentally agree with. However, I did recently discover there are are several mocking frameworks that can actually mock out static classes and methods. This is pretty cool, but unnecessary in my preferred design and implementation style.
No Multiple Inheritance Coming from a C++ background, this was always a big discussion point. I generally did not recommend multiple inheritance, as it was tricky and usually implemented (and even modeled) inappropriately. I was much more interested in inheriting behavior rather than state. If I remember correctly, this is where it got interesting using C++.  Java Interfaces do a little bit to address this issue, but there is typically no why to elegantly solve the problem without a little code duplication and/or helper classes.
Strings My nuts and bolt friend gave me this one; not sure where he was going, but obviously the Java String class is its own unique creation. Personally, I was always bummed by the lack of a mutable String class. I might have prefer to see non-mutability implemented via subclasses, or something like the Collections.unmodifiableCollection() method. How about that, another static method reference! Maybe this would have been a little better, stringInstance.getImutable()!
Limited Operator Overloading Having done a lot of C++ in my early programming career, I found elegance in operator overloading and saw it as a void in Java. But, I do have to agree with the reason it was left out of Java, “it was used incorrectly to many times in C++”. Unfortunately, you can use any tool incorrectly; it might have been nice to let us decide if and how to use some of these features, rather than eliminate them. I did find an interesting thread on StackOverflow, so I will keep my thoughts short!
JNI This was another bullet from my nuts and bolt friend. In my opinion, JNI was more of a Java after thought, “bolted-on” to simply to take advantage of existing solutions and provide some level of extensibility. I have not used JNI for many years, and all I can remember is procedural nature of our solution. I don’t remember details, other than it was ugly! You could also say that ugly is not object oriented!
Package Level Scope Late breaking addition. I personally never liked the “package” level scoping provided by Java.  How is this object oriented? You are basically breaking the class level encapsulation, allowing all classes in that package access… This always felt like a little implementation hack to me… not one of my favorites!

My thoughts might not be completely baked, but I need to keep on moving; so please let me know if you think I missed the point! Generally speaking, I have been very happy with Java as a implementation language. All languages have their warts, and Java is no different. The vast number of tools and frameworks allow Java applications to be effectively developed, tested, and deployed.  I also believe that Java is pretty forgiving, allowing developers of all levels to build solutions; from being barely object oriented to insanely obscure. Hopefully, we end up in the middle with simple elegance. I hope to have the opportunity to explore some of these Java flaws in a Ruby, so please check back and see what I have learned!

https://www.beilers.com/wp-content/plugins/sociofluid/images/digg_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/reddit_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/dzone_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/stumbleupon_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/delicious_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/blinklist_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/blogmarks_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/google_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/facebook_48.png


Feb 04 2011

Social Bookmarking… Migrating to Diigo

Category: Android,MiscPhil @ 12:01 am

The pending demise of Delicious was blogged to death a couple of months ago. I too was saddened by Yahoo’s decision, having become quite dependent on this service. Like many, I began a search for a new solution, but nothing seem to be the perfect replacement. It now appears that Delicious will be sold off, but who really knows what direction it will take. I discovered Delicious a couple of years ago; I blogged about it, showed it to my friends, and used it as a “sharing” solution whenever I had the chance. I’m always looking for ways to be more effective and efficient, both remembering and information sharing. I’m not exactly sure why, but none of my friends were ever really jazzed about the tool or concept… I could only come up with a couple of possible reasons:

  1. Many of my friends are Apple Fanboys… There must be something in that space that performs a similar function, maybe they have their own club!
  2. None of my friends blog. Many of them read multiple RSS feeds, I guess they just read and run! They must be able to retain a lot more information than I can!

My environment and thought process must be a little different.

  1. I live in an Apple free world.  I look for tools that work across platforms.  Dropbox is one of my favorites. It runs on my Android phone, my Ubuntu machines, and even those pesky Windows machines I have to support for the family.  Delicious provided effective plug-ins for most of the web browsers, and there were multiple options in the Android marketplace; this solution pretty much guaranteed I could find what I was looking for!
  2. The more RSS feeds I read, the more topics I find to blog about! This is vicious cycle and quickly creates a backlog! It was so easy to create a simple bookmark in Delicious, and tag it for blogging.
  3. Many times, I start reading an article and determine that it is too heavy and need some extra time to comprehend it. I just create another Delicious bookmark, and tag it for follow up.

After a lot of Googling for Delicious replacements and I landed on Diigo (My Library). I like the free stuff best and they also had a pretty decent Android application. Diigo has one feature that I have really grown to appreciate, the “Read Later” option.  If you find a web page that is interesting, but don’t have the time to read it, you simply click the “Read Later” button on the Diigo tool bar. Pretty simple! When you find time and want to catch up on your reading, you just go to your library and browse the Read Later items. I have not actually taken the time to use the notes and highlighting features, but am completely sold on tagging. Tagging seems like such an efficient way of classifying and searching for information; at least it works for me!  Diigo almost seems like a cross between Evernote and Delicious. It has many more features that Delicious, but the question is…. how will they survive?  I can only hope and might actually have to give them some $$$ to support their efforts.  My only rant is they do not provide a “tag cloud” view in their Android client… If they implement this view, I promise to become a paid member!

I still believe there is real value in the community, I’m not sure I will find one that is receptive, but I can always hope! There has to be value in exploring what your friends and coworkers are discovering and recording as important. I have to assume that much of that information is the bond which brings people together in the first place and ultimately enables them to communicate in a much more efficient and effective manner.

I highly recommend that you give Diigo a chance, and better yet, add me to your network!

https://www.beilers.com/wp-content/plugins/sociofluid/images/digg_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/reddit_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/dzone_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/stumbleupon_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/delicious_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/blinklist_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/blogmarks_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/google_48.png https://www.beilers.com/wp-content/plugins/sociofluid/images/facebook_48.png