Menu

Kodlama Promptları: Yapay Zekâdan Çalışan Kod Almak

Kodlama promptları küçük bir tanım (spec) gibi okunduğunda işe yarar: dil ve sürüm, girdiler ve çıktılar, uç durumlar ve kodun geçmesi gereken testler. Her seferinde küçük bir adım iste.

Bu sayfadaki her istemi düzenleyebilir, sonra ChatGPT, Claude ya da başka bir yapay zekâ uygulamasında açabilirsin.

Bir kodlama promptu bir tanımdır (spec). Model projeni görmedi, dilin hangi sürümünü kullandığını bilmiyor ve girdi boş olduğunda ne olması gerektiğini soramıyor. Promptun dışarıda bıraktığı her şeyi eğitim verisindeki en yaygın seçimle doldurur ve en yaygın seçim çoğu zaman seninki değildir. Aşağıdaki promptlar modele tahmin edecek daha az şey bırakıyor.

Koddan önce tanımı yaz

Aşağıdaki blok küçük bir Python fonksiyonu istiyor. Promptun her parçası, modelin aksi hâlde senin yerine cevaplayacağı bir soruyu cevaplıyor. Parçaları tek tek kapat ve yanıtı onlarsız hayal et: kısıtlar olmadan üçüncü taraf bir kütüphane alabilirsin, bağlam olmadan model neyin geçerli girdi sayıldığını tahmin etmek zorunda kalır, biçim olmadan test almayabilirsin.

Bir tanımdan fonksiyon
Fill in
Parts
Küçük ve test edilmiş fonksiyonlar yazan dikkatli bir Python geliştiricisisin.
Bir süre metnini saniye sayısına çeviren bir `parse_duration(text)` fonksiyonu yaz.
Geçerli girdiler "1h30m", "45m", "2h" ve "90s" gibi görünür: saat, dakika ve saniye, her biri isteğe bağlı, her zaman bu sırayla. "1h30m" 5400 döndürür. Boş string dahil başka her şey geçersizdir.
Python 3.11, sadece standart kütüphane. Geçersiz girdi için mesajında girdinin kendisi olan bir ValueError fırlat. "1.5h" gibi ondalıkları kabul etme.
Önce fonksiyonu ver, sonra yukarıdaki her örneği ve üç geçersiz girdiyi kapsayan pytest testlerini. Tek bir cümle dışında açıklama yapma.
Try it
Example replyReplies vary between models and runs.

Fonksiyon isteğe bağlı üç parçayı sırayla eşleştiriyor ve üçünün de boş olduğu bir eşleşmeyi reddediyor.

import re

_PATTERN = re.compile(r"(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?")

def parse_duration(text: str) -> int:
    match = _PATTERN.fullmatch(text)
    if not match or not any(match.groups()):
        raise ValueError(f"invalid duration: {text!r}")
    hours, minutes, seconds = (int(g) if g else 0 for g in match.groups())
    return hours * 3600 + minutes * 60 + seconds
import pytest
from duration import parse_duration

@pytest.mark.parametrize("text, expected", [
    ("1h30m", 5400), ("45m", 2700), ("2h", 7200), ("90s", 90),
])
def test_valid(text, expected):
    assert parse_duration(text) == expected

@pytest.mark.parametrize("text", ["", "1m1h", "1.5h"])
def test_invalid(text):
    with pytest.raises(ValueError):
        parse_duration(text)

Bu prompttaki dört ayrıntı işin çoğunu yapıyor:

  • Cevaplarıyla birlikte örnekler. "1h30m 5400 döndürür", modelin kendi kodunu karşılaştırabileceği bir testtir ve birim konusundaki her şüpheyi ortadan kaldırır.
  • Dil sürümü ve izin verilen kütüphaneler. Bunlar olmadan kurmadığın bir kütüphane ya da yorumlayıcından yeni bir sözdizimi alabilirsin.
  • Neyin geçersiz sayıldığı ve o zaman ne olması gerektiği. Kimse istemediğinde hata yönetimini dışarıda bırakmak bir model için kolaydır.
  • Cevabın içinde testler. "Doğru görünüyor"u çalıştırabileceğin bir şeye çevirirler. Bir test başarısız olursa hatayı geri yapıştırırsın; bu, "çalışmıyor" demekten çok daha iyi bir takip mesajıdır.

any(match.groups()) kontrolü de dikkate değer: desen tek başına boş bir stringle eşleşir, çünkü her parça isteğe bağlıdır. Bu durumun kodda ve testlerde ortaya çıkmasını sağlayan, prompttaki boş string satırıdır.

Sürümü, teknoloji yığınını ve zaten var olanı söyle

Modeller eğitim verisinde en yaygın olan tarza yönelir. JavaScript için bu, ES modules kullanan bir projede CommonJS require anlamına gelebilir; Python için o zamandan beri değişmiş bir kütüphane API'si (Pydantic 1 ile 2 yaygın bir örnektir); hızlı değişen her framework için de iki ana sürüm önceki kalıp. Genellikle tek bir satır bunu çözer: "Node 22, ES modules, TypeScript yok" ya da "React 19, function component'ler, düz CSS modules".

Mevcut bir projeye ekleme yaparken model yeni kodun dokunacağı kısımları görmelidir. Çağırması gereken fonksiyon imzasını, alacağı veri şeklini ve kurallarını gösteren mevcut bir dosyayı yapıştır. "Aşağıdaki dosyadaki db.query(sql, params) yardımcısını kullan" projeye uyan kod getirir; onsuz sıfırdan yazılmış yeni bir veritabanı bağlantısı alabilirsin. Değişiklikle ilgisi olmayan dosyaları dışarıda bırak, çünkü ilgisiz her satır modelin tekrar kullanmaya çalışabileceği bir şeydir.

Her seferinde küçük bir adım iste

Bir uygulamayı yapay zekâya anlatarak geliştirmek demek olan "vibe coding"de en yaygın hata, bütün uygulamayı bir kerede istemektir. Model tek bir yanıtta bir framework, bir veritabanı, bir klasör yapısı ve bir düzine özellik seçmek zorunda kalır ve tek bir yanıt nadiren hepsi için çalışan kod tutar, bu yüzden çoğu zaman geri gelen şey bir taslaktır. İki sekmeyi karşılaştır.

Bana kullanıcı hesapları, veritabanı, hatırlatıcılar ve karanlık modu olan bir yapılacaklar uygulaması yap.
Try it
Example replyReplies vary between models and runs.

İşte React, Express ile Node.js ve MongoDB kullanan full-stack bir yapılacaklar uygulaması.

Proje yapısı

todo-app/
  client/   (React ön yüz)
  server/   (Express API, kimlik doğrulama, hatırlatıcılar)

server/index.js

const express = require("express");
const mongoose = require("mongoose");
const app = express();
app.use(express.json());
// ... auth routes, todo routes and the reminder scheduler go here

Kimlik doğrulama için jsonwebtoken ile JWT, hatırlatıcılar için de node-cron gibi bir zamanlayıcı ekleyebilirsin. Bu parçalardan herhangi birini doldurmamı istersen söyle.

İlk yanıt yanlış değil ama bir iskelet: senin yerine üç teknoloji seçti ve asıl işi yorum olarak bıraktı. İkinci yanıt okunacak kadar kısa, dosyayı açar açmaz çalışıyor ve sana 2. adım için çalışan bir temel veriyor ("şimdi listeyi sayfa yenilendiğinde kaybolmasın diye localStorage'a kaydet"). Her adım, bir şey bozulduğunda hangi değişikliğin bozduğunu bilebileceğin kadar küçük.

Bu, elle yapılan prompt zincirlemedir: bir isteğin çıktısı bir sonrakinin başlangıç noktası olur. Her yeni adıma dosyanın güncel hâlini yapıştır, böylece model yazdığını hatırladığı kodu değil, gerçekte elinde olan kodu düzenler.

Büyük bir değişiklikten önce plan iste

Tek bir fonksiyondan büyük her şey için önce planı, sonra kodu iste: "Değiştireceğin dosyaları ve her değişikliğin ne yaptığını listele. Henüz kod yazma." Bir plan hızlı okunur ve hızlı düzeltilir. İstemediğin yeni bir bağımlılık öneriyorsa ya da işin içinde olduğunu bildiğin bir dosyayı atlıyorsa, bunu üç yüz satır kod boyunca keşfetmek yerine tek cümleyle düzeltirsin.

Geri geleni kontrol et

Üretilen kod birkaç tahmin edilebilir şekilde başarısız olur ve her birini yakalayan bir prompt alışkanlığı var:

  • Uydurma API'ler. Model, adı makul göründüğü için var olmayan bir fonksiyonu çağırabilir ya da var olmayan bir paketi import edebilir. Tanımadığın import'ları kurmadan önce araştır; bunun neden olduğunu yapay zekâ halüsinasyonu sayfası açıklıyor.
  • Sessiz uç durumlar. Mutlu yolda çalışan ve boş bir listede çöken kod. Uç durumları prompta listelemek ve test istemek en ucuz çözümdür.
  • Sessiz değişiklikler. Uzun bir dosyada bir düzeltme istediğinde model senin sormadığın şeyleri de yeniden adlandırabilir ya da yeniden düzenleyebilir. "Sadece gerekeni değiştir ve yaptığın her değişikliği listele" ekle.

Kod çalışıyor ama yanlış davranıyorsa bir hata ayıklama promptuna geç: neyin yapıştırılacağını hata ayıklama promptları anlatıyor. Önemli bir şeyi birleştirmeden önce bir kod inceleme promptu ile ikinci bir tur, yazma promptunun sormayı düşünmediği sorunları yakalayabilir.

Sıkça Sorulan Sorular

ChatGPT ya da Claude ile kodlama için en iyi prompt nedir?

Tek bir sihirli prompt yok. İşe yarayan promptlar kısa bir tanım gibi okunur: dil ve sürüm, kodun ne aldığı ve ne döndürdüğü, çıktılarıyla birlikte iki üç örnek girdi, uç durumlar ve kodun kullanmaması gereken her şey. "Bu durumlar için testler de yaz" ile bitirmek, cevaba güvenmek yerine onu kontrol etmenin bir yolunu verir.

Vibe coding promptları nedir?

"Vibe coding", yazılımı çoğunlukla bir yapay zekâya ne istediğini anlatarak ve yazdığı kodu çoğu zaman yakından okumadan kabul ederek geliştirmeyi tarif eder. Bir vibe coding projesini ayakta tutan promptlar küçük olanlardır: istek başına bir özellik, zaten neyin var olduğuna dair net bir açıklama ve devam etmeden önce sonucu çalıştırma ya da test etme isteği. Bu projelerin bozulduğu yer genellikle her şeyi bir kerede isteyen büyük isteklerdir.

Yapay zekâya hangi programlama dili sürümünü kullanacağını söylemeli miyim?

Evet. Diller ve kütüphaneler sürümler arasında değişir ve model aksi hâlde eğitim verisinde en yaygın olan tarzı yazar; bu da senin kurulumundan eski olabilir. Sürümü söylemek ("Python 3.12", "function component'lerle React 19", "Node 22, ES modules"), sende olmayan API'ler üzerine kurulmuş cevapları önler.

Yapay zekânın yazdığı koda güvenebilir miyim?

Ona yeni bir iş arkadaşından gelen kod gibi davran: muhtemelen yakın, bazen doğru görünen şekillerde yanlış. Çalıştır, önem verdiğin uç durumlarla test et ve paraya, güvenliğe ya da kullanıcı verisine dokunan her kısmı oku. Modeller var olmayan fonksiyonlar ya da paketler de uydurabilir, bu yüzden bir şey kurmadan önce tanımadığın import'ları kontrol et.

Projem büyüdükçe yapay zekânın ürettiği kod neden bozuluyor?

Model sadece sohbette olanı görür. Proje büyüdükçe kendisine gösterilmeyen dosyaları görmez olur ve boşlukları adlar, yapı ve önceki kararlar hakkındaki tahminlerle doldurur. İlgili dosyaları yapıştır, projenin izlediği kuralları belirt ve her isteği tek bir değişiklikle sınırlı tut.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA