Sr. Content Developer at Microsoft, working remotely in PA, TechBash conference organizer, former Microsoft MVP, Husband, Dad and Geek.
156175 stories
·
33 followers

Let’s catch up with C#! Exciting new features in C# 9 to C# 14! - Filip Ekberg - NDC Copenhagen 2026

1 Share
From: NDC
Duration: 1:00:18
Views: 25

This talk was recorded at NDC Copenhagen in Copenhagen, Denmark. #ndccopenhagen #ndcconferences #developer #softwaredeveloper

Attend the next NDC conference near you:
https://ndcconferences.com
https://ndccopenhagen.com/

Subscribe to our YouTube channel and learn every day:
/ @NDC

Follow our Social Media!

https://www.facebook.com/ndcconferences
https://twitter.com/NDC_Conferences
https://www.instagram.com/ndc_conferences/

#dotnet #csharp #code

With every iteration of C#, we get more and more features that are meant to make our lives as developer a lot easier.

Let's explore what's new in C# 9, 10, 11, 12, 13 and 14!

We will look at how the language has changed and why these changes to the language will make us better C# developers, with less bugs in our code.

We will cover the following features:
- Nullable reference types
- Pattern Matching in C# 8 = C# 14
- Init only & new
- Record types
- Primary constructors
- Collection expressions
- Extension members

We'll also take a look at what's new in C# 14!

Read the whole story
alvinashcraft
12 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

Machines, Learning, and Machine Learning -

1 Share
From: NDC
Duration: 1:04:19
Views: 135

This talk was recorded at NDC Copenhagen in Copenhagen, Denmark. #ndccopenhagen #ndcconferences #developer #softwaredeveloper

Attend the next NDC conference near you:
https://ndcconferences.com
https://ndccopenhagen.com/

Subscribe to our YouTube channel and learn every day:
/ @NDC

Follow our Social Media!

https://www.facebook.com/ndcconferences
https://twitter.com/NDC_Conferences
https://www.instagram.com/ndc_conferences/

#machinelearning #ai #softskills

It wasn't all that long ago that "learn to code" was failsafe career advice, and whether you were studying for a university degree, enrolling in a coding bootcamp or just hacking on open source, the prospect of a well-paid job at the end of it was all the motivation you needed... well, times change. Whether you're looking for your first tech job or your next consulting contract, it's tough out there, and naturally, people are asking "what should I be learning next?"

What if that's the wrong question? What if the real question isn't what you learn, but how you learn it - and how to get started? Let's talk about motivation. Let's talk about all the wonderful tools and systems out there that make it easier than it's ever been to start exploring new languages and platforms, from Copilot and ChatGPT, to cloud IDEs and IOT microcontrollers. Let's talk about the all-important difference between programs and products; about the challenges of going from "hey, it works on my machine" to something customers will actually pay for. We’ll find out why open source projects succeed where well-funded corporate projects fail, why are there so many JavaScript frameworks – and why you’re still sitting up writing code at 3am, even though you know you have work in the morning.

Read the whole story
alvinashcraft
24 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

Tamir Dresher: Squad Agent Workflows - Episode 407

1 Share

https://clearmeasure.com/developers/forums/

Tamir Dresher is a Principal Engineer at Microsoft Threat Protection, where he focuses on scaling AI agent systems and distributed architectures, bringing over 15 years of experience building large-scale distributed systems. He is the co-creator of Squad, an open-source multi-agent runtime for GitHub Copilot that orchestrates AI teams directly inside your repository. Tamir is the author of "Rx.NET in Action" (Manning) and "Hands-On Full-Stack Web Development with ASP.NET Core" (Packt), and has been a lecturer in Software Engineering at the Ruppin Academic Center since 2013. A prominent figure in the Israeli and international developer communities, he is a Microsoft MVP alumnus who speaks frequently at global conferences and writes actively on his blog at tamirdresher.com.

Website / Blog - https://www.tamirdresher.com/ 
LinkedIn - https://www.linkedin.com/in/tamirdresher/
GitHub: https - //github.com/tamirdresher
Twitter/X - @tamir_dresher
Blog Post - https://www.tamirdresher.com/blog/2026/05/24/squad-watch-extensions-customer-success
Github - https://github.com/bradygaster/squad

Want to Learn More?
Visit AzureDevOps.Show for show notes and additional episodes.





Download audio: https://traffic.libsyn.com/clean/secure/azuredevops/Episode_407.mp3?dest-id=768873
Read the whole story
alvinashcraft
45 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

520: Inside the New GitHub Copilot App: Sessions, Canvases, Automations

1 Share

This episode dives into the new GitHub Copilot app — a hub for agent sessions, multi‑repo orchestration, PR‑first workflows, automations and the new canvas metaphor for triage and planning. James and Frank unpack how sessions can spawn and coordinate across repositories, agent‑aware merges that respect CI and code review, support for local models and extensions, and the token tradeoffs to be aware of. The canvas demos (swipe‑to‑triage, Kanban agent assignment) show how Copilot is trying to move beyond chat windows into real UX for developer workflows.

They also tour Windows dev work: embracing WinUI for native apps, using a Windows developer setup script, packaging and Winget publishing, and the power of Visual Studio 2026 for debugging, profiling and live XAML edits. If you ship apps or want agent-driven workflows, this episode is full of practical tips and honest caveats.

Follow Us

⭐⭐ Review Us ⭐⭐

Machine transcription available on http://mergeconflict.fm

Support Merge Conflict

Links:





Download audio: https://aphid.fireside.fm/d/1437767933/02d84890-e58d-43eb-ab4c-26bcc8524289/21f33004-c808-4f17-9783-64a9d61bb8b0.mp3
Read the whole story
alvinashcraft
58 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

Cordova Plugin InAppBrowser 7.0.0 Released!

1 Share

We are happy to announce that we have just released an update to cordova-plugin-inappbrowser!

Release Highlights

This major update makes the plugin compatible with cordova-ios 8.0.0, fixes layout issues with XCode 26 compiling for iOS 26, layout issues regarding not respecting the safe areas of the iPhone X and newer (iPhone 11, 12, etc.) and layout issues on Android when the footer is used.

Some other relvant changes:

  • Make zoom on-screen controls configurable on Android
  • Fixes issues ragarding the beforeload event on Android and iOS
  • Cookies or data were not properly cleared when the options cleardata, clearcache or clearsessioncache were set on Android and iOS
  • The callback context will only be changed for non-whitelisted urls (Android) or target _blank (Android/iOS)
  • Fix XCode deprecations warnings
  • In-app browser did not show when using cordova-ios 8.0.0

Please report any issues you find on GitHub!

Changes include

Breaking Changes

  • chore(ios)!: Remove unused private method (#1113) [b7ab3d0]
  • refactor(ios)!: remove property instance and getter method getInstance (#1116) [c5a0979]

Features

  • feat(android): make zoom on-screen controls configurable (#1023) [24c6738]
  • feat(ios): use UIBarButtonSystemItemClose since iOS 26 (#1138) [5cf7c2d]
  • feat(ios): Support custom scheme event for iOS (#1112) [03831d7]
  • feat(ios): correct code formatting (#1100) [fb5b469]

Fixes

  • fix: add data property for InAppBrowserEvnet type (#1118) [18ef50d]
  • fix: defer navigation until async cookie or data clearing completes (#1150) [1b0be4a]
  • fix(android): change callback context only on non-whitelisted urls or target _blank (#1147) [694adb0]
  • fix(android): beforeload event fires only once (#1146) [160e414]
  • fix(android): place footer below WebView instead of overlaying content (#1148) [56fb083]
  • fix(ios): fix white screen on iOS 13+ when in-app browser window scene is nil (#1131) [c1c6544]
  • fix(ios): render in-app browser underneath the status bar (#1158) [40ff663]
  • fix(ios): replace macro kCloseButtonSystemItem with static function to fix XCode warning (#1153) [60a5c73]
  • fix(ios): check callbackId with regex (#1152) [e0bd9dc]
  • fix(ios): suppress expected cancellation errors when beforeload is set (#1145) [0cea6cc]
  • fix(ios): Don't call beforeload on POST and beforeload=yes (#1144) [f71de8f]
  • fix(ios): set callbackId only on target=_blank, update readme (#1143) [6106897]
  • fix(ios): constraint warnings in iOS 18 and older (#1123) [bad3830]
  • fix(ios): add custom toolbar background (#1132) [c140eaf]
  • fix(ios): constrain address label horizontal to safe area for landscape (#1126) [de95bb2]
  • fix(ios): full width WebView on landscape (#1120) [22ebb87]
  • fix(ios): suppress deprecation warning for processPool fordeployment-target greater than 14 (#1119) [105b0ae]
  • fix(ios): remove use of deprecated CDVWebViewProcessPoolFactory (#1115) [f76988e]
  • fix(ios): simplify using CDVSettingsDictionary in older cordova-ios versions (#1105) [f67412f]
  • fix(ios): use cordovaSettingForKey: instead of objectForKey: (#1106) [540bfe3]
  • fix(ios): set minimum cordova-ios to 6.2.0 (#1107) [15714f4]
  • fix(ios): Use CDVSettingsDictionary since cordova-ios 8 [b52242a]
  • fix(ios): deprecation of UIActivityIndicatorViewStyleGray (#1104) [6f413e0]
  • fix(ios): replace UIBarStyleBlackOpaque with UIBarStyleBlack (#1103) [d4ae06d]
  • fix(ios): remove use of CDVScreenOrientationDelegate (#1101) [246f2a0]
  • fix(ios): use auto layout to respect safe areas (#1099) [375c02b]
  • fix(iOS): IAB not showing up in apps using UIScenes (#1067) [e2d8429]
  • fix(types): support beforeload listener signature in TypeScript defs (#1149) [e28ca69]

Others

  • doc(readme): improve addEventListener examples (#1142) [7a90dde]
  • doc(readme): update badges (#1140) [d922047]
  • chore(ios): remove pre ios 11 code in show:withNoAnimate: (#1135) [8d2845b]
  • chore(ios): resolve variable safeArea (#1121) [89cd5fe]
  • chore(ios): Cleanup code (#1117) [6b28d2d]
  • refactor(ios): refactor code for clearing data (#1137) [f40f41b]
  • refactor(ios): adding toolbar items (#1124) [b83a9b7]
  • refactor(ios): handle constraints in cases (#1125) [ddab657]
  • refactor(ios): remove unused method invertFrameIfNeeded (#1102) [dfce3c7]
  • doc(ios): constraint warnings on iOS 26 and using initWithBarButtonSystemItem (#1127) [42e12dd]
  • chore: Remove unused inappbrowser.css file (#1038) [eac7303]
  • chore: bump to major 7.0.0-dev (#1156) [cc727aa]
  • chore: bump version to 6.1.0-dev (#1108) [322182a]
  • chore: incremented plugin version 6.0.1-dev [f27c663]
  • chore: add changelog from 6.0.1 (#1159) [92a53a9]
  • chore: update npm package (#1134) [4f9d07d]
  • chore: gh-action workflow, license header formatting & cleanups (#1095) [1e4ab4b]
  • chore(ci): add/update release workflows (#1157) [e1cb106]
  • chore(deps-dev): bump @cordova/eslint-config to 6.0.0 w/ lint fixes (#1096) [4cf5c24]
  • chore(gitattributes): normalize line endings and binary detection (#1139) [675002f]
  • chore(INFRA): Set up default protection ruleset for default and release branches (#1151) [efd32a9]
  • chore(workflow): update workflows to the latest one of cordova-paramedic (#1141) [3fdfc96]
  • ci: remove osx (#1111) [c1eaf3b]
  • ci: sync workflow w/ paramedic (#1068) [dfde59d]
Read the whole story
alvinashcraft
1 minute ago
reply
Pennsylvania, USA
Share this story
Delete

A benchmark win is not the finish line

1 Share

TL;DR: Once a benchmark shows a win, put the optimized code back into the profiling harness. Compare the before and after memory and CPU profiles to see whether the larger execution path benefits too.

A good benchmark table feels great.

The before number is slower, the after number is faster, allocations drop, and the ratio looks impressive. After hours of staring at profiler stacks and benchmark output, that table feels like the finish line.

Unfortunately, the table only describes the isolated benchmark.

Before trusting the result, take it back to the larger execution path.

A benchmark compares a controlled slice. The real workload may tell a different story.

Removing noise made the comparison possible, but production code has to run with all of those surrounding costs.

Put the improved code back into the profiling harness and profile the larger path again.

Put the change back where it has to live

The copy-and-trim benchmark helped compare two versions of pipeline invocation. It did that by removing unrelated dependencies and measuring one responsibility. That was the right tool for the inner loop: improve, benchmark, learn, improve again.

Once the benchmark shows a meaningful improvement, the question changes. We no longer ask only “is this operation faster in isolation?” We ask “does the surrounding system show the benefit?”

That means moving the optimized code back into the profiling harness from earlier in the series. Use the same workload, same profiler workflow, and same snapshot points where possible. The comparison is only useful if the setup stays stable.

This second pass is where compounding effects become visible. A tiny allocation removed from one pipeline invocation may disappear thousands of times across a message run. Or it may vanish in the noise because another subsystem dominates the path.

Either answer is useful.

Memory should tell the same story

Start with memory again. In the original pipeline profiles, behavior-chain and delegate allocations showed up in the relevant call stacks. After the optimization, those allocations should be gone or reduced in the same view.

Publish pipeline memory profile before optimization
Before: the publish pipeline profile still includes the allocation pattern we wanted to remove.
Publish pipeline memory profile after optimization
After: the allocation pattern disappears from the larger publish path.

The before-and-after screenshots matter because they tell a story the benchmark cannot. The benchmark says the isolated pipeline invocation allocates less. The profile says those allocations were also removed from the larger publish run.

Use the same trick for the receive path. If the benchmark affected shared pipeline infrastructure, both publish and receive may benefit. If only one path changes, that is useful information too. It tells you where the optimization actually applies.

CPU should change shape too

Memory is only half the picture. The CPU profile should show whether the framework now spends less time on pipeline infrastructure.

Flame graphs make that visible without forcing us to start with exact percentages. Do not read the method names first. Read the shape first.

In the talk, I described it as less red and more orange: less infrastructure code dominating the picture, more business code becoming visible.

The benchmark improved one operation. The second profile shows whether that improvement compounds across the larger path.

In the second profile, the improved number should come with a visible change in shape.

CPU flame graph before optimization
Before: infrastructure code takes a large share of the visible CPU cost.
CPU flame graph after optimization
After: the flame graph shape changes along with the benchmark number.

In the pipeline investigation, the CPU overhead around publish and receive operations dropped from the relevant profiler views. That was the confirmation we wanted.

The benchmark improvement was not trapped inside the benchmark. It showed up in the harness.

Expect the system-level gain to be smaller

A five-times faster benchmark does not mean the whole application becomes five times faster.

That is normal.

The larger path still has serialization, transport code, persistence, transactions, logging, user handlers, database calls, network calls, and runtime overhead. If the optimized operation is only part of the total execution time, the total improvement will be smaller than the benchmark ratio.

That does not make the change disappointing. If a shared path runs millions of times per day, a few percent at the system level can be a good result. Less allocation pressure can also improve tail latency and reduce garbage collection work even when average timing changes look modest.

The benchmark shows that the change worked in isolation. The second profile reveals how much it matters inside the real call stack.

After the profile found the cost and the benchmark compared alternatives, production still has to confirm that the improvement mattered.

Production gets the final vote

The profiling harness is still not production. It is closer than the benchmark, but still controlled. The final answer comes after shipping and observing real workloads.

Watch the signals that should move: throughput, latency, allocation rate, garbage collection behavior, CPU usage, instance count, queue processing rate, and cloud spend. The exact signals depend on the system. A library team may look for benchmark and customer-reported improvements. An application team may look at dashboards, traces, and cost reports.

Production can invalidate assumptions. Maybe the code path was not as hot as the profiling harness made it look. Maybe a database call dominates everything. Maybe the workload changed. That is not failure if the team learns from it.

Write the lesson down. Add it to the pull request, a decision record, or a note near the code. Include what was measured, what changed, why the added complexity was accepted, and what production signal should improve.

Evidence also tells you when to stop

The performance loop can continue forever if you let it. Profile, improve, benchmark, profile again, ship, observe. Then another allocation appears. Another hot spot looks interesting. Another idea shows up.

Stop when the gain no longer justifies the complexity or the time. Stop when the hot path has moved somewhere else. Stop when production data says the next bottleneck is outside the code you are tuning.

Stopping is an engineering decision too.

Performance work competes with features, reliability, support, documentation, and everything else the team needs to do. Each pass through the loop produces evidence that makes the choice to continue or stop less arbitrary.

Once the team trusts the improvement, the next question is how to protect it from regression.

Further reading

Common questions

What if the benchmark improved but the profiling harness profile barely changed?

The optimized operation may be too small in the larger path, or the profiling harness may not exercise the same scenario. Re-check the assumptions before adding complexity. The benchmark can be correct and still not matter enough.

When is the optimization good enough?

When the gain justifies the complexity, tests protect the behavior, and production has a signal you expect to improve. If you cannot name the signal, you may not be ready to ship the optimization.

Should I always profile again after benchmarking?

For important changes, yes. The second profile is what connects the benchmark back to the system. Without it, you know the isolated operation improved, but you do not know whether the surrounding path noticed.

Performance loop status

Read the whole story
alvinashcraft
1 minute ago
reply
Pennsylvania, USA
Share this story
Delete
Next Page of Stories