<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Using the Cognitive Dimensions - Penetrability</title><link>http://blogs.msdn.com/stevencl/archive/2004/02/03/66713.aspx</link><description>Penetrability refers to the extent to which a developer must understand the underlying implementation details of an API and the extent to which the developer is able to understand those details. For example, an API that is basically a very thin wrapper</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>re: Using the Cognitive Dimensions - Penetrability</title><link>http://blogs.msdn.com/stevencl/archive/2004/02/03/66713.aspx#66742</link><pubDate>Tue, 03 Feb 2004 18:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:66742</guid><dc:creator>Woo Seok Seo</dc:creator><description>Thank you.&lt;br&gt;&lt;br&gt;Very useful!</description></item><item><title>re: Using the Cognitive Dimensions - Penetrability</title><link>http://blogs.msdn.com/stevencl/archive/2004/02/03/66713.aspx#68001</link><pubDate>Thu, 05 Feb 2004 14:16:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:68001</guid><dc:creator>Frank Hileman</dc:creator><description>So the Avalon API would then require an &amp;quot;expansive&amp;quot; view, correct? The most unusable aspect of that API is the unnecessary exposure of low-level implementation details, imho.&lt;br&gt;&lt;br&gt;Usually we just bag these problems all under the title &amp;quot;unnecessary complexity&amp;quot;. Sometimes people break it down, and say something works at the &amp;quot;wrong level of abstraction.&amp;quot; Your distinctions are very useful. However, you do not seem to have a term strictly categorizing complexity that is unnecessary.&lt;br&gt;&lt;br&gt;For example, a typical design mistake is to expose several low-level details of an API implementation, simply to avoid the much harder task of figuring out an appropriate set of abstractions for the user. The usual argument is &amp;quot;the user needs that because of this one scenario,&amp;quot; or more often, &amp;quot;performance.&amp;quot;&lt;br&gt;&lt;br&gt;But there is more than one way to skin a cat. Exposing a low-level detail may fix one problem, or solve a performance problem. But now the user is permanantly exposed to a lower level of abstraction, and the supplier must work that much harder to support upward compatability of the low-level detail. Changing the internal implementaion is no longer easy.&lt;br&gt;&lt;br&gt;The better solution is often to reconsider the API at a higher level, to enable the scenario, or solve the performance problem, without exposing a low-level detail. This is much harder and developers generally prefer to skip this step, in part because it implicitly invalidates the original &amp;quot;architecture&amp;quot; (ego may be involved).&lt;br&gt;&lt;br&gt;So Steve, are there terms to describe this very typical design problem? I believe it causes much unnecessary complexity in modern APIs.</description></item><item><title>re: Using the Cognitive Dimensions - Penetrability</title><link>http://blogs.msdn.com/stevencl/archive/2004/02/03/66713.aspx#70082</link><pubDate>Mon, 09 Feb 2004 17:50:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:70082</guid><dc:creator>Steven Clarke</dc:creator><description>You're right Frank, in saying that the cognitive dimensions don't describe the 'unnecessary complexity' that you talk about. Measuring the penetrability of an API on it's own doesn't really tell you much with regards to whether or not the snapshot or expansive view required by the API is reasonable.&lt;br&gt;&lt;br&gt;Determining what works well is done by comparing the measurement of an API with the cognitive dimensions profile of the API user. When you look at the penetrability required to be able to use an API with that expected by a developer, you can use the cognitive dimensions framework to describe why the API is unnecessarily complex or too simple (or just right).</description></item><item><title>re: Using the Cognitive Dimensions - Penetrability</title><link>http://blogs.msdn.com/stevencl/archive/2004/02/03/66713.aspx#70608</link><pubDate>Tue, 10 Feb 2004 13:34:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:70608</guid><dc:creator>Frank Hileman</dc:creator><description>This logic doesn't sit well with me. Simply because a user can handle the complexity, does not mean the complexity is necessary. I am talking about another type of &amp;quot;correctness,&amp;quot; which does not seem to be quantified or recognized in your model.&lt;br&gt;&lt;br&gt;An API may provide types A and B, with numerous members on each. Or, after redesign, may provide only type C, with less members and less complexity. With C the user can accomplish everything needed; A and B were unnecessarily complex.&lt;br&gt;&lt;br&gt;In API design, simplicity is generally considered one of the most important factors. Perhaps only experience in API design and the specific domain can guide one toward simplicity.&lt;br&gt;&lt;br&gt;But to quantify simplicity, we must measure both functionality and complexity, and look at the ratio between them. A design with a high ratio is considered superior to a design with a low ratio. To consider a design by itself, without looking at alternatives, does not help us determine a reasonable ratio.&lt;br&gt;&lt;br&gt;Any consideration of the design must include all the types in the domain area -- looking at a class in isolation does not help.&lt;br&gt;&lt;br&gt;A design with a good ratio, as measured above, will tend to be more usable, because there is less mental burden, and less to learn. The books are not as thick.&lt;br&gt;&lt;br&gt;Any developer can tell you their number one problem today is learning new APIs: they are proliferating rapidly, and a developer typically must be familiar with many at the same time. Since MS is responsible for much of this proliferation, API simplicity should be a top priority. </description></item><item><title>re: Using the Cognitive Dimensions - Penetrability</title><link>http://blogs.msdn.com/stevencl/archive/2004/02/03/66713.aspx#70716</link><pubDate>Tue, 10 Feb 2004 17:28:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:70716</guid><dc:creator>Steven Clarke</dc:creator><description>I should have been clearer in my response. Complexity of an API is a combination of the different factors that the cognitive dimensions framework measures. I have seen many APIs that are considered too complex by users because of the abstractions they expose (your example above), or the learning styles required to understand the API, or the working framework the API imposes, or because of any one of the other dimensions and combinations thereof.&lt;br&gt;&lt;br&gt;What the cognitive dimensions framework helps expose is the reason for the complexity in the API. It helps the API designers understand in more detail why the API was too complex and what they can do to reduce the complexity. For example, one answer might be to change the abstractions so that instead of exposing a collection of primitives, a collection of factored components is exposed instead. Or, it might be that the work-step unit for many tasks is too long. In this case, the API could take care of some of the programming work required, for example automating more of the initialization required to use the API instead of forcing all that work on the user.&lt;br&gt;&lt;br&gt;Additionally, all measurements have to be taken with respect to the particular user being targeted by the developer. Different users have different requirements and what might be considered complex for one user could be just right for another.&lt;br&gt;&lt;br&gt;I absolutely agree with your comment about looking at alternative design ideas. It's a great point. It should be part of the design process to decribe the scenarios that the API should support and then to show multiple ways in which the API could support these scenarios. This would be a great way to identify the way that diferent design decisions impact the complexity of the API.</description></item><item><title>API Penetrability </title><link>http://blogs.msdn.com/stevencl/archive/2004/02/03/66713.aspx#72647</link><pubDate>Fri, 13 Feb 2004 23:13:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:72647</guid><dc:creator>stevencl's WebLog</dc:creator><description /></item><item><title>Date Time Best Practices </title><link>http://blogs.msdn.com/stevencl/archive/2004/02/03/66713.aspx#82207</link><pubDate>Mon, 01 Mar 2004 23:38:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:82207</guid><dc:creator>Lance's Whiteboard</dc:creator><description /></item></channel></rss>