<?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>Kathy Kam : API Design</title><link>http://blogs.msdn.com/kathykam/archive/tags/API+Design/default.aspx</link><description>Tags: API Design</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Orcas October CTP available - Hello, "System.DateTimeOffset"!</title><link>http://blogs.msdn.com/kathykam/archive/2006/10/30/orcas-october-ctp-available-hello-system-datetimeoffset.aspx</link><pubDate>Tue, 31 Oct 2006 00:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:904503</guid><dc:creator>KathyKam</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.msdn.com/kathykam/comments/904503.aspx</comments><wfw:commentRss>http://blogs.msdn.com/kathykam/commentrss.aspx?PostID=904503</wfw:commentRss><wfw:comment>http://blogs.msdn.com/kathykam/rsscomments.aspx?PostID=904503</wfw:comment><description>&lt;P&gt;Once again, I am very excited that the new &lt;A class="" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=C09B5A2D-EB6A-44B6-8BBD-3764A2FDA9CE&amp;amp;displaylang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyId=C09B5A2D-EB6A-44B6-8BBD-3764A2FDA9CE&amp;amp;displaylang=en"&gt;CTP&lt;/A&gt; is available. :) My second feature for Orcas&amp;nbsp;is available to the world!&amp;nbsp;The BCL team has gotten plenty of feedback (as you can see the comments from my BCL post and on this blog...) about needing an object to represent exact point in time! (We do listen!!) &lt;/P&gt;
&lt;P&gt;Oh and for those of you who has been reading my blog regularly... this is the third &lt;A class="" href="http://blogs.msdn.com/kathykam/archive/2006/10/09/API-Naming-_2D00_-Most-debated-name-on-the-BCL-are_2E002E002E00_.aspx" mce_href="http://blogs.msdn.com/kathykam/archive/2006/10/09/API-Naming-_2D00_-Most-debated-name-on-the-BCL-are_2E002E002E00_.aspx"&gt;most debated name&lt;/A&gt; on the BCL: "DateTimeOffset". I will explain why later this month in my "Desiging DateTimeOffset" posts. Again, a starter guide will be posted on the &lt;A class="" href="http://blogs.msdn.com/bclteam" mce_href="http://blogs.msdn.com/bclteam"&gt;BCL blog&lt;/A&gt; very soon. This time, I think our new PM Justin will be doing it instead of me. I still need to write a "Advance feature for TimeZone2". &lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp;A new date time data structure that can specify an exact point in time relative to the UTC time zone. &lt;/EM&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;EM&gt;The current DateTime is insufficient at specifying an exact point in time. DateTimeOffset represents a date time with an offset. It is not meant to be a replacement for DateTime; it should be used in scenarios involving absolute points in time. DateTimeOffset includes most of the functionality of the current DateTime API and allows seamless conversion to DateTime as well.&lt;/EM&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Again, for my loyal readers here... a little sneak preview&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: windowtext 1.5pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1.5pt solid; PADDING-LEFT: 4pt; BACKGROUND: #d9d9d9; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1.5pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1.5pt solid; mso-element: para-border-div"&gt;
&lt;P class=Code style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=2&gt;&lt;FONT face="Lucida Console"&gt;&lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; CreatingADateTimeOffset()&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=Code style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face="Lucida Console" size=2&gt;{&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=Code style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=2&gt;&lt;FONT face="Lucida Console"&gt;&lt;/FONT&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=Code style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=2&gt;&lt;FONT face="Lucida Console"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;DateTime&lt;/SPAN&gt; currentDateTime = GetUserDateTime();&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=Code style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face="Lucida Console"&gt;&lt;SPAN style="COLOR: teal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TimeSpan &lt;/SPAN&gt;userOffset = GetUserOffset();&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=Code style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face="Lucida Console"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;DateTimeOffset&lt;/SPAN&gt; pointInTime = new &lt;SPAN style="COLOR: teal"&gt;DateTimeOffset&lt;FONT color=#000000&gt;(currentDateTime , userOffset);&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=Code style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=2&gt;&lt;FONT face="Lucida Console"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;}&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/DIV&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=904503" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/kathykam/archive/tags/API+Design/default.aspx">API Design</category><category domain="http://blogs.msdn.com/kathykam/archive/tags/DateTime+and+TimeZone2/default.aspx">DateTime and TimeZone2</category></item><item><title>API Naming - Most debated name on the BCL are...</title><link>http://blogs.msdn.com/kathykam/archive/2006/10/09/API-Naming-_2D00_-Most-debated-name-on-the-BCL-are_2E002E002E00_.aspx</link><pubDate>Mon, 09 Oct 2006 18:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:775925</guid><dc:creator>KathyKam</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/kathykam/comments/775925.aspx</comments><wfw:commentRss>http://blogs.msdn.com/kathykam/commentrss.aspx?PostID=775925</wfw:commentRss><wfw:comment>http://blogs.msdn.com/kathykam/rsscomments.aspx?PostID=775925</wfw:comment><description>&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;So.. in&amp;nbsp;my&amp;nbsp;&lt;A href="http://blogs.msdn.com/kathykam/archive/2006/09/25/767173.aspx" mce_href="http://blogs.msdn.com/kathykam/archive/2006/09/25/767173.aspx"&gt;previous post&lt;/A&gt;, I asked "which two names wa the most debated names on the BCL". Well,&amp;nbsp;the types that got the most debate for its name are:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=3&gt;Nullable&amp;lt;T&amp;gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face=Tahoma size=3&gt;Collection&amp;lt;T&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;Surprised? Not suprised? Do you think they are named appropriately? &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma&gt;&amp;lt;Editorial Coment&amp;gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face=Tahoma&gt;&lt;EM&gt;Why is there only 2? Shouldn't you tell me "Top 3"?&lt;/EM&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face=Tahoma&gt;"Hardest API to name #3" should be available in the next Orcas CTP. So I won't let the cat out of the bag just yet. :)&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face=Tahoma&gt;&amp;lt;/Editorial Coment&amp;gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=775925" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/kathykam/archive/tags/API+Design/default.aspx">API Design</category></item><item><title>Naming Guideline Discussion</title><link>http://blogs.msdn.com/kathykam/archive/2006/10/06/Naming-Guideline-Discussion.aspx</link><pubDate>Sat, 07 Oct 2006 03:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:799024</guid><dc:creator>KathyKam</dc:creator><slash:comments>11</slash:comments><comments>http://blogs.msdn.com/kathykam/comments/799024.aspx</comments><wfw:commentRss>http://blogs.msdn.com/kathykam/commentrss.aspx?PostID=799024</wfw:commentRss><wfw:comment>http://blogs.msdn.com/kathykam/rsscomments.aspx?PostID=799024</wfw:comment><description>&lt;P&gt;Yeah.. Krzysztof have finally blogged about the controversial naming guidelines around TimeZone2!&lt;/P&gt;
&lt;P&gt;Check it out:&amp;nbsp;&lt;A href="http://blogs.msdn.com/kcwalina/archive/2006/10/06/TimeZone2Naming.aspx" mce_href="http://blogs.msdn.com/kcwalina/archive/2006/10/06/TimeZone2Naming.aspx"&gt;http://blogs.msdn.com/kcwalina/archive/2006/10/06/TimeZone2Naming.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Also, I'd like to repost one of my responses to the names suggested:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;TimeZoneExtended:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;If we were to call it "TimeZoneExtended", why dont we just call it "TimeZoneEx"?&lt;BR&gt;Again.. Page 47 of the .NET Design Guidelines:&lt;BR&gt;"DO NOT use the "Ex" (or similar) suffix for an identifier to distinguish it from an earlier version of the same API."&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Also, I know I am quoting the guidelines a lot. I am not saying because the guideline say so... therefore we're&amp;nbsp;doing it this way. But these are the guidelines te BCL team came up, and as the BCL team, we strongly believe the guidelines will help us create a more consistent framework.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;TimeZoneData:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The .NET Framework actually doesn't store any time zone data. We use the OS's data. So calling the class as such is misleading.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;TimeZoneInformation:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Too long. :( This is a core type. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;TimeZoneDynamicSupport:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Doesn't have built in Dynamic Time Zone support if your OS doesn't have it, because we rely on the OS to give us the Dynamic Time Zone data. If you create a TimeZone2 object, it can have Dynamic Time Zone support though. This may be confusing the normal user who expects it to have Dynamic Time Zone support at all times. Also, this is too long.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;TimeZoneVistaCompatible:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;It is not *just* Vista compatible. It is compatible with Vista and beyond. Plus, it works on XP as well. This will be misleading to users, plus it is too long. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;TimeZoneUseThisOneTheOldOneIsStupid:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Hey, that's what TimeZone2 is suppose to communicate, but in a much shorter way. :) &lt;/P&gt;
&lt;P&gt;Remember, I discuss the principles of naming an API &lt;A class="" href="http://blogs.msdn.com/kathykam/archive/2006/09/25/767173.aspx" mce_href="http://blogs.msdn.com/kathykam/archive/2006/09/25/767173.aspx"&gt;&lt;FONT color=#f89e59&gt;here&lt;/FONT&gt;&lt;/A&gt;. For the BCL team, short is VERY important. When &lt;A class="" href="http://en.wikipedia.org/wiki/Anders_Hejlsberg" mce_href="http://en.wikipedia.org/wiki/Anders_Hejlsberg"&gt;&lt;FONT color=#f89e59&gt;Anders&lt;/FONT&gt;&lt;/A&gt; review our API naming, length of name is one of the things he is concern about. &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=799024" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/kathykam/archive/tags/API+Design/default.aspx">API Design</category></item><item><title>Designing System.TimeZone2 - Part 2 (Dynamic Time Zone support)</title><link>http://blogs.msdn.com/kathykam/archive/2006/10/05/Designing-System.TimeZone2-_2D00_-Part-2-_2800_Dynamic-Time-Zone-support_2900_.aspx</link><pubDate>Fri, 06 Oct 2006 03:59:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:795067</guid><dc:creator>KathyKam</dc:creator><slash:comments>16</slash:comments><comments>http://blogs.msdn.com/kathykam/comments/795067.aspx</comments><wfw:commentRss>http://blogs.msdn.com/kathykam/commentrss.aspx?PostID=795067</wfw:commentRss><wfw:comment>http://blogs.msdn.com/kathykam/rsscomments.aspx?PostID=795067</wfw:comment><description>&lt;P&gt;There are some great &lt;A class="" href="http://blogs.msdn.com/kathykam/archive/2006/10/03/Designing-System.TimeZone2-_2D00_-Part-1-_2800_API-naming-and-new-class-or-not_2900_-.aspx#794695" mce_href="http://blogs.msdn.com/kathykam/archive/2006/10/03/Designing-System.TimeZone2-_2D00_-Part-1-_2800_API-naming-and-new-class-or-not_2900_-.aspx#794695"&gt;discussion&lt;/A&gt; on the differences between System.TimeZone and System.TimeZone2 and what exactly is &lt;A class="" href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/dynamic_time_zone_information.asp" mce_href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/dynamic_time_zone_information.asp"&gt;Vista Dynamic Time Zone&lt;/A&gt; in my previous post. So I thought I'll spend Part 2 talking about it. &lt;/P&gt;
&lt;P&gt;So what exactly is the difference? I have mentioned again and again that the difference is in "&lt;A class="" href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/dynamic_time_zone_information.asp" mce_href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/dynamic_time_zone_information.asp"&gt;Vista Dynamic Time Zone support&lt;/A&gt;". But another major difference is that, in System.TimeZone the only time zone you can use was current time zone. That's it. TimeZone2 is way more flexible than that. Users can create their own time zone using the CreateTimeZone API or use the OS provided time zone. &lt;EM&gt;(I really need to blog about the CreateTimeZone API... that's on my to-do list)&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;"So what exactly is this "Vista Dynamic Time Zone support"?" &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;The word "dynamic" itself is&amp;nbsp;a little misleading. It is not "dynamic". It is&amp;nbsp;more "historic" or "futuristic".&amp;nbsp;"Dynamic time zone data"&amp;nbsp;is just the new registry structure that Vista has introduced so that an application can query&amp;nbsp;a time zone's historic (and future) data. It is dynamic in the sense that as you move forward it time, the OS will update your current time zone information based on the data. &lt;/P&gt;
&lt;P&gt;&lt;EM&gt;"So does TimeZone2 do different things on different OS?" &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Short Answer:&lt;/STRONG&gt; No it does not. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Long Explaination: &lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Let's take a look at "IsDaylightSavingTime".&lt;/P&gt;
&lt;P&gt;For System.TimeZone2:&lt;BR&gt;public bool IsDaylightSavingTime (&lt;BR&gt;&amp;nbsp; &amp;nbsp;DateTime time&lt;BR&gt;)&lt;/P&gt;
&lt;P&gt;On Vista,&amp;nbsp;if you call &lt;STRONG&gt;FindSystemTimeZoneById&lt;/STRONG&gt;, TimeZone2&amp;nbsp;will be populated with historic and future time zone data (aka dynamic time zone data). On Win XP, if the OS has not been updated with this new data (we are hoping that Windows will backport dynamic time zone data to XP btw...), TimeZone2 will be populated with the current time zone data the OS provides. TimeZone2 doesn't have different logic.&amp;nbsp;The difference here is the data that was provided by the OS. The difference is in &lt;STRONG&gt;FindSystemTimeZoneById&lt;/STRONG&gt;(). The call "&lt;STRONG&gt;IsDaylightSavingTime&lt;/STRONG&gt;()" does the same thing in both OS.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Two TimeZone2 object with the same data will&amp;nbsp;return the same thing across all the instance methods.&amp;nbsp;You can populate a TimeZone2 object with historical data in WinXP and it will work like it does in Vista. Similarly&amp;nbsp;you can also populate a TimeZone2 object without historical data in Vista and it will work like it does in XP. It all works the same. &lt;/P&gt;
&lt;P&gt;The only difference the different OS brings is in the static methods that queries data from the OS. If the OS have different data, the static methods will return different results. This is no different to if you call "GetOSHelloString()" and one OS returns strHello = "Hello World", and another reutrns strHello = "Hello". Would you consider strHello.Length returnng different results and "doing different things on different OS"? &lt;/P&gt;
&lt;P&gt;The APIs that calls the OS to get the data all have the word "SystemTimeZone" in it. &lt;/P&gt;
&lt;P&gt;- GetSystemTimeZone()&lt;BR&gt;- FindSystemTimeZoneById(string id)&lt;BR&gt;- ConvertBySystemTimeZoneId(string id) &lt;/P&gt;
&lt;P mce_keep="true"&gt;So the "SystemTimeZone" APIs&amp;nbsp;are really helpers for you to get to the OS time zone data. TimeZone2 can operate on other data.&lt;EM&gt; (Again, I really need to post a blog about the CreateTimeZone APIs... )&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;For developers who wants to use OS data but is worried about different OS having different data, we do recomend them serializing the TimeZone data when doing cross application communication.&lt;/P&gt;
&lt;P&gt;Now let's look at System.TimeZone, for the same&amp;nbsp;API. It behaves completely differently.&lt;BR&gt;public static bool IsDaylightSavingTime (&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DateTime time,&lt;BR&gt;&amp;nbsp; &amp;nbsp;DaylightTime daylightTimes&lt;BR&gt;)&lt;/P&gt;
&lt;P&gt;First of all, it is a static method. Secondly, it takes a DaylightTime to calculate whether it is in daylight saving time. It has no understanding of the OS time zone data. &lt;/P&gt;
&lt;P&gt;This is why just augmenting or changing System.TimeZone will be a huge&amp;nbsp;breaking change for our exisiting customers. Basically, we'll gut System.TimeZone and replace it with what we call "System.TimeZone2". When we realize that's what we'll do. We decided that we are basically creating a new type. Thus, the birth of System.TimeZone2.&lt;/P&gt;
&lt;P&gt;Does this make sense? Do you agree? Disagree?&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=795067" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/kathykam/archive/tags/API+Design/default.aspx">API Design</category><category domain="http://blogs.msdn.com/kathykam/archive/tags/DateTime+and+TimeZone2/default.aspx">DateTime and TimeZone2</category></item><item><title>Designing System.TimeZone2 - Part 1 (API naming and new class or not) </title><link>http://blogs.msdn.com/kathykam/archive/2006/10/03/Designing-System.TimeZone2-_2D00_-Part-1-_2800_API-naming-and-new-class-or-not_2900_-.aspx</link><pubDate>Wed, 04 Oct 2006 07:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:788685</guid><dc:creator>KathyKam</dc:creator><slash:comments>14</slash:comments><comments>http://blogs.msdn.com/kathykam/comments/788685.aspx</comments><wfw:commentRss>http://blogs.msdn.com/kathykam/commentrss.aspx?PostID=788685</wfw:commentRss><wfw:comment>http://blogs.msdn.com/kathykam/rsscomments.aspx?PostID=788685</wfw:comment><description>&lt;P&gt;&lt;SPAN lang=EN style="mso-ansi-language: EN"&gt;Didn't I say it two weeks ago that &lt;A class="" href="http://blogs.msdn.com/kathykam/archive/2006/09/25/767173.aspx" mce_href="http://blogs.msdn.com/kathykam/archive/2006/09/25/767173.aspx"&gt;API naming&lt;/A&gt; is the most difficult thing? :) My BCL &lt;A class="" href="http://blogs.msdn.com/bclteam/archive/2006/10/03/System.TimeZone2-Starter-Guide-_5B00_Kathy-Kam_5D00_.aspx" mce_href="http://blogs.msdn.com/bclteam/archive/2006/10/03/System.TimeZone2-Starter-Guide-_5B00_Kathy-Kam_5D00_.aspx"&gt;post&lt;/A&gt; on System.TimeZone2 has been out for about 12 hours, and the top complaint has been .... can you guess it... yes... the name!&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN lang=EN style="mso-ansi-language: EN"&gt;You might even think that I knew this was going to attract some controversy and so I prep you guys with that post. But no, naming the new class &lt;STRONG&gt;System.TimeZone2&lt;/STRONG&gt; was not a controversal&amp;nbsp;witin Microsoft at all. It&amp;nbsp;doesn't even make it into the top 10 debated names. ;) Once we have reached the decision that we do need a new class for the extended time zone functionality and that this new class was going to totally replace &lt;STRONG&gt;System.Time&lt;/STRONG&gt;Zone. There was no question in any of our reviewers' or approvers' mind what this class should be called.&amp;nbsp;Actually, we all agree that&amp;nbsp;calling it by any other name will actually make it&amp;nbsp;more ambiguous what our intentions is. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN lang=EN style="mso-ansi-language: EN"&gt;Users of the .NET framework will know, &lt;STRONG&gt;System.TimeZone2&lt;/STRONG&gt; is to replace &lt;STRONG&gt;System.TimeZone&lt;/STRONG&gt;. There is no functionatlity that can be performed in &lt;STRONG&gt;System.TimeZone&lt;/STRONG&gt; that cannot be done with &lt;STRONG&gt;System.TimeZone2&lt;/STRONG&gt;. We did see people cringe at first, but that's more of a gut reaction to.. why can't we extend &lt;STRONG&gt;System.TimeZone&lt;/STRONG&gt; rather than the naming issue. Now why is extending Time Zone support a whole different class is&amp;nbsp;much worthier&amp;nbsp;debate in my mind. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN lang=EN style="mso-ansi-language: EN"&gt;I know some people have been wondering whether this decision was made because of this &lt;A class="" href="http://blogs.msdn.com/somasegar/archive/2006/05/18/601354.aspx" mce_href="http://blogs.msdn.com/somasegar/archive/2006/05/18/601354.aspx"&gt;Orcas "Red" bits vs Orcas "Green" bits&lt;/A&gt; limitation. No need to call the &lt;A class="" href="http://dsc.discovery.com/fansites/mythbusters/mythbusters.html" mce_href="http://dsc.discovery.com/fansites/mythbusters/mythbusters.html"&gt;MythBusters&lt;/A&gt;... I can bust this myth right here and now. &lt;STRONG&gt;&lt;U&gt;This is not the reason&lt;/U&gt;&lt;/STRONG&gt;.&amp;nbsp;Every feature in Orcas&amp;nbsp;goes through an Architect review to make sure we don't add a new class just because of this "Red" bits "Green" bits rule. &lt;EM&gt;(Trust me.. we don't like adding new classes, and we are VERY concern about framework pollution.)&lt;/EM&gt; If extending &lt;STRONG&gt;System.TimeZone&lt;/STRONG&gt; was what we're going to do anyways, then we'll do it in "Red" bits or wait a release. &lt;/SPAN&gt;&lt;SPAN lang=EN style="mso-ansi-language: EN"&gt;However, after weighing in the pros and cons, it was obvious to us that we'll never just modify System.TimeZone. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN lang=EN style="mso-ansi-language: EN"&gt;It is obvious in the beginning that if we were to extend time zone support in the framework, we have to support &lt;A class="" href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/dynamic_time_zone_information.asp" mce_href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/dynamic_time_zone_information.asp"&gt;Vista's Dynamic Time Zone APIs&lt;/A&gt;. Otherwise, we are just bandaiding the problem and waiting for another TimeZone++ to happen. Leveraging Vista's dynamic time zone support is equivalent to overhauling and dumping the old time zone functionality. The whole idea of "daylightsaving" time is different. We're now looking at historic data as well as current data. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN lang=EN style="mso-ansi-language: EN"&gt;Next, we took a look of most requested features from our customers (yes... we do listen.. send us more feedback!) and&amp;nbsp;took a look at what &lt;STRONG&gt;System.TimeZone&lt;/STRONG&gt; already has. It was decided that if we were to add a new class, there is no reason to&amp;nbsp;add support to&amp;nbsp;Vista's dynamic time zone and these new features without also having all System.TimeZone's functionality (but implemented differently). (&lt;EM&gt;Side Note: We did thought about having a class that doesn't replace System.TimeZone, but merely augments it for the extra support. But it wasn't hard to&amp;nbsp;realize that wouldn't be good.)&lt;/EM&gt;&amp;nbsp; So, how much breaking changes would require &lt;STRONG&gt;System.TimeZone&lt;/STRONG&gt; to have if we were to add&amp;nbsp;all these new features? The answer is .... a lot.&amp;nbsp;I asked last time.. &lt;A class="" href="http://blogs.msdn.com/kathykam/archive/2006/09/05/740760.aspx" mce_href="http://blogs.msdn.com/kathykam/archive/2006/09/05/740760.aspx"&gt;how&amp;nbsp;much breaking will&amp;nbsp;our users tolerate&lt;/A&gt;? So,&amp;nbsp;after weighing in everything,&amp;nbsp;we decided that we need a new class, and this new class that needs to do everything that&amp;nbsp;System.TimeZone does.&amp;nbsp;So it only make sense to deprecate &lt;STRONG&gt;System.TimeZone&lt;/STRONG&gt;, and introduce this new class as its replacement.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN lang=EN style="mso-ansi-language: EN"&gt;Now, regarding everyone's feeling about the guideline:&lt;/SPAN&gt;&lt;/P&gt;&lt;SPAN lang=EN style="mso-ansi-language: EN"&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN lang=EN style="mso-ansi-language: EN"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;"Do use a numeric suffix to indicate a new version of an existing API if the existing name of the API is the only name that makes sense"&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/SPAN&gt;
&lt;P&gt;&lt;SPAN lang=EN style="mso-ansi-language: EN"&gt;I actually pinged &lt;A class="" href="http://blogs.msdn.com/brada" mce_href="http://blogs.msdn.com/brada"&gt;Brad&lt;/A&gt; and &lt;A class="" href="http://blogs.msdn.com/kcwalina" mce_href="http://blogs.msdn.com/kcwalina"&gt;Krzsyztof&lt;/A&gt; about your &lt;A class="" href="http://blogs.msdn.com/bclteam/archive/2006/10/03/System.TimeZone2-Starter-Guide-_5B00_Kathy-Kam_5D00_.aspx#787847" mce_href="http://blogs.msdn.com/bclteam/archive/2006/10/03/System.TimeZone2-Starter-Guide-_5B00_Kathy-Kam_5D00_.aspx#787847"&gt;feedback&lt;/A&gt;. Hopefully one of them will post something about this soon. :) &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN lang=EN style="mso-ansi-language: EN"&gt;I hope this explains some of our reasoning. What do you think? Agree? Disagree?&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=788685" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/kathykam/archive/tags/API+Design/default.aspx">API Design</category><category domain="http://blogs.msdn.com/kathykam/archive/tags/DateTime+and+TimeZone2/default.aspx">DateTime and TimeZone2</category></item><item><title>API Naming - API Design</title><link>http://blogs.msdn.com/kathykam/archive/2006/09/25/767173.aspx</link><pubDate>Tue, 26 Sep 2006 03:08:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:767173</guid><dc:creator>KathyKam</dc:creator><slash:comments>8</slash:comments><comments>http://blogs.msdn.com/kathykam/comments/767173.aspx</comments><wfw:commentRss>http://blogs.msdn.com/kathykam/commentrss.aspx?PostID=767173</wfw:commentRss><wfw:comment>http://blogs.msdn.com/kathykam/rsscomments.aspx?PostID=767173</wfw:comment><description>&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Before becoming a PM, I attended&amp;nbsp;one of those annual&amp;nbsp;Program Manager conference in Microsoft. I attended a talk that particularly stuck in my mind today as I discuss API naming. It was called "Six Skills of Feature Design Leaders ". The speaker is a UI PM, so naturally, his examples were focused on designing UI components. &lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;To emphsis one of his points, he discussed about the difficulity a PM would experience&amp;nbsp;because everyone thinks they are an expert and thus have a say in it. He asks us how often do we go tell a Dev or a Tester that they are doing their job wrong, vesus how often a Dev or a Tester telling you that the UI is wrong&amp;nbsp;(e.g.&amp;nbsp;the button is the wrong color). Therefore he concluded that feature design is a skill that needs to be master&amp;nbsp;and one of the things you need to master is to design something even though&amp;nbsp;it is easy for everyone to have an opinion. (ie. "Everyone's a UI designer!")&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;I didn't not think about this much after I became a PM. I was moving to&amp;nbsp;Deveoper Division. Surely,&amp;nbsp;that didn't apply to me. Designing APIs is very different from desigining UI. Yes, everyone can have a say in the UI, but code?&amp;nbsp;I was wrong. &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;API naming was surprisingly like designing UI. Everyone does have an opinion and everyone is an expert. If we were to make a new type in Orcas that has 3 elements. A Date, a time and an UTC offset. What should that be called? &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;- DateTimeUtcOffset&lt;BR&gt;- TimeDateUtcOffset&lt;BR&gt;- PointInTime&lt;BR&gt;- DateTimeWithOffset&lt;BR&gt;- DateTimeOffset&lt;BR&gt;- DateTimeStandard&lt;BR&gt;- DateTimeRelative&lt;BR&gt;- DateTimeAbsolute&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Just off the top of my head, I can name about 20 different names that are acceptable. Some I prefer over others, but different people prefer different things. How do you decide what name to go wth? What are the principals?&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Here is what I learnt from my time on the BCL team:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;1) &lt;STRONG&gt;Names should be as short as possible.&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;We are making a base type here. Though VS intellisense makes typing long names easy, that doesn't mean EVERYONE will use VS. &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;2) &lt;STRONG&gt;Name should descibe the type&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;The name should describe the name as best as possble, and also make it similar to related types. For example, what if we name "DirectoryInfo" as the class that describe a directory, and "FileDescription" as the class that describe a file? People who are familiar with one type will not easily associate the two types. That is why, we named them "DirectoryInfo" and "FileInfo".&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;3) &lt;STRONG&gt;Name should follow .NET Design Guidelines&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;The BCL team came out with the guidelines for consistency. Thus it is vital that names follow the guidelines&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;4) &lt;STRONG&gt;Name should not be "close enough"&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Don't call your type&amp;nbsp;something when it is not. I have had people who suggest names that are "close enough, people don't know the difference anyways". That's underestimating our users, plus this is just bad news all the way. If I have a type that contains a date, a time and a UTC Offset. Naming it "DateTimeTimeZone" is just wrong. It doesn't contain a System.TimeZone object! An UTC Offset can map to several Time Zones and represent none. People will make the wrong assumptions because you named it carelessly.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;So, can you guess which two names was the most debated names on the BCL? Do you have the same problems with designing types?&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=767173" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/kathykam/archive/tags/API+Design/default.aspx">API Design</category></item><item><title>API Design: The why of "StringBuilder.AppendFormat()" design</title><link>http://blogs.msdn.com/kathykam/archive/2006/05/11/595793.aspx</link><pubDate>Fri, 12 May 2006 04:38:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:595793</guid><dc:creator>KathyKam</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/kathykam/comments/595793.aspx</comments><wfw:commentRss>http://blogs.msdn.com/kathykam/commentrss.aspx?PostID=595793</wfw:commentRss><wfw:comment>http://blogs.msdn.com/kathykam/rsscomments.aspx?PostID=595793</wfw:comment><description>&lt;P&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;&lt;EM&gt;"Why does StrignBuilder.AppendFormat() need anything more than AppendFormat(string, object[])?" -- Curious StringBuilder.AppendForamt user&lt;/EM&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;This is a great question. Before I begin, let's visit what overloads &lt;A href="http://msdn2.microsoft.com/en-us/library/system.text.stringbuilder.appendformat.aspx"&gt;AppendFormat&lt;/A&gt; has....&lt;/FONT&gt;&lt;/P&gt;&lt;FONT color=#000080&gt;&lt;FONT face=Verdana size=2&gt;AppendFormat( string, object);&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face=Verdana size=2&gt;AppendFormat( string, object, object);&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face=Verdana size=2&gt;AppendFormat( string, object, object, object);&lt;/FONT&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face=Verdana size=2&gt;AppendFormat( string, object[]);&lt;BR&gt;AppendFormat (IFormatProvider, string, object[])&lt;/FONT&gt;&lt;BR&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;An obvious question is, why do we need the first three (the ones in blue)? (Obviously, we need the one with IFormatProvider...)&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Here is what I learnt:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;1) Some languages doesn't support "params" syntax. By having those overloads, we allow a short cut that&amp;nbsp;allow the developer to directly use it without having to create an array. &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;2) Allows the option for the CLR engine to do performance optimization (without array creation or other optomization) on common scenarios. (However, the CLR engine has not taken up on this option...)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;&amp;lt;editorial comment&amp;gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;In the past 5 months on the BCL team, I have&amp;nbsp;learnt&amp;nbsp;alot about design decisions made on the current BCL APIs and some of its consequences. Many times, the lessons of poor design does not show up until you have ship multiple version of the APIs. I think I am gonna start sharing some of the stuff I picked up from the team on this blog. Since V1, the BCL team has lots of experiences to share. A lot of successes, and some failures ;). (By the way, if you don't know already, Krzysztof and Brad did a great job of sharing some of the successes and failures in his &lt;A href="http://www.amazon.com/gp/product/0321246756/104-8392266-3909506?v=glance&amp;amp;n=283155"&gt;Framework Design Guidelines&lt;/A&gt; book.&amp;nbsp;It's a&amp;nbsp;great&amp;nbsp;read! The BCL team is the Guidelines' first customer, and I find VERY intersting to learn how the BCL APIs&amp;nbsp;relates or drive&amp;nbsp;these guidelines.) Anyways, my first post on this topic is not really a "lessons learnt", it is more a "I always wonder why....".&lt;/FONT&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face=Verdana size=2&gt;&amp;lt;/editorial comment&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;If you have any "I always wonder why the BCL did &amp;lt;Some API&amp;gt; this way...", please send it to me. I'd love to find out and share with you.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;FONT face=Verdana size=2&gt;&lt;/FONT&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=595793" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/kathykam/archive/tags/API+Design/default.aspx">API Design</category></item><item><title>Feature Requests... why don't we just do them all?</title><link>http://blogs.msdn.com/kathykam/archive/2006/04/18/578030.aspx</link><pubDate>Tue, 18 Apr 2006 18:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:578030</guid><dc:creator>KathyKam</dc:creator><slash:comments>8</slash:comments><comments>http://blogs.msdn.com/kathykam/comments/578030.aspx</comments><wfw:commentRss>http://blogs.msdn.com/kathykam/commentrss.aspx?PostID=578030</wfw:commentRss><wfw:comment>http://blogs.msdn.com/kathykam/rsscomments.aspx?PostID=578030</wfw:comment><description>&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Today, I learned an intersting (and very important) lesson about building a framework. I was in a meeting where another team wants the BCL's support to add some APIs to WinFX. The APIs they want to add are valuable. It gives power to .NET developers to do something new, it opens new doors.&amp;nbsp;It seems brain-dead obvious that they should be allowed to add it. As a matter of fact, sometimes, when I look over the 1100+ feature request on the BCL team, it feels brain-dead obvious that we should do every single one of them. Our users usually have great feedback, and many of them does make it into our feature request database. However, we do not do all of them. Our users may ask... why? why not? &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Well, the main reason&amp;nbsp;is because we have limited resources. Every feature, change, bug fix&amp;nbsp;takes time, energy and effort. This is relevant in all products Microsoft ships. Back in my Outlook days, I faced the same problem. (Should we fix a bug that causes meeting to drop off on your calendar or a bug that cause reminders not to fire?) Every group in Microsoft take great care to make sure that we are using our resources most efficiently. With limited resources, we try our best to deliver the most value to our customer. This means delivering the most important, the most painful to live without feature first. That's why the &lt;A href="/bclteam/archive/2006/04/05/568540.aspx"&gt;question&lt;/A&gt; Krzysztof asked in the BCLTeam Weblog was very interesting. He didn't ask "What do you want in the BCL?", he asked "how would you spend the limited resource (fake BCL brownie points) you have?"&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Today, I learned&amp;nbsp;a second reason.&amp;nbsp;Even if we have unlimited resources, armies of testers and developers to do&amp;nbsp;these feature requests (Like this group that is willing to pony up the&amp;nbsp;PMing,&amp;nbsp;Deving,&amp;nbsp;and Testing of their&amp;nbsp;favourite feature), why in the world&amp;nbsp;would the BCL/CLR even consider not approving it?&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Sometimes, &lt;STRONG&gt;less is more&lt;/STRONG&gt;. This is particularly true when it comes to anything that interact with users. It doesn't matter if it is&amp;nbsp;the framework or the UI.&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;A framework with multiple ways of representing a string (ahem..&amp;nbsp;anyone remember those bstr, char[], wchar[], etc... ) causes confusion. When I was a developer in Outlook, every file has its own version of string. Instead of opening new doors, allowing new ways of coding, this actually slows developer productivity. Who wants to use a framework that you can't tell what to use and why? A bloated framework is unmanageable. Similarly,&amp;nbsp;a overly crowded UI is unmanageable. That's why Office has decided to design the ribbon. I am not going to go into UI design in this blog. I leave that to my friend &lt;/FONT&gt;&lt;A href="/jensenh"&gt;&lt;FONT face=Verdana size=2&gt;Jensen&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Verdana size=2&gt;, UEX PM lead (also an ex-Outlook PM), who wrote "&lt;/FONT&gt;&lt;A href="/jensenh/archive/2005/09/26/473950.aspx"&gt;&lt;FONT face=Verdana size=2&gt;Why of the New UI&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Verdana size=2&gt;" series to explain the problems of the overcrowded&amp;nbsp;UI that plagued Office users.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;What do you think? Agree? Disagree? When you design your software, have you ever decided not to put something in it because "Less is More"?&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=578030" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/kathykam/archive/tags/API+Design/default.aspx">API Design</category></item></channel></rss>