.NET South East October 2017 Meetup With guest Rabeb Othmani

Last night we held our third .NET South East meetup at Madgex HQ with special guest Rabeb Othmani. Here’s a brief summary of the evening…


Planning for this meeting felt a lot easier than past events as I have built a few lists of things to do and have a bit of experience with setting everything up. As usual I did a bit of marketing for the event via Twitter, hoping to spread the word.

On the evening I finished work around 4:30pm to begin setting up the room and preparing things like the snacks and drinks. We have a pretty well-oiled process now and with the help of Ricky our IT guru we had the room prepared in about 30 minutes. The plan for the evening was to stick to the process we’d developed at our prior meetup.

We had our attendees sign in down in the foyer with two volunteers, Chris and Jenny very kindly helping to do that this month. Again we placed our food and drinks networking area in our main reception space so that there was more space for people to chat and socialise. Toby and Sally; two more Madgexians kindly helped meet and greet people from the lifts. This month I was please as everything was ready well in advance and I was actually able to spend a bit of time greeting and speaking to people as they arrived. This was something I’d been unable to do at the prior events where I was running around getting the final things sorted.

In the end we had 20 attendees for the evening so a bit of a drop off from our first two. I had kind of expected this since the novelty has worn off for some. We did have some new faces though so it was nice to see more members finding their way to us.

Intro and news

At 7pm I opened the evening with my introduction, including thanking our fantastic sponsors and then went on to discuss some of the news items I had gathered for this month…

Quantum Computing

The first item I discussed was taken from the Ignite 2017 announcement that Microsoft are expecting to release a Quantum computing programming language by the end of this year. Microsoft are heavily invested in research around building a working quantum computing device and would like to start skilling up developers to work in the quantum world. The new language is yet unnamed (my guest is Q#!) and will include full Visual Studio integration, including a debugging experience. A local simulator will be available to simulate a 30 Qubit device or an Azure based 40 Qubit similar can be used. It’ll be interesting to watch how this develops as quantum computing could truly change the way we think about programming.

Microsoft Quantum Computing

Arstechnica Article on MS Quantum Computing

.NET 4.7.1 built in support for .NET Standard 2.0

A smaller news item but worth a quick mention, this story refers to the Microsoft announcement that 4.7.1 of the .NET Framework now includes all necessary files to consume .NET Standard 2.0 libraries. While 4.6.1 introduced compliance with the .NET Standard 2.0, it required some additional files to be deployed and in some cases binding redirects to be used.

.NET 4.7.1 built in support for .NET Standard 2.0 Announcement

UWP Supports .NET Standard 2.0

A related story was another Microsoft announcement that a major update for UWP means that it now supports .NET Standard 2.0. This introduces an additional ~20k APIs to the platform which developers can now take advantage of. It should also make sharing code between UWP and other platforms much easier. To use this update you need Visual Studio 15.4 and need to be targeting the Windows 10 Fall Creators Update.

UWP Supports .NET Standard 2.0 Announcement

Rabeb Othmani – Welcome to the age of conversational interfaces

Rabeb Othami speaking about conversational interfaces

Rabeb gave us a great talk that really set my mind off thinking about building bots! She talked about the coming of age of conversational interfaces via devices like Google Echo, Amazon Alexa and our smart phones.

She described the history of the changing development landscape as users move to consuming on smaller devices and via different interfaces. We moved from mouse on desktop devices, to touch on tablets and smart phones and we’re now entering the age of voice communication where we may never physically interact with the device at all.

Recent advances in technologies such as AI and machine learning are enabling us to develop more intelligent applications while improvements in voice recognition, language interpretation and text to speech have also driven the industry forward and moved us towards more and more voice based interfaces.

Digital assistants such as Google, Siri and Cortana understand more about the context in which we are operating and can tailor responses and information to our needs.

Voice as an interface is becoming popular in part due to its convenience and speed. With text we need to locate our device, unlock it, access an app, type data and wait for a response. With voice, we can very quickly interact without any need to physically hold the device. We can interact on the move or in situations such as in the car when our hands are not free to use a device. Voice can be very simple when done right as there are no UI issues in the traditional sense. However the application/device must be able to understand and interpret the intent of the user.

Rabeb listed some key point to consider when building voice based interfaces:

  • Make it smart
  • Use language users can understand
  • The capabilities of your tech
  • The structure of the info – For example dates; e.g. should you infer a year if the user doesn’t say one?

When building for devices like Alexa you build skills which are a unit of conversational intelligence. You must register the skill to be able to use it from your device. Skills invoke a bot in the cloud which does the processing for your application. Rabeb demoed the Microsoft bot SDK in Visual Studio and a simple bot which would call her phone using the Nexmo APIs.

Rabeb Othamni at .NET South East

It was a great introduction to the world of bots and voice interfaces. I have been inspired to add it to my list of things to try and I hope a few others will do the same. This is exactly why I believe user groups are so great. In a short evening you can quickly learn about a new technology with enough to get you excited and start you on a path of discovery. A big thank you to Rabeb for travelling down from Bristol to spend the evening with us.

As always, a big thanks too to the amazing volunteers from Madgex who helped me setup and run the evening and to all of the attendees for making time to join us. A final thanks goes to our sponsors for the evening who offered some great prizes and support of our user group.

Prize Draws

With the end of the evening closing in we drew the winners of the prizes from our fantastic sponsors for the event. The prizes we had to offer were:

One year individual subscription to any single JetBrains Toolbox product

DevCraft Complete License code

Free eBook

6 month Small Business license

License to PostSharp

Again we use the WPF app created by Dan Clarke, who organises the .NET Oxford meetup. The rules as with the last event were:

a) names are added from the RSVP list (as at about 1 hour before the event)
b) if the name drawn is not in attendance, we redraw.

Next events

We have some great speakers lined up for the next couple of months, and I’m working with a few people of plans for next year too.

.NET South East November 2017 – Michael Newton
Making Distributed Systems in .NET Easier

.NET South East November 2017 – David Arno
Roslyn Analysers

2018 events to be announced soon!

Call for speakers

I’d love to get a range of varied content and speakers to present at our user group. We have a nice pipeline for the coming months but those months will fly by very quickly. If you’d be interested in speaking at a future event we’d love to have you. Please get in touch via the contact form on this blog or ping me on Twitter and we can discuss availability and topics.

I’m really keen to draw as many speakers from our local community too so please let me know if you might be interested in speaking. Perhaps you have presented a talk internally and could open it up to a wider audience. I highly recommend speaking as a way to develop professionally. I’m happy to offer advice for new speakers and help where I can.

If you don’t like the idea of public speaking, you are not alone. Please check out my own story in my recent two part blog series – Part 1 of How to not hate public speaking.



How To Not Hate Public Speaking (Part 2)

This is a continuation from part 1 of my story about my personal speaking career journey so far. I recommend you read that post first as otherwise you’ll lack some important context needed to understand the full journey.

Fair warning once again: This is a long blog post. I plan to create short, more digestible posts that will follow this one to expand on the benefits of speaking and some tips and techniques I’ve used to date. But you’re here now, so why not stick with it? 🙂

I’ll continue from where I left off in part 1

Chapter 3: Becoming a conference speaker

A few weeks after presenting my first external talk, buoyed by the success of the evening the next thing I did seems pretty crazy to me, even now, I submitted a talk to a conference in their call for papers. What!!? Yeah, I’m still not sure exactly what possessed me! I had only given one public talk and one internal talk for goodness sake!

I first heard about a conference in London called Progressive .NET whilst listening to the .NET Rocks podcast. Richard and Carl would be there and it sounded like a lot of fun. I checked out the site to see how much a ticket would cost. It was whilst there that I noticed that a call for papers was open. Why not I thought! I had been avidly blogging about Docker for .NET Developers by this point and realised that I had a lot of content that could be formed into a talk. I spent 30 minutes developing an brief outline for a Docker talk and hit the submit button… Oh good God, what had I done!?

After that I forgot about it for a little while, until weeks later I got an email telling me that my talk had been accepted. Amazing; but also… aargh!

I responded back and started discussing the details of the travel and expenses. Being new to conference speaking I was unsure of the exact process. I knew that to attend the three day conference I would ideally need to stay up in London to avoid early starts and commutes fraught with the risk of train cancellations. I agreed with the organiser of the event that I could book a hotel for a few nights and that they would cover the cost, along with my train fare. This seemed very reasonable to me. I could also invite a friend/colleague on a guest ticket which was an extra bonus.

Now the hard part began; taking my rough outline and turning it into a talk. I had 45 minutes to fill and I knew that I wanted to include some demos along with my slides. I spent many hours figuring out how to take beginners through the topic of Docker. I wanted to share our journey at Madgex, building up to a big finish – showing a docker build and deploy into AWS ECS. After working at it for those many hours I got to the point where I had slides and some demo projects prepared. Then the even tougher work began, practicing. As before I spent a lot of hours in the evenings and at weekends fitting in rehearsals. Some just of the slides, some just of the demos and many of the complete talk. I focused carefully on timing since I had to try and hit the 45 minutes exactly. I was aiming to allow 5 minutes for questions, so needed 40 minutes of content to present. I focused on controlling my speaking speed as my prior experience told me that I would likely speak faster in the heat of the moment. I wanted to balance between practicing at what I expected to be a real speed, whilst also learning how to avoid going too fast.

Something which was often at the back of my mind was the issue of demo failure. What if my demos didn’t work? One of the demos was dependant on having a good internet connection to push a Docker image up to AWS and show how we deploy the image into production. Without a reasonable internet link I would be left pretty much high and dry. I decided to develop some safety nets for my demos, which would become plan B and plan C. Plan B was a set of videos that I recorded, showing the key steps from the demos. I recorded these and could fall back to them in the event of internet issues. For plan C I included screenshots and copied code as slides in a backup PowerPoint file. This was in case I had any laptop issues and ended up needing to present on a backup device during the conference. As a worst case I could present these slides and talk through the steps. Having these backup plans available made me feel much better about my demos.

At around the time I was finalising the main content I happened to be speaking to Dylan Beattie, who helps organise the Progressive .NET event and he suggested practicing the talk for a smaller audience at a user group before the conference. He had the perfect option, London .NET user group which he co-organises. He gave me date options and in the end I chose the 8th of August as it meant I’d have time after to make any changes before the conferences in September. The only downside was that it was only two days after arriving back from a holiday in Norway, so not much time to do final practice runs. I also learned from Dylan that it had helped my chances greatly of being accepted for Progressive .NET tutorials after he’d seen my first talk at ALT.NET in Brighton. So a little bit of luck and good timing had helped me there. It was fantastic that on the back of that first talk it led Dylan to advocate for me as a speaker. Thanks Dylan!

After arriving back from Norway I started to feel a little stressed about the upcoming user group. I hadn’t rehearsed anything for nearly two weeks and I was worried that I would have lost some of my flow. I spent my lunchbreak on the Monday running through my slides and then a few hours that evening as well. When Tuesday arrived I wished I was more rehearsed but there was not much I could do about it at that point. I worked until around 3:30pm at which point I headed for the station and the train which would take me to Skills Matter in London where the user group meets. This would be the same venue as the upcoming conference so it was useful to have a chance to familiarise myself with it.

I arrived at Skills Matter fairly early and went on down to the room the user group would be using for the evening. It was nice being early as the room was nearly empty and I could get settled, while checking my laptop was ready for the demos and connected to the video system. It was at this point I had my first tech failure. The new presentation clicker I had purchased wouldn’t connect to my laptop. After two attempts, repeating something I’d done tens of times at home, it was clear it was a losing battle. Luckily, Dylan had his clicker to hand and this seemed to work just fine in my laptop. Panic over!

The room started to fill and before long the final few minutes were counting down. I was definitely pretty nervous by that point. What if I forgot what I wanted to say? What if I wasn’t clear enough? What would happen if my demos failed? The tech guy from Skills Matter came over and distracted my worried thoughts to get me wired up with a lapel microphone. This would be my first experience of using a microphone when speaking.

Shortly afterwards it was time for the event to start. Dylan kicked off with a quick introduction to the group and all too quickly he was introducing me to the audience. No backing out now! I stood up and felt a small rush of fear, followed by a surge of adrenaline. The room was full and there were a lot of expectant faces gazing back at me. And so I began, just as rehearsed, launching into my introduction. I was conscious of a little shake in my hands as my heart started pumping and the adrenaline kicked in. I pushed through and after a few minutes I settled down. From my experience so far, I still consider these first 3-5 minutes the hardest as I and the audience warm up. As I picked up momentum I was pleased with how things were going. I was able to make regular eye contact with people around the room and the flow I’d rehearsed was working well. Even the demos went entirely to plan. My hours of practice had definitely paid off. At the end I opened to questions and got quite a few. I was a little worried about questions since there is always the risk that you get asked something you don’t know. However, I found that in all cases I was able to offer an answer that I hope was satisfactory.

Later, during the post meetup drinks I was approached by a few of the attendees who thanked me for the talk. The feedback was very positive, people had enjoyed the content and the delivery. It was very pleasing to hear and this feedback was extremely important to realise that I was on the right track. It’s feedback like this which has given me further confidence to consider more speaking engagements.

Another thing which happened during this timeframe was receiving a LinkedIn message from Hannes Preishuber‏ who runs a training company called PPEDV in Germany. Hannes wanted to invite me to speak about Docker at a conference he was organising in Cologne called ADC (Advanced Developer Conference) Core. This was an extremely exciting prospect and one I hoped could become a reality. I checked the dates and realised this would be the week immediately after my first ever conference at Progressive .NET. Other than creating two very busy weeks I decided that I could make it work and so I readily agreed to the offer. As well as my Docker talk, I offered a short talk about Humanitarian Toolbox as I was keen to have a chance to promote that to as wide an audience as possible. Both talks were accepted. The only downside for me was that the session length for ADC Core was 70 minutes. This meant I would need to extend my Docker talk and have a version that could run to this length. Also, 70 minutes is quite an intimidating length of time to be in front of an audience.

The weeks after my talk at the London .NET user group passed quickly. I spent a lot of free time refining my slides and mostly practicing everything many times over. I was also actively working on my extended slide deck for ADC Core. I quickly found that the additional time for that talk meant I could cover some important topics which I had to gloss over for the shorter version. It didn’t take long to develop a few additional slides which brought me up to the required 70 minutes. As I neared my final rehearsals, switching between my shorter and longer versions I soon realised I was getting mixed up with my timings, spending too long on some of the slides during the 45 minute version, pushing me over my time limit. I decided that I would develop timing sheets for each version, listing the exact time that I could spend on each slide. I did this by timing my talks during multiple rehearsals, logging the run time at the point of switching to each slide. After a while I had a decent set of timings for each version. Now, during each practice run I had a timer app running on my phone which I used to keep pace. I found this really valuable since I knew exactly if I was running too long or too short against plan.

The final preparation for my first conference was another user group talk. This time for the new .NET South East meetup group I had organised. I won’t go into the motivation for that group here, but you can read more in this previous post. The opportunity to present the talk one more time in front of an audience was very useful. The night of the user group was pretty frantic as there was a lot to organise. I didn’t have a huge amount of time for nerves. I was more nervous about opening the evening where I would introduce the group and how things worked. I’d had little time to practice what I would say so was feeling less confident. I do remember thinking that I sounded a bit nervous during that introduction. It was a very successful evening and my Docker talk went well. This time around it felt very natural and I quickly got into my rehearsed rhythm. It’s amazing how quickly something so alien and scary had started to feel more normal. Conditioning at work!

Conference No. 1

On Tuesday 12th September I set off for London, ready to start my conference career! I was feeling equal parts excited and nervous at the thought of speaking. The conference was due to start the next day and that would be my day to speak. Arriving on the Tuesday I was going to be able to attend a speakers drink evening at Skills Matter before heading upstairs to listen to Richard Campbell talk about the History of .NET at a special London .NET User Group meetup. The drinks was a great way to meet some of the other speakers and to relax. However, I did feel like a bit of an imposter, amongst such experts and regular speakers.

The next day I got up early to give me time to complete one final rehearsal of my talk in my hotel room. The walls of the Travelodge were quite thin so I hope I didn’t wake my neighbours with my Docker talk. If I did, I hope they enjoyed it! With a successful rehearsal complete I headed out and walked to the venue at Skills Matter. They had breakfast of fruit and pastries laid out which I took advantage of before sitting down to review my slides. I wanted everything as fresh as possible before I spoke later that morning. At 9am it was time for the conference opening Keynote from Jon Galloway. It was a great talk and an example of an expert speaker presenting comfortably to the crowd. After Jon there was one more session before I would speak. I chose to head down to the room I would be speaking in to watch the talk before mine. No pressure for me, it was Jon Skeet! Jon is a well-known and expert presenter and I knew he would be a tough act to follow. During Jon’s talk I started to think about the time ticking away to my start time. As ready and practiced as I was, I was starting to get very nervous about speaking.

Before long I had no time left to be nervous, Jon was wrapping up his talk. During Jon’s talk I had tested that my laptop was working and connected to the network. I’d also done a quick check of the steps for each demo to make sure they were all functioning. Check! As Jon started to clear his laptop away I started to prepare mine at the front of the room. The A/V guy came over to help me get the microphone attached and tested. There was about 15 minutes between sessions, which goes very quickly when you’re getting setup and fortunately the tech check took my mind mostly off having to speak. Before I knew it, it was time to start. Ian Cooper, one of the event organisers, introduced me and that was it, I was off. Launching into my well-practiced introduction I soon found my confidence and the nerves started to ease. Within a few minutes I was enjoying myself and the room seemed engaged with what I was saying. I was trying to scan the faces around the room as I was speaking. The demos also proved to be successful – hooray! I was checking my timer at each slide change and I was nicely on track, generally only a few seconds outside of my target times. I was extremely glad I had prepared a timing sheet as it gave me the confidence that I progressing as rehearsed.

Before long the timer was at 40 minutes and I was wrapping up the final slide. This was spot on since I’d allowed about 5 minutes for questions from the audience. As I was clearing down my equipment a number of people came to speak to me in person and each one said some very positive things. It was nice to be able to interact directly with people, get a feel for how it had gone and also answer some further questions. Hearing from people that it had been a big help and a great introduction made all of the time spent preparing feel very much worthwhile. Later I would get sent my feedback scores for the session, captured via an online feedback system.

Fantastic session! Learned lots!


Session was good, I enjoyed it!


Needs improvement, expected more from this session.


I am very happy with these scores, especially for a first conference talk!

Conference No. 2

I stepped off the plane in Germany, ready for my next conference. I would soon become an international speaker! It was very exciting to have a second opportunity to speak so soon after the first but it was also quite daunting to be doing this one outside of the UK. I’d arrived on the Sunday afternoon to give me time to get settled in and to attend the speaker dinner.

My first talk was on day one of the conference, just after lunch. This would be the 70 minute version of my Docker talk. In the morning I got up early to give me time for a run-through of the presentation. I hadn’t rehearsed this talk since giving the 45 minute version in London, so I wanted to refresh my mind for the timings. Again, I had a full timing sheet for the presentation and it meant that I was able to stick pretty close to the plan. With the rehearsal a success I treated myself to a quick breakfast and then headed to the conference venue, a few minutes’ walk from the speaker hotel.

Being a predominantly German speaking conference this presented some additional time to review my slides and gather my thoughts before my talk. There was little to gain from sitting in a German speaking session. This proved to be a double edged sword though. In London I had been attending the prior talks and so while I didn’t spend time on practicing immediately before my talk, I also had my mind taken off the fact that I would soon be speaking. In Germany this was not the case and so I did have more time to get nervous leading up to my session. I do remember questioning whether I could really present for 70 whole minutes. During lunch my nerves really started to kick in and I couldn’t really eat the food on my plate.

20 minutes before my start time I went into Raum 1 (Room 1) to prepare. I like to have time to be sure all of the demos can connect and that my laptop connects to the HDMI system. As the talks were being recorded I also needed to get my microphone setup and to work with the tech staff to ensure the screen and audio was being picked up by the recording system. During this time the room started to fill with attendees… and kept filling. Just prior to the scheduled start time it was pretty full and a good proportion of the attendees from the conference were staring back at me. In this conference it would be a case of kicking off my session myself without an introduction. As the time ticked over to 1pm I started my timer app on my phone and began my talk.

I’d included a single line of German which translated as “Good day, my name is Steve…. And that is all my German”. As I’d hoped this triggered a laugh and in fact a small applause! It was a nice ice-breaker and put me at ease much more quickly than in London. After that I launched into the rehearsed presentation and the 70 minutes flew by. As in London, all of the demos worked and I was happy with the pace of the presentation. I did manage to make one typo when running through one of the demos but a helpful audience member helpfully pointed it out. It was a tense second or two for me as I realised something had not gone quite to plan, but it was a only minor glitch and no one seemed to mind.

The session generated quite a lot of questions which I spent a few minutes answering. One of the attendees did seem to have missed an early point that I think had led to some confusion on why we were using containers. I spent a bit of time clarifying. Afterwards another attendee found me and spoke to me privately, explaining that I’d been very clear and not to worry that one person had got a little confused. This was very re-assuring as I wasn’t sure if the content or perhaps language barrier had made my talk confusing. He didn’t think so and said that a few other people had commented on learning a lot from the session. It’s important to remember though that it is possible to loose people and that any keys points early in a talk should sometimes be re-iterated to give people a second chance to catch up. It’s a small thing, but something I will try to remember when building my content in the future.


That brings us up to date with my short but exciting speaking career so far. This is hopefully only the beginning of my journey and as it turns out… I don’t hate public speaking! I had a fear of it which meant I avoided doing it, but fears can be beaten. Having faced that fear, I feel much more comfortable giving talks. Don’t get me wrong, I do still have nerves and stress before speaking, but it’s far more manageable and I now know that the resulting buzz from speaking will outweigh those nerves. I still have lots that I can improve in terms of presentation style and experience that needs to be gained but I’ve made some important early steps. There’s a huge amount of satisfaction from being able to stand up and share with others, to help them understand something new and to inspire them to go and learn more. So what next? I hope to find more conferences and user groups that I can speak at and I already have ideas to start developing some future talk topics as well.

I’m very thankful to a number of people along the way who have offered encouragement and advice. In particular I want to offer thanks to Dylan Beattie, who helped give me the break at my first conference and offered his support to gain some valuable speaking experience. A special mention goes to my wife who put up with me regularly disappearing into the office to rehearse and develop my talks. Many hours of my free time were devoted to these tasks and my wife supported my efforts and encouraged me through periods of doubt I had about speaking. This encouragement and support cannot be underestimated in helping me to start my journey and develop myself as a speaker. I hope by sharing this post that perhaps I can encourage some other potential speakers to take the first step and like me, learn not to hate public speaking.

That’s my candid story and I hope this divergence from technical blogging has been useful to some of the readers who have stuck with me for around 7,500 words across these two long blog posts. Coming up soon I plan to write some much shorter posts where I will get more practical and share some tips and techniques from my limited speaking experience so far. I’ll update this introductory post with links once those posts come online. Thank you for reading and if you’ve been even slightly tempted to try public speaking, please do give it a go and let me know how you get on.

How To Not Hate Public Speaking (Part 1)

I hate public speaking! I HATE public speaking! I HATE PUBLIC SPEAKING!

That would have been my emphatic and unwavering response only eight or nine months ago if you had asked me about my thoughts on having to speak in public. The idea of speaking in front of even a small group of people whom I knew reasonably well would have sent shivers down my spine. It would have made my palms sweat.

So what if you asked me that same question today?… It turns out; I actually quite enjoy public speaking!

Fair warning: This is a long blog post. I have split it into two parts, but it’s very much story driven and the detail was needed to give the full picture and to share my personal progression to becoming a technical speaker. I plan to create short, more digestible posts that will follow this one to expand on the benefits of speaking and some tips and techniques I’ve used to date.

I’d love it if the result of this post was to inspire a few other developers to take the step towards presenting in public. If I can do it, you certainly can too! We’re in an ever changing industry where there are lots of possible solutions and approaches to solving problems. Sharing the wealth of knowledge and experience within our communities can only help bring up the overall level and help every developer to keep up and improve their skills. I have learned a huge amount from listening to many hundreds of hours of recorded talks and I decided it was time for me to try and give back. This is my story…

Chapter 1: Hating public speaking

I don’t have a specific reason why, but I’ve never enjoyed public speaking. I would actively avoid it in any environment and with any possible excuse. My first memories of this dislike were in school. If we ever had to give a speech or presentation in front of the class I would panic. The thought of everyone staring at me and judging me set my heart racing. It’s funny; I don’t really remember the actual moment of making speeches though, mostly I remember the fear leading up to it. I do know that I wasn’t ridiculed or made fun of afterwards. So why did I still hate it?

One factor contributing to my fear may be my introverted nature. I am okay talking within small groups of people that I know but put me around strangers and I do tend to close up. I like to listen but I find it harder to put myself out there into the discussion. I’m not particularly good at small talk, finding it hard to think of things to say or ask; usually until after the conversation, at which point I come up with a ton of questions! Generally I’m happier when I’m not the centre of attention and therefore, speaking in public is taking me out of my comfort zone.

My next memory of having to speak in public was some years later when I was asked to be a best man at my friend’s wedding. I was honoured to be asked, but not long after that I realised that I would need to speak… in front of people! Lots of people! I spent the weeks leading up to the wedding working on content for my speech. I’m not sure how many times I read out my script to myself, added bits, cut bits and then added them back again. By the time the big day arrived I had a few pages prepared.

All through the day, a level of dread built up in me. By the time we sat down for the meal and my moment approached I was at a pretty high state of fear. I wasn’t really hungry and decided a glass or two of alcohol would help. It didn’t! Let me stress; I didn’t get drunk or anything, but the edge certainly had not been taken off as I had hoped it might be. Soon the desert was cleared away and at that point I may have briefly considered making a run for it! There were two speeches before me but before long I was up, it was my time with the room. I stood, hands shaking a little, heart beating, pores sweating and surveyed my audience. I hated them! I hated the groom! Most of all I hated public speaking!

I began the speech. My voice was cracking and I hated it. I noticed my eyes were watering. Not crying, but definitely moist. Noticing those things only served to make it worse and I hated that too. I pushed on, speaking the lines I’d agonised over getting just right, trying to hit the necessary inflection and pauses to make the audience laugh. I don’t remember it all that clearly but I made it through. During the speech people laughed, not at me but with me. Later, friends and even some strangers would tell me what a good job I’d done. Personally, I was just extremely glad it was over.

A year or so later another close friend got married and this time I was happy not to be given the honour of best man, simply because I could enjoy the event without having to concern myself with speaking; or so I thought! As it turned out a friend and I were given a short slot during the best man speech to “say a few words”. We came up with a little script of funny stories that we could present almost as if conversing with one another. Again, I don’t remember too much about presenting the speech but I do remember feeling really apprehensive beforehand. Something I did learn at this point is that the fear of speaking is way worse than actually doing it. The guests seemed to enjoy our cameo and congratulated us afterwards. A job well done.

So far this blog seems to be a story of weddings, but as it turns out, those are the main times I really had to speak to a large audience previously. During that same timeframe I’d led meetings on the phone and in person for my job. I was generally okay with those since the audience was small and it was less one sided. I do recall some cases where it was mostly up to me to present a set of slides or content at a meeting and before those I would often feel a little stressed beforehand.

Okay, back to weddings, this is the last one, I promise! The next wedding I attended was my own and I certainly couldn’t avoid speaking at that one! This was the speech which I worked most hard on; preparing, refining and rehearsing over many weeks. Speaking as the groom, it’s a little harder as you can be less reliant on using jokes as a mechanism to engage the audience. My one advantage was knowing all of the guests which I think that did make it slightly less intimidating. In this instance, with everything else going on, I only really had time to be nervous just before speaking. I think it was during my father-in-law’s speech that I realised that I was next and started to panic a little. However, I do remember with this time speaking felt much more natural. Perhaps I was starting to get conditioned to speaking for an audience?

Chapter 2: Starting out with technical speaking

In late 2016 I made the decision that I wanted to develop my public speaking skills and I decided to start by giving some technical talks at work. This was a very conscious decision on my part. I had admired and was indebted to the many fantastic and varied speakers who, over the years of watching recorded talks or attending conferences, had helped me learn so much. They made it look effortless and in only 60 minutes could take me many paces forward in my self-development. I recognised that public speaking is a very valuable skill. To be able to stand before a group of people and teach, inspire and inform is incredibly powerful. At a smaller level it can help in both one’s career and personal life. My wife is a teacher and I am awed at her ability to educate her students and to help set them towards success in life.

Whilst not in any way ready to stand in front of a class of 30 teenagers, I really did want to share my experience of and passion for ASP.NET Core with my colleagues. I decided to try and put together a one hour talk on the topic. It seemed like a great idea when I first came up with it and scheduled a date for just over a month in the future. I’ve become a big fan of blogging as a mechanism to share content within the developer community. By speaking I hoped I could build on this by communicating my content in a different form, including demos and emphasising my points to hopefully inspire people to try it out. A main difference between speaking and blogging is that you gain feedback from the audience as you speak and can adapt where necessary. If their faces imply they might not have understood something, you can reword it and try a different tact. If they have questions you can respond to those in a two way conversation. I was inspired by great technical speakers, like Scott Hanselman for example, who make presenting technical content while remaining entertaining look so effortless.

I spent a lot of time over that next month developing content for the talk. The first thing I learned was that it was a lot of work; far more than I had imagined. I started with a bit of an outline in my mind and from their began to pencil in some slides and bullet points to cover. I found myself regularly researching things to validate that I had understood them fully and could accurately speak about the technology. Once I had a reasonable outline, I started working on the demos. I planned to show the process of building up a basic MVC project, starting with “dotnet new” at the command line. I would demonstrate the concept of middleware and the Startup class along the way. Building the code itself wasn’t too complex, but working out how to explain it and build up in small steps was harder. I didn’t want to go too deep too quickly and loose anyone along the way. I was also conscious of needing to type code whilst also speaking so I tried to work out how to avoid long pauses while typing. In the end I prepared a set of snippets that meant I could copy and past a lot of the code into the project as I demoed the features.

I spent many hours refining the content and practicing the slides and demos to myself at home. I went over and over and over everything until it was pretty much burned into my mind. I have quite a bad memory so I was worried that the content would be forgotten by the time I came to present it. I even put my wife through one of my final rehearsals, despite her lack of programming experience. She very kindly listened and gave me some feedback after I had finished. Even presenting it to just my wife at home, I realised I felt nervous and quite self-conscious standing and speaking in front of her. I was starting to regret the idea!

Before I knew it, the big day had arrived. I was very nervous and for most of the morning I couldn’t stop thinking about the stupid decision I’d made. I wondered if I could reschedule to give me more time to get used to the idea. However, I realised that I was as prepared as I could be and that I should just get it over with. 10 minutes before the start I headed into the meeting room to prepare. I wanted to make sure my personal laptop would connect to the TV in our board room and that all of the demo content was at the correct font sizes to be seen clearly. I was super anxious by this stage and found myself hoping that no one would turn up at all. That would at least give me a way out. However, to my disappointment, people started to arrive. I’d sent the invite to all developers so was unsure exactly how many would turn up. In the end I think I had about 12 people in the board room with me. It’s a reasonably small number but surprisingly intimidating at that moment.

Time slowly ticked down until the scheduled start time arrived. I took a big breath, stood up and launched into my talk. I worked my way through my introductory content from my slides just as I’d rehearsed. After the first few minutes as I hit my flow I do recall that it got easier to present. My colleagues seemed engaged in what I was sharing with them. I got through my slides a little quicker than I’d expected. I realised that I had been talking faster than in my much calmer rehearsals to an empty room.

With my slides complete, it was onto the demos. This generated an added level of anxiety since there was the possibility of things not working at expected. Despite having practiced it many times, I had watched enough technical demos fail during presentations in the past. I didn’t have much of a plan B if things started to go south. I found that the hardest part was definitely smoothly typing and working the screen, whilst also talking and trying to make eye contact with the audience. The demo went well and everything worked as I’d planned and practiced it. All that was left was to wrap up my summary slides and to take questions. I think I only had two questions, so either I’d covered everything, I’d lost some people along the way or people were shy. However, once it was all over, quite a few people approached me privately to offer their thanks and to say that they’d enjoyed it. I got one piece of written feedback via an online recognition tool that particularly made me smile…

“Gave an outstanding talk on a complex technical subject: thoroughly researched, clearly explained. One of the best prepared and delivered technical talks I’ve attended at Madgex.”

This was very encouraging to read and I thank that person for his very kind and valuable feedback. I’d found it very hard to judge how well the content had gone across so seeing this made me realise that I’d done a pretty reasonable job. It was encouragement that I very much needed at the time and I urge you, if you ever attend a talk, do let the speaker know if you enjoyed it. All feedback is valuable but for new speakers especially I think hearing encouragement or positive feedback is so important. For me personally that comment gave me the confidence boost to consider future talks.

After I had time to reflect on the experience I decided that although I’d been very nervous before I started, I had actually enjoyed sharing the content and teaching people about ASP.NET Core. The fact that I’d been able to introduce people to it and get them interested to learn more was very satisfying. I made the decision to plan another talk to develop my speaking skills and face my public speaking fear once again.

It was some months later in early 2017 when my next opportunity presented itself. I happened to mention to Mike Hadlow who runs the Brighton ALT.NET group that I was thinking about trying to do some external talks in the future. I wanted to step it up a level and move further out of my comfort zone. Speaking to colleagues internally was a great step, but I wanted to push myself more. It was great timing as he was in the process of planning an evening of four 20 minute lightning talks. He asked if I would like to be put on the list to speak and before I knew it, I had agreed!

I decided fairly early on that I wanted to develop a talk around my experience of contributing to the allReady open source project run by the Humanitarian Toolbox. This is a charity focused on providing sustainable software for use by disaster relief charities that I’m passionate about being a part of. Richard Campbell, one of the co-founders of the charity had recently given a keynote at NDC London, speaking about the project. I got in contact with Richard and asked if I could re-use some of his content and slides since he’d given a great introduction to the motivations and history behind the formation of Humanitarian Toolbox.

With Richard’s slides in hand I went about crafting content for the talk. Originally 20 minutes had felt like a long time to fill, but during rehearsals I soon realised that I had over 30 minutes’ worth. I worked on cutting it down and refining it until I had around 22 minutes. I knew from my previous talk that I speak quicker when presenting for real vs. rehearsal so this seemed like a sensible idea. I was aiming for around 16 minutes of speaking, with 4 minutes for questions at the end.

Again I spent many hours rehearsing the talk to myself (and sometimes the cats) at home. I find that the best process for me is to present to a fake audience. I stand up and practice not only the content but presenting it clearly and with good vocal projection. It feels strange but it really does help me to find a rhythm. I time each run through, sometimes pausing to make notes or revisions to the slides when something doesn’t sound or feel right. I also focus on looking up and out into the imaginary audience. It’s important for this to feel natural and it also forces me to ensure I’m not simply reading from the slides or my notes. The preparation was a little easier since I didn’t have a demo to build or rehearse this time around. The downside however was that this talk would be all about what I was saying. Technical demos have the advantage of taking the direct focus off you for a little while.

Before I knew it, the evening of the talks was upon me. I was starting to have serious doubts if this had been a good idea. In fact I was fairly sure it was a crazy idea. I had no idea how many people to expect and the thought of standing in front of a group of strangers was filling me with a strong and steady dread. I couldn’t back out now… could I? No, I couldn’t let anyone down. I was committed and I just needed to step up and do this.

At 6pm I met some of the ALT.NET attendees, along with Mike (the organiser) and some of the other speakers at a local restaurant for a quick dinner. I didn’t feel much like eating but knew I needed something to see me through the evening. From there we all walked to the venue and got the space setup. Before long, the talks where due to begin. I was third to present of the four speakers that evening which left me with 40 minutes to slowly sweat and worry about having to speak. The build up is definitely one of the worst bits for me. Five minutes before my talk I went off to have a nervous pee and to compose myself in private. This has now become a sort of ritual for me, not having a pee (although I do recommend speaking on an empty bladder), but to take five minutes just before speaking to clear my head, take a few deep breaths and try to relax.

At the allotted time I stepped onto the “stage” and got started. I find the first few minutes of a talk the hardest. It’s the time when you first have to engage with the audience and take the centre of attention. My voice, along with my hands was a little shaky to begin with. After a couple of minutes I started to relax and the flow from my rehearsals took over. I was reasonably comfortable with all of the eyes on me. Everyone was listening intently and even laughed at a couple of small jokes I included along the way. The time flew past and before I knew it I was on my final slide. I’d finished in about 15 minutes, so still faster than practice but about what I had been expecting.

During questions at the end I got a lot of engagement and I was pleased that people had been taking in what I’d been saying. With the questions answered, I could relax and accept my round of applause. I spoke to a few people after the event and the feedback was great. Everyone I spoke to was either being polite or had enjoyed the talk. One of the speakers that evening was Dylan Beattie, a name I knew, but whom I had never met. Dylan is a more experienced speaker and has presented at a number of large conferences. I managed to ask Dylan for his thoughts about my talk and his feedback was very encouraging. A few people I spoke to seemed surprised that this had been my first external talk. I took that as a really good sign of how the presentation had gone.

A few weeks later, buoyed by the success of the evening the next thing I did seems pretty crazy to me, even now. I submitted to speak at a conference… What!!? Yeah, I’m still not sure exactly what possessed me!

On that nail-biting cliff-hanger I’ll wrap up this post. Join me in Part 2 to find out what happened next.

.NET South East September 2017 Meetup With guest Jon Galloway

Last night was the second .NET South East meetup event and it was a special one. Through a bit of scheduling luck I was able to co-ordinate with Jon Galloway and make plans with him to join us for the evening; before returning with him to London today to attend the Progressive .NET conference.


After our first event we decided to slightly refine the entry and sign in process to make it easier for our Madgex volunteers to manage. We decided to sign in the attendees downstairs in the foyer with two volunteers – Chris and Martin – kindly helping to do that. We also moved our networking area (where we provided snacks, soft drinks and beer) into our office entrance area. There was a little more space for people to talk and it made it easier for Trev, another volunteer on the evening to watch for anyone trapped in the corridor when returning from the toilets!

As expected, we had major interest in this evening, with the RSVP limit of 60 reached in about 24 hours of announcing the event. With a few days to go our RSVP list had grown to around 14 people and it was clear we had a good chance of full attendance. From the last event we knew that 60 would be pushing the available space to its maximum. This presented a slight concern as we were conscious that whilst we wanted to accommodate everyone who arrived on the night, we might have people showing up who were not on the list. We had announced beforehand that to be as fair as possible we would have to limit entrance to those on the RSVP list. In the end we had a few last minute cancellations and no-shows so our numbers were about perfect.

The Event!

On the day of the event, Madgex had held a company meeting in the space we would be using for .NET South East. This was quite handy since it meant most of the chairs were already out and setup. After the company meeting I spent the next hour making sure everything was neat and in order. As with the last event, time seemed to disappear very quickly. This time the Madgex staff decided to order pizza which was rapidly consumed before the event began. 

At 6pm I headed out to meet Jon at his hotel, just around the corner from our office. It was great to finally meet Jon in person after chatting back and forth for a little while. We walked back to the office together and ran through the rough plan for the timings of the evening. Once in the office we did a quick technical check to make sure Jon’s laptop would output on the large TV we use for the event.

This month, I had decided to bring in my dSLR camera (5D Mark II) and a couple of lenses for the evening. Outside of developer work, my wife and I are (occasional) semi-pro photographers and so have a lot of equipment from photographing weddings etc. The photographic results from the first meetup were a little poor due to the low lighting. Despite our best efforts, most were either noisy, blurry or both. I hoped that by bringing in the pro gear I could hopefully get a few more shots to use to promote future events. I’ve yet to have time to check and process the photographs from the event. The ones included here are from my phone. I’ll add more at a later date.

In the end we had 53 attendees (including myself) and filled every seat in the room. A massive thanks again to everyone who attended the event. It was great to see some new faces among those returning after the first meetup in August. I’m terrible with names and faces so apologies to anyone I had forgotten from the first event!

Intro and News

Just after 7pm we gathered everyone in the conference room, ready for the event. I opened the evening with my introduction, including thanking our fantastic sponsors and then went on to discuss some of the news items I had gathered for this month.

SignalR Core Alpha

The first topic I touched on was the upcoming release of the first alpha of SignalR Core. I was a little premature in this news item as technically the announcement is not due until later this week. I was basing this news item from a pre-announcement-announcement by Damian Edwards during the ASP.NET Core community standup. This is SignalR re-imagined and re-written on top of ASP.NET Core 2.0. SignalR is a real-time framework to support cases where you need to send messages from the server to connected clients in real-time. Application can include classic chat scenarios, gaming, real-time dashboards and notifications.

To learn more about what the team have been working on you can view this video from Microsoft Build 2017.

Source Linking

The second news item I focused on was the ASP.NET Core support for Source Link, a feature which now enables us to debug into the ASP.NET Core source from our application. This is a useful feature, particularly for learning more about how ASP.NET Core works under the hood. I shared details of my early use if this feature, along with a few items I could not get working. I mostly referred to the information I’d collected for my Debugging ASP.NET Core 2.0 Source blog post.

.NET Standard 2.0 and .NET Framework 4.6.1 Issue

The final item I decided to include was some information about an issue with .NET Standard 2.0 with .NET Framework & NuGet as documented in this GitHub Issue. The short summary of the issue is that in some cases, when consuming a .NET Standard 2.0 library from a .NET 4.6.1 project there can be runtime crashes or compile time warnings due to the handling of dependent assemblies. This stems from two possible causes, the possibility of missing binding redirects and/or entire missing binaries. The team are aware of the causes and are working to address this in Visual Studio 15.4. In the issue Immo Landwerth provided some workarounds that might help in the interim.

.NET Conf

I also mentioned the .NET Conf event again, which is running in September. It’s a free, streamed conference organised by Microsoft which include a lot of great .NET Core 2.0 and ASP.NET Core 2.0 content from experts in their field.

I hope the news content is adding some value to the monthly events. I didn’t feel that my presentation was quite as polished as my first time. Partly due to having to try and consume and remember the key points of the items, with only a little time to absorb it. The tough thing with news is that it’s, well, new! So pulling together a few cohesive points and then talking about them without rehearsing is not that easy for me. Maybe I can convince a sponsor to provide a teleprompter for the next one!


With such a rare opportunity to have someone directly linked to the ASP.NET team join us we took full advantage, with Jon kindly presenting two talks during the evening.

Jon Galloway – What’s new in ASP.NET Core 2.0

Jon Galloway - Introducing ASP.NET Core 2.0

In this talk, Jon managed to pack in a summary of the many new ASP.NET Core 2.0 features. It was a demo packed hour as Jon discussed and showed examples of the improvements since the 1.x release.

Jon started with a quick overview of .NET Standard 2.0 and why this is an important feature for developers, providing better compatibility of libraries between the different platforms. Jon likened the .NET Standard to HTML specs which is a good analogy to understand why we need a standard. Jon gave an example of Keen.io who develop an event data platform. They were able to take their existing PCL libraries and convert them to .NET Standard 2.0, simplifying code sharing between their platforms.

Jon went on to talk about the new AspNetCore.All metapackage which takes advantage of the runtime store which now ships with the .NET SDK. This store provides pre-jitted, optimised versions of the packages which any application using the .All meta-package will take advantage of. Jon also demonstrated the simplification and changes in the Program.cs and Startup.cs files.

Next was a big new feature in ASP.NET Core 2.0, Razor Pages. This is a new pattern built on the existing MVC system which aims to simplify and remove some of the ceremony of the traditional MVC pattern for less backend-heavy pages. It’s a feature I really need to spend some time taking out for a spin.

Jon then showed some of the additional templates we have available for ASP.NET projects, such as Angular and React. These stem from Steve Sanderson’s work on Javascript Services.

Jon concluded with a big slide of smaller features and improvements that all made it into ASP.NET Core 2.0. It was an information packed session and really great to have all of the key changes made easily accessible to the audience. We had a good mix of developers, some who had used ASP.NET Core and some who had not yet had chance to work with it. This talk had something for everyone.

Jon Galloway – The .NET Foundation

Jon Galloway - .NET Foundation

In Jon’s second talk the theme was the .NET Foundation, of which Jon is the Executive Director. In this 45 minute session, Jon took us through some of the goals of the .NET Foundation and explained the work they do with open source projects.

First Jon talked through some of the phases of open source contribution for developers. This was a scale from the fear and uncertainty that developers and business can feel about even using and consuming open source, up to fully embracing it, sharing and maintaining open source projects with public roadmaps. More details about these stages can be found at A Wider NET.

Jon then detailed at a high level some of the phases of Microsoft’s own adoption of open source, from the earlier toe in the water with some source open code (read, don’t use or change) through to where they are today, developing out in the open with .NET Core, ASP.NET Core and even things like the documentation and the C# language specifications.

A small part of the .NET Foundation is to act as an ombudsman between open source projects and consumers to try and ensure that the project is acting in the interests of its users and responding appropriately to legitimate issues. A much larger part is the support the .NET Foundation can offer to projects in the form of sponsorship as part of the community project membership. This is not about monetary funding, but about providing advice and services to the projects. This can include things such as helping set up wildcard certificates or providing some Azure credits for example. The goals here are to help make sure the projects continue to thrive and do not die out. This is a very important thing for consumers of the libraries, particularly in enterprise situations, that may rely on these projects in their code. The foundation does not run the projects but works to support them as much as possible. Jon likened this to Open Source as a Service!

Jon also talked about the recent .NET Summer Hackfest, a 6 week event aimed at getting new contributors into open source with support from some great projects such as Brighter and Humanitarian Toolbox. Jon hopes to makes this an even bigger event next year. Contributing to Open Source for the first time can be a daunting prospect and the idea of bringing forward some friendly projects who can put together some smaller, bite-sized issues that new contributors can pick up is a great one.

It was really great to hear about what the .NET Foundation is doing to support the .NET ecosystem and to help the community open source projects to thrive and be sustainable for the long term.

A bit thanks to Jon for fighting through the jet lag to present these two great talks and for making the arrangements to come straight down to Brighton from the airport.

Prize Draws

With the end of the evening closing in, before heading off to the pub we drew the winners of the prizes from our fantastic sponsors for the event. The prizes we had to offer were:


One year individual subscription to any single JetBrains Toolbox product


  1. UI for Xamarin license code
  2. T-Shirts x 5


  1. ebook of choice


6 months Small Business license

Last time I draw names from a bowl. A bit low tech and also time consuming to print and cut up all of the names. Dan Clarke, fellow .NET user group leader has created a desktop app which randomises winners from the Meetup.com RSVP list. He has kindly provided the application code on GitHub. For this event I decided to give that a go. It worked quite well and simplified things nicely, although I was still conscious that at the end of the evening, it takes a little time to draw all of the prizes. One big advantage is that it stores the winning member ID so we don’t have to worry about duplicate names causing us to require some kind of tie-break. I am pondering whether for the next event I pre-draw the names using the app to save some time.

The rules as with the last event were:

a) names are added from the RSVP list (as at about 1 to 1.5 hours before the event)
b) if the name drawn is not in attendance, we redraw.

Next events

We have some great speakers lined up for the next couple of months, and I’m working with a few people of plans for the next couple of months after that.

.NET South East October 2017 – Rabeb Othmani
Rabeb joins us with her talk “Welcome to the age of conversational interfaces” – looking at how we can build interfaces using SMS, voice and bots.

.NET South East November 2017 – Michael Newton
Michael joins us with his talk “Making Distributed Systems in .NET Easier” – discussing distributed architecture with .NET.

Call for speakers

I’d love to get a range of varied content and speakers to present at our user group. We have a nice pipeline for the coming months but those months will fly by very quickly. If you’d be interested in speaking at a future event we’d love to have you. Please get in touch via the contact form on this blog or ping me on Twitter and we can discuss availability and topics.

I’m really keen to draw as many speakers from our local community too so please let me know if you might be interested in speaking. Perhaps you have presented a talk internally and could open it up to a wider audience. I highly recommend speaking as a way to develop professionally. I’m happy to offer advice for new speakers and help where I can.


Some links from this months event:

Debugging ASP.NET Core 2.0 Source Code Using ASP.NET Core symbols with Source Link support

In the early days of ASP.NET Core 1.0, before Visual Studio 2017, back when we had the project.json project format, we were able to take advantage of a nice feature to enable source debugging of referenced libraries and code. We could add the paths of cloned source repositories into our global.json file and these would then be preferred over Nuget when available.

I used this quite extensively when writing some of my posts for my MVC Core anatomy series (something I hope to get continue with at some stage). I blogged about how we could set this up in this previous post – Debugging into ASP.NET Core Source. Unfortunately with the switch back to MSBuild and csproj, we lost the ability to easily debug through the ASP.NET Core source files.

Yesterday during the ASP.NET Community Standup Jon Galloway highlighted a tweet by David Fowler regarding new ASP.NET Core source linking support. Damian Edwards went on to provide some more detail about this new feature and afterwards I decided to take a quick look at it myself. I expect this post to serve as an early introduction to source linking and I will hopefully blog on more detailed elements once I’ve had time to explore them more fully. For this post we’ll focus on how we can get started with debugging into the ASP.NET Core source using source linking.

What is Source Linking?

Let me caveat this explanation with the fact that symbol files are not something I’ve previously messed around with besides knowing that PDB files existed. I’m coming at this blog relatively fresh. I’ll be explaining things as I’ve understood them so far and will happily make corrections and updates if necessary.

Like me, you may have noticed PDB files being created under some circumstances when compiling your code. These files hold the symbol information which can optionally be used to support debugging into external source. Some types of symbol files may contain some of that source code or mappings to the source code.

For a long time Microsoft have hosted Symbol servers which hold published symbol files for the Microsoft products such as .NET Framework and ASP.NET Core. Visual Studio supports downloading symbols dynamically. To do this you must disable the “Enable Just My Code” option in the Debugging > General options. By default this option is enabled in Visual Studio.

Enable Just My Code Option

For more information on Symbols, Symbol Servers etc see this MSDN link.

Source linking allows you to embed a manifest inside the symbol file. For a given method name and location in the method that is being called it can identify what file contained the code and where it can be retrieved from. The ASP.NET Core libraries (not .NET Core currently) now support Source Linking and provide links to the code which is hosted on GitHub.

Enabling and Using Source Linking

The first requirement is that you are running Visual Studio 2017 on the latest update (15.3) which added Source Link support. With this installed if you check the Debugging > General options you will see Source Link enabled.

Enable Source Link support

As well as ensuring “Enable Just my Code” is not checked you must also enable the Microsoft symbol servers. In the Debugging > Symbols options you can check the “Microsoft Symbol Servers” from the list of symbol file locations.

Enable Microsoft Symbol Servers

When enabling the symbol servers you will need to accept the possibly the performance impact that it may introduce when debugging.

Symbol Server Performance

We are now setup and ready to debug into the ASP.NET Core source. To test this I created a default ASP.NET Core 2.0 MVC project inside Visual Studio. I then added a break point to the Index action on the HomeController. I then started debugging the application. The first time when debugging you may see messages like this in the status bar.

Loading Symbols

This is the symbol files being downloaded and may take a short while to complete.

Once you application is running and the breakpoint in your code is hit you can navigate down the call stack to see all of the external ASP.NET code that is being executed.

Call Stack Source Link

 If you double click any of these calls the editor will use the symbols to determine where that code is located for the frame. Using the link inside the symbols file, Visual Studio will download the source file from GitHub. When Source Link needs to download source you will see a warning dialog like this:

Source Link Dialog

You can chose the first option to download for this specific source file and continue to debug using that file. If you chose the first option you will see this dialog for each new source file that is required. You can select the second option instead which will download the file and disable the warning for future files.

Now that we have the source it will be displayed at the appropriate location from the frame you selected.

Source Link External Code

Now that we have the source file, you can also add your own breakpoint somewhere else within that file which will then be set to be hit when debugging your application. Even if we stop debugging and start again, this still seems to be hit successfully.

External Source Breakpoint

I was also curious about how we could set breakpoints in other parts of the code, without having to rely on access the source via the call stack. Damian mentioned a feature I’d never used where we can set a breakpoint manually from the breakpoint window. I have attempted to set a new function breakpoint up to one of the ASP.NET Core methods but so far I haven’t been able to get it working as Visual Studio states that the source is not available. I will pursue this and hopefully include details in a future post.


It’s great to see the beginning of easier debugging of external source coming to ASP.NET Core. Already there is value that I can gain from this feature to allow me to debug into the ASP.NET Core source to understand the internal workings. It’s not a sweet as what we were able to do back in project.json days but is certainly a step forward since we went back to csproj and MSBuild.

I miss the simplicity of cloning the full source for a repository and being able to navigate through it and add breakpoints to the external code. The source linking mechanism is good for more specific debugging cases where you want to dive into the external call stack. At the moment, once you have the source cs file via Source Link, you can’t navigate to other methods so exploring the code and setting further breakpoints is not possible outside of that file. If I can get the manual breakpoints working then that will be slightly better as at least I can view the source and determine methods I might want to break on, then set those up manually.

Chatting to David Fowler on Twitter I also understand that more features are being planned so I’ll be watching for those with interest. In addition, work is underway to get this supported by other non-Microsoft OSS projects such as Xunit and maybe in the future, JSON.NET. This repository (which I’ve not dug through yet) provides some build tools which can help creating source link symbols. I will also be looking at this more in the future.

Further References

Portable PDB files

Source Link