SlideShare a Scribd company logo
1 of 24
Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous Improver
var numbers = new[] { 1, 2, 3 };
numbers.Should().Contain(item => item > 2, "at least 1 item should be larger than 3");
action.Should().Throw<InvalidOperationException>()
.WithInnerException<ArgumentException>()
.WithMessage("whatever");
typeof(MyController).Methods()
.ThatDoNotReturn<ActionResult>()
.ThatAreNotDecoratedWith<HttpPostAttribute>()
.Should().NotBeVirtual().And.NotBeAsync().And.NotReturnVoid();
graph.Should().BeEquivalentTo(new
{
RelevantProperty = “ImportantValue”
});
“Custom Assertions”
.bat build file
MSTest
CodeBetter TeamCity
2009
CodePlex with TFS
2010
Linked files with #ifdef
First version on NuGet
1.3 (.NET 3.5, 4.0, SL4)
2011
1.7 (.NET 3.5, 4.0, SL4)
CodePlex with Git
2012 (H1)
2.0 (.NET 3.5, 4.0, 3.5, SL4,
SL for WP7.5, WinRT 4.5)
2012 (H2)
Github with Pull Requests
2013
3.0 (.NET 4.0, 4.5, SL5,
Win8, WP8, MonoTouch,
MonoAndroid,)
Psake
David Fowler structure
Shared Projects (.shproj).
2014
3.5 (.NET 4.0, 4.5, Mono, Win
8.0/8.1, WP8 for SL, WP 8/8.1
Store, Sl5)
AppVeyor
GitVersion
2015 H1
4.0 (dotnet5, Mono, Xamarin, .NET
4.0, 4.5, SL5, WP8 SL, WP 8.0/8.1,
Win 8.0/8.1)
PCL + framework-specific +
shared project
Package.json
2015 H2
Cake
xUnit.NET
4.19 (.NET 4.0, 4.5, .Standard 1.3,
Profiel328, Profile32, SL5, UAP
10, WIN81, WP8, WPA8.1)
2017
5.0 (.NET 4.5, Standard 1.4, 1.6,
2.0)
Cross-compilation + #ifdef
PackageReference
2018
Nuke
5.9 (.NET 4.5, 4.7, Core 2.0,
Standard 1.3, 1.6, 2.0)
2019
6.0 (.NET Standard 2.0, 2.1).
2020
develop
4.1.0
dogfooding
release-5.0
5.0.04.2.0
5.0.0-rc.1
X
5.0.0-rc.2
master
5.1.0
X
breaking changes
enhancements & fixes
GitHubFlow
GitFlow
SemVer.
HTTPS via
CloudFare.
Logo by Ben
Palmer
Github Pages +
Jekyll
Minimal
Mistakes Jekyll
Theme
DNS via
GoDaddy
• .NET Standard https://docs.microsoft.com/en-us/dotnet/standard/net-
standard
• David Fowler’s project structure
https://gist.github.com/davidfowl/ed7564297c61fe9ab814
• .NET long-term support
https://dotnet.microsoft.com/platform/support/policy/dotnet-core
• .NET 5 https://devblogs.microsoft.com/dotnet/introducing-net-5/
• Overload resolution bug
https://github.com/fluentassertions/fluentassertions/issues/964
• .NET Core 3 Preview 7 bug
https://github.com/fluentassertions/fluentassertions/issues/1047

More Related Content

More from Dennis Doomen

More from Dennis Doomen (20)

Slow Event Sourcing (re)projections - Just make them faster!
Slow Event Sourcing (re)projections - Just make them faster!Slow Event Sourcing (re)projections - Just make them faster!
Slow Event Sourcing (re)projections - Just make them faster!
 
50 things software teams should not do.pptx
50 things software teams should not do.pptx50 things software teams should not do.pptx
50 things software teams should not do.pptx
 
What is the right "unit" in unit testing and why it is not a class?
What is the right "unit" in unit testing and why it is not a class?What is the right "unit" in unit testing and why it is not a class?
What is the right "unit" in unit testing and why it is not a class?
 
A lab around the principles and practices for writing maintainable code
A lab around the principles and practices for writing maintainable codeA lab around the principles and practices for writing maintainable code
A lab around the principles and practices for writing maintainable code
 
How to Practice TDD Without Shooting Yourself in the Foot
How to Practice TDD Without Shooting Yourself in the FootHow to Practice TDD Without Shooting Yourself in the Foot
How to Practice TDD Without Shooting Yourself in the Foot
 
Decomposing the Monolith using modern-day .NET and a touch of microservices
Decomposing the Monolith using modern-day .NET and a touch of microservicesDecomposing the Monolith using modern-day .NET and a touch of microservices
Decomposing the Monolith using modern-day .NET and a touch of microservices
 
Event Sourcing from the Trenches (DDD Europe 2020)
Event Sourcing from the Trenches (DDD Europe 2020)Event Sourcing from the Trenches (DDD Europe 2020)
Event Sourcing from the Trenches (DDD Europe 2020)
 
Practical introduction to DDD, CQRS and Event Sourcing
Practical introduction to DDD, CQRS and Event SourcingPractical introduction to DDD, CQRS and Event Sourcing
Practical introduction to DDD, CQRS and Event Sourcing
 
How to practice TDD without shooting yourself in the foot
How to practice TDD without shooting yourself in the footHow to practice TDD without shooting yourself in the foot
How to practice TDD without shooting yourself in the foot
 
Decomposing the Monolith (Riga Dev Days 2019)
Decomposing the Monolith (Riga Dev Days 2019)Decomposing the Monolith (Riga Dev Days 2019)
Decomposing the Monolith (Riga Dev Days 2019)
 
A lab around the principles and practices for writing maintainable code (2019)
A lab around the principles and practices for writing maintainable code (2019)A lab around the principles and practices for writing maintainable code (2019)
A lab around the principles and practices for writing maintainable code (2019)
 
Lessons learned from two decades of professional software development
Lessons learned from two decades of professional software developmentLessons learned from two decades of professional software development
Lessons learned from two decades of professional software development
 
The Good, The Bad and The Ugly of Event Sourcing
The Good, The Bad and The Ugly of Event Sourcing The Good, The Bad and The Ugly of Event Sourcing
The Good, The Bad and The Ugly of Event Sourcing
 
Event Sourcing from the Trenches (with examples from .NET)
Event Sourcing from the Trenches (with examples from .NET)Event Sourcing from the Trenches (with examples from .NET)
Event Sourcing from the Trenches (with examples from .NET)
 
How To Practice TDD Without Shooting Yourself In The Foot
How To Practice TDD Without Shooting Yourself In The FootHow To Practice TDD Without Shooting Yourself In The Foot
How To Practice TDD Without Shooting Yourself In The Foot
 
Decomposing the monolith into embeddable microservices using OWIN, WebHooks, ...
Decomposing the monolith into embeddable microservices using OWIN, WebHooks, ...Decomposing the monolith into embeddable microservices using OWIN, WebHooks, ...
Decomposing the monolith into embeddable microservices using OWIN, WebHooks, ...
 
Strengths and weaknesses of dependency injection
Strengths and weaknesses of dependency injectionStrengths and weaknesses of dependency injection
Strengths and weaknesses of dependency injection
 
Build Libraries That People Love To use
Build Libraries That People Love To useBuild Libraries That People Love To use
Build Libraries That People Love To use
 
Decomposing the Monolith using Microservices that don't give you pain
Decomposing the Monolith using Microservices that don't give you painDecomposing the Monolith using Microservices that don't give you pain
Decomposing the Monolith using Microservices that don't give you pain
 
Build Libraries, Not Frameworks
Build Libraries, Not FrameworksBuild Libraries, Not Frameworks
Build Libraries, Not Frameworks
 

Recently uploaded

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Recently uploaded (20)

Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 

Trials and tribulations of a successful open-source project

  • 1. Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous Improver
  • 2.
  • 3.
  • 4.
  • 5. var numbers = new[] { 1, 2, 3 }; numbers.Should().Contain(item => item > 2, "at least 1 item should be larger than 3"); action.Should().Throw<InvalidOperationException>() .WithInnerException<ArgumentException>() .WithMessage("whatever"); typeof(MyController).Methods() .ThatDoNotReturn<ActionResult>() .ThatAreNotDecoratedWith<HttpPostAttribute>() .Should().NotBeVirtual().And.NotBeAsync().And.NotReturnVoid(); graph.Should().BeEquivalentTo(new { RelevantProperty = “ImportantValue” });
  • 6.
  • 7.
  • 8.
  • 9. “Custom Assertions” .bat build file MSTest CodeBetter TeamCity 2009 CodePlex with TFS 2010 Linked files with #ifdef First version on NuGet 1.3 (.NET 3.5, 4.0, SL4) 2011 1.7 (.NET 3.5, 4.0, SL4) CodePlex with Git 2012 (H1) 2.0 (.NET 3.5, 4.0, 3.5, SL4, SL for WP7.5, WinRT 4.5) 2012 (H2) Github with Pull Requests 2013 3.0 (.NET 4.0, 4.5, SL5, Win8, WP8, MonoTouch, MonoAndroid,) Psake David Fowler structure Shared Projects (.shproj). 2014
  • 10. 3.5 (.NET 4.0, 4.5, Mono, Win 8.0/8.1, WP8 for SL, WP 8/8.1 Store, Sl5) AppVeyor GitVersion 2015 H1 4.0 (dotnet5, Mono, Xamarin, .NET 4.0, 4.5, SL5, WP8 SL, WP 8.0/8.1, Win 8.0/8.1) PCL + framework-specific + shared project Package.json 2015 H2 Cake xUnit.NET 4.19 (.NET 4.0, 4.5, .Standard 1.3, Profiel328, Profile32, SL5, UAP 10, WIN81, WP8, WPA8.1) 2017 5.0 (.NET 4.5, Standard 1.4, 1.6, 2.0) Cross-compilation + #ifdef PackageReference 2018 Nuke 5.9 (.NET 4.5, 4.7, Core 2.0, Standard 1.3, 1.6, 2.0) 2019 6.0 (.NET Standard 2.0, 2.1). 2020
  • 12.
  • 13. HTTPS via CloudFare. Logo by Ben Palmer Github Pages + Jekyll Minimal Mistakes Jekyll Theme DNS via GoDaddy
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24. • .NET Standard https://docs.microsoft.com/en-us/dotnet/standard/net- standard • David Fowler’s project structure https://gist.github.com/davidfowl/ed7564297c61fe9ab814 • .NET long-term support https://dotnet.microsoft.com/platform/support/policy/dotnet-core • .NET 5 https://devblogs.microsoft.com/dotnet/introducing-net-5/ • Overload resolution bug https://github.com/fluentassertions/fluentassertions/issues/964 • .NET Core 3 Preview 7 bug https://github.com/fluentassertions/fluentassertions/issues/1047