Nasıl Çalışırız

“Çalışıyor” bizim için bitiş çizgisi değil

Bir işletme yazılımında asıl mesele, her şey yolundayken ne yaptığı değil; bir şey ters gittiğinde neyi koruduğudur. İnternet koptuğunda, iki kasiyer aynı anda aynı ürünü sattığında, bir kayıt sonradan “düzeltilmek” istendiğinde ne olur? Aşağıdakiler, kod yazmadan önce kararlaştırdığımız ve sonradan pazarlığa açmadığımız kurallardır.

İlkelerimiz

Altı kural, altı gerekçe

Her kuralın yanında neden böyle olduğunu ve işletmeniz için ne anlama geldiğini yazdık. Bunlar pazarlama başlığı değil; kodun uyduğu, testlerin denetlediği kurallar.

🧾

Silme yok, düzeltme var

Kural: Stok ve para hiçbir zaman elle “50 yapıldı” diye set edilmez. Her değişiklik bir hareket kaydı üretir: +20, −5. Hareket tablolarına yalnızca ekleme yapılır; güncelleme ve silme yasaktır.

Neden: Bir sayının üzerine yazıldığı anda “o rakam nereden geldi?” sorusunun cevabı kaybolur. Yanlış bir düzeltmeyi geri almanın da yolu kalmaz.

İşletme için: Sayım tutmadığında farkın nereden çıktığı bulunabilir. Bir iade, satışı silmez — karşı kayıt üretir; geçmiş her zaman geri sarılabilir.

🗄️

Veriniz kendi veritabanınızda

Kural: Ortak bir tabloda satır filtresiyle ayrıştırma değil, şirket başına ayrı veritabanı. Hangi veritabanına bağlanılacağı yalnızca doğrulanmış giriş bilgisinden çözülür; adres satırından, başlıktan veya istek gövdesinden asla.

Neden: Tek bir unutulmuş filtre, ortak tabloda başka bir şirketin verisini gösterir. Ayrı veritabanında böyle bir hatanın karşılığı veri değil, boş sonuçtur.

İşletme için: Yedekleme ve geri yükleme şirket bazında yapılabilir; verinizin sınırı teknik bir varsayım değil, fiziksel bir sınırdır.

🎛️

Yetki ekranda değil, sunucuda

Kural: Butonu gizlemek güvenlik değildir. Her komut ve her sorgu, çalışmadan önce kendi yetki kontrolünü sunucuda yapar; yetki yoksa iş hiç başlamaz.

Neden: Arayüz, kullanıcının bilgisayarında çalışır — değiştirilebilir. Sunucu tarafındaki kontrol ise atlanamaz.

İşletme için: Kasiyer, kasiyerin yetkisiyle çalışır — hangi ekrandan, hangi cihazdan denerse denesin. İkram ve iptal gibi istisnalar yönetici onayına bağlanabilir.

📜

Kim, ne zaman, neyi değiştirdi

Kural: Kritik işlemler önce/sonra değerleriyle denetim izine yazılır. İşletmenizin veritabanındaki bu işlem denetim kaydında her satır bir öncekinin özetini (hash) taşır — zincir.

Neden: Bir denetim kaydı ancak sonradan değiştirilemiyorsa kanıttır. Zincir sayesinde araya girilen, silinen veya düzeltilen bir satır hesaplama yeniden yapıldığında ortaya çıkar.

İşletme için: “Bu indirimi kim geçti?” sorusunun tek bir cevabı olur. İşletme sahibi zincirin bütünlüğünü panelden doğrulatabilir. Kapsam notu: zincir, işletme veritabanındaki işlem denetim kaydına özeldir; giriş denemeleri ve yönetim işlemlerinin tutulduğu sistem/oturum kaydı da yalnızca ekleme alır, ancak orada hash zinciri yoktur.

🔐

Girişte iki adım

Kural: Parolalar Argon2id ile saklanır — geri çevrilemez biçimde. Yeni parola belirlenirken bilinen sızıntı listelerine karşı kontrol edilir ve eşleşiyorsa reddedilir. Kimlik doğrulama uygulaması (TOTP) ile iki adımlı doğrulama her hesap için açılabilir.

Neden: İşletme yazılımına giriş, kasaya girmektir. Parola tek başına yeterli bir kapı değildir; hele başka bir sitede sızmış bir paroladan söz ediyorsak.

İşletme için: Personel parolasını “12345” yapamaz; ayrılan personelin oturumları yönetici tarafından tek hamlede kapatılabilir.

📱

Tarayıcı ve cep aynı anda

Kural: Mobil uygulama tek kod tabanından hem Android hem iOS için üretilir; web paneliyle aynı sunucuya, aynı kurallara bağlanır.

Neden: İki ayrı mobil uygulama iki ayrı hata listesi demektir — ve ikisi zamanla birbirinden ayrışır.

İşletme için: Kurulum, sürüm ve “bende çalışıyor” derdi yok. Garson masadan sipariş alırken patron aynı veriyi tarayıcıdan görür.

Süreç

Bir özellik gemiye nasıl giriyor?

Her yeni özellik aynı dört adımdan geçer. Sıra değişmez: ekran en sonda gelir.

1

Kural önce yazılır

Ekran değil, iş kuralı. “İade edilen üründe ne olur?”, “stok yetmezse satış ne yapar?” sorularının cevabı koddan önce netleşir ve kuralın kendisi tek bir yere yazılır — arayüze dağıtılmaz.

2

Doğrulama sunucuda yapılır

Tarayıcıdaki kontrol kolaylık içindir: formu doldururken uyarır. Gerçek kapı sunucudadır — her istek, yetki ve geçerlilik kontrolünden ayrı ayrı geçer.

3

Testi yoksa bitmemiştir

Her iş kuralı için en az bir “mutlu yol” testi ve bir de başka şirketin verisine sızmıyor mu testi yazılır. İkisi de yeşil değilse özellik gemiye girmez.

4

Yan etkiler yarım kalmaz

Satış ile stok hareketi tek bir işlemde yazılır: ya ikisi de olur ya hiçbiri. Kasa kaydı ve bildirim gibi devamı gelen etkiler, aynı işlemde kaydedilen bir olay satırından tetiklenir — satış kaydedildiyse o olay da kayıtlıdır; işlenene kadar yeniden denenir, kaybolmaz.

Teknoloji

Modern ve kanıtlanmış bir altyapı

Heyecan verici olanı değil, on yıl sonra da bakımı yapılabilecek olanı seçiyoruz. Tercihlerimiz endüstri standardı, açık ve yaygın teknolojiler.

  • .NET + PostgreSQL çekirdeği — her şirkete ayrı, yedeklenebilir veritabanı.
  • React web paneli, Flutter mobil uygulama — tek koddan Android ve iOS.
  • Modüller birbirini doğrudan çağırmaz; olay (event) ile haberleşir. Olay, iş verisiyle aynı işlemde kaydedilir — “kaydettim ama yan etkiyi tetikleyemedim” durumu oluşmaz.
  • Docker + Nginx ile dağıtım; şifreli bağlantı ve güvenlik başlıkları altyapı katmanında zorunlu.
  • Yetki, kiracı çözümleme, işlem bütünlüğü ve denetim yazımı ortak bir hat üzerinde çalışır — tek tek özelliklerin hatırlamasına bırakılmaz.

Eklemediklerimiz de kayıtlı

Bir kütüphane eklemek bugün hızlandırır, yarın borç bırakır: güvenlik güncellemesi, sürüm çakışması, terk edilme riski. Bu yüzden eklememe kararlarını da gerekçesiyle yazıyoruz.

  • Arka plan işleri için popüler bir zamanlama kütüphanesi eklenmedi; platformun kendi mekanizması seçildi ve gerekçesi karar kaydına yazıldı.
  • Modüller arası iletişim için ayrı bir mesaj kuyruğu eklenmedi; bu ölçekte gereksiz karmaşa olduğu değerlendirildi, ileride taşınabilecek şekilde tasarlandı.
  • Yeni bir bağımlılık, kararı yazılmadan eklenmez.

Bağımlılık, ileride ödenecek bir borçtur. Az sayıda, iyi seçilmiş bağımlılık; çok sayıda kolay bağımlılıktan güvenlidir.

Kanıt

Söylediğimizi ölçüyoruz

Yukarıdakiler niyet beyanı değil; her değişiklikte otomatik olarak denetlenen kurallar.

🧪

800'den fazla

otomatik test — iş kuralları, uçtan uca akışlar ve kiracı izolasyonu dahil.

📐

11 yazılı

mimari karar kaydı: her büyük kararın gerekçesi, alternatifleri ve sonuçları yazılı.

🖥️

3 platform

web paneli, Android ve iOS — hepsi aynı derleme ve test hattından geçer.

⚙️

Her değişiklik

otomatik derleme, test ve bağımlılık güvenlik taramasından geçmeden birleştirilmez.

Taklit veritabanı yalan söyler

Entegrasyon testlerimiz bellekte taklit bir veritabanında değil, gerçek bir PostgreSQL örneği üzerinde çalışır. Eşzamanlı satışta stok kilidi, işlem geri alma, benzersizlik kısıtı gibi davranışlar ancak gerçek veritabanında doğru sınanır — taklit olan çoğu zaman “geçti” der.

Kuralı insan değil, test denetler

Modüllerin birbirinin içine sızmadığını ve hareket kayıtlarına silme/güncelleme kodu girmediğini gözden geçirmeye bırakmıyoruz: bunu ayrı mimari testler denetliyor. Kuralı ihlal eden bir kod, incelemeye gelmeden önce derleme hattında kırmızıya döner.

Operasyonunuzu birlikte konuşalım

Ne kullandığınızı ve nerede tıkandığınızı anlatın; bugünkü ürünümüz Business Suite işinize uyuyor mu birlikte bakalım.