<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>2017-03 on Funky Si's Blog (Dev)</title><link>https://blog-dev.funkysi1701.com/2017/03/</link><description>Recent content in 2017-03 on Funky Si's Blog (Dev)</description><generator>Hugo -- gohugo.io</generator><language>en-gb</language><managingEditor>funkysi1701@gmail.com (Simon Foster)</managingEditor><webMaster>funkysi1701@gmail.com (Simon Foster)</webMaster><lastBuildDate>Mon, 27 Mar 2017 20:00:45 +0000</lastBuildDate><atom:link href="https://blog-dev.funkysi1701.com/2017/03/index.xml" rel="self" type="application/rss+xml"/><item><title>Interfaces</title><link>https://blog-dev.funkysi1701.com/posts/2017/interfaces/</link><author>funkysi1701@gmail.com (funkysi1701)</author><pubDate>Mon, 27 Mar 2017 20:00:45 +0000</pubDate><guid>https://blog-dev.funkysi1701.com/posts/2017/interfaces/</guid><category term="C-Sharp">C-Sharp</category><category term="Interface">Interface</category><description>&lt;p&gt;I am trying to understand interfaces and when to use them in my code.&lt;/p&gt;
&lt;p&gt;An interface defines a contract and any class that implements that interface agrees to fulfil that contract.&lt;/p&gt;
&lt;p&gt;Lets look at an example as this tends to be how I learn best.&lt;/p&gt;
&lt;p&gt;Most applications require some sort of data to work from so lets start by defining IData which can load data.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;IData&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Blog LoadData(&lt;span style="color:#66d9ef"&gt;string&lt;/span&gt; Connectionstring);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;My interface defines one method LoadData and outputs an object called Blog (I will explain why in a minute)&lt;/p&gt;
&lt;p&gt;A common data source is a SQL database so we could define a SQL class that implements IData.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SQL&lt;/span&gt; : IData
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; Blog LoadData(&lt;span style="color:#66d9ef"&gt;string&lt;/span&gt; Connectionstring)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Blog blog = &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Blog();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; (SqlConnection con = &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; SqlConnection(Connectionstring))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; con.Open();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//etc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We could also get data from an RSS feed of a blog (hence why I called the object Blog earlier)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;XML&lt;/span&gt; : IData
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; Blog LoadData(&lt;span style="color:#66d9ef"&gt;string&lt;/span&gt; Connectionstring)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; XmlDocument myXmlDocument = &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; XmlDocument();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; myXmlDocument.Load(Connectionstring);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Blog blog = &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Blog();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;foreach&lt;/span&gt; (XmlNode RootNode &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; myXmlDocument.ChildNodes)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//etc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Both classes implement IData and have a method called LoadData which has a string parameter and outputs a blog object. The string parameter is either a connection string to a SQL database or the URL of the rss feed. Not sure if there is a better way of doing this bit, maybe the name of the string needs making more generic.&lt;/p&gt;
&lt;p&gt;Now we have some classes that implement an interface what can we do with them. Lets write a class called GetData which gets data but doesn’t care if it comes form the rss feed or a SQL database.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;GetData&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; IData _repo;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; GetData(IData repo)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _repo = repo;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; Blog LoadData(&lt;span style="color:#66d9ef"&gt;string&lt;/span&gt; Connectionstring)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; original = _repo.LoadData(Connectionstring);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; original;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When we call GetData we can either pass in XML or SQL as the class is not tied to either implementation. We could even write other classes that implement IData for testing purposes.&lt;/p&gt;
&lt;p&gt;My full code can be found on &lt;a href="https://github.com/funkysi1701/InterfaceExample" target="_blank" rel="noopener noreferrer"&gt;github&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;The advantages of writing code in this way include code that is easier to extend, easier to test and easier to maintain. This is only the start of my understanding and I am sure this is going to be a topic I come back to in the next few weeks.&lt;/p&gt;</description></item><item><title>SOLID and other programming terms</title><link>https://blog-dev.funkysi1701.com/posts/2017/solid-programming-terms/</link><author>funkysi1701@gmail.com (funkysi1701)</author><pubDate>Mon, 20 Mar 2017 20:00:45 +0000</pubDate><guid>https://blog-dev.funkysi1701.com/posts/2017/solid-programming-terms/</guid><category term="DesignPatterns">DesignPatterns</category><category term="DRY">DRY</category><category term="MVC">MVC</category><category term="SOLID">SOLID</category><description>&lt;p&gt;This week I have been looking at improving my understanding of a few programming terms, like SOLID and I will try and define them so I can look back here when I get confused.&lt;/p&gt;
&lt;h2 id="mvc"&gt;MVC&lt;a class="anchor ms-1" href="#mvc" aria-label="Permalink: MVC"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I have previously blogged about &lt;a href="https://www.funkysi1701.com/posts/2016/model-view-controller-mvc/" target="_blank" rel="noopener noreferrer"&gt;MVC&lt;/a&gt;
, but my understanding was not 100% correct so I will refine this here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Model&lt;/strong&gt; – Now this is where my understanding was not quite correct. I thought the model was the actual source data, eg an XML file, SQL database etc. The model is the business logic so this is a processed version of the source data. MVC does not care where data is stored it can be flat files, SQL, XML or anything really.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;View&lt;/strong&gt; – This displays data to the user and typically is the HTML/CSS markup. Only display related logic would get included in the view.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Controller&lt;/strong&gt; – This is another place I had got a bit confused. I had thought all the logic lived here. This is incorrect controllers are only concerned with getting data between Model and View.&lt;/p&gt;
&lt;h2 id="solid"&gt;SOLID&lt;a class="anchor ms-1" href="#solid" aria-label="Permalink: SOLID"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;SOLID are five principles of object oriented programming and design.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;S&lt;/strong&gt; is for Single Responsibility Principle. A class or piece of code should be responsible for doing one thing.&lt;/p&gt;
&lt;p&gt;
&lt;img class="img-fluid" alt="Diagram illustrating the Single Responsibility Principle" src="https://blog-dev.funkysi1701.com/images/2017/SingleResponsibilityPrinciple2_71060858.jpg" loading="lazy"
width="750" height="600"
/&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O&lt;/strong&gt; is for Open/Closed Principle. Code should be open for extensions but closed for modifications. Often this refers to the way you can implement an interface and add extra functionality.&lt;/p&gt;
&lt;p&gt;
&lt;img class="img-fluid" alt="Diagram illustrating the Open/Closed Principle" src="https://blog-dev.funkysi1701.com/images/2017/ocp.jpg" loading="lazy"
width="640" height="513"
/&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L&lt;/strong&gt; is for Liskov Substitution Principle. Objects in a program can be replaced with subtypes of that object with out changing functionality.&lt;/p&gt;
&lt;p&gt;
&lt;img class="img-fluid" alt="Diagram illustrating the Liskov Substitution Principle" src="https://blog-dev.funkysi1701.com/images/2017/LiskovSubtitutionPrinciple_52BB5162.jpg" loading="lazy"
width="750" height="600"
/&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I&lt;/strong&gt; is for Interface Segregation Principle. Large interfaces should be split down into small interfaces so that clients only know about methods that are of interest.&lt;/p&gt;
&lt;p&gt;
&lt;img class="img-fluid" alt="Diagram illustrating the Interface Segregation Principle" src="https://blog-dev.funkysi1701.com/images/2017/isp.jpg" loading="lazy"
width="640" height="513"
/&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;D&lt;/strong&gt; is for Dependency Inversion Principle. High and Low level modules should depend on abstractions.&lt;/p&gt;
&lt;p&gt;
&lt;img class="img-fluid" alt="Diagram illustrating the Dependency Inversion Principle" src="https://blog-dev.funkysi1701.com/images/2017/dip.jpg" loading="lazy"
width="640" height="513"
/&gt;
&lt;/p&gt;
&lt;p&gt;I need to look into SOLID some more but here are some &lt;a href="https://www.codeproject.com/Articles/703634/SOLID-architecture-principles-using-simple-Csharp" target="_blank" rel="noopener noreferrer"&gt;examples&lt;/a&gt;
.&lt;/p&gt;
&lt;h2 id="dry"&gt;DRY&lt;a class="anchor ms-1" href="#dry" aria-label="Permalink: DRY"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;DRY is simply Don’t Repeat Yourself. It is often easy to spot when a function call will help you not have to use the same bit of code in different places. I am often spotting places where I can put this into action.&lt;/p&gt;</description></item><item><title>Test Driven Development or TDD</title><link>https://blog-dev.funkysi1701.com/posts/2017/test-driven-development-tdd/</link><author>funkysi1701@gmail.com (funkysi1701)</author><pubDate>Mon, 13 Mar 2017 20:00:45 +0000</pubDate><guid>https://blog-dev.funkysi1701.com/posts/2017/test-driven-development-tdd/</guid><category term="TestDrivenDevelopment">TestDrivenDevelopment</category><category term="Testing">Testing</category><category term="VisualStudio">VisualStudio</category><media:content medium="image" type="image/gif" url="https://blog-dev.funkysi1701.com/images/2017/03/tdd_flow.gif"/><description>&lt;p&gt;A few weeks back I attended a talk at &lt;a href="https://www.agileyorkshire.org/event-announcements/tuesfebruary21st-drolivershawtestdrivendevelopmentthemostmisusedterminsoftwaredevelopmentandkeithwilliamsdependenciesinjectionandabstractionforfunandprofit" target="_blank" rel="noopener noreferrer"&gt;Agile Yorkshire&lt;/a&gt;
about Test Driven Development or TDD by Dr Oliver Shaw. I was impressed at how easy Oliver made it look, so as I have never tried it I thought I should give it a try.&lt;/p&gt;
&lt;p&gt;
&lt;img class="img-fluid" alt="Red, Green, Refactor cycle diagram for test driven development" src="https://blog-dev.funkysi1701.com/images/2017/tdd_flow.gif" loading="lazy"
width="489" height="511"
/&gt;
&lt;/p&gt;
&lt;p&gt;Test Driven Development or TDD is a way of development which starts with writing a Unit Test. First you write a failing test, then you write the code to make it pass, then you refactor your code. This can be remembered by thinking of &lt;strong&gt;Red, Green, Refactor&lt;/strong&gt;. Red being the failing test, Green being getting the test to pass, and Refactor being the refactoring.&lt;/p&gt;
&lt;p&gt;During the demonstration Oliver used a language called scala and a system that automatically reran all the tests after every change. I code with Visual Studio in C# is there a way I can get my tests to run automatically as well?&lt;/p&gt;
&lt;p&gt;A bit of googling and configuring I can answer this as Yes.&lt;/p&gt;
&lt;p&gt;The nuget package called &lt;a href="https://github.com/codereflection/Giles" target="_blank" rel="noopener noreferrer"&gt;Giles&lt;/a&gt;
is a watcher which will rerun your tests similar to how Oliver did it with his scalar environment. Fans of Buffy the Vampire Slayer will get the joke of why a watcher is called Giles. I couldn’t get this to work with MSTest but works fine with NUnit. There is a powershell script giles.ps1 which you need to run and will update every so often with how many tests have passed or failed. However you may not see this if you are coding in Visual Studio but there is a way to get a notification.&lt;/p&gt;
&lt;p&gt;If you install the application Growl you can get notifications from Giles which pop up and then disappear. So whatever you have on screen you can find out almost instantly if you have broken tests.&lt;/p&gt;
&lt;p&gt;Another thing that I wanted to configure is a way of viewing code coverage and which methods are tested and which aren’t. If you are familiar with VSTS after a build it gives you a percentage score for test coverage. I don’t find this overly useful as it doesn’t tell you what is covered and what isn’t. Also what if you want to use Github, how do you calculate the code coverage then?&lt;/p&gt;
&lt;p&gt;The nuget packages &lt;a href="https://www.nuget.org/packages/OpenCover/" target="_blank" rel="noopener noreferrer"&gt;OpenCover&lt;/a&gt;
and &lt;a href="https://www.nuget.org/packages/ReportGenerator/" target="_blank" rel="noopener noreferrer"&gt;ReportGenerator&lt;/a&gt;
allow a html report of code coverage to be produced. I created a batch script that can be run whenever you require this information.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[path]\OpenCover.Console.exe -target:&amp;#34;[path]\nunit3-console.exe&amp;#34; -targetargs:&amp;#34;[path]\Test.dll&amp;#34; -output:&amp;#34;[path]\coverage.xml&amp;#34; -register:user
[path]\ReportGenerator.exe &amp;#34;-reports:[path]\coverage.xml&amp;#34; &amp;#34;-targetdir:[path]&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The commands are fairly straightforward, the only tricky bit is sorting out all the filepaths to the different programs.&lt;/p&gt;
&lt;p&gt;Now that I have all this plumbing setup time to give TDD a try and see what I can build.&lt;/p&gt;</description></item><item><title>GitHub, Bitbucket, or VSTS compared</title><link>https://blog-dev.funkysi1701.com/posts/2017/github-vs-bitbucket-vs-vsts/</link><author>funkysi1701@gmail.com (funkysi1701)</author><pubDate>Mon, 06 Mar 2017 20:00:45 +0000</pubDate><guid>https://blog-dev.funkysi1701.com/posts/2017/github-vs-bitbucket-vs-vsts/</guid><category term="Git">Git</category><category term="Bitbucket">Bitbucket</category><category term="DevOps">DevOps</category><category term="AzureDevOps">AzureDevOps</category><category term="SourceControl">SourceControl</category><description>&lt;p&gt;As a developer using source control and git is bread and butter of what we do. Github is probably the most popular and widely known hosting service for source control but I have also used Bitbucket and Visual Studio Team Services. Lets have a look at each one and what they offer. Note while I have included prices I have only tried out the free versions.&lt;/p&gt;
&lt;h2 id="github"&gt;Github&lt;a class="anchor ms-1" href="#github" aria-label="Permalink: Github"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
&lt;img class="img-fluid" alt="GitHub Octocat mascot logo" src="https://blog-dev.funkysi1701.com/images/2017/github-octocat.png" loading="lazy"
width="1200" height="630"
/&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;URL: &lt;a href="https://github.com/" target="_blank" rel="noopener noreferrer"&gt;https://github.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Private Repositories: Not Available for free&lt;/li&gt;
&lt;li&gt;Public Repositories: Unlimited&lt;/li&gt;
&lt;li&gt;Team Size: Unlimited&lt;/li&gt;
&lt;li&gt;Prices: $7 per month for unlimited private repositories, $25 per month for 5 users then $9 per month per user&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is probably the most widely used service for hosting code. Over 13 million repositories of code. This is an ideal solution if you want your code to be publicly viewable, but take care not to publish passwords, private keys or your companies trade secrets. Every developer should have a Github account for displaying bits of code they are proud of.&lt;/p&gt;
&lt;p&gt;There are a number of externally built APIs that link into Github for doing extra features, like building, code coverage etc&lt;/p&gt;
&lt;h2 id="bitbucket"&gt;Bitbucket&lt;a class="anchor ms-1" href="#bitbucket" aria-label="Permalink: Bitbucket"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
&lt;img class="img-fluid" alt="Bitbucket logo" src="https://blog-dev.funkysi1701.com/images/2017/d8TRzzL.png" loading="lazy"
width="277" height="277"
/&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;URL: &lt;a href="https://bitbucket.org/" target="_blank" rel="noopener noreferrer"&gt;https://bitbucket.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Private Repositories: Unlimited&lt;/li&gt;
&lt;li&gt;Public Repositories: Unlimited&lt;/li&gt;
&lt;li&gt;Team Size: Less than 5&lt;/li&gt;
&lt;li&gt;Prices: $10 per month for 10 Users, $100 per month for 100 Users, $200 per month for Unlimited Users&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At my last job we used Bitbucket extensively for all our projects. All the code was private so only the team could access it, however before I left we were approaching the 5 user limit (but looking at these prices cost seems very reasonable)&lt;/p&gt;
&lt;h2 id="visual-studio-team-services"&gt;Visual Studio Team Services&lt;a class="anchor ms-1" href="#visual-studio-team-services" aria-label="Permalink: Visual Studio Team Services"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;
&lt;img class="img-fluid" alt="Visual Studio Team Services logo" src="https://blog-dev.funkysi1701.com/images/2017/Visual-Studio-Team-Services.png" loading="lazy"
width="960" height="434"
/&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;URL: &lt;a href="https://azure.microsoft.com/services/devops/" target="_blank" rel="noopener noreferrer"&gt;https://azure.microsoft.com/services/devops/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Private Repositories: Unlimited&lt;/li&gt;
&lt;li&gt;Public Repositories: Not Available&lt;/li&gt;
&lt;li&gt;Team Size: Less than 5&lt;/li&gt;
&lt;li&gt;Prices: $30 per month for 10 users, and other features paid for via Azure Invoices&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Visual Studio Team Services or VSTS is Microsoft’s version control solution and I have only just started using it, however what I have seen I like. There are lots of options for building your code so VSTS is more than just hosting your code it is verging on a Continuous Integration/Delivery solution. Being a Microsoft product there are numerous links to Azure and it is easy to deploy stuff to that platform.&lt;/p&gt;
&lt;p&gt;All three have options for tracking issues but VSTS have options to add Stakeholder users which would allow none developers to add and keep track of issues and progress with them.&lt;/p&gt;
&lt;p&gt;If I want to run tests, look at code coverage VSTS is probably the solution I would go for, if I want something that is public I would go for Github. What do you think which of these is your favourite?&lt;/p&gt;</description></item></channel></rss>