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

Fundamentals Will Help You Survive the Constant Acceleration of Software Engineering

1 Share

Fundamentals get talked about constantly, but rarely defined. In this episode I dig into what a fundamental actually is — the building blocks, heuristics, and core characteristics that don't change — and why they matter more than ever in a profession where abstraction moves faster than almost anywhere else. If you feel like you can't keep up with every new framework, model, or tool release, the answer isn't to read faster. It's to step up a level.

Fundamentals get talked about constantly — in sports, in hobbies, in software — but we rarely stop to define what one actually is. In today's episode, I unpack what makes something fundamental, why software engineering in particular buries its fundamentals under layer after layer of abstraction, and how principles-first thinking gives you a way to keep up with an industry that never stops moving without needing to learn every single new thing that ships.

  • What Actually Counts as a Fundamental: Fundamentals aren't rules — they're building blocks, behaviors, habit patterns, and heuristics. In basketball it's dribbling. In football it's blocking. In software it's readability, reliability, the setup-execute-teardown shape of a test, basic logic structures. In communication it's sender, receiver, feedback, and noise.
  • Why Software Abstracts Faster Than Almost Anything Else: Compare the practice of law, where the fundamentals look largely the same as they did fifty years ago, to software, where the work is symbolic at its core. We build symbols that mean something to humans but map down to a hard physical reality of flipped bits and moving electrons — and that symbolic nature is exactly what lets abstraction pile up so quickly.
  • The Rise of Linguistic Abstraction: Our abstractions have become increasingly language-shaped. Object, function, flow, durable object, mesh, graph — these are primitive ideas expressed as words, and understanding that shift explains a lot about how the industry actually progresses.
  • Abstractions Have Fundamentals Too: This is the key move. If you understand what makes Postgres a good fit — structured, predictable, relational data — you can evaluate any other relational database without learning it from scratch. Understand the primitives of NoSQL, or of an index lookup, and you no longer need to chase every implementation.
  • Decompose, Then Recompose: Principles-first thinking means breaking things down into their underlying characteristics so you can recombine them into solutions you care about. It works on databases, on business offerings, on competitive positioning — anywhere you'd otherwise be tempted to evaluate things as wholly separate.
  • Applying It to LLMs: When a new model drops from one provider or another, you don't need to start over. If you know which characteristics matter, you can see what changed here versus there — and treat them as variations on shared fundamentals rather than two entirely different things.
  • Practice vs. Analysis: There are two flavors here worth separating. Fundamentals in practice are the things you do repeatedly — giving feedback regularly, for example. Fundamentals as analysis is a way of looking at new technology and asking what core characteristics make it up. You want both: composable actions and composable tools.
  • Risk as a Fundamental: A live example from my current role — determining the right level of risk in a given scenario can't be a one-size-fits-all rule. It requires understanding the fundamental characteristics of the risk and reward you're accepting.
  • Episode Homework: Look at your work and ask where you're too deep in the weeds. Where are you thinking too granularly? Where are you missing the abstraction class — the consistent things shared across multiple iterations that you could be watching from a step away? That distance is what gives you leverage to notice when something fundamental actually changes.

📮 Ask a Question

If you enjoyed this episode and would like me to discuss a question that you have on the show, drop it over at: developertea.com.

📮 Join the Discord

If you want to be a part of a supportive community of engineers (non-engineers welcome!) working to improve their lives and careers, join us on the Developer Tea Discord community today!

🗞️ Subscribe to The Tea Break

We are developing a brand new newsletter called The Tea Break! You can be the first in line to receive it by entering your email directly over at developertea.com.

🧡 Leave a Review

If you're enjoying the show and want to support the content head over to iTunes and leave a review!





Download audio: https://dts.podtrac.com/redirect.mp3/cdn.simplecast.com/audio/c44db111-b60d-436e-ab63-38c7c3402406/episodes/22dfb221-069b-494b-a8d4-17323d2ebb0f/audio/e9370aef-663b-4600-af83-d65e79020d2c/default_tc.mp3?aid=rss_feed&feed=dLRotFGk
Read the whole story
alvinashcraft
44 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

Pixel Watch's New Life-Saving Feature, Explained

1 Share

How can a smartwatch on your wrist do more than just track steps and actually help in a life-threatening situation?


Host Rachid Finge sits down with Google Health research scientist Jake Sunshine and product manager Pramod Rudrapatna to go deep on Breathing Emergency Detection, a breakthrough feature for the Google Pixel Watch.


They uncover the incredible story of its creation, from the initial "what if" moment to the immense challenges of clinical testing and the user-centered design that ensures it can summon help when someone is unable to themselves. It’s a look at how everyday devices are being reimagined to act as true health guardians, potentially saving lives when every second counts.


Hosted on Acast. See acast.com/privacy for more information.





Download audio: https://sphinx.acast.com/p/open/s/63e39eb02e631f0011a284ac/e/6aaf867851da7059ecd7c88b/media.mp3
Read the whole story
alvinashcraft
44 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

Justin Martin: Commanding Fleets of AI Agents - Episode 420

1 Share

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

Today I'm joined by Justin Martin, a product-focused engineering leader based in Austin, Texas, with more than twenty years of experience driving technical innovation at startups and high-growth tech companies, from Groupon-era Rails to fraud prevention for banks. He is now commanding fleets of AI agents from a single post. He is currently the Head of Engineering at 6Lock.

Github - https://github.com/LupusDei
X Account - https://twitter.com/LupusDei18
Website - https://justinmmartin.me/
LinkedIn - https://www.linkedin.com/in/mythinking/

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





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

533: iPhone Duo Development: Navigating Dual Screens and Layouts

1 Share

Apple's new iPhone Duo promises a game-changing foldable experience, but developers face a minefield of technical challenges. James and Frank break down the critical app adaptation work required—from handling multiple screen permutations to managing safe area insets and keyboard behavior—plus why native UI controls matter more than ever. 

Follow Us

⭐⭐ Review Us ⭐⭐

Machine transcription available on http://mergeconflict.fm

Support Merge Conflict





Download audio: https://aphid.fireside.fm/d/1437767933/02d84890-e58d-43eb-ab4c-26bcc8524289/43713c89-b5de-4787-a69f-1046c58ff386.mp3
Read the whole story
alvinashcraft
44 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

7 Ways How We Use AI Is Changing

1 Share
From: AIDailyBrief
Duration: 22:54
Views: 2,249

From persistent conversations and voice commands to chatbots that coordinate entire teams of agents, the way we work with AI is shifting. NLW breaks down seven changes shaping everyday AI use, including the move from prompts to goals, managing model costs, and building shared agents for teams.

The AI Daily Brief helps you understand the most important news and discussions in AI.
Subscribe to the podcast version of The AI Daily Brief wherever you listen: https://pod.link/1680633614
Get it ad free at http://patreon.com/aidailybrief
Learn more about the show https://aidailybrief.ai/

Read the whole story
alvinashcraft
45 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

Azure Service Bus sessions: Pub/sub without autoforwarding

1 Share

TL;DR: Azure Service Bus does not support autoforwarding from a session-enabled subscription. A direct workaround is to process each subscription as an application input, but that spreads session locks, retries, monitoring, and shutdown across several receive points. A narrowly scoped transport-owned bridge can instead move each ordered subscription stream into one session-enabled endpoint queue. The application can then apply one recoverability model.

The earlier posts in my Azure Service Bus topology series looked at filters, shared-topic contention, failure boundaries, and incremental migration. This post adds another constraint to that discussion: ordered event streams.

My original sessions article covers the basic session model. The previous post in this mini-series explains why delayed retries need a session hold-back. Here, I want to keep that recoverability behavior in one place while events arrive through topics and subscriptions.

This topology only earns its complexity after the system has answered the question from You don’t need ordered delivery. If business-level state, idempotence, or a saga can handle events in either order, let the pub/sub system keep moving. If the event stream has a strict sequencing invariant, the topology must preserve it through forwarding and retries rather than only on the happy path.

The ordered design starts with one awkward broker rule: a session-enabled subscription cannot set ForwardTo.

Sessions remove the forwarding shortcut

A common endpoint topology uses Azure Service Bus autoforwarding:

publisher
  -> topic
    -> subscription
      -> ForwardTo
        -> endpoint input queue
          -> message handler

The subscription selects events for one consumer. Azure Service Bus forwards those events to the consumer’s input queue. Commands sent directly to the endpoint and events published through topics meet at that queue. Monitoring, retries, and handler concurrency all line up around one input.

According to the Azure Service Bus autoforwarding documentation, autoforwarding is not supported for session-enabled entities. An ordered subscription must therefore keep its messages until a receiver consumes them.

The shortest workaround is to invoke handlers directly from each subscription. But that turns an infrastructure constraint into an application model. An endpoint with five ordered subscriptions now has five handler inputs, each with session concurrency, recoverability, lifecycle, critical-error, and observability concerns.

Another hop can keep those concerns together.

Keep subscription receivers out of the handler pipeline

The alternative is a transport-owned bridge for every session-enabled subscription. The bridge accepts sessions and moves their messages into the endpoint’s session-enabled input queue.

publisher
  -> topic
    -> session-enabled subscription, no ForwardTo
      -> transactional subscription bridge
        -> session-enabled endpoint input queue
          -> session-aware message pump
            -> message handler

Keep this component boring. It does not invoke handlers, decide retry delays, or block sessions after a processing failure.

It copies the body, headers, and relevant broker properties. It preserves SessionId and the logical message identity, chooses the destination broker identity according to the endpoint’s duplicate-detection policy, and settles the source safely.

That leaves one ordered processing boundary. Commands sent to the endpoint, events bridged from subscriptions, and operational retries all arrive at the input queue. The session-aware pump owns the ordering and recoverability contract once.

Make forwarding transactional

A naive bridge sends a copy and then completes the subscription message. If the process stops between those operations, the source is redelivered, and the destination may receive a duplicate. Reversing the operations creates a loss window instead.

Azure Service Bus supports transactions that span entities in the same namespace. With cross-entity transactions enabled, the bridge can send the copy and complete the source under one transaction.

ServiceBusClient bridgeClient = new(
    connectionString,
    new ServiceBusClientOptions
    {
        EnableCrossEntityTransactions = true
    });

ServiceBusSender inputQueueSender =
    bridgeClient.CreateSender("sales-input");

ServiceBusSessionProcessor bridgeProcessor =
    bridgeClient.CreateSessionProcessor(
        "orders",
        "sales-sub",
        new ServiceBusSessionProcessorOptions
        {
            AutoCompleteMessages = false,
            MaxConcurrentSessions = 8,
            MaxConcurrentCallsPerSession = 1,
            ReceiveMode = ServiceBusReceiveMode.PeekLock
        });

bridgeProcessor.ProcessMessageAsync += async args =>
{
    ServiceBusReceivedMessage source = args.Message;
    ServiceBusMessage copy = new(source)
    {
        SessionId = args.SessionId
    };

    using TransactionScope transaction = new(
        TransactionScopeAsyncFlowOption.Enabled);

    await inputQueueSender.SendMessageAsync(copy);
    await args.CompleteMessageAsync(source);

    transaction.Complete();
};

The sample keeps the transaction visible by omitting lifecycle management, cancellation, diagnostics, and error handling. Production code must start and stop processors with the endpoint, report repeated bridge failures, and decide which native properties should survive the copy.

The bridge has a narrow responsibility. Building and operating the complete feature is still a sizable transport change.

The spike behind this article verifies cross-entity forwarding against a live namespace, including rollback. It also exercises concurrent producers, multiple retries, and a graceful restart in the input pump. It does not yet prove every hard-kill boundary or duplicate-detection configuration.

Each accepted session is limited to one concurrent call. Several sessions can move at once, but two messages from the same session should not race through one bridge processor.

Keep the ordering promise narrow

A session-enabled subscription owns an ordered stream for each SessionId. The bridge preserves that stream as it copies messages into the endpoint queue. Once copied, the endpoint queue establishes the processing order for that session.

That is not a global ordering guarantee. Suppose one endpoint subscribes to an orders topic and an inventory topic. Each topic has an independent subscription, and both subscriptions contain messages for Customer-123. Azure Service Bus does not coordinate an order across those subscriptions. Two bridges cannot reconstruct one.

A direct command for Customer-123 can also reach the input queue while bridged events are in flight. The input queue has a definite arrival order, but that order does not prove which event happened first across the source entities.

The useful promise is narrower: preserve each source subscription’s per-session order into the input queue, then preserve ordered endpoint processing per session at that queue. Anything stronger would need a distributed ordering coordinator outside the native session model.

The bridge relocates back-pressure

Without ForwardTo, a slow bridge leaves messages in the subscription. Subscriptions share the topic’s storage budget. One stalled ordered subscriber can therefore contribute to topic depth and eventually affect publishers or unrelated subscribers using that topic.

A healthy bridge drains messages into the endpoint input queue. The endpoint’s backlog then consumes the queue’s capacity rather than the topic’s capacity. This moves the normal buffering boundary closer to the consumer who owns the work.

It does not remove back-pressure. If the input queue is full or unavailable, the transactional send cannot commit. The source message remains in the subscription and pressure returns to the topic.

Native autoforwarding can dead-letter at the source when destination problems repeatedly prevent forwarding. A custom bridge needs an equally deliberate escape valve. After a bounded number of failures, it may need to dead-letter the source message with enough diagnostics to explain why the endpoint queue rejected it. Otherwise, the bridge can stop draining forever. The exact source-side dead-lettering policy remains an open production item.

Configuration becomes part of the contract

RequiresSession is fixed when a queue or subscription is created. Enabling ordered processing on an existing endpoint, therefore, needs a migration plan, new entity names, or fail-fast validation. It is not a runtime switch that can update an entity in place.

Every message entering the ordered path also needs a SessionId. That includes published events, direct commands, bridge copies, and operational retries. Rejecting a message before send is safer than discovering the missing identifier when the session-enabled entity refuses delivery.

Partitioning adds another constraint. On partitioned session entities, the session identifier also selects the partition. Any explicit partition or transaction partition key must remain compatible with it. Batching may need to group messages by destination and session rather than destination alone.

The receive mode matters too. Receive-and-delete removes the settlement operations needed for a transactional bridge and for session-aware recovery. Peek-lock is the practical foundation when the system promises recoverability as well as order.

Keep one endpoint queue

It would be simpler to describe this topology as “consume the subscriptions.” It would be harder to operate. Every new subscription would add another place where handlers can fail and another place where the system must understand blocked sessions and retries.

That extra broker hop and its transaction cost preserve a stronger application boundary. The endpoint still has one input queue. That queue owns concurrency, session state, delayed-retry hold-backs, error handling, and operational visibility.

Azure Service Bus cannot autoforward a session-enabled subscription. The application does not have to inherit that limitation as its programming model.

Further reading:

Common questions

These are the questions I would ask before adding ordered subscriptions to an endpoint.

Can a session-enabled subscription use ForwardTo?

No. Azure Service Bus does not support autoforwarding on session-enabled subscriptions, so code must receive those messages.

Does a bridge create global ordering across topics?

No. It can preserve per-session order from one source subscription. Independent topics, subscriptions, commands, and retries do not share a broker-wide ordering authority.

Why use a transaction?

The bridge must send a destination copy and settle the source as one outcome. Without a transaction, a crash between those operations creates a duplicate or loss window.

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