In my latest Developer Rant, I cover why AI pricing appears to be correcting to be in line with actual costs. You can’t stay unprofitable forever, regardless of market share.

Microsoft’s moving to a per-token model, and Anthropic is defaulting to Medium instead of High. Self-hosted LLMs are starting to become more popular.

So here we go…

Tell me what you think in the comments!

I was recently asked by a software engineering student (meaning, an upstart junior developer) about how I thought AI would impact their upcoming career and address their feeling of dread.

Their concern:

The way this stuff is moving scares me, and I don’t know where to stand now because if AI is able to determine 27-year-old bugs, what’s the point of a human who studies cybersec etc. if a model can identify such a longstanding issue in a codebase overnight? And who’s to say that these models will eventually be perfected to the point where they make no mistakes? Kinda demotivating. And makes me feel like there’s no point in learning anymore. At least that’s how I think of it; if we can make models stop hallucinating, stop making any form of error, which I believe we actually can do because it’s just a load of math and logic at the end of the day (right?), then learning anything CS related has lost relevance.

Below was my response:

I hear you. I’d be lying if I said AI won’t affect our industry – it will. The feat you mentioned is exactly why I’m enjoying AI these days. I’m enjoying being an architect and being able to steer the direction of the system as a whole. The AI engines of today can look through an entire codebase for certain issues in ways that would take me hours, days, weeks, and even then I’d miss them. But they can, without ego or sleep, consume an entire codebase and tell me “oh yeah, this IS a problem”. Now, it didn’t know there was an issue until I explained the architectural issues I was looking for. It’s an LLM – it can’t be creative. It can only “surmise.” That’s the difference with humans vs. LLMs – creativity.

Working together with these models has been life-changing. I’m more excited about development than in a long time. Developers can now “work towards a goal” and let the agents wire things up. Think of it like building a car. Robots in factories put pieces together based on an engineering plan. In our case, they’re writing code. The engineers are still necessary for “the big picture” and accountable to the final result. No computer will ever replace that (and shouldn’t), because only the humans can be held accountable.

Will this change in the future? Maybe. You’ll drive yourself insane trying to predict the future. You can try to prepare for it, but how do you prepare for something you don’t know? Exactly. Help things go right, and less things will go wrong. It’s kind of all you can do.

In the meantime, you can write software faster, and more efficiently, than ever before. You can also make mistakes faster, and more efficiently, than ever before. Have fun on your way to the finished product 🙂

Like most developers, I run into interesting problems, and sometimes even more interesting solutions. I was wondering one day why I wasn’t writing any of these experiences down in a journal for future reflection. After all, how often has a junior developer come up to a senior and asked a question, only to receive a whimsical laugh as the senior recalls how they were once “stumped by that problem?” So that’s what I’m doing now – as often as I can. I’m “ranting” about developer / software engineering things. And you can watch these on my YouTube channel:

You can also click the link at the top of the page for Developer Rants – I’ll try to keep that list up to date, too.

Enjoy!

Are you having a bad day? Been working on a problem for hours, days. No matter what you do, what approach you take, the issue won’t budge? Even Copilot/Claude/etc. can’t fix it?

Well, friend — GO GET YOURSELF A WIN!

Stop. Stop what you’re doing right now. Go do something else you KNOW you can work on AND get a WIN. It sounds cheap, but it’s cathartic.

Getting the win motivates you to get over the loss. It treats your imposter syndrome.

We fail all the time as developers. And sadly school teaches people to win — to get A’s. It should be teaching us how to learn from losses — because those can happen a lot more in life than wins.

The beauty is we’re in a career where failure is expected. Definitely not like being a doctor!

It doesn’t matter how many F’s you get as long as you get an A. Sometimes you need to get yourself some A’s to get yourself out of the funk.

To change your focus.

So, the next time you’re stuck and the universe is pushing against you, learn to stop.

Go get a win.

Then pick up the troubling problem a day later.

And maybe that will get you another win.

This approach has worked for me many times, and for other devs I’ve suggested it to.

Did it work for you? Let me know what you think in the comments.

I recently presented on how I get the most out of AI every day… and how you can, too. Enjoy!

I recently ran into this issue. One of our iPads, which had worked with TestFlight apps before, was now giving an error: “TestFlight is currently unavailable.”

Suffice it to say, this was a blocker to testing our customer’s app.

Looking at Apple’s support forums and StackOverflow, this is a common issue, and I saw no posts with solutions. Just people saying “this happens from time to time” or simply giving up because it worked on another device with another account.

So how do you solve it? A coworker, Jeff, had a suggestion – had we added the user to our Apple account?

I hadn’t thought about this. Normally, you just invite people via TestFlight in App Store Connect and it just works. But the difference here was the iPad was a corporate managed device, via Intune, and the user was a managed user, using single sign-on, aka SSO. It wasn’t a normal personal Apple account.

So here was the fix:

  1. Open App Store Connect.
  2. Go to Users & Access.
  3. Click the + to add the Apple account to the list of users. Set their access level to Developer. (I didn’t try this WITHOUT that, feel free to try and update me on success)
  4. Make sure they accept the invite, otherwise this won’t work. Apple’s invites can sometimes be quarantined/flagged as spam, so be on the lookout.
  5. Now go to TestFlight and invite that same account to the app and ensure they have access to the necessary builds. I’m assuming you already know how to do this part, so I’m leaving those screenshots out.
  6. Problem solved. “TestFlight Unavailable” error went away.
The “Users and Access” option.
The “New User” dialog, with Developer option checked.

Other Solutions to Try

  • Has the app build expired?
  • Are there pending Apple agreements that need to be signed?
  • Has a certificate expired?
  • Did you invite the user to the right tester list?
  • Are Apple’s servers down? Maybe wait a day…
  • Do you have Internet access?
  • If you can’t install TestFlight (different problem, really), and it’s a managed device, have you talked with IT to have it added as an allowed / auto-installed app?

Having submitted an app with In-App purchases – specifically, subscriptions – to Apple’s store, our development team at M3 learned a lot about what will prevent a successful app submission. I hope this compiled list helps you get your app approved quickly, and prevent weeks of headaches.

I will update this article from time to time as more lessons are learned. I hope this article – and all the developer experience I’m relaying on behalf of others and myself – helps you!

An In-App Purchase Must Be Approved Before the App is Released

An In-App Purchase must be in the “Approved” state before it can be used in your app. This means Apple must test any new In-App Purchase Product or Subscription in your app release before anyone can purchase it, including you.

You Must Test In-App Purchases Work – Use the Sandbox Account

As explained above, it can seem like a “chicken and egg” problem. How do you test a product in production when it first must pass testing to get into production? This is where Sandbox accounts come into play. Under Users & Access in App Store Connect, you can assign Apple IDs that are allowed to purchase.

Note that these purchases don’t cost anything, but they can also expire. Make sure you stay on top of your sandbox purchases. Also, make sure you track the original purchase IDs coming back from the API. These will come in handy later when you need to restore subscriptions, which is anothe requirement.

Your App Must Provide a Mechanism to Restore the Subscription

It’s not enough to simply check Apple’s server to see if there is a valid subscription. You must offer an option in the UI (user interface) to explicitly restore.

It’s possible you will still be rejected for this reason. That can be due to Apple’s tester not being able to find the option. So, when you submit your testing instructions, make sure you point out where the option is. If they still say it isn’t there, politely reply to them with a screen shot proving you have such a feature.

You Must Show What the Expired Subscription Experience Looks Like

Make sure you provide an account, with credentials, that can be used to show off the app when a subscription has expired. Just include the credentials in the testing instructions. This should be a different account than the sample credentials you provide Apple for general testing.

Your App Must Clearly Explain What Benefits a Subscription Has vs. a Free Account

You must clearly describe what you get with a free account vs. a paid account. If there is no obvious benefit, Apple may reject you.

Your App Must Clearly Explain The Renewal Terms and Price

You must also be clear about your renewal terms, such as monthly, yearly, and so forth, and pricing. If it’s not clear, Apple can reject you.

It Must be Easy to Cancel Within Your App

It’s not enough that Apple lets you cancel from the App Store UI. You must also provide a button to allow cancelling your subscription.

When Verifying a Subscription Exists, Check BOTH Production AND Sandbox Environments

Apple may subscribe via Sandbox. So, if you only check Production when restoring accounts, you will fail to be approved because Apple won’t be able to restore their subscription. Always check Production first, then fall back to Sandbox.

Note Subscriptions Are Tied to Apple Accounts, Not Your Service’s Accounts

This was a big one. You can only have one subscription of each type per Apple account. However, your service may support multiple accounts. Make sure you track which account from your service subscribed, and tie that to the Apple original subscription ID. If you don’t, it’s possible you’ll be handing out “free” accounts to creating additional accounts under the same Apple ID.

You Can’t Generate Promo Codes Until the App is Approved

Unlike Google, Apple will only let you generate promo codes AFTER the app has been approved. Also, for subscriptions, Apple limits you to 100 promo codes with a 30 day expiration. Make sure you factor this into your testing and soft rollout plans.

Create Separate Test Accounts for Apple to Use

Don’t give Apple accounts your developers are using. Give them accounts that are in the exact state you need them to see. Developer accounts are too “in flux” to be reliable, and your own developers may interfere with Apple’s testing.

Be Thankful for (and take advantage of) Apple’s Feedback System

Apple likely has access to more testers than you do. There are aspects of In App Purchases you may not know how to test, or that you had to test in the first place. So, if you feel your app is in a submittable state and want to see if you covered everything, submit a build to Apple. They can give you a sanity check / smoke test you didn’t miss anything. If you pass the In App Purchases part of Apple’s testing, the rest may be smoother sailing 😉

Have you run into a FileNotFoundException when attempting to generate a JWT token using ECDsa.Create()? Well, you’re not alone… This will work locally, but not work in Azure. Especially on certain Azure instance types.

I ran into this issue when attempting to create a JWT token for Apple In-App Purchase API access.

Easy fix, though! Under App Settings in Environment Variables add the following setting:

WEBSITE_LOAD_USER_PROFILE = 1

This is because, even though it’s not reading a file, it throws that error. It’s silly, I know, but hey…

Additional info gleaned from Copilot:

🧠 What’s Likely Happening

  • The ECDsa implementation on Windows relies on CNG (Cryptography Next Generation), which sometimes expects access to user profile directories or system-level key stores—even if you’re passing in a byte array.
  • On S0 App Service plans, the environment may lack access to certain native crypto libraries or user profile loading, causing CngKey.Import() to throw a "File Not Found" error.

✅ Additional Tips

  • Make sure your private key is in PKCS#8 format and uses a supported curve like nistP256.
  • If you’re using .NET 6 or later, consider switching to OpenSSL-based implementations via Linux App Service plans, which tend to be more predictable for ECC operations.
  • For Elastic Premium plans, this issue is even more persistent unless the workaround is applied.

Update: This bug was fixed in an update to Visual Studio 17.4.

In case your #Android #debugging options disappeared after the latest #VisualStudio updates… https://developercommunity.visualstudio.com/t/Android-Options-Gone-After-Updating-to-1/10910189

And here’s the fix to make to your project file:

Original order that broke this:

    <TargetFrameworks>net9.0-maccatalyst;net9.0-ios;net9.0-android;</TargetFrameworks>

Changed order to have Android first and .net 9.0 next – otherwise unit tests break??? – and restarted VS (WHY did this make a difference??)

    <TargetFrameworks>net9.0-android;net9.0;net9.0-maccatalyst;net9.0-ios;</TargetFrameworks>

Credit to StackOverflow article: https://stackoverflow.com/questions/79626280/visual-studio-doesnt-display-the-android-emulator-run-option-after-the-update

I had this issue after switching from an Azure app service to DiscountASP.net. I just had to add the following to the web.config to fix the IIS config:

<system.webServer> 
  <security>
    <requestFiltering>
      <filteringRules>
         <remove name="facebookexternalhit" />  
      </filteringRules>
    </requestFiltering>  
  </security>  
</system.webServer>

The first time I tried this it did not work. However, I emailed support and they explained THEY had to fix it “at the root.” So, for what it’s worth this does work, but in a shared hosting environment, you may need to put it in the server’s web.config, possibly replacing the rule name to what’s appropriate for your hosting provider.