{"id":1384,"date":"2013-08-28T09:00:00","date_gmt":"2013-08-28T09:00:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/webdev\/2013\/08\/28\/introducing-nuget-concierge\/"},"modified":"2022-08-09T05:50:54","modified_gmt":"2022-08-09T12:50:54","slug":"introducing-nuget-concierge","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/dotnet\/introducing-nuget-concierge\/","title":{"rendered":"Introducing NuGet Concierge"},"content":{"rendered":"<p>Twelve weeks ago, the Azure Applications Platform &amp; Tools team welcomed us, three college sophomores, Jaspreet Bagga, Jeremiah Jekich, and Melissa McNeill, to Microsoft.<\/p>\n<p>As <a href=\"http:\/\/careers.microsoft.com\/careers\/en\/us\/internships-explore-microsoft.aspx\">Explorer Interns<\/a>, we were given the opportunity to experience the three primary disciplines here at Microsoft: Program Manager, Software Development Engineer, and Software Development Engineer in Test. Rotating positions throughout the course of development, we were able to experience what life is like working in the developer tools division. We were given the opportunity to contribute to one of Visual Studio\u2019s great tools, the <a href=\"http:\/\/www.nuget.org\/\">NuGet<\/a> package manager.<\/p>\n<h2>Package Discovery<\/h2>\n<p>For developers, discovering NuGet packages can be a daunting process. The best way to do so is either via word of mouth or online search. However, your friends aren\u2019t always available when you\u2019re looking for a new package at 3:00 in the morning. You could try to search online, but you\u2019d need to spend unnecessary amounts of time sifting through the results before finding a package that may be helpful. We recognize that this time is better spent actually developing software. We wanted to create an accessible service to deliver package recommendations using real world data about how developers use packages.<\/p>\n<p><img decoding=\"async\" title=\"clip_image002\" style=\"border: 0px currentcolor;margin-right: auto;margin-left: auto;float: none\" border=\"0\" alt=\"clip_image002\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2013\/08\/5516.clip_image002_42830F82.png\" width=\"403\" height=\"329\" \/><\/p>\n<h2>NuGet Concierge<\/h2>\n<p>Thus was born <a href=\"http:\/\/concierge.nuget.org\/\">NuGet Concierge<\/a>, a package recommendation service that recommends packages to developers based on the packages currently being used in their project. We envisioned developers being able to upload their project\u2019s packages.config file to the NuGet Concierge website, which would then present them with a list of packages they may find useful. Something along the lines of \u201cMost projects that use Package A also use Package B.\u201d<\/p>\n<p>So, at the beginning of the summer, we put out a call to the community via Twitter, asking for developers to upload their projects\u2019 packages.config files to help seed our newly conceived recommendation service. We asked, and you delivered! Armed with a collection of over 350 packages.config files, we set to work bringing NuGet Concierge to life.<\/p>\n<h2>Implementation<\/h2>\n<p>The first step was to translate the collected .config files into a structure that would allow us to analyze the relationships between packages. How often are individual packages used? But, more importantly, how are packages used together?<\/p>\n<p>So, we took the community\u2019s .config files and parsed them, using them to construct a graph. In doing so, we tracked the number of times a package was used, a value we referred to as the package\u2019s \u201cpopularity.\u201d We also tracked how many times two packages were used together, which we referred to as the packages\u2019 \u201cpairing frequency.\u201d<\/p>\n<h2>Determining Relationships<\/h2>\n<p>Let\u2019s say we have two packages, EntityFramework and jQuery. By looking at our graph, we know the popularity of EntityFramework and the popularity of jQuery, as well as the pairing frequency between the two. In order to determine the strength of EntityFramework\u2019s relationship with jQuery, we take the pairing frequency between the two and divide it by the popularity of EntityFramework. This gives us the percentage of time EntityFramework is used with jQuery. If we want to know how strongly jQuery is associated with EntityFramework, we simply take the pairing frequency and divide it by the popularity of jQuery.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2013\/08\/4034.clip_image004_thumb_3DA05BC6.jpg\"><img decoding=\"async\" title=\"clip_image004\" style=\"border: 0px currentcolor;margin-right: auto;margin-left: auto;float: none\" border=\"0\" alt=\"clip_image004\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2013\/08\/4034.clip_image004_thumb_3DA05BC6.jpg\" width=\"479\" height=\"305\" \/><\/a><\/p>\n<h2>Making Recommendations<\/h2>\n<p>Suppose a developer has a packages.config file that contains knockoutjs. In order to make recommendations, we look at all packages used with knockoutjs that are not currently in use in the developer\u2019s project. In this case, let\u2019s say knockoutjs is associated with Newtonsoft.Json and Modernizr at association strengths of 91% and 87% respectively. We would recommend Newtonsoft.Json first, followed by Modernizr.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2013\/08\/1803.clip_image006_thumb_2B579504.jpg\"><img decoding=\"async\" title=\"clip_image006\" style=\"border: 0px currentcolor;margin-right: auto;margin-left: auto;float: none\" border=\"0\" alt=\"clip_image006\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2013\/08\/1803.clip_image006_thumb_2B579504.jpg\" width=\"204\" height=\"252\" \/><\/a><\/p>\n<p>With NuGet Concierge, we made every effort to enable improvements over time. When users upload their packages.config file, we present them with the option to contribute their file to the NuGet Concierge dataset. This increases the pool of .config files from which we generate our graph. This means that our recommendations become more accurate the more NuGet Concierge is used.<\/p>\n<p>Additionally once users are presented with recommendations, they have the option to \u201cLike\u201d or \u201cDislike\u201d each recommendation by giving it a thumbs up or a thumbs down. This information gets stored and allows us to analyze the usefulness of the recommendations we are making. If we find some packages are being recommended at a high association strength, but most users deem them unhelpful, we can adjust the system to recommend the packages at more appropriate strengths. Likewise, we can give a strength boost to packages recommended at low association strengths but deemed helpful by the community.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2013\/08\/3301.clip_image008_thumb_26E1143D.jpg\"><img decoding=\"async\" title=\"clip_image008\" style=\"border: 0px currentcolor;margin-right: auto;margin-left: auto;float: none\" border=\"0\" alt=\"clip_image008\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2013\/08\/3301.clip_image008_thumb_26E1143D.jpg\" width=\"624\" height=\"190\" \/><\/a><\/p>\n<h2>NuGet Concierge\u2019s Potential<\/h2>\n<p>When looking to the future, we see NuGet Concierge as a fully integrated part of NuGet, having a presence in the Gallery, Visual Studio\u2019s Manage NuGet Packages dialog, and the Package Manager Console. The greatest part of NuGet Concierge is the data powering it. The ability to reference real data about how packages are actively used together opens up a world of opportunities that can potentially help NuGet better serve developers.<\/p>\n<h2>Exploring Microsoft and NuGet<\/h2>\n<p>As Explorer Interns, we are proud to be able to say we helped pioneer a new feature of NuGet. Though NuGet Concierge is in its infancy, it is a service that can be utilized today. In line with the rest of NuGet, it is an <a href=\"https:\/\/github.com\/nuget\/\">open source<\/a> project that can be contributed to by members of the community. The three of us have grown a lot as developers over the past three months, and it will be fun to watch NuGet Concierge grow as we continue with our education.<\/p>\n<p>When we first arrived, we had no experience developing with web technologies or building developer tools. We have been repeatedly amazed by the breadth of technologies used in the web space, and it has been an honor to contribute to a team that helps improve developer experiences.<\/p>\n<p>The Explore Microsoft Program and the Azure Applications Platform &amp; Tools team provided us with an amazing opportunity to learn from the best and it was an invaluable experience that has inspired us to continue pursuing a future in technology and software development.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Twelve weeks ago, the Azure Applications Platform &amp; Tools team welcomed us, three college sophomores, Jaspreet Bagga, Jeremiah Jekich, and Melissa McNeill, to Microsoft. As Explorer Interns, we were given the opportunity to experience the three primary disciplines here at Microsoft: Program Manager, Software Development Engineer, and Software Development Engineer in Test. Rotating positions throughout [&hellip;]<\/p>\n","protected":false},"author":398,"featured_media":58792,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[197],"tags":[104],"class_list":["post-1384","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aspnet","tag-nuget"],"acf":[],"blog_post_summary":"<p>Twelve weeks ago, the Azure Applications Platform &amp; Tools team welcomed us, three college sophomores, Jaspreet Bagga, Jeremiah Jekich, and Melissa McNeill, to Microsoft. As Explorer Interns, we were given the opportunity to experience the three primary disciplines here at Microsoft: Program Manager, Software Development Engineer, and Software Development Engineer in Test. Rotating positions throughout [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts\/1384","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/users\/398"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/comments?post=1384"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts\/1384\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/media\/58792"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/media?parent=1384"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/categories?post=1384"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/tags?post=1384"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}