Sunday, July 01, 2007

Büyük projelerde kod organizasyon problemi

Büyük yazılım projelerinin en önemli sorunlarından biri çok uzun sürelerde geliştirildikleri veya istekler zamanla değiştiği için kod organizasyonlarının bozulmasıdır. Bir yerden sonra bu kodların refactor edilmesi gerekiyor. Juergen Hoeller(chief architect of the Spring Framework) bu konuda Spring Experience sempozyumunda yaptığı sunum ilgimi çekti. Sunun 88 dakika olduğu için bunun özeti daha çok işimi görecekti. Tabi özetini de buldum :). Bende özetin özetini yaparak özeti bir seviye daha ileriye götüreyim.

Yazılımlar geliştirilirken genellikle kod organizasyonu düşünülmez, zamanla kendiliğinde oluşur.
Paket bağımlığı ve modül bağımlığı konusunda "best practice" alınabilecek fazla kaynak bulunmuyor.
Kodlar mantıksal olarak organize edilmeli. "Code base" yıllar sonra tamamen yeni requirementlar olsa bile orjinal yapısına göre geliştirilmeye devam edilmeli.

Jurgen "Çoğu açık kaynak kodu yazılımları paket bağımlılığı konusunda kötü örnek oluşturuyor. JDK ve Hibernate gibi projeler örnek verilebilir." diyor.

Çift yönlü bağımlılık paketlerin yeniden kullanılabilirliğini azaltmaktadır. Zor olan kısmı tek yönlü bağımlılık yaparken kod duplication yapmamak. Çift yönlü bağımlılık için temel sebep aynı kod diğer pakette varken yeniden yazmamak. Bunun için gerekirse paketlerin yerlerini değiştirmek ama tek yönlü bağımlılık prensibini bozmamak gerekir.

Modülleri tanımlamak "challenging" olabilir. Modüller temel olarak deployment ihtiyaçlarına ve "conceptual boundaries"e göre oluşur. Bazıları modülleri "multi-tier" ayrımı göre yapıyor, fakat bu mantıksal modüllere uygun olmadığı için sorunlara sebep olur.

Temel olarak modüller "low coupling"- "high cohesion" prensibine göre düzenlenmelidir.

Her bir modülün bütün sistem içinde ayrı bir rolü olmalıdır ve bu rol herkes tarafından kolaylıkla anlaşılabilmelidir.

Spring geliştirilirken en önemli problem backward compatibility'miş. Küçükte olsa API farklılaşmasına izin verilmiş ama kod çiftlenmesine müsade etmemişler.

Eğer yeni bir modül ekleniyorsa bunun projenin neresinde olacağı üzerinden çok dikkatli olmuşlar. Kullanılan diğer frameworklerdeki değişiklikler bile spring kullanıcılarında aksettirilmemiş.

Bağımlılıkları düzenli olarak gözlemek ve yönetmek için araçları kullanmak gerekiyor.
Spring için JDepend ve SonarJ kullanılıyor.

http://www.infoq.com/presentations/code-organization-large-projects
http://mikenereson.blogspot.com/2007/06/spring-on-code-organization-for-large.html

No comments: