Don't get me wrong, I'm not against reading the code if and when it is available.
I just worry that reliance on this MO goes against the idea that you can specify a programming interface for your system and people can develop against that without knowing the implementation. This is rather powerful in working with other people, complex systems, and systems that are changing, where reading the code may become inefficient.
I'd push back on the mindset of RTFC by saying that as a developers we should try not to link ourselves to infrastructure for which RTFM fails. I know it biases my search for libraries.
> I realize complaining about the lack of documentation in some open source projects is like complaining that there is no foie gras at a friend’s free dinner party
I'd argue that docs aren't foie gras, and not having them is like having a compile error/obvious segfault in your code. Just like stability, docs matter.
Simply put: I'm going to write my own wrapper for just about any external code anyway - my internal API can then be changed on the backend to use new libraries, rather than changing all my code. I will do this anyway, because rarely is a new library a drop-in replacement for an old library. This, not avoiding an understanding of the code details, is how you keep yourself independent of implementation.
However, there will always be corner cases, and occasionally it can be worthwhile/necessary to dig in and figure it out, and the ability to do so can be a big win. Though one must be appropriately wary about relying on undocumented behavior.
I nonchalantly told him to look at the source code of the library
we were using. He looked at me like I had asked him to help me dig up a grave.
I think the next time I interview a candidate I will ask them what major open-source libraries they use. Then I will ask them what they think of the quality of the source code, how it's implemented, what they find difficult to reason about, etc. Getting a blank stare at this point will be a kind of FizzBuzz moment.
Edit: I'm not suggesting that candidates should be an expert on the internals of the libraries they use (I'm certainly not). What I'm looking for is the ability to crack them open when you hit a wall.
A lot of the time I don't need the docs anyway, I just find what I'm looking for in the iltellisense/other suggestions because the OO model makes this work great.
unless I have a problem the documentation or google doesn't answer
Obviously if you need to look at your code for pragmatic purposes, that's fine; but if reading third-party code becomes your modus operandi, you just might be using crappy libraries.
Documentation is ambiguous, and even document which is unambiguous is often wrong.
Maybe, but sometimes you're stuck with crappy libraries or even crappy frameworks. The last time I had to really dig deep into (ie spend more than 30 mins reading) 3rd party code was when I was trying to figure out if a method in Android's WebView was synchronous or not.  Maybe the Android framework, or the WebView specifically is a "crappy library" (the documentation in this case was definitely crappy) but "not using WebView" or "not using Android" wasn't an option.
Also, writing crappy code. If you are relying on undocumented behavior, it might well change under you. Looking past the abstraction is sometimes necessary, but it should be the exception.
turned out it was an issue woth out it used Properties.
That's why i prefer languages with type inference rather than dynamic typing. You can be explicit when you need to and lazy when you want to.
(Excuse my french)
I should add that i work with interpreted languages, so going from my code to library code is literally just a key combo that looks at the token under the cursor, finds it in ctags, and goes there. It takes a fraction of a second to be looking at the code.
Sometimes, it is eye opening to read the source code to some popular libraries/frameworks and discover how badly the code is structured. Some definitely belie the notion that code is written for humans.
FizzBuzz was a filter to filter out people who cannot code.
It was never designed as a competency measure, it was designed as a filter, to remove people who are mistaken into believing they can do something they cannot do at all.
What you have is a very precise measure, which would not even filter out the BSers who could probably happily talk for five minutes on the merits of a codebase they've never looked at (or perhaps even they have) but cannot despite this write a loop counting from 1 to 10.
Any blank stare after this question would not be me not understanding that libraries have code bases but would be me losing track wondering where my next interview would be.
The "filter" I'm looking for is to weed out people who cannot crack open the source to something that is standing between them solving a problem. I'm not asking them to be an expert on the internals of everything they use. Apologies if my comment was unclear.
That will show you exactly how well they know their tools, how and how far they bent them to their will, how passionate they are about them and how well they can communicate on difficult technical topics.
I'd be hard-pressed to find other questions that consistently give me that much information about a candidate.
Everything else is just opinion.
It would be an exaggeration to refer to that as minimally viable code (mvc). It is really only a statement of the lack of engineering actually being practiced, and makes me wonder about the lack of robustness, the lack of security, the numbers of bugs in the systems produced.
I am not certain this is a winning strategy for open source.
One of the worst examples I've come across lately is Zookeeper (http://zookeeper.apache.org/), which should win an award for how confusingly useless the documentation is. The Java source is probably refreshingly concise.
Too often (mostly in interpreted language), I see a method that takes a hash as an option and I see that option being passed down to 3, 4 or more different functions. So in order to know what options are available for a given method, you have to browse through all the other methods that takes the same hash as argument.
I haven't seen a framework dealing with that through documentation. Some are better than others, but they never cover everything.
Once when using an Adobe application that was behaving erratically, and I was unable to see what was happening internally for myself (and obviously the behavior wasn't documented). Incredibly frustrating, and no recourse except to hack around it and hope it didn't mutate.
More recently, I've been bitten by a fairly popular open source application that I intended to use without modification (just configuration). But the documentation was so awful that I couldn't even figure out how to configure it. Ultimately, I had the recourse of stepping through the code to figure it out, but when you're trying to build adoption of your application, it would make sense to make it usable for its main purpose without setting up the actual source code in a debugger.
One interesting generalization I see is that the user-friendliness and documentation of the open-source app correlates quite often to the language used. PHP and Ruby projects seem to be built with an eye towards helping the eventual users use it. The Java projects, while often more competently written and complicated, seem to often be presented as code-only, take it or leave it, user-friendliness be damned.
Reading the code also provides the opportunity for learning beyond the documentation; there's a wealth of really good code out there just waiting to be read.
Whenever you were wondering what parameters to pass to this low level (very useful) utility, the answer was almost always, "Just check out the Code" - and answer that was actually surprising straightforward once you got used to it.
Actually, it's more like not having chairs at a dinner party. It's a significant discomfort, not a lack of a luxury.
"The Spring Security documentation says it best…
It is much easier to debug your application or to work out where a problem lies if you don’t treat the external code you are working with as a black box which you never look inside. The first thing you should do when an exception you don’t understand is thrown from an open source library is jump to the class and line number and take a look to figure out what the code was doing there. Otherwise you’re missing out on much of the benefit of using open source code."
Sorry, but it's a lot easier to debug your application if you have documentation that tells you under what conditions the library throws a particular exception.
Having to understand the source code of a library to be able to figure out its behavior eradicates much of the benefit of using a library in the first place. And the average product these days relies on so much open source software that you can't possibly have the time to dig through the sources to solve every little problem. Would the author of this statement be happy if he had to dig through Linux kernel code, or Apache web server code, or the code of the dozens of Java libraries that Spring is dependent on? I don't think so.
Documentation is ambiguous, and even documentation which is unambiguous is often wrong (or perhaps more kindly, "out of date").