<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Mostafa Nafie]]></title><description><![CDATA[Mostafa Nafie's website, Staff Software Engineer in iOS, sharing knowledge through talks and articles. Explore my work experience, recommendations, and latest blog posts.]]></description><link>https://www.nafie.dev</link><generator>RSS for Node</generator><lastBuildDate>Sat, 13 Dec 2025 09:05:28 GMT</lastBuildDate><atom:link href="https://www.nafie.dev/rss.xml" rel="self" type="application/rss+xml"/><pubDate>Sun, 13 Mar 2022 04:00:00 GMT</pubDate><copyright><![CDATA[2025 Mostafa Nafie]]></copyright><language><![CDATA[en]]></language><managingEditor><![CDATA[MostafaTarekNafie@gmail.com (Mostafa Nafie)]]></managingEditor><webMaster><![CDATA[MostafaTarekNafie@gmail.com (Mostafa Nafie)]]></webMaster><ttl>60</ttl><item><title><![CDATA[Modern iOS Development in 2026]]></title><description><![CDATA[<p><em>In the age of AI slop, it’s worth noting that this article is not AI-generated and is based entirely on my own thoughts and experiences.</em></p>
<p>Modern iOS development has changed dramatically in recent years, and by 2026 the ecosystem feels very different from what many of us learned even a few years ago.</p>
<p>As much as we love to hate Apple's decisions lately (Swift concurrency and liquid glass, for example), there has also been a buildup of quality-of-life improvements over the past few years. Let's go over a few of them.</p>
<hr />
<h2 id="swiftformat">Swift Format</h2>
<ul>
<li>First, we had the community-maintained <a href="https://github.com/nicklockwood/SwiftFormat">SwiftFormat</a>, introduced in 2016. Later, Apple introduced <a href="https://github.com/swiftlang/swift-format">swift-format</a> in 2019.</li>
</ul>
<h3 id="whatwastheissue">What was the issue?</h3>
<ul>
<li>Both needed manual installation steps, and a way to manage their versions, so choosing one over the other was a matter of personal preference.</li>
</ul>
<h3 id="howdidapplefixit">How did Apple fix it?</h3>
<ul>
<li>With Swift 6 (Xcode 16), Apple now ships its formatter as part of the official Swift <a href="https://github.com/swiftlang/swift-format?tab=readme-ov-file#included-in-the-swift-toolchain">toolchain</a>, which made the choice obvious for me.</li>
</ul>
<hr />
<h2 id="buildablefolders">Buildable Folders</h2>
<h3 id="whatwastheissue-1">What was the issue?</h3>
<ul>
<li>Xcode used to use groups (references) to handle the project structure (its files and folders).</li>
<li>Imagine running into one of those real <strong>it works on my machine</strong>™ situations where the project builds only because it references a file on someone’s desktop. What a mess!</li>
</ul>
<h3 id="whywereprojectgeneratorsneeded">Why were project generators needed?</h3>
<ul>
<li>Teams needed a reliable way to ensure the project would build consistently across machines and CI environments.</li>
<li>So, we used third-party packages like <a href="https://github.com/yonaskolb/XcodeGen">XcodeGen</a> to ignore the <code>.xcodeproj</code> file from the source control and generate it locally or in CI.</li>
<li>This ended up saving time fixing the dreaded <code>.xcodeproj</code> conflicts that slowed development and required constant manual fixes.</li>
</ul>
<h3 id="howdidapplefixit-1">How did Apple fix it?</h3>
<ul>
<li>Xcode 16 introduced <a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-16-release-notes#Project-Management">buildable folders</a> as the default project management method, allowing Xcode to map the exact directory structure of your project as you see it in the Finder—no more surprises.</li>
<li>Existing projects can be migrated to this folder-based model, enabling teams to remove third-party project generators.</li>
</ul>
<hr />
<h2 id="assetcatalogsymbolsgeneration">Asset Catalog Symbols Generation</h2>
<h3 id="whatwastheissue-2">What was the issue?</h3>
<ul>
<li>Assets like images and colors used to be accessed in code via strings, making them very error-prone and offering no code completion or compile-time errors. If you misspelled a resource's name, good luck catching that at runtime.</li>
</ul>
<h3 id="whywerecodegeneratorsneeded">Why were code generators needed?</h3>
<ul>
<li>Teams used <a href="https://github.com/SwiftGen/SwiftGen">SwiftGen</a> and <a href="https://github.com/mac-cain13/R.swift">R.swift</a>, and these are the benefits straight from SwiftGen's repo:</li>
</ul>
<blockquote>
  <ul>
  <li>Avoid any risk of typo when using a String.</li>
  <li>Free auto-completion.</li>
  <li>Avoid the risk of using a non-existing asset name.</li>
  <li>All this will be ensured by the compiler and thus avoid the risk of crashing at runtime.</li>
  </ul>
</blockquote>
<h3 id="howdidapplefixit-2">How did Apple fix it?</h3>
<ul>
<li>Xcode 15 introduced <a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Asset-Catalogs">Asset Catalog Symbols Generation</a>, which provides Swift and Objective-C symbols for each color and image in the asset catalog.</li>
<li>But there is a gotcha here: these symbols are <em>internal</em> and can only be used within the same target. They can’t be accessed by other apps or packages.</li>
<li>It’s worth mentioning that all of this is a no-brainer for the Android guys, as they have had their type-safe resources (R class) since the beginning of time (Android SDK 1.0).</li>
</ul>
<hr />
<h2 id="stringcatalogsymbolsgeneration">String Catalog Symbols Generation</h2>
<h3 id="whatwastheissue-3">What was the issue?</h3>
<ul>
<li>Localizations had the same exact issues as the other resources (no code completion or compile-time errors), plus they had unique challenges, like incomplete translations for some languages.</li>
</ul>
<h3 id="whywerecodegeneratorsneeded-1">Why were code generators needed?</h3>
<ul>
<li>Again, same as the other resources, so I won't repeat myself here.</li>
</ul>
<h3 id="howdidapplefixit-3">How did Apple fix it?</h3>
<ul>
<li>It took some time from the introduction of <a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Localization">String Catalogs</a> in Xcode 15, replacing the old <code>.strings</code> files, to the arrival of <a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-26-release-notes#Localization">type-safe Swift symbols generation</a> in Xcode 26.</li>
<li>But now we have what the old generators did and then some, including visual indications for incomplete translations and auto-generated comments to better understand the context of each localization key.</li>
<li>For a complete rundown of what’s new in localizations, I recommend watching this <a href="https://developer.apple.com/videos/play/wwdc2025/225/">WWDC video</a>.</li>
</ul>
<hr />
<h2 id="swiftpackagemanager">Swift Package Manager</h2>
<h3 id="whyweredependencymanagersneeded">Why were dependency managers needed?</h3>
<ul>
<li>Of course, I was going to talk about SPM; this is by far the most drastic change in the ecosystem. For years, Apple did not offer any way to consume third-party dependencies in our projects.</li>
</ul>
<h3 id="whatwastheissue-4">What was the issue?</h3>
<ul>
<li>Whether you liked <a href="https://github.com/CocoaPods/CocoaPods">CocoaPods</a> or leaned towards <a href="https://github.com/Carthage/Carthage">Carthage</a>, you must have used one of them at some point.</li>
<li>Most of the projects I worked with used CocoaPods, so get ready for a jump down the rabbit hole:</li>
<li>CocoaPods was a dependency manager for your Xcode projects.</li>
<li>CocoaPods is written in Ruby.</li>
<li>So CocoaPods itself as a dependency is managed by <a href="https://rubygems.org/">RubyGems</a>.</li>
<li>RubyGems is distributed as part of Ruby.</li>
<li>Ruby has to be managed to avoid version mismatches using tools like <a href="https://github.com/rbenv/rbenv">rbenv</a>.</li>
<li>But … rbenv itself is written in shell.</li>
<li>So it is managed through <a href="https://brew.sh/">Homebrew</a>.</li>
<li>See?</li>
<li>You had to install a dependency manager for macOS (Homebrew).</li>
<li>To install a Ruby version manager (rbenv).</li>
<li>To install Ruby.</li>
<li>To install CocoaPods.</li>
<li>To install the dependency that you forgot by now why you needed it in the first place.</li>
<li>I will stop at this point because it is getting personal for me.</li>
</ul>
<h3 id="howdidapplefixit-4">How did Apple fix it?</h3>
<ul>
<li>Like <a href="https://docs.swift.org/swiftpm/documentation/packagemanagerdocs/">doing</a> what should have been there since the beginning.</li>
</ul>
<hr />
<p>And that's it. For me, this is what qualifies as a complete replacement for old tools or dependencies, but there are still some honorable mentions to keep your eyes on:</p>
<ul>
<li><a href="https://developer.apple.com/documentation/testing">Swift Testing</a> as a replacement for the BDD testing framework <a href="https://github.com/Quick/Quick">Quick</a>.</li>
<li><a href="https://developer.apple.com/documentation/swiftui/asyncimage">AsyncImage</a> as a replacement for <a href="https://github.com/onevcat/Kingfisher">Kingfisher</a> and <a href="https://github.com/SDWebImage/SDWebImage">SDWebImage</a> (once it supports caching).</li>
<li><a href="https://docs.swift.org/compiler/documentation/diagnostics/compilation-caching/">Compilation caching</a> to finally make the Xcode build system as efficient as <a href="https://bazel.build/">Bazel</a>.</li>
<li><a href="https://github.com/apple/swift-configuration">swift-configuration</a> as a replacement for <a href="https://github.com/rogerluan/arkana">arkana</a>.</li>
<li><a href="https://developer.apple.com/xcode-cloud/">Xcode Cloud</a> as a replacement for <a href="https://bitrise.io/">Bitrise</a>.</li>
</ul>
<hr />
<p>In the end, I want to pay my respects to the people behind all the tools mentioned, built by the community, for the community. You were there and continued to enrich the ecosystem where Apple was lacking.</p>
<p>I know it’s not an easy feeling to get <a href="https://en.wikipedia.org/wiki/Sherlock_(software)#Sherlocked_as_a_term">sherlocked</a>. I truly appreciate you and all the hard work you’ve put in.</p>]]></description><link>https://www.nafie.dev/blog/modern-ios-2026</link><guid isPermaLink="true">https://www.nafie.dev/blog/modern-ios-2026</guid><category><![CDATA[Tech]]></category><category><![CDATA[Blogs]]></category><category><![CDATA[App Development]]></category><category><![CDATA[Mobile Development]]></category><category><![CDATA[iOS Developement]]></category><category><![CDATA[2026]]></category><category><![CDATA[Dependencies]]></category><category><![CDATA[Apple]]></category><category><![CDATA[WWDC]]></category><dc:creator><![CDATA[Nafie]]></dc:creator><pubDate>Mon, 15 Dec 2025 19:29:13 GMT</pubDate><content:encoded>&lt;![CDATA[ &lt;img src=&quot;https://www.nafie.dev//img/posts/modern-ios-2026.webp&quot;&gt;</content:encoded><media:content medium="image" url="https://www.nafie.dev//img/posts/modern-ios-2026.webp"></media:content></item><item><title><![CDATA[Apple Vision Pro - Initial thoughts]]></title><description><![CDATA[<p>Well, that felt different from Mark's Metaverse announcement.</p>
<p>I was excited throughout the presentation and amazed with each new feature, till they announced the price! At $3,500, I think this is Achilles' heel for anyone who thought that this product can be mass adopted.</p>
<p>However, the way I see it is that Apple themselves clearly didn't think about mass adoption at this point, given this is version 1.0 of this new lineup, and as far as I understand this price point is a result of the expensive R&amp;D that is conducted through the previous years, rather than the hardware itself.</p>
<p>So, my prediction is that initially the Vision Pro will be used through shared setups, like workspaces, universities, and such, before being fully adapted for personal use.</p>
<p>Aside from the price, Apple proves yet again that they have a unique philosophy of dealing with each new product, they don't care if they're the first, but they aspire to be the best, also they always tackle the same problem from a fresh perspective -a unique mix between AR and VR in this case-, and this is truly impressive given that they have been doing this for decades now.</p>
<p>As an iOS developer, I feel excited at the new possibilities that this kind of product can bring, given that our current skillset -Swift and SwiftUI- is easily transferable to this new platform, exciting times ahead!</p>]]></description><link>https://www.nafie.dev/blog/apple-vision-pro-initial-thoughts</link><guid isPermaLink="true">https://www.nafie.dev/blog/apple-vision-pro-initial-thoughts</guid><category><![CDATA[Tech]]></category><category><![CDATA[Blogs]]></category><category><![CDATA[App Development]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[Mobile Development]]></category><category><![CDATA[High-Quality]]></category><category><![CDATA[Apple]]></category><category><![CDATA[AR]]></category><category><![CDATA[VR]]></category><category><![CDATA[Vision Pro]]></category><category><![CDATA[WWDC]]></category><dc:creator><![CDATA[Nafie]]></dc:creator><pubDate>Mon, 05 Jun 2023 19:54:24 GMT</pubDate><content:encoded>&lt;![CDATA[ &lt;img src=&quot;https://www.nafie.dev//img/posts/apple-vision-pro-initial-thoughts.webp&quot;&gt;</content:encoded><media:content medium="image" url="https://www.nafie.dev//img/posts/apple-vision-pro-initial-thoughts.webp"></media:content></item><item><title><![CDATA[Your First App Ever]]></title><description><![CDATA[<p>Do you remember what was your first app ever?</p>
<p>Mine was 14 years ago, and I was 14 years old, it was 2008 when I wrote my first desktop application in VisualBasic.</p>
<p>It was then that I discovered this superpower … <strong>CODING</strong>.\
So I began to harness this power to solve my everyday problems.</p>
<p>For example, back then I and my brother shared a PC, so imagine 14 years old and 11 years old sharing one PC to play games on! we needed to divide the time to play on the PC fairly, and here comes <strong>Timer</strong>, this is what I called my first app, a program where you can choose the session duration from 15 minutes to 1 hour, and when it ends, it will be opened on the top of any other opened window <em>-Typically a game-</em> with the message <em><strong>"Get up Mostafa!"</strong></em></p>
<p>Later on, we discovered that our parents may ask us to do something during a running session, so we needed to pause the session, and that's how the pause button was added.</p>
<p>Along the way, I made other quality of life improvements, like hiding the app from the taskbar when minimized, and only showing a system tray icon.</p>
<p>Following this pattern, I programmed 30+ apps in the span of 3 years.</p>
<p>And this is what sparked my passion for Software Development, which led to working with clients from the USA, Germany, and Saudi Arabia, and impacting people's lives on every continent, not just me and my brother.</p>
<p>What about you? What was your initial spark?</p>
<hr />
<p>Bonus: <a href="https://github.com/MostafaNafie/Timer">Timer on GitHub</a></p>]]></description><link>https://www.nafie.dev/blog/your-first-app-ever</link><guid isPermaLink="true">https://www.nafie.dev/blog/your-first-app-ever</guid><category><![CDATA[Tech]]></category><category><![CDATA[Blogs]]></category><category><![CDATA[First app ever]]></category><category><![CDATA[Coding super power]]></category><dc:creator><![CDATA[Nafie]]></dc:creator><pubDate>Mon, 05 Sep 2022 17:28:14 GMT</pubDate><content:encoded>&lt;![CDATA[ &lt;img src=&quot;https://www.nafie.dev//img/posts/your-first-app-ever.webp&quot;&gt;</content:encoded><media:content medium="image" url="https://www.nafie.dev//img/posts/your-first-app-ever.webp"></media:content></item><item><title><![CDATA[What Makes a High Quality App?]]></title><description><![CDATA[<p>Engineers are enablers, they have the knowledge and tools to turn ideas into reality.</p>
<blockquote>
  <p>“Engineers are the hidden enablers of everything that we take for granted in modern life. From turning on the tap, to the smartphones that we check the moment we’ve woken up, to clean energy, to access to medicine, engineers literally design and deliver the physical and digital infrastructure, the services that we rely on every day—even if we are totally oblivious to it.”\
  -Hayaatun Sillem, CEO of the UK’s Royal Academy of Engineering</p>
</blockquote>
<p>Awesome right?!</p>
<p>But as a Software Engineer, how could you build such services?\
Specifically in the app development field whether it's web or mobile app development.</p>
<p><em>How to build a high-quality app?\
What makes a high-quality app in the first place?\
And high-quality for whom exactly?</em>\
These are the questions that I will try to answer here.</p>
<p>I think answering these questions will help you to understand more deeply the impact of the features that you implement in your day-to-day tasks, moreover, it can help you to decide what you need to learn next if you want to maximize your impact.</p>
<p>So here's how I see it, for each app you work on there're three stakeholders:</p>
<ul>
<li>Users</li>
<li>Business</li>
<li>Developers</li>
</ul>
<p>Let's try to think what each one would want in a <strong>High-Quality</strong> app while mapping this to a technical requirement in the app.</p>
<p>Let's start with the <strong>users</strong> of course, as their needs should be the true north of anything that you do. Here's generally what users care about:</p>
<ul>
<li>UI/UX</li>
<li>Performance:</li>
<li>App launch time</li>
<li>Responsiveness → <em><strong>Cache</strong></em></li>
<li>Stability (No crashes) → <em><strong>Software Testing, Debugging</strong></em></li>
<li>Reliability (No bugs) → <em><strong>Software Testing, Crash and Error Monitoring</strong></em></li>
<li><em>(Optional)</em> Convenience Features:</li>
<li>Offline first experience (Offline Mode) → <em><strong>Data Persistence, Cache and State Management</strong></em></li>
<li>Online Payments</li>
</ul>
<p>Now it's <strong>the business</strong> turn, which is typically represented by the Project Manager or Product Owner:</p>
<ul>
<li>Get feedback fast → <em><strong>CI/CD Pipeline</strong></em></li>
<li>Boost users' conversion and retention rates:</li>
<li>By being informed about the users' actions → <em><strong>Analytics</strong></em></li>
<li>Marketing campaigns → <em><strong>Push Notifications, Deep Linking</strong></em></li>
<li>Conduct experiments → <em><strong>A/B Testing</strong></em></li>
<li>Scalable:</li>
<li>Adding more features fast and secure (without breaking old features)<ul>
<li>Fast: Allow parallel work → <em><strong>Modularization</strong></em></li>
<li>Secure/Stable (No crashes) → <em><strong>Software Testing, Crash and Error Monitoring</strong></em></li></ul></li>
<li>Adding more markets (different languages and configurations)<ul>
<li>Adding Languages → <em><strong>Localization</strong></em></li>
<li>Toggling features for different markets → <em><strong>Feature Toggles (Feature Flags)</strong></em></li>
<li>Different App Identities or Different Clients → <em><strong>White-Labeling</strong></em></li></ul></li>
</ul>
<p>Finally, we get to the <strong>developers</strong>:</p>
<ul>
<li>Easy onboarding → <em><strong>Setting up the development environment on a new machine, Fewer third-party dependencies</strong></em></li>
<li>Readable and understandable code → <em><strong>Clean Code, Static Code Analyzers (Linters and Formatters)</strong></em></li>
<li>Fast Build times → <em><strong>Modularization</strong></em></li>
</ul>
<p>I hope now you have a better overview of most of the requirements of a high-quality app, and their impact on <strong>the users, business, and developers</strong>.</p>
<hr />
<ul>
<li>References:</li>
<li><a href="https://blog.instabug.com/mobile-app-quality-an-essential-guide/">Mobile App Quality: An Essential Guide</a></li>
<li><a href="https://nalexn.github.io/save-your-next-app/">Save your next app from rebuilding from scratch</a></li>
<li><a href="https://martinfowler.com/articles/is-quality-worth-cost.html">Martin Fowler: Is High Quality Software Worth the Cost?</a></li>
</ul>]]></description><link>https://www.nafie.dev/blog/what-makes-high-quality-app</link><guid isPermaLink="true">https://www.nafie.dev/blog/what-makes-high-quality-app</guid><category><![CDATA[Tech]]></category><category><![CDATA[Blogs]]></category><category><![CDATA[App Development]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[Mobile Development]]></category><category><![CDATA[High-Quality]]></category><dc:creator><![CDATA[Nafie]]></dc:creator><pubDate>Tue, 23 Aug 2022 14:48:20 GMT</pubDate><content:encoded>&lt;![CDATA[ &lt;img src=&quot;https://www.nafie.dev//img/posts/what-makes-high-quality-app.webp&quot;&gt;</content:encoded><media:content medium="image" url="https://www.nafie.dev//img/posts/what-makes-high-quality-app.webp"></media:content></item><item><title><![CDATA[Why Start A Personal Website?]]></title><description><![CDATA[<p>After entertaining the idea for quite sometime now, these are the reasons that motivated me to finally start my own personal website.</p>
<ul>
<li><strong>Influence and add value</strong> to people by sharing your knowledge.</li>
<li><strong>Exposure</strong>; as your personal website can be that one place that anyone can go to learn everything about you, as it helps you to build your personal brand. Also having your personal domain name helps you make a good impression.</li>
<li><strong>Land a job</strong>; recruiters can find you much more easily.</li>
<li><strong>Broaden my technical perspective</strong>; as a Software Engineer it gives me the opportunity to tinker around with different technologies that I am not familiar with an iOS Developer.</li>
</ul>
<p>✉️ Feel free to reach out to me on <a href="https://www.linkedin.com/in/mostafanafie/"><strong>LinkedIn</strong></a>.</p>
<hr />
<ul>
<li>References:</li>
<li>Articles:<ul>
<li><a href="https://www.topresume.com/career-advice/why-you-need-a-personal-website-asap">Why You Should Create a Personal Website ASAP</a></li></ul></li>
<li>Videos:<ul>
<li><a href="https://www.youtube.com/watch?v=8u45QMEn1o4">How To Create a Personal Website on Notion</a></li></ul></li>
</ul>]]></description><link>https://www.nafie.dev/blog/why-start-a-personal-website</link><guid isPermaLink="true">https://www.nafie.dev/blog/why-start-a-personal-website</guid><category><![CDATA[Non-Tech]]></category><category><![CDATA[Blogs]]></category><dc:creator><![CDATA[Nafie]]></dc:creator><pubDate>Wed, 30 Mar 2022 07:59:49 GMT</pubDate><content:encoded>&lt;![CDATA[ &lt;img src=&quot;https://www.nafie.dev//img/posts/why-start-a-personal-website.webp&quot;&gt;</content:encoded><media:content medium="image" url="https://www.nafie.dev//img/posts/why-start-a-personal-website.webp"></media:content></item></channel></rss>