Anthony Shorten's recent blog post Invaluable Technical Resources outlines three key categories of useful resources for developers wishing to solve a particular problem or for developers wanting to increase their knowledge. In this blog post, I'm going to list some of my favorite resources for both types of knowledge (solving a problem and learning something new).
I have found that the most useful tools and resources can often be different for the two different situations. In general, I prefer a powerful search engine like Google for finding the answer to a particular problem followed by the vendor manual if I cannot find the answer with the search engine (often the search engine will point to the manual). On the other hand, for learning new things (especially about things I don't know enough about to even effectively search for), a different set of sites is primarily useful.
Resources for A Particular Problem
When I am less interested in increasing my knowledge for knowledge's sake and just want to solve a current problem, Google is my best friend. This is especially true for strange error messages.
1. Google Search Engine
The Google search engine is so powerful and I have become so used to using it that it is difficult to remember how we used to do things before the Internet and even before Google. I remember being really happy with Infoseek in the early days of search engines, but I never imagined then the power that would be available with Google and other search engines. The Google search engine has been featured multiple times in movies and many people used "Google" as a verb now: "have you googled for that?"
I have become so used to finding at least something useful about a particular issue or problem when using the Google search engine that one of the most disheartening things I run into now is when a Google search returns the dreaded "Your search did not match any documents" message. This is most likely encountered when using something that is very new. In Anthony's post, he states that Google is an "underrated tool." I found this interesting because while most of the people I work with on daily basis seem to understand the power of Google search engine, you see people asking basic questions on forums that could have been more quickly and easily answered with a simple Google search.
It used to be that one had to go to many specific sites to search that site's content because the search engines could not see it. However, it seems today that most of the sites' have their content indexed on popular search engines and so using search engines is always my first step. I was very happy when Oracle Technology Network's content became Google-searchable. This meant that I could find useful resources on OTN even when I was not directly searching at that site.
With the Google search engine being so powerful and so useful, one might ask why we would ever need anything else? There are several reasons that include the fact that sometimes what you're looking for will get buried by other matching pages (too much volume to find a needle in a haystack), some sites still don't have their content readily searchable by the indexes, and sometimes you don't realize the terms use should be using for the search engine match.
2. Non-Google Search Engines
Because each search engine uses a different algorithm, I will sometimes try to use a search engine other than Google's if I have not found what I'm looking for with Google. My favorite alternative search engines are Yahoo!, Cuil, and Dogpile.
3. Related Forums
Many forums are automatically searched and indexed by the popular search engines and so this step may not be necessary. Having said that, there are some forums that don't seem to be searched or do not appear high on a search engine's results. In such cases, it may be worth the effort to directly search the related forum. For example, Sun provides several forums such as the New to Java forum and the Core API forums. Other examples include Spring Framework forums, JavaRanch, Flex Support Forums, Oracle Forums, and JavaWorld forums. Forums are especially useful when a search has not produced anything because one can always simply ask in the forum after search that forum. I'm also going to lump paid support in with this item. I typically don't involve support until I have tried to find the answer myself because it is often easier and quicker to find it via search engine than to make a call, explain a situation, and try to provide example code.
4. Blog-Specific Searches
While the general search engines described in my first two choices (Google and alternative search engines) will often cover blogs as well, there are situations in which a blog-specific search is recommended. This is especially the case when it is difficult to identify terms that specific enough to filter out massive search engine results. It is also the most efficient way to find answers that are most likely to be in a blog posting. While blogs can have the disadvantage of less peer and/or technical review than articles and books, they have the advantages of timeliness and of potential focus on the smallest of details. Because it is often these "smallest of details" that cause me trouble, blog postings often have the answers I am looking for. For blog searches, my first choice is BlogSearch.com.
5. Vendor Sites/Vendor Documentation
Why is vendor documentation fourth on my list of resources to use to find an answer to a question? Am I just unwilling to read the manual? I like to read vendor-supplied references for learning about new subjects, but it is often less efficient for me to use these resources to look up one little detail. More importantly, many of the issues that I am looking for help on are small enough or are corner cases that the documentation is not likely to cover.
Many of the forums listed in the previous item are actually part of the associated vendor's site. Also, there is a difference between a particular product's manual and more general articles or information on a vendor site. For example, Oracle provides both product-specific documentation and more general technical information, including articles on areas such as Java, .NET, and PHP. Another example is IBM, who has both product documentation and more general documentation.
UPDATE (1 January 2008): StackOverflow
This entire section on Stack Overflow has been added since the original post based on feedback comment (see below) from Alex Miller. When I wrote this original blog posting, I covered the sites and resources I personally use most frequently. However, Alex has reminded me of the many colleagues who also choose Stack Overflow as their first choice for solving a particular problem. I hope to make it a habit for me to check earlier in the process from now on.
There is much to like about Stack Overflow. Perhaps most important is that it is a collaborate site similar to Wikipedia but with a focus on software development questions and answers. The StackOverflow About page specifically points out all of the annoying things this site does not do that some other sites do. Also, even without having used it much yet, it seems likely to be useful when two of its primary contributors are the well-known software development bloggers Joel Spolsky and Jeff Atwood. Spolsky's Joel on Software blog and Atwood's Coding Horror blog are ranked #1 and #3 respectively on Jurgen Appelo's Top 100 Blogs for Developers (Q4 2008).
Resources for General Knowledge
I try not to make my only learning be that required to solve a particular problem. I like to supplement the learning that is done while solving a particular problem with learning some new ways of doing things. I especially like to read others' perspectives. It is amazing how many times the things I learn generally actually help me with specific problems and issues. The set of resources that I prefer for general introductory learning are different than those I prefer for researching a particular issue.
1. Technical Aggregation Sites
I like to spend a few minutes each day scanning headlines for interesting topics. If I see a particular topic mentioned repeatedly by different authors over a period of time, then I am more likely to invest some time in reading at least a little about that topic. I also look for articles covering specialized topics related to general topics that I am familiar with. Some of my favorite sites for doing this are DZone.com and Java.net, both of which provide daily updates on most weekdays. While Java.net provides Java-focused resources, DZone provides broad software development coverage and the two complement each other nicely. DZone also encapsulates JavaLobby, which is Java-focused. Another good example is TheServerSide.com.
2. Content Sites
For blogs and sites that don't provide enough content to justify regular visits, sites like DZone and Java.net are particularly useful for exposing their content. Some sites, however, provide enough of their own valuable content to justify direct monitoring of their new articles and blog entries. Examples of these that I watch at least weekly (because they don't update on a daily basis or because the updates are small enough in number to not miss some if I wait a few days) include JavaWorld, Oracle Technology Network, and developerWorks.
Some of my colleagues prefer Wikipedia as their first-stop for learning something new. If you want a single location that typically has reasonably accurate and concise introductory information to a new topic, this is hard to beat. The links to additional resources and references from a Wikipedia entry can be as useful as the textual content of the entry itself.
4. Newsletters/Blog Feeds
A nice way to be exposed to topics and headlines you might not otherwise see is to subscribe to a favorite blog's feed and/or subscribe to a related newsletter. I have learned some things I did not know from previous subscriptions to things like Java Tech Tips and JavaRanch Journal.
5. Open Source Code
Another way to learn how to look at problems from different perspectives is to look at source code for open source projects. The JExamples site can be useful for finding specific code examples you might be interested in. Other similarly useful sites include Java Examples and Java Source Code Examples.
While there is a common, understandable complaint about things changing rapidly in the Java community and the software development community in general, we do have better tools and better access to resources than ever before. In fact, at least part of the increasing rate of change is probably due to our having such ready access to so much information. To increase our efficiency and effectiveness in development and to allow ourselves more time to do what we enjoy, selecting the best resources and using them appropriately is important, especially with so much data to wade through. In this blog posting, I have attempted to outline some of the steps that I have taken to try and improve the efficiency of my searches for answers and my search for new knowledge.
Additional Resource on Online Java Resources
Sun provides a listing of Online Resources for Java Programmers that may be of interest.