<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Claudio Sanchez</title>
    <description>The latest articles on Forem by Claudio Sanchez (@claudiosanchez).</description>
    <link>https://forem.com/claudiosanchez</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F259101%2Fd2031579-5589-41ce-a662-c4f8f151e16d.jpeg</url>
      <title>Forem: Claudio Sanchez</title>
      <link>https://forem.com/claudiosanchez</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/claudiosanchez"/>
    <language>en</language>
    <item>
      <title>The October Xamarin Best Practices Challenge</title>
      <dc:creator>Claudio Sanchez</dc:creator>
      <pubDate>Wed, 14 Aug 2019 13:50:31 +0000</pubDate>
      <link>https://forem.com/claudiosanchez/the-october-xamarin-best-practices-challenge-2bnm</link>
      <guid>https://forem.com/claudiosanchez/the-october-xamarin-best-practices-challenge-2bnm</guid>
      <description>&lt;h3&gt;
  
  
  The October Xamarin Best Practices Challenge
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kNLjK_aG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AXVBqABaVnDSouQsiafqQ8A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kNLjK_aG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AXVBqABaVnDSouQsiafqQ8A.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you may know by now, &lt;a href="https://www.thewissen.io/introducing-xamarin-ui-july/"&gt;Xamarin-related challenges&lt;/a&gt; are very popular in 2019; so why not have yet another one.&lt;/p&gt;

&lt;p&gt;This challenge would focus on &lt;strong&gt;&lt;em&gt;proven best practices&lt;/em&gt;&lt;/strong&gt; in &lt;strong&gt;all aspects&lt;/strong&gt; of creating mobile apps (DevOps, project Structure, cross-cutting concerns, data, API, Testing, App Signing, etc).&lt;/p&gt;

&lt;h3&gt;
  
  
  How does it work?
&lt;/h3&gt;

&lt;p&gt;If you are already familiar with prior challenges — like the &lt;a href="https://www.thewissen.io/introducing-xamarin-ui-july/"&gt;Xamarin UI July&lt;/a&gt; challenge from &lt;a href="https://twitter.com/devnl"&gt;Steven Thewissen&lt;/a&gt;, or the &lt;a href="https://luismts.com/blog/xamarin/xamarin-month-february-2019/"&gt;Xamarin Month&lt;/a&gt;, from &lt;a href="https://twitter.com/luismatosluna"&gt;Luis Matos&lt;/a&gt;- You would know that the challenge is in the style of an &lt;a href="https://en.wikipedia.org/wiki/Advent_calendar"&gt;advent calendar&lt;/a&gt;, where an article about a particular topic is &lt;strong&gt;posted every day,&lt;/strong&gt; by one of the amazing contributors. In this instance though, the article will be included in the Challenge &lt;a href="https://github.com/claudiosanchez/SeptemberXamarinChallenge"&gt;repo&lt;/a&gt;as a Pull Request, and if also desired a brief blog post about the topic on the contributor’s own blog. The article should be in  &lt;strong&gt;English&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What would I write about?
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://github.com/claudiosanchez/OctoberXamarinChallenge/"&gt;&lt;strong&gt;Challenge Repo&lt;/strong&gt;&lt;/a&gt; will contain a Table of Contents (ToC), with an outline of topics — you can either choose a particular topic from the &lt;strong&gt;ToC&lt;/strong&gt; or add a brand new topic if the ones listed do not cover what you want to write about.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I sign up for this?
&lt;/h3&gt;

&lt;p&gt;As the challenges before, we would need at least 30 writers — one for each day- but we will certainly welcome additional contributions. Follow the steps below:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reserve a spot&lt;/strong&gt; by submitting a creating an issue on the repo. Once reviewed, we will update the Table of Content with your topic, as well as updating the &lt;strong&gt;Calendar&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kNLjK_aG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AXVBqABaVnDSouQsiafqQ8A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kNLjK_aG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AXVBqABaVnDSouQsiafqQ8A.png" alt=""&gt;&lt;/a&gt;The article proposed by James Montemagno&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Submit a Pull Request.&lt;/strong&gt; Write the article in a markdown file inside of the &lt;a href="https://github.com/claudiosanchez/SeptemberXamarinChallenge"&gt;&lt;strong&gt;challenge repo&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Publish your blog post&lt;/strong&gt; linking back to the original article and your contribution in the repo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Post the links on Twitter&lt;/strong&gt; with the hashtag #XamarinChallenge.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  What happens next?
&lt;/h3&gt;

&lt;p&gt;Similar to past challenges, we will have a special event shortly after the month of October to talk about all of the contributions. Stay tuned.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Calendar
&lt;/h3&gt;

&lt;p&gt;Check out the &lt;a href="https://github.com/claudiosanchez/SeptemberXamarinChallenge/blob/master/README.MD"&gt;README.MD&lt;/a&gt; File for an Up-to-date Calendar.&lt;/p&gt;

</description>
      <category>mobileapps</category>
      <category>xamarin</category>
      <category>challenge</category>
      <category>bestpractices</category>
    </item>
    <item>
      <title>Instantly releasing features in a world that never sleeps, using Feature Flags</title>
      <dc:creator>Claudio Sanchez</dc:creator>
      <pubDate>Thu, 14 Feb 2019 14:24:09 +0000</pubDate>
      <link>https://forem.com/claudiosanchez/instantly-releasing-features-in-a-world-that-never-sleeps-using-feature-flags-2m6m</link>
      <guid>https://forem.com/claudiosanchez/instantly-releasing-features-in-a-world-that-never-sleeps-using-feature-flags-2m6m</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U69z9Rdx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/proxy/1%2AHROSl2j8Ib7keDGF6_8PTQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U69z9Rdx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/proxy/1%2AHROSl2j8Ib7keDGF6_8PTQ.jpeg" alt="Related image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now more than ever, businesses need to be nimble and continue to ship features at the speed of light™. This is even more true in the very competitive world of mobile apps.&lt;/p&gt;

&lt;p&gt;Long gone are the days where we could wait several months to release a new version of our app.&lt;/p&gt;

&lt;p&gt;These days, customers expect from your mobile app the same nimbleness as their Facebook app, Banking app or Dating app. And if you are not willing to do it, the competition will.&lt;/p&gt;

&lt;p&gt;As you might know (hopefully thru the pain of others), it is very risky to roll out a faulty feature, as, in the world of the App Store, a new release could take between &lt;a href="https://developer.apple.com/app-store/review/"&gt;1 and 2 days to be approved&lt;/a&gt;, and this could make your customer’s confidence in your product be lost forever.&lt;/p&gt;

&lt;p&gt;So, how can we serve both masters? the ever insatiable desirer of new features, while still serving the Lord of Always-Works-Never-Roll-Back?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://martinfowler.com/articles/feature-toggles.html"&gt;Feature Flags&lt;/a&gt;, my friend! They are the stuff dreams are made out of.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“With Feature Flags, you can launch brand new features and experiences in real-time. You don’t have to go all in with every feature in every release, which removes a lot of risk and enables you to instantly roll back if the feature needs more work.”&lt;/p&gt;

&lt;p&gt;– Nancy Hua, CEO, Apptimize.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So now, let’s talk about how to do Feature Flag as a Service, by utilizing &lt;a href="https://launchdarkly.com/"&gt;LaunchDarkly&lt;/a&gt; to make instant releases of features within our Xamarin Mobile app.&lt;/p&gt;

&lt;p&gt;Let’s say, our Mobile Banking App team is rolling out a very innovative feature, called &lt;strong&gt;Spending Analysis&lt;/strong&gt;. This feature tracks expenses and income over time and tells the customer how much money they have leftover to spend. Now, our Data Science Department is still tweaking the algorithm, so they want to make sure that the feature can be rolled out to just a subset of their customers, and eventually to the entire consumer base.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YPQ07HXa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AMWFRlEe13Ih56FJt0faq8A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YPQ07HXa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AMWFRlEe13Ih56FJt0faq8A.png" alt=""&gt;&lt;/a&gt;This is what the final result should look like once we turn on the feature.&lt;/p&gt;

&lt;p&gt;The LaunchDarkly website has a very simple sign up process and &lt;a href="https://app.launchdarkly.com/signup"&gt;onboarding&lt;/a&gt;. It took us about 20 seconds to do so, and we were in. The site gives you the choice of doing a Quickstart, or to skip straight the dashboard; We chose the later.&lt;/p&gt;

&lt;p&gt;Creating a feature flag for our mobile app was simple. We gave it a name and key. We also selected a &lt;strong&gt;Boolean&lt;/strong&gt; as the kind of flag. Lastly, we checked the box says &lt;em&gt;Make this flag available to client-side SDKs,&lt;/em&gt; in order for the flag to be provided to our mobile app later on.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rC1T4acM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AHxBJ6DNcBD7jwiPxC7tzgQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rC1T4acM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AHxBJ6DNcBD7jwiPxC7tzgQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After having created a few feature flags, we are almost in business.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ugYkwM22--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AqCaQAlhw2xcsQY2ukeM6-A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ugYkwM22--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AqCaQAlhw2xcsQY2ukeM6-A.png" alt=""&gt;&lt;/a&gt;LaunchDarkly Dashboard&lt;/p&gt;

&lt;p&gt;We then moved over to the client side of the story and implemented the Spending Analysis, and placed on the Main Page of the Mobile App.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RMxj57rH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/752/1%2AxYLJ_Z6bWQci4bb4iKwCug.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RMxj57rH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/752/1%2AxYLJ_Z6bWQci4bb4iKwCug.png" alt=""&gt;&lt;/a&gt;Spending Analysis Widget&lt;/p&gt;

&lt;p&gt;Let’s add LaunchDarkly Xamarin SDK to our project, by including the &lt;a href="https://github.com/launchdarkly/xamarin-client"&gt;LaunchDarkly.Xamarin&lt;/a&gt; NuGet package to your .NET Standard project. &lt;strong&gt;&lt;em&gt;At the time of writing&lt;/em&gt;&lt;/strong&gt; , the NuGet package is still in &lt;strong&gt;pre-release&lt;/strong&gt; , version 1.0.0-beta9. There is also a more mature .NET client, but since we like to live on the edge, let’s stick to the Beta.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5oz_CZYM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ASFBTevUgZ9xoH7ep5nRF9g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5oz_CZYM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ASFBTevUgZ9xoH7ep5nRF9g.png" alt=""&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Install-Package LaunchDarkly.Xamarin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;At some convenient time, during your app initialization sequence, you would want to initialize the LaunchDarkly client.&lt;/p&gt;

&lt;p&gt;By now, you should be familiar with the paradigm these mobile SDKs have. You create a project, that gives us some sort of &lt;em&gt;key&lt;/em&gt;, to be used as a form of authentication. We have stored this in a field called MOBILE_KEY_TEST.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;After you have initialized the LaunchDarkly client, it will by default, communicate with the LaunchDarkly cloud and &lt;strong&gt;download&lt;/strong&gt; all of the feature flag information. This includes a list of the feature flags and their state.&lt;/p&gt;

&lt;p&gt;Each feature flag has a unique &lt;strong&gt;name/key.&lt;/strong&gt; Our new feature will be using the key &lt;strong&gt;&lt;em&gt;can-see-spending-analysis.&lt;/em&gt;&lt;/strong&gt; I have placed my keys in a convenient static class for ease of access.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Checking if a feature flag is on or off, is pretty straightforward. From our &lt;em&gt;MainPage&lt;/em&gt; ViewModel, we are calling a Service we implemented to abide by the &lt;a href="https://deviq.com/separation-of-concerns/"&gt;Separation of Concerns and Single Responsibility principles&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The ViewModel calls the &lt;em&gt;Can()&lt;/em&gt; method of the &lt;em&gt;FeatureFlagService&lt;/em&gt;, to check on whether or not it should display the &lt;em&gt;Spending Analysis&lt;/em&gt; widget.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;At this point, the Spending Analysis widget is present in our app. We deploy the new version of it, and we notice that the &lt;em&gt;Spending Analysis&lt;/em&gt; feature does not appear! — Do not despair, that should come as no surprise, as we &lt;strong&gt;have not turned on the feature flag ON yet.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TEnD_Ayt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2APptvsLDDVSKR4TJePq43qA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TEnD_Ayt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2APptvsLDDVSKR4TJePq43qA.png" alt=""&gt;&lt;/a&gt;The new feature is present in the code but is disabled via Feature Flags.&lt;/p&gt;

&lt;p&gt;At this point, the person in charge of turning on features for our App can simply access the LaunchDarkly Dashboard and turn the feature ON.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TbftOzk5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A8fKvMQvNWkvefEVFA4ArDA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TbftOzk5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A8fKvMQvNWkvefEVFA4ArDA.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A Voila! The feature is ON!!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LdxGoGUt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ATMULv2UnxtTt05Rhw0qi6A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LdxGoGUt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ATMULv2UnxtTt05Rhw0qi6A.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>xamarinforms</category>
      <category>xamarin</category>
      <category>featureflags</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Microsoft Build 2018 Recap talk at NYC Mobile .NET Developers User Group</title>
      <dc:creator>Claudio Sanchez</dc:creator>
      <pubDate>Fri, 18 May 2018 18:35:50 +0000</pubDate>
      <link>https://forem.com/claudiosanchez/microsoft-build-2018-recap-talk-at-nyc-mobile-net-developers-user-group-2842</link>
      <guid>https://forem.com/claudiosanchez/microsoft-build-2018-recap-talk-at-nyc-mobile-net-developers-user-group-2842</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gqosbTmw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2A51NNBW2vxpRgAtU8." class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gqosbTmw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2A51NNBW2vxpRgAtU8." alt=""&gt;&lt;/a&gt;Microsoft Build @ Seattle, WA. May 7–9&lt;/p&gt;

&lt;p&gt;Last week, I got to co-deliver an interesting talk (with &lt;a href="https://twitter.com/eowyn327?lang=en"&gt;Sara Morsi&lt;/a&gt; as co-speaker) at the &lt;a href="https://www.meetup.com/nycmobiledev"&gt;NYC Mobile .NET Developers User Group&lt;/a&gt;. We curated a selection of topics, from our recent experience at &lt;a href="https://www.microsoft.com/en-us/build"&gt;Microsoft Build&lt;/a&gt;, this past May 7–9, in Seattle, WA.&lt;/p&gt;

&lt;p&gt;Some of the topics at Build we found most relevant for Xamarin Developers include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hyper-V Android Emulator Support
&lt;/li&gt;
&lt;li&gt;Visual Studio Tools for Xamarin
&lt;/li&gt;
&lt;li&gt;Platform Improvements
&lt;/li&gt;
&lt;li&gt;Xamarin Forms 3.0
&lt;/li&gt;
&lt;li&gt;Fluent Design for UWP
&lt;/li&gt;
&lt;li&gt;Visual Studio Live Share
… and much more …&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Follow this link to the &lt;a href="https://megsoftconsulting.com/download/microsoft-build-2018-recap-for-mobile-developers/"&gt;presentation&lt;/a&gt;, as well as the &lt;a href="https://www.meetup.com/nycmobiledev/events/249062226/"&gt;meetup&lt;/a&gt; notes.&lt;/p&gt;

</description>
      <category>microsoftbuild</category>
      <category>visualstudiolives</category>
      <category>xamarin</category>
      <category>visualstudioforma</category>
    </item>
    <item>
      <title>A Pull Request that will make people smile</title>
      <dc:creator>Claudio Sanchez</dc:creator>
      <pubDate>Wed, 31 May 2017 15:33:48 +0000</pubDate>
      <link>https://forem.com/claudiosanchez/a-pull-request-that-will-make-people-smile-5f21</link>
      <guid>https://forem.com/claudiosanchez/a-pull-request-that-will-make-people-smile-5f21</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AkqGRUPF2xmedbs0uE9NKTw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AkqGRUPF2xmedbs0uE9NKTw.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have been working in a software team using any type of &lt;a href="https://www.atlassian.com/git/tutorials/comparing-workflows" rel="noopener noreferrer"&gt;git workflow&lt;/a&gt;, I bet you are familiar with the concept of &lt;a href="https://www.atlassian.com/git/tutorials/making-a-pull-request" rel="noopener noreferrer"&gt;Pull Requests&lt;/a&gt;. This article does not intent to school you on the mechanics of creating it, but rather on the art of what constitutes a Pull Request that brings smiles to reviewers and collaborators alike.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Title
&lt;/h4&gt;

&lt;p&gt;Here is your opportunity to let the reviewer know what your Pull Request (PR) is all about. Do go beyond just including the issue number; try to reflect the main point of the pull request. Don’t assume the reviewer will know, just based on the issue number.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples of Pull Request titles:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;BOS-8869 Introduced Social Login with Facebook, Google and Twitter.&lt;/li&gt;
&lt;li&gt;MYAPP-0007 Fixed Crash bug when adding item to Calendar in iOS.&lt;/li&gt;
&lt;li&gt;API-1020 Introduced Coach Marks for Filtering.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  The Description
&lt;/h4&gt;

&lt;p&gt;Putting together a useful description will significantly help the reviewer understand your changes. Specially if you changed many files, or the change is not trivial. Take the time to craft a detailed description, since you are in the best position to justify your approach/the functionality it provides; after all, you wrote it.&lt;/p&gt;

&lt;p&gt;The description field of the Pull Request typically supports some type of markup (i.e.: &lt;strong&gt;MarkDown&lt;/strong&gt; ). Just like you would for a well crafted essay, do make use of all of the formatting you have at your disposal to express the ideas in a clear manner.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples of Descriptions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added Sorting capabilities: sorting can be done by Category (ascending and descending), by Date Published (Newest and Oldest), and by Amount (Ascending and descending).&lt;/li&gt;
&lt;li&gt;Changed implementation of the GetClubDetails method to process the request asynchronously. The return type is now Task&amp;lt;ClubDetail&amp;gt; and the method name GetClubDetailsAsync to follow the convention.&lt;/li&gt;
&lt;li&gt;Modified the FilterOptionsService to sort options alphabetically.&lt;/li&gt;
&lt;li&gt;Used the new Location API deployed to Azure and had to change Proxy, Service and Data Transfer Object associated with the Location Screen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bonus Points:&lt;/strong&gt; Calling out the acceptance criteria of the story, will make it apparent what your change is introducing. Also, call out functionality is &lt;strong&gt;not&lt;/strong&gt; included, in the case where a functionality has been split in several stories.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Screenshots
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;“A&lt;/em&gt;&lt;/strong&gt;  &lt;strong&gt;&lt;em&gt;picture is worth a thousand words”&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;.&lt;/em&gt; This could not be more true when it comes to pull requests.&lt;/p&gt;

&lt;p&gt;If the change involves any UI change, always include a representation of &lt;strong&gt;before&lt;/strong&gt; and &lt;strong&gt;after.&lt;/strong&gt; This saves the reviewer lots of time, and provides clear guidance of what to expect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some tips when including screenshots:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resize the image to manageable size. The intent is to provide context of what changed, not to fill the screen with larger than life images.&lt;/li&gt;
&lt;li&gt;Highlight areas of the UI that are expected to change. Specially if the UI is too busy, and the change cannot be spotted easily.&lt;/li&gt;
&lt;li&gt;When useful, insert the images into a Table, for the purpose of contrasting the images side to side.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the end, these are all tips that assist the reviewer in understanding the context of your change, and thus making the review process something that brings a smile to one’s face.&lt;/p&gt;

&lt;h4&gt;
  
  
  Sample Pull Request
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Title:&lt;/strong&gt; FITNESS-1039 Add Health Club Class List screen with loading state and booking capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The new Class ListScreen provides a list of available classes for the &lt;strong&gt;&lt;em&gt;selected&lt;/em&gt;&lt;/strong&gt; Health Club.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The user sees a loading state while the screen is loading the data from the web.&lt;/li&gt;
&lt;li&gt;The user has the ability to book an available class by tapping on the &lt;strong&gt;&lt;em&gt;Book&lt;/em&gt;&lt;/strong&gt;  button.&lt;/li&gt;
&lt;li&gt;The user can cancel/reserve a booking, by tapping on the &lt;strong&gt;&lt;em&gt;Booked&lt;/em&gt;&lt;/strong&gt; button, for an already booked class.&lt;/li&gt;
&lt;li&gt;Filtering is &lt;strong&gt;not implemented.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AAxZhQvma0e63VW3-iAT2Ng.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AAxZhQvma0e63VW3-iAT2Ng.png"&gt;&lt;/a&gt;Screenshots providing a visual aid for the multiple states of the screen.&lt;/p&gt;

</description>
      <category>pullrequest</category>
      <category>softwarecraftsmansh</category>
      <category>bestpractices</category>
      <category>codereview</category>
    </item>
    <item>
      <title>What Xamarin 3 means to the future of Mobile Development</title>
      <dc:creator>Claudio Sanchez</dc:creator>
      <pubDate>Wed, 17 May 2017 14:28:00 +0000</pubDate>
      <link>https://forem.com/claudiosanchez/what-xamarin-3-means-to-the-future-of-mobile-development-13p9</link>
      <guid>https://forem.com/claudiosanchez/what-xamarin-3-means-to-the-future-of-mobile-development-13p9</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xNdB69yr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/920/0%2ArwWK2k2t0XuIcmHr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xNdB69yr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/920/0%2ArwWK2k2t0XuIcmHr.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It was just a few hours ago that &lt;a href="http://xamarin.com/"&gt;Xamarin&lt;/a&gt; released &lt;a href="http://blog.xamarin.com/announcing-xamarin-3/"&gt;Xamarin 3.&lt;/a&gt;With this announcement they have yet again revolutionized the way we write cross-platform mobile applications. The announcement first highlights the Designer for iOS, which is awesome, but I want to take a step forward, and instead talk about what I think Xamarin.Forms will do for your future mobile development efforts.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Some background&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;For the last few months &lt;a href="http://megsoftconsulting.com/"&gt;my company&lt;/a&gt;worked and developed an internal MVVM framework that provides services such as Navigation, Bindings, Loosely-coupled messaging, mobile optimized Dependency Injection, List Controls for effortless displaying data, etc. to be used in our projects because we believe these are things that real apps need, and what was available at the time did not fit our style of MVVM development, so we rolled our own. Were were in the process of rolling out support for Windows Phone and were very excited to what we would be able to accomplish with this newly created framework when creating apps for all 3 platforms.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the future holds
&lt;/h3&gt;

&lt;p&gt;While you might think that today’s announcement would be annoying, or bittersweet for us, it is quite the contrary. We no longer have to maintain and evolve our framework, and instead we can focus on applying all we learned while creating this -yet to be named- framework, and instead extend (if needed) what Xamarin has just rolled out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OttDDLfU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/0%2Ap8whiBUWd1uuTDYo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OttDDLfU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/0%2Ap8whiBUWd1uuTDYo.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sample UI on all 3 Platforms. One of the immediate advantages of Xamarin.Forms over other frameworks (including our own) is that these services work on not only on the two (iOS and Android) but 3 mobile platforms (Windows Phone), and it promises the ability to achieve the quintessential 100% Code sharing.&lt;/p&gt;

&lt;p&gt;“That’s not something new” — You might say; and I would have to agree with you. &lt;a href="https://github.com/MvvmCross/MvvmCross"&gt;MVVMCross&lt;/a&gt;(the most well known mvvm framework in the Xamarin ecosystem) does that. But where Xamarin.Forms has no comparison is, in that it attempts (and in my mind succeeds) to bring XAML one step closer to being in all the mobile platforms (&lt;a href="http://channel9.msdn.com/Events/Build/2014/3-591"&gt;Something Microsoft just recently started doing&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;XAML in itself is might not sound like a big win for seasoned iOS and Android developers, but think for a moment in the millions of developers who are already familiar with Microsoft technologies and UI creating in WPF, Silverlight and WP8. These guys already are already familiar with constructs such as Page Based UIs, Navigation Services, Two-way Bindings, Data Templates, etc.&lt;/p&gt;

&lt;p&gt;I invite you not just to believe me, and go try it yourself. The framework is already available &lt;a href="http://xamarin.com/download"&gt;today&lt;/a&gt; and let me know how awesome it is!!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at&lt;/em&gt; &lt;a href="http://claudioasanchez.blogspot.com/2014/05/what-xamarin-3-means-to-future-of.html"&gt;&lt;em&gt;claudioasanchez.blogspot.com&lt;/em&gt;&lt;/a&gt; &lt;em&gt;on May 28, 2014.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mobileappdevelopment</category>
      <category>xamarin</category>
      <category>xamarinforms</category>
      <category>historical</category>
    </item>
  </channel>
</rss>
