<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4817890370819497713</id><updated>2024-09-07T17:48:35.660+02:00</updated><title type='text'>The Java Developer Journal</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ajavadeveloperjournal.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>A Java Developer</name><uri>http://www.blogger.com/profile/18168050580109040994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4817890370819497713.post-1989488377521832034</id><published>2012-04-24T09:17:00.000+02:00</published><updated>2012-06-11T07:49:16.307+02:00</updated><title type='text'>Architects must be hands on</title><content type='html'>A good architect should lead be example. He should be able to fulfill any of the positions within his team. Withoug a good understanding of the full range of technology, an architect is little more than a project manager. It is perfectly acceptable for team members to have more in-depth knowledge in their specific areas, but it&#39;s difficult to imagine how team members can have confidence in their architect if the architect doesn&#39;t understand the technology.&lt;br /&gt;
&lt;br /&gt;
The architect is the interface between the business and the technology team and must understand every aspect of the technology to be able to represent the team to the business without having to constantly refer others. Similarly the architect must understand the business in order to drive the team toward it&#39;s goal of serving the business.&lt;br /&gt;
&lt;br /&gt;
Architects should be brought into the team at the earliest part of the project. They should not sit in an ivory tower dictating the way forward, but should be on the ground working with the team. Technology choices should be made pragmatically through hands on investigation or using advice from architect peers.</content><link rel='replies' type='application/atom+xml' href='http://ajavadeveloperjournal.blogspot.com/feeds/1989488377521832034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/04/architects-must-be-hands-on.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/1989488377521832034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/1989488377521832034'/><link rel='alternate' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/04/architects-must-be-hands-on.html' title='Architects must be hands on'/><author><name>A Java Developer</name><uri>http://www.blogger.com/profile/18168050580109040994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4817890370819497713.post-1502075220789302601</id><published>2012-04-10T17:44:00.002+02:00</published><updated>2012-04-10T17:46:32.085+02:00</updated><title type='text'>JSR 330 : Contexts and dependency injection for the Java EE platform</title><content type='html'>Using the JSR 330 API is pretty simple. First you define an injection point in a class, which wants to use a concrete implementation of a service&lt;br /&gt;
&lt;pre&gt;// injection-point; no get/set needed...&amp;nbsp;
@Inject private BusinessService service;&amp;nbsp;&lt;/pre&gt;
Next you need to provide an actual implementation&lt;br /&gt;
&lt;pre&gt;public class DefaultBusinessService implements BusinessService {
...
}&lt;/pre&gt;
If you have more versions of this service, you have to create a Qualifier annotation:&lt;br /&gt;
&lt;pre&gt;@Qualifier
@Target( { TYPE, METHOD, FIELD })
@Retention(RUNTIME)
public @interface FancyService
{
}&lt;/pre&gt;
You use the Qualifier to inject a more meaningful implementation of the service :&lt;br /&gt;
&lt;pre&gt;@Inject @FancyService private BusinessService fancyService;&lt;/pre&gt;
As you see, using JSR 330 is pretty simple. So, what&#39;s the drawback with this solution?&lt;br /&gt;
&lt;br /&gt;
Injecting a service using annotations is an ok approach, but what I don&#39;t like is the lack of configuration options. &amp;nbsp;What would for instance happen if I create two different implementations of the BusinessService interface and want to inject these two into different beans? Do I then have to also create two qualifier interfaces to distinguish between them? To me that sounds lame.&lt;br /&gt;
&lt;br /&gt;
A possible JSR 330 implementation might configure it&#39;s beans in one major XML file. Would it be so hard to for instance have the qualifier configuration there instead? The benefits would be:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;No compile time dependencies to one given qualifier interface&lt;/li&gt;
&lt;li&gt;Changing the business service would just be a mather of changing the XML file&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
JSR 330 might work in a standalone project where the configuration never changes, but I really don&#39;t see how this should work in a large software system where configuration and requirements can change pr customer and installation...&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://ajavadeveloperjournal.blogspot.com/feeds/1502075220789302601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/04/jsr-330-contexts-and-dependency.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/1502075220789302601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/1502075220789302601'/><link rel='alternate' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/04/jsr-330-contexts-and-dependency.html' title='JSR 330 : Contexts and dependency injection for the Java EE platform'/><author><name>A Java Developer</name><uri>http://www.blogger.com/profile/18168050580109040994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4817890370819497713.post-8846701239164721597</id><published>2012-04-03T13:35:00.000+02:00</published><updated>2012-04-05T20:34:27.229+02:00</updated><title type='text'>What today&amp;#39;s software developers need to know</title><content type='html'>Today&#39;s software developers don&#39;t have to worry about many things that their predecessors used to, like coding to minimize                              RAM consumption even if it means significantly longer execution time, or WAN connections maxing out at 14.4 kilobits per second.                              (Although, there may be some out of the fashion skills&amp;nbsp;they could benefit from or that may yet regain relevance.) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
However, the reverse is also true: there are many new skills and areas of expertise that today&#39;s software developers, hardware                              developers, system and network administrators, and other IT professionals need that simply didn&#39;t exist in the past. (Where                              &quot;the past&quot; could be anything from &quot;more than three months ago&quot; to five, ten, twenty or more years.)&lt;br /&gt;
&lt;br /&gt;
Knowing what you need to know matters, whether you&#39;re just starting out as a software developer (or planning to become one),                              or are a &quot;seasoned&quot; professional who wants to keep your chops fresh so you can stay in, re-enter, or advance. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
So here are what software developers that should add to their existing knowledge portfolio.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;

Using libraries&lt;/h4&gt;
&quot;One thing that strikes me as a new skill is the need to work with massive pre-packaged class libraries and template libraries                              in all the new languages, like Java or C++ or Python,&quot; says consultant and software developer Jeff Kenton. &quot;It used to be                              that once you knew the language and a small set of system calls and string or math library calls, you were set to program.                              Now you can write complex applications by stringing library calls together and a little bit of glue to hold them all together.                              If you only know the language, you&#39;re not ready to produce anything.&quot; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;

Asynchronous programming and other techniques&lt;/h4&gt;
&quot;Because of the move to cloud computing mostly through web-based interfaces, we are seeing an emphasis on asynchronous programming,&quot;                              says Itai Danan, founder of Cybernium a software development and web design consulting company. &quot;Ten years ago, this was mostly                              used by transactional systems such as banks, hotels and airline reservations. Today, all but the simplest applications require                              asynchronous programming, mostly because of AJAX. This is a very different style of programming -- most things taught about                              software optimizations do not apply across the network boundary.&quot; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;

A breadth of skills&lt;/h4&gt;
&quot;It&#39;s become more important to have a breadth of skills&quot; says Ben Curren, CoFounder, Outright.com, which offers easy-to-use                              online accounting and bookkeeping software for small businesses. &quot;For example, web developers these days need to understand                              customers, usability, HTML, CSS, Javascript, APIs, server-side frame works, and testing/QA.&quot;                           &lt;br /&gt;
&quot;Programmers don&#39;t learn that someone else is going to take care of the code they write,&quot; criticizes Sarah Baker, Director                              of Operations at an Internet media company. &quot;They don&#39;t learn about release management, risk assessment of deploy of their                              code in a infrastructure, or failure analysis of their code in the production environment -- everything that happens after                              they write the code. They don&#39;t learn that a log is a communication to a operations person, and it should help an operations                              person determine what to do when they read that log.&quot; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;h4&gt;

Agile and collaborative development methods&lt;/h4&gt;
&quot;Today&#39;s developers need to have awareness of more agile software development processes,&quot; says Jeff Langr, owner, Langr Software                              Solutions, a software consultancy and training firm. &quot;Many modern teams have learned to incrementally build and deliver high-quality                              software in a highly collaborative fashion, to continually changing business needs. This ability to adapt and deliver frequently                              can result in significant competitive advantage in the marketplace.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;

Developing for deployability, scalability, manageability&lt;/h4&gt;
&quot;Sysadmins are likely to own the software for much longer than the developers -- what are you doing to make their stewardship                              pleasant enough that they look forward to your next deployment?&quot; asks Luke Kanies, Founder and CEO of Puppet Labs: &quot;This includes                              deployability and manageability. New technologies are often much more difficult to deploy on existing infrastructure because                              developers haven&#39;t had time to solve problems like packaging, running on your slightly older production OS, or connecting                              to the various services you have to use in production.&quot; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;</content><link rel='replies' type='application/atom+xml' href='http://ajavadeveloperjournal.blogspot.com/feeds/8846701239164721597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/04/what-today-software-developers-need-to.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/8846701239164721597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/8846701239164721597'/><link rel='alternate' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/04/what-today-software-developers-need-to.html' title='What today&amp;#39;s software developers need to know'/><author><name>A Java Developer</name><uri>http://www.blogger.com/profile/18168050580109040994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4817890370819497713.post-8302264848060022896</id><published>2012-04-02T14:57:00.000+02:00</published><updated>2012-04-08T09:14:02.980+02:00</updated><title type='text'>Dependency injection</title><content type='html'>&lt;span style=&quot;background-color: white; font-family: sans-serif; line-height: 19px;&quot;&gt;Dependency injection&amp;nbsp;(DI) is an approach to the testing of computer programs, the purpose of which is both to improve the testability of a large software system and to simplify the deployment of software components within that system. DI is an example of a&amp;nbsp;design pattern&amp;nbsp;in&amp;nbsp;object-oriented&amp;nbsp;computer programming.&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;background-color: white; font-family: sans-serif; line-height: 19px; margin-bottom: 0.5em; margin-top: 0.4em;&quot;&gt;
Dependency injection involves at least three elements:&lt;/div&gt;
&lt;ul style=&quot;background-color: white; font-family: sans-serif; line-height: 19px;&quot;&gt;
&lt;li style=&quot;margin-bottom: 0.1em;&quot;&gt;a&amp;nbsp;dependent&amp;nbsp;consumer,&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;background-color: white; font-family: sans-serif; line-height: 19px;&quot;&gt;
&lt;li style=&quot;margin-bottom: 0.1em;&quot;&gt;a declaration of a component&#39;s&amp;nbsp;dependencies, defined as interface contracts,&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;background-color: white; font-family: sans-serif; line-height: 19px;&quot;&gt;
&lt;li style=&quot;margin-bottom: 0.1em;&quot;&gt;an&amp;nbsp;injector&amp;nbsp;(sometimes referred to as a&amp;nbsp;provider&amp;nbsp;or&amp;nbsp;container) that creates instances of classes that implement a given dependency interface on request.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: white; font-family: sans-serif; line-height: 19px; margin-bottom: 0.5em; margin-top: 0.4em;&quot;&gt;
The dependent object describes what software component it depends on to do its work. The injector decides what concrete classes satisfy the requirements of the dependent object, and provides them to the dependent.&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: sans-serif; line-height: 19px; margin-bottom: 0.5em; margin-top: 0.4em;&quot;&gt;
In conventional software development the dependent object decides for itself what concrete classes it will use. In the dependency injection pattern, this decision is delegated to the &quot;injector&quot; which can choose to substitute different concrete class implementations of a dependency contract interface at run-time rather than at compile time.&lt;/div&gt;
&lt;div style=&quot;background-color: white; font-family: sans-serif; line-height: 19px; margin-bottom: 0.5em; margin-top: 0.4em;&quot;&gt;
Being able to make this decision at run-time rather than compile time is the key advantage of dependency injection. Multiple, different implementations of a single software component can be created at run-time and passed into (injected) the same test code. The test code can then test each different software component without being aware that what has been injected is implemented differently.&lt;/div&gt;
There has been several ways of doing dependency injection in your Java application. The idea behind them is well understood, but the actual realization is slightly different.: XML files or property files vs Java annotations or classes. Choosing between which framework to use can become a pretty religious discussion.&lt;br /&gt;
&lt;br /&gt;
In a short time I will write about JSR-300 and why I don&#39;t like it&lt;b&gt;.&lt;/b&gt;</content><link rel='replies' type='application/atom+xml' href='http://ajavadeveloperjournal.blogspot.com/feeds/8302264848060022896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/04/what-i-don-like-about-jsr-299.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/8302264848060022896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/8302264848060022896'/><link rel='alternate' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/04/what-i-don-like-about-jsr-299.html' title='Dependency injection'/><author><name>A Java Developer</name><uri>http://www.blogger.com/profile/18168050580109040994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4817890370819497713.post-8925002122517246904</id><published>2012-03-23T08:00:00.000+01:00</published><updated>2012-04-04T16:33:41.102+02:00</updated><title type='text'>How to shutdown an ExecutorService</title><content type='html'>The new executor framework in Java 6 makes it dead easy to create components running in a background thread. Just create an executor, give it a java.util.Runnable and that&#39;s it. But how do you do a proper shutdown of a ExecutorService?&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;1. pExecutorService.shutdown();&lt;br /&gt;&lt;br /&gt;2. try {&lt;br /&gt;&lt;br /&gt;3. &amp;nbsp; if (!pExecutorService.awaitTermination(pTimeout, TimeUnit.SECONDS)) {&lt;br /&gt;&lt;br /&gt;4. &amp;nbsp; &amp;nbsp; pExecutorService.shutdownNow();&lt;br /&gt;&lt;br /&gt;5. &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;6. &amp;nbsp; catch (final InterruptedException pCaught) {&lt;br /&gt;&lt;br /&gt;7. &amp;nbsp; &amp;nbsp; pExecutorService.shutdownNow();&lt;br /&gt;&lt;br /&gt;8. &amp;nbsp; &amp;nbsp;Thread.currentThread().interrupt();&lt;br /&gt;&lt;br /&gt;9. &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;10. }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;First we invoke the shutdown method on the executor service. After this point, no new runnables will be started.&lt;br /&gt;The next step is to wait for already running tasks to complete. In this example we will allow the running tasks to complete within&amp;nbsp;&lt;i&gt;pTimeout&lt;/i&gt;&amp;nbsp;seconds. If they don&#39;t complete within the given amount of seconds, we invoke &lt;i&gt;shutdownNow()&lt;/i&gt;. This method will invoke &lt;i&gt;interrupt&lt;/i&gt;&amp;nbsp;on all still running threads.&lt;br /&gt;&lt;br /&gt;As a good practice we also make sure to catch &lt;i&gt;&amp;nbsp;InterrruptedException&lt;/i&gt;&#39;s and shutdown everything immediately.</content><link rel='replies' type='application/atom+xml' href='http://ajavadeveloperjournal.blogspot.com/feeds/8925002122517246904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/03/how-to-shutdown-executorservice.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/8925002122517246904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/8925002122517246904'/><link rel='alternate' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/03/how-to-shutdown-executorservice.html' title='How to shutdown an ExecutorService'/><author><name>A Java Developer</name><uri>http://www.blogger.com/profile/18168050580109040994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4817890370819497713.post-1478982677568941223</id><published>2012-03-12T07:47:00.000+01:00</published><updated>2012-04-04T16:33:40.960+02:00</updated><title type='text'>What should you cache?</title><content type='html'>A good way of solving performance problems in an application is often to add caching at strategic layers of the application. But what should you cache?&lt;br /&gt;&lt;br /&gt;For me, the single most important thing to cache is to everything that makes a network request.&lt;br /&gt;&lt;br /&gt;Performing a network request will always have an overhead caused by the TCP/IP protocol, network latency, the network cards and the&amp;nbsp;Ethernet&amp;nbsp;cables. Even the slightest network&amp;nbsp;hick up&amp;nbsp;might cause huge performance issues in your application. A slow database will seriously decrease the performance of your application.&lt;br /&gt;&lt;br /&gt;It is often not possible to cache everything that makes a network request, but not doing so should at least be a&amp;nbsp;conscious&amp;nbsp;decision and not just something you forgot to implement.&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://ajavadeveloperjournal.blogspot.com/feeds/1478982677568941223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/03/what-should-you-cache.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/1478982677568941223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/1478982677568941223'/><link rel='alternate' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/03/what-should-you-cache.html' title='What should you cache?'/><author><name>A Java Developer</name><uri>http://www.blogger.com/profile/18168050580109040994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4817890370819497713.post-4025382103194448536</id><published>2012-03-09T07:38:00.000+01:00</published><updated>2012-04-04T16:33:40.997+02:00</updated><title type='text'>Public methods and package private classes</title><content type='html'>Given these two classes&lt;br /&gt;&lt;pre&gt;class abstract AbstractClass {&lt;br /&gt;   public void doSomething() {&lt;br /&gt;    System.out.println(&quot;Hello world&quot;);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class ConcreteClass extends AbstractClass {&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;both in package org.mydomain. What will happen if I create a new instance of &lt;i&gt;ConcreteClass&lt;/i&gt;&lt;b style=&quot;font-style: italic;&quot;&gt;&amp;nbsp;&lt;/b&gt;in another package and try to invoke &lt;i&gt;doSomething()&lt;/i&gt;? Will that work?&lt;br /&gt;&lt;br /&gt;The answer to this question is &lt;i&gt;it depends on the JDK.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;The Sun JDK allows you to access a public method in a package private class. However, OpenJDK will throw&lt;br /&gt;&lt;br /&gt;&lt;pre wrap=&quot;&quot;&gt;java.lang.IllegalAccessException: Class MyClass can not access a member of class ConcreteClass with modifiers &quot;public&quot;&lt;/pre&gt;&lt;br /&gt;I&#39;m not sure what the JDK specification says about this, but the moral is&lt;br /&gt;&lt;b&gt;Do not have public methods in package private classes.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://ajavadeveloperjournal.blogspot.com/feeds/4025382103194448536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/03/public-methods-and-package-private.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/4025382103194448536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/4025382103194448536'/><link rel='alternate' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/03/public-methods-and-package-private.html' title='Public methods and package private classes'/><author><name>A Java Developer</name><uri>http://www.blogger.com/profile/18168050580109040994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4817890370819497713.post-2084687598827230688</id><published>2012-03-03T18:07:00.000+01:00</published><updated>2012-04-04T16:33:40.966+02:00</updated><title type='text'>Where does Node.js stand?</title><content type='html'>&lt;br /&gt;&lt;div class=&quot;postContent&quot;&gt;I recently became aware of Node.js and I&#39;m trying to sort out where Node.js fits in the server side development picture. I found a few introductory &lt;a href=&quot;http://www.youtube.com/watch?v=jo_B4LTHi3I&quot; target=&quot;_blank&quot;&gt;videos from Ryan Dahl&lt;/a&gt; which sort of gave me the impression that Node might be the way of the future. So naturally the first thing I did from there was to Google &quot;Node.js sucks&quot;. And of course, like anything that anyone thinks is good, somebody has to explain why that first guy was totally wrong. Whenever I hear the type of argument where one side says &quot;X is the best possible,&quot; while the other side says &quot;X is the worst possible,&quot; I always assume that X is very specialized – it&#39;s very good at doing something that people who like it need to do, but others don&#39;t. What I&#39;m trying to put my finger on is just what exactly does Node.js specialize in?&lt;br /&gt;&lt;br /&gt;So as I understand it Node.js has a few things that make it a lot different than traditional server-side development platforms. First off Node code is basically JavaScript. Client code running on the servers? That&#39;s weird. Also, I shouldn&#39;t have said servers (plural) because Node.js requires a dedicated HTTP server – just one server, and it&#39;s got to be HTTP. This is also weird. Node&#39;s got some clear advantages though. It&#39;s asynchronous and events-based, so theoretically Node applications should never block I/O. &lt;a href=&quot;http://www.kegel.com/dkftpbench/nonblocking.html&quot; target=&quot;_blank&quot;&gt;Non-blocking I/O&lt;/a&gt; might make Node.js a powerful new tool for dealing with giant message queues, but maybe it&#39;s got more working against it than just being weird.&lt;br /&gt;&lt;br /&gt;I think &lt;a href=&quot;http://www.realfreemarket.org/blog/2011/10/25/node-js-is-vb6/&quot; target=&quot;_blank&quot;&gt;the guys that say Node.js sucks sound kind of crazy&lt;/a&gt;, but they do have a point or three. First and foremost is that Node.js is single threaded; then the detractors have a problem with the similarities Node.js shares with JavaScript; and finally, they say that Node.js cannot possibly back their claim of being blockless.&lt;br /&gt;&lt;br /&gt;Addressing the &lt;a href=&quot;http://www.theserverside.com/news/feature/The-Expense-of-a-Line-of-JavaScript-Code&quot; target=&quot;_blank&quot;&gt;concern about JavaScript&lt;/a&gt; is tough for me. I&#39;m not an expert with JavaScript and I don&#39;t really know its advantages and disadvantages over other languages. I have read detractors state that JavaScript is a slow language because it is scripted and not compiled. I have read JavaScript proponents explain that it&#39;s not the language that is either slower or faster, but the way the code is written, meaning that the skill of the coder supersedes the inherent qualities of the language. Both arguments have merit, and I don&#39;t feel qualified to pick a winner.&lt;br /&gt;&lt;br /&gt;Most server-side developers are very used to running basically linear processes &lt;a href=&quot;http://www.theserverside.com/news/news/1365191/Testing-Concurrent-Programs&quot; target=&quot;_blank&quot;&gt;concurrently in separate threads&lt;/a&gt;. This method allows you to run multiple complicated processes at the same time, and if one process fails, the other threads can still remain intact. So having a single thread run one process at a time sounds like it would be really slow. I don&#39;t think this is the case with Node.js because it is asynchronous and event based, which is a very different model than one might be used to.&lt;br /&gt;&lt;br /&gt;Instead of running one process, waiting for the client to respond and then starting another process, Node.js runs the processes it has the data to run as soon as possible in the order it receives them. Then when the response comes back that&#39;s a new process in the queue, and the application just keeps juggling these requests. The overall design is such that Node developers are forced to keep each process very short because – as the detractors are quick to point out – if any one process takes too long it will block the server&#39;s CPU which will in effect block the application.&lt;br /&gt;&lt;br /&gt;So you can&#39;t do long complicated processes like calculating pi with Node.js. Apparently they have workarounds for spinning off really complicated processes if you really need to, but that seems to be outside of the scope of the original plan. I think that where &lt;a href=&quot;http://searchsoa.techtarget.com/answer/Thinking-beyond-2012-and-SOA-event-processing-takes-the-fore&quot; target=&quot;_blank&quot;&gt;Node shines is in routing a high volume of low-overhead requests&lt;/a&gt;. Which means to me that Node.js is great for light messaging applications with a high user volume.&lt;br /&gt;&lt;br /&gt;Are there other uses I&#39;ve missed? Are there other issues with asynchronous programming in a single thread? Is there some part of the big picture I&#39;m not seeing? Am I just plain wrong about all of this? Leave me a comment and let me know what&#39;s what.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ajavadeveloperjournal.blogspot.com/feeds/2084687598827230688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/03/where-does-nodejs-stand.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/2084687598827230688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/2084687598827230688'/><link rel='alternate' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/03/where-does-nodejs-stand.html' title='Where does Node.js stand?'/><author><name>A Java Developer</name><uri>http://www.blogger.com/profile/18168050580109040994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4817890370819497713.post-3708663550187015802</id><published>2012-03-02T20:19:00.000+01:00</published><updated>2012-04-04T16:33:40.987+02:00</updated><title type='text'>The Last Responsible Moment</title><content type='html'>In Lean Software Development: An Agile Toolkit, Mary and Tom Poppendieck describe a counter-intuitive technique for making better decisions:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Concurrent software development means starting development when only partial requirements are known and developing in short iterations that provide the feedback that causes the system to emerge. Concurrent development makes it possible to &lt;b&gt;delay commitment until the last responsible moment, that is, the moment at which failing to make a decision eliminates an important alternative.&lt;/b&gt; If commitments are delayed beyond the last responsible moment, then decisions are made by default, which is generally not a good approach to making decisions.&lt;/blockquote&gt;&lt;br /&gt;Paradoxically, it&#39;s possible to make better decisions by &lt;i&gt;not deciding&lt;/i&gt;. I&#39;m a world class procrastinator, so what&#39;s to stop me from reading this as carte blanche? Why do today what I can put off until tomorrow?&lt;br /&gt;Making decisions at the Last Responsible Moment isn&#39;t procrastination; it&#39;s inspired laziness. It&#39;s a solid, fundamental risk avoidance strategy. &lt;b&gt;Decisions made too early in a project are hugely risky.&lt;/b&gt; Early decisions often result in work that has to be thrown away. Even worse, those early decisions can have crippling and unavoidable consequences for the entire future of the project.&lt;br /&gt;Early in a project, you should make as few binding decisions as you can get away with. This doesn&#39;t mean you stop working, of course-- you adapt to the highly variable nature of software development. Often, having the guts to say &quot;I don&#39;t know&quot; is your best decision. Immediately followed by &quot;..but we&#39;re working on it.&quot;&lt;br /&gt;Jeremy Miller participated in a TDD panel with Mary Poppendieck last year, and he logically connects the dots between the Last Responsible Moment and YAGNI:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;The key is to make decisions as late as you can responsibly wait because that is the point at which you have the most information on which to base the decision.&lt;/b&gt;  In software design it means you forgo creating generalized solutions or class structures until you know that they&#39;re justified or necessary.  &lt;/blockquote&gt;I think there&#39;s a natural human tendency to build or buy things in anticipation of future needs, however unlikely. Isn&#39;t that the Boy Scout motto-- Be Prepared?&lt;br /&gt;&lt;br /&gt;I think we should resist our natural tendency to prepare too far in advance. My workshop is chock full of unused tools I thought I &lt;i&gt;might&lt;/i&gt; need. Why do I have this air compressor? When was the last time I used my wet/dry vac? Have I &lt;i&gt;ever&lt;/i&gt; used that metric socket set? It&#39;s a complete waste of money and garage space. Plus all the time I spent agonizing over the selection of these tools I don&#39;t use. I&#39;ve adopted the Last Responsible Moment approach for my workshop. I force myself to only buy tools that I&#39;ve used before, or tools that I have a very specific need for on a project I&#39;m about to start. &lt;br /&gt;Be prepared. But for tomorrow, not next year. Deciding too late is dangerous, but deciding too early in the rapidly changing world of software development is arguably even &lt;i&gt;more&lt;/i&gt; dangerous. Let the principle of Last Responsible Moment be your guide.</content><link rel='replies' type='application/atom+xml' href='http://ajavadeveloperjournal.blogspot.com/feeds/3708663550187015802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/03/last-responsible-moment.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/3708663550187015802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/3708663550187015802'/><link rel='alternate' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/03/last-responsible-moment.html' title='The Last Responsible Moment'/><author><name>A Java Developer</name><uri>http://www.blogger.com/profile/18168050580109040994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4817890370819497713.post-4907358051273391987</id><published>2012-03-02T20:09:00.000+01:00</published><updated>2012-04-04T16:33:41.003+02:00</updated><title type='text'>TechnicalDebt</title><content type='html'>You have a piece of functionality that you need to add to yoursystem. You see two ways to do it, one is quick to do but is messy -you are sure that it will make further changes harder in the future.The other results in a cleaner design, but will take longer to put inplace.&lt;br /&gt;Technical Debt is a wonderful metaphor developed by WardCunningham to help us think about this problem. In this metaphor,doing things the quick and dirty way sets us up with a technical debt,which is similar to a financial debt. Like a financial debt, thetechnical debt incurs interest payments, which come in the form of theextra effort that we have to do in future development because of thequick and dirty design choice. We can choose to continue paying theinterest, or we can pay down the principal by refactoring the quickand dirty design into the better design. Although it costs to pay downthe principal, we gain by reduced interest payments in the future.&lt;br /&gt;&lt;br/&gt;The metaphor also explains why it may be sensible to do the quickand dirty approach. Just as a business incurs some debt to takeadvantage of a market opportunity developers may incur technical debtto hit an important deadline. The all too common problem is thatdevelopment organizations let their debt get out of control and spendmost of their future development effort paying crippling interestpayments.&lt;br /&gt;&lt;br/&gt;The tricky thing about technical debt, of course, is that unlikemoney it&#39;s impossible to measure effectively. The interest paymentshurt a team&#39;s productivity, but since weCannotMeasureProductivity, we can&#39;t really see the trueeffect of our technical debt.&lt;br /&gt;One thing that is easily missed is that you only make money onyour loan by delivering. Following theDesignStaminaHypothesis, you need to deliver before youreach the design payoff line to give you any chance of making a gainon your debt. Even below the line you have to trade-off the value youget from early delivery against the interest payments and principalpay-down that you&#39;ll incur.</content><link rel='replies' type='application/atom+xml' href='http://ajavadeveloperjournal.blogspot.com/feeds/4907358051273391987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/03/technicaldebt.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/4907358051273391987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/4907358051273391987'/><link rel='alternate' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/03/technicaldebt.html' title='TechnicalDebt'/><author><name>A Java Developer</name><uri>http://www.blogger.com/profile/18168050580109040994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4817890370819497713.post-7599803944819343657</id><published>2012-03-02T14:05:00.000+01:00</published><updated>2012-04-04T16:33:41.027+02:00</updated><title type='text'>Designing a good API</title><content type='html'>&lt;span style=&quot;background-color: white; font-family: sans-serif; line-height: 19px;&quot;&gt;&lt;b&gt;What is an API&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: white; font-family: sans-serif; line-height: 19px;&quot;&gt;An&amp;nbsp;&lt;/span&gt;&lt;b style=&quot;background-color: white; font-family: sans-serif; line-height: 19px;&quot;&gt;application programming interface&lt;/b&gt;&lt;span style=&quot;background-color: white; font-family: sans-serif; line-height: 19px;&quot;&gt;&amp;nbsp;(&lt;/span&gt;&lt;b style=&quot;background-color: white; font-family: sans-serif; line-height: 19px;&quot;&gt;API&lt;/b&gt;&lt;span style=&quot;background-color: white; font-family: sans-serif; line-height: 19px;&quot;&gt;) is a&amp;nbsp;&lt;/span&gt;source code&lt;span style=&quot;background-color: white; font-family: sans-serif; line-height: 19px;&quot;&gt;-based specification intended to be used as an interface by software components to communicate with each other. An API may include specifications for&amp;nbsp;&lt;/span&gt;routines&lt;span style=&quot;background-color: white; font-family: sans-serif; line-height: 19px;&quot;&gt;,&amp;nbsp;&lt;/span&gt;data structures&lt;span style=&quot;background-color: white; font-family: sans-serif; line-height: 19px;&quot;&gt;,&amp;nbsp;&lt;/span&gt;object classes&lt;span style=&quot;background-color: white; font-family: sans-serif; line-height: 19px;&quot;&gt;, and variables.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: white; font-family: sans-serif; line-height: 19px;&quot;&gt;&lt;b&gt;Why is a an API important&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;All developers have third party products they prefer to work with. Why do we prefer working with some products, but not other?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;Often it comes down to the fact that some products are easier to work with than others. They have better documentation, more intiutive methods and just seem more professional than others.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: sans-serif; line-height: 19px;&quot;&gt;A bad API causes neverending support request and will in the end become a liability for a company.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;&lt;b&gt;What is a good API&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;A good API is&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;Easy to learn&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;Easy to use&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;Hard to misuse&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;Easy to read&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;Easy to maintain code that uses it&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;Easy to extend&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;&lt;b&gt;General principles when designing an API&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;Do one thing and do it well&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;Functionality should be easy to explain&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;If it&#39;s hard to name, consider rethinking the design&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;Keep it small&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;An API should satisfy it&#39;s requirements&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;When in doubt leave it out&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;Implementation shouldn&#39;t impact API&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;Implementation details&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;Don&#39;t let implementation details leak into the API&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;Minimize accessibility&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;Make classes and members as private as possible&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;Names should be self-explanatory&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;Documentation mathers&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;Document every class, interface, method, constructor, parameter and exception&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;&lt;b&gt;Exception design&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;Throw exceptions to indicate exceptional conditions&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;Don&#39;t force clients to use exceptions for control flow&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family: sans-serif;&quot;&gt;&lt;span style=&quot;line-height: 19px;&quot;&gt;Don&#39;t fail silently&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;</content><link rel='replies' type='application/atom+xml' href='http://ajavadeveloperjournal.blogspot.com/feeds/7599803944819343657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/03/designing-good-api.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/7599803944819343657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/7599803944819343657'/><link rel='alternate' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/03/designing-good-api.html' title='Designing a good API'/><author><name>A Java Developer</name><uri>http://www.blogger.com/profile/18168050580109040994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4817890370819497713.post-720722139622356896</id><published>2012-02-29T08:32:00.000+01:00</published><updated>2012-04-04T16:33:41.019+02:00</updated><title type='text'>Don&amp;#39;t blame the UI design for your bad code</title><content type='html'>A couple of days ago I was in a meeting where one of the subjects was&lt;br /&gt;&lt;br /&gt;&lt;pre&gt; Why does this swing code suck?&quot;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;The code we had was messy, had logic spread all over the place and was a nightmare to maintain.&lt;br /&gt;&lt;br /&gt;The answer from one of the developers actually responsible for creating this crappy code was&lt;br /&gt;&lt;br /&gt;&lt;pre&gt; The UI design changed during the development of the UI&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To me this is a really bad excuse.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;One of the first things I learned about UI programming is to always create a good model. If you have a good model, implementing the actual UI part should be a piece of cake. In this piece of code the model sucked. The developer explained that this was caused by the ever changing UI design.&amp;nbsp;Have you never heard about refactoring? One of the key stones of agile development is to always do refactoring. If your model no longer matches the UI, then refactor it! Don&#39;t blame the changing requirements or design for your crappy code.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://ajavadeveloperjournal.blogspot.com/feeds/720722139622356896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/02/don-blame-ui-design-for-your-bad-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/720722139622356896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/720722139622356896'/><link rel='alternate' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/02/don-blame-ui-design-for-your-bad-code.html' title='Don&amp;#39;t blame the UI design for your bad code'/><author><name>A Java Developer</name><uri>http://www.blogger.com/profile/18168050580109040994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4817890370819497713.post-540133877030498155</id><published>2012-02-26T18:42:00.000+01:00</published><updated>2012-04-04T16:33:41.009+02:00</updated><title type='text'>Why I hate Maven</title><content type='html'>&lt;span style=&quot;background-color: white; color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif; font-size: 15px; text-align: left;&quot;&gt;Yes, I admin that Maven&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif; font-size: 15px; text-align: left;&quot;&gt;has improved the development of Java programmers because the tons of dependencies each project brings.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif; font-size: 15px; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif; font-size: 15px; text-align: left;&quot;&gt;So, why do I hate it so much?&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif; font-size: 15px; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif; font-size: 15px; text-align: left;&quot;&gt;&lt;b&gt;Thousands of network calls&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif; font-size: 15px; text-align: left;&quot;&gt;One of the main reasons is because of the thousands of network calls to remote servers to&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;check versions&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;check md5&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;download pom files&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;download jar files&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style=&quot;color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;To keep the internal repositories up-to-date Maven has to check all the dependencies in the internal repository daily and each Maven user has to pay the latency cost of downloading a lot of files all the time. A workaround for this problem might be to install nexus or Jenkins on a server on the local network, but you still have the problem with latency on the internal network.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;A workaround for me is to do &#39;mvn clean install&#39; each morning, then go and fetch coffee...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;&lt;b&gt;Simple tasks is hard&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;Simple tasks as creating an executable jar or building a new version of an application should be a piece of cake, but it isn&#39;t. All this can be done by using a lot of plugins, but the major problem with these plugins is the lack of documentation.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;&lt;b&gt;You are forced into creating a bunch of Maven modules&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;Separating your code into different modules is good programming practice, but I don&#39;t like separating it because the build tool requires it. Creating a simple Maven project often requires you to create 4 or 5 maven modules and that&#39;s just to much.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;&lt;b&gt;Repeatable builds&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;Do I really trust Maven to give me repeatable builds? No. I do not trust that downloading dependencies from the internet will give me the same versions of the file each time. A better solution would be to fetch all dependencies from a revision control system.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #333333; font-family: Trebuchet, &#39;Trebuchet MS&#39;, Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ajavadeveloperjournal.blogspot.com/feeds/540133877030498155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/02/why-i-hate-maven.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/540133877030498155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/540133877030498155'/><link rel='alternate' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/02/why-i-hate-maven.html' title='Why I hate Maven'/><author><name>A Java Developer</name><uri>http://www.blogger.com/profile/18168050580109040994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4817890370819497713.post-8738551953489646343</id><published>2012-02-25T09:37:00.000+01:00</published><updated>2012-04-04T16:33:41.072+02:00</updated><title type='text'>Don’t interrupt my colleague</title><content type='html'>&lt;br /&gt;&lt;div style=&quot;background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: Georgia, &#39;Bitstream Charter&#39;, serif; font-size: 16px; line-height: 24px; margin-bottom: 24px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;You are in the office, deeply concentrated on solving a problem. Then someone approaches your desk and wants to ask you for a solution to a different problem. What do you do?&lt;/div&gt;&lt;div style=&quot;background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: Georgia, &#39;Bitstream Charter&#39;, serif; font-size: 16px; line-height: 24px; margin-bottom: 24px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;Do you give him the answer to his problem?&lt;/div&gt;&lt;div style=&quot;background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: Georgia, &#39;Bitstream Charter&#39;, serif; font-size: 16px; line-height: 24px; margin-bottom: 24px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;Do you tell him to come back later or send the question in an email?&lt;/div&gt;&lt;div style=&quot;background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: Georgia, &#39;Bitstream Charter&#39;, serif; font-size: 16px; line-height: 24px; margin-bottom: 24px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;&lt;span id=&quot;more-32&quot; style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;&lt;/span&gt;This is a situation I guess most developers experience several times a day. Most developers are nice guys and gives a proper reply immediately, but is this really what we should do?&lt;/div&gt;&lt;div style=&quot;background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: Georgia, &#39;Bitstream Charter&#39;, serif; font-size: 16px; line-height: 24px; margin-bottom: 24px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;In my early years as an developer I always said “Yes, hang on and I’ll find a solution for you”, but lately I have changed my answer to “Send me a mail and I’ll give you some feedback later”.&lt;/div&gt;&lt;div style=&quot;background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: Georgia, &#39;Bitstream Charter&#39;, serif; font-size: 16px; line-height: 24px; margin-bottom: 24px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 24px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;The reason behind this is that I want to get rid of all the 100 context switches each day. When someone asks you a question, you have to start thinking about that problem instead of the problem you were working on. When the guy leaves you as a happy man 5 minutes later, you might think: what was I doing 5 minutes ago? It might then take 10 minutes before you are back on track and can are productive again.&lt;/div&gt;&lt;div style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 24px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;If you instead tell him to send you a mail, you can finish off whatever you are working on and then later give him a proper reply. This will make you finish your task sooner, and an added bonus is that your reply might also be better.&lt;/div&gt;&lt;div style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 24px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;Interrupt rules:&lt;/div&gt;&lt;ol style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; margin-bottom: 24px; margin-left: 1.5em; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;&lt;li style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;Only high pri crises should be answered immediately&lt;/li&gt;&lt;li style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;Send questions on mail or IRC&lt;/li&gt;&lt;li style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;Set off specific time of day to answer questions, for instance just after lunch and before you leave for the day.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://ajavadeveloperjournal.blogspot.com/feeds/8738551953489646343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/02/dont-interrupt-my-colleague.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/8738551953489646343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/8738551953489646343'/><link rel='alternate' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/02/dont-interrupt-my-colleague.html' title='Don’t interrupt my colleague'/><author><name>A Java Developer</name><uri>http://www.blogger.com/profile/18168050580109040994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4817890370819497713.post-3676552272489223063</id><published>2012-02-23T17:21:00.000+01:00</published><updated>2012-04-04T16:33:40.973+02:00</updated><title type='text'>Java generics, collections and reflection</title><content type='html'>&lt;br /&gt;&lt;div style=&quot;background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: Georgia, &#39;Bitstream Charter&#39;, serif; font-size: 16px; line-height: 24px; margin-bottom: 24px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;&lt;strong style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;Generics&lt;/strong&gt;&amp;nbsp;are a facility of generic programming that was added to Java in J2SE 5.0. It allows a method to operate on objects of various types while providing compile-time safety. A common use of this feature is when using a java.util.Collection that can hold objects of any type, to specify the specific type of object stored in it.&lt;br /&gt;&lt;span id=&quot;more-15&quot; style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;&lt;/span&gt;&lt;br /&gt;Generics is one of the new features in the Java language I really like. It makes working with collections easier and the compile-time checking reduces the risk of run time errors.&lt;/div&gt;&lt;div style=&quot;background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: Georgia, &#39;Bitstream Charter&#39;, serif; font-size: 16px; line-height: 24px; margin-bottom: 24px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;Lately I have been playing around with a legacy dependency injection system relying on reflection to inject properties into objects. This was when I discovered one of the drawbacks with generics: Reflection and generics are not the best match&lt;/div&gt;&lt;div style=&quot;background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: Georgia, &#39;Bitstream Charter&#39;, serif; font-size: 16px; line-height: 24px; margin-bottom: 24px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 24px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;This is for instance the code needed for retrieving the generic type of a method returning a generified java.util.Collection&lt;/div&gt;&lt;pre style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #222222; font-family: &#39;Courier 10 Pitch&#39;, Courier, monospace; font-size: 15px; line-height: 21px; margin-bottom: 24px; padding-bottom: 1.5em; padding-left: 1.5em; padding-right: 1.5em; padding-top: 1.5em; vertical-align: baseline;&quot;&gt;Class&amp;lt;?&amp;gt; getGenericType(final Method pMethod) {&lt;br /&gt;  Type[] genericTypes = pMethod.getGenericParameterTypes();&lt;br /&gt;  if (genericTypes.length == 0) {&lt;br /&gt;    throw new IllegalArgumentException(&quot;Method has no generic parameters&quot;);&lt;br /&gt;  }&lt;br /&gt;  Type genericType = genericTypes[0];&lt;br /&gt;  Class&amp;lt;?&amp;gt; propertyType = Object.class;&lt;br /&gt;  if (theType instanceof ParameterizedType) {&lt;br /&gt;    ParameterizedType parameterizedType = (ParameterizedType)genericType;&lt;br /&gt;    propertyType = (Class&amp;lt;?&amp;gt;) parameterizedType.getActualTypeArguments()[0];&lt;br /&gt;  }&lt;br /&gt;  return genericType;&lt;br /&gt;}&lt;/pre&gt;&lt;div style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 24px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;As you can see it’s not the prettiest code in the world, but luckily it works.&lt;/div&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://ajavadeveloperjournal.blogspot.com/feeds/3676552272489223063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/02/java-generics-collections-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/3676552272489223063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/3676552272489223063'/><link rel='alternate' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/02/java-generics-collections-and.html' title='Java generics, collections and reflection'/><author><name>A Java Developer</name><uri>http://www.blogger.com/profile/18168050580109040994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4817890370819497713.post-8581766980026592093</id><published>2012-02-23T17:13:00.000+01:00</published><updated>2012-04-04T16:33:41.056+02:00</updated><title type='text'>The Programmers Bill of Rights</title><content type='html'>&lt;ol style=&quot;background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: Georgia, &#39;Bitstream Charter&#39;, serif; font-size: 16px; line-height: 24px; list-style-image: initial; list-style-position: initial; margin-bottom: 24px; margin-left: 1.5em; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;&lt;li style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;&lt;strong style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;Every programmer shall have two monitors&lt;/strong&gt;. With the crashing prices of LCDs and the ubiquity of dual-output video cards, you’d be crazy to limit your developers to a single screen. The productivity benefits of doubling your desktop are well documented by now. If you want to maximize developer productivity, make sure each developer has two monitors.&lt;/li&gt;&lt;li style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;&lt;strong style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;Every programmer shall have a fast PC&lt;/strong&gt;. Developers are required to run a lot of software to get their jobs done: development environments, database engines, web servers, virtual machines, and so forth. Running all this software requires a fast PC with lots of memory. The faster a developer’s PC is, the faster they can cycle through debug and compile cycles. You’d be foolish to pay the extortionist prices for the extreme top of the current performance heap– but always make sure you’re buying&amp;nbsp;&lt;em style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;near&lt;/em&gt;&amp;nbsp;the top end. Outfit your developers with fast PCs that have lots of memory. Time spent staring at a progress bar is&amp;nbsp;&lt;em style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;wasted time&lt;/em&gt;.&lt;/li&gt;&lt;div style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 24px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;&lt;span id=&quot;more-4&quot; style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;li style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;&lt;strong style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;Every programmer shall have their choice of mouse and keyboard&lt;/strong&gt;. They are the essential, workaday tools we use to practice our craft and should be treated as such.&lt;/li&gt;&lt;li style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;&lt;strong style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;Every programmer shall have a comfortable chair&lt;/strong&gt;. Let’s face it. We make our livings largely by sitting on our butts for 8 hours a day. Why not spend that 8 hours in a comfortable, well-designed chair? Give developers chairs that make sitting for 8 hours not just tolerable, but enjoyable. Sure, you hire developers primarily for their giant brains, but don’t forget your developers’&amp;nbsp;&lt;em style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;other&lt;/em&gt;&amp;nbsp;assets.&lt;/li&gt;&lt;li style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;&lt;strong style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;Every programmer shall have a fast internet connection&lt;/strong&gt;. Good programmers never write what they can steal. And the internet is the best conduit for stolen material ever invented. I’m all for books, but it’s hard to imagine getting any work done without fast, responsive internet searches at my fingertips.&lt;/li&gt;&lt;li style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;&lt;strong style=&quot;background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;&quot;&gt;Every programmer shall have quiet working conditions&lt;/strong&gt;. Programming requires focused mental concentration. Programmers cannot work effectively in an interrupt-driven environment. Make sure your working environment protects your programmers’ flow state, otherwise they’ll waste most of their time bouncing back and forth between distractions.&lt;/li&gt;&lt;/ol&gt;</content><link rel='replies' type='application/atom+xml' href='http://ajavadeveloperjournal.blogspot.com/feeds/8581766980026592093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/02/programmers-bill-of-rights.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/8581766980026592093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/8581766980026592093'/><link rel='alternate' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/02/programmers-bill-of-rights.html' title='The Programmers Bill of Rights'/><author><name>A Java Developer</name><uri>http://www.blogger.com/profile/18168050580109040994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4817890370819497713.post-396147881323314539</id><published>2012-02-23T17:12:00.000+01:00</published><updated>2012-04-04T16:33:40.993+02:00</updated><title type='text'>About me</title><content type='html'>&lt;div style=&quot;background-color: white; color: #444444; font-family: Georgia, &#39;Bitstream Charter&#39;, serif; font-size: 16px; line-height: 1.5; margin-bottom: 24px;&quot;&gt;This site is all about Java and the daily life of a Java programmer.&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #444444; font-family: Georgia, &#39;Bitstream Charter&#39;, serif; font-size: 16px; line-height: 1.5; margin-bottom: 24px;&quot;&gt;&lt;strong style=&quot;color: black; font-weight: bold; line-height: 1.5;&quot;&gt;Who am I?&lt;/strong&gt;&lt;/div&gt;&lt;ul style=&quot;background-color: white; color: #444444; font-family: Georgia, &#39;Bitstream Charter&#39;, serif; font-size: 16px; line-height: 1.5; list-style-image: initial; list-style-position: initial; list-style-type: square; margin-bottom: 24px; margin-left: 1.5em; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;li style=&quot;line-height: 1.5;&quot;&gt;A Java developer with 12 years of experience&lt;/li&gt;&lt;li style=&quot;line-height: 1.5;&quot;&gt;Started out as a novice programmer with the responsibility of creating a rich Java client using Java 1.3.&lt;/li&gt;&lt;li style=&quot;line-height: 1.5;&quot;&gt;As time goes by I have gradually converted into a hard code server side programmer and architect.&lt;/li&gt;&lt;li style=&quot;line-height: 1.5;&quot;&gt;Currently working as a senior server side developer and architect for a large software company.&lt;/li&gt;&lt;/ul&gt;</content><link rel='replies' type='application/atom+xml' href='http://ajavadeveloperjournal.blogspot.com/feeds/396147881323314539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/02/about-me.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/396147881323314539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4817890370819497713/posts/default/396147881323314539'/><link rel='alternate' type='text/html' href='http://ajavadeveloperjournal.blogspot.com/2012/02/about-me.html' title='About me'/><author><name>A Java Developer</name><uri>http://www.blogger.com/profile/18168050580109040994</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>