Kurs
Tekrar hoş geldiniz! Neredeyse bitti: Slack ötüyor, Jira’da işler var, testler yeşil ve CI, özensiz her PR’ı engelliyor. Dördüncü bölüm, fp-ts oyun alanını teoride kamuya açabileceğimiz bir şeye dönüştüreceğimiz son itiş.
Devin serisindeki tüm eğitimlere buradan erişebilirsiniz:
- Kurulum ve İlk Pull Request (Bölüm 1)
- Devin ile Dikey Dilim Gönderimi (Bölüm 2)
- Entegrasyonlar, Test ve CI/CD (Bölüm 3)
- Güvenlik, Dağıtım, Bakım (Bölüm 4)
Dördüncü eğitim için planımız şöyle:
- Kimlik doğrulama: Artık anonim UUID yok; NextAuth kimlik bilgilerini, JWT çerezlerini ve GqlAuthGuard ekleyip ilerlemeyi gerçek kullanıcılara bağlayacağız.
- Prod’u izleme: Web uygulamasına bir satır Sentry, Nest API’ye bir satır ve her istisna panele düşecek.
- Tek tuşla dağıtım: Ön uç Vercel’de canlı olacak ve her PR’da önizleme URL’leri çıkacak. (API şimdilik yerelde kalacak, prod’u Docker ile taklit edeceğiz.)
Ayrıca Devin ile eşli programlamaya da dönüp bakacağız: nerede parlıyor, nerede ise depoyu dünyaya açmadan önce bir insanın uçları bağlaması gerekiyor, göreceğiz. Son düzlüğe hazır mısınız?
Anonim UUID’den Gerçek Kullanıcılara
Devin’den ne istedim
Kısacası, Devin’den anonim UUID akışını sökmesini ve bana gerçek bir kimlik doğrulama yığını vermesini istedim:
apps/webiçinde NextAuth v6 kimlik bilgileri sağlayıcısı- Argon2 hashing ve JWT çerezleri ile NestJS AuthModule
- Bir
Usertablosu ekleyen veProgress.sessionId→userId(null olamaz) olarak değiştiren Prisma migrasyonu - Mevcut UUID ilerleme satırlarını bir yer tutucu kullanıcıya kopyalayın ki öğrenenler rozetlerini korusun
- Postgres’i SQLite ile değiştirmeyin
Gelen yanıt (çoğunlukla iyi)
Sonuçların özeti şöyle:
|
Katman |
Devin’in Çıktısı |
|
Veritabanı |
|
|
Arka uç |
|
|
Ön uç |
|
|
Güvenlik |
Argon2 (12 tur), |
|
Testler |
|
Bir başka SQLite migrasyonu
Tahmin edin Devin’in küçük düşünme kutusunda yine ne belirdi.
Yerel geliştirme için PostgreSQL’den SQLite’a başarıyla geçirildi 🥳
Kendisine yapmamasını söylediğim şeyin ta kendisi. Prisma şeması SQLite için yeniden yazılmış, bağlantı dizeleri ve tipler (TIMESTAMP’tan DATETIME’a) değiştirilmişti. Oturum ortasında yakaladım:
- Oturumu durdurdum.
git checkout main apps/api/prisma/schema.prisma(Postgres şemasını geri yükleyin).- Yeni
dev.dbdosyasını sildim. npm run prisma:migrate --workspace=apps/apiile Postgres migrasyonlarını yeniden uyguladım.- Devin’i sürdüm; geri almayı algıladı ve şikayet etmeden devam etti.
Zarar: 0,8 ACU ve yaklaşık on dakika.
Ekip arkadaşları için kırıcı değişiklik kontrol listesi
Devin’in PR’lara koyduğu talimatları gerçekten takdir ediyorum. Burada bize şunları söyledi:
# 1 Install new deps
npm install --workspaces
# 2 Run the Postgres migration
npm run prisma:migrate --workspace=apps/api
# 3 Restart everything
npm run dev:api & npm run dev:web
Mimari anlık görüntü
Wiki’de, yeni kimlik doğrulama sistemimizin bu faydalı diyagramını buldum:

Gerçek kullanıcılar devrede ve veritabanı kararlılıkla Postgres’teyken, nihayet gerçek öğrenen ilerlemesini izlemeye, Vercel’e önizleme derlemeleri göndermeye ve Sentry ile çalışma zamanı hatalarını yakalamaya hazırız.
Ön Uç Vercel’de, Her PR’da Önizleme Bağlantıları
Güvenli oturum açmalar hazırken, sıradaki bariz dönüm noktası dünyaya tıklanabilir bir şey göstermekti. Şimdilik yalnızca Next.js ön ucunu dağıtmaya karar verdik. API ve Postgres, bütçeye uygun bir barındırıcı seçene kadar benim yerel makinemde kalacak.
Manuel hesap bağlantısı (0 ACU)
Devin’i yerel entegrasyonlarla kişisel Vercel hesabıma bağlamak henüz mümkün değil. Bu yüzden Vercel paneli üzerinden manuel yaptım:
- Vercel’e giriş yaptım ve “New Project → Import Git Repository”ye tıkladım.
fp-ts-exercisesreposunu seçtim, derleme komutununpm run build --workspace apps/webolarak bıraktım ve Deploy’a bastım.- Ortaya çıkan
VERCEL_PROJECT_IDveVERCEL_TOKENdeğerlerini GitHub Secrets’a kopyaladım.
CI iş akışını Devin’e güncelletin (0,4 ACU)
Yönlendirmemi takip ederek, Devin mevcut iş akışının en altına tek bir iş ve oluşturulan URL’yi Slack’e curl’layan küçük bir kabuk adımı ekledi:
- name: Deploy to Vercel
if: ${{ success() && github.event_name == 'pull_request' }}
run: npx vercel deploy --prod --token ${{ secrets.VERCEL_TOKEN }}
env:
VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
Sonuç
Bir dalı it → CI yeşil → Slack uyarısı:
✅ Preview ready: https://fp-ts-exercises-git-my-branch.vercel.app
Bağlantıyı açmak bize oyun alanımızı, tam kimlik doğrulama akışını ve öğrenen panosunu gösterdi. Vercel tarafında henüz ortam yapılandırması gerekmedi; çünkü ön uç, yereldeki API ile http://localhost:4000 üzerinden konuşuyor.
Devin’in Gizli Anahtarlar Sistemine Yakından Bakış
Sentry entegrasyonundan önce, kullanmalı mıyım anlamak için Devin’in gizli anahtarlar sistemine baktım. Devin, ajanı API anahtarları, DB URL’leri veya OAuth token’larıyla besleyebilmeniz için yerleşik bir “Secrets” kasası sunuyor; böylece onları Git’e işlemeden ve sohbette ifşa etmeden kullanabiliyorsunuz. Bunu, GitHub Actions secrets veya Vercel Environment Variables’ın hafif bir karşılığı gibi düşünün; ancak Devin’in kendi bulut çalışma alanlarına kapsamlı.
|
Özellik |
Nasıl çalışır |
Notlar |
|
Kapsam |
Gizli anahtarlar üç kapsamda bulunur: organizasyon, repo ve oturum. |
Gizli anahtarları organizasyon düzeyinde, tüm oturumlarınızda kullanılabilir kılabilirsiniz. Yalnızca tek bir repo için eklemek isterseniz, repoyu kurarken belirtebilirsiniz.Gizli anahtarların oturuma özel olmasını isterseniz, oturum ayarlarında sağlayabilirsiniz. |
|
Şifreleme |
Sunucu tarafında AES-256 ile saklanır ve aktarım sırasında TLS 1.3+ kullanılır |
Tüm müşteri verileri, AWS tarafından yönetilen özel bir KMS anahtarı (Key Management Service) ile şifrelenir. |
|
ACU maliyeti yok |
Bir gizli anahtar eklemek, düzenlemek veya silmek kontrol düzlemi eylemidir: 0 ACU. Yalnızca gizli anahtarı kullanan görevler hesaplama kredisi tüketir. |
Uzun ömürlü token’ları saklamak için iyi bir yer. |
|
Yönlendirmelerde erişim |
|
Örnek: |
|
Boyut sınırları |
Anahtar başına 4 KB, Core katmanında takım başına 100 anahtar. |
PEM sertifikaları veya özel anahtarlar için yeterli. |
Bir gizli anahtar ekleme
Bir gizli anahtar eklemek için izlemeniz gereken adımlar:
- Team → Secrets bölümünü Devin panelinde açın.
- “Add Secret”’a tıklayın ve bir ad (
SENTRY_DSN_WEB) ve değerini girin. - Devin saklamayı onaylar; anahtar artık
$.SENTRY_DSN_WEBolarak kullanılabilir.

Bir görevde gizli anahtar kullanma
Görev: API Sentry başlatımını güncelle; DSN’i $SECRET.SENTRY_DSN_API olarak ayarla
Devin, main.ts’i yazarken değeri ikame eder. Kabuk sekmesinde gerçek DSN’i görürsünüz, ancak sohbet günlüğü bunu maskeler.
Artılar ve eksiler
Artılar:
- Anahtarların PR’lara veya Timelapse günlüklerine sızma riski yok.
- Organizasyon kapsamlı gizli anahtarlar oturumlar arasında çalışır: bir yükleme, çoklu kullanım.
- Saklama veya getirmede sıfır kredi maliyeti.
Eksiler:
- Anahtarlar yerelde
.env’e kopyalamadıkça mevcut değil. Devin dışında yapılan test çalıştırmaları manuel kurulum gerektirir. - Ortam başına kapsam yok (ör. “yalnızca prod’da”). Tüm oturumlar tüm gizli anahtarlara erişir.
Ne zaman kullanılmalı
Anahtara bizzat Devin’in ihtiyaç duyduğu durumlarda (ör. Vercel’e itme, özel bir kayıt defterine erişme veya derleme sırasında Sentry’yi bağlama) Devin’in kasasını kullanmayı daha kolay buluyorum. Yerel geliştirme kabuğunuzda veya CI koşucularında da çalışan her şey için .env / GitHub Actions gizlilerini kullanmaya devam ederdim.
Devin’in Sentry ile Entegrasyonu
Kullandığım yönlendirme şöyleydi: Her iki uygulamaya da Sentry ekleyin ki her istisna panomda görünsün. .env içindeki ortam değişkenlerini kullanın. Başka davranış değişikliği yok.
Devin’in çalışması (0,6 ACU, tek oturum)
Sonucun özeti şöyle:
|
Yığın |
Dokunulan Dosyalar |
Önemli Kod |
|
Next.js (web) |
|
|
|
NestJS (API) |
|
|
|
Env iskeleti |
|
|
|
Testler |
|
Manuel adımlarım
Şu adımları izledim:
- Sentry projemden DSN’leri
.envdosyasına kopyaladım. - Her iki geliştirme sunucusunu da yeniden başlattım.
http://localhost:4000/graphqladresine bilerek hatalı bir sorgu attım ve çalıştığını kontrol ettim. Saniyeler içinde Sentry’de bir sorun belirdi.
Devin’in gizli anahtarlar özelliğini neden atladım
Devin’in gizli anahtarlar özelliğini atlamamın nedenleri:
- Daha basit zihinsel model: her yerde aynı
.envdosyası. - Vercel’de önizleme derlemelerini çalıştırmak daha kolay (o ortam değişkenleri zaten orada ayarlı).
- Gizli depo işlemleri için ACU tüketimi yok.
Değerlendirme: Devin Nerede Parlıyor, Nerede Tökezliyor
Dört bölüm önce bu repo, tozlu bir fp-ts egzersiz yığınıydı—şimdi ise şunlara sahip:
- Modernize edilmiş kod tabanı: En güncel bağımlılıklar, katı TS yapılandırması, lint & Prettier kuralları (Bölüm 1).
- Tarayıcı tabanlı oyun alanı: Canlı Vitest geri bildirimiyle Next.js 14 + Sandpack editörü (Bölüm 2).
- NestJS + Postgres arka uç: GraphQL API, Prisma migrasyonları, anonim → JWT ilerleme takibi (Bölüm 2 & 4).
- Yeşil ışıklı hat: Lint, tür kontrolü, Jest & Playwright çalıştıran ve hatalı her PR’ı engelleyen CI iş akışı (Bölüm 3).
- Ekip entegrasyonları: Slack durum bildirimleri, Jira etiket analizi ve her dalda önizleme URL’leri (Bölüm 3).
- Üretim gözlemlenebilirliği: Web ve API’ye bağlanan Sentry, her istisnayı yakalıyor (Bölüm 4).
- Önizleme dağıtımları: Vercel, her pull request için paylaşılabilir bir URL döndürüyor (Bölüm 4).
≈ 70 ACU harcadık (Core planında yaklaşık $157) ve yaklaşık iki iş günü kadar birebir inceleme yaptık.
Devin’in şaşırtıcı derecede iyi yaptığı şeyler
Devin’in çok iyi olduğunu düşündüğüm alanlar:
|
Alan |
Neden etkilendim |
|
Şablon altyapı |
AuthModule iskeletleri, Dockerfile’lar, YAML iş akışları: dakikalar içinde, hatasız üretildi. |
|
Çerçeveye uygun kod |
NestJS dekoratörleri, NextAuth yapılandırması, Prisma migrasyonları resmi dokümanlarla uyumluydu. |
|
Test iskeletleri |
Birim ve Playwright paketleri baştan derlenip çalıştı—uç durum iskeletleri eksik değildi. |
Ajanı hâlâ insanın geçtiği yerler
Devin’in hâlâ geliştirilmesi gerektiğini düşündüğüm noktalar:
|
Ağrı noktası |
Örnek |
|
Katmanlar arası özellik cilası |
Sandpack editörü, sahte testlere sabit kodlanmıştı; SandpackTests bileşen adını kavrayamadı. |
|
Yapılandırma kalıcılığı |
Açıkça “Postgres’te kalmalı” dememe rağmen 5 kez tekrar SQLite’a döndü. |
|
Adlandırma / temizlik |
PR başlıkları sapabiliyor, Devin’e silmesini söylemezseniz bayat dosyalar kalabiliyor. |
|
Zevk & UX |
Gösterge paneli idare eder görünüyordu, ama boşluklar, metin ve renkler hâlâ el ayarı istedi. |
Görüşüm
Devin’in kendi dokümanları hiçbir zaman bir ürün oluşturucusu vaat etmedi. Çok daha dar bir tatlı noktayı tarif ediyorlar ve geriye dönüp bakınca, o sınır içinde kalmalıymışım. Resmî “Devin’in güçlü yanları nelerdir?” sayfası dört başlık kullanım listeliyor:

Dokümanlar, UI, API ve veri akışlarını kapsayan özellik geliştirmelerini “deneysel” olarak nitelendiriyor. Bunlar, ajanın “önemli ölçüde insan incelemesi ve yineleme” gerektirebileceği, büyük ve ucu açık görevler olarak tanımlanıyor. Sandpack’in testleri sabit kodladığında veya gösterge paneli iyi görünse de verileri gerçekten hesaplamadığında gördüğümüz tam olarak buydu.
Dolayısıyla, bir kural olarak:
Kıdemli bir geliştiricinin bir betikle otomatikleştirebileceği her şey için Devin’i kullanın; ürün sezgisi gerektiren görevlerde direksiyonu sizde tutun.
Sonuç
Dört bölümlük eğitimimizin sonuna geldik:
- Kurulum ve İlk Pull Request (Bölüm 1)
- Devin ile Dikey Dilim Gönderimi (Bölüm 2)
- Entegrasyonlar, Test ve CI/CD (Bölüm 3)
- Güvenlik, Dağıtım, Bakım (Bölüm 4)
Buradan atabileceğimiz birkaç sonraki adım:
- API’yi barındırın ki önizleme derlemeleri (ve gelecekteki kullanıcılar) gerçek bir arka uca vursun.
- Çekirdek işlevselliğin çalıştığından emin olun ve içinde olduğunu bildiğim 30 hatayı düzeltin
- UI’ı cilalayın
- Daha fazla içerik ve egzersiz ekleyin
- Kullanıma açın!
Aynı yolu izlerseniz, unutmayın: ajan betonu dökebilir, ama evi tasarlamak hâlâ size kalmış. İyi kodlamalar!

İlk prototipten ürün-pazar uyumuna ve ötesine kadar erken aşama girişimleri büyütme konusunda uzmanlaşmış, ürün odaklı bir teknik liderim. İnsanların teknolojiyi nasıl kullandığına dair bitmeyen bir merakım var ve kurucularla ile disiplinler arası ekiplerle yakın çalışarak cesur fikirleri hayata geçirmeyi seviyorum. Ürün inşa etmediğim zamanlarda ya dünyanın yeni köşelerinde ilham peşinde koşuyor ya da yoga stüdyosunda stres atıyorum.
