Over Engineering Hakkında

Yazılım geliştirme, hızla değişen teknolojik peyzajda karmaşıklığı yönetme çabası içinde olan dinamik bir alanı temsil eder. Geliştiriciler, projelerini etkili ve sürdürülebilir hale getirmek için çeşitli stratejiler kullanırken, bazen aşırı mühendislik (over engineering) terimiyle karşılaşırız. Bu kavram, bir yazılım projesinde gerekli olmayan, işlevselliği aşan, karmaşık ve gereksiz özelliklerin eklenmesini ifade eder. Bu blog yazısında, over engineering'in ne olduğunu, nasıl ortaya çıktığını ve bu durumun yazılım geliştirme süreçleri üzerindeki etkilerini inceleyeceğiz.

Over Engineering Nedir?

Over engineering terimi, bir yazılım projesinin gereksinimlerini karşılamak için fazla karmaşık veya aşırı optimize edilmiş bir tasarımın kullanılmasını ifade eder. Bir projenin ihtiyaçlarına uygun olmayan, genellikle gereksiz karmaşıklığa ve maliyet artışına yol açan bu durum, uzun vadede proje başarısını olumsuz etkileyebilir.

Neden Over Engineering Yapılır?

  1. Belirsiz Gereksinimler: Proje başlangıcında belirsiz veya değişken gereksinimler, geliştiricilerin aşırı mühendislik yapmalarına neden olabilir. Belirsizlikle başa çıkmak için, geliştiriciler geniş kapsamlı ve çok yönlü çözümler sunabilirler.

  2. Mükemmeliyetçilik: Bazı geliştiriciler, yazılımı sadece çalışır durumda bırakmak yerine, her detayı mükemmel bir şekilde optimize etmeye çalışırlar. Bu durum, projenin gerçek ihtiyaçlarından daha fazla zaman ve kaynak harcamasına yol açabilir.

  3. Teknolojiye Aşırı Bağlılık: Yeni ve heyecan verici teknolojilere aşırı bağlılık, geliştiricilerin bu teknolojileri projelerine zorla entegre etmelerine yol açabilir. Bu, proje için gereksiz karmaşıklığı artırabilir.

Over Engineering'in Etkileri

  1. Artan Geliştirme Zamanı ve Maliyeti: Over engineering, projenin geliştirme sürecini uzatabilir ve maliyetleri artırabilir. Gerekli olmayan özelliklerin eklenmesi, kaynakların etkili bir şekilde kullanılmamasına neden olabilir.

  2. Bakım Zorlukları: Karmaşık tasarımların sürdürülmesi ve bakımı genellikle daha zor olabilir. Bu durum, gelecekteki güncellemeleri ve değişiklikleri uygulamayı zorlaştırabilir.

  3. Performans Sorunları: Aşırı optimize edilmiş kod genellikle performans sorunlarına yol açabilir. Bu durum, projenin genel performansını düşürebilir ve gereksiz yere kaynakları tüketebilir.

Örnek bir proje ele alacak olursak; sizden input olarak 2 sayı alan ve geriye bunların toplamını dönen bir geliştirme yapmanız istendi ve sizde aşağıdaki gibi over engineering sayılabilecek bir geliştirme yaptınız;

using System;

namespace OverEngineeringExample
{
    public interface IMathOperation
    {
        double Execute(double a, double b);
    }

    public class Addition : IMathOperation
    {
        public double Execute(double a, double b)
        {
            Console.WriteLine("Performing additional calculations...");
            return a + b;
        }
    }

    public class Subtraction : IMathOperation
    {
        public double Execute(double a, double b)
        {
            Console.WriteLine("Performing subtraction calculations...");
            return a - b;
        }
    }

    public class Multiplication : IMathOperation
    {
        public double Execute(double a, double b)
        {
            Console.WriteLine("Performing multiplication calculations...");
            return a * b;
        }
    }

    public class Division : IMathOperation
    {
        public double Execute(double a, double b)
        {
            if (b != 0)
            {
                Console.WriteLine("Performing division calculations...");
                return a / b;
            }
            else
            {
                Console.WriteLine("Cannot divide by zero!");
                return double.NaN;
            }
        }
    }

    public class Calculator
    {
        private IMathOperation operation;

        public Calculator(IMathOperation operation)
        {
            this.operation = operation;
        }

        public double PerformCalculation(double a, double b)
        {
            // Unnecessary complexity added here
            Console.WriteLine("Initializing calculation process...");
            var result = operation.Execute(a, b);
            Console.WriteLine("Finalizing calculation process...");

            return result;
        }
    }

    class Program
    {
        static void Main()
        {
            // A simple addition operation
            var additionOperation = new Addition();
            var calculator = new Calculator(additionOperation);

            double result = calculator.PerformCalculation(5, 10);
            Console.WriteLine($"Result: {result}");
        }
    }
}

Bu örneğe bakacak olursak talep aslında 2 sayının toplanmasıydı ancak siz bir tık daha ileriye giderek belkide projede asla kullanılmayacak ancak ne olur ne olmaz diye daha sonrasında gelebilecek taleplere kendinizi hazırladınız bir mimari tasarladınız. Ancak bu geliştirmeyi aşağıdaki gibi çok daha kısa ve basit bir şekildede yazabilirdik.

public double Sum(double a, double b)
{
	return a + b;
}

KISS prensibinde olduğu gibi bazen keep it simple stupid yapmak ve aşırı mükelliyetçi olmadan en yalın ve basit haliyle geliştirmeyi tamamlamayıda seçmemiz gerekebilir.

Sonuç

Yazılım süreçlerinde sık sık kullandığım bir cümle vardır "It depends on the business".

Over engineering, yazılım geliştirme süreçlerinde dikkat edilmesi gereken bir durumdur. Projelerin ihtiyaçlarına uygun çözümler üretmek, gereksiz karmaşıklığı önlemek ve mükemmeliyetçilikten kaçınmak önemlidir. Dengeyi bulmak, projenin başarılı olması ve uzun vadeli sürdürülebilirliğini sağlamak için kritiktir. Bu nedenle, geliştiricilerin dikkatli bir şekilde tasarım kararları vermeleri ve gereksiz karmaşıklıklardan kaçınmaları önemlidir.

 

Add comment