Yapay zekadan makale özeti
- Kısa
- Ayrıntılı
- Bu video, bir akademisyen tarafından sunulan yazılım tasarımı konulu eğitim dersidir. Dersin sunucusu Feza Buzluca Hoca olarak tanıtılmakta ve Fatma Hoca adında başka bir eğitmenle de çalışmaktadır.
- Video, yazılım geliştirme sürecinin tasarım aşamasına odaklanmaktadır. Yazılım tasarımı, modelleme teknikleri, tasarım prensipleri (SOLID prensipleri), tasarım kalıpları ve UML (Unified Modeling Language) konuları detaylı şekilde ele alınmaktadır. Ders, yazılım ürün tasarımı ve mühendislik tasarımı arasındaki farkları, tasarım seviyelerini ve yazılım kalitesi için beklentileri (karmaşıklık, bakım yapılabilirlik, genişleyebilirlik, yeniden kullanılabilirlik) açıklamaktadır.
- Videoda ayrıca soyutlama ve modelleme kavramları, top-down ve bottom-up tasarım stratejileri, statik ve dinamik modelleme türleri ve anti-pattern'ler gibi konular da işlenmektedir. Eğitmen, kendi tecrübelerinden örnekler vererek konuları açıklamakta ve nesne yönelimli programlama konusunda sınıfların ilişkileri, arayüzler ve katmanlar hakkında bilgi vermektedir.
- Yazılım Tasarımının Önemi
- Konuşmacı, yazılım mimarisi ve backend geliştirme alanında çalışmanın verdiği kaliteli tasarım ve kod yazma konularını önem verdiği belirtiyor.
- Önceki derste gereksinimler ve süreçler ele alındıysa, bu derste yazılım tasarımı aşaması incelenecek.
- Tasarım, problem çözme etkinliği olarak görülmesi ve soyutlama ile modelleme konularının yazılım mühendisliğindeki önemi vurgulanıyor.
- 01:40Programlama ve Yazılım Geliştirme Süreci
- Programlama dilini iyi bilmek, kaliteli bir yazılım çıkarmak anlamına gelmez; programlama sadece yazılım geliştirme sürecinin en küçük parçalarından biridir.
- Yazılım geliştirme süreci alt süreçler ve aşamalar halinde ele alınmalı, fazlarla birlikte değerlendirilmelidir.
- Yazılım geliştirme yaşam döngüsü altı temel aşamadan oluşur: gereksinim toplama, analiz, tasarım, gerçekleştirme, test ve bakım.
- 03:48Yazılım Geliştirme Aşamalarının Önemi
- Kod yazmak (implementasyon) aslında yazılım geliştirme sürecinin en küçük kısımlarından biridir.
- Yazılım projelerinde maliyet dağılımı yaklaşık olarak analiz %5, tasarım %8, gerçekleştirme %12, test %15, bakım %60 civarındadır.
- Analiz ve tasarım aşamalarında yapılan hatalar, özellikle bakım aşamasında yüz katına kadar daha yüksek maliyetlere yol açabilir.
- 06:10Gerçek Dünya ve Çözüm Dünyası
- Gerçek dünyadaki problemler, soyutlama ve modelleme kullanılarak analiz edilir, tasarım ve kodlama ile yazılım geliştirilir.
- Tasarım prensipleri ve tasarım kalıpları yazılım tasarımı sürecinde çok önemli konulardır.
- Tasarım aşamasında use case'ler, tasarım modelleri ve tasarım kalıpları sıkça kullanılır.
- 08:10Ürün Tasarımı ve Kalite İlişkisi
- İyi tasarlanmış ürünler sonuç itibariyle bazen daha pahalı olabilir, ancak aynı zamanda daha kaliteli olabilir.
- Ürün tasarımında görsel ve kullanılabilirlik önemli olsa da, işlevsel performans da göz önünde bulundurulmalıdır.
- Yazılım tasarımında kalite ölçütleri ve gereksinimler önemlidir, örneğin bin kullanıcı aynı anda sistemi kullanabilmesi gibi.
- 09:32Yazılım Ürünü ve Tasarımı
- Yazılım ürünü, müşterinin gereksinim ve isteklerini karşılayan, program, veritabanı, döküman ve hizmetlerden oluşan bir varlıktır.
- Yazılım tasarımı, müşterinin gereksinimlerini karşılayan yazılımın doğasını ve bileşimini belirleme etkinliğidir.
- Yazılım tasarımında hangi teknolojiler, programlama dilleri, veritabanları ve tasarım kalıpları kullanılacağı belirlenir.
- 11:11Problem Çözme Yaklaşımları
- Yazılım tasarımı problem çözme etkinliği olarak düşünülebilir ve deneme yanılma, beyin fırtınası gibi yöntemler kullanılabilir.
- Tasarımın iki temel tekniği soyutlama ve modellemedir.
- Soyutlama, problemin anlaşılması ve çözümünün kolaylaştırılması için nesnelerin, olayların bazı özelliklerini bilinçli olarak görmezden gelme sanatıdır.
- 13:39Soyutlama ve Modelleme
- Soyutlama problemi basitleştirirken, modelleme daha basite indirgemenin yoludur.
- Problem çözme yaklaşımlarında top-down (yukarıdan aşağı) ve bottom-up (aşağıdan yukarı) stratejiler kullanılır.
- Modelleme, hedefin parçalarını ve parçalar arasındaki ilişkileri temsil etmektir.
- 15:45Modellemenin Amacı
- Modelleme, sistemi görselleştirerek daha iyi anlamamıza yardımcı olur.
- Modelleme, sistemin yapısal ve davranışsal yapısını belirtmemize izin verir.
- Modelleme, tekrar tekrar kullanılabilen şablonları tanımlar ve aldığımız kararları dökümantasyon eder.
- 18:38Modelleme ve Tasarım
- Modelleme, problemi anlamak, tasarım yaratımı, tasarım sürecinde inceleme yapmak ve sonuç itibariyle farklı paydaşlarla paylaşmak için kullanılır.
- Modelleme aynı zamanda soyutlama yaparak istenilen seviyede ayrıntı tutabilme imkanı sağlar, ancak bazı önemli ayrıntıları göz ardı etmemek gerekir.
- Modelleme iki ana kategoriye ayrılır: statik (sınıf ve nesne modelleri gibi) ve dinamik (durum diagramları, sıra diagramları gibi) modeller.
- 20:57Ürün Tasarımı ve Mühendislik Tasarımı
- Yazılım tasarımı iki kategoriye ayrılır: ürün tasarımı (tarz, estetik, kullanılabilirlik gibi) ve mühendislik tasarımı (teknik mekanizma ve çalışma şekilleri).
- Ürün tasarımcıları (grafik tasarımcılar, UI tasarımı yapanlar) görsel kısım ve UX ile ilgilenirken, mühendislik tasarımcılar arka planı (backend) oluşturur.
- Yazılım ürün tasarımı, müşterinin gereksinimlerini karşılamak için yazılım ürününün özellikleri, yetenekleri ve arayüzlerinin belirlenmesidir.
- 24:48Mühendislik Tasarımı ve Önemi
- Yazılım mühendislik tasarımı, sözleşmeyi karşılamak için alt sistemlerin, parçaların ve çalışma biçimlerinin belirlenmesidir.
- Mühendislik tasarımı programlama, algoritmalar, veri yapıları, yazılım tasarım prensipleri ve mimariler gibi arka plandaki detayları içerir.
- Mühendislik tasarımı performans, transaction sayısı, kayıt işleme hızı ve hata oranı gibi sistem performansı ile ilgilidir.
- 26:55Ürün Tasarımı ve Mühendislik Tasarımının Önemi
- Hem ürün tasarımı hem de mühendislik tasarımı yazılım kalitesi için önemli olup, ikisi birlikte belirli ihtiyaçları karşılayabilir.
- Girişimcilik perspektifinden bakıldığında, yeni bir şirket kurulurken ürün tasarımı (UX) daha öncelikli olabilir çünkü MVP (minimum visible product) oluşturmak daha kolaydır.
- Şirket destek alır ve yatırım yapar, yazılımcı sayısı artırılırken yazılım mühendislik tasarımı da önem kazanır.
- 29:11Ürün Tasarımı ve Mühendislik Tasarımı Arasındaki Farklar
- Ürün tasarımları gereksinimler kısmını daha çok içerir ve normal tasarıma daha yakın bir yaklaşım benimser.
- Mühendislik tasarımının daha geniş bir ölçekte olması ve dizaynı işin içine alması, ayrıca kodlamayı (implementation) sonuç itibariyle tasarım sürecine dahil etmesi vardır.
- Tasarım yaparken hafiften kod yazmaya başlamak, mühendislik tasarımının bir parçasıdır.
- 30:05Bakım Aşamasında Tasarım Değişiklikleri
- Ürün tasarımında ve mühendislik tasarımında bakım aşamasında yeniden tasarım yapılabileceği, ancak bu durumun tehlikeli olabileceği belirtilmiştir.
- Kozmetik hatalar (örneğin zorunlu alanların rengi gibi) hızlı değiştirilebilir, ancak akış değişiklikleri (örneğin ekranların sırası) büyük problemlere yol açabilir.
- Özellikle mühendislik tasarımında tekrar tasarım yapılması korkutucu olabilir.
- 31:22Yazılım Tasarımının Beklenen Özellikleri
- Yazılım tasarımında beklenen özellikler arasında karmaşıklığın az olması, bakım yapılabilirliği, modüler yapı, gevşek bağımlılık, genişletilebilirlik ve yeniden kullanılabilirlik bulunmaktadır.
- Tasarım seviyeleri olarak beş aşamadan bahsedilebilir: sistem ana yapısı, bileşenler, alt sistemler/paketler, sınıflar ve sınıfların üyeleri.
- Tasarım sürecinde top-down yaklaşım kullanılması önerilir, yani büyük sistemi önce anlamak ve sonra daha küçük parçalara ayırarak ilerlemek gerekir.
- 34:36Tasarım Seviyeleri ve Modüller
- İlk seviyede yazılım sistemi incelenir, sonra alt sistemlere bölünür (örneğin veritabanı, kullanıcı arayüzü, iş kuralları, raporlama).
- Alt sistemlerin nasıl bölüneceği çok önemlidir çünkü bu, tasarımın ilerleyişini belirler.
- Modüller arasındaki iletişim önemlidir; her alt sistem birbiriyle doğrudan iletişim kuramamalıdır, erişim kısıtlamaları olmalıdır.
- 36:54Bağlılık ve Etkileşim
- Modüller arasındaki etkileşim nasıl kurulacağı önemlidir; kodların birbirine sıkı sıkıya bağlı olması istenmez.
- Sıkı sıkıya bağlı modüller veya sınıflar, bir değişiklik yapıldığında domino etki yaratır ve sistemde birçok yeri etkiler.
- Güvenlik açısından da her yerden veriye erişim mümkün olmamalıdır, erişim kısıtlamaları olmalıdır.
- 37:30Nesne Yönelik Programlama ve Katmanlar
- Nesne yönelimli programlarda sınıflar arası ilişki kurarken, kullanıcı arayüzü (UI) üst seviye sınıflarla, üst seviye sınıflar ise iş kuralları ile ilişki kurar.
- UI ve grafikler doğrudan veritabanına erişmez, hangi sınıfların hangi kaynaklara erişeceği belirlenir.
- Sınıfların arabirimleri (interface'ler) çok önemlidir çünkü sınıflar sadece arayüzler üzerinden ilişki kurduğunda, bağımlılık seviyesi düşer.
- 39:18Sınıflar ve Rutinler
- Sınıfların sahip olacağı rutinler, fonksiyonlar, metotlar ve davranışlardır.
- Sınıfların üyelerinin (private, public, protected) erişim seviyelerini belirlemek önemlidir.
- Pseudo kod yazılması, algoritmaların ve kod satırlarının organize edilmesi, sınıfların metotlarının kodlanması yapılır.
- 41:00Tasarım Prensipleri
- Tasarım prensipleri (ayrıştırma, kohezyon, tek sorumluluk prensibi, zayıf bağlaşım prensibi, yeniden kullanılabilirlik, açık-kapalı prensip) yazılım tasarımı için kritiktir.
- SOLID prensipleri (tek sorumluluk, açık-kapalı, discord substation, barbara disco, bağımlılığı tersine çevirme) yazılım tasarımında önemli prensiplerdir.
- Tasarım prensipleri ve kalıpları geçmişte yapılan hatalardan yola çıkarak geliştirilmiştir.
- 42:37Tasarım Kalıpları
- Tasarım kalıpları, yazılım geliştirme sürecinde karşılaşılabilen sorunların çözüm yollarını şablon şeklinde sunar.
- Singleton, bir programın sadece bir kez çalışmasını sağlayan bir tasarım kalıbıdır.
- Object oriented programlama öğrenmek için Python önerilmez çünkü her şeyi yapabilmesi nedeniyle tam anlamıyla object oriented programlama öğrenilmez.
- 47:04UML Modelleme Dili
- UML (Unified Modeling Language), nesne tabanlı yazılım geliştirmede kullanılan bir modelleme dili ve standarttır.
- UML, web tabanlı sistemler, gerçek zamanlı sistemler ve gömülü sistemlerde kullanılabilir.
- UML, görselleştirme, belirtme, oluşturma ve belgeleme desteği sağlar.
- 48:24Görselleştirme ve Modelleme
- Görselleştirme, kodları anlamak yerine kodu okumak ve sistemin büyük parçalarını yukarıdan aşağı bakarak görmek için önemlidir.
- Görselleştirme, belirtimde tam, doğru ve kesin modeller oluşturarak muğlaklığı ortadan kaldırır.
- UML (Unified Modeling Language) forward engineering ve reverse engineering özellikleri sunarak koddan model oluşturma ve modelden kod oluşturma imkanı sağlar.
- 49:45UML'in Önemi
- UML sadece executable oluşturmaz, gereksinim dökümanları, tasarım, kaynak kodlar, proje planları, testler ve prototipler gibi farklı belgeleri de oluşturmak için standartlar sağlar.
- UML farklı diagramları farklı aşamalarda kullanabiliriz: gereksinim analizi aşamasında use case'ler, tasarım aşamasında aktivite, class ve state diagramları.
- UML'de dört temel bakış açısı vardır: tasarım bakış açısı (sınıflar, nesneler), işlem bakış açısı (durumlar, aktiviteler, etkileşim), gerçekleştirme bakış açısı (bileşenler) ve dağıtım bakış açısı (mimari).
- 51:47Yazılım Tasarımı ve Modelleme
- Yazılım tasarımı, problem çözme etkinliği olarak düşünülmelidir ve soyutlama ile modelleme konumlanır.
- Ürün tasarımı arayüzler, bileşenler ve kullanıcı deneyimleriyle ilgilenirken, mühendislik tasarımı backend ile ilgilidir.
- UML, modelleme aracı olarak günümüzde en yaygın kullanılan object oriented analiz ve tasarım metotlarıdır.