Teknik Hesaplama Motoru Nasıl Tasarlanır?
Yazar: Sercan Fidan · Yayın: 7 Ağustos 2026 · Güncelleme: 2026-09-01 · Mühendislik Araçları

Bir mühendislik ekibinde hesap bilgisi nadiren tek bir yerde durur. Bir kısmı tasarım raporlarının içindedir, bir kısmı yıllar önce hazırlanmış bir elektronik tabloda, bir kısmı da işi en iyi bilen kişinin aklında. Çalıştığım projelerde aynı hesabın üç farklı dosyada üç farklı sonuç verdiğini gördüm; formül aynıydı ama birim dönüşümü, yuvarlama adımı ve varsayılan değerler farklıydı. Bu yazıda bu dağınıklığı toparlamak için kullandığım yaklaşımı anlatacağım: hesapları bağımsız, test edilebilir bir hesap motoruna taşımak.
Elektronik tablo neden yetmez?
Elektronik tablo hızlı başlangıç için mükemmeldir; uzun ömürlü bir hesap altyapısı içinse kötü bir ev sahibidir. Formül hücreye gömülüdür; hangi hücrenin girdi, hangisinin ara değer olduğu çoğu zaman yalnızca dosyayı yazan kişinin aklındadır. Birimler başlık satırındaki bir nottan ibarettir; değerin metre mi milimetre mi olduğunu formülün içindeki 1000 çarpanından anlarsınız. En kritik sorun ise test edilemezliktir: bir hücreyi değiştirdiğinizde başka hangi sonuçların etkilendiğini gösteren güvenilir bir mekanizma yoktur.
Hesabı bir sözleşme gibi tanımlamak
Motorun temel fikri şu: her hesap yazılı bir sözleşmedir. Bu sözleşmede beş şey açıkça tanımlanır: girdiler, her girdinin birimi, geçerlilik sınırları, ara değerler ve sonuçlar. Girdi tanımı yalnızca bir isim değildir; "L, metre cinsinden, 0.01 ile 50 arasında" gibi eksiksiz bir cümledir. Sınırın dışındaki bir değer sessizce hesaba girmez; motor onu açık bir hatayla reddeder. Ara değerleri de sözleşmenin parçası yapıyorum, çünkü bir sonucu savunmanın tek yolu ona giden adımları gösterebilmektir. Uygulamada bu sözleşmeyi bir dataclass ile, hesabın kendisini ise saf bir fonksiyonla ifade ediyorum: durum tutmayan, dosyaya ve ekrana dokunmayan, aynı girdiye her zaman aynı sonucu veren bir fonksiyon. Bu iki özellik testi neredeyse bedavaya getirir ve hesabı, onu çağıran uygulamadan tamamen bağımsız kılar.
Bu bağımsızlığı mimaride de koruyorum: motor, arayüzün varlığından habersiz olmalı. PyQt6 ile yazılmış bir masaüstü arayüzü de, bir komut satırı aracı da, bir test betiği de aynı motoru çağırabilmeli. Arayüz katmanı girdiyi toplar ve sonucu gösterir; veri katmanı hesap tanımlarını ve geçmiş sonuçları saklar — SQLite bu iş için çoğu zaman fazlasıyla yeterli — motor ise yalnızca hesap yapar. Bu ayrımın pratik getirisi büyüktür: motoru arayüz açmadan, saniyeler içinde yüzlerce senaryoyla sınayabilirsiniz.
Referans değerlerle doğrulama
Bir hesabın doğru çalıştığını iddia etmenin en dürüst yolu, sonucunu bağımsız bir referansla karşılaştırmaktır. Her hesap için ders kitabından, elle çözülmüş bir örnekten ya da daha önce doğrulanmış bir tablodan en az bir girdi-sonuç çifti alıyorum ve bunu birim teste döküyorum. Karşılaştırmayı mutlak değil bağıl toleransla yapıyorum, çünkü büyüklük mertebesi hesaptan hesaba çok değişir. Motor büyüdükçe bu testler bir güvenlik ağına dönüşür: formülü yeniden düzenlediğimde referans vakalar hâlâ geçiyorsa içim rahat eder.
Test edemediğim hesap benim için henüz hesap değildir; sadece bir iddiadır.
from dataclasses import dataclass
@dataclass(frozen=True)
class Girdi:
ad: str; birim: str; alt: float; ust: float # isim, birim, geçerlilik sınırları
# Serbest uca tekil yük F etkiyen ankastre kirişte uç sehimi: delta = F*L**3 / (3*E*I)
GIRDILER = (
Girdi("F", "N", 0.0, 1e6),
Girdi("L", "m", 0.01, 50.0),
Girdi("E", "Pa", 1e9, 5e11),
Girdi("I", "m^4", 1e-12, 1.0),
)
def dogrula(**degerler: float) -> None:
for g in GIRDILER: # sınır dışı girdi sessizce hesaba girmez
d = degerler[g.ad]
if not (g.alt <= d <= g.ust):
raise ValueError(f"{g.ad}={d} {g.birim}: [{g.alt}, {g.ust}] aralığının dışında")
def uc_sehimi(F: float, L: float, E: float, I: float) -> float:
dogrula(F=F, L=L, E=E, I=I)
return F * L ** 3 / (3.0 * E * I) # saf fonksiyon: durum tutmaz, ekrana dokunmaz- Her hesap için en az bir referans vaka: elle ya da ders kitabından doğrulanmış girdi-sonuç çifti
- Sınır testleri: geçerlilik aralığının uçlarında ve hemen dışında motorun davranışını sına
- Toleransı mutlak değil bağıl tanımla; büyüklük mertebesi hesaba göre değişir
- Yalnızca nihai sonucu değil, ara değerleri de doğrula ve raporla
Bu yaklaşımın en güzel yanı ölçeklenmesidir. İlk hesabı motora taşımak biraz zaman alır; ikincisi bir şablonu doldurmaya, onuncusu rutine dönüşür. Bir süre sonra elinizde sadece bir araç değil, ekibin hesap bilgisini tek bir yerde, birimleri ve sınırlarıyla birlikte saklayan bir kütüphane olur. Belgelerdeki dağınık formüller yerlerinde durabilir; ama artık doğrunun tek kaynağı motordur.