<?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: GengWang Zhang</title>
    <description>The latest articles on DEV Community by GengWang Zhang (@gengwang_zhang).</description>
    <link>https://dev.to/gengwang_zhang</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3806814%2F186f3dd2-6e08-49b4-af00-fd2cc4a4d498.jpg</url>
      <title>DEV Community: GengWang Zhang</title>
      <link>https://dev.to/gengwang_zhang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gengwang_zhang"/>
    <language>en</language>
    <item>
      <title>Will AI Kill the Programmer?</title>
      <dc:creator>GengWang Zhang</dc:creator>
      <pubDate>Wed, 11 Mar 2026 07:11:47 +0000</pubDate>
      <link>https://dev.to/gengwang_zhang/will-ai-kill-the-programmer-ag5</link>
      <guid>https://dev.to/gengwang_zhang/will-ai-kill-the-programmer-ag5</guid>
      <description>&lt;p&gt;Recently, OpenClaw has become extremely popular in China. From corporate executives to street vendors, almost everyone has heard of “raising lobsters”. My colleagues and I have started discussing a question: In the AI era, how long can programmers survive?&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.amazonaws.com%2Fuploads%2Farticles%2Fuv02i65zpgns54yu0imw.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.amazonaws.com%2Fuploads%2Farticles%2Fuv02i65zpgns54yu0imw.png" alt=" " width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Familiar Echo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This argument sounds familiar. I remember back in 2018, shortly after I graduated, everyone in China was learning Python. This nationwide craze was also closely tied to AI, as TensorFlow and PyTorch mainly used Python as their primary interface. Many people claimed that Python would break down the barriers to programming: its syntax is close to natural language, allowing absolute beginners to write usable code quickly, meaning “everyone can be a programmer”.&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.amazonaws.com%2Fuploads%2Farticles%2Fj6ggz50jiwjaa8h3u2zc.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.amazonaws.com%2Fuploads%2Farticles%2Fj6ggz50jiwjaa8h3u2zc.png" alt=" " width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In reality, Python has never become truly universal in China. After the hype faded, people gradually returned to rationality. Today, Python is indeed the mainstream tool for data analysis, AI, automation, and more—but the market demands senior developers, not entry-level or junior coders.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Senior Developers Will Thrive?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So, to answer the question above: Senior programmers will coexist with AI indefinitely. Here is why:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;AI is a Skilled but Direction-Needing Subordinate&lt;br&gt;
If you don’t understand your own goals, or can’t express them in a structured, clear way, never expect AI to read your mind or think for you. AI needs someone to give it specific, clear objectives and acceptance criteria.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AI is Sometimes a Mistake-Prone Intern&lt;br&gt;
When dealing with legacy code or technical debt, you must stay alert and constantly remind AI: “Don’t touch that code!” Otherwise, you’ll face unexpected, explosive consequences. AI needs people to set strict constraints and task boundaries.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AI Cannot Take Responsibility for Your Work&lt;br&gt;
If you can't understand the code generated by AI, you can't perform a necessary code review or conduct thorough testing. When a bug hits the production environment, don't expect AI to take the blame. AI needs a human with judgment and accountability, which are always scarce resources.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Of course, the old model of simply translating UI designs and product documents into code is gone for good. AI has taken over that repetitive part of our work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Future: What Should Programmers Focus On?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Looking ahead, I believe programmers should shift their focus to higher-value areas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Figure out “What to Build” and “Why”.&lt;br&gt;
In the era of "One Person as a Company," execution power is no longer scarce. What we need is the ability to define problems. When you are solely responsible for a complete end-to-end product, you will increasingly need a global vision and systems thinking. "How to do it" becomes less difficult; "What to do" and "Why" are the most critical parts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make "Code Review" Your Core Skill&lt;br&gt;
In software engineering, whoever controls the code controls everything. In fact, code written by anyone—whether AI or human programmers—must be reviewed. Otherwise, software becomes a black box on the edge of losing control.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Learn to Collaborate Efficiently with AI&lt;br&gt;
We need to turn rough ideas into precise prompts and understand which context matters. Besides clearly stating “what to do”, we must also clearly define “what NOT to do”.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In short, tools will always evolve, but the ability to think creatively, maintain clear judgment, and take engineering responsibility for processes and results----these values will always be irreplaceable.&lt;/p&gt;

&lt;p&gt;Coding will not disappear. It has just been upgraded.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>What Makes an Architecture "Clear" in Modern Android Apps?</title>
      <dc:creator>GengWang Zhang</dc:creator>
      <pubDate>Thu, 05 Mar 2026 02:38:20 +0000</pubDate>
      <link>https://dev.to/gengwang_zhang/what-makes-an-architecture-clear-in-modern-android-apps-34pc</link>
      <guid>https://dev.to/gengwang_zhang/what-makes-an-architecture-clear-in-modern-android-apps-34pc</guid>
      <description>&lt;p&gt;When I first started my journey as a developer, I was constantly told to write "elegant" code. I heard that MVVM would be a staple interview question, so I diligently learned design patterns like Factory and Singleton, and adopted frameworks like Dagger Hilt.&lt;/p&gt;

&lt;p&gt;However, I soon realized a harsh truth: all this knowledge didn't necessarily make my code clearer or my work more efficient. Sometimes, I was just rigidly forcing these patterns and frameworks into places where they didn't belong—using technology for the sake of using it.&lt;/p&gt;

&lt;p&gt;Over time, I discovered that for real-world scenarios, the "best" architecture isn't always the most advanced one. It doesn't require overly complex design patterns or the bleeding-edge framework of the month. On the contrary, the most suitable architecture is the simplest, the clearest, and one that even a beginner can understand.&lt;/p&gt;

&lt;p&gt;So, I want to discuss a fundamental question: In modern Android applications, what does a "&lt;strong&gt;clear&lt;/strong&gt;" architecture actually look like?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It Achieves Business Independence (Single Responsibility)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the beginning, I tended to dump all business logic into Activity or Fragment classes. This inevitably led to God Classes that were massive and unmaintainable.&lt;/p&gt;

&lt;p&gt;Later, I discovered the ViewModel. I started splitting different business logics into separate ViewModels. But as the product grew, I noticed a familiar pattern emerging: some ViewModels began to accumulate excessive business logic again. The problem wasn't solved; it was just shifted from the UI layer to the ViewModel layer.&lt;/p&gt;

&lt;p&gt;Today, I've embraced the concept of Use Cases, and I believe this is the true solution.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;One Use Case = One User Action: A Use Case represents a specific business action, such as "Login," "Place Order," or "Fetch Profile."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stateless Functions: Ideally, a Use Case should act like a pure function. It shouldn't hold state. This ensures the purity of your business logic, making it easy to test and reason about.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By isolating logic into Use Cases, we ensure that each piece of business functionality stands on its own, independent of the UI lifecycle or data source specifics.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It Embraces Dependency Inversion&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The core mechanism of a clear architecture lies in the Domain Layer. By defining abstract interfaces, it isolates business logic from implementation details, effectively implementing the Dependency Inversion Principle.&lt;/p&gt;

&lt;p&gt;Think of it like a power outlet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The outlet (Abstraction) doesn't depend on the specific appliance (Detail) you plug in.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Yet, it can compatible with any device that meets the standard.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In our code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The Domain Layer declares the contract via interfaces (e.g., UserRepository defines getUser() and saveUser()), but it knows nothing about how the data is fetched.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Data Layer (implementing Room, Retrofit, or Firebase) is responsible for fulfilling these contracts. It handles the nitty-gritty of mapping data entities (like UserEntity) to domain models (User).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This separation ensures that your core business rules remain untouched even if you decide to switch your database from Room to SQLDelight, or your network library from Retrofit to OKHTTP.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It Handles Exceptions Timely and Locally&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A common debate in architecture is: Where should we handle errors?&lt;br&gt;
My stance is firm: Data exceptions should be handled within the Repository (Data Layer), not wrapped in generic try-catch blocks in the Use Case layer.&lt;/p&gt;

&lt;p&gt;Here is why:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Context Awareness: The Repository knows the true source of the exception best—is it a network timeout, a database constraint violation, or a JSON parsing error?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Translation: This is the perfect place to translate technical exceptions (e.g., SocketTimeoutException, HTTP 404) into meaningful Business Errors (e.g., NetworkUnavailable, UserNotFound).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leakage Prevention: It prevents infrastructure details (like Retrofit annotations or HTTP status codes) from leaking into the clean Domain Layer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Purity: It keeps the Domain Layer stable, pure, and focused solely on business rules.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Use Case should simply receive a standardized result (like a Result sealed class) and decide what to do next, without worrying about the underlying technical failure modes.&lt;/p&gt;

&lt;p&gt;Conclusion: The KFC Analogy&lt;/p&gt;

&lt;p&gt;To summarize, a clear architecture in a modern Android app functions like an efficient KFC restaurant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;UI Layer (The Dining Area): This is where customers sit. It displays the menu and serves the food. It's concerned with presentation and user interaction, but it doesn't cook.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Domain Layer (The Waiters): They take orders and serve food. They handle specific customer requests independently. The process of taking an order is decoupled from the cooking process. They don't need to know how the fryer works; they just need to know the menu (interfaces).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data Layer (The Kitchen): Busy and enclosed. They provide a unified interface (the service window) to the waiters. How the chicken is fried, stored, or sourced is their secret. The dining area never sees the chaos of the kitchen.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By adhering to these principles—Business Independence, Dependency Inversion, and Localized Exception Handling—we build apps that are not only robust and scalable but also clear enough for anyone on the team to understand and maintain.&lt;/p&gt;

</description>
      <category>android</category>
      <category>architecture</category>
      <category>discuss</category>
      <category>mobile</category>
    </item>
  </channel>
</rss>
