I've spent hundreds of hours using ChatGPT for coding, and I've learned that the quality of your prompts directly determines the quality of the code you get back. A vague prompt gets you vague, often incorrect code. A specific, well-structured prompt gets you production-ready solutions.
In this guide, I'll show you exactly how to write prompts that get better code, fewer errors, and more maintainable solutions. Every technique includes real before/after examples.
The 5 Principles of Great Coding Prompts
Before we dive into specific techniques, here are the 5 principles that make or break your prompts:
- Be specific: Vague prompts get vague answers
- Provide context: Tell the AI what you're building and why
- Specify constraints: Language, framework, performance requirements
- Show examples: Input/output examples when applicable
- Iterate: Don't accept the first responseβask for improvements
Technique 1: Role Assignment
Tell ChatGPT who it should be. This sets the context and expertise level.
β Bad Prompt
Write a function to validate email addresses
β Good Prompt
You are a senior backend developer with 10 years of
experience. Write a function to validate email addresses
that follows RFC 5322 standards, includes proper error
handling, and is optimized for performance.
Why it works: The AI now knows to provide production-quality code with proper standards, not just a basic regex check.
Role Templates
π Copy-Paste Templates
# For frontend code
You are a senior frontend developer specializing in React
and TypeScript. Write clean, maintainable code following
best practices.
# For backend code
You are a senior backend developer with expertise in
Node.js and database design. Focus on security,
performance, and scalability.
# For debugging
You are an expert debugger. Analyze this error and
provide the root cause and solution.
# For code review
You are a staff engineer conducting a code review.
Identify bugs, performance issues, and suggest
improvements.
Technique 2: Context and Constraints
Provide the full context of what you're building and any constraints.
β Bad Prompt
Create a user authentication system
β Good Prompt
I'm building a SaaS application using Next.js 14,
TypeScript, and Prisma with PostgreSQL.
Create a user authentication system with:
- Email/password login
- JWT tokens with refresh token rotation
- Password hashing with bcrypt
- Rate limiting on login attempts
- Session management
Constraints:
- Must work with Next.js App Router
- Use server actions where appropriate
- Include proper TypeScript types
- Follow OWASP security guidelines
- Handle all error cases gracefully
The system will serve 10,000+ users, so performance
matters.
Why it works: The AI now knows your tech stack, requirements, and constraints. It won't suggest Express.js when you're using Next.js, and it'll include production considerations.
Technique 3: Few-Shot Examples
Show the AI examples of what you want. This is especially powerful for data transformation and formatting tasks.
β Bad Prompt
Convert these dates to ISO format
β Good Prompt
Convert dates to ISO 8601 format (YYYY-MM-DD).
Examples:
Input: "January 15, 2024"
Output: "2024-01-15"
Input: "15/03/2024"
Output: "2024-03-15"
Input: "Mar 5th, 2024"
Output: "2024-03-05"
Now convert these:
- "December 25, 2023"
- "01/01/2024"
- "Feb 14th, 2024"
Why it works: The AI sees exactly what format you want and can handle edge cases correctly.
Technique 4: Step-by-Step Instructions
Break complex tasks into steps. This prevents the AI from skipping important parts.
β Bad Prompt
Build a REST API for a todo app
β Good Prompt
Build a REST API for a todo app using Express and
TypeScript. Follow these steps:
1. Set up the project structure:
- src/routes/ for route handlers
- src/controllers/ for business logic
- src/models/ for data models
- src/middleware/ for middleware
2. Create the Todo model with these fields:
- id: string (UUID)
- title: string (required, max 200 chars)
- description: string (optional, max 1000 chars)
- completed: boolean (default false)
- createdAt: Date
- updatedAt: Date
3. Implement these endpoints:
- GET /todos - List all todos (with pagination)
- GET /todos/:id - Get single todo
- POST /todos - Create todo (with validation)
- PUT /todos/:id - Update todo
- DELETE /todos/:id - Delete todo
4. Add middleware for:
- Request validation using Zod
- Error handling
- Logging
5. Include:
- TypeScript types for all models and responses
- Input validation on all endpoints
- Proper error responses with status codes
- Example usage with curl commands
Start with step 1 and show me the code.
Why it works: The AI follows a structured approach and doesn't skip important parts like validation or error handling.
Technique 5: Iterative Refinement
Don't accept the first response. Ask for improvements, edge cases, and optimizations.
π Refinement Prompts
# After getting initial code
"Review this code for:
1. Security vulnerabilities
2. Performance issues
3. Edge cases not handled
4. Code that could be more maintainable
Then provide an improved version."
# For better error handling
"Add comprehensive error handling for:
- Network failures
- Invalid input
- Database errors
- Rate limiting
Include proper error messages and status codes."
# For optimization
"Optimize this code for:
- Memory usage
- Execution speed
- Scalability
Explain each optimization."
# For testing
"Write unit tests for this code using Jest.
Include tests for:
- Happy path
- Edge cases
- Error cases
- Boundary conditions"
Technique 6: System Prompts for Consistency
Use system prompts (in ChatGPT Plus) to set persistent instructions for all interactions.
π System Prompt Template
You are an expert software engineer assistant. Follow
these rules:
1. Always use TypeScript with strict mode
2. Include JSDoc comments for all functions
3. Handle all error cases explicitly
4. Use modern ES2022+ features
5. Follow SOLID principles
6. Write clean, readable code with meaningful names
7. Include input validation
8. Add unit test examples
9. Explain trade-offs and alternatives
10. If unsure, say so and suggest research
Tech stack preferences:
- Frontend: React 18, Next.js 14, Tailwind CSS
- Backend: Node.js, Express, PostgreSQL
- Testing: Jest, React Testing Library
- Tools: Docker, GitHub Actions
Always provide production-ready code, not toy examples.
Real-World Prompt Examples
Example 1: Debugging
β Bad Prompt
Why isn't my code working?
β Good Prompt
I'm getting this error in my React component:
Error: Maximum update depth exceeded. This can happen
when a component repeatedly calls setState inside
useEffect.
Here's my code:
```jsx
function UserProfile({ userId }) {
const [user, setUser] = useState(null);
useEffect(() => {
fetchUser(userId).then(data => setUser(data));
});
return {user?.name};
}
```
What's causing this error and how do I fix it? Explain
the root cause.
Example 2: Code Review
β Bad Prompt
Is this code good?
β Good Prompt
Review this authentication middleware for a Node.js
API:
```javascript
function auth(req, res, next) {
const token = req.headers.authorization;
if (token) {
jwt.verify(token, 'secret', (err, decoded) => {
if (!err) {
req.user = decoded;
next();
}
});
}
res.status(401).send('Unauthorized');
}
```
Identify:
1. Security vulnerabilities
2. Logic errors
3. Missing error handling
4. Performance issues
5. Best practice violations
Then provide a corrected version with explanations.
Example 3: Architecture Design
β Bad Prompt
How should I structure my app?
β Good Prompt
I'm building an e-commerce platform that needs to
handle:
- 100,000 products
- 50,000 concurrent users
- Real-time inventory updates
- Payment processing
- Order management
- User reviews and ratings
Tech stack: Next.js, Node.js, PostgreSQL, Redis
Design the system architecture including:
1. Database schema (main tables and relationships)
2. API structure (REST endpoints)
3. Caching strategy
4. Background job processing
5. Scalability considerations
6. Security measures
Provide a high-level diagram and explain each component.
Advanced Techniques
Chain of Thought Prompting
Ask the AI to think step-by-step before giving the final answer.
Solve this algorithm problem. Think through it step by step:
1. First, understand the problem and constraints
2. Consider different approaches and their time complexity
3. Choose the best approach and explain why
4. Write the solution with comments
5. Analyze the time and space complexity
6. Provide test cases
Problem: Find the longest palindromic substring in a
given string.
Self-Consistency
Ask for multiple solutions and let the AI evaluate them.
Provide 3 different approaches to implement a rate limiter
for an API:
1. Simple in-memory counter
2. Redis-based sliding window
3. Token bucket algorithm
For each approach, explain:
- How it works
- Pros and cons
- When to use it
- Code implementation
Then recommend which one to use for a production API
serving 1M requests/day.
Constraint-Based Prompting
Set specific constraints to get focused solutions.
Write a function to sort an array of objects by multiple
properties.
Constraints:
- Must be stable sort (preserve order of equal elements)
- Must handle nested properties (e.g., 'user.name')
- Must support ascending and descending order
- Must be TypeScript with proper types
- Must be efficient for arrays with 100,000+ elements
- No external libraries allowed
Example usage:
sortBy(users, [
{ field: 'age', order: 'desc' },
{ field: 'name', order: 'asc' }
]);
Common Mistakes to Avoid
- Being too vague: "Make it better" doesn't tell the AI what to improve
- Asking for too much at once: Break complex tasks into steps
- Not providing context: The AI doesn't know your project unless you tell it
- Accepting the first response: Always ask for improvements and edge cases
- Not specifying the tech stack: You'll get generic solutions that don't fit your project
- Forgetting about errors: Always ask for error handling
- Not testing the code: AI can make mistakesβalways test and review
Prompt Templates Library
π Copy-Paste Templates for Common Tasks
For Writing Functions:
Write a [LANGUAGE] function that [WHAT IT DOES].
Requirements:
- Input: [describe inputs with types]
- Output: [describe output with type]
- Handle these edge cases: [list edge cases]
- Include error handling for: [list error cases]
- Add JSDoc/comments explaining the logic
- Include 3 example usages with expected outputs
Constraints:
- [any performance requirements]
- [any style requirements]
- [any library restrictions]
For Debugging:
I'm getting this error:
```
[paste error message]
```
Here's my code:
```
[paste relevant code]
```
Context: [explain what you're trying to do]
Please:
1. Explain what's causing this error
2. Show me how to fix it
3. Explain how to prevent similar errors in the future
For Code Review:
Review this code as a senior engineer:
```
[paste code]
```
Check for:
1. Bugs and logic errors
2. Security vulnerabilities
3. Performance issues
4. Code style and readability
5. Missing error handling
6. Test coverage gaps
Provide specific suggestions with code examples.
Summary
Great prompts get great code. Remember these key techniques:
- Role assignment: Tell the AI who it should be
- Context and constraints: Provide full context and requirements
- Few-shot examples: Show what you want with examples
- Step-by-step instructions: Break complex tasks into steps
- Iterative refinement: Don't accept the first response
- System prompts: Set persistent instructions for consistency
The time you invest in writing good prompts pays off exponentially in code quality. Start with these techniques and iterate based on what works best for your use cases.
π‘ Pro Tip
Save your best prompts in a document. Over time, you'll build a library of prompts that consistently produce great results for your specific needs.