<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: مصعب يوسف</title>
    <description>The latest articles on DEV Community by مصعب يوسف (@ms3byoussef).</description>
    <link>https://dev.to/ms3byoussef</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F587396%2F8cba00f3-fe0c-4fd6-9e45-b85c9a7da7ba.jpg</url>
      <title>DEV Community: مصعب يوسف</title>
      <link>https://dev.to/ms3byoussef</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ms3byoussef"/>
    <language>en</language>
    <item>
      <title>The Power of Structural Design Patterns in Flutter: Your Ultimate Guide to Building Efficient Apps</title>
      <dc:creator>مصعب يوسف</dc:creator>
      <pubDate>Mon, 26 Oct 2026 07:57:00 +0000</pubDate>
      <link>https://dev.to/ms3byoussef/the-power-of-structural-design-patterns-in-flutter-your-ultimate-guide-to-building-efficient-apps-2oed</link>
      <guid>https://dev.to/ms3byoussef/the-power-of-structural-design-patterns-in-flutter-your-ultimate-guide-to-building-efficient-apps-2oed</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzkimfwd7218c1eo1pgb8.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzkimfwd7218c1eo1pgb8.jpeg" alt="The Power of Structural Design Patterns in Flutter: Your Ultimate Guide to Building Efficient Apps" width="700" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Structural design patterns play an integral role in organizing relationships between objects, facilitating the development of flexible, scalable, and maintainable user interfaces in Flutter applications. A profound understanding of these patterns can significantly enhance the quality, maintainability, and adaptability of your Flutter codebase. In this guide, we delve into nine key structural design patterns in Flutter, offering comprehensive explanations accompanied by practical examples. These examples draw inspiration from the repository available at &lt;a href="https://flutterdesignpatterns.com/" rel="noopener noreferrer"&gt;flutterdesignpatterns.com&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Adapter Pattern
&lt;/h2&gt;

&lt;p&gt;The Adapter Pattern reconciles incompatible interfaces, enabling them to work seamlessly together. In Flutter, this pattern is often used to adapt the interface of an existing class to match the expectations of another class.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;Consider a scenario where you have a &lt;code&gt;SquarePeg&lt;/code&gt; class, but you need to use it in a context where only &lt;code&gt;RoundPeg&lt;/code&gt; is accepted.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class RoundPeg {
  final double radius;
  RoundPeg(this.radius);
}
class SquarePeg {
  final double width;
  SquarePeg(this.width);
}
class SquarePegAdapter extends RoundPeg {
  final SquarePeg squarePeg;
  SquarePegAdapter(this.squarePeg) : super(squarePeg.width * 0.707); // Approximate radius
}
void main() {
  RoundPeg roundPeg = RoundPeg(5.0);
  SquarePeg squarePeg = SquarePeg(5.0);
  RoundPeg adaptedPeg = SquarePegAdapter(squarePeg);
  print('Round Peg Radius: ${roundPeg.radius}');
  print('Adapted Peg Radius: ${adaptedPeg.radius}');
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, &lt;code&gt;SquarePegAdapter&lt;/code&gt; adapts the interface of &lt;code&gt;SquarePeg&lt;/code&gt; to work as a &lt;code&gt;RoundPeg&lt;/code&gt;, allowing both classes to coexist harmoniously.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Bridge Pattern
&lt;/h2&gt;

&lt;p&gt;The Bridge Pattern decouples an abstraction from its implementation, allowing both to evolve independently. In Flutter, this pattern is highly beneficial for separating complex widget hierarchies, thereby improving maintainability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;Consider a scenario where different rendering logic is needed for multiple theme types in your app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;abstract class Theme {
  void applyTheme();
}

class LightTheme implements Theme {
  @override
  void applyTheme() =&amp;gt; print('Applying Light Theme');
}
class DarkTheme implements Theme {
  @override
  void applyTheme() =&amp;gt; print('Applying Dark Theme');
}
abstract class UIComponent {
  Theme theme;
  UIComponent(this.theme);
  void render();
}
class Button extends UIComponent {
  Button(Theme theme) : super(theme);
  @override
  void render() {
    theme.applyTheme();
    print('Rendering Button');
  }
}
void main() {
  Theme darkTheme = DarkTheme();
  UIComponent button = Button(darkTheme);
  button.render();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, &lt;code&gt;Button&lt;/code&gt; and &lt;code&gt;Theme&lt;/code&gt; are independent, allowing &lt;code&gt;Button&lt;/code&gt; to use any implementation of &lt;code&gt;Theme&lt;/code&gt;. This facilitates extensibility, enabling the easy addition of new themes.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Composite Pattern
&lt;/h2&gt;

&lt;p&gt;The Composite Pattern allows treating a group of objects in the same way as a single instance of an object. This pattern is particularly useful in Flutter when dealing with hierarchical UI structures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;Consider a scenario where you need to represent a tree-like structure of widgets.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;abstract class Widget {
  void draw();
}

class TextWidget implements Widget {
  final String text;
  TextWidget(this.text);
  @override
  void draw() =&amp;gt; print('Drawing Text: $text');
}
class ContainerWidget implements Widget {
  final List&amp;lt;Widget&amp;gt; children = [];
  void addChild(Widget widget) =&amp;gt; children.add(widget);
  @override
  void draw() {
    print('Drawing Container');
    for (var child in children) {
      child.draw();
    }
  }
}
void main() {
  ContainerWidget root = ContainerWidget();
  root.addChild(TextWidget('Hello'));
  root.addChild(TextWidget('Flutter'));
  ContainerWidget nested = ContainerWidget();
  nested.addChild(TextWidget('Nested Hello'));
  root.addChild(nested);
  root.draw();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, &lt;code&gt;ContainerWidget&lt;/code&gt; can contain multiple child widgets, allowing the creation of complex, hierarchical UI structures.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Decorator Pattern
&lt;/h2&gt;

&lt;p&gt;The Decorator Pattern dynamically adds functionality to an object without altering its structure. This approach is ideal for adding visual elements to widgets in Flutter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;Consider adding additional properties, such as borders or padding, to a basic &lt;code&gt;TextWidget&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;abstract class TextWidget {
  String render();
}

class SimpleTextWidget implements TextWidget {
  @override
  String render() =&amp;gt; 'Hello, Flutter!';
}
class BorderDecorator extends TextWidget {
  final TextWidget textWidget;
  BorderDecorator(this.textWidget);
  @override
  String render() =&amp;gt; 'Border: [ ${textWidget.render()} ]';
}
class PaddingDecorator extends TextWidget {
  final TextWidget textWidget;
  PaddingDecorator(this.textWidget);
  @override
  String render() =&amp;gt; 'Padding: [ ${textWidget.render()} ]';
}
void main() {
  TextWidget simpleText = SimpleTextWidget();
  TextWidget paddedText = PaddingDecorator(simpleText);
  TextWidget borderedText = BorderDecorator(paddedText);
  print(borderedText.render()); // Output: Border: [ Padding: [ Hello, Flutter! ] ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, the decorators &lt;code&gt;PaddingDecorator&lt;/code&gt; and &lt;code&gt;BorderDecorator&lt;/code&gt; augment the functionality of the &lt;code&gt;TextWidget&lt;/code&gt; without modifying its core implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Facade Pattern
&lt;/h2&gt;

&lt;p&gt;The Facade Pattern provides a simplified interface to a complex system. This pattern is particularly advantageous when dealing with multiple services or third-party integrations in Flutter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;Consider a scenario where you have a complex audio player setup involving multiple subsystems such as playback, volume control, and track management.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class PlaybackSystem {
  void play() =&amp;gt; print('Playing audio');
  void stop() =&amp;gt; print('Stopping audio');
}
class VolumeSystem {
  void setVolume(double level) =&amp;gt; print('Setting volume to $level');
}
class TrackManagementSystem {
  void selectTrack(String track) =&amp;gt; print('Selecting track: $track');
}
class AudioPlayerFacade {
  final PlaybackSystem _playbackSystem = PlaybackSystem();
  final VolumeSystem _volumeSystem = VolumeSystem();
  final TrackManagementSystem _trackManagementSystem = TrackManagementSystem();
  void playTrack(String track) {
    _trackManagementSystem.selectTrack(track);
    _playbackSystem.play();
  }
  void stop() =&amp;gt; _playbackSystem.stop();
  void setVolume(double level) =&amp;gt; _volumeSystem.setVolume(level);
}
void main() {
  AudioPlayerFacade audioPlayer = AudioPlayerFacade();
  audioPlayer.playTrack('My Favorite Song');
  audioPlayer.setVolume(0.8);
  audioPlayer.stop();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;AudioPlayerFacade&lt;/code&gt; simplifies interactions with multiple subsystems by providing a straightforward interface for common operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Proxy Pattern
&lt;/h2&gt;

&lt;p&gt;The Proxy Pattern serves as a placeholder or surrogate for another object, controlling access to it. This pattern is useful for resource management or adding a layer of control in Flutter applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;Consider a scenario where you need to manage access to a large image that requires considerable time to load.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;abstract class Image {
  void load();
}
class RealImage implements Image {
  final String filename;
  RealImage(this.filename);
  @override
  void load() =&amp;gt; print('Loading image: $filename');
}
class ProxyImage implements Image {
  final String filename;
  RealImage? _realImage;
  ProxyImage(this.filename);
  @override
  void load() {
    if (_realImage == null) {
      _realImage = RealImage(filename);
    }
    _realImage!.load();
  }
}
void main() {
  Image image = ProxyImage('big_photo.png');
  image.load(); // Loading occurs only when load() is invoked
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;ProxyImage&lt;/code&gt; acts as a placeholder, with the actual image being loaded only when necessary, thereby optimizing resource usage.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Flyweight Pattern
&lt;/h2&gt;

&lt;p&gt;The Flyweight Pattern minimizes memory usage by sharing as much data as possible among similar objects. This pattern is particularly beneficial in Flutter when dealing with a large number of similar UI components.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;Consider creating multiple icons within a list, each with similar properties.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class IconFlyweight {
  static final Map&amp;lt;String, IconFlyweight&amp;gt; _cache = {};
  final String icon;
factory IconFlyweight(String icon) {
    return _cache.putIfAbsent(icon, () =&amp;gt; IconFlyweight._internal(icon));
  }
  IconFlyweight._internal(this.icon);
  void render() =&amp;gt; print('Rendering icon: $icon');
}
void main() {
  IconFlyweight icon1 = IconFlyweight('home');
  IconFlyweight icon2 = IconFlyweight('settings');
  IconFlyweight icon3 = IconFlyweight('home'); // Reuses the same instance as icon1
  icon1.render();
  icon2.render();
  icon3.render();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;IconFlyweight&lt;/code&gt; class ensures that instances with the same value are reused, optimizing both memory usage and application performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Structural design patterns are essential for organizing and constructing scalable UI components in Flutter. By mastering these seven structural patterns — Adapter, Bridge, Composite, Decorator, Facade, Proxy, and Flyweight — you can significantly enhance your application’s flexibility, maintainability, and efficiency. Experimenting with these patterns will enable you to build more sophisticated, dynamic, and resilient user interfaces, transforming your Flutter development practices to achieve higher standards of quality and scalability.&lt;/p&gt;




&lt;p&gt;Originally published on &lt;a href="https://ms3byoussef.medium.com/the-power-of-structural-design-patterns-in-flutter-your-ultimate-guide-to-building-efficient-apps-dc1edda08273" rel="noopener noreferrer"&gt;Medium&lt;/a&gt; on November 12, 2024.&lt;/p&gt;

</description>
      <category>flutter</category>
    </item>
    <item>
      <title>Updates to make you more productive when developing Flutter Web</title>
      <dc:creator>مصعب يوسف</dc:creator>
      <pubDate>Mon, 26 Oct 2026 07:56:24 +0000</pubDate>
      <link>https://dev.to/ms3byoussef/updates-to-make-you-more-productive-when-developing-flutter-web-3kad</link>
      <guid>https://dev.to/ms3byoussef/updates-to-make-you-more-productive-when-developing-flutter-web-3kad</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjfbox1d9y3nxkadj25zg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjfbox1d9y3nxkadj25zg.png" alt="Updates to make you more productive when developing Flutter Web" width="700" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Peace&lt;/strong&gt; upon you,&lt;/p&gt;

&lt;p&gt;I’m thrilled to share the latest and greatest features that have been introduced in Flutter 3.10 and beyond. Flutter, an open-source UI toolkit developed by Google, continues to evolve, providing developers with powerful tools and faster to build stunning cross-platform applications. Let’s explore some of the features of Flutter’s latest versions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Aside from the nice improvements in Material 3, there are valuable improvements in web&lt;/p&gt;

&lt;h2&gt;
  
  
  Flutter web apps improved load times
&lt;/h2&gt;

&lt;p&gt;Back in the day when you were working on a web app with flutter and after weeks of work you are ready to release your app, you publish it, you open the app in your browser to see the amazing work you’ve done. But the app takes a long time to start!!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F48tt8iuaprulia5ww7m2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F48tt8iuaprulia5ww7m2.png" alt="Updates to make you more productive when developing Flutter Web" width="700" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now! this release reduces the file size of icon fonts. It pruned unused glyphs from both Material and Cupertino and improve image decoding and scrolling speed.&lt;/p&gt;

&lt;p&gt;addition to this, there has been an update to the Flutter lifecycle API which allows you to display a splash screen for your web application while it is loading, which is an excellent enhancement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Embedding a Flutter app into an HTML page
&lt;/h2&gt;

&lt;p&gt;You can &lt;a href="https://docs.flutter.dev/deployment/web#embedding-a-flutter-app-into-an-html-page" rel="noopener noreferrer"&gt;embed&lt;/a&gt; a Flutter web app into any HTML element of your web page, with &lt;code&gt;flutter.js&lt;/code&gt; and the &lt;code&gt;hostElement&lt;/code&gt; engine initialization parameter.&lt;/p&gt;

&lt;p&gt;To tell Flutter web in which element to render, use the &lt;code&gt;hostElement&lt;/code&gt; parameter of the &lt;code&gt;initializeEngine&lt;/code&gt; function.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seamless integration with the web
&lt;/h2&gt;

&lt;p&gt;Flutter is the first framework designed architecturally around new and emerging web technologies like &lt;a href="https://skia.org/docs/user/modules/canvaskit/" rel="noopener noreferrer"&gt;CanvasKit&lt;/a&gt; and &lt;a href="https://webassembly.org/" rel="noopener noreferrer"&gt;WebAssembly&lt;/a&gt;, which particularly suit complex app experiences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Support for WebAssembly (Wasm)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://webassembly.org/" rel="noopener noreferrer"&gt;WebAssembly&lt;/a&gt; (often abbreviated to Wasm) has been growing in maturity as a platform-neutral binary instruction format for &lt;a href="https://caniuse.com/wasm" rel="noopener noreferrer"&gt;modern browsers&lt;/a&gt;. On the web, Flutter has been using Wasm to distribute the CanvasKit runtime, while the Dart framework and application code has historically been compiled to JavaScript. Flutter team ’ve been interested in targeting Wasm, instead of JavaScript, for a while. Until recently, however, Wasm lacked native support for garbage-collected languages like Dart.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmbapujhhi1gx5v82cos6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmbapujhhi1gx5v82cos6.png" alt="Updates to make you more productive when developing Flutter Web" width="700" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;WebAssembly excites Flutter with its potential to bring the performance of native code to the web. Dart’s JavaScript compiler, used across millions of lines of code at Google, already generates fast, well-tuned JavaScript. However, switching to Wasm will give us the efficiency of native code with the portability of JavaScript, which will further improve our performance on the web. In some early benchmarks, we’ve seen a boost of 3× for execution speeds, which translates into yet richer web-based experiences. And Wasm couples this with easier integration with code written in other languages like Kotlin and C .&lt;/p&gt;

&lt;p&gt;For more information, check out &lt;a href="https://docs.flutter.dev/platform-integration/web/initialization" rel="noopener noreferrer"&gt;Customizing web app initialization&lt;/a&gt; on docs.flutter.dev &amp;amp; &lt;a href="https://medium.com/flutter/racing-forward-at-i-o-2023-with-flutter-and-dart-df2a8fa841ab" rel="noopener noreferrer"&gt;new architectures&lt;/a&gt; with WebAssembly&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feb09kvxi09aqgdg6bsj5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feb09kvxi09aqgdg6bsj5.png" alt="Updates to make you more productive when developing Flutter Web" width="700" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Finally…
&lt;/h2&gt;

&lt;p&gt;I would like to talk about an update not only for the web, but also for Flutter in general.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Use the&lt;/strong&gt; &lt;code&gt;MediaQuery.of()&lt;/code&gt; &lt;strong&gt;method in your build functions&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnuvx6sybg0rmwv4gn6mk.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnuvx6sybg0rmwv4gn6mk.jpeg" alt="Updates to make you more productive when developing Flutter Web" width="700" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When some aspect of the flutter &lt;code&gt;MediaQuery&lt;/code&gt; changes, every widget which depends on &lt;code&gt;MediaQuery.of(context)&lt;/code&gt; is rebuilt. Most of these rebuilds are unnecessary, since most changes to &lt;code&gt;MediaQuery&lt;/code&gt; do not change more than 1 or 2 fields at a time (window resizing, system brightness changing, system font scale changing).&lt;/p&gt;

&lt;p&gt;MediaQuery does not change often on mobile, but resizing web happens often and flutter should be able to handle being resized without dropping frames. There is one place that MediaQuery is rapidly updated on mobile: on iOS, as the keyboard opens, &lt;code&gt;MediaQuery&lt;/code&gt; is updated every frame with the only change being the keyboard insets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reference
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.flutter.dev/platform-integration/web/initialization#initializing-the-engine" rel="noopener noreferrer"&gt;https://docs.flutter.dev/platform-integration/web/initialization#initializing-the-engine&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/flutter/flutter/pull/114459" rel="noopener noreferrer"&gt;https://github.com/flutter/flutter/pull/114459&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Originally published on &lt;a href="https://ms3byoussef.medium.com/updates-to-make-you-more-productive-when-developing-flutter-web-22343d22dff5" rel="noopener noreferrer"&gt;Medium&lt;/a&gt; on June 21, 2023.&lt;/p&gt;

</description>
      <category>flutter</category>
    </item>
    <item>
      <title>Generated Code in Flutter ”Freezed”</title>
      <dc:creator>مصعب يوسف</dc:creator>
      <pubDate>Mon, 26 Oct 2026 07:55:18 +0000</pubDate>
      <link>https://dev.to/ms3byoussef/generated-code-in-flutter-freezed-4jlk</link>
      <guid>https://dev.to/ms3byoussef/generated-code-in-flutter-freezed-4jlk</guid>
      <description>&lt;h2&gt;
  
  
  Improve Flutter Developer Skills ‘&lt;strong&gt;Freezed&lt;/strong&gt; Package’
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffnnr4f3knku11612s4kq.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffnnr4f3knku11612s4kq.gif" alt="Generated Code in Flutter ”Freezed”" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Peace be upon you “&lt;br&gt;&lt;br&gt;
We all know that everyone wants to reach the maximum stages of development in work and science, This is no different when you work in the field of mobile application development, Especially with Google developers who have developed flutter the most amazing framework which contains many useful libraries, one of which we will talk about: &lt;code&gt;freezed&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Why we need Freezed ?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Dart is awesome, but defining a “model” can be tedious. You have to:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;define a constructor + properties&lt;/li&gt;
&lt;li&gt;override &lt;code&gt;toString&lt;/code&gt;, &lt;code&gt;operator ==&lt;/code&gt;, &lt;code&gt;hashCode&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;implement a &lt;code&gt;copyWith&lt;/code&gt; method to clone the object&lt;/li&gt;
&lt;li&gt;handle (de)serialization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Implementing all of this can take hundreds of lines, which are error-prone and affect the readability of your model significantly.&lt;/p&gt;

&lt;p&gt;Freezed tries to fix that by implementing most of this for you, allowing you to focus on the definition of your model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features of the &lt;code&gt;freezed&lt;/code&gt; Package
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Immutable Models:&lt;/strong&gt; With &lt;code&gt;freezed&lt;/code&gt;, the generated models are immutable by default. This prevents unintended changes to data and enhances predictability in your application's behavior.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Union Types&lt;/strong&gt;: &lt;code&gt;freezed&lt;/code&gt; allows you to define union types, which represent a value that could be one of several possible types. This is particularly useful for scenarios like representing different states of an entity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pattern Matching:&lt;/strong&gt; The package provides a powerful pattern matching mechanism, similar to pattern matching in functional programming languages. This helps in handling different cases of union types with ease.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CopyWith Method:&lt;/strong&gt; &lt;code&gt;freezed&lt;/code&gt; generates a &lt;code&gt;copyWith&lt;/code&gt; method for each model, enabling you to create modified copies of objects without modifying the original object itself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;As same As Equatable:&lt;/strong&gt; The generated models implement the &lt;code&gt;Equatable&lt;/code&gt; interface, making it easy to compare instances for equality.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;if you don’t know the “Equatable Package”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F60phswv1xd73wsgi629x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F60phswv1xd73wsgi629x.png" alt="Generated Code in Flutter ”Freezed”" width="700" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Equatable&lt;/em&gt;&lt;/strong&gt; is a library that helps implement value equality in Dart classes by overriding the == operator and &lt;strong&gt;&lt;em&gt;hashCode&lt;/em&gt;&lt;/strong&gt; method. It simplifies the process of comparing objects based on their properties.&lt;/p&gt;

&lt;p&gt;To use &lt;strong&gt;&lt;em&gt;Equatable&lt;/em&gt;&lt;/strong&gt;, you need to extend the &lt;strong&gt;&lt;em&gt;Equatable&lt;/em&gt;&lt;/strong&gt; class and override the props method, which returns a list of properties to be used for comparison. The == operator and &lt;strong&gt;&lt;em&gt;hashCode&lt;/em&gt;&lt;/strong&gt; method are automatically generated based on the properties specified in props.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:equatable/equatable.dart';

class Person extends Equatable {
  final String name;
  final int age;

  Person(this.name, this.age);

  @override
  List&amp;lt;Object?&amp;gt; get props =&amp;gt; [name, age];
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;&lt;em&gt;“ Freezed Package “&lt;/em&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;is a code generation library that provides a concise way to create immutable value classes with value equality, pattern matching, Union Types*&lt;em&gt;,&lt;/em&gt;* and copy methods. It generates boilerplate code for you based on the class definition.&lt;/p&gt;

&lt;p&gt;To use &lt;strong&gt;&lt;em&gt;Freezed&lt;/em&gt;&lt;/strong&gt;, you need to annotate your class with @freezed and specify the constructors and properties. &lt;strong&gt;&lt;em&gt;Freezed&lt;/em&gt;&lt;/strong&gt; then generates code for value equality, pattern matching, and copy methods automatically.&lt;/p&gt;

&lt;p&gt;How To Use?&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Add Dependencies
&lt;/h2&gt;

&lt;p&gt;To use Freezed in your Flutter project, you need to add the following dependencies to your pubspec.yaml file:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwsg3y3wg6d82121877eb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwsg3y3wg6d82121877eb.png" alt="Generated Code in Flutter ”Freezed”" width="700" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Create the Freezed Data Model
&lt;/h2&gt;

&lt;p&gt;Define your immutable data model using Freezed. For example, let’s create a simple &lt;code&gt;User&lt;/code&gt; model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:flutter/foundation.dart';
import 'package:freezed_annotation/freezed_annotation.dart';

part 'user.freezed.dart';
@freezed
abstract class User with _$User {
  const factory User({
    String? name,
    String? email,
  }) = _User;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Using Union Types
&lt;/h2&gt;

&lt;p&gt;Imagine a scenario where a &lt;code&gt;Person&lt;/code&gt; can be either a &lt;code&gt;Student&lt;/code&gt; or a &lt;code&gt;Teacher&lt;/code&gt;. We can use union types to represent this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;freezed
abstract class User with _$User{
  const factory User.Client({
    String? name,
    String? email,
    String? phone
  }) = Client;

const factory User.Employee({
    String? name,
    String? email,
    UserRole? role;
  }) = Employee;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;in bloc&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@freezed
abstract class AppState with _$AppState {
  const factory AppState.initial() = _Initial;
  const factory AppState.loading() = _Loading;
  const factory AppState.loaded(List&amp;lt;User&amp;gt; users) = _Loaded;
  const factory AppState.error(String message) = _Error;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Pattern Matching
&lt;/h2&gt;

&lt;p&gt;Pattern matching allows you to handle different cases of union types succinctly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;void printUserInfo(Useruser) {
  user.when(
    clien: (name, age, grade) {
      print('Name: $name, Email: $age, Phone: $phone');
    },
    employee: (name, age, subject) {
      print('Name: $name, Email: $age, Role: ${role.toString}');
    },
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;in bloc&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;void handleAppState(AppState state) {
  state.when(
    initial: () =&amp;gt; print('Initial state'),
    loading: () =&amp;gt; print('Loading state'),
    loaded: (users) =&amp;gt; print('Loaded state with ${users.length} users'),
    error: (message) =&amp;gt; print('Error state: $message'),
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  CopyWith Method
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;copyWith&lt;/code&gt; method enables you to create modified copies of objects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;final mainClient= Person.student(
name: 'Alice',
 email: mo@gmail.com,
 phone: 010101111,
);

final newClient = mainClient.copyWith(
email: lo@gmail.com,
phone: 010102211,
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Goodbye to another Package and the How to Develop Yourself series&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;freezed&lt;/code&gt; package is a powerful tool,Freezed greatly reduces the amount of code that programmers have to creating immutable data models, union types, and pattern matching in Flutter applications. This results in cleaner and easier to understand code. By generating necessary code, it reduces boilerplate, Code generated by Freezed provides type safety, which reduces the chance of runtime errors related to state changes.&lt;br&gt;&lt;br&gt;
Improved developer productivity.&lt;br&gt;&lt;br&gt;
With less manual coding and automatic creation of necessary methods, programmers can focus more on application logic and features and improve overall efficiency.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://resocoder.com/2020/02/11/freezed-data-class-union-in-one-dart-package/" rel="noopener noreferrer"&gt;https://resocoder.com/2020/02/11/freezed-data-class-union-in-one-dart-package/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pub.dev/packages/freezed#how-to-use" rel="noopener noreferrer"&gt;https://pub.dev/packages/freezed#how-to-use&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pub.dev/packages/equatable" rel="noopener noreferrer"&gt;https://pub.dev/packages/equatable&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=tu95Gjl6wS4" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=tu95Gjl6wS4&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@samra.sajjad0001/exploring-the-purpose-and-use-of-the-freezed-package-in-flutter-baec8d52a99f" rel="noopener noreferrer"&gt;https://medium.com/@samra.sajjad0001/exploring-the-purpose-and-use-of-the-freezed-package-in-flutter-baec8d52a99f&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Originally published on &lt;a href="https://ms3byoussef.medium.com/improve-flutter-developer-skills-freezed-package-e0cace053712" rel="noopener noreferrer"&gt;Medium&lt;/a&gt; on July 4, 2024.&lt;/p&gt;

</description>
      <category>flutter</category>
    </item>
    <item>
      <title>Generated Code in Flutter ‘Injectable Package’</title>
      <dc:creator>مصعب يوسف</dc:creator>
      <pubDate>Mon, 26 Oct 2026 07:54:41 +0000</pubDate>
      <link>https://dev.to/ms3byoussef/generated-code-in-flutter-injectable-package-h98</link>
      <guid>https://dev.to/ms3byoussef/generated-code-in-flutter-injectable-package-h98</guid>
      <description>&lt;h2&gt;
  
  
  Improve Flutter Developer Skills “Injectable Package”
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fas0w80ha5dfhxg5f6cgc.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fas0w80ha5dfhxg5f6cgc.gif" alt="Generated Code in Flutter ‘Injectable Package’" width="760" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Dependency Injection” is a 25-dollar term for a 5-cent concept.” &lt;strong&gt;James Shore&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Peace be upon you&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In software development, dependency injection (DI) is a design pattern that fosters loose coupling and enhances code maintainability, modularity, and testability. It revolves around providing a class with the objects (dependencies) it needs to function, rather than having the class create them itself. This separation of concerns leads to several advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Improved Testability:&lt;/strong&gt; You can easily inject mock or test doubles for dependencies during unit testing, isolating the class under test and verifying its behavior effectively.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced Maintainability:&lt;/strong&gt; By making dependencies explicit, changes in their implementation become more manageable. You can swap out concrete implementations without affecting the dependent class.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Increased Flexibility:&lt;/strong&gt; DI allows you to provide different implementations of dependencies based on environments (e.g., development, staging, production) or use cases.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;GetIt&lt;/strong&gt;GetIt is a simple Service Locator package that you can use in your Flutter and Dart projects. Instead of InheritedWidget or Provider, thanks to this package, you can access the objects you have registered in a central registry system from your application’s UI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;injectable&lt;/strong&gt;Injectable is a code generation package written for the get_it package. Using the annotations from this package, we can have injectable_generator create all the codes we need via build_runner.&lt;/p&gt;

&lt;p&gt;Here’s a breakdown of common dependency injection (DI) techniques in Flutter, along with their advantages and considerations:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;1. Constructor Injection:&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Dependencies are explicitly passed as arguments to a class’s constructor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;1.Clear and explicit about dependencies.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;2.Encourages loose coupling.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;3.Well-suited for simple to moderately complex applications.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Considerations:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;.Can lead to lengthy constructors for classes with many dependencies.&lt;/p&gt;

&lt;p&gt;May require additional boilerplate code for testing purposes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2. Setter Injection:&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Description:&lt;/strong&gt; Dependencies are injected through setter methods in a class.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Offers more flexibility for dynamically changing dependencies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Considerations:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Less explicit about dependencies compared to constructor injection.&lt;/li&gt;
&lt;li&gt;Potential for runtime errors if dependencies are not set correctly.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;3. Service Locator Pattern: “&lt;/strong&gt;using GetIt”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Description:&lt;/strong&gt; A global registry that stores and provides instances of dependencies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Convenient for accessing dependencies from anywhere in the application.&lt;/li&gt;
&lt;li&gt;Can be useful for singletons or shared dependencies across the entire app.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Considerations:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Introduces a tight coupling to the service locator itself.&lt;/li&gt;
&lt;li&gt;Overuse can make code less maintainable and harder to test.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;4. Provider Package:&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Description:&lt;/strong&gt; A popular third-party package that offers a provider tree for dependency management.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Simplifies dependency injection throughout the widget tree.&lt;/li&gt;
&lt;li&gt;Promotes a clear and declarative approach to managing dependencies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Considerations:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Might require additional setup compared to other techniques.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now we can add it to our application :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flutter pub add get_it
flutter pub add injectable
flutter pub add injectable_generator --dev
flutter pub add build_runner --dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Create a new dart file and define a global var for your GetIt instance.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:get_it/get_it.dart';

///this must be used in all modules to get the injection
GetIt getIt = GetIt.instance;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Define a top-level function (lets call it configureDependencies) then annotate it with @injectableInit.&lt;/li&gt;
&lt;li&gt;Import the Generated dart file created later on in the code. This will follow the name of the file with the &lt;code&gt;@InjectableInit&lt;/code&gt; annotated func, &lt;strong&gt;eg&lt;/strong&gt; app_injection_container.config.dart.&lt;/li&gt;
&lt;li&gt;Call the Generated extension func getIt.init(), or your custom initializer name inside your configure func.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:injectable/injectable.dart';
@InjectableInit(
  initializerName: 'configureDependencies', // Customize if needed
  preferRelativeImports: true, // Improve code readability
  asExtension: true, // Convenience: Use `GetIt.I.get&amp;lt;T&amp;gt;()`
)
void configureDependencies(final $Env env) =&amp;gt; $env.initFromEnvironment();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Registering Dependencies (Injectable Classes):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Annotate your service or provider classes with &lt;code&gt;@injectable&lt;/code&gt; to indicate they can be injected by the generator:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// api_service.dart
@injectable
class ApiService {
  Future&amp;lt;String&amp;gt; fetchData() async {
    // ... (your API logic)
  }
}
// local_storage_service.dart
@injectable
class LocalStorageService {
  Future&amp;lt;String&amp;gt; getLocalData() async {
    // ... (your local storage logic)
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Running the Generator:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Execute the build command to generate the necessary files (usually &lt;code&gt;injection.g.dart&lt;/code&gt;):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flutter pub run build_runner watch  # For continuous generation as you make changes
# or
flutter pub run build_runner build   # For one-time generation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Utilizing Generated Code:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Import the generated file (e.g., &lt;code&gt;injection.g.dart&lt;/code&gt;) in your &lt;code&gt;main.dart&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:injectable/injectable.dart';
import 'injection.g.dart'; // Generated file
@injectableInit
void configureDependencies() =&amp;gt; $configureDependencies();
void main() async {
  configureDependencies();
  runApp(MyApp());
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Initialize the dependencies using &lt;code&gt;configureDependencies()&lt;/code&gt; before running the app. This function sets up the injectable environment and registers your dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Although Flutter does not have a built-in DI framework, injection is a popular and well-known option for its ease of use, code generation capabilities, and support for different DI styles. It can be a valuable asset for managing dependencies in Flutter applications, especially as your project grows in size and complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=KNcP8z0hWqs" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=KNcP8z0hWqs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pub.dev/packages/injectable#setup" rel="noopener noreferrer"&gt;https://pub.dev/packages/injectable#setup&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Originally published on &lt;a href="https://ms3byoussef.medium.com/improve-flutter-developer-skills-injectable-package-89fca602862e" rel="noopener noreferrer"&gt;Medium&lt;/a&gt; on July 7, 2024.&lt;/p&gt;

</description>
      <category>flutter</category>
    </item>
    <item>
      <title>Generated Code in Flutter ”AutoRoute”</title>
      <dc:creator>مصعب يوسف</dc:creator>
      <pubDate>Mon, 26 Oct 2026 07:53:58 +0000</pubDate>
      <link>https://dev.to/ms3byoussef/generated-code-in-flutter-autoroute-4fal</link>
      <guid>https://dev.to/ms3byoussef/generated-code-in-flutter-autoroute-4fal</guid>
      <description>&lt;h2&gt;
  
  
  Improve Flutter Developer Skills ‘AutoRoute Package’
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkp6zvemkzrnn8mzbtstj.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkp6zvemkzrnn8mzbtstj.jpeg" alt="Generated Code in Flutter ”AutoRoute”" width="700" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Peace be upon you “&lt;br&gt;&lt;br&gt;
We all know that everyone wants to reach the maximum stages of development in work and science, This is no different when you work in the field of mobile application development, Especially with Google developers who have developed flutter the most amazing framework which contains many useful libraries, one of which we will talk about:&lt;/em&gt; &lt;code&gt;auto_route&lt;/code&gt; &lt;strong&gt;&lt;em&gt;with&lt;/em&gt;&lt;/strong&gt; &lt;code&gt;injectable&lt;/code&gt; &lt;strong&gt;&lt;em&gt;&amp;amp;&amp;amp;&lt;/em&gt;&lt;/strong&gt; &lt;code&gt;get_it&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;What is routing?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Flutter, routing refers to the mechanism for navigating between different screens or pages within your application. It’s essentially how users flow through your app and access information.&lt;/p&gt;

&lt;p&gt;Here’s a breakdown of the concept:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Screens as Routes:&lt;/strong&gt; Each screen in your Flutter app is considered a route. It’s a Widget that builds the UI for that particular screen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Navigator Widget:&lt;/strong&gt; The core of routing in Flutter is the Navigator class. This class, typically provided by MaterialApp or CupertinoApp, manages the navigation stack and transitions between routes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Navigation Methods:&lt;/strong&gt; The Navigator provides methods for pushing new routes onto the stack (like pushing a new screen on top) and popping routes off (going back to the previous screen). Common methods include &lt;code&gt;push&lt;/code&gt; and &lt;code&gt;pop&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why AutoRoute?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AutoRoute is a popular routing package for Flutter that simplifies navigation management within your app. It offers several advantages over basic routing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Generation:&lt;/strong&gt; AutoRoute uses code generation to automate a lot of the boilerplate code associated with routing. You define your routes using annotations, and the package generates the necessary classes and methods for navigation. This reduces development time and improves code readability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Type Safety:&lt;/strong&gt; AutoRoute enforces type safety for arguments passed between screens. This helps prevent errors and makes your code more maintainable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deep Linking:&lt;/strong&gt; AutoRoute simplifies deep linking, a feature that allows users to navigate to specific parts of your app from a URL. This is useful for sharing specific content or functionality within your app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Other Features:&lt;/strong&gt; AutoRoute offers additional features like nested navigation (handling tabs within your navigation flow) and guarded routes (restricting access to certain screens based on conditions).&lt;/p&gt;

&lt;p&gt;Here’s a quick overview of how AutoRoute works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Define Routes:&lt;/strong&gt; You define your app’s routes using annotations like &lt;code&gt;@RoutePage&lt;/code&gt; on your screen widgets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate Code:&lt;/strong&gt; You run a command to generate code based on your route definitions. This creates classes and methods for navigation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Navigate:&lt;/strong&gt; You use the generated router object to navigate between screens. AutoRoute handles argument passing, deep linking, and transitions automatically.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;To get started, add auto_route to your pubspec.yaml. We also need to add &lt;code&gt;auto_route_generator&lt;/code&gt; and &lt;code&gt;get_it&lt;/code&gt; and &lt;code&gt;build_runner&lt;/code&gt; to generate our routes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ful6je90faz0rok485ftr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ful6je90faz0rok485ftr.png" alt="Generated Code in Flutter ”AutoRoute”" width="700" height="744"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits of Injectable:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reduced Boilerplate:&lt;/strong&gt; Injectable eliminates the need to write manual code for registering and retrieving dependencies with GetIt. This saves development time and improves code clarity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improved Maintainability:&lt;/strong&gt; By keeping dependency configuration centralized with annotations, Injectable makes it easier to manage and update dependencies throughout your app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testability:&lt;/strong&gt; Since dependencies are injected, you can easily mock them during testing, isolating the behavior of your classes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;you can see in our Series&lt;/p&gt;

&lt;h3&gt;
  
  
  Route Configuration
&lt;/h3&gt;

&lt;p&gt;Lets add Auto Router configuration to your app:&lt;/p&gt;

&lt;p&gt;Create a router class and annotate it with &lt;code&gt;@AutoRouterConfig&lt;/code&gt; then extend "_$AppRouter"&lt;br&gt;&lt;br&gt;
in old version &lt;code&gt;@MaterialAutoRoute()&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Override the &lt;code&gt;routes&lt;/code&gt; getter
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// ignore_for_file: override_on_non_overriding_member

import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';

import 'app_router.gr.dart';

@AutoRouterConfig(replaceInRouteName: 'Screen,Route')
class AppRouter extends $AppRouter {
  AppRouter(GlobalKey&amp;lt;NavigatorState&amp;gt; navigatorKey);

  @override
  List&amp;lt;AutoRoute&amp;gt; get routes =&amp;gt; [
        AutoRoute(
          path: '/home',initial: true, page: HomeRoute.page,
          children: [
        AutoRoute(page: ProfilePage, guards: [AuthGuard()],), // List of guards to check
          ],
        ),
      ];
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;using guards with auto_route in a Flutter app to restrict access to a specific route:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';

// Define a custom Guard class
class AuthGuard extends AutoRouteGuard {
  @override
  void onNavigation(NavigationRedirect redirect) {
    // Check if user is authenticated (replace with your logic)
    final isAuthenticated = false; // Replace with actual authentication check
    if (!isAuthenticated) {
      // Redirect to Login if not authenticated
      redirect.push(LoginPage());
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in page you chose:&lt;br&gt;&lt;br&gt;
add @RoutePage()&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:auto_route/annotations.dart';
import 'package:flutter/material.dart';

import 'widgets/users_view_body.dart';

@RoutePage()
class UsersScreen extends StatelessWidget {
  const UsersScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return const Scaffold(
      body: UsersViewBody(),
    );
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now simply run build_runner to generate our route, run one of commands below&lt;/p&gt;

&lt;p&gt;(I recommend watch)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// to watch the files's system edits and rebuild as necessary
dart run build_runner watch

// to run build_runner just once
dart run build_runner build --delete-conflicting-outputs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;put our router configuration let’s hook it up to &lt;code&gt;MaterialApp&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MyApp extends StatelessWidget {
  MyApp({super.key});

  /// create an instance of `AppRouter`
  final _appRouter = AppRouter();

  @override
  Widget build(BuildContext context) {
    return MaterialApp.router(
      // hook up router to MaterialApp
      routerConfig: _appRouter.config(),
    );
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;We define an &lt;code&gt;InjectableModule&lt;/code&gt; for registering services.&lt;/li&gt;
&lt;li&gt;We create an &lt;code&gt;AuthGuard&lt;/code&gt; class that injects the &lt;code&gt;AppRouter&lt;/code&gt; and checks for authentication before navigation.&lt;/li&gt;
&lt;li&gt;In the router definition, we apply the &lt;code&gt;AuthGuard&lt;/code&gt; to specific routes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft0rdxl20ng2361mv1qcj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft0rdxl20ng2361mv1qcj.png" alt="Generated Code in Flutter ”AutoRoute”" width="700" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AppRouter wit get_it can we accessed anywhere in the app without context&lt;/p&gt;

&lt;p&gt;getIt().push(widgetRouter)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// assuming this is the root widget of your App
class App extends StatelessWidget {
  // make sure you don't initiate your router
  // inside of the build function.
  final _appRouter = AppRouter();

  @override
  Widget build(BuildContext context){
    return MaterialApp.router(
      routerConfig: _appRouter.config(),
    );
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After you run the generator, your router class will be generated. Then simply hook it up with your MaterialApp.&lt;/p&gt;

&lt;p&gt;you can use &lt;code&gt;push&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;getIt().push(widgetRouter)&lt;/p&gt;

&lt;p&gt;you can use &lt;code&gt;pop&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;getIt().pop()&lt;/p&gt;

&lt;p&gt;in new version&lt;/p&gt;

&lt;p&gt;getIt().pop()&lt;/p&gt;

&lt;h2&gt;
  
  
  Nested Navigation
&lt;/h2&gt;

&lt;p&gt;Nested navigation means building an inner router inside of a page of another router, for example in the below diagram users page is built inside of dashboard page.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@AutoRouterConfig(replaceInRouteName: 'Page,Route')
class AppRouter extends $AppRouter {

@override
List&amp;lt;AutoRoute&amp;gt; get routes =&amp;gt; [
    AutoRoute(
      path: '/dashboard',
      page: DashboardRoute.page,
      children: [
        AutoRoute(path: 'users', page: UsersRoute.page),
        AutoRoute(path: 'posts', page: PostsRoute.page),
        AutoRoute(path: 'settings', page: SettingsRoute.page),
      ],
    ),
    AutoRoute(path: '/login', page: LoginRoute.page,gards:AuthGards()),
  ];
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5i2y3s72yvq23g4iqupn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5i2y3s72yvq23g4iqupn.png" alt="Generated Code in Flutter ”AutoRoute”" width="700" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Nested Tab navigation
&lt;/h2&gt;

&lt;p&gt;Some apps display destinations in a subsection of the screen, for example, a BottomNavigationBar that stays on-screen when navigating between Screens.&lt;/p&gt;

&lt;p&gt;Since this is not an easy task to implement with Flutter apps &lt;code&gt;auto_route&lt;/code&gt; makes tabs navigation as easy and straightforward as possible.&lt;/p&gt;

&lt;p&gt;We’ll use &lt;code&gt;AutoTabsRouter&lt;/code&gt; to handle tab navigation&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class DashboardPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return AutoTabsScaffold(
      routes: const [
        UsersRoute(),
        PostsRoute(),
        SettingsRoute(),
      ],
      bottomNavigationBuilder: (_, tabsRouter) {
        return BottomNavigationBar(
          currentIndex: tabsRouter.activeIndex,
          onTap: tabsRouter.setActiveIndex,
          items: const [
            BottomNavigationBarItem(label: 'Users', ...),
            BottomNavigationBarItem(label: 'Posts', ...),
            BottomNavigationBarItem(label: 'Settings', ...),
          ],
        );
      },
    );
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;we can learn about Nested Navigation &amp;amp;&amp;amp; Tab Navigation &amp;amp;&amp;amp;Using TabBar&lt;/p&gt;

&lt;p&gt;in the documentation of package that’s awesome&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pub.dev/packages/auto_route#nested-navigation" rel="noopener noreferrer"&gt;https://pub.dev/packages/auto_route#nested-navigation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fle7niozcgerwepaz042l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fle7niozcgerwepaz042l.png" alt="Generated Code in Flutter ”AutoRoute”" width="700" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To&lt;/strong&gt; Improved developer experience with reduced boilerplate code, Type safety with strongly-typed arguments. Deep linking capabilities. Increased control over navigation with guards and transitions you should use &lt;code&gt;**Auto\_route**&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remember:&lt;/strong&gt; AutoRoute works seamlessly with dependency injection frameworks like GetIt and Injectable. You can inject required services into your screens using these frameworks while utilizing AutoRoute for navigation.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://pub.dev/packages/auto_route" rel="noopener noreferrer"&gt;https://pub.dev/packages/auto_route&lt;/a&gt;&lt;a href="https://medium.com/@antonio.tioypedro1234/flutter-auto-route-guide-9ac405e8a941" rel="noopener noreferrer"&gt;https://medium.com/@antonio.tioypedro1234/flutter-auto-route-guide-9ac405e8a941&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=KzqKfYypvqs" rel="noopener noreferrer"&gt;&lt;em&gt;https://www.youtube.com/watch?v=KzqKfYypvqs&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Originally published on &lt;a href="https://ms3byoussef.medium.com/improve-flutter-developer-skills-autoroute-package-34407beb2aba" rel="noopener noreferrer"&gt;Medium&lt;/a&gt; on July 13, 2024.&lt;/p&gt;

</description>
      <category>flutter</category>
    </item>
    <item>
      <title>State Management in Flutter: Provider vs Riverpod vs Bloc</title>
      <dc:creator>مصعب يوسف</dc:creator>
      <pubDate>Mon, 26 Oct 2026 07:52:35 +0000</pubDate>
      <link>https://dev.to/ms3byoussef/state-management-in-flutter-provider-vs-riverpod-vs-bloc-86j</link>
      <guid>https://dev.to/ms3byoussef/state-management-in-flutter-provider-vs-riverpod-vs-bloc-86j</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwjpyi9cp9zltgsiwaqzz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwjpyi9cp9zltgsiwaqzz.png" alt="State Management in Flutter: Provider vs Riverpod vs Bloc" width="700" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;State management is a crucial aspect of Flutter app development. It allows developers to control how data flows throughout the app, ensuring the user interface remains responsive and in sync with underlying data changes. In this article, we will compare three popular state management solutions in Flutter: &lt;strong&gt;Provide&lt;/strong&gt;, &lt;strong&gt;Riverpod&lt;/strong&gt;, and &lt;strong&gt;Bloc&lt;/strong&gt;. We will also explore how these approaches integrate with Clean &lt;strong&gt;Architecture&lt;/strong&gt;, complete with code examples and use cases.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is State Management?
&lt;/h2&gt;

&lt;p&gt;State management refers to the process of controlling and maintaining the state of an application in a structured manner. It involves ensuring that the user interface accurately reflects the current data and that any changes to the data are properly propagated to the UI. Effective state management becomes especially important in larger applications where multiple components need to stay synchronized.&lt;/p&gt;

&lt;h2&gt;
  
  
  Overview of Clean Architecture
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Clean Architecture&lt;/strong&gt; is a software design philosophy aimed at creating a maintainable and testable codebase by separating concerns into different layers. In Flutter applications, Clean Architecture typically divides the code into three main layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Data Layer&lt;/strong&gt;: Manages data from various sources such as APIs and databases and transforms raw data into usable formats.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain Layer&lt;/strong&gt;: Contains the core business logic. It is independent of any data source, making it highly reusable and easy to test.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Presentation Layer&lt;/strong&gt;: Manages the user interface and interacts with state management to determine what is displayed to the user.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let’s explore how &lt;strong&gt;Provider&lt;/strong&gt;, &lt;strong&gt;Riverpod&lt;/strong&gt;, and &lt;strong&gt;Bloc&lt;/strong&gt; can be integrated into this architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  1.Provider
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Provider&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;is one of the simplest and most widely used state management solutions for Flutter. It utilizes&lt;/em&gt; &lt;code&gt;InheritedWidgets&lt;/code&gt; &lt;em&gt;to efficiently pass state through the widget tree.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Use Provider?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simple and Lightweight&lt;/strong&gt;: Easy to set up, especially for developers seeking a quick and minimal solution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Good for Small or Medium-Sized Applications&lt;/strong&gt;: Suitable for apps with straightforward requirements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seamless Dependency Injection&lt;/strong&gt;: Works well with Clean Architecture for injecting dependencies into widgets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limitations&lt;/strong&gt;: Not recommended for managing complex state or for large applications requiring advanced features.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Example: Login Flow with Clean Architecture&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;To illustrate how Provider can be used in a Flutter app, let’s implement a simple login flow using the Clean Architecture model:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.Domain Layer :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class LoginUseCase {
 final AuthRepository repository;
LoginUseCase({required this.repository});
Future&amp;lt;bool&amp;gt; execute(String username, String password) async {
 return await repository.login(username, password);
 }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;. Data Layer :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class AuthRepository {
 final AuthRemoteDataSource remoteDataSource;
AuthRepository({required this.remoteDataSource});
Future&amp;lt;bool&amp;gt; login(String username, String password) async {
 return await remoteDataSource.authenticate(username, password);
 }
}
class AuthRemoteDataSource {
 Future&amp;lt;bool&amp;gt; authenticate(String username, String password) async {
 // Simulate authentication
 await Future.delayed(Duration(seconds: 2));
 return username == 'user' &amp;amp;&amp;amp; password == 'password';
 }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;. Presentation Layer (Provider Implementation) :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class AuthViewModel with ChangeNotifier {
 final LoginUseCase loginUseCase;
 bool _isLoading = false;
 bool? _isAuthenticated;
AuthViewModel({required this.loginUseCase});

bool get isLoading =&amp;gt; _isLoading;
 bool? get isAuthenticated =&amp;gt; _isAuthenticated;
Future&amp;lt;void&amp;gt; login(String username, String password) async {
 _isLoading = true;
 notifyListeners();
_isAuthenticated = await loginUseCase.execute(username, password);
 _isLoading = false;
 notifyListeners();
 }
}

void main() {
 runApp(
 MultiProvider(
 providers: [
 ChangeNotifierProvider(
 create: (_) =&amp;gt; AuthViewModel(loginUseCase: LoginUseCase(repository: AuthRepository(remoteDataSource: AuthRemoteDataSource()))),
 )],
 child: MyApp(),),);
}


class MyApp extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
 return MaterialApp(
 home: LoginScreen(),
 );
 }
}
class LoginScreen extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
 final viewModel = Provider.of&amp;lt;AuthViewModel&amp;gt;(context);
 return Scaffold(
 appBar: AppBar(title: Text('Login with Provider')),
 body: Center(
 child: Column(
 mainAxisAlignment: MainAxisAlignment.center,
 children: [
 if (viewModel.isLoading) CircularProgressIndicator(),
 if (!viewModel.isLoading &amp;amp;&amp;amp; viewModel.isAuthenticated == false) Text('Login failed'),
 if (!viewModel.isLoading &amp;amp;&amp;amp; viewModel.isAuthenticated == true) Text('Login successful'),
 ElevatedButton(
 onPressed: () =&amp;gt; viewModel.login('user', 'password'),
 child: Text('Login'),
             ),
           ],
         ),
       ),
     );
   }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Riverpod
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Riverpod&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;builds on the foundations of Provider, addressing many of its limitations by offering more flexibility and better dependency injection. It is especially well-suited for larger, more complex applications.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Use Riverpod?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advanced and Flexible&lt;/strong&gt;: Suitable for applications with more sophisticated state management needs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Great for Scalability&lt;/strong&gt;: Works effectively for apps that need to grow and handle complex requirements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stateless State Management&lt;/strong&gt;: Encourages a design where state is decoupled from the UI, making it more modular and reusable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Use Riverpod?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advanced and Flexible&lt;/strong&gt;: Suitable for applications with more sophisticated state management needs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Great for Scalability&lt;/strong&gt;: Works effectively for apps that need to grow and handle complex requirements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stateless State Management&lt;/strong&gt;: Encourages a design where state is decoupled from the UI, making it more modular and reusable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example: Login Flow with Riverpod :&lt;/strong&gt;&lt;em&gt;Here’s how to use Riverpod for a login flow within the Clean Architecture framework:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;. Domain Layer :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class LoginUseCase {
 final AuthRepository repository;
LoginUseCase({required this.repository});
Future&amp;lt;bool&amp;gt; execute(String username, String password) async {
 return await repository.login(username, password);
 }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;. &lt;strong&gt;Data Layer :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class AuthRepository {
 final AuthRemoteDataSource remoteDataSource;
AuthRepository({required this.remoteDataSource});
Future&amp;lt;bool&amp;gt; login(String username, String password) async {
 return await remoteDataSource.authenticate(username, password);
 }
}
class AuthRemoteDataSource {
 Future&amp;lt;bool&amp;gt; authenticate(String username, String password) async {
 // Simulate authentication
 await Future.delayed(Duration(seconds: 2));
 return username == 'user' &amp;amp;&amp;amp; password == 'password';
 }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Presentation&lt;/strong&gt; Layer (Riverpod Implementation)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

final authRepositoryProvider = Provider((ref) =&amp;gt; AuthRepository(remoteDataSource: AuthRemoteDataSource()));
final loginUseCaseProvider = Provider((ref) =&amp;gt; LoginUseCase(repository: ref.read(authRepositoryProvider)));
final authProvider = StateNotifierProvider&amp;lt;AuthNotifier, AuthState&amp;gt;((ref) {
  return AuthNotifier(loginUseCase: ref.read(loginUseCaseProvider));
});

class AuthNotifier extends StateNotifier&amp;lt;AuthState&amp;gt; {
  final LoginUseCase loginUseCase;

  AuthNotifier({required this.loginUseCase}) : super(AuthInitial());

  Future&amp;lt;void&amp;gt; login(String username, String password) async {
    state = AuthLoading();
    final success = await loginUseCase.execute(username, password);
    if (success) {
      state = AuthSuccess();
    } else {
      state = AuthFailure();
    }
  }
}

void main() {
  runApp(ProviderScope(child: MyApp()));
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: LoginScreen(),
    );
  }
}

class LoginScreen extends ConsumerWidget {
  @override
  Widget build(BuildContext context, ScopedReader watch) {
    final authState = watch(authProvider);
    final authNotifier = context.read(authProvider.notifier);

    return Scaffold(
      appBar: AppBar(title: Text('Login with Riverpod')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            if (authState is AuthLoading) CircularProgressIndicator(),
            if (authState is AuthFailure) Text('Login failed'),
            if (authState is AuthSuccess) Text('Login successful'),
            ElevatedButton(
              onPressed: () =&amp;gt; authNotifier.login('user', 'password'),
              child: Text('Login'),
            ),
          ],
        ),
      ),
    );
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3.Bloc
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Bloc (Business Logic Component)&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;is one of the most powerful and structured state management solutions in Flutter. It excels at separating the UI from the business logic, providing a clear structure to handle complex state changes.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Use Bloc?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Highly Suitable for Complex Applications&lt;/strong&gt;: Bloc is ideal for projects with extensive business logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ensures Separation of Concerns&lt;/strong&gt;: Keeps the business logic distinct from the UI, enhancing maintainability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scales Well with Clean Architecture&lt;/strong&gt;: Especially effective in managing intricate state changes across the application.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example: Login Flow with Bloc
&lt;/h2&gt;

&lt;p&gt;Here’s how to use Bloc for a login flow within the Clean Architecture framework:&lt;/p&gt;

&lt;h3&gt;
  
  
  Domain Layer
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class LoginUseCase {
  final AuthRepository repository;

  LoginUseCase({required this.repository});

  Future&amp;lt;bool&amp;gt; execute(String username, String password) async {
    return await repository.login(username, password);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Data Layer
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class AuthRepository {
  final AuthRemoteDataSource remoteDataSource;

  AuthRepository({required this.remoteDataSource});

  Future&amp;lt;bool&amp;gt; login(String username, String password) async {
    return await remoteDataSource.authenticate(username, password);
  }
}

class AuthRemoteDataSource {
  Future&amp;lt;bool&amp;gt; authenticate(String username, String password) async {
    // Simulate authentication
    await Future.delayed(Duration(seconds: 2));
    return username == 'user' &amp;amp;&amp;amp; password == 'password';
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Presentation Layer (Bloc Implementation)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

class AuthCubit extends Cubit&amp;lt;AuthState&amp;gt; {
  final LoginUseCase loginUseCase;

  AuthCubit({required this.loginUseCase}) : super(AuthInitial());

  void login(String username, String password) async {
    emit(AuthLoading());
    final success = await loginUseCase.execute(username, password);
    if (success) {
      emit(AuthSuccess());
    } else {
      emit(AuthFailure());
    }
  }
}

abstract class AuthState {}

class AuthInitial extends AuthState {}

class AuthLoading extends AuthState {}

class AuthSuccess extends AuthState {}

class AuthFailure extends AuthState {}

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: BlocProvider(
        create: (_) =&amp;gt; AuthCubit(loginUseCase: LoginUseCase(repository: AuthRepository(remoteDataSource: AuthRemoteDataSource()))),
        child: LoginScreen(),
      ),
    );
  }
}

class LoginScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Login with Bloc')),
      body: BlocBuilder&amp;lt;AuthCubit, AuthState&amp;gt;(
        builder: (context, state) {
          if (state is AuthLoading) {
            return Center(child: CircularProgressIndicator());
          } else if (state is AuthFailure) {
            return Center(child: Text('Login failed'));
          } else if (state is AuthSuccess) {
            return Center(child: Text('Login successful'));
          }
          return Center(
            child: ElevatedButton(
              onPressed: () =&amp;gt; context.read&amp;lt;AuthCubit&amp;gt;().login('user', 'password'),
              child: Text('Login'),
            ),
          );
        },
      ),
    );
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Choosing the right state management solution is crucial for the maintainability and scalability of your Flutter application. &lt;strong&gt;Provider&lt;/strong&gt; is a great choice for smaller projects due to its simplicity, &lt;strong&gt;Riverpod&lt;/strong&gt; offers more advanced features and flexibility, making it suitable for larger projects, and &lt;strong&gt;Bloc&lt;/strong&gt; is ideal for complex applications with extensive business logic. Each approach integrates effectively with &lt;strong&gt;Clean Architecture&lt;/strong&gt;, allowing you to create a well-structured and maintainable Flutter app.&lt;/p&gt;




&lt;p&gt;Originally published on &lt;a href="https://ms3byoussef.medium.com/state-management-in-flutter-provider-vs-riverpod-vs-bloc-333795f0df22" rel="noopener noreferrer"&gt;Medium&lt;/a&gt; on November 12, 2024.&lt;/p&gt;

</description>
      <category>flutter</category>
    </item>
    <item>
      <title>Ultimate Step-by-Step Guide to CI/CD with Fastlane in Flutter (Mac &amp; Windows)</title>
      <dc:creator>مصعب يوسف</dc:creator>
      <pubDate>Mon, 26 Oct 2026 07:52:24 +0000</pubDate>
      <link>https://dev.to/ms3byoussef/ultimate-step-by-step-guide-to-cicd-with-fastlane-in-flutter-mac-windows-5gg7</link>
      <guid>https://dev.to/ms3byoussef/ultimate-step-by-step-guide-to-cicd-with-fastlane-in-flutter-mac-windows-5gg7</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy8g1no3h7uoqkgec8slb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy8g1no3h7uoqkgec8slb.png" alt="Ultimate Step-by-Step Guide to CI/CD with Fastlane in Flutter (Mac &amp;amp; Windows)" width="700" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setting up CI/CD (Continuous Integration and Continuous Deployment) is a must for modern Flutter developers who want to streamline app development, testing, and delivery. Manual builds and uploads are tedious, error-prone, and time-consuming. That’s where Fastlane comes in — an incredibly powerful automation tool that simplifies building, testing, and releasing Flutter apps for both Android and iOS platforms.&lt;/p&gt;

&lt;p&gt;In this extended guide, I’ll walk you through setting up Fastlane for your Flutter projects on &lt;strong&gt;Mac&lt;/strong&gt; (for both iOS and Android) and &lt;strong&gt;Windows&lt;/strong&gt; (for Android builds), using real-world examples and production-ready configurations.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Fastlane and Why Use It?
&lt;/h2&gt;

&lt;p&gt;Fastlane is an open-source automation tool designed specifically for mobile developers. It allows you to automate repetitive tasks such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building and archiving your apps&lt;/li&gt;
&lt;li&gt;Running tests across devices and platforms&lt;/li&gt;
&lt;li&gt;Managing code signing and provisioning profiles&lt;/li&gt;
&lt;li&gt;Publishing apps to the Google Play Store and Apple App Store&lt;/li&gt;
&lt;li&gt;Distributing pre-release builds to testers with services like TestFlight or Firebase App Distribution&lt;/li&gt;
&lt;li&gt;Automating versioning, screenshots, changelogs, and more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By integrating Fastlane into your development workflow, you can ensure consistent builds, reduce human error, and speed up your delivery process significantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements Breakdown
&lt;/h2&gt;

&lt;p&gt;Before diving in, ensure your environment is ready:&lt;/p&gt;

&lt;h2&gt;
  
  
  Mac Requirements (for Android &amp;amp; iOS)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Latest version of &lt;strong&gt;Xcode&lt;/strong&gt; installed (for iOS builds)&lt;/li&gt;
&lt;li&gt;Flutter SDK properly installed&lt;/li&gt;
&lt;li&gt;Android Studio with SDK &amp;amp; command-line tools&lt;/li&gt;
&lt;li&gt;Homebrew package manager (optional, but recommended)&lt;/li&gt;
&lt;li&gt;Ruby &amp;amp; RubyGems for Fastlane installation&lt;/li&gt;
&lt;li&gt;Valid Apple Developer Account for iOS deployment&lt;/li&gt;
&lt;li&gt;Google Play Console access for Android releases&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Windows Requirements (for Android only)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Flutter SDK installed and configured&lt;/li&gt;
&lt;li&gt;Android Studio with SDK &amp;amp; command-line tools&lt;/li&gt;
&lt;li&gt;Git Bash or terminal for command execution&lt;/li&gt;
&lt;li&gt;Ruby &amp;amp; RubyGems for installing Fastlane&lt;/li&gt;
&lt;li&gt;Google Play Console access for uploading builds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note: iOS builds can only be performed on macOS due to Apple’s restrictions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-Step Setup for Android CI/CD (Windows &amp;amp; Mac)
&lt;/h2&gt;

&lt;h2&gt;
  
  
  1. Install Fastlane
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;On both Mac and Windows:&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  On Windows:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Download &lt;strong&gt;RubyInstaller&lt;/strong&gt;: &lt;a href="https://rubyinstaller.org/" rel="noopener noreferrer"&gt;https://rubyinstaller.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;During installation, check &lt;strong&gt;Add Ruby to PATH.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;After installation, open Git Bash or PowerShell and run&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;-NV&lt;/code&gt; &lt;em&gt;speeds up the installation process by disabling documentation downloads.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gem install fastlane -NV
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively, on Mac:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install fastlane
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fastlane --version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Navigate to Your Flutter Android Directory
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd path/to/your/flutter/project/android
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Initialize Fastlane
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fastlane init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Follow the setup prompts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select “Manual setup”&lt;/li&gt;
&lt;li&gt;Choose “Android”&lt;/li&gt;
&lt;li&gt;You’ll create lanes for tasks like building, testing, and deploying&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Example Fastfile for Android Automation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;-Simplified code&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;default_platform(:android)

platform :android do
  desc "Clean project and build release AAB"
  lane :build_release do
    gradle(task: "clean")
    gradle(task: "bundle", build_type: "Release")
  end
  desc "Deploy to Internal Testing Track"
  lane :deploy_internal do
    build_release
    upload_to_play_store(track: 'internal')
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;-&lt;strong&gt;&lt;em&gt;Professional code&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;default_platform(:android)

platform :android do
  desc "Build Flutter AppBundle (AAB) for release"
  lane :build_aab_release do
    UI.message("Cleaning Flutter project...")
    sh "flutter clean"

    UI.message("Building Flutter AAB for release...")
    sh "flutter build appbundle --release"

    UI.success("AAB built successfully at: build/app/outputs/bundle/release/app-release.aab 🎉")
  end

  desc "Deploy AAB to Google Play Internal Testing Track"
  lane :deploy_internal do
    build_aab_release

    UI.message("Uploading to Google Play Internal Testing Track...")
    upload_to_play_store(
      track: "internal",
      aab: "build/app/outputs/bundle/release/app-release.aab",
      skip_waiting_for_build_processing: true
    )

    UI.success("Deployment to Google Play Internal Testing completed! 🚀")
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also add lanes for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Firebase Distribution&lt;/li&gt;
&lt;li&gt;Beta tracks&lt;/li&gt;
&lt;li&gt;Automated version bumps&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Run Fastlane for Android Builds
&lt;/h2&gt;

&lt;p&gt;To build your Android AAB:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd android
fastlane build_aab_release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To deploy to Google Play Internal Testing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fastlane android deploy_internal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Play Store uploads, set up Google Play API credentials as per the official Fastlane guide.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-Step Setup for iOS CI/CD (Mac Only)
&lt;/h2&gt;

&lt;h2&gt;
  
  
  1. Navigate to iOS Directory
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd path/to/your/flutter/project/ios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Initialize Fastlane for iOS
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fastlane init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Choose “Manual setup” to have full control over your lanes.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Example Fastfile for iOS Builds and Deployment
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;-Simplified code&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;default_platform(:ios)

platform :ios do
  desc "Build iOS app for release"
  lane :build_release do
    build_ios_app(scheme: "Runner")
  end
  desc "Upload to TestFlight"
  lane :deploy_testflight do
    build_release
    upload_to_testflight
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;-&lt;strong&gt;&lt;em&gt;Professional code&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;default_platform(:ios)

platform :ios do
  desc "Builds the iOS app for release (IPA file)"
  lane :build_ipa_release do |options|
    UI.message("Starting Flutter clean...")
    sh "flutter clean"

    UI.message("Building Flutter iOS release...")
    sh "flutter build ios --release"

    UI.message("Building iOS IPA file...")
    build_ios_app(
      scheme: "Runner",
      configuration: "Release",
      silent: true,
      clean: true,
      output_directory: "build/fastlane/ipa",
      output_name: "Runner.ipa",
      export_method: "app-store" # لو بتبني لـ TestFlight أو App Store
    )

    UI.success("iOS IPA built successfully and located at: build/fastlane/ipa/Runner.ipa 🎉")
  end

  desc "Deploys the built iOS app to TestFlight"
  lane :deploy_to_testflight do |options|
    build_ipa_release
    upload_to_testflight
    UI.success("Successfully deployed to TestFlight! Your app is now being processed by App Store Connect. 🚀")
  end

  desc "Complete CI/CD lane: Builds IPA and deploys to TestFlight"
  lane :ci_cd_ios do
    deploy_to_testflight
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also automate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;iOS code signing with Match&lt;/li&gt;
&lt;li&gt;Beta builds for testers&lt;/li&gt;
&lt;li&gt;App Store releases&lt;/li&gt;
&lt;li&gt;Screenshot uploads&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Running Fastlane for iOS
&lt;/h2&gt;

&lt;p&gt;To build your iOS app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ios
fastlane build_release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To deploy to TestFlight for testers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fastlane deploy_testflight
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensure your Apple certificates, provisioning profiles, and Xcode project settings are correctly configured. Fastlane’s “Match” tool can manage code signing across teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: CI/CD Integration with GitHub Actions (Android Example)
&lt;/h2&gt;

&lt;p&gt;Automating builds in CI ensures consistency and saves time. Here’s a GitHub Actions workflow to build Android on every push:&lt;/p&gt;

&lt;p&gt;Create &lt;code&gt;.github/workflows/android.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Android CI/CD

on:
  push:
    branches: [ main, develop ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v3

      - name: Set up Flutter
        uses: subosito/flutter-action@v2
        with:
          flutter-version: "3.x"

      - name: Install Flutter Dependencies
        run: flutter pub get

      - name: Set up Ruby and Install Fastlane
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: 3.1

      - name: Install Fastlane
        run: gem install fastlane -NV

      - name: Build Android AAB with Fastlane
        run: fastlane android build_aab_release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can extend this workflow to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload artifacts to Firebase or Play Store&lt;/li&gt;
&lt;li&gt;Run automated tests before building&lt;/li&gt;
&lt;li&gt;Notify your team via Slack or email on success/failure&lt;/li&gt;
&lt;li&gt;Deploy to Google Play
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- name: Deploy to Google Play Internal Testing
  run: fastlane android deploy_internal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- name: Setup Google Play Credentials
  run: echo "${{ secrets.GOOGLE_PLAY_JSON }}" &amp;gt; play-store-key.json

- name: Deploy to Google Play Internal Testing
  run: fastlane android deploy_to_play_store track:internal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion: Why Fastlane Supercharges Your Flutter Workflow
&lt;/h2&gt;

&lt;p&gt;Fastlane simplifies the most time-consuming parts of mobile development. By automating builds, tests, and deployments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You reduce human errors&lt;/li&gt;
&lt;li&gt;Speed up delivery cycles&lt;/li&gt;
&lt;li&gt;Maintain consistent builds across devices and environments&lt;/li&gt;
&lt;li&gt;Empower your team to focus on writing code, not repetitive tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  On Mac, you can automate everything — iOS builds, Android builds, uploads, testing, and distribution.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  On Windows, you can automate Android builds, deployments, and integrate with CI/CD pipelines.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Pro Tips &amp;amp; Next Steps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;.env&lt;/code&gt; files or CI secrets to manage sensitive credentials&lt;/li&gt;
&lt;li&gt;Automate app versioning with Fastlane plugins&lt;/li&gt;
&lt;li&gt;Distribute apps to testers via Firebase or TestFlight&lt;/li&gt;
&lt;li&gt;Implement automated screenshot generation for App Store submissions&lt;/li&gt;
&lt;li&gt;Integrate Slack or email notifications for CI/CD pipelines&lt;/li&gt;
&lt;li&gt;Explore tools like Codemagic or Bitrise for advanced pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once Fastlane is set up, your Flutter project gains professional-grade automation with minimal effort.&lt;/p&gt;

&lt;h2&gt;
  
  
  ref
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=vxjyOdNZxkw" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=vxjyOdNZxkw&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=1bmwAyJ-P1Y" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=1bmwAyJ-P1Y&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Originally published on &lt;a href="https://medium.com/@ms3byoussef/ultimate-step-by-step-guide-to-ci-cd-with-fastlane-in-flutter-mac-windows-24896ad567d8" rel="noopener noreferrer"&gt;Medium&lt;/a&gt; on July 5, 2025.&lt;/p&gt;

</description>
      <category>flutter</category>
    </item>
    <item>
      <title>When Vercel Hates Your Build: Surviving the Nuxt 4 + i18n Deployment Nightmare</title>
      <dc:creator>مصعب يوسف</dc:creator>
      <pubDate>Mon, 26 Oct 2026 07:49:53 +0000</pubDate>
      <link>https://dev.to/ms3byoussef/when-vercel-hates-your-build-surviving-the-nuxt-4-i18n-deployment-nightmare-303m</link>
      <guid>https://dev.to/ms3byoussef/when-vercel-hates-your-build-surviving-the-nuxt-4-i18n-deployment-nightmare-303m</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg43vemcbdol6m6seqown.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg43vemcbdol6m6seqown.jpeg" alt="When Vercel Hates Your Build: Surviving the Nuxt 4 + i18n Deployment Nightmare" width="700" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There’s a moment every developer dreads:the local build works perfectly — smooth, fast, beautiful — then you push it to &lt;strong&gt;Vercel&lt;/strong&gt;, and everything explodes.That’s exactly what happened when I deployed my &lt;strong&gt;Nuxt 4 project with i18n&lt;/strong&gt; for multilingual support.What should’ve been a simple “click → deploy → done” turned into a four-hour debugging session filled with missing packages, failed builds, and questioning my career choices.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Calm Before the Chaos
&lt;/h2&gt;

&lt;p&gt;Locally, the app ran perfectly.&lt;/p&gt;

&lt;p&gt;Translations worked fine, images loaded, Supabase connected, no issues at all.&lt;/p&gt;

&lt;p&gt;So naturally, I assumed the deploy would be easy.&lt;/p&gt;

&lt;p&gt;Then came the first build log on Vercel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cannot find package '@intlify/utils'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I laughed. Installed it manually. Pushed again.&lt;/p&gt;

&lt;p&gt;Then the next line showed up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cannot find package '@vue/shared'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cannot find package '@vue/compiler-dom'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Understanding What Went Wrong
&lt;/h2&gt;

&lt;p&gt;Here’s the thing:&lt;/p&gt;

&lt;p&gt;When you build locally, you have all your &lt;strong&gt;node_modules&lt;/strong&gt; cached.&lt;/p&gt;

&lt;p&gt;Even dependencies that aren’t listed in your package.json — like hidden i18n helpers — exist because npm already fetched them before.&lt;/p&gt;

&lt;p&gt;But &lt;strong&gt;Vercel’s build system&lt;/strong&gt; doesn’t care about that.&lt;/p&gt;

&lt;p&gt;It runs your build in a &lt;strong&gt;completely clean environment&lt;/strong&gt; each time.&lt;/p&gt;

&lt;p&gt;If something isn’t explicitly declared or bundled, Vercel just shrugs and throws an error.&lt;/p&gt;

&lt;p&gt;In short:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nuxt’s i18n module uses internal packages like @intlify/utils, @intlify/core, etc.&lt;/li&gt;
&lt;li&gt;Those aren’t always visible in your dependencies.&lt;/li&gt;
&lt;li&gt;Vercel can’t find them.&lt;/li&gt;
&lt;li&gt;Your build dies.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  -The Long-Awaited Fix
&lt;/h2&gt;

&lt;p&gt;After wasting hours searching through GitHub issues and reading posts that ended with “Solved: turns out I forgot to install it,”&lt;/p&gt;

&lt;p&gt;I decided to go nuclear.&lt;/p&gt;

&lt;p&gt;I listed &lt;strong&gt;every dependency Vercel had ever complained about&lt;/strong&gt;, along with a few I suspected might be next,&lt;/p&gt;

&lt;p&gt;and forced Nuxt’s Nitro engine to include them manually.&lt;/p&gt;

&lt;p&gt;Inside nuxt.config.ts, I added this at the top:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const nitroInlinePackages = [
  "@intlify/utils",
  "@intlify/core",
  "@intlify/core-base",
  "@intlify/h3",
  "@intlify/shared",
  "@intlify/message-compiler",
  "@nuxtjs/i18n",
  "vue-i18n",
  "vue-router",
  "vue",
  "@iconify/utils",
  "@vue/compiler-dom",
  "@vue/compiler-ssr",
  "@vue/compiler-core",
  "@vue/compiler-sfc",
  "@vue/server-renderer",
  "@vue/shared",
  "@vue/runtime-core",
  "@vue/runtime-dom",
  "@vue/reactivity",
  "@vue/reactivity-transform",
  "@vue/devtools-api",
  "@vue/language-core",
  "consola",
  "ipx",
  "image-meta",
  "@fastify/accept-negotiator",
  "etag",
  "mlly",
  "ohash",
  "unstorage",
  "defu",
  "ufo",
  "h3",
];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I used it inside the config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default defineNuxtConfig({
  nitro: {
    externals: {
      inline: nitroInlinePackages,
    },
  },
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The idea here is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Inline everything. If Vercel might need it, give it to Vercel.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After that commit, the next deploy finally went green.&lt;/p&gt;

&lt;p&gt;No more missing packages. No warnings. Just &lt;strong&gt;peace&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It only took about &lt;strong&gt;five hours of debugging, three coffees, and one mild breakdown&lt;/strong&gt; to get there.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Step-by-Step Vercel Setup (for Anyone Doing This the First Time)
&lt;/h2&gt;

&lt;p&gt;If you’re just starting with Nuxt 4 and want to deploy to Vercel, here’s the process that &lt;em&gt;actually works&lt;/em&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Push your project to GitHub (or GitLab/Bitbucket)
&lt;/h3&gt;

&lt;p&gt;Make sure your repo is clean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No local-only files.&lt;/li&gt;
&lt;li&gt;package.json includes everything you use.&lt;/li&gt;
&lt;li&gt;.gitignore excludes /node_modules.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Go to &lt;a href="https://vercel.com" rel="noopener noreferrer"&gt;vercel.com&lt;/a&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  → “New Project”
&lt;/h3&gt;

&lt;p&gt;Import your repository. Choose your organization (or personal account).&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Configure your environment variables
&lt;/h3&gt;

&lt;p&gt;If you’re using .env, add these:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkf7qtbavrlvmrzmdw1o6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkf7qtbavrlvmrzmdw1o6.png" alt="When Vercel Hates Your Build: Surviving the Nuxt 4 + i18n Deployment Nightmare" width="700" height="568"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  . Select build settings
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Framework Preset: &lt;strong&gt;Nuxt 3 / Nuxt 4&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Build Command: npm run build&lt;/li&gt;
&lt;li&gt;Output Directory: .output/public&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Add the inline package configuration
&lt;/h3&gt;

&lt;p&gt;Include the nitroInlinePackages list in nuxt.config.ts.&lt;/p&gt;

&lt;p&gt;This ensures all the i18n and Vue internals are bundled.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Deploy
&lt;/h3&gt;

&lt;p&gt;Click &lt;strong&gt;Deploy&lt;/strong&gt; and let it run.&lt;/p&gt;

&lt;p&gt;The first deploy may take a few minutes.&lt;/p&gt;

&lt;p&gt;When you see the green checkmark, that’s your cue to exhale.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. (Optional) Enable build logs
&lt;/h3&gt;

&lt;p&gt;In your Vercel dashboard:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Settings → General → Build Logs → Enabled&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That way, if something breaks again, you can see &lt;em&gt;which&lt;/em&gt; package started the war.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus Tip: Debugging Smart
&lt;/h2&gt;

&lt;p&gt;When a package is missing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check the exact error name.&lt;/li&gt;
&lt;li&gt;Search inside your local node_modules to confirm it exists.&lt;/li&gt;
&lt;li&gt;If it does — inline it.&lt;/li&gt;
&lt;li&gt;If not — install it with npm i [package-name].&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep your commits clean, but don’t feel bad if you end up with seven “fix” commits in a row.&lt;/p&gt;

&lt;p&gt;Everyone does.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Vercel isn’t broken — it’s just strict.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;It wants every dependency clearly declared.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;i18n is a heavy module.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;It depends on a full suite of @intlify and &lt;a class="mentioned-user" href="https://dev.to/vue"&gt;@vue&lt;/a&gt; packages behind the scenes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inline dependencies save time.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Nitro lets you tell Vercel exactly what to bundle.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Document your pain.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The next developer who finds your article will silently thank you at 2 AM.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Useful Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://i18n.nuxtjs.org" rel="noopener noreferrer"&gt;Nuxt i18n Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vercel.com/docs/frameworks/nuxt" rel="noopener noreferrer"&gt;Vercel Deployment Guide for Nuxt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nuxt.com/docs/api/configuration/nuxt-config" rel="noopener noreferrer"&gt;Nuxt Config Reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Description
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Fixing endless “Cannot find package” errors when deploying a Nuxt 4 + i18n project to Vercel.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Includes real commit logs, root cause analysis, and a simple step-by-step deployment guide that actually works.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Originally published on &lt;a href="https://medium.com/@ms3byoussef/when-vercel-hates-your-build-surviving-the-nuxt-4-i18n-deployment-nightmare-ba54a9475b1e" rel="noopener noreferrer"&gt;Medium&lt;/a&gt; on October 10, 2025.&lt;/p&gt;

</description>
      <category>webdev</category>
    </item>
    <item>
      <title>Advanced Flutter Isolates — Building High-Performance Parallel Pipelines</title>
      <dc:creator>مصعب يوسف</dc:creator>
      <pubDate>Mon, 26 Oct 2026 07:49:50 +0000</pubDate>
      <link>https://dev.to/ms3byoussef/advanced-flutter-isolates-building-high-performance-parallel-pipelines-1n8m</link>
      <guid>https://dev.to/ms3byoussef/advanced-flutter-isolates-building-high-performance-parallel-pipelines-1n8m</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fss35tbovrvxf602flxk6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fss35tbovrvxf602flxk6.png" alt="Advanced Flutter Isolates — Building High-Performance Parallel Pipelines" width="700" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A Complete, Professional Guide for Beginners &amp;amp; Advanced Engineers&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Flutter apps live and die by UI smoothness. The main isolate (UI thread) is responsible for every frame, animation, gesture, rebuild, layout, and paint.&lt;/p&gt;

&lt;p&gt;The moment you drop a heavy CPU operation inside that isolate, your beautiful UI collapses into a 15-FPS slideshow.&lt;/p&gt;

&lt;p&gt;If you’re building SaaS dashboards, AI tools, POS systems, CRM apps, OCR pipelines, image processors, or anything non-trivial, you &lt;strong&gt;must&lt;/strong&gt; understand isolates.&lt;/p&gt;

&lt;p&gt;This guide turns you from “Flutter developer” into “parallel systems engineer who happens to code in Flutter.”&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Understanding Isolates: The Foundation of Dart Concurrency
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;An isolate is a completely independent Dart execution environment&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Own memory&lt;/li&gt;
&lt;li&gt;Own event-loop&lt;/li&gt;
&lt;li&gt;No shared variables&lt;/li&gt;
&lt;li&gt;Communication only through &lt;strong&gt;message passing&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s Dart’s elegant alternative to threads, without the foot-guns of shared memory or race conditions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;If it must do heavy CPU work and you want your UI alive → use an isolate.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  2. When Should You Use Isolates?
&lt;/h2&gt;

&lt;p&gt;Any heavy computation &lt;em&gt;not related to widgets&lt;/em&gt; should be moved away from the main isolate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perfect Use Cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Large JSON, XML, CSV parsing&lt;/li&gt;
&lt;li&gt;Heavy PDF parsing, OCR text extraction&lt;/li&gt;
&lt;li&gt;Encryption, hashing, token processing&lt;/li&gt;
&lt;li&gt;AI inference for on-device small models&lt;/li&gt;
&lt;li&gt;Image decoding, compression, filters&lt;/li&gt;
&lt;li&gt;POS analytics, CRM batch operations&lt;/li&gt;
&lt;li&gt;Parallel ETL pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Rule of survival
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If it can drop frames, isolate it.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Beginner Path: Using compute()
&lt;/h2&gt;

&lt;p&gt;compute() is the simplest gateway to isolates.&lt;/p&gt;

&lt;p&gt;It creates a temporary isolate, runs a pure function, returns the result, then kills the isolate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: Heavy List Processing
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:flutter/foundation.dart';

Future&amp;lt;List&amp;lt;int&amp;gt;&amp;gt; runHeavyTask() async {
  return compute(expensiveOperation, [1, 2, 3, 4, 5]);
}
List&amp;lt;int&amp;gt; expensiveOperation(List&amp;lt;int&amp;gt; nums) {
  return nums.map((n) {
    var x = n;
    for (int i = 0; i &amp;lt; 20000; i++) {
      x = (x * 97) % 89;
    }
    return x;
  }).toList();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  When to use
&lt;/h2&gt;

&lt;h2&gt;
  
  
  compute()
&lt;/h2&gt;

&lt;p&gt;✔ Small to medium CPU tasks&lt;/p&gt;

&lt;p&gt;✔ One-shot, non-streaming jobs&lt;/p&gt;

&lt;p&gt;✔ Stateless operations&lt;/p&gt;

&lt;p&gt;✔ Simple background parsing&lt;/p&gt;

&lt;h2&gt;
  
  
  When not to use it
&lt;/h2&gt;

&lt;p&gt;✘ Continuous background workers&lt;/p&gt;

&lt;p&gt;✘ Multiple tasks per second&lt;/p&gt;

&lt;p&gt;✘ Tasks requiring two-way communication&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Intermediate Level: Persistent Isolates with Isolate.spawn()
&lt;/h2&gt;

&lt;p&gt;Here you create &lt;strong&gt;your own worker isolate&lt;/strong&gt; and keep it alive as long as you want.&lt;/p&gt;

&lt;p&gt;This allows background loops, timers, scheduled tasks, and message streams.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: Background heartbeat worker
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'dart:isolate';
import 'dart:async';
class BackgroundWorker {
  late final Isolate _isolate;
  final ReceivePort _receivePort = ReceivePort();

Future&amp;lt;void&amp;gt; start() async {
    _isolate = await Isolate.spawn(_entryPoint, _receivePort.sendPort);
    _receivePort.listen((msg) {
      print("Worker says: $msg");
    });
  }
  static void _entryPoint(SendPort sendPort) {
    int counter = 0;
    Timer.periodic(const Duration(milliseconds: 500), (_) {
      counter++;
      sendPort.send("Tick $counter at ${DateTime.now()}");
    });
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;final worker = BackgroundWorker();
await worker.start();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This isolate runs forever, sending messages every 500ms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use cases
&lt;/h2&gt;

&lt;p&gt;✔ Background metrics&lt;/p&gt;

&lt;p&gt;✔ NFC streaming&lt;/p&gt;

&lt;p&gt;✔ AI inference loops&lt;/p&gt;

&lt;p&gt;✔ POS background syncing&lt;/p&gt;

&lt;p&gt;✔ Long-running tasks&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Advanced: Building a Two-Way Task Queue Engine
&lt;/h2&gt;

&lt;p&gt;This is where real engineering begins.&lt;/p&gt;

&lt;p&gt;You create an isolate that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Receives tasks&lt;/li&gt;
&lt;li&gt;Processes them&lt;/li&gt;
&lt;li&gt;Sends results back&lt;/li&gt;
&lt;li&gt;Supports multiple requests&lt;/li&gt;
&lt;li&gt;Acts like a mini parallel pipeline&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Define a task message
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class TaskMessage {
  final int id;
  final dynamic data;
  TaskMessage(this.id, this.data);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Build the worker
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'dart:isolate';

class Worker {
  late Isolate _isolate;
  final ReceivePort _receive = ReceivePort();
  late SendPort _sendPort;
  Future&amp;lt;void&amp;gt; start() async {
    _isolate = await Isolate.spawn(_entryPoint, _receive.sendPort);
    _receive.listen((message) {
      if (message is SendPort) {
        _sendPort = message;
      } else {
        print("Result: $message");
      }
    });
  }
  void send(TaskMessage task) {
    _sendPort.send(task);
  }
  static void _entryPoint(SendPort mainSendPort) {
    final port = ReceivePort();
    // Give UI isolate the sendPort of this worker isolate
    mainSendPort.send(port.sendPort);
    port.listen((message) {
      if (message is TaskMessage) {
        final processed = _process(message.data);
        mainSendPort.send("Task ${message.id} result: $processed");
      }
    });
  }
  static int _process(int value) {
    var x = value;
    for (int i = 0; i &amp;lt; 50000; i++) {
      x = (x * 41) % 123;
    }
    return x;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Use the worker
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;final worker = Worker();
await worker.start();

worker.send(TaskMessage(1, 150));
worker.send(TaskMessage(2, 340));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You now have:&lt;/p&gt;

&lt;p&gt;✔ A persistent background processor&lt;/p&gt;

&lt;p&gt;✔ Bidirectional message system&lt;/p&gt;

&lt;p&gt;✔ Unlimited tasks&lt;/p&gt;

&lt;p&gt;✔ No UI blocking&lt;/p&gt;

&lt;p&gt;This is exactly how large apps (AI/OCR/POS) implement internal compute engines.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Real-World Industry Applications
&lt;/h2&gt;

&lt;h2&gt;
  
  
  AI Pipelines
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;embeddings, on-device inference&lt;/li&gt;
&lt;li&gt;Vector computations&lt;/li&gt;
&lt;li&gt;Mini-transformer operations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  PDF &amp;amp; OCR Systems
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Parsing thousands of pages&lt;/li&gt;
&lt;li&gt;Running regex extraction&lt;/li&gt;
&lt;li&gt;Table reconstruction&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  POS &amp;amp; CRM Apps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Heavy daily reports&lt;/li&gt;
&lt;li&gt;Discount engine calculations&lt;/li&gt;
&lt;li&gt;Inventory batch updates&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Image &amp;amp; Video
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Compression&lt;/li&gt;
&lt;li&gt;Cropping&lt;/li&gt;
&lt;li&gt;Color analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Edge IoT
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Sensor noise filtering&lt;/li&gt;
&lt;li&gt;Position tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Background Job Manager
&lt;/h2&gt;

&lt;p&gt;Build your own Flutter BullMQ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Queue&lt;/li&gt;
&lt;li&gt;Retry&lt;/li&gt;
&lt;li&gt;Priority&lt;/li&gt;
&lt;li&gt;Workers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. Best Practices for Production Apps
&lt;/h2&gt;

&lt;p&gt;✔ &lt;strong&gt;Never send huge objects.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prefer primitives, maps, lists.&lt;/p&gt;

&lt;p&gt;✔ &lt;strong&gt;Always close isolates.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use isolate.kill(priority: Isolate.immediate) when done.&lt;/p&gt;

&lt;p&gt;✔ &lt;strong&gt;Use error handlers.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Attach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;isolate.addErrorListener(errorPort.sendPort);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✔ &lt;strong&gt;Avoid sending UI objects.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No widgets, contexts, controllers.&lt;/p&gt;

&lt;p&gt;✔ &lt;strong&gt;Use Streams for continuous work.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Especially sensor/NFC AI pipelines.&lt;/p&gt;

&lt;p&gt;✔ &lt;strong&gt;Use message batching&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sending too frequently can flood the main isolate.&lt;/p&gt;

&lt;p&gt;✔ &lt;strong&gt;Warm up long-running isolates on app start&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Critical for POS/CRM apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Summary
&lt;/h2&gt;

&lt;p&gt;Once you master isolates, you stop writing “apps” and start building &lt;strong&gt;parallel systems&lt;/strong&gt; inside Flutter.&lt;/p&gt;

&lt;p&gt;You learn to think like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A systems engineer&lt;/li&gt;
&lt;li&gt;A performance architect&lt;/li&gt;
&lt;li&gt;A pipeline designer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With isolates you unlock:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Smooth UI&lt;/li&gt;
&lt;li&gt;Industrial-level performance&lt;/li&gt;
&lt;li&gt;Background compute&lt;/li&gt;
&lt;li&gt;AI inside Flutter&lt;/li&gt;
&lt;li&gt;Real-time processing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This takes your Flutter work from “UI builder” to“high-performance engineer”.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Dart Isolates: &lt;a href="https://dart.dev/language/isolates" rel="noopener noreferrer"&gt;https://dart.dev/language/isolate&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;compute(): &lt;a href="https://api.flutter.dev/flutter/foundation/compute.html" rel="noopener noreferrer"&gt;https://api.flutter.dev/flutter/foundation/compute.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Threading model: &lt;a href="https://docs.flutter.dev/resources/faq#what-is-the-threading-model" rel="noopener noreferrer"&gt;https://docs.flutter.dev/resources/faq#what-is-the-threading-model&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Originally published on &lt;a href="https://medium.com/@ms3byoussef/advanced-flutter-isolates-building-high-performance-parallel-pipelines-95999cb4323b" rel="noopener noreferrer"&gt;Medium&lt;/a&gt; on December 9, 2025.&lt;/p&gt;

</description>
      <category>flutter</category>
    </item>
    <item>
      <title>Guide to Achieving Native-Level Performance in Flutter</title>
      <dc:creator>مصعب يوسف</dc:creator>
      <pubDate>Mon, 26 Oct 2026 07:48:53 +0000</pubDate>
      <link>https://dev.to/ms3byoussef/guide-to-achieving-native-level-performance-in-flutter-2ip5</link>
      <guid>https://dev.to/ms3byoussef/guide-to-achieving-native-level-performance-in-flutter-2ip5</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1de6vgazrfh712hieo3r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1de6vgazrfh712hieo3r.png" alt="Guide to Achieving Native-Level Performance in Flutter" width="700" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;How to Engineer Flutter Apps That Match Native Performance&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Flutter is already one of the fastest cross-platform frameworks in the world.&lt;/p&gt;

&lt;p&gt;But most developers only use 20% of its real power.&lt;/p&gt;

&lt;p&gt;To build apps that feel completely native, you must design around how the Flutter Engine actually works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one UI thread&lt;/li&gt;
&lt;li&gt;GPU-first rendering&lt;/li&gt;
&lt;li&gt;isolate-based CPU parallelism&lt;/li&gt;
&lt;li&gt;shaders for heavy visual effects&lt;/li&gt;
&lt;li&gt;smart layout and layer caching&lt;/li&gt;
&lt;li&gt;profiling and engine-aware architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This guide explains all of that, plus a rarely discussed part:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;how the Flutter engine schedules frames, handles vsync, and builds the layer tree internally.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the level used by teams building high-end dashboards, real-time UIs, OCR/AI apps, and enterprise-scale mobile systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Why Flutter Can Match Native Performance
&lt;/h2&gt;

&lt;p&gt;Flutter is not like React Native or Cordova.&lt;/p&gt;

&lt;p&gt;It does NOT rely on platform UI widgets.&lt;/p&gt;

&lt;p&gt;Instead, Flutter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compiles Dart to &lt;strong&gt;AOT ARM machine code&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Uses &lt;strong&gt;Skia&lt;/strong&gt;, a C++ GPU renderer used by Chrome, Android, and Fuchsia&lt;/li&gt;
&lt;li&gt;Draws &lt;strong&gt;directly&lt;/strong&gt; to the GPU&lt;/li&gt;
&lt;li&gt;Avoids the Java/Kotlin → Android View bridge&lt;/li&gt;
&lt;li&gt;Avoids Objective-C → UIKit bridging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This architecture removes the biggest bottleneck found in hybrid frameworks.&lt;/p&gt;

&lt;p&gt;When someone says “Flutter is slow,” they almost always misunderstood how the engine works.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Golden Rule of UI Performance
&lt;/h2&gt;

&lt;p&gt;Flutter has exactly &lt;strong&gt;one&lt;/strong&gt; UI thread.&lt;/p&gt;

&lt;p&gt;Everything related to rendering happens here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;widget building&lt;/li&gt;
&lt;li&gt;layout&lt;/li&gt;
&lt;li&gt;painting&lt;/li&gt;
&lt;li&gt;hit testing&lt;/li&gt;
&lt;li&gt;animations&lt;/li&gt;
&lt;li&gt;accessibility updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you block this thread even for &lt;strong&gt;5 ms&lt;/strong&gt;, you will drop frames.&lt;/p&gt;

&lt;p&gt;Goal:&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the UI thread as empty as possible.
&lt;/h2&gt;

&lt;p&gt;Everything else goes somewhere else:&lt;/p&gt;

&lt;p&gt;| Work Type | Where It Should Run |&lt;br&gt;&lt;br&gt;
| — — — — — — — — -| — — — — — — — — — — — — — -|&lt;br&gt;&lt;br&gt;
| Heavy CPU logic ======| Isolates |&lt;br&gt;&lt;br&gt;
| Image processing=====| Isolates |&lt;br&gt;&lt;br&gt;
| JSON/PDF parsing=====| Isolates |&lt;br&gt;&lt;br&gt;
| Encryption===========| Isolates |&lt;br&gt;&lt;br&gt;
| Hashing============= | Isolates |&lt;br&gt;&lt;br&gt;
| GPU effects ==========| Fragment shaders |&lt;br&gt;&lt;br&gt;
| File IO =============| Native threads (async) |&lt;br&gt;&lt;br&gt;
| Network IO========= | Native threads (async) |&lt;br&gt;&lt;br&gt;
| Repetitive paint======| Cached layers |&lt;br&gt;&lt;br&gt;
| Heavy layout======== | Custom RenderObjects |&lt;/p&gt;

&lt;p&gt;Apps that feel native follow this rule religiously.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Parallel Pipelines With Isolates
&lt;/h2&gt;

&lt;p&gt;Anything involving heavy CPU work should be offloaded from the UI isolate.&lt;/p&gt;
&lt;h2&gt;
  
  
  Example: Massive JSON Parsing in Background
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Future&amp;lt;List&amp;lt;Item&amp;gt;&amp;gt; parseItems(String raw) {
  return compute(_parse, raw);
}

List&amp;lt;Item&amp;gt; _parse(String raw) {
  final data = jsonDecode(raw) as List;
  return data.map((e) =&amp;gt; Item.fromJson(e)).toList();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Persistent Worker Isolate (For Continuous Jobs)
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class WorkerIsolate {
  late Isolate isolate;
  late SendPort sendPort;
  final receive = ReceivePort();


Future&amp;lt;void&amp;gt; start() async {
    isolate = await Isolate.spawn(entry, receive.sendPort);
    receive.listen((msg) {
      if (msg is SendPort) sendPort = msg;
      if (msg is Map) handleResult(msg);
    });
  }
  static void entry(SendPort main) {
    final port = ReceivePort();
    main.send(port.sendPort);
    port.listen((task) {
      final result = heavyCompute(task);
      main.send({"id": task["id"], "result": result});
    });
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This allows continuous background processing without touching the UI thread.&lt;/p&gt;
&lt;h2&gt;
  
  
  4. Rendering Optimization: Reduce GPU Work
&lt;/h2&gt;

&lt;p&gt;Flutter’s rendering pipeline depends on three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how many layers you create&lt;/li&gt;
&lt;li&gt;how complex the picture commands are&lt;/li&gt;
&lt;li&gt;how often you invalidate (repaint) the tree&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Use
&lt;/h2&gt;
&lt;h2&gt;
  
  
  RepaintBoundary
&lt;/h2&gt;

&lt;p&gt;For widgets that animate often.&lt;/p&gt;
&lt;h2&gt;
  
  
  Cache painting using a PictureRecorder
&lt;/h2&gt;

&lt;p&gt;Reduces repeated GPU commands.&lt;/p&gt;
&lt;h2&gt;
  
  
  Avoid unnecessary clipping
&lt;/h2&gt;

&lt;p&gt;ClipPath, ClipRRect, ClipRect are expensive.&lt;/p&gt;
&lt;h2&gt;
  
  
  Use OpacityLayer (not Opacity widget) for animated fades
&lt;/h2&gt;

&lt;p&gt;The widget forces rebuilds, the layer does not.&lt;/p&gt;
&lt;h2&gt;
  
  
  5. Layout Optimization: The Most Common Performance Killer
&lt;/h2&gt;

&lt;p&gt;Avoid expensive intrinsic measurements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IntrinsicHeight&lt;/li&gt;
&lt;li&gt;IntrinsicWidth&lt;/li&gt;
&lt;li&gt;RenderParagraph.getMinIntrinsicWidth()&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use custom RenderBox when layout gets heavy.&lt;/p&gt;

&lt;p&gt;Use Slivers instead of ListView for long, structured lists:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lazy building&lt;/li&gt;
&lt;li&gt;avoids creating offscreen widgets&lt;/li&gt;
&lt;li&gt;fewer layout passes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is essential for dashboards and real-time feeds.&lt;/p&gt;
&lt;h2&gt;
  
  
  6. Animation Without Jank: RenderObject Animations
&lt;/h2&gt;

&lt;p&gt;Traditional animations rebuild widgets every frame.&lt;/p&gt;

&lt;p&gt;But the fastest animations don’t rebuild anything.&lt;/p&gt;

&lt;p&gt;Below is a custom animation using the render layer directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class PulseRender extends RenderBox {
  late Ticker ticker;
  double t = 0;

PulseRender() {
    ticker = Ticker((elapsed) {
      t = (sin(elapsed.inMilliseconds / 150)).abs();
      markNeedsPaint();
    })..start();
  }
  @override
  void performLayout() {
    size = const Size(100, 100);
  }
  @override
  void paint(PaintingContext ctx, Offset off) {
    final paint = Paint()..color = Colors.blue.withOpacity(t);
    ctx.canvas.drawCircle(size.center(off), 40, paint);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This avoids rebuilds entirely.&lt;/p&gt;

&lt;p&gt;Perfect for particles, shimmer effects, and loading animations.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. GPU Shaders for Native-Level Visuals
&lt;/h2&gt;

&lt;p&gt;Flutter supports custom fragment shaders (via Impeller).&lt;/p&gt;

&lt;p&gt;Use shaders for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;blur&lt;/li&gt;
&lt;li&gt;glow&lt;/li&gt;
&lt;li&gt;distortions&lt;/li&gt;
&lt;li&gt;color grading&lt;/li&gt;
&lt;li&gt;dynamic waves&lt;/li&gt;
&lt;li&gt;fluid animation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example GLSL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;uniform float time;

void main() {
  vec2 uv = FlutterFragCoord().xy / size;
  float wave = sin(uv.x * 10.0 + time);
  gl_FragColor = vec4(vec3(wave), 1.0);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shaders are orders of magnitude faster than CPU-driven animations.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Memory Optimization
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use const wherever possible&lt;/li&gt;
&lt;li&gt;Dispose all controllers, streams, focus nodes&lt;/li&gt;
&lt;li&gt;Avoid loading huge images at full resolution&lt;/li&gt;
&lt;li&gt;Reuse objects (lists, paint objects, buffers)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Memory spikes = garbage collector = stutter.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. HOW THE FLUTTER ENGINE ACTUALLY WORKS
&lt;/h2&gt;

&lt;h2&gt;
  
  
  (Engine Internals: Frame Scheduling, vsync, Layer Tree Building)
&lt;/h2&gt;

&lt;p&gt;This is the part almost nobody talks about, but it’s the secret behind true native-level performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  9.1 The Frame Pipeline: How a Frame Is Born
&lt;/h2&gt;

&lt;p&gt;Flutter schedules frames in a loop tied to your device’s refresh rate.&lt;/p&gt;

&lt;p&gt;Simplified steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The system fires a &lt;strong&gt;vsync signal&lt;/strong&gt; (e.g., 60Hz or 120Hz)&lt;/li&gt;
&lt;li&gt;Flutter’s scheduler receives it&lt;/li&gt;
&lt;li&gt;SchedulerBinding triggers animation ticks&lt;/li&gt;
&lt;li&gt;It requests a new frame from the engine&lt;/li&gt;
&lt;li&gt;Flutter builds widgets → rebuilds element tree&lt;/li&gt;
&lt;li&gt;Layout happens (RenderObjects compute sizes)&lt;/li&gt;
&lt;li&gt;Painting happens (commands recorded into picture layers)&lt;/li&gt;
&lt;li&gt;Layer tree sent to the GPU via Skia/Impeller&lt;/li&gt;
&lt;li&gt;GPU renders it → screen updates&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If anything in steps 5–7 takes too long → jank.&lt;/p&gt;

&lt;p&gt;Your target: &lt;strong&gt;finish steps 5–7 in under 8ms (for 120Hz: under 4ms).&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  9.2 What Is vsync and Why It Matters
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;vsync&lt;/strong&gt; = vertical synchronization&lt;/p&gt;

&lt;p&gt;It tells Flutter when a new frame &lt;em&gt;may&lt;/em&gt; be drawn.&lt;/p&gt;

&lt;p&gt;Flutter does NOT push frames whenever it wants.&lt;/p&gt;

&lt;p&gt;It synchronizes with the display to avoid tearing.&lt;/p&gt;

&lt;p&gt;So:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If UI work finishes early → frame is smooth&lt;/li&gt;
&lt;li&gt;If UI work finishes late → next vsync is missed → visible stutter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why heavy computation must be moved off the UI isolate.&lt;/p&gt;

&lt;h2&gt;
  
  
  9.3 Layer Tree Building (What the GPU Actually Receives)
&lt;/h2&gt;

&lt;p&gt;The Flutter framework builds a &lt;strong&gt;Layer Tree&lt;/strong&gt;, not a “Widget Tree” and not a “View Tree.”&lt;/p&gt;

&lt;p&gt;Layers include things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PictureLayer&lt;/li&gt;
&lt;li&gt;OpacityLayer&lt;/li&gt;
&lt;li&gt;TransformLayer&lt;/li&gt;
&lt;li&gt;ClipRRectLayer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This structure is much closer to a game engine than a typical UI framework.&lt;/p&gt;

&lt;p&gt;Optimizing performance means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fewer layers&lt;/li&gt;
&lt;li&gt;fewer repaint regions&lt;/li&gt;
&lt;li&gt;fewer picture commands&lt;/li&gt;
&lt;li&gt;caching expensive drawing operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When done correctly, Flutter sends extremely lightweight GPU instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. The Architecture Used by High-Performance Flutter Apps
&lt;/h2&gt;

&lt;p&gt;| Layer | Technique |&lt;br&gt;&lt;br&gt;
| — — — — — — | — — — — — — — — — — — — — — — — — — — — |&lt;br&gt;&lt;br&gt;
| UI — — — — — — — — — — — — — — | Minimal rebuilds, const widgets |&lt;br&gt;&lt;br&gt;
| Layout — — — — — — — — — — — — | Custom RenderObjects when needed |&lt;br&gt;&lt;br&gt;
| Scrolling — — — — — — — — — — —| Slivers, viewport-aware widgets |&lt;br&gt;&lt;br&gt;
| Animation — — — — — — — — — —| RenderObject-driven or shader-driven |&lt;br&gt;&lt;br&gt;
| CPU Work — — — — — — — — — — | Isolates (parallel compute) |&lt;br&gt;&lt;br&gt;
| GPU — — — — — — — — — — — — — | Impeller shaders + cached layers |&lt;br&gt;&lt;br&gt;
| IO — — — — — — — — — — — — — —| Native async threads |&lt;br&gt;&lt;br&gt;
| Memory — — — — — — — — — — —| Object pooling |&lt;br&gt;&lt;br&gt;
| Profiling — — — — — — — — — — — | DevTools, Skia traces |&lt;/p&gt;

&lt;p&gt;This is how large production apps achieve zero dropped frames.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Profiling: The Expert’s Toolset
&lt;/h2&gt;

&lt;p&gt;Before optimizing anything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use Flutter DevTools performance tab&lt;/li&gt;
&lt;li&gt;check GPU frame chart&lt;/li&gt;
&lt;li&gt;inspect rebuild count&lt;/li&gt;
&lt;li&gt;look at shader compilation jank&lt;/li&gt;
&lt;li&gt;analyze Skia picture commands&lt;/li&gt;
&lt;li&gt;run with flutter run — profile&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Real engineers optimize based on numbers, not guesswork.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Flutter absolutely &lt;strong&gt;can&lt;/strong&gt; match or outperform native performance&lt;/p&gt;

&lt;p&gt;— but only when you write apps &lt;em&gt;the way the engine expects&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;offload CPU work&lt;/li&gt;
&lt;li&gt;leverage GPU rendering&lt;/li&gt;
&lt;li&gt;minimize UI thread work&lt;/li&gt;
&lt;li&gt;optimize layout&lt;/li&gt;
&lt;li&gt;use Slivers&lt;/li&gt;
&lt;li&gt;use shaders for heavy visuals&lt;/li&gt;
&lt;li&gt;understand vsync &amp;amp; frame scheduling&lt;/li&gt;
&lt;li&gt;profile carefully&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you master these principles, Flutter becomes a true high-performance engine, not just a UI toolkit.&lt;/p&gt;

&lt;p&gt;Your app stops feeling “cross-platform.”&lt;/p&gt;

&lt;p&gt;It starts feeling &lt;strong&gt;native, fluid, and engineered.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Originally published on &lt;a href="https://medium.com/@ms3byoussef/guide-to-achieving-native-level-performance-in-flutter-ff867570e6b8" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>flutter</category>
    </item>
    <item>
      <title>What Should a Software Engineer Learn in 2027?</title>
      <dc:creator>مصعب يوسف</dc:creator>
      <pubDate>Tue, 20 Oct 2026 09:47:11 +0000</pubDate>
      <link>https://dev.to/ms3byoussef/what-should-a-software-engineer-learn-in-2027-388l</link>
      <guid>https://dev.to/ms3byoussef/what-should-a-software-engineer-learn-in-2027-388l</guid>
      <description>&lt;h3&gt;
  
  
  A Practical Roadmap for the AI Era — Lessons from Building ERP, CRM, and Real-World Software&amp;nbsp;Systems
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu66k9zs6x5zbbynthdlr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu66k9zs6x5zbbynthdlr.png" alt="What Should a Software Engineer Learn in 2027?" width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Introduction: AI Can Generate Code. But Can It Take Responsibility for Your&amp;nbsp;System?
&lt;/h3&gt;

&lt;p&gt;A few years ago, building a software application meant spending hours writing controllers, database queries, validation logic, and user interfaces.&lt;/p&gt;

&lt;p&gt;Today, an AI coding assistant can generate much of that implementation in&amp;nbsp;minutes.&lt;/p&gt;

&lt;p&gt;You can ask it to build an authentication system, create an ERP module, integrate a payment provider, or develop a mobile application.&lt;/p&gt;

&lt;p&gt;And often, the result looks impressive.&lt;/p&gt;

&lt;p&gt;But here’s something I’ve learned while working on real software&amp;nbsp;systems:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hardest problems in software engineering rarely end with writing the&amp;nbsp;code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you’re building a financial system, you need to guarantee that money isn’t recorded&amp;nbsp;twice.&lt;/p&gt;

&lt;p&gt;When you’re developing a multi-tenant CRM, you need to guarantee that one company cannot access another company’s data.&lt;/p&gt;

&lt;p&gt;When you’re designing an offline-first POS, you need to understand what happens when transactions are recorded without internet&amp;nbsp;access.&lt;/p&gt;

&lt;p&gt;And when you’re adding an AI agent to a business application, you need to decide what the agent is allowed to read, recommend, and&amp;nbsp;execute.&lt;/p&gt;

&lt;p&gt;These problems don’t disappear because AI can generate the implementation.&lt;/p&gt;

&lt;p&gt;In some ways, AI makes understanding them even more important.&lt;/p&gt;

&lt;p&gt;Over the years, I’ve worked with systems involving finance, project management, CRM, business automation, and large data imports. I’ve also been designing architectures for offline-first applications and AI-powered workflows.&lt;/p&gt;

&lt;p&gt;Those experiences have reinforced a simple principle:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A good software engineer isn’t defined by how much code they can write. They’re defined by how well they understand the problems their software must&amp;nbsp;solve.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So, what should developers actually learn in&amp;nbsp;2027?&lt;/p&gt;

&lt;p&gt;Let’s explore the answer through practical engineering lessons.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Programming Fundamentals: Learn to Understand Code, Not Just Generate&amp;nbsp;It
&lt;/h3&gt;

&lt;p&gt;Let’s start with the foundation.&lt;/p&gt;

&lt;p&gt;Should developers still learn programming when AI can write functions, classes, and entire&amp;nbsp;modules?&lt;/p&gt;

&lt;p&gt;Absolutely.&lt;/p&gt;

&lt;p&gt;But the purpose of learning programming is changing.&lt;/p&gt;

&lt;p&gt;You don’t need to memorize every function or framework API.&lt;/p&gt;

&lt;p&gt;You need to understand how programs&amp;nbsp;behave.&lt;/p&gt;

&lt;p&gt;That means learning control flow, data structures, asynchronous programming, error handling, state management, and the execution model of your chosen language.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Lesson from Building Workflow&amp;nbsp;Systems
&lt;/h3&gt;

&lt;p&gt;In a project management platform such as OpsManage, a task isn’t simply a record with a title and description.&lt;/p&gt;

&lt;p&gt;Tasks have states, dependencies, assigned employees, deadlines, and relationships with other&amp;nbsp;tasks.&lt;/p&gt;

&lt;p&gt;Consider a simplified workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TODO → IN_PROGRESS → DONE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;         |
         v
WAITING_FOR_SUPPORT
         |
         v
IN_PROGRESS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now imagine a user finalizes a project setup&amp;nbsp;wizard.&lt;/p&gt;

&lt;p&gt;The system needs to create services, generate related tasks, resolve their dependencies, and assign employees.&lt;/p&gt;

&lt;p&gt;What happens if the user clicks the Finalize button&amp;nbsp;twice?&lt;/p&gt;

&lt;p&gt;What happens if the first request succeeds but the browser never receives the response?&lt;/p&gt;

&lt;p&gt;Could the application create duplicate tasks?&lt;/p&gt;

&lt;p&gt;AI can generate a controller for this workflow.&lt;/p&gt;

&lt;p&gt;But recognizing the need for idempotency, transaction boundaries, and valid state transitions requires understanding how software&amp;nbsp;behaves.&lt;/p&gt;

&lt;p&gt;These are fundamental programming and engineering concepts.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to&amp;nbsp;Learn
&lt;/h3&gt;

&lt;p&gt;Focus on one primary programming language, such as TypeScript, Dart, Python, Java, or&amp;nbsp;Go.&lt;/p&gt;

&lt;p&gt;Study how it handles asynchronous operations, errors, types, memory, and concurrency.&lt;/p&gt;

&lt;p&gt;Then practice implementing state machines, validation logic, and retry-safe operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your objective shouldn’t be to write code faster than AI. It should be to understand the code well enough to recognize when it is&amp;nbsp;wrong.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Databases and Transactions: Understand What Must Never Go&amp;nbsp;Wrong
&lt;/h3&gt;

&lt;p&gt;One of the most valuable skills a backend engineer can develop is a deep understanding of databases.&lt;/p&gt;

&lt;p&gt;I became increasingly convinced of this while working on Clay, a finance and operations system.&lt;/p&gt;

&lt;p&gt;Clay includes areas such as payroll, treasury management, expenses, projects, and employee attendance.&lt;/p&gt;

&lt;p&gt;These modules contain business rules that are far more important than their user interfaces.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Real Engineering Example: Payroll and&amp;nbsp;Treasury
&lt;/h3&gt;

&lt;p&gt;Consider a payroll workflow.&lt;/p&gt;

&lt;p&gt;An employee’s salary moves through several&amp;nbsp;states:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DRAFT → APPROVED → PAID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When payroll is marked as paid, the application must also record the corresponding treasury movement.&lt;/p&gt;

&lt;p&gt;This sounds&amp;nbsp;simple.&lt;/p&gt;

&lt;p&gt;But several questions immediately arise.&lt;/p&gt;

&lt;p&gt;What if the payroll update succeeds and the treasury operation fails?&lt;/p&gt;

&lt;p&gt;What if two administrators attempt to mark the same salary as paid simultaneously?&lt;/p&gt;

&lt;p&gt;What if the request times out and the frontend retries&amp;nbsp;it?&lt;/p&gt;

&lt;p&gt;What if the application accidentally records the treasury movement&amp;nbsp;twice?&lt;/p&gt;

&lt;p&gt;These aren’t theoretical concerns.&lt;/p&gt;

&lt;p&gt;They’re examples of the consistency problems financial software must&amp;nbsp;handle.&lt;/p&gt;

&lt;p&gt;A reliable implementation needs to enforce invariants such&amp;nbsp;as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A payroll record cannot be paid&amp;nbsp;twice.&lt;/li&gt;
&lt;li&gt;A successful payroll payment must have the correct treasury&amp;nbsp;effect.&lt;/li&gt;
&lt;li&gt;Failed operations must not leave the records in contradictory states.&lt;/li&gt;
&lt;li&gt;Repeated requests must not create duplicate financial movements.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The implementation may use database transactions, unique constraints, locking, and idempotency keys.&lt;/p&gt;

&lt;p&gt;For example, the conceptual operation might look like&amp;nbsp;this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;await database.transaction(async (tx) =&amp;gt; {
  const payroll = await tx.payroll.lockById(payrollId);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  if (payroll.status !== 'APPROVED') {
    throw new Error('Invalid payroll state');
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  await tx.treasury.createMovement({
    sourceType: 'PAYROLL',
    sourceId: payroll.id,
    amount: payroll.netSalary,
  });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  await tx.payroll.markAsPaid(payroll.id);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;This is conceptual pseudocode, not a copy of Clay’s production implementation. A real system also needs appropriate uniqueness constraints, authorization, and concurrency tests.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The important lesson is that understanding transactions matters much more than the ability to generate this function.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to Learn in&amp;nbsp;2027
&lt;/h3&gt;

&lt;p&gt;Learn PostgreSQL fundamentals deeply.&lt;/p&gt;

&lt;p&gt;Study relationships, indexes, transactions, isolation levels, constraints, locks, query plans, and backup strategies.&lt;/p&gt;

&lt;p&gt;Don’t stop after learning how to create tables and perform CRUD operations.&lt;/p&gt;

&lt;p&gt;Build systems where data correctness actually&amp;nbsp;matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI can generate database queries. Your understanding must determine whether those queries preserve the business&amp;nbsp;rules.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Security and Multi-Tenancy: Correct Code Can Still Be Dangerous
&lt;/h3&gt;

&lt;p&gt;Another important lesson comes from designing and developing multi-tenant CRM&amp;nbsp;systems.&lt;/p&gt;

&lt;p&gt;A CRM platform may serve multiple companies from the same backend and database.&lt;/p&gt;

&lt;p&gt;Each organization has its own customers, opportunities, tasks, contacts, and employees.&lt;/p&gt;

&lt;p&gt;A typical architecture looks like&amp;nbsp;this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SaaS CRM
                     |
                  NestJS
                     |
             Authentication
                     |
             Workspace Access
                     |
               Authorization
                     |
                PostgreSQL
                     |
          +----------+----------+
          |                     |
       Company A             Company B
          |                     |
       Customers              Customers
       Opportunities          Opportunities
       Tasks                  Tasks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The challenge isn’t simply adding a workspaceId column.&lt;/p&gt;

&lt;p&gt;The challenge is guaranteeing that every operation respects the organization’s security boundaries.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Common AI-Generated Mistake
&lt;/h3&gt;

&lt;p&gt;Imagine requesting a function that retrieves an opportunity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async getOpportunity(id: string) {
  return db.query.opportunities.findFirst({
    where: eq(opportunities.id, id),
  });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The function may&amp;nbsp;compile.&lt;/p&gt;

&lt;p&gt;It may return the correct opportunity.&lt;/p&gt;

&lt;p&gt;It may pass a basic unit&amp;nbsp;test.&lt;/p&gt;

&lt;p&gt;But what’s&amp;nbsp;missing?&lt;/p&gt;

&lt;p&gt;The query doesn’t enforce workspace ownership.&lt;/p&gt;

&lt;p&gt;In a multi-tenant application, the correct lookup must include the authorized workspace and any applicable record-level permissions.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async getOpportunity(
  id: string,
  authorizedWorkspaceId: string,
) {
  return db.query.opportunities.findFirst({
    where: and(
      eq(opportunities.id, id),
      eq(opportunities.workspaceId, authorizedWorkspaceId),
    ),
  });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And authorizedWorkspaceId must come from trusted authorization logic, not an unchecked request&amp;nbsp;body.&lt;/p&gt;

&lt;p&gt;This is exactly why understanding authentication and authorization matters.&lt;/p&gt;

&lt;p&gt;AI may generate technically valid code that violates your security requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to&amp;nbsp;Learn
&lt;/h3&gt;

&lt;p&gt;Study authentication, authorization, RBAC, tenant isolation, input validation, secrets management, and the OWASP Top&amp;nbsp;10.&lt;/p&gt;

&lt;p&gt;Understand why hiding a button in Flutter or Nuxt does not prevent an unauthorized API&amp;nbsp;request.&lt;/p&gt;

&lt;p&gt;Learn to enforce permissions on the backend and verify them through automated tests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ability to identify a security vulnerability in perfectly valid code is more important than memorizing the syntax used to write that&amp;nbsp;code.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. System Design: Think Beyond Individual Functions
&lt;/h3&gt;

&lt;p&gt;One lesson that becomes clearer as applications grow is that software architecture isn’t about creating beautiful folder structures.&lt;/p&gt;

&lt;p&gt;It’s about managing complexity.&lt;/p&gt;

&lt;p&gt;In a CRM, for example, you may have modules for contacts, leads, opportunities, contracts, tasks, notifications, and integrations.&lt;/p&gt;

&lt;p&gt;Each module can work correctly in isolation.&lt;/p&gt;

&lt;p&gt;But real problems emerge when they interact.&lt;/p&gt;

&lt;p&gt;Imagine that an opportunity is converted into a contract.&lt;/p&gt;

&lt;p&gt;Should that automatically create a follow-up task?&lt;/p&gt;

&lt;p&gt;What if the notification service is unavailable?&lt;/p&gt;

&lt;p&gt;Should the contract creation&amp;nbsp;fail?&lt;/p&gt;

&lt;p&gt;What if the conversion request is submitted twice?&lt;/p&gt;

&lt;p&gt;How do you prevent partial or duplicated business operations?&lt;/p&gt;

&lt;p&gt;AI can suggest architectural patterns.&lt;/p&gt;

&lt;p&gt;It can generate event emitters, queues, services, and database&amp;nbsp;models.&lt;/p&gt;

&lt;p&gt;But choosing the appropriate design requires understanding the actual business requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Lesson from Large SaaS Applications
&lt;/h3&gt;

&lt;p&gt;When building systems with many modules, I prefer asking a few questions before introducing architectural complexity.&lt;/p&gt;

&lt;p&gt;Does this component need to scale independently?&lt;/p&gt;

&lt;p&gt;Can the operation be completed synchronously?&lt;/p&gt;

&lt;p&gt;What happens when a dependency becomes unavailable?&lt;/p&gt;

&lt;p&gt;Where should the transaction boundary&amp;nbsp;exist?&lt;/p&gt;

&lt;p&gt;Who owns the business&amp;nbsp;rule?&lt;/p&gt;

&lt;p&gt;For many SaaS products, a well-structured modular monolith is a sensible starting&amp;nbsp;point.&lt;/p&gt;

&lt;p&gt;Not every module needs to become a microservice.&lt;/p&gt;

&lt;p&gt;Not every workflow needs a message&amp;nbsp;broker.&lt;/p&gt;

&lt;p&gt;Not every API needs an abstraction layer.&lt;/p&gt;

&lt;p&gt;The objective is not to introduce the greatest number of architectural patterns.&lt;/p&gt;

&lt;p&gt;It’s to choose the simplest architecture that satisfies the current requirements while allowing reasonable future evolution.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to&amp;nbsp;Learn
&lt;/h3&gt;

&lt;p&gt;Study modular architecture, domain modeling, dependency injection, caching, background processing, event-driven systems, distributed systems, and reliability.&lt;/p&gt;

&lt;p&gt;Learn the trade-offs between synchronous and asynchronous communication.&lt;/p&gt;

&lt;p&gt;Understand when to use database transactions and when a workflow needs compensating actions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;System design is not about knowing every architecture. It’s about knowing why a particular architecture fits a particular problem.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Performance Engineering: An Example from Data Import&amp;nbsp;Systems
&lt;/h3&gt;

&lt;p&gt;Performance problems aren’t always caused by complicated algorithms.&lt;/p&gt;

&lt;p&gt;Sometimes they come from handling ordinary operations at a larger&amp;nbsp;scale.&lt;/p&gt;

&lt;p&gt;One example from my work involves an influencer and company management platform with spreadsheet import workflows.&lt;/p&gt;

&lt;p&gt;An import file may contain thousands of companies or influencers, potentially tens of thousands of&amp;nbsp;rows.&lt;/p&gt;

&lt;p&gt;A simple implementation might process every row sequentially:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for (const row of rows) {
  await database.insert(row);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That might be acceptable for a tiny&amp;nbsp;file.&lt;/p&gt;

&lt;p&gt;But what happens when the import contains 20,000&amp;nbsp;rows?&lt;/p&gt;

&lt;p&gt;What if some rows contain invalid&amp;nbsp;data?&lt;/p&gt;

&lt;p&gt;What if the process crashes after importing 12,000&amp;nbsp;rows?&lt;/p&gt;

&lt;p&gt;What if the spreadsheet contains merged headers or inconsistent field&amp;nbsp;names?&lt;/p&gt;

&lt;p&gt;What if the user uploads the same file&amp;nbsp;twice?&lt;/p&gt;

&lt;p&gt;The engineering challenge becomes much broader than parsing a spreadsheet.&lt;/p&gt;

&lt;p&gt;You need to think about batching, queue processing, validation, partial failures, error reporting, idempotency, and memory consumption.&lt;/p&gt;

&lt;h3&gt;
  
  
  What This Teaches&amp;nbsp;Us
&lt;/h3&gt;

&lt;p&gt;A developer needs a working understanding of data structures, algorithms, SQL performance, and asynchronous processing.&lt;/p&gt;

&lt;p&gt;But they also need to understand the user experience.&lt;/p&gt;

&lt;p&gt;Should the frontend wait for the entire&amp;nbsp;import?&lt;/p&gt;

&lt;p&gt;Should the import run as a background job?&lt;/p&gt;

&lt;p&gt;Can users download a report showing successful and failed&amp;nbsp;rows?&lt;/p&gt;

&lt;p&gt;Can an interrupted import resume&amp;nbsp;safely?&lt;/p&gt;

&lt;p&gt;These questions connect performance engineering with product&amp;nbsp;design.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to&amp;nbsp;Learn
&lt;/h3&gt;

&lt;p&gt;Study algorithmic complexity, pagination, streaming, batching, queues, Redis, and profiling.&lt;/p&gt;

&lt;p&gt;Learn to investigate slow queries using database execution plans.&lt;/p&gt;

&lt;p&gt;Measure performance rather than relying on intuition or AI-generated optimization claims.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A fast-looking implementation isn’t necessarily efficient. Performance must be evaluated under realistic workloads.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Mobile Engineering: Offline-First Systems Teach You Distributed Systems
&lt;/h3&gt;

&lt;p&gt;Flutter is a powerful framework for building cross-platform applications.&lt;/p&gt;

&lt;p&gt;But becoming a strong Flutter engineer requires more than creating responsive interfaces and managing widget&amp;nbsp;state.&lt;/p&gt;

&lt;p&gt;One area I’ve been exploring through POS system architecture is offline-first application design.&lt;/p&gt;

&lt;p&gt;Imagine a retail store using a POS application.&lt;/p&gt;

&lt;p&gt;The internet connection disappears.&lt;/p&gt;

&lt;p&gt;Should the store stop&amp;nbsp;selling?&lt;/p&gt;

&lt;p&gt;For certain business workflows, the application should continue recording operations locally.&lt;/p&gt;

&lt;p&gt;But that introduces difficult consistency problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Offline POS&amp;nbsp;Problem
&lt;/h3&gt;

&lt;p&gt;Consider this workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Flutter / Desktop POS
         |
         v
    Local Database
         |
         v
    Pending Sales
         |
    Internet Returns
         |
         v
     Sync Engine
         |
         v
      NestJS API
         |
         v
     PostgreSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A cashier records a&amp;nbsp;sale.&lt;/p&gt;

&lt;p&gt;The local database saves&amp;nbsp;it.&lt;/p&gt;

&lt;p&gt;Later, the application sends the sale to the&amp;nbsp;backend.&lt;/p&gt;

&lt;p&gt;But what happens if PostgreSQL commits the transaction and the connection drops before the client receives confirmation?&lt;/p&gt;

&lt;p&gt;The client may&amp;nbsp;retry.&lt;/p&gt;

&lt;p&gt;Without a stable transaction identifier and server-side idempotency, the same sale could be recorded&amp;nbsp;twice.&lt;/p&gt;

&lt;p&gt;This is a distributed-systems problem, even though the application may appear to be a simple mobile&amp;nbsp;POS.&lt;/p&gt;

&lt;p&gt;The design also needs to address inventory conflicts, authentication expiry, local data recovery, and synchronization failures.&lt;/p&gt;

&lt;p&gt;These are exactly the kinds of challenges worth studying before turning an offline-first design into a production system.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to&amp;nbsp;Learn
&lt;/h3&gt;

&lt;p&gt;For Flutter, study Dart deeply, state management, application architecture, local databases, secure storage, networking, testing, and platform lifecycle behavior.&lt;/p&gt;

&lt;p&gt;Then move into offline synchronization, optimistic updates, conflict resolution, and failure recovery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don’t become a Flutter developer who only knows how to build screens. Become an engineer who understands the system behind those&amp;nbsp;screens.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  7. AI Engineering: Give AI Tools, Not Unlimited Control
&lt;/h3&gt;

&lt;p&gt;AI engineering deserves a place on every modern software engineer’s learning&amp;nbsp;roadmap.&lt;/p&gt;

&lt;p&gt;But integrating AI into an application isn’t simply calling a language model&amp;nbsp;API.&lt;/p&gt;

&lt;p&gt;One of the areas I’m working on is integrating AI capabilities into CRM workflows.&lt;/p&gt;

&lt;p&gt;The goal is to allow users to interact with their business data through natural language.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Show me the opportunities that haven’t been updated recently and prepare follow-up tasks for the responsible employees.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An AI assistant could interpret this request and decide which tool to&amp;nbsp;use.&lt;/p&gt;

&lt;p&gt;But the model should not receive unrestricted access to the database.&lt;/p&gt;

&lt;p&gt;A safer architecture looks like&amp;nbsp;this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Request
                  |
                  v
              AI Model
                  |
                  v
             Tool Selection
                  |
                  v
          NestJS Tool Dispatcher
                  |
                  v
           Permission Validation
                  |
                  v
          Authorized CRM Service
                  |
                  v
              PostgreSQL
                  |
                  v
              Tool Result
                  |
                  v
             AI Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the user asks the assistant to modify data, the application can prepare an action and require confirmation before executing it.&lt;/p&gt;

&lt;p&gt;For example, the assistant may propose creating a follow-up task.&lt;/p&gt;

&lt;p&gt;The backend then verifies the user’s permissions and executes the approved operation through the normal business&amp;nbsp;service.&lt;/p&gt;

&lt;p&gt;This preserves existing audit logging, validation, and authorization rules.&lt;/p&gt;

&lt;h3&gt;
  
  
  What AI Should and Shouldn’t Do
&lt;/h3&gt;

&lt;p&gt;AI can help classify customer requests, summarize records, recommend priorities, prepare messages, and select approved&amp;nbsp;tools.&lt;/p&gt;

&lt;p&gt;It shouldn’t independently bypass authorization, modify financial records without appropriate approval, or execute arbitrary SQL.&lt;/p&gt;

&lt;p&gt;These boundaries matter because language models can misunderstand requests, produce invalid tool arguments, or be influenced by malicious instructions embedded in retrieved data.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to&amp;nbsp;Learn
&lt;/h3&gt;

&lt;p&gt;Study LLM fundamentals, prompting, structured outputs, RAG, tool calling, agent workflows, model evaluation, and prompt-injection risks.&lt;/p&gt;

&lt;p&gt;Learn how to measure model accuracy, latency, failure rates, and operating cost.&lt;/p&gt;

&lt;p&gt;Understand how to use existing APIs and frameworks without building unnecessary infrastructure.&lt;/p&gt;

&lt;p&gt;And most importantly, learn to combine probabilistic AI outputs with deterministic business&amp;nbsp;rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The goal isn’t to make an AI model control your application. It’s to make your application more capable while keeping its operations secure and verifiable.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Testing and Debugging: Learn to Prove That Your Code&amp;nbsp;Works
&lt;/h3&gt;

&lt;p&gt;A major risk of AI-assisted development is accepting solutions because they look convincing.&lt;/p&gt;

&lt;p&gt;But professional software engineering requires evidence.&lt;/p&gt;

&lt;p&gt;For example, imagine an AI assistant generates a payroll&amp;nbsp;service.&lt;/p&gt;

&lt;p&gt;The code compiles.&lt;/p&gt;

&lt;p&gt;The endpoint returns HTTP&amp;nbsp;200.&lt;/p&gt;

&lt;p&gt;Does that mean the implementation is&amp;nbsp;correct?&lt;/p&gt;

&lt;p&gt;Not necessarily.&lt;/p&gt;

&lt;p&gt;You still need to test concurrent requests, invalid transitions, duplicate payments, authorization failures, and transaction rollbacks.&lt;/p&gt;

&lt;p&gt;Likewise, a CRM endpoint may pass normal tests while leaking data across&amp;nbsp;tenants.&lt;/p&gt;

&lt;p&gt;A POS synchronization service may work with a stable internet connection but duplicate transactions when requests are&amp;nbsp;retried.&lt;/p&gt;

&lt;p&gt;These aren’t problems that can be addressed through happy-path testing&amp;nbsp;alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  My Recommended Testing&amp;nbsp;Mindset
&lt;/h3&gt;

&lt;p&gt;For every important feature, identify its invariants.&lt;/p&gt;

&lt;p&gt;For payroll:&lt;/p&gt;

&lt;p&gt;A salary payment must not create duplicate treasury movements.&lt;/p&gt;

&lt;p&gt;For CRM:&lt;/p&gt;

&lt;p&gt;A user must never access records outside their authorized workspace and permissions.&lt;/p&gt;

&lt;p&gt;For POS:&lt;/p&gt;

&lt;p&gt;Retrying the same sale must not create another&amp;nbsp;sale.&lt;/p&gt;

&lt;p&gt;For data&amp;nbsp;imports:&lt;/p&gt;

&lt;p&gt;The system must accurately report successful and failed&amp;nbsp;records.&lt;/p&gt;

&lt;p&gt;Then write tests that attempt to violate those invariants.&lt;/p&gt;

&lt;p&gt;Learn unit testing, integration testing, end-to-end testing, and concurrency testing.&lt;/p&gt;

&lt;p&gt;Become comfortable reading logs and stack&amp;nbsp;traces.&lt;/p&gt;

&lt;p&gt;Use AI to generate test ideas, but evaluate whether those tests actually verify important behavior.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The most valuable test isn’t always the one that proves your code works. Sometimes, it’s the one that proves a dangerous failure cannot&amp;nbsp;happen.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  9. DevOps and Production Reliability: Understand What Happens After Deployment
&lt;/h3&gt;

&lt;p&gt;Writing software is only part of the lifecycle.&lt;/p&gt;

&lt;p&gt;Applications also need to be deployed, monitored, maintained, and recovered when something fails.&lt;/p&gt;

&lt;p&gt;Working with Docker, PostgreSQL, and server-hosted applications has made this especially clear to&amp;nbsp;me.&lt;/p&gt;

&lt;p&gt;A local development environment can hide important problems.&lt;/p&gt;

&lt;p&gt;An application might work perfectly on your computer but fail in production because of missing environment variables, unavailable dependencies, memory limitations, or incorrect network configuration.&lt;/p&gt;

&lt;p&gt;A Docker container might build successfully but fail its health&amp;nbsp;checks.&lt;/p&gt;

&lt;p&gt;A database migration might work in development but encounter constraints in an existing production database.&lt;/p&gt;

&lt;p&gt;A frontend deployment might serve stale&amp;nbsp;assets.&lt;/p&gt;

&lt;p&gt;These problems require operational understanding.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to&amp;nbsp;Learn
&lt;/h3&gt;

&lt;p&gt;Study Linux fundamentals, Docker, CI/CD, networking, environment configuration, logs, monitoring, and database&amp;nbsp;backups.&lt;/p&gt;

&lt;p&gt;Learn how health checks&amp;nbsp;work.&lt;/p&gt;

&lt;p&gt;Understand the difference between an application process running and an application being&amp;nbsp;healthy.&lt;/p&gt;

&lt;p&gt;Practice reading container logs and investigating deployment failures.&lt;/p&gt;

&lt;p&gt;Learn basic cloud infrastructure concepts without becoming dependent on any single hosting provider.&lt;/p&gt;

&lt;h3&gt;
  
  
  Practical Exercise
&lt;/h3&gt;

&lt;p&gt;Deploy a small SaaS application with a PostgreSQL database.&lt;/p&gt;

&lt;p&gt;Then deliberately break something.&lt;/p&gt;

&lt;p&gt;Stop the database.&lt;/p&gt;

&lt;p&gt;Deploy an invalid configuration.&lt;/p&gt;

&lt;p&gt;Simulate an unavailable external&amp;nbsp;API.&lt;/p&gt;

&lt;p&gt;Test recovery from a&amp;nbsp;backup.&lt;/p&gt;

&lt;p&gt;Investigate each failure using logs and observable behavior.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A developer who understands production failures can provide value long after the initial implementation is complete.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  10. What Should You Delegate to&amp;nbsp;AI?
&lt;/h3&gt;

&lt;p&gt;Learning every concept from scratch doesn’t mean writing every line of code manually.&lt;/p&gt;

&lt;p&gt;AI is genuinely useful for reducing repetitive work.&lt;/p&gt;

&lt;p&gt;The real challenge is knowing what to delegate and what to understand.&lt;/p&gt;

&lt;p&gt;TaskAI’s RoleEngineer’s ResponsibilityBoilerplate codeGenerate implementationValidate integrationDatabase schemaSuggest modelsVerify data integritySQL queriesDraft and optimizeCheck correctness and execution plansAuthenticationAssist implementationEnforce security boundariesUnit testsGenerate test casesValidate coverage of critical behaviorSystem designCompare architecturesEvaluate trade-offsDebuggingSuggest hypothesesVerify root causeAI agentsSelect approved toolsControl permissions and executionDocumentationGenerate draftsVerify technical accuracy&lt;/p&gt;

&lt;p&gt;A useful rule&amp;nbsp;is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Delegate repetition, not responsibility.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If AI can save you an hour writing boilerplate, use&amp;nbsp;it.&lt;/p&gt;

&lt;p&gt;If you’re learning a new concept, don’t automatically skip the reasoning.&lt;/p&gt;

&lt;p&gt;Ask AI to explain why an approach&amp;nbsp;works.&lt;/p&gt;

&lt;p&gt;Challenge it to identify failure scenarios.&lt;/p&gt;

&lt;p&gt;Compare its explanation with the official documentation.&lt;/p&gt;

&lt;p&gt;Then test the implementation.&lt;/p&gt;

&lt;p&gt;The goal is to become more capable through AI assistance, not more dependent on&amp;nbsp;it.&lt;/p&gt;

&lt;h3&gt;
  
  
  11. My Practical Learning Roadmap for&amp;nbsp;2027
&lt;/h3&gt;

&lt;p&gt;If I were planning a year of focused engineering development, I would organize it around progressively more complex system capabilities.&lt;/p&gt;

&lt;p&gt;Rather than building ten unrelated tutorial applications, I would use a few serious projects to develop multiple&amp;nbsp;skills.&lt;/p&gt;

&lt;h3&gt;
  
  
  January–March: Programming and Database Fundamentals
&lt;/h3&gt;

&lt;p&gt;Focus on programming fundamentals, asynchronous execution, data structures, SQL, and automated testing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practice project: Finance and&amp;nbsp;Payroll&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Build a small payroll workflow inspired by systems like&amp;nbsp;Clay.&lt;/p&gt;

&lt;p&gt;Implement salary records, approval states, payment operations, and database transactions.&lt;/p&gt;

&lt;p&gt;Test duplicate payment attempts and invalid status transitions.&lt;/p&gt;

&lt;p&gt;By the end of this phase, you should be able to explain how your database guarantees important business&amp;nbsp;rules.&lt;/p&gt;

&lt;h3&gt;
  
  
  April–June: System Design and Application Security
&lt;/h3&gt;

&lt;p&gt;Focus on modular architecture, authorization, PostgreSQL indexing, API security, and multi-tenancy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practice project: Multi-Tenant CRM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Build organization memberships, customer management, and task management.&lt;/p&gt;

&lt;p&gt;Implement role-based access control and tenant-scoped queries.&lt;/p&gt;

&lt;p&gt;Write integration tests demonstrating that unauthorized users cannot access another organization’s records.&lt;/p&gt;

&lt;p&gt;By the end of this phase, you should be comfortable designing a secure backend feature from requirements to&amp;nbsp;tests.&lt;/p&gt;

&lt;h3&gt;
  
  
  July–September: Reliability, Performance, and Deployment
&lt;/h3&gt;

&lt;p&gt;Focus on Docker, CI/CD, background jobs, observability, caching, and distributed-system fundamentals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practice project: Offline POS and Data Synchronization&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Build a small Flutter or desktop POS prototype with local persistence and retry-safe synchronization.&lt;/p&gt;

&lt;p&gt;Add a queue-based data import workflow.&lt;/p&gt;

&lt;p&gt;Test interrupted requests, duplicate submissions, and large input&amp;nbsp;files.&lt;/p&gt;

&lt;p&gt;Deploy the backend and simulate failures.&lt;/p&gt;

&lt;p&gt;By the end of this phase, you should understand how systems behave when their dependencies become unreliable.&lt;/p&gt;

&lt;h3&gt;
  
  
  October–December: AI Engineering
&lt;/h3&gt;

&lt;p&gt;Focus on LLM APIs, structured outputs, retrieval, tool calling, agent security, and evaluation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practice project: AI-Powered CRM Assistant&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Add an AI assistant that can retrieve authorized CRM records and propose follow-up tasks.&lt;/p&gt;

&lt;p&gt;Require approval before executing sensitive operations.&lt;/p&gt;

&lt;p&gt;Add audit logs and automated tests for invalid tool arguments, unauthorized access, and repeated action execution.&lt;/p&gt;

&lt;p&gt;By the end of the year, you should have an application demonstrating both traditional engineering competence and practical AI integration.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Roadmap at a&amp;nbsp;Glance
&lt;/h3&gt;

&lt;p&gt;QuarterEngineering FocusProjectQ1Programming, SQL, transactions, testingFinance and payroll workflowQ2Architecture, RBAC, multi-tenancySecure CRMQ3DevOps, performance, offline syncPOS and import workflowsQ4AI agents, tools, evaluation, safetyAI-powered CRM&lt;/p&gt;

&lt;p&gt;The purpose of this roadmap is not to master every technology in one&amp;nbsp;year.&lt;/p&gt;

&lt;p&gt;It’s to develop the ability to reason about increasingly complex engineering problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  12. How Do You Know You’re Actually Improving?
&lt;/h3&gt;

&lt;p&gt;Don’t measure engineering growth by how many courses you’ve completed.&lt;/p&gt;

&lt;p&gt;Don’t measure it by how many AI prompts you’ve&amp;nbsp;written.&lt;/p&gt;

&lt;p&gt;And don’t measure it by the number of lines of code you’ve generated.&lt;/p&gt;

&lt;p&gt;Measure what you can demonstrate.&lt;/p&gt;

&lt;p&gt;Can you explain why your database transaction is&amp;nbsp;safe?&lt;/p&gt;

&lt;p&gt;Can you identify a missing authorization condition?&lt;/p&gt;

&lt;p&gt;Can you diagnose a production failure using&amp;nbsp;logs?&lt;/p&gt;

&lt;p&gt;Can you design a workflow that handles duplicate requests?&lt;/p&gt;

&lt;p&gt;Can you explain why you chose a particular architecture?&lt;/p&gt;

&lt;p&gt;Can you build an AI integration that respects existing business permissions?&lt;/p&gt;

&lt;p&gt;These are meaningful indicators of progress.&lt;/p&gt;

&lt;p&gt;A good engineer should be able to explain not only what their system does, but also what guarantees it provides and where its limitations remain.&lt;/p&gt;

&lt;p&gt;That understanding is what turns implementation experience into engineering expertise.&lt;/p&gt;

&lt;h3&gt;
  
  
  13. The Most Important Skill in 2027 Isn’t a Framework
&lt;/h3&gt;

&lt;p&gt;Frameworks will continue evolving.&lt;/p&gt;

&lt;p&gt;AI models will&amp;nbsp;improve.&lt;/p&gt;

&lt;p&gt;New developer tools will&amp;nbsp;appear.&lt;/p&gt;

&lt;p&gt;Some technologies that seem essential today may become less relevant.&lt;/p&gt;

&lt;p&gt;But certain engineering problems will&amp;nbsp;remain.&lt;/p&gt;

&lt;p&gt;Software will still need to manage data correctly.&lt;/p&gt;

&lt;p&gt;Applications will still need to protect user information.&lt;/p&gt;

&lt;p&gt;Distributed systems will still experience failures.&lt;/p&gt;

&lt;p&gt;Financial operations will still require consistency.&lt;/p&gt;

&lt;p&gt;Business workflows will still have complex&amp;nbsp;rules.&lt;/p&gt;

&lt;p&gt;And developers will still need to make decisions under uncertainty.&lt;/p&gt;

&lt;p&gt;The tools we use to implement solutions may change dramatically.&lt;/p&gt;

&lt;p&gt;But understanding the underlying problems will remain valuable.&lt;/p&gt;

&lt;p&gt;This is why I believe the strongest approach to learning software engineering in 2027 combines three&amp;nbsp;things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deep fundamentals.&lt;/strong&gt; Understand programming, databases, networking, security, and software&amp;nbsp;design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real project experience.&lt;/strong&gt; Work on applications where failures have meaningful consequences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI fluency.&lt;/strong&gt; Use modern tools to accelerate implementation while independently evaluating correctness, reliability, and&amp;nbsp;risk.&lt;/p&gt;

&lt;p&gt;None of these replaces the&amp;nbsp;others.&lt;/p&gt;

&lt;p&gt;Together, they create a stronger engineer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts: Don’t Just Learn to Code. Learn to Engineer.
&lt;/h3&gt;

&lt;p&gt;When I think about the lessons from finance systems, CRM platforms, workflow applications, data-import pipelines, and offline-first architecture, one principle connects them&amp;nbsp;all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The real challenge is not producing code. It’s making the software behave correctly under real-world conditions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI can generate a payroll&amp;nbsp;service.&lt;/p&gt;

&lt;p&gt;But you need to understand why a payment must not be recorded&amp;nbsp;twice.&lt;/p&gt;

&lt;p&gt;AI can generate a CRM&amp;nbsp;API.&lt;/p&gt;

&lt;p&gt;But you need to understand why every query must respect authorization boundaries.&lt;/p&gt;

&lt;p&gt;AI can generate an offline synchronization engine.&lt;/p&gt;

&lt;p&gt;But you need to understand what happens when a network request fails after the server has already committed a transaction.&lt;/p&gt;

&lt;p&gt;AI can build a tool-calling assistant.&lt;/p&gt;

&lt;p&gt;But you need to understand which actions that assistant should be permitted to&amp;nbsp;execute.&lt;/p&gt;

&lt;p&gt;These are not reasons to avoid&amp;nbsp;AI.&lt;/p&gt;

&lt;p&gt;They’re reasons to become better at using&amp;nbsp;it.&lt;/p&gt;

&lt;p&gt;Learn the fundamentals.&lt;/p&gt;

&lt;p&gt;Build real&amp;nbsp;systems.&lt;/p&gt;

&lt;p&gt;Understand how those systems&amp;nbsp;fail.&lt;/p&gt;

&lt;p&gt;Practice debugging, testing, and architectural reasoning.&lt;/p&gt;

&lt;p&gt;Use AI to accelerate implementation, explore alternatives, and improve your&amp;nbsp;work.&lt;/p&gt;

&lt;p&gt;But never confuse code generation with engineering understanding.&lt;/p&gt;

&lt;p&gt;Because the future of software development won’t only reward people who know how to ask AI to build something.&lt;/p&gt;

&lt;p&gt;It will also need people who know what should be built, what can go wrong, and how to verify that the system is reliable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI can help you write software&amp;nbsp;faster.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Engineering knowledge helps you build software worth trusting.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And in 2027, that distinction matters more than&amp;nbsp;ever.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recommended Learning Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://csed.acm.org/" rel="noopener noreferrer"&gt;Computer Science Curricula — ACM, IEEE-CS and&amp;nbsp;AAAI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/docs/current/" rel="noopener noreferrer"&gt;PostgreSQL Official Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://owasp.org/www-project-top-ten/" rel="noopener noreferrer"&gt;OWASP Top&amp;nbsp;10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.nestjs.com/" rel="noopener noreferrer"&gt;NestJS Official Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.flutter.dev/app-architecture" rel="noopener noreferrer"&gt;Flutter Architecture Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sre.google/books/" rel="noopener noreferrer"&gt;Google Site Reliability Engineering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nist.gov/itl/ai-risk-management-framework" rel="noopener noreferrer"&gt;NIST AI Risk Management Framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genai.owasp.org/llm-top-10/" rel="noopener noreferrer"&gt;OWASP Top 10 for LLM Applications&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;About the&amp;nbsp;Author&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I’m &lt;strong&gt;Khaled Abdelfattah Youssef&lt;/strong&gt;, a Full Stack Software Engineer with eight years of software development experience, working with TypeScript, NestJS, Nuxt.js, Flutter, PostgreSQL, and SaaS architecture.&lt;/p&gt;

&lt;p&gt;My engineering interests include enterprise applications, finance and operations systems, CRM platforms, automation, and the practical integration of artificial intelligence into business software.&lt;/p&gt;

&lt;p&gt;I enjoy exploring how strong engineering fundamentals and modern AI tools can work together to build more reliable, maintainable, and useful applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://ms3b.com/" rel="noopener noreferrer"&gt;ms3b.com&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ms3byoussef" rel="noopener noreferrer"&gt;github.com/ms3byoussef&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://linkedin.com/in/ms3byoussef" rel="noopener noreferrer"&gt;linkedin.com/in/ms3byoussef&lt;/a&gt;&lt;/p&gt;




</description>
      <category>webdev</category>
      <category>agents</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>AI Can Write the Code. Can You Tell When It’s Wrong?</title>
      <dc:creator>مصعب يوسف</dc:creator>
      <pubDate>Tue, 20 Oct 2026 08:49:29 +0000</pubDate>
      <link>https://dev.to/ms3byoussef/ai-can-write-the-code-can-you-tell-when-its-wrong-32el</link>
      <guid>https://dev.to/ms3byoussef/ai-can-write-the-code-can-you-tell-when-its-wrong-32el</guid>
      <description>&lt;h3&gt;
  
  
  Why Learning Programming Fundamentals Matters More Than Ever in the Age of Artificial Intelligence
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;By Khaled Abdelfattah Youssef&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Software Engineer | Software Architecture · Backend Development · Flutter ·&amp;nbsp;AI&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;October 2026&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5bueut89p2cy8hpxaizv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5bueut89p2cy8hpxaizv.png" alt="AI Can Write the Code. Can You Tell When It’s Wrong?" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  The Illusion of Becoming a Developer Overnight
&lt;/h3&gt;

&lt;p&gt;Imagine this.&lt;/p&gt;

&lt;p&gt;Someone opens an AI coding assistant and&amp;nbsp;types:&lt;/p&gt;

&lt;p&gt;“Build me a complete SaaS application with authentication, payments, a dashboard, and customer management.”&lt;/p&gt;

&lt;p&gt;A few minutes later, hundreds of lines of code&amp;nbsp;appear.&lt;/p&gt;

&lt;p&gt;The application looks impressive.&lt;/p&gt;

&lt;p&gt;The login page works. The dashboard displays beautiful charts. Customers can register, and the database stores information.&lt;/p&gt;

&lt;p&gt;Everything appears to&amp;nbsp;work.&lt;/p&gt;

&lt;p&gt;But there are questions the interface cannot&amp;nbsp;answer.&lt;/p&gt;

&lt;p&gt;Is the authentication implementation secure?&lt;/p&gt;

&lt;p&gt;Can users access another company’s data?&lt;/p&gt;

&lt;p&gt;What happens when two customers update the same record simultaneously?&lt;/p&gt;

&lt;p&gt;Will the system behave correctly under heavy&amp;nbsp;traffic?&lt;/p&gt;

&lt;p&gt;What happens when a payment succeeds but the server loses its connection?&lt;/p&gt;

&lt;p&gt;And perhaps the most important question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the person who built the application understand how it actually&amp;nbsp;works?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is one of the most important questions facing software development in the AI&amp;nbsp;era.&lt;/p&gt;

&lt;p&gt;We are entering a period when generating code is becoming increasingly accessible.&lt;/p&gt;

&lt;p&gt;But generating code and engineering reliable software are not the same&amp;nbsp;thing.&lt;/p&gt;

&lt;p&gt;And confusing the two could become one of the biggest mistakes developers make.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. AI Has Changed Programming, but Not the Meaning of Engineering
&lt;/h3&gt;

&lt;p&gt;Artificial intelligence has transformed how developers work.&lt;/p&gt;

&lt;p&gt;We can generate boilerplate, explore unfamiliar libraries, write unit tests, refactor functions, investigate errors, and prototype applications much faster than&amp;nbsp;before.&lt;/p&gt;

&lt;p&gt;Tasks that once required extensive manual effort can often be completed with fewer keystrokes.&lt;/p&gt;

&lt;p&gt;These capabilities are genuinely valuable.&lt;/p&gt;

&lt;p&gt;Rejecting AI entirely would mean ignoring a powerful engineering tool.&lt;/p&gt;

&lt;p&gt;But there is an important distinction between writing code and solving engineering problems.&lt;/p&gt;

&lt;p&gt;Writing a function is an implementation task.&lt;/p&gt;

&lt;p&gt;Deciding whether that function should exist, how it interacts with the rest of the system, which assumptions it relies on, and how it might fail requires engineering judgment.&lt;/p&gt;

&lt;p&gt;Consider a developer building a multi-tenant SaaS application.&lt;/p&gt;

&lt;p&gt;An AI assistant can generate an endpoint that retrieves customer information from PostgreSQL.&lt;/p&gt;

&lt;p&gt;But does the generated query enforce tenant isolation?&lt;/p&gt;

&lt;p&gt;Does it validate permissions?&lt;/p&gt;

&lt;p&gt;Does it expose fields that the user should not&amp;nbsp;see?&lt;/p&gt;

&lt;p&gt;Does it handle the possibility that a customer belongs to a different organization?&lt;/p&gt;

&lt;p&gt;These questions require an understanding of the application’s architecture and security requirements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI can help implement a solution. It cannot independently guarantee that the solution meets every requirement you never clearly&amp;nbsp;defined.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The responsibility for correctness does not disappear simply because the code was generated.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. The Most Dangerous AI Mistakes Are Often the Most Convincing
&lt;/h3&gt;

&lt;p&gt;One of the most misunderstood characteristics of generative AI is its ability to produce incorrect answers with remarkable confidence.&lt;/p&gt;

&lt;p&gt;This behavior is commonly described as &lt;em&gt;AI hallucination&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The US National Institute of Standards and Technology (NIST) uses the term &lt;em&gt;confabulation&lt;/em&gt; to describe cases where generative AI systems present false or erroneous content confidently.&lt;/p&gt;

&lt;p&gt;These mistakes can arise from the way generative models produce their outputs. &lt;a href="https://tsapps.nist.gov/publication/get_pdf.cfm?pub_id=958388&amp;amp;utm_source=chatgpt.com" rel="noopener noreferrer"&gt;tsapps.nist.gov&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In programming, hallucinations can take several&amp;nbsp;forms.&lt;/p&gt;

&lt;p&gt;An AI assistant might invent a library method that doesn’t&amp;nbsp;exist.&lt;/p&gt;

&lt;p&gt;It might recommend an outdated&amp;nbsp;API.&lt;/p&gt;

&lt;p&gt;It might generate incorrect configuration options.&lt;/p&gt;

&lt;p&gt;It might misunderstand how a framework handles authentication.&lt;/p&gt;

&lt;p&gt;Or it might produce code that works for the example provided but fails under conditions the developer never considered.&lt;/p&gt;

&lt;p&gt;The most concerning mistakes are not necessarily syntax&amp;nbsp;errors.&lt;/p&gt;

&lt;p&gt;A compiler can detect many syntax&amp;nbsp;errors.&lt;/p&gt;

&lt;p&gt;A type checker can identify certain incompatible values.&lt;/p&gt;

&lt;p&gt;But what detects code that is syntactically valid, executes successfully, and implements the wrong business&amp;nbsp;rule?&lt;/p&gt;

&lt;p&gt;Consider this simplified example.&lt;/p&gt;

&lt;p&gt;A developer asks an AI assistant to retrieve an invoice from a CRM application.&lt;/p&gt;

&lt;p&gt;The generated code looks like&amp;nbsp;this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async function getInvoice(
  invoiceId: string,
  tenantId: string,
) {
  return prisma.invoice.findUnique({
    where: {
      id: invoiceId,
    },
  });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The code is&amp;nbsp;valid.&lt;/p&gt;

&lt;p&gt;It may compile successfully.&lt;/p&gt;

&lt;p&gt;It may even pass a basic&amp;nbsp;test.&lt;/p&gt;

&lt;p&gt;But there’s a serious&amp;nbsp;problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The function never uses&lt;/strong&gt; &lt;strong&gt;tenantId.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If invoice IDs are known or disclosed, an authenticated user could potentially retrieve an invoice belonging to another organization.&lt;/p&gt;

&lt;p&gt;The code works technically.&lt;/p&gt;

&lt;p&gt;But it fails an essential security requirement.&lt;/p&gt;

&lt;p&gt;A safer query would explicitly enforce tenant ownership:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async function getInvoice(
  invoiceId: string,
  tenantId: string,
) {
  return prisma.invoice.findFirst({
    where: {
      id: invoiceId,
      tenantId,
    },
  });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Of course, the backend must also derive the tenant context from an authorized user session rather than blindly trusting a client-provided value.&lt;/p&gt;

&lt;p&gt;The important lesson is not about&amp;nbsp;Prisma.&lt;/p&gt;

&lt;p&gt;It’s about understanding the difference between functional code and correct software.&lt;/p&gt;

&lt;p&gt;A developer who understands multi-tenancy and authorization can recognize the original&amp;nbsp;mistake.&lt;/p&gt;

&lt;p&gt;A developer who only knows how to ask AI for code might never notice&amp;nbsp;it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The most dangerous bug is not always the one that crashes your application. Sometimes, it’s the one that quietly does exactly what the code says, rather than what the business&amp;nbsp;needs.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. If AI Can Explain Everything, Why Should We Still&amp;nbsp;Learn?
&lt;/h3&gt;

&lt;p&gt;This is a reasonable question.&lt;/p&gt;

&lt;p&gt;Why spend weeks learning asynchronous programming when AI can explain it immediately?&lt;/p&gt;

&lt;p&gt;Why study database transactions when AI can generate the implementation?&lt;/p&gt;

&lt;p&gt;Why learn algorithms when an assistant can produce them in&amp;nbsp;seconds?&lt;/p&gt;

&lt;p&gt;Because there’s a fundamental difference between receiving an explanation and developing understanding.&lt;/p&gt;

&lt;p&gt;Learning is not merely collecting answers.&lt;/p&gt;

&lt;p&gt;It’s developing the ability to recognize patterns, understand causes, evaluate alternatives, and solve unfamiliar problems.&lt;/p&gt;

&lt;p&gt;Consider a developer learning asynchronous programming.&lt;/p&gt;

&lt;p&gt;They ask AI to fix a race condition.&lt;/p&gt;

&lt;p&gt;The assistant provides a working solution.&lt;/p&gt;

&lt;p&gt;The developer copies it, runs the application, and moves&amp;nbsp;on.&lt;/p&gt;

&lt;p&gt;The task is complete.&lt;/p&gt;

&lt;p&gt;But did the developer understand what caused the race condition?&lt;/p&gt;

&lt;p&gt;Could they identify a similar problem in another part of the application?&lt;/p&gt;

&lt;p&gt;Could they explain the difference between concurrency and parallelism?&lt;/p&gt;

&lt;p&gt;Could they recognize when a database transaction is necessary?&lt;/p&gt;

&lt;p&gt;If the answer is no, the developer has solved one immediate problem without necessarily gaining the ability to solve the next&amp;nbsp;one.&lt;/p&gt;

&lt;p&gt;This concern is supported by research.&lt;/p&gt;

&lt;p&gt;In January 2026, Anthropic published an experimental study investigating how AI assistance affects coding skill development.&lt;/p&gt;

&lt;p&gt;Participants using AI assistance scored an average of 50% on a subsequent assessment, compared with 67% for participants who coded without&amp;nbsp;AI.&lt;/p&gt;

&lt;p&gt;The study also found that &lt;em&gt;how&lt;/em&gt; participants used AI mattered. Those who used it to ask conceptual questions and deepen understanding generally showed stronger learning outcomes than those who delegated the entire&amp;nbsp;task.&lt;/p&gt;

&lt;p&gt;This was a relatively small experiment involving learning a particular Python library, so its results should not be generalized to every developer or workflow. Nevertheless, it demonstrates why completing a task and learning from that task should be evaluated separately.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.anthropic.com/research/AI-assistance-coding-skills" rel="noopener noreferrer"&gt;Read the Anthropic research&lt;/a&gt;. &lt;a href="https://www.anthropic.com/research/AI-assistance-coding-skills?continueFlag=9feb700a8f95cf74052a8c98d134a91e&amp;amp;utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Anthropic&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The practical implication is significant:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI should reduce unnecessary effort without eliminating the intellectual effort required to develop expertise.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The goal is not to struggle for the sake of struggling.&lt;/p&gt;

&lt;p&gt;The goal is to avoid outsourcing the very thinking that makes you a better engineer.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Programming Fundamentals Are Becoming More Valuable, Not&amp;nbsp;Less
&lt;/h3&gt;

&lt;p&gt;Frameworks change.&lt;/p&gt;

&lt;p&gt;Libraries evolve.&lt;/p&gt;

&lt;p&gt;Programming languages introduce new features.&lt;/p&gt;

&lt;p&gt;AI models&amp;nbsp;improve.&lt;/p&gt;

&lt;p&gt;But the fundamental problems of software engineering remain surprisingly consistent.&lt;/p&gt;

&lt;p&gt;Applications still need to manage data, coordinate concurrent operations, enforce permissions, communicate over networks, handle failures, and satisfy business requirements.&lt;/p&gt;

&lt;p&gt;That is why I believe developers should continue investing in several fundamental areas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Programming Logic and Problem-Solving
&lt;/h3&gt;

&lt;p&gt;Before learning a framework, learn how to reason about problems.&lt;/p&gt;

&lt;p&gt;Understand conditions, loops, functions, data structures, state, recursion, and algorithmic complexity.&lt;/p&gt;

&lt;p&gt;Learn how to break a large problem into smaller&amp;nbsp;parts.&lt;/p&gt;

&lt;p&gt;Practice tracing what a program actually does, rather than what you expect it to&amp;nbsp;do.&lt;/p&gt;

&lt;p&gt;AI can generate an algorithm.&lt;/p&gt;

&lt;p&gt;But understanding the algorithm allows you to evaluate whether it’s appropriate for your situation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Structures and Algorithms
&lt;/h3&gt;

&lt;p&gt;You don’t need to memorize every algorithm ever invented.&lt;/p&gt;

&lt;p&gt;But you should understand the trade-offs between arrays, maps, sets, trees, queues, and other common structures.&lt;/p&gt;

&lt;p&gt;You should know what time and space complexity mean.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because an implementation that works with 100 records might become painfully inefficient with 10&amp;nbsp;million.&lt;/p&gt;

&lt;p&gt;AI can suggest optimizations.&lt;/p&gt;

&lt;p&gt;But you need enough knowledge to understand the trade-offs and verify whether those optimizations matter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Databases and Data Integrity
&lt;/h3&gt;

&lt;p&gt;Understanding databases is essential for building serious applications.&lt;/p&gt;

&lt;p&gt;Developers should study relationships, indexes, constraints, transactions, isolation levels, and concurrency.&lt;/p&gt;

&lt;p&gt;An AI assistant may generate a query that returns the correct information.&lt;/p&gt;

&lt;p&gt;But does the query&amp;nbsp;scale?&lt;/p&gt;

&lt;p&gt;Could it create duplicate records?&lt;/p&gt;

&lt;p&gt;Could two simultaneous operations produce an inconsistent balance?&lt;/p&gt;

&lt;p&gt;Would the system recover from an interrupted transaction?&lt;/p&gt;

&lt;p&gt;These questions are especially important in financial applications, inventory systems, and SaaS platforms.&lt;/p&gt;

&lt;h3&gt;
  
  
  Networking and Backend Fundamentals
&lt;/h3&gt;

&lt;p&gt;Developers should understand HTTP, APIs, authentication, authorization, caching, retries, timeouts, and failure handling.&lt;/p&gt;

&lt;p&gt;For example, what happens if a mobile application sends a payment request and the connection drops before the server responds?&lt;/p&gt;

&lt;p&gt;Should the application retry?&lt;/p&gt;

&lt;p&gt;Could retrying create a second&amp;nbsp;charge?&lt;/p&gt;

&lt;p&gt;How can idempotency prevent duplicate operations?&lt;/p&gt;

&lt;p&gt;These are architectural questions that cannot be solved reliably through code generation alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security Fundamentals
&lt;/h3&gt;

&lt;p&gt;Every developer working with AI-generated code needs a working understanding of security.&lt;/p&gt;

&lt;p&gt;Learn about input validation, injection attacks, broken access control, credential management, secure authentication, and least-privilege permissions.&lt;/p&gt;

&lt;p&gt;AI-generated code should be treated like any other code entering a project: it requires review and appropriate verification.&lt;/p&gt;

&lt;p&gt;This becomes even more important when coding agents can execute commands, modify repositories, or interact with external services.&lt;/p&gt;

&lt;p&gt;OWASP’s guidance on prompt injection emphasizes controls such as least privilege, restricted tool access, and human approval for high-risk actions. &lt;a href="https://genai.owasp.org/llmrisk/llm01-prompt-injection/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;OWASP Gen AI Security&amp;nbsp;Project&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Security cannot depend entirely on telling a model to behave&amp;nbsp;safely.&lt;/p&gt;

&lt;h3&gt;
  
  
  Software Architecture and System&amp;nbsp;Design
&lt;/h3&gt;

&lt;p&gt;A system is more than a collection of working functions.&lt;/p&gt;

&lt;p&gt;Developers should understand modularity, separation of concerns, dependencies, scalability, reliability, and observability.&lt;/p&gt;

&lt;p&gt;Consider the difference between building a simple CRUD application and designing a SaaS platform used by hundreds of organizations.&lt;/p&gt;

&lt;p&gt;Both may use the same programming language.&lt;/p&gt;

&lt;p&gt;Both may use NestJS and PostgreSQL.&lt;/p&gt;

&lt;p&gt;But their engineering requirements are very different.&lt;/p&gt;

&lt;p&gt;The ability to understand these differences is part of what separates code generation from software engineering.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Learning to Debug May Become More Important Than Learning to Type&amp;nbsp;Code
&lt;/h3&gt;

&lt;p&gt;Imagine two developers working with the same AI coding assistant.&lt;/p&gt;

&lt;p&gt;The first developer generates a feature and sees that the application crashes.&lt;/p&gt;

&lt;p&gt;They copy the error message into the assistant.&lt;/p&gt;

&lt;p&gt;The assistant generates a&amp;nbsp;fix.&lt;/p&gt;

&lt;p&gt;Another error&amp;nbsp;appears.&lt;/p&gt;

&lt;p&gt;They ask for another&amp;nbsp;fix.&lt;/p&gt;

&lt;p&gt;After several iterations, the application finally&amp;nbsp;works.&lt;/p&gt;

&lt;p&gt;But the developer doesn’t understand what&amp;nbsp;changed.&lt;/p&gt;

&lt;p&gt;The second developer uses the same&amp;nbsp;tool.&lt;/p&gt;

&lt;p&gt;When an error appears, they inspect the stack&amp;nbsp;trace.&lt;/p&gt;

&lt;p&gt;They identify which component failed.&lt;/p&gt;

&lt;p&gt;They reproduce the&amp;nbsp;problem.&lt;/p&gt;

&lt;p&gt;They formulate a hypothesis.&lt;/p&gt;

&lt;p&gt;Then they ask AI to help investigate possible&amp;nbsp;causes.&lt;/p&gt;

&lt;p&gt;Before accepting the suggested fix, they verify the explanation and write a regression test.&lt;/p&gt;

&lt;p&gt;Both developers use&amp;nbsp;AI.&lt;/p&gt;

&lt;p&gt;But only one is consistently developing the skills needed to troubleshoot independently.&lt;/p&gt;

&lt;p&gt;Debugging requires understanding how a system&amp;nbsp;behaves.&lt;/p&gt;

&lt;p&gt;It involves asking questions such&amp;nbsp;as:&lt;/p&gt;

&lt;p&gt;What should have happened?&lt;/p&gt;

&lt;p&gt;What actually happened?&lt;/p&gt;

&lt;p&gt;Where did the behavior&amp;nbsp;diverge?&lt;/p&gt;

&lt;p&gt;Which assumptions might be incorrect?&lt;/p&gt;

&lt;p&gt;How can I reproduce the&amp;nbsp;failure?&lt;/p&gt;

&lt;p&gt;What evidence would prove that the fix is&amp;nbsp;correct?&lt;/p&gt;

&lt;p&gt;These skills remain valuable even when an AI tool can generate most of the implementation.&lt;/p&gt;

&lt;p&gt;And they become increasingly important as developers review larger amounts of machine-generated code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ability to generate code is becoming widespread. The ability to investigate why code fails remains a valuable engineering skill.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. The Real Danger Is Confusing Productivity with Understanding
&lt;/h3&gt;

&lt;p&gt;Suppose you complete ten features in a single day using&amp;nbsp;AI.&lt;/p&gt;

&lt;p&gt;That’s impressive.&lt;/p&gt;

&lt;p&gt;But what does it actually tell&amp;nbsp;us?&lt;/p&gt;

&lt;p&gt;Did those features satisfy the requirements?&lt;/p&gt;

&lt;p&gt;Are they&amp;nbsp;secure?&lt;/p&gt;

&lt;p&gt;Were they tested against realistic conditions?&lt;/p&gt;

&lt;p&gt;Will they be easy to maintain?&lt;/p&gt;

&lt;p&gt;Did they introduce unnecessary dependencies?&lt;/p&gt;

&lt;p&gt;Did they create technical debt that will take weeks to&amp;nbsp;resolve?&lt;/p&gt;

&lt;p&gt;The number of lines generated is not a reliable measurement of engineering success.&lt;/p&gt;

&lt;p&gt;Neither is the number of prompts&amp;nbsp;sent.&lt;/p&gt;

&lt;p&gt;In 2025, researchers at METR conducted a randomized study involving experienced open-source developers working on established repositories.&lt;/p&gt;

&lt;p&gt;In that particular setting, developers using early-2025 AI tools took approximately 19% longer to complete assigned&amp;nbsp;tasks.&lt;/p&gt;

&lt;p&gt;The study does not prove that AI reduces productivity in general. The researchers also acknowledged limitations, and later work highlighted how difficult measuring the impact of rapidly improving AI tools can&amp;nbsp;be.&lt;/p&gt;

&lt;p&gt;But the research challenges one assumption worth questioning:&lt;/p&gt;

&lt;p&gt;AI-generated output does not automatically translate into faster completion of reliable engineering work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://arxiv.org/abs/2507.09089?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Read the METR study&lt;/a&gt; and its &lt;a href="https://metr.org/blog/2026-02-24-uplift-update/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;2026 methodological update&lt;/a&gt;.&amp;nbsp;&lt;a href="https://arxiv.org/abs/2507.09089?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;أرشيڤ&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A feature is not complete merely because its code&amp;nbsp;exists.&lt;/p&gt;

&lt;p&gt;It must work under the conditions for which it was designed.&lt;/p&gt;

&lt;p&gt;It must integrate correctly with the surrounding system.&lt;/p&gt;

&lt;p&gt;It must satisfy functional and nonfunctional requirements.&lt;/p&gt;

&lt;p&gt;And someone must be accountable for its behavior.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Engineering productivity should be measured by reliable outcomes, not simply by the speed at which code appears on the&amp;nbsp;screen.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  7. The Developer’s Role Is Changing: From Writing Everything to Understanding and Directing More
&lt;/h3&gt;

&lt;p&gt;I don’t believe the future of programming should be framed as a competition between humans and&amp;nbsp;AI.&lt;/p&gt;

&lt;p&gt;The more useful question is how developers can become better engineers with AI assistance.&lt;/p&gt;

&lt;p&gt;As implementation becomes easier, other engineering responsibilities become more important.&lt;/p&gt;

&lt;p&gt;Developers increasingly need to define problems clearly, understand business requirements, select appropriate architectures, evaluate generated solutions, verify correctness, and manage system-level risks.&lt;/p&gt;

&lt;p&gt;These responsibilities have always&amp;nbsp;existed.&lt;/p&gt;

&lt;p&gt;AI is changing how much attention developers can devote to&amp;nbsp;them.&lt;/p&gt;

&lt;p&gt;A developer who previously spent hours writing repetitive CRUD operations may now have more time to think about data modeling, security, testing, and user experience.&lt;/p&gt;

&lt;p&gt;That’s a meaningful opportunity.&lt;/p&gt;

&lt;p&gt;But it only becomes an advantage if the developer actually invests that saved time in understanding the&amp;nbsp;system.&lt;/p&gt;

&lt;p&gt;Otherwise, AI can simply accelerate the production of poorly understood software.&lt;/p&gt;

&lt;p&gt;The most capable AI-assisted developers will not necessarily be the people who write the longest&amp;nbsp;prompts.&lt;/p&gt;

&lt;p&gt;They will be people who can translate ambiguous business problems into clear technical requirements, use AI efficiently, and evaluate the resulting work with engineering discipline.&lt;/p&gt;

&lt;p&gt;They will know when to accept a suggestion, when to challenge it, and when to reject it entirely.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. What Should Developers Actually Learn in the AI&amp;nbsp;Era?
&lt;/h3&gt;

&lt;p&gt;If I were beginning my software engineering journey today, I wouldn’t ignore&amp;nbsp;AI.&lt;/p&gt;

&lt;p&gt;And I wouldn’t abandon traditional programming education.&lt;/p&gt;

&lt;p&gt;I would combine&amp;nbsp;them.&lt;/p&gt;

&lt;p&gt;I’d organize my learning around four complementary capabilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  First: Understand How Software&amp;nbsp;Works
&lt;/h3&gt;

&lt;p&gt;Learn at least one programming language deeply enough to understand its execution model, common abstractions, and failure&amp;nbsp;modes.&lt;/p&gt;

&lt;p&gt;Develop a solid foundation in data structures, algorithms, databases, networking, operating systems, and software&amp;nbsp;design.&lt;/p&gt;

&lt;p&gt;You don’t need expert-level knowledge of every&amp;nbsp;subject.&lt;/p&gt;

&lt;p&gt;But you need enough understanding to identify when a generated solution conflicts with basic engineering principles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Second: Learn How to Build Reliable&amp;nbsp;Systems
&lt;/h3&gt;

&lt;p&gt;Move beyond simple tutorials.&lt;/p&gt;

&lt;p&gt;Build applications that contain real authentication, database relationships, concurrent operations, background jobs, and error handling.&lt;/p&gt;

&lt;p&gt;Learn automated testing, debugging, logging, monitoring, and deployment.&lt;/p&gt;

&lt;p&gt;Understand why an application that works on your laptop might fail in production.&lt;/p&gt;

&lt;p&gt;Study how systems behave when components are slow, unavailable, or inconsistent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Third: Develop AI&amp;nbsp;Literacy
&lt;/h3&gt;

&lt;p&gt;Learn how modern AI assistants work at a practical level.&lt;/p&gt;

&lt;p&gt;Understand model limitations, hallucinations, context windows, tool calling, prompt injection, and the difference between generated claims and verified&amp;nbsp;results.&lt;/p&gt;

&lt;p&gt;Learn how to provide useful context to AI&amp;nbsp;tools.&lt;/p&gt;

&lt;p&gt;Learn to request alternative approaches and identify assumptions.&lt;/p&gt;

&lt;p&gt;Know when to check official documentation, when to run a test, and when a model’s explanation is insufficient.&lt;/p&gt;

&lt;p&gt;Most importantly, learn to distinguish between a convincing answer and an answer supported by evidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fourth: Develop Engineering Judgment
&lt;/h3&gt;

&lt;p&gt;This is where technical knowledge connects with experience.&lt;/p&gt;

&lt;p&gt;Learn how to evaluate trade-offs.&lt;/p&gt;

&lt;p&gt;When is a monolith preferable to microservices?&lt;/p&gt;

&lt;p&gt;When is caching useful, and when does it introduce unnecessary complexity?&lt;/p&gt;

&lt;p&gt;Should a financial operation be retried automatically?&lt;/p&gt;

&lt;p&gt;Which actions require human approval?&lt;/p&gt;

&lt;p&gt;When is a simpler solution better than a more sophisticated one?&lt;/p&gt;

&lt;p&gt;These questions don’t always have a universally correct&amp;nbsp;answer.&lt;/p&gt;

&lt;p&gt;They require understanding context, constraints, risks, and consequences.&lt;/p&gt;

&lt;p&gt;That is what engineering judgment is&amp;nbsp;about.&lt;/p&gt;

&lt;h3&gt;
  
  
  9. How to Use AI Without Becoming Dependent on&amp;nbsp;It
&lt;/h3&gt;

&lt;p&gt;The goal isn’t to stop using&amp;nbsp;AI.&lt;/p&gt;

&lt;p&gt;It’s to change how you use&amp;nbsp;it.&lt;/p&gt;

&lt;p&gt;Here’s a practical approach I recommend.&lt;/p&gt;

&lt;h3&gt;
  
  
  Before Asking&amp;nbsp;AI
&lt;/h3&gt;

&lt;p&gt;Try to understand the problem yourself.&lt;/p&gt;

&lt;p&gt;Write down the expected behavior.&lt;/p&gt;

&lt;p&gt;Identify the inputs, outputs, and constraints.&lt;/p&gt;

&lt;p&gt;Consider what could go&amp;nbsp;wrong.&lt;/p&gt;

&lt;p&gt;Even five minutes of independent thinking can help you ask better questions and evaluate the response more effectively.&lt;/p&gt;

&lt;h3&gt;
  
  
  While Working with&amp;nbsp;AI
&lt;/h3&gt;

&lt;p&gt;Don’t always request complete implementations.&lt;/p&gt;

&lt;p&gt;Sometimes, ask for explanations, trade-offs, or potential failure scenarios.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Build this feature for&amp;nbsp;me.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Try:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Explain the architecture options for this feature, their trade-offs, and the failure scenarios I should consider. Ask me questions about missing requirements before proposing an implementation.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When learning a new concept,&amp;nbsp;try:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Help me understand this problem without immediately giving me the full solution. Explain the underlying principle, give me a smaller example, and challenge my understanding.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These approaches make AI a learning partner rather than merely a code generator.&lt;/p&gt;

&lt;h3&gt;
  
  
  After Receiving Generated Code
&lt;/h3&gt;

&lt;p&gt;Read the&amp;nbsp;code.&lt;/p&gt;

&lt;p&gt;Understand what each important part&amp;nbsp;does.&lt;/p&gt;

&lt;p&gt;Check whether the APIs and dependencies actually exist in the versions you’re&amp;nbsp;using.&lt;/p&gt;

&lt;p&gt;Inspect security-sensitive operations.&lt;/p&gt;

&lt;p&gt;Run automated tests.&lt;/p&gt;

&lt;p&gt;Test edge&amp;nbsp;cases.&lt;/p&gt;

&lt;p&gt;Look for race conditions, unexpected inputs, and incorrect assumptions.&lt;/p&gt;

&lt;p&gt;And ask yourself one final question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Could I explain why this solution is correct to another engineer?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you cannot, you’ve identified an area where you need more understanding before relying on the implementation.&lt;/p&gt;

&lt;p&gt;That doesn’t mean you must personally write every&amp;nbsp;line.&lt;/p&gt;

&lt;p&gt;It means you should understand the system well enough to evaluate and maintain what you&amp;nbsp;accept.&lt;/p&gt;

&lt;h3&gt;
  
  
  10. The Skills That Become More Important as AI&amp;nbsp;Improves
&lt;/h3&gt;

&lt;p&gt;There is a fascinating consequence of AI becoming more&amp;nbsp;capable.&lt;/p&gt;

&lt;p&gt;As generating code becomes easier, developers may produce larger amounts of software with less manual&amp;nbsp;effort.&lt;/p&gt;

&lt;p&gt;But more code creates more opportunities for mistakes, unexpected interactions, security vulnerabilities, and maintenance problems.&lt;/p&gt;

&lt;p&gt;Imagine a coding agent generating an entire authentication module.&lt;/p&gt;

&lt;p&gt;Another agent creates the billing&amp;nbsp;system.&lt;/p&gt;

&lt;p&gt;A third implements customer management.&lt;/p&gt;

&lt;p&gt;Each component might work correctly in isolation.&lt;/p&gt;

&lt;p&gt;But what happens when they interact?&lt;/p&gt;

&lt;p&gt;Does billing use the same tenant authorization rules as customer management?&lt;/p&gt;

&lt;p&gt;Can an expired subscription still access paid features?&lt;/p&gt;

&lt;p&gt;What happens when a webhook arrives&amp;nbsp;twice?&lt;/p&gt;

&lt;p&gt;Does deleting a customer affect historical invoices?&lt;/p&gt;

&lt;p&gt;Are all components using consistent transaction boundaries?&lt;/p&gt;

&lt;p&gt;These are system-level questions.&lt;/p&gt;

&lt;p&gt;Solving them requires an understanding of the relationships between components, not simply the correctness of individual functions.&lt;/p&gt;

&lt;p&gt;This is why I believe the value of strong engineering fundamentals may increase as AI capabilities improve.&lt;/p&gt;

&lt;p&gt;The more work AI performs, the more important it becomes to establish clear requirements, independent verification, and reliable boundaries.&lt;/p&gt;

&lt;p&gt;An engineer’s job is not merely to inspect&amp;nbsp;syntax.&lt;/p&gt;

&lt;p&gt;It is to understand the consequences of the system’s behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  11. Don’t Become a Developer Who Only Knows How to&amp;nbsp;Prompt
&lt;/h3&gt;

&lt;p&gt;There is nothing wrong with using natural language to build software.&lt;/p&gt;

&lt;p&gt;Prompting is becoming a valuable interface between human intentions and computing systems.&lt;/p&gt;

&lt;p&gt;But prompting alone is not a replacement for understanding.&lt;/p&gt;

&lt;p&gt;Someone who can generate an application but cannot explain its architecture is dependent on the&amp;nbsp;tool.&lt;/p&gt;

&lt;p&gt;Someone who can create a database but cannot reason about data integrity is vulnerable to subtle failures.&lt;/p&gt;

&lt;p&gt;Someone who can deploy a service but cannot investigate production incidents will struggle when automated solutions stop&amp;nbsp;working.&lt;/p&gt;

&lt;p&gt;This doesn’t mean everyone building software must become an expert computer scientist.&lt;/p&gt;

&lt;p&gt;AI is making software creation accessible to entrepreneurs, designers, analysts, and people from entirely different professions. That’s a positive development.&lt;/p&gt;

&lt;p&gt;But professional software engineers who are responsible for reliability, security, and long-term maintenance need deeper technical understanding.&lt;/p&gt;

&lt;p&gt;The distinction matters.&lt;/p&gt;

&lt;p&gt;Building a prototype to validate an idea is not the same as maintaining a system that processes customer payments or sensitive business information.&lt;/p&gt;

&lt;p&gt;As the consequences increase, so does the need for verification and expertise.&lt;/p&gt;

&lt;h3&gt;
  
  
  12. The Future Belongs to Developers Who Keep&amp;nbsp;Learning
&lt;/h3&gt;

&lt;p&gt;The software industry has always&amp;nbsp;evolved.&lt;/p&gt;

&lt;p&gt;Programming languages change.&lt;/p&gt;

&lt;p&gt;Frameworks rise and&amp;nbsp;fall.&lt;/p&gt;

&lt;p&gt;Architectural patterns&amp;nbsp;evolve.&lt;/p&gt;

&lt;p&gt;And new tools repeatedly change how engineers work.&lt;/p&gt;

&lt;p&gt;AI is another major transformation, though its speed and breadth make it particularly significant.&lt;/p&gt;

&lt;p&gt;The developers who benefit most from this transformation will be those who remain curious, adaptable, and disciplined.&lt;/p&gt;

&lt;p&gt;They won’t reject new tools simply because those tools challenge established workflows.&lt;/p&gt;

&lt;p&gt;But they also won’t accept generated solutions without understanding their implications.&lt;/p&gt;

&lt;p&gt;They will continue studying fundamentals while learning how to use increasingly capable AI&amp;nbsp;systems.&lt;/p&gt;

&lt;p&gt;They will practice writing code when doing so develops understanding.&lt;/p&gt;

&lt;p&gt;They will use automation when it removes unnecessary work.&lt;/p&gt;

&lt;p&gt;They will test their assumptions instead of confusing confidence with correctness.&lt;/p&gt;

&lt;p&gt;And they will recognize that learning is not something you complete before becoming a developer.&lt;/p&gt;

&lt;p&gt;It’s a continuous part of engineering.&lt;/p&gt;

&lt;p&gt;The question is no longer whether AI can write&amp;nbsp;code.&lt;/p&gt;

&lt;p&gt;It can.&lt;/p&gt;

&lt;p&gt;The more important question is whether we are developing the knowledge and judgment needed to use that capability responsibly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts: Don’t Outsource Your Understanding
&lt;/h3&gt;

&lt;p&gt;Artificial intelligence is one of the most powerful tools software developers have ever&amp;nbsp;had.&lt;/p&gt;

&lt;p&gt;It can accelerate learning, reduce repetitive work, help explore unfamiliar technologies, and make complex development tasks more accessible.&lt;/p&gt;

&lt;p&gt;We should take advantage of those capabilities.&lt;/p&gt;

&lt;p&gt;But we should also recognize their&amp;nbsp;limits.&lt;/p&gt;

&lt;p&gt;AI can generate code that looks correct but contains serious&amp;nbsp;flaws.&lt;/p&gt;

&lt;p&gt;It can produce explanations that sound authoritative but are factually wrong.&lt;/p&gt;

&lt;p&gt;It can complete a task without helping the person using it understand the underlying concepts.&lt;/p&gt;

&lt;p&gt;And it can create the illusion of technical competence when someone becomes skilled at producing software without learning how that software&amp;nbsp;works.&lt;/p&gt;

&lt;p&gt;That’s why fundamental knowledge still&amp;nbsp;matters.&lt;/p&gt;

&lt;p&gt;Not because developers must compete with AI at typing&amp;nbsp;code.&lt;/p&gt;

&lt;p&gt;Not because every implementation must be written manually.&lt;/p&gt;

&lt;p&gt;But because &lt;strong&gt;understanding is what allows us to distinguish between a working demonstration and a trustworthy system&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Learn how programming works.&lt;/p&gt;

&lt;p&gt;Learn how systems&amp;nbsp;fail.&lt;/p&gt;

&lt;p&gt;Learn how to debug, test, and&amp;nbsp;reason.&lt;/p&gt;

&lt;p&gt;Learn how to question assumptions.&lt;/p&gt;

&lt;p&gt;Learn how to evaluate evidence.&lt;/p&gt;

&lt;p&gt;And learn how to use AI as a tool that expands your capabilities rather than replacing your judgment.&lt;/p&gt;

&lt;p&gt;Because the defining skill of a software engineer in the AI era may not be the ability to produce&amp;nbsp;code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It may be the ability to understand what the code does, recognize when it’s wrong, and take responsibility for making it&amp;nbsp;right.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI can write the&amp;nbsp;code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But understanding why it works — and recognizing when it doesn’t — is what makes you an engineer.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  References and Further&amp;nbsp;Reading
&lt;/h3&gt;

&lt;p&gt;The following research and reports informed this&amp;nbsp;article:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Stack Overflow Developer Survey 2026 — AI Trust and Developer Workflows&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Published October 6, 2026. The survey explores how developers use AI, when they trust its output, and the importance of verification and source attribution.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://survey.stackoverflow.co/2026/" rel="noopener noreferrer"&gt;https://survey.stackoverflow.co/2026/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Anthropic — How AI Assistance Impacts the Formation of Coding Skills&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Published January 29, 2026. An experimental study examining the relationship between AI-assisted programming, task completion, and skill development.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.anthropic.com/research/AI-assistance-coding-skills" rel="noopener noreferrer"&gt;https://www.anthropic.com/research/AI-assistance-coding-skills&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. METR — Measuring the Impact of Early-2025 AI on Experienced Open-Source Developer Productivity&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A randomized study examining the effects of AI coding tools on experienced developers working in established repositories.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://arxiv.org/abs/2507.09089?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2507.09089&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. NIST — Artificial Intelligence Risk Management Framework: Generative AI Profile&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Official guidance covering risks associated with generative AI, including confabulation, reliability, and evaluation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://doi.org/10.6028/NIST.AI.600-1" rel="noopener noreferrer"&gt;https://doi.org/10.6028/NIST.AI.600-1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. OWASP — LLM Prompt Injection Prevention and Security Guidance&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Security guidance for applications integrating language models, tools, and automated agents.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://genai.owasp.org/llmrisk/llm01-prompt-injection/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;https://genai.owasp.org/llmrisk/llm01-prompt-injection/&lt;/a&gt;&lt;/p&gt;




</description>
      <category>webdev</category>
      <category>ai</category>
      <category>agents</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
