<?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: Alxn</title>
    <description>The latest articles on DEV Community by Alxn (@axl7700).</description>
    <link>https://dev.to/axl7700</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%2F448611%2Fd4e6dac8-a3e2-442c-b4c4-c36a98663545.jpg</url>
      <title>DEV Community: Alxn</title>
      <link>https://dev.to/axl7700</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/axl7700"/>
    <language>en</language>
    <item>
      <title>Your Project Is the Prompt: How to Love Vibe-Coding Without Turning It Into Chaos</title>
      <dc:creator>Alxn</dc:creator>
      <pubDate>Wed, 03 Dec 2025 14:26:43 +0000</pubDate>
      <link>https://dev.to/axl7700/your-project-is-the-prompt-how-to-love-vibe-coding-without-turning-it-into-chaos-5a0k</link>
      <guid>https://dev.to/axl7700/your-project-is-the-prompt-how-to-love-vibe-coding-without-turning-it-into-chaos-5a0k</guid>
      <description>&lt;p&gt;There are still plenty of engineers who barely use AI in their workflow, just as there are teams that continue to work “the old way” — relying on manual processes, intuition, and accumulated experience while avoiding intelligent tooling.&lt;/p&gt;

&lt;p&gt;On the other side of the spectrum, mid-level and senior developers increasingly complain about being flooded with vibe-coded pull requests generated by AI. These PRs often require multiple rounds of rejections before they reach an acceptable state (if ever).&lt;/p&gt;

&lt;p&gt;Developers themselves are split into two opposing camps:&lt;br&gt;
• those who are convinced that AI is about to replace everyone and has already surpassed human capability;&lt;br&gt;
• and those who believe that AI is just hype, harmful noise, or a bubble waiting to burst.&lt;/p&gt;

&lt;p&gt;The truth is far simpler: AI is neither a threat nor a bubble. It has become an irreversible part of software development. There is no going back. Developers will use it more and more — including for vibe coding.&lt;/p&gt;

&lt;p&gt;But the key problem is not the AI.&lt;br&gt;
The problem is people.&lt;/p&gt;

&lt;p&gt;Generated code is not inherently good or bad. The real issue appears when less experienced or less attentive developers trust AI output blindly. After a superficial check, they push this code into the repository — laying the groundwork for bugs, regressions, and long-term degradation.&lt;/p&gt;

&lt;p&gt;To get the maximum efficiency from AI, try looking at your project as a prompt.&lt;br&gt;
What happens when your prompt is poorly detailed, lacks context, and contains no constraints?&lt;br&gt;
The answer is obvious: the model produces low-quality code — random style, inconsistent structure, and logic built on assumptions.&lt;/p&gt;

&lt;p&gt;Below are two simple demonstrations. The same task produces “AI-hallucinated vibe-code” under a bad prompt and decent code under a good one.&lt;/p&gt;

&lt;p&gt;❌ &lt;strong&gt;Bad Prompt&lt;/strong&gt; (Backend Example)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Write a NestJS + TypeORM service method that returns active users with their latest orders and filters by user status.&lt;br&gt;
Tables:&lt;br&gt;
users(id, name, status, is_active)&lt;br&gt;
orders(id, user_id, created_at, total)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Result&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;async getActiveUsersWithLastOrder(status: string) {
  return this.userRepository
    .createQueryBuilder("user")
    .leftJoinAndSelect("user.orders", "order")
    .where(`user.status = '${status}'`)
    .andWhere("user.is_active = 1")
    .orderBy("order.created_at", "DESC")
    .getMany();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What’s wrong?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Direct SQL injection (status inlined into query)&lt;/li&gt;
&lt;li&gt;Uses column names (user.is_active) instead of entity properties (user.isActive)&lt;/li&gt;
&lt;li&gt;Sorting without grouping → returns all orders, not the last one&lt;/li&gt;
&lt;li&gt;Looks “working”, but hides bugs, security issues, and inconsistent logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Good Prompt&lt;/strong&gt; (Backend Example)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Write a NestJS service method that returns active users with their latest orders and filters by status using TypeORM 0.3x.&lt;br&gt;
Entities:&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Entity('users')
export class User {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column()
name: string;
@Column()
status: string;
@Column({ default: true })
isActive: boolean;
@OneToMany(() =&amp;gt; Order, (order) =&amp;gt; order.user)
orders: Order;
}
@Entity('orders')
export class Order {
@PrimaryGeneratedColumn('uuid')
id: string;
@ManyToOne(() =&amp;gt; User, (user) =&amp;gt; user.orders)
@JoinColumn({ name: 'user_id' })
user: User;
@Column()
createdAt: Date;
@Column('numeric')
total: number;
}
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Requirements:&lt;br&gt;
– getActiveUsersWithLastOrder(status: string): Promise&lt;br&gt;
– filter by user.status and user.isActive = true&lt;br&gt;
– return only the latest order&lt;br&gt;
– use QueryBuilder&lt;br&gt;
– use parameterization&lt;br&gt;
– no snake_case fields, use entity properties only&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Result&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;async getActiveUsersWithLastOrder(status: string): Promise&amp;lt;User[]&amp;gt; {
  return this.userRepository
    .createQueryBuilder("user")
    .leftJoinAndSelect("user.orders", "order")
    .where("user.isActive = :active", { active: true })
    .andWhere("user.status = :status", { status })
    .orderBy("order.createdAt", "DESC")
    .distinctOn(["user.id"])
    .getMany();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;❌ &lt;strong&gt;Bad Prompt&lt;/strong&gt; (Frontend Example)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Build an Angular component that displays users with their status and latest order total.&lt;br&gt;
&lt;strong&gt;Result&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;@Component({
  selector: 'app-users',
  template: `
    &amp;lt;div *ngIf="users &amp;amp;&amp;amp; users.length"&amp;gt;
      &amp;lt;div *ngFor="let user of users"&amp;gt;
        &amp;lt;h3&amp;gt;{{ user.name }}&amp;lt;/h3&amp;gt;
        &amp;lt;p&amp;gt;Status: {{ user.status }}&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;Last order total: {{ user.lastOrderTotal }}&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  `,
})
export class UsersComponent {
  @Input() users: any[];
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What’s wrong?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses @Input() instead of modern input() signals&lt;/li&gt;
&lt;li&gt;Uses *ngIf and *ngFor instead of Angular’s @if / &lt;a class="mentioned-user" href="https://dev.to/for"&gt;@for&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;any[] — no type safety&lt;/li&gt;
&lt;li&gt;Not standalone, no OnPus&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Good Prompt&lt;/strong&gt; (Frontend Example)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Angular v21, Strict Mode.&lt;br&gt;
Standalone UsersComponent displaying user info + latest order total.&lt;br&gt;
Data model:&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface UserWithLastOrder {
  id: string;
  name: string;
  status: string;
  lastOrderTotal: number | null;
}
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Requirements:&lt;br&gt;
– Signal input&lt;br&gt;
– OnPush strategy&lt;br&gt;
– Use @if/for&lt;br&gt;
– Clean markup&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Result&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;@Component({
  selector: 'app-users',
  standalone: true,
  imports: [CurrencyPipe],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    @if (users()?.length) {
      &amp;lt;div class="user-list"&amp;gt;
        @for (user of users(); track user.id) {
          &amp;lt;div class="user-card"&amp;gt;
            &amp;lt;h3 class="user-name"&amp;gt;{{ user.name }}&amp;lt;/h3&amp;gt;
            &amp;lt;p class="user-status"&amp;gt;Status: {{ user.status }}&amp;lt;/p&amp;gt;

            @if (user.lastOrderTotal !== null) {
              &amp;lt;p&amp;gt;Last order: {{ user.lastOrderTotal | currency:'USD' }}&amp;lt;/p&amp;gt;
            } @else {
              &amp;lt;p&amp;gt;No orders yet&amp;lt;/p&amp;gt;
            }
          &amp;lt;/div&amp;gt;
        }
      &amp;lt;/div&amp;gt;
    } @else {
      &amp;lt;p&amp;gt;No matching users.&amp;lt;/p&amp;gt;
    }
  `,
})
export class UsersComponent {
  users = input&amp;lt;readonly UserWithLastOrder[]&amp;gt;([]);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎯 &lt;strong&gt;The Principle: AI Does Not Improve Engineering Culture — It Amplifies It&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your team has weak practices, poor structure, and inconsistent style — LLMs generate chaos faster than any developer ever could.&lt;/p&gt;

&lt;p&gt;If your processes are solid, your rules are formalized, and your project is structured — LLMs become a powerful accelerator.&lt;/p&gt;

&lt;p&gt;So the natural question becomes:&lt;/p&gt;

&lt;p&gt;How do you give your project enough structure to act as a good prompt?&lt;/p&gt;

&lt;p&gt;Good news: nothing new needs to be invented.&lt;br&gt;
All the tools already exist.&lt;/p&gt;

&lt;p&gt;✔ &lt;strong&gt;What Every AI-Driven Project Needs in 2025&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A proper README + basic architecture documentation&lt;/strong&gt;&lt;br&gt;
Cheap, simple, incredibly effective context for AI.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Clear directory structure&lt;/strong&gt;&lt;br&gt;
Physical boundaries that LLMs follow.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;3. “Golden” reference files&lt;/strong&gt;&lt;br&gt;
Perfectly written services, components, test suites — examples the AI can safely imitate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. A single engineering guideline&lt;/strong&gt;&lt;br&gt;
Patterns, anti-patterns, module boundaries, logging rules, error handling, architectural principles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Documented “do not do this” rules&lt;/strong&gt;&lt;br&gt;
Raw SQL, inline styles, mixing layers, unsafe APIs, magic values, bad state management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Enforced code style&lt;/strong&gt;&lt;br&gt;
Prettier, ESLint, Stylelint, naming conventions.&lt;br&gt;
If you don’t have a style — the AI will invent one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Strict mode &amp;amp; strict checks&lt;/strong&gt;&lt;br&gt;
Strong type systems, null-safety, deep validation, exception handling rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. CI pipeline that rejects garbage&lt;/strong&gt;&lt;br&gt;
Lint → Test → Type Check → Build.&lt;br&gt;
If a PR fails — it never reaches review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. Tests &amp;amp; high coverage&lt;/strong&gt;&lt;br&gt;
Tests define expected behavior.&lt;br&gt;
LLMs optimize for what passes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. Small pull requests&lt;/strong&gt;&lt;br&gt;
Tiny PRs = predictable quality and fewer AI-generated disasters.&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;AI is already part of development — whether we want it or not&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI accelerates work, removes boilerplate, helps with context switches, and even assists with architecture.&lt;br&gt;
But it also magnifies every weakness in the project.&lt;/p&gt;

&lt;p&gt;When your project is structured, rules are clear, and culture is strong — AI becomes a silent ally.&lt;/p&gt;

&lt;p&gt;When the project is chaos — AI simply produces more chaos.&lt;/p&gt;

&lt;p&gt;🔐 &lt;strong&gt;P.S. A word about security&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The last thing worth mentioning is security.&lt;br&gt;
Tokens, API keys, user data, environment isolation, context leakage — when you give an LLM your entire project, you give it everything.&lt;br&gt;
There is no guarantee that future retraining won’t expose sensitive artifacts or internal patterns.&lt;/p&gt;

&lt;p&gt;But that’s a topic for another dedicated article.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>webdev</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
