ARCHITECTURE.md (2021): Proje yapısı teknik şartnamesi
(matklad.github.io)- 10 bin~200 bin satır büyüklüğündeki açık kaynak projelerde
READMEveCONTRIBUTINGyanında bir ARCHITECTURE belgesi bulundurmak, yeni katkıcıların kod yapısını kavrama maliyetini azaltabilir - Yabancı bir projede asıl sorun, yama yazmanın yaklaşık 2 kat yavaşlamasından çok, nereyi düzeltmek gerektiğini bulmanın 10 kat daha uzun sürmesidir
- Bu belgenin üst düzey yapıyı ve sık değişmeyen içerikleri kısa biçimde içermesi; kodla sürekli senkronize edilmeye çalışılmasındansa yılda birkaç kez gözden geçirilmesi daha uygundur
- Temel bileşenler, sorunun kuşbakışı görünümü ve kod haritası (codemap) olup büyük modülleri ve ilişkilerini göstererek “X’ten sorumlu kod nerede?” sorusuna yanıt vermelidir
- Önemli adları, mimari değişmezleri, katman ve sistem sınırlarını, yatay kesen ilgi alanlarını kayda geçirmek; doğrudan bağlantılar yerine ada göre aramayı teşvik etmek bakım yükünü azaltır
ARCHITECTURE belgesinin azalttığı maliyet
- Açık kaynak projelerde ara sıra katkı yapan kişilerle çekirdek geliştiriciler arasındaki en büyük fark, projenin fiziksel mimarisini bilip bilmemeleridir
- Yabancı bir kod tabanında dosyalar, rastgele sıraya konmuş mantıksal parçalar gibi sırayla okunur
- Daha önce anlamlı katkılar yapmış bir geliştiricinin zihninde bir kod haritası vardır; gerekli konuma doğrudan gider, yoksa ilgili kodu oraya taşıyabilir
ARCHITECTUREdosyası, bu farkı düşük maliyetle azaltmanın bir yoludur- Belge kısa olmalıdır
- Çünkü tekrar tekrar katkı yapan herkesin onu okuması gerekir
- Ne kadar kısa olursa gelecekteki değişikliklerle geçersiz hale gelme olasılığı o kadar düşük olur
ARCHITECTUREiçin ölçüt, sık değişmeyecek içerikleri barındırmasıdır- Kodla sürekli senkronize etmeye çalışmayın
- Bunun yerine yılda birkaç kez yeniden gözden geçirin
Neler içermeli?
- Önce projenin çözdüğü problemi kuşbakışı düzeyde özetleyin
- Ardından belirli bir ayrıntı düzeyinde kod haritası (codemap) hazırlayın
- Büyük ölçekli modülleri ve birbirleriyle ilişkilerini açıklayın
- “X’i yapan şey nerede?” sorusuna yanıt vermelidir
- “Şu anda baktığım bu şey ne yapıyor?” sorusuna da yanıt vermelidir
- Her modülün iç işleyişine kadar derine inmeyin
- Bu tür içerikler ayrı bir belgeye ya da daha iyisi satır içi dokümantasyona taşınmalıdır
- Kod haritası bir ülke haritasıdır, eyalet eyalet bir atlas değildir
- Kod haritası yazılırken proje yapısı da birlikte gözden geçirilebilir
- Kod haritasında birbirine yakın olmasını istediğiniz şeylerin
tree .çıktısında da bitişik olup olmadığını kontrol edebilirsiniz
- Kod haritasında birbirine yakın olmasını istediğiniz şeylerin
- Önemli dosya, modül ve tip adlarını açıkça belirtin
- Doğrudan bağlantılardan kaçının; zamanla kırılabilirler
- Bunun yerine sembolleri ada göre aramaya yönlendirmek, bakım yükü oluşturmadan ilgili benzer adlı öğelerin de bulunmasını sağlayabilir
- Mimari değişmezler açıkça yazılmalıdır
- Önemli değişmezler çoğu zaman bir şeyin “olmadığı” biçiminde ortaya çıkar
- Örneğin web geliştirmede model katmanının view’a bağımlı olmadığı gerçeğini yalnızca kodu okuyarak çıkarmak zor olabilir
- Katmanlar ve sistemler arasındaki sınırlar da gösterilmelidir
- Sınır, arkasındaki sistem uygulamasına dair bilgiyi ima eder
- Olası tüm uygulamaları da kısıtlar
- İyi bir sınırı kod içinde rastgele bulmak zor olduğundan dokümante etmek faydalıdır
- Kod haritasından sonra yatay kesen ilgi alanları için ayrı bir bölüm ekleyin
- Başvurulabilecek örnekler rust-analyzer’ın architecture.md dosyasında görülebilir
1 yorum
Hacker News yorumları
Bu fikri beğeniyorum; depo boyutundan bağımsız olarak mimari açıklaması için README’de de yer olduğunu düşünüyorum.
Örneğin, tüm okuyucuların iş akışını görüp anlamasının önemli olduğunu düşündüğüm için ana README’ye özellikle bir Mermaid sequence diagram[1] koydum[2].
[1] https://mermaid.js.org/syntax/sequenceDiagram.html
[2] https://github.com/hbcondo/revenut-app?tab=readme-ov-file#-w...
Kulağa gerçekten iyi bir tavsiye gibi geliyor.
Çalışan bir sistemin mimarisini görselleştiren araçların daha iyi olmasını isterdim. Hâlâ kod okumak ya da Markdown dosyalarına bakmak en güncel yöntemmiş gibi olması tuhaf. Şanslıysanız belki bir Mermaid diyagramı vardır.
Mimarinin kendini gerçek zamanlı olarak ortaya koymasını isterdim. Makro ölçekte gözlemlenebilirliğin varsayılan olarak yerleşik olduğu bir şey güzel olurdu; bunun herkesin bilişimi daha iyi anlamasına ve insanlığın kendini artırmasına da yardımcı olacağını düşünüyorum.
Geçici katkıcısı çok olan açık kaynak projeleri için az bakım gerektiren bir model olarak iyi görünüyor. Adanmış mühendisleri olan projelerde ADR de düşünülmeye değer.
ADR daha fazla bakım gerektirir ama “neden böyle yapıldı” ve “değerlendirilen alternatifler” bilgisini bıraktığı için yeniden tasarım sırasında çok faydalıdır.
Referans: https://adr.github.io/
ARCHITECTURE.md mevcut mimari durumunu içerir; ADR ise oraya gelinmesini sağlayan kararların kaydıdır. İkisi de çok faydalıdır.
Microservices, Kafka, Kubernetes: Şu an 4 bin kullanıcımız var ama ya 1 milyar olursa diye.
GraphDB: Ya SQL yeterli olmazsa diye.
ElasticSearch: Ya istatistiklerin yanında full-text search de yapmamız gerekirse diye.
Ama bu belgelerin çoğu sonunda “eğlenceli olduğu için yeni bir mimari/teknoloji denemek istiyorum, FAANG’de çalışan iş arkadaşım kullanıyor, o kitabı okudum, özgeçmişte iyi görünür”ün kısaltması oluyor.
Onlar bir sonraki büyük proje tasarımına geçtikten sonra, bizim ekip ekip üyesi sayısından fazla servisi ve yukarıdaki veritabanları/teknolojileri sürekli senkronize tutmak zorunda kalıyor. Tabii bu tür sorunlar “büyük mimari kararlar” almaktan çok daha basitmiş gibi görülüyor.
Aklıma geldi: Kullandığım tüm IDE’ler solda proje klasör yapısını standart bir dizin ağacı olarak gösteriyor. Projeyi bağımlılık grafiği üzerinden gezdirmeye izin veren bir IDE var mı?
İçindekiler tablosu tarzı gösterimin pek uymadığını düşünüyorum. Güncel kodlama iş akışımda terminali açıp içinde ranger çalıştırıyorum; soldan sağa dizin yapısını gezerken o terminale sekme değiştiriyorum. VSCode’u açıp bölünmüş terminalde üstte normal terminal, altta Ranger çalıştırmak gibi. Midnight Commander da olur; aslında bir TUI dosya gezgini yeterli.
Ayrıca projenin architecture.md dosyasına kod haritası eklemeye başladım.
tree -Lçalıştırınca Markdown’a koymaya uygun dosya yapısı ağaç diyagramını istediğiniz derinlikte alabilirsiniz. Bu çıktıyı Markdown’a ekliyor, her dosya/klasörün arkasına da 10 kelimeden kısa, amacını açıklayan bir not koyuyorum.Ranger - https://github.com/ranger/ranger
Midnight Commander - https://midnight-commander.org/
Nasıl görünebileceğine dair iki fikrim var.
Birincisi, sembolik bağlantılar kullanarak dosyaları ortogonal biçimde organize eden birden fazla dizin ağacı. Normal dizin yapısı client/server diye ayrılır; peki özelliklere göre ayırmak istersek? IDE bunu çok daha kolay oluşturabilir.
İkincisi, bu yazının yönüne benzer şekilde IDE’nin yer imleri oluşturup aralarında gidip gelmeyi ve insanlara kodu anlatmayı kolaylaştırmasını isterdim. Bazen yorum bırakıp tıklayınca kod tabanının başka bir yerine atlamak istiyorum. Bunları birbirine bağlayınca, kod tabanının tamamında nasıl çalıştığını açıklayan bir anlatı örülebilir.
Bu yönde çalışan biri var mı merak ediyorum.
Burada yazarın söylediklerini genel yazılım projelerine fazla genişletirken dikkatli olmak gerektiğini düşünüyorum.
Bağlamı az olan çok sayıda katkıcının bulunduğu büyük açık kaynak projelerinde böyle bir belgeyi sürdürmek çok değerlidir. Ama küçük iş projelerinde geliştiricilerin commit ettiği belgelerin sonunda hepsinin bakımsız kaldığını gördüm.
En azından ekip üyelerinin mevcut mimari ve ideal mimari hakkında birbirinden çok farklı fikirlere sahip olduğunu öğrendik. Bunu açıkça ortaya koymak bile belge oluşturmaya değer.
Ayrıca “belgeler bakımsız kalır” argümanı, belge oluşturmamak için çok zayıf bir gerekçe. Çünkü eski ya da incelikli biçimde yanlış da olsa herhangi bir belge, “hiç belge olmamasından” iyidir.
Birkaç yıl önce büyük yan projelerimden birinde benzer bir yaklaşımı denemiştim
https://github.com/shipmight/shipmight/blob/master/src/ARCHI...
Her dosyanın üst kısmına depodaki diğer ARCHITECTURE.md dosyalarına giden bir bağlantı ağacı koymuştum. Örnek şöyle: ARCHITECTURE.md <- mevcut konum, backend/ARCHITECTURE.md, backend/api/ARCHITECTURE.md, backend/cli/ARCHITECTURE.md, backend/ui/ARCHITECTURE.md, backend/utils/ARCHITECTURE.md, frontend/ARCHITECTURE.md, internal-charts/ARCHITECTURE.md
Şöyle bir konumda görünür: https://github.com/shipmight/shipmight/tree/master/src/backe...
Bu yöntemi birkaç projede daha görmüştüm
Ne kadar kısa olursa, gelecekteki değişikliklerle geçersiz hâle gelme olasılığı o kadar düşük olur. ARCHITECTURE için temel pratik kural, yalnızca sık değişmeyecek şeyleri yazmaktır. Kodla senkron tutmaya çalışmamak gerekir
Arayüzlerin değişme olasılığı daha düşüktür ve değiştirilmeleri de daha zordur. Bu, bir sistemi modüllere ayırırken kullanılan ölçütlere dair Parnas’ın bakış açısıdır
Kod tabanını anlamanın zor olduğuna katılıyorum. “Pattern” adları vermek bir ölçüde yardımcı olsa da sonunda epey okuma yapmak gerekiyor
GitHub’da dosya bazındaki commit mesajları çoğu zaman açıklama gibi hissettiriyor. Acaba bu daha faydalı olabilir mi?
Dahil olduğum tüm projelerde onboarding sırasında mimari diyagramı ve bileşenlere dair kısa bir açıklama almıştım
Bu yüzden açık kaynakta bunun bu kadar yaygın olmaması şaşırtıcı
Açık kaynak projelerde bir çalışanın ilk iş günü olmadığı için böyle bir tanıtım da yok
Çok fazla zamanınız yoksa bu tür açıklamalar pek iyi olmuyor. Bir çalışanın tek başına bir şeyler çıkarabilmesi için birkaç hafta geçmesi beklenir; ama güvenlik danışmanları olarak biz her 2 haftada bir tamamen yeni bir açıklama dinliyoruz. Sorun, bu açıklamaların doğaçlama ve yapılandırılmamış olması, anlatan kişinin de bilgi laneti yüzünden alakasız pek çok ayrıntıdan bahsetmesi
Muhtemelen depoya yeni gelen birinin bunu bir kez yazması, sonrasında da yalnızca bakımının yapılması iyi olur. İkinci en iyi seçenek ise herhangi birinin her seferinde doğaçlama anlatması yerine, neyi dahil edip neyi dışarıda bırakacağını yaklaşık 1 dakika düşünüp yazıya dökmesidir. Yazarın da söylediği gibi bu dosya projenin üst düzey mimarisini açıklamalı ve kısa olmalı. Düzenli katkı veren herkes bunu okumalı; ayrıca ne kadar kısa olursa gelecekteki değişikliklerle geçersiz hâle gelme olasılığı da o kadar düşük olur
Bunun her zaman çok faydalı bir pratik olduğunu düşündüm. Birçok projede değişikliklerin çoğunun gerçekleştiği birkaç çekirdek dosya ya da paket/modül vb. vardır
Yeni katkı verenler veya uzun bir aradan sonra dönen katkı verenler bunları hızlıca kavrayabilirse projeye başlama süresi ciddi biçimde azalır
Birkaç iş yerinde projelere mimari dosyası ekledim ve [0], [1] tepkiler olumluydu. Mükemmel değil ama hiç olmamasından iyidir
[0]: https://github.com/zapier/zapier-platform/pull/324
[1]: https://github.com/stripe/stripe-cli/blob/master/ARCHITECTUR...
Eskiden bu küçük dokümantasyon/diyagram-as-code standartlarını severdim
README odaklı geliştirme, ARCHITECTURE.md, ADR, arc42, C4 vb.
Şimdi ise git deposundaki
/docsklasörüne bir Obsidian kasası koyuyorumBaşkalarının standartlarını kullanmak yerine, Obsidian’da kişisel notları yönetir gibi dokümanları sürekli düzenleyip refactor ediyorum
Başta GitHub’ın GFM’i ile Obsidian’ın ikisinde de çalışan ortak bir Markdown alt kümesi kullanmak istemiştim ama vazgeçtim; artık Dataview eklentisi ve şablonlar gibi kendine özgü özellikler dahil, Obsidian tarzı Markdown’ı olduğu gibi kullanıyorum
Mermaid ve LaTeX Obsidian’da yerleşik geliyor, PlantUML eklentisi de var. Görsel çizimler/diyagramlar için yerleşik Canvas, DrawIO ve Excalidraw kullanıyorum