<?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>2025-02 on Funky Si's Blog (Dev)</title><link>https://blog-dev.funkysi1701.com/2025/02/</link><description>Recent content in 2025-02 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, 24 Feb 2025 20:00:00 +0000</lastBuildDate><atom:link href="https://blog-dev.funkysi1701.com/2025/02/index.xml" rel="self" type="application/rss+xml"/><item><title>The Pragmatic Programmer</title><link>https://blog-dev.funkysi1701.com/posts/2025/pragmatic-programmer/</link><author>funkysi1701@gmail.com (funkysi1701)</author><pubDate>Mon, 24 Feb 2025 20:00:00 +0000</pubDate><guid>https://blog-dev.funkysi1701.com/posts/2025/pragmatic-programmer/</guid><category term="PragmaticProgrammer">PragmaticProgrammer</category><category term="BookReview">BookReview</category><category term="Programming">Programming</category><category term="SoftwareDevelopment">SoftwareDevelopment</category><category term="BestPractices">BestPractices</category><category term="Tech">Tech</category><media:content medium="image" type="image/jpeg" url="https://blog-dev.funkysi1701.com/images/tpp.jpg"/><description>&lt;p&gt;I have been reading &lt;a href="https://pragprog.com/titles/tpp20/the-pragmatic-programmer-20th-anniversary-edition/" target="_blank" rel="noopener noreferrer"&gt;The Pragmatic Programmer&lt;/a&gt;
and I have to say it is a fantastic book. It is full of great advice and tips for programmers. I highly recommend it to anyone who is a programmer at any level.&lt;/p&gt;
&lt;p&gt;Lots of the advice is common sense and things I already do, but there are also lots of things I know in the back of my mind that I should be doing. So reading it has been a great reminder of those things.&lt;/p&gt;
&lt;p&gt;Here is the complete list of tips that can be found in the book (I am reading the 20th anniversary edition, so these might be slightly different if you are looking at the original edition):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Care About Your Craft&lt;/li&gt;
&lt;li&gt;Think! About Your Work&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="a-pragmatic-philosophy"&gt;A Pragmatic Philosophy&lt;a class="anchor ms-1" href="#a-pragmatic-philosophy" aria-label="Permalink: A Pragmatic Philosophy"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol start="3"&gt;
&lt;li&gt;You Have Agency&lt;/li&gt;
&lt;li&gt;Provide Options, Don’t Make Lame Excuses&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog-dev.funkysi1701.com/posts/2015/pragmatic-programmer-broken-windows/"&gt;Don’t Live with Broken Windows&lt;/a&gt;
(I blogged about this in 2015)&lt;/li&gt;
&lt;li&gt;Be a Catalyst for Change&lt;/li&gt;
&lt;li&gt;Remember the Big Picture&lt;/li&gt;
&lt;li&gt;Make Quality a Requirements Issue&lt;/li&gt;
&lt;li&gt;Invest Regularly in Your Knowledge Portfolio&lt;/li&gt;
&lt;li&gt;Critically Analyze What You Read and Hear&lt;/li&gt;
&lt;li&gt;English is Just Another Programming Language&lt;/li&gt;
&lt;li&gt;It’s Both What You Say and the Way You Say It&lt;/li&gt;
&lt;li&gt;Build Documentation In, Don’t Bolt It On&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="a-pragmatic-approach"&gt;A Pragmatic Approach&lt;a class="anchor ms-1" href="#a-pragmatic-approach" aria-label="Permalink: A Pragmatic Approach"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol start="14"&gt;
&lt;li&gt;Good Design Is Easier to Change Than Bad Design&lt;/li&gt;
&lt;li&gt;DRY - Don’t Repeat Yourself&lt;/li&gt;
&lt;li&gt;Make It Easy to Reuse&lt;/li&gt;
&lt;li&gt;Eliminate Effects Between Unrelated Things&lt;/li&gt;
&lt;li&gt;There Are No Final Decisions&lt;/li&gt;
&lt;li&gt;Forgo Following Fads&lt;/li&gt;
&lt;li&gt;Use Tracer Bullets to Find the Target&lt;/li&gt;
&lt;li&gt;Prototype to Learn&lt;/li&gt;
&lt;li&gt;Program Close to the Problem Domain&lt;/li&gt;
&lt;li&gt;Estimate to Avoid Surprises&lt;/li&gt;
&lt;li&gt;Iterate the Schedule with the Code&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="the-basic-tools"&gt;The Basic Tools&lt;a class="anchor ms-1" href="#the-basic-tools" aria-label="Permalink: The Basic Tools"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol start="25"&gt;
&lt;li&gt;Keep Knowledge in Plain Text&lt;/li&gt;
&lt;li&gt;Use the Power of Command Shells&lt;/li&gt;
&lt;li&gt;Achieve Editor Fluency&lt;/li&gt;
&lt;li&gt;Always Use Version Control&lt;/li&gt;
&lt;li&gt;Fix the Problem, Not the Blame&lt;/li&gt;
&lt;li&gt;Don’t Panic&lt;/li&gt;
&lt;li&gt;Failing Test Before Fixing Code&lt;/li&gt;
&lt;li&gt;Read the Damn Error Message&lt;/li&gt;
&lt;li&gt;&amp;ldquo;select&amp;rdquo; Isn&amp;rsquo;t Broken&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t Assume It - Prove it&lt;/li&gt;
&lt;li&gt;Learn a Text Manipulation Language&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="pragmatic-paranoia"&gt;Pragmatic Paranoia&lt;a class="anchor ms-1" href="#pragmatic-paranoia" aria-label="Permalink: Pragmatic Paranoia"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol start="36"&gt;
&lt;li&gt;You Can&amp;rsquo;t Write Perfect Software&lt;/li&gt;
&lt;li&gt;Design with Contracts&lt;/li&gt;
&lt;li&gt;Crash Early&lt;/li&gt;
&lt;li&gt;Use Assertions to Prevent the Impossible&lt;/li&gt;
&lt;li&gt;Finish What You Start&lt;/li&gt;
&lt;li&gt;Act Locally&lt;/li&gt;
&lt;li&gt;Take Small Steps - Always&lt;/li&gt;
&lt;li&gt;Avoid Fortune Telling&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="bend-or-break"&gt;Bend, or Break&lt;a class="anchor ms-1" href="#bend-or-break" aria-label="Permalink: Bend, or Break"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol start="44"&gt;
&lt;li&gt;Decoupled Code is Easy to Change&lt;/li&gt;
&lt;li&gt;Tell, Don&amp;rsquo;t Ask&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t Chain Method Calls&lt;/li&gt;
&lt;li&gt;Avoid Global Data&lt;/li&gt;
&lt;li&gt;If it&amp;rsquo;s Important Enough to be Global, Wrap It in an API&lt;/li&gt;
&lt;li&gt;Programming is About Code, But Programs Are About Data&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t Hoard State; Pass It Around&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t Pay Inheritance Tax&lt;/li&gt;
&lt;li&gt;Prefer Interfaces to Express Polymorphism&lt;/li&gt;
&lt;li&gt;Delegate to Services: Has-A Trumps Is-A&lt;/li&gt;
&lt;li&gt;Use Mixins to Share Functionality&lt;/li&gt;
&lt;li&gt;Parameterize Your App Using External Configuration&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="concurrency"&gt;Concurrency&lt;a class="anchor ms-1" href="#concurrency" aria-label="Permalink: Concurrency"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol start="56"&gt;
&lt;li&gt;Analyze Workflow to Improve Concurrency&lt;/li&gt;
&lt;li&gt;Shared State is Incorrect State&lt;/li&gt;
&lt;li&gt;Random Failures Are Often Concurrency Issues&lt;/li&gt;
&lt;li&gt;Use Actors for Concurrency Without Shared State&lt;/li&gt;
&lt;li&gt;Use Blackboards to Coordinate Workflow&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="while-you-are-coding"&gt;While You Are Coding&lt;a class="anchor ms-1" href="#while-you-are-coding" aria-label="Permalink: While You Are Coding"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol start="61"&gt;
&lt;li&gt;Listen to Your Inner Lizard&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t Program by Coincidence&lt;/li&gt;
&lt;li&gt;Estimate the Order of Your Algorithms&lt;/li&gt;
&lt;li&gt;Test Your Estimates&lt;/li&gt;
&lt;li&gt;Refactor Early, Refactor Often&lt;/li&gt;
&lt;li&gt;Testing is Not About Finding Bugs&lt;/li&gt;
&lt;li&gt;A Test is the First User of Your Code&lt;/li&gt;
&lt;li&gt;Build End-to-End, Not Top-Down or Bottom-Up&lt;/li&gt;
&lt;li&gt;Design To Test&lt;/li&gt;
&lt;li&gt;Test Your Software, or Your Users Will&lt;/li&gt;
&lt;li&gt;Use Property-Based Tests to Validate your Assumptions&lt;/li&gt;
&lt;li&gt;Keep it Simple and Minimize Attack Surfaces&lt;/li&gt;
&lt;li&gt;Apply Security Patches Quickly&lt;/li&gt;
&lt;li&gt;Name well; Rename When Needed&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="before-the-project"&gt;Before the Project&lt;a class="anchor ms-1" href="#before-the-project" aria-label="Permalink: Before the Project"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol start="75"&gt;
&lt;li&gt;No One Knows Exactly What They Want&lt;/li&gt;
&lt;li&gt;Programmers Help People Understand What They Want&lt;/li&gt;
&lt;li&gt;Requirements are Learned in a Feedback Loop&lt;/li&gt;
&lt;li&gt;Work with a User to Think Like a User&lt;/li&gt;
&lt;li&gt;Policy is Metadata&lt;/li&gt;
&lt;li&gt;Use a Project Glossary&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t Think Outside the Box - Find the Box&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t Go into the Code Alone&lt;/li&gt;
&lt;li&gt;Agile is Not a Noun; Agile is How You Do Things&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="pragmatic-projects"&gt;Pragmatic Projects&lt;a class="anchor ms-1" href="#pragmatic-projects" aria-label="Permalink: Pragmatic Projects"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol start="84"&gt;
&lt;li&gt;Maintain Small, Stable Teams&lt;/li&gt;
&lt;li&gt;Schedule It to Make it Happen&lt;/li&gt;
&lt;li&gt;Organize Fully Functional Teams&lt;/li&gt;
&lt;li&gt;Do What Works, Not What&amp;rsquo;s Fashionable&lt;/li&gt;
&lt;li&gt;Deliver When Users Need It&lt;/li&gt;
&lt;li&gt;Use Version Control to Drive Builds, Tests and Releases&lt;/li&gt;
&lt;li&gt;Test Early, Test Often, Test Automatically&lt;/li&gt;
&lt;li&gt;Coding Ain&amp;rsquo;t Done &amp;lsquo;Til All the Tests Run&lt;/li&gt;
&lt;li&gt;Use Saboteurs to Test Your Testing&lt;/li&gt;
&lt;li&gt;Test State Coverage, Not Code Coverage&lt;/li&gt;
&lt;li&gt;Find Bugs Once&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t use Manual Procedures&lt;/li&gt;
&lt;li&gt;Delight Users, Don&amp;rsquo;t Just Deliver Code&lt;/li&gt;
&lt;li&gt;Sign your Work&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="professional-ethics"&gt;Professional Ethics&lt;a class="anchor ms-1" href="#professional-ethics" aria-label="Permalink: Professional Ethics"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol start="98"&gt;
&lt;li&gt;First, Do No Harm&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t Enable Scumbags&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s Your Life&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Understand and handle .NET exceptions</title><link>https://blog-dev.funkysi1701.com/posts/2025/exceptions/</link><author>funkysi1701@gmail.com (funkysi1701)</author><pubDate>Mon, 17 Feb 2025 20:00:00 +0000</pubDate><guid>https://blog-dev.funkysi1701.com/posts/2025/exceptions/</guid><category term="Exceptions">Exceptions</category><category term="DotNet">DotNet</category><category term="ErrorHandling">ErrorHandling</category><category term="Programming">Programming</category><category term="Development">Development</category><category term="Tech">Tech</category><media:content medium="image" type="image/png" url="https://blog-dev.funkysi1701.com/images/exceptions.png"/><description>&lt;p&gt;While at &lt;a href="https://blog-dev.funkysi1701.com/posts/2025/volunteering-at-ndc/"&gt;NDC London&lt;/a&gt;
I heard a great talk by &lt;a href="https://mattburke.dev/talks/youre-doing-exceptions-wrong/" target="_blank" rel="noopener noreferrer"&gt;Matt Burke&lt;/a&gt;
about exceptions. I will share some of the points here.&lt;/p&gt;
&lt;p&gt;The talk was based in part on the blog post &lt;a href="https://ericlippert.com/2008/09/10/vexing-exceptions/" target="_blank" rel="noopener noreferrer"&gt;Vexing Exceptions&lt;/a&gt;
by Eric Lippert.&lt;/p&gt;
&lt;p&gt;It defined four types of exceptions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Fatal Exceptions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Boneheaded Exceptions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vexing Exceptions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exogenous Exceptions&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="fatal-exceptions"&gt;Fatal Exceptions&lt;a class="anchor ms-1" href="#fatal-exceptions" aria-label="Permalink: Fatal Exceptions"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;These are exceptions that are thrown when the application is in an unrecoverable state. Examples of these are OutOfMemoryException and StackOverflowException. Don&amp;rsquo;t try and catch these kind of exceptions, just let the application crash.&lt;/p&gt;
&lt;h2 id="boneheaded-exceptions"&gt;Boneheaded Exceptions&lt;a class="anchor ms-1" href="#boneheaded-exceptions" aria-label="Permalink: Boneheaded Exceptions"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;These are exceptions that are caused by a bug in the code. These are the easiest to fix, as you just need to fix the bug. Examples of these are NullReferenceException and IndexOutOfRangeException. Boneheaded exceptions are a gift and it is the code telling you, that you have a bug to fix. Do throw these kind of exceptions, when someone messes up. They can be especially useful when someone else is consuming your API, you can throw an exception with a message that tells them what they did wrong.&lt;/p&gt;
&lt;h2 id="vexing-exceptions"&gt;Vexing Exceptions&lt;a class="anchor ms-1" href="#vexing-exceptions" aria-label="Permalink: Vexing Exceptions"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;These are exceptions that are thrown by the framework, and are hard to avoid. Examples of these are FormatException and InvalidOperationException. These are the hardest to fix, as they are thrown by the framework. You can&amp;rsquo;t fix the framework, so you have to work around them. You can&amp;rsquo;t avoid them, so you have to catch them. You can&amp;rsquo;t ignore them, so you have to handle them. You can&amp;rsquo;t fix them, so you have to work around them.&lt;/p&gt;
&lt;p&gt;One example of this is the int.Parse() method, it will throw a FormatException if the string is not a valid integer. You can&amp;rsquo;t avoid this, so you have to catch it. Of course a better way to do this is to use int.TryParse() which will return a boolean if the parse was successful.&lt;/p&gt;
&lt;h2 id="exogenous-exceptions"&gt;Exogenous Exceptions&lt;a class="anchor ms-1" href="#exogenous-exceptions" aria-label="Permalink: Exogenous Exceptions"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;These are exceptions that are thrown by external systems. Examples of these are IOException and SocketException. These are the hardest to fix, as they are thrown by external systems. You can&amp;rsquo;t fix the external system, so you have to work around them.&lt;/p&gt;
&lt;p&gt;A recent example is concurrency problems, if you are processing data in a database and other systems could update it at the same time, you could get a concurrency exception. The data you have in memory might not reflect the real state of that data. You can&amp;rsquo;t avoid this, so you have to catch it. You can&amp;rsquo;t ignore it, so you have to handle it.&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;try&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:#75715e"&gt;// Do something that could throw an exception&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;catch&lt;/span&gt; (Exception ex)
&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;// Log the exception&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Log.Error(ex);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; ex; &lt;span style="color:#75715e"&gt;// Bad resets the stack trace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// Good keeps the stack trace &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;Also don&amp;rsquo;t hide Exogenous Exceptions, if you catch an exception and don&amp;rsquo;t rethrow it, you are hiding the exception from the caller. I have seen code that uses the mediator pattern, it will call a method and not return to the original caller that something went wrong. This is bad, as the original caller needs to know that something went wrong.&lt;/p&gt;
&lt;p&gt;If you have enjoyed this article and want to get a monthly email with all my latest articles, please sign up for my &lt;a href="https://blog-dev.funkysi1701.com/newsletter"&gt;newsletter&lt;/a&gt;
. If you have any questions or comments, please feel free to reach out or leave a comment below.&lt;/p&gt;</description></item><item><title>What is new with C#</title><link>https://blog-dev.funkysi1701.com/posts/2025/whats-new-csharp/</link><author>funkysi1701@gmail.com (funkysi1701)</author><pubDate>Mon, 10 Feb 2025 20:00:00 +0000</pubDate><guid>https://blog-dev.funkysi1701.com/posts/2025/whats-new-csharp/</guid><category term="C-Sharp">C-Sharp</category><category term="Programming">Programming</category><category term="DotNet">DotNet</category><category term="LanguageFeatures">LanguageFeatures</category><category term="Development">Development</category><category term="Tech">Tech</category><media:content medium="image" type="image/jpeg" url="https://blog-dev.funkysi1701.com/images/mads-csharp.jpg"/><description>&lt;p&gt;I was lucky enough to hear Mads Torgersen (The Lead Designer of the C# language) speak at &lt;a href="https://blog-dev.funkysi1701.com/posts/2025/volunteering-at-ndc/"&gt;NDC London&lt;/a&gt;
about some of the plans the team has for the next version of C#. Many of these new features are in the preview stage, and can be enabled by using the c# preview flag in your csproj file. The C# team welcomes feedback on the different use cases for new feature, especially during these early previews. As this is a preview of new language features, don&amp;rsquo;t blame me if this all changes before it all ships in Novembers release!&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-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;LangVersion&amp;gt;&lt;/span&gt;preview&lt;span style="color:#f92672"&gt;&amp;lt;/LangVersion&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="dictionary-expressions"&gt;Dictionary Expressions&lt;a class="anchor ms-1" href="#dictionary-expressions" aria-label="Permalink: Dictionary Expressions"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is an extension of the existing collection expressions that we have had since C# 12, but this time for dictionaries.&lt;/p&gt;
&lt;p&gt;The syntax is going to look a bit like&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;IList&amp;lt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&amp;gt; foo = [&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;IDictionary&amp;lt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;&amp;gt; bar = [&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;one&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;two&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;three&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://github.com/dotnet/csharplang/blob/main/proposals/dictionary-expressions.md" target="_blank" rel="noopener noreferrer"&gt;Dictionary Expressions&lt;/a&gt;
&lt;/p&gt;
&lt;h2 id="simple-lambda-parameters-with-modifiers"&gt;Simple lambda parameters with modifiers&lt;a class="anchor ms-1" href="#simple-lambda-parameters-with-modifiers" aria-label="Permalink: Simple lambda parameters with modifiers"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&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;WithOut w1 = (&lt;span style="color:#66d9ef"&gt;string&lt;/span&gt; s) =&amp;gt; s.Length;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WithOut w2 = (s) =&amp;gt; s.Length;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WithOut w3 = (&lt;span style="color:#66d9ef"&gt;string&lt;/span&gt; s, &lt;span style="color:#66d9ef"&gt;out&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i) =&amp;gt; i = s.Length;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WithOut w4 = (s, &lt;span style="color:#66d9ef"&gt;out&lt;/span&gt; i) =&amp;gt; i = s.Length;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://github.com/dotnet/csharplang/blob/main/proposals/csharp-14.0/simple-lambda-parameters-with-modifiers.md" target="_blank" rel="noopener noreferrer"&gt;Simple lambda parameters with modifiers&lt;/a&gt;
&lt;/p&gt;
&lt;h2 id="unbound-generic-types-in-nameof"&gt;Unbound generic types in nameof&lt;a class="anchor ms-1" href="#unbound-generic-types-in-nameof" aria-label="Permalink: Unbound generic types in nameof"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&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;var&lt;/span&gt; t = &lt;span style="color:#66d9ef"&gt;typeof&lt;/span&gt;(List&amp;lt;&amp;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; n = nameof(List&amp;lt;&amp;gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://github.com/dotnet/csharplang/blob/main/proposals/csharp-14.0/unbound-generic-types-in-nameof.md" target="_blank" rel="noopener noreferrer"&gt;Unbound generic types in nameof&lt;/a&gt;
&lt;/p&gt;
&lt;h2 id="null-conditional-assignment"&gt;Null conditional assignment&lt;a class="anchor ms-1" href="#null-conditional-assignment" aria-label="Permalink: Null conditional assignment"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&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;var&lt;/span&gt; c = C.GetOne();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;c.P = &lt;span style="color:#e6db74"&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;c.E += () =&amp;gt; { };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;c?.P = &lt;span style="color:#e6db74"&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;c?.E += () =&amp;gt; { };
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://github.com/dotnet/csharplang/blob/main/proposals/csharp-14.0/null-conditional-assignment.md" target="_blank" rel="noopener noreferrer"&gt;Null conditional assignment&lt;/a&gt;
&lt;/p&gt;
&lt;h2 id="partial-events-and-constructors"&gt;Partial events and constructors&lt;a class="anchor ms-1" href="#partial-events-and-constructors" aria-label="Permalink: Partial events and constructors"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&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;partial&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Partials&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; &lt;span style="color:#66d9ef"&gt;partial&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; M(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i);
&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; &lt;span style="color:#66d9ef"&gt;partial&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt; P { &lt;span style="color:#66d9ef"&gt;get&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; &lt;span style="color:#66d9ef"&gt;partial&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;[&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i] { &lt;span style="color:#66d9ef"&gt;get&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; &lt;span style="color:#66d9ef"&gt;partial&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;event&lt;/span&gt; Handler? E;
&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; &lt;span style="color:#66d9ef"&gt;partial&lt;/span&gt; Partials();
&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;&lt;a href="https://github.com/dotnet/csharplang/blob/main/proposals/csharp-14.0/partial-events-and-constructors.md" target="_blank" rel="noopener noreferrer"&gt;Partial events and constructors&lt;/a&gt;
&lt;/p&gt;
&lt;h2 id="field-access-in-auto-properties"&gt;Field access in auto properties&lt;a class="anchor ms-1" href="#field-access-in-auto-properties" aria-label="Permalink: Field access in auto properties"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&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;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Fields&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; &lt;span style="color:#66d9ef"&gt;string?&lt;/span&gt; FirstName { &lt;span style="color:#66d9ef"&gt;get&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;set&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; &lt;span style="color:#66d9ef"&gt;string?&lt;/span&gt; LastName { &lt;span style="color:#66d9ef"&gt;get&lt;/span&gt; =&amp;gt; field; &lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; =&amp;gt; field = &lt;span style="color:#66d9ef"&gt;value&lt;/span&gt;?.Trim(); }
&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;note the field keyword is a potential breaking change if you have field variables in your code.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/dotnet/csharplang/blob/main/proposals/csharp-14.0/field-keyword.md" target="_blank" rel="noopener noreferrer"&gt;Field access in auto properties&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;This last one revealed a couple of gems of information that I found interesting. Creating a class called var can essentially disable the var keyword, and if you declare a variable called _ it can disable the discard operator. Neither of these things I would want to do in production code, but interesting that the language allows them.&lt;/p&gt;
&lt;h2 id="extensions"&gt;Extensions&lt;a class="anchor ms-1" href="#extensions" aria-label="Permalink: Extensions"&gt;&lt;i class="fas fa-link" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We have had extension methods for a while, but what about extension members?&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/dotnet/csharplang/blob/main/proposals/csharp-14.0/extensions.md" target="_blank" rel="noopener noreferrer"&gt;Extension members&lt;/a&gt;
&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;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Enumerable&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:#75715e"&gt;// New extension declaration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; extension(IEnumerable source) { ... }
&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;// Classic extension method&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; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; IEnumerable&amp;lt;TResult&amp;gt; Cast&amp;lt;TResult&amp;gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt; IEnumerable source) { ... }
&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;// Non-extension member&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; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; IEnumerable&amp;lt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&amp;gt; Range(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; start, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; count) { ... }
&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;This was a fascinating look at what is coming up for C#, and it will be interesting to see how these new ways of writing code will get adopted.&lt;/p&gt;
&lt;p&gt;If you have enjoyed this article and want to get a monthly email with all my latest articles, please sign up for my &lt;a href="https://blog-dev.funkysi1701.com/newsletter"&gt;newsletter&lt;/a&gt;
. If you have any questions or comments, please feel free to reach out or leave a comment below.&lt;/p&gt;</description></item><item><title>Volunteering at NDC London</title><link>https://blog-dev.funkysi1701.com/posts/2025/volunteering-at-ndc/</link><author>funkysi1701@gmail.com (funkysi1701)</author><pubDate>Mon, 03 Feb 2025 20:00:00 +0000</pubDate><guid>https://blog-dev.funkysi1701.com/posts/2025/volunteering-at-ndc/</guid><category term="NDCLondon">NDCLondon</category><category term="Volunteering">Volunteering</category><category term="Conference">Conference</category><category term="DotNet">DotNet</category><category term="TechEvents">TechEvents</category><category term="Networking">Networking</category><category term="SoftwareDevelopment">SoftwareDevelopment</category><media:content medium="image" type="image/jpeg" url="https://blog-dev.funkysi1701.com/images/ndc-simon.jpg"/><description>&lt;p&gt;
&lt;img class="img-fluid" alt="The NDC Volunteers" src="https://blog-dev.funkysi1701.com/images/ndc-crew.jpg" loading="lazy"
width="2048" height="865"
/&gt;
&lt;/p&gt;
&lt;p&gt;I have just come home from volunteering at NDC London. It was a great experience and I learned a lot. I met some great people and had a lot of fun. I can&amp;rsquo;t wait to go back next year.&lt;/p&gt;
&lt;p&gt;You may have heard of &lt;a href="https://ndclondon.com/" target="_blank" rel="noopener noreferrer"&gt;NDC London&lt;/a&gt;
before. It is a conference for software developers. It is held in London every year and attracts people from all over the world. The conference covers a wide range of topics, with a strong focus on .NET. I have heard about the conference for years and always wanted to go, but with ticket prices in the thousands, it was out of reach for me.&lt;/p&gt;
&lt;p&gt;Late last year, I saw a contact on social media mention that &lt;a href="https://ndclondon.com/volunteer" target="_blank" rel="noopener noreferrer"&gt;volunteering at NDC&lt;/a&gt;
was a good way to go to the conference for free. I had heard that this was an option before, but hadn&amp;rsquo;t acted upon it. So I sent a quick email to the conference organizers. I didn&amp;rsquo;t expect I would get on the team, but they emailed back and said I was on the team, and asked what was my t-shirt size. I was so excited!&lt;/p&gt;
&lt;p&gt;The event is held at the &lt;a href="https://qeiicentre.london/" target="_blank" rel="noopener noreferrer"&gt;Queen Elizabeth II Centre&lt;/a&gt;
, which is a great venue, right next to Big Ben and Westminster Abbey. The conference is spread over a whole week, with 2 days of workshops and 3 days of talks. Volunteers are only needed for the 3 days of talks, however, there was an intro meeting the day before.&lt;/p&gt;
&lt;p&gt;As a volunteer, you don&amp;rsquo;t get paid, so I needed to arrange my own transport to London and accommodation. It being London, I knew the tube network was a quick and easy way to get around, so I could search for a reasonably priced hotel that was near the venue.&lt;/p&gt;
&lt;p&gt;The intro meeting was on Tuesday evening, at 5.30 pm. I arrived a bit early and unfortunately, I wasn&amp;rsquo;t very clear about why I was there so I was told to wait and the meetup would go upstairs soon. The London .NET user group was having a session at 5 pm with Mads Torgersen (the C# language designer), but luckily I double-checked and got to wait with the right people. However, this was not a bad thing, as I got to see some of the .NET team walk past, like Steve Sanderson and of course Mads Torgersen who was going to the meetup.&lt;/p&gt;
&lt;p&gt;
&lt;img class="img-fluid" alt="London view" src="https://blog-dev.funkysi1701.com/images/london.jpg" loading="lazy"
width="2000" height="900"
/&gt;
&lt;/p&gt;
&lt;p&gt;Once the intro meeting started, we unboxed the hoodies that every attendee was given. These ranged in size from XS to XXXL, we also learned how the registration process worked. Scan a QR code, print off the ticket, stick it to the lanyard, and issue it to the attendee. I also found out that there was a decent Yorkshire contingent, some I had met from York and Leeds user groups. We had a tour of the venue, the conference was on floors 3, 4, and 5. The top floor had a great view of Big Ben and Westminster Abbey. We were also issued our own T-shirt and hoodies, which were purple and said NDC Crew on them along with our lanyard passes.&lt;/p&gt;
&lt;p&gt;It was an early morning, we needed to be at the venue for 7 am, ready to welcome 900+ people to the conference when the doors opened at 8 am. I helped man the hoodies, handing out XXL to any attendees who wanted them. There was a steady stream of people registering, however, I didn&amp;rsquo;t feel overwhelmed. By the time we had finished at registration, the keynote with Scott Hanselman was about halfway through, so I went to get a coffee and some breakfast and had a look at the schedule for the day. I was assigned to help out with the afternoon sessions so I was free to attend any sessions I liked in the morning.&lt;/p&gt;
&lt;p&gt;For my afternoon duties, I needed to report back when the speaker had arrived and count up the number of green/amber/red cards for the session. At NDC feedback for the different speakers is submitted by the attendees by putting cards of different colours in a box. Green for good, amber for ok, red for bad. Throughout the different talks I attended there was always a good proportion of green cards, indicating the high quality of the speakers at NDC.&lt;/p&gt;
&lt;img src="https://blog-dev.funkysi1701.com/images/ndc-simon.jpg" alt="The NDC Volunteers" width="250px" style="float:left;padding-right: 15px; " /&gt;
&lt;p&gt;Wearing a purple NDC Crew hoodie, gave me a certain amount of confidence, I walked among many of the sponsors and chatted to a few. Elastic Search had a stall, and I mentioned my recent experience at work with them. At some conferences, I can feel a bit out of place, but at NDC being a volunteer, I had an automatic group of friends to chat to, the other volunteers, and this also helped me speak with one or two of the speakers. I enjoyed saying hello to Richard Campbell, who I had listened to on the .Net Rocks and RunAs Radio podcasts for years. I told him he had sent me a mug, and he mentioned it was a collector&amp;rsquo;s item now.&lt;/p&gt;
&lt;p&gt;At the end of the first day, I was invited to the speaker dinner, which was a great experience. I got to chat with some of the other volunteers. I had a great time and it was free food and drink so I can&amp;rsquo;t complain.&lt;/p&gt;
&lt;p&gt;While I was volunteering, I was often hanging out with the other volunteers. We had a great time, and I made some new friends. We had a lot of fun, and I learned a lot, which I hope to blog about soon. I can&amp;rsquo;t wait to go back next year.&lt;/p&gt;
&lt;p&gt;If you have enjoyed this article and want to get a monthly email with all my latest articles, please sign up for my &lt;a href="https://blog-dev.funkysi1701.com/newsletter"&gt;newsletter&lt;/a&gt;
. If you have any questions or comments, please feel free to reach out or leave a comment below.&lt;/p&gt;</description></item></channel></rss>