İçindekiler
1. Milli Takım altyapı kadrosu😊
Logo’da Yazılım Mimarisi Direktörü olarak çalışan İsmail Duran, Logo’da Teknoloji serimizdeki bu yazıda Logo 3 Serisi ürün ailesinin nasıl ortaya çıktığını, nasıl geliştirildiğini bizlere anlatıyor. Aynı zamanda Logo-Netsis birleşmesinin (kaynaşmasının) teknik takımlar açısından gerçekleşme serüvenine de ışık tutmuş oldu.
Logo 3 Serisi geliştirmelerini yapabilmek ve her iki ürün ailesine ortak hizmet sunabilmek adına öncelikle Logo – Netsis çalışanlarımızdan “Milli Takım” oluşturduk. Ama bu sanıldığının aksine sadece organizasyonel bir yapılanma değil şirket kültürlerinin birbirinin içine geçmesi harmanlanıp Logo kültürünün daha da zengin hale getirilmesi adına bir adımdı.
Serüven İzmir – Urla otobanında yol üzerindeki meşhur kahve dükkanında Tuğrul Bey ile birlikte kahve eşliğinde planlama ile başladı. Devamı ise Urla ofis toplantı odasında fikrin yeni takım (Netsis ekibi) arkadaşlarımıza anlatılması olarak gelişti. Burada iki şirket kültürü ilk defa teknik anlamda karşı karşıya geliyor ve bilgi birikimleri masada ikna için terazinin kefelerine konuyordu. Hepimizin bildiği üzere teknik insanların en genel özelliği analitik düşünmeye yatkın olması ve risk almayı pek sevmemeleridir.
Hatta yazılım geliştirmenin ilk kuralı “If it works don’t touch anything”; yani “çalışıyor ise dokunma”dır. Ancak teknik borcun ödenmesi ve/veya yeni bir şey oluşturmak eylemi, çalışan sisteme dokunmayı, risk almayı gerektirir. Bu nedenle toplantımızın ilk aşaması Logo 3 Serisi’nin yapılamayacağı veya yapılmaması gerektiğini düşünen arkadaşlarımızı hem teknik olarak yapılabileceğine, hem de yapılması gerektiğine ikna süreci ile geçti.
Artık hepimiz işin yapılması gerektiğinde hemfikirdik. Şimdi sırada işin hangi ekip ile ve nasıl (hangi takvimde) gerçekleştirileceği sorusu vardı. Burada Tuğrul Bey’in aldığı hızlı kararlar ile bir anda Logo-Netsis karması “Milli Takım” oluşturuldu ve genel olarak takvime bağlandı. Hedefimiz kısaca ortak altyapı ile teknik borcu azaltmak; iki ayrı şirket bünyesinde geliştirilmiş ürünlerin aynı ailenin fertleri gibi görünmesini sağlamaktı.
Hasan Odabaşı: En lezzetlisini yemeyi gayret edinen gurme, aklına koyduğunu yapacak kadar inatçı ve yaşamayı çok seven ihtiyar delikanlı. Serhat Ulusoy: Heyecanlı, özgür, sürekli yeni bir şeyler kovalayan ve yapacağım dedikten sonra engellemek biraz zor . Zeki Güven: Çalışkan, sabırlı, dürüst.
Ürünlere uygulanması toplam iki kelime söylemesi kolay ama yapmak pek o kadar kolay olmadı 😊. Temel zorluk, Netsis ve Logo ana ürün ailelerinin Delphi miras kodu olması ve farklı mühendislik yaklaşımları üzerine inşa edilmiş olmasıydı. Bir tanesi “Object Oriented”, diğeri daha çok “Procedural”; her iki yapıya da hizmet edecek ortak yapıların mimari açıdan var edilmesi oldukça zorlu bir süreçti. Her iki ürün ailesi de yaklaşık 5.500.000 satır kod büyüklüğüne sahipti (toplam 11.000.000 satır) ve bu kadar kompleks kodun ürün kararlılığını/tutarlılığını bozmadan yeniden yapılandırılması gerekiyordu. Bunun için öncelikle temel LDesktopBase sınıfı geliştirildi. Nesne tabanlı yaklaşım için virtual metotlar ile genişletilme uçları var edildi ancak procedural yaklaşım için bu mümkün değildi. Bu nedenle benzer bir mekanizma Windows Message yapısı ile implement edildi. Devamın da tekil uygulama ve çoklu DLL yapısındaki uygulama yaklaşımı için ortak yapı kurgulandı. Delphi ile şeffaf form oluşturmak ve ikonları pürüzsüz çizebilmek için oldukça emek harcandı. Ortak menü yapısı ve genel arama fonksiyonları var edildi.Şimdi hedef netti: Bize düşen hedefe koşmak üzere takım arkadaşlarımızı organize etmek ve çalışmaya başlamak! İlk adım UX-kullanıcı deneyimi çalışmasıydı. Emre Senan hocamızın desteği ile öncelikle “Logo Tasarım Kılavuzu” hazırlandı. Sinem Zenginçelebi, Eylül Ertan, Uğur Yıldız ve ürün yöneticisi arkadaşlarımızın yoğun çabası ile (çaba yoğun ise isimleri de yazmak lazım: Ümit Yazan, Berna Tokay, Medi Ventura) ilk kavramsal model var edildi. Daha sonra kullanıcı geri bildirimleri toplandı. Sertaç Tuncel’in ortaya koyduğu efor ile revize edilmiş versiyon tasarlandı ve ürünlere uygulandı.
Windows tema yöneticisi ezilerek görsel tasarım “Logo Tasarım Kılavuzu”’na uygun hale getirildi. Tabii ki bu yapılırken kullanmış olduğumuz dış bileşen setleri ile ilgili tema yönetimini de ezmek zorunda kaldık.
procedure PatchCode(Address: Pointer; const NewCode; Size: Integer); var OldProtect: DWORD; begin if VirtualProtect(Address, Size, PAGE_EXECUTE_READWRITE, OldProtect) then begin Move(NewCode, Address^, Size); FlushInstructionCache(GetCurrentProcess, Address, Size); VirtualProtect(Address, Size, OldProtect, @OldProtect); end; end; procedure RedirectProcedure(OldAddress, NewAddress: Pointer); var NewCode: TInstruction; begin NewCode.Opcode := $E9; // jump relative NewCode.Offset := NativeInt(NewAddress) - NativeInt(OldAddress) - SizeOf(NewCode); PatchCode(OldAddress, NewCode, SizeOf(NewCode)); end;
TdxLayoutLOGOLookAndFeel = class(TdxLayoutStandardLookAndFeel) .. end; TdxLayoutLOGOLookAndFeelClass = class of TdxLayoutLOGOLookAndFeel; TdxLayoutLOGOLookAndFeelGroupOptions = class(TdxLayoutStandardLookAndFeelGroupOptions{TdxLayoutLookAndFeelGroupOptions}) private protected // colors function GetDefaultColor: TColor; override; public constructor Create(ALookAndFeel: TdxCustomLayoutLookAndFeel); override; published end; TdxLayoutGroupLOGOPainter = class(TdxLayoutGroupPainter) ….. end;
function PrintControl(AControl: TWinControl; AList:TList): TBitmap; var DC: HDC; LRect, R:TRect; I:Integer; begin Result := NIL; if not Assigned(AControl) then Exit; Result := TBitmap.Create; LRect:= AControl.BoundsRect; if AList<>NIL then begin for I := 0 to AList.Count-1 do LRect:=TRect.Union(LRect, TWinControl(AList[I]).BoundsRect); end; if (AList=NIL) or (AList.Count=0) then begin try DC := GetWindowDC(AControl.Handle); Result.Width := LRect.Width; //AControl.Width; Result.Height := LRect.Height; //AControl.Height; BitBlt(Result.Canvas.Handle, 0, 0, Result.Width, Result.Height, DC, 0, 0, SrcCopy); finally ReleaseDC(AControl.Handle, DC); end; end else begin Result.Width := LRect.Width; Result.Height := LRect.Height; for I := 0 to AList.Count-1 do begin try DC := GetWindowDC(TWinControl(AList[I]).Handle); R:=TWinControl(AList[I]).BoundsRect; R.Offset(-LRect.Left, -LRect.Top); BitBlt(Result.Canvas.Handle, R.Left, R.Top, R.Width, R.Height, DC, 0, 0, SrcCopy); finally ReleaseDC(TWinControl(AList[I]).Handle, DC); end; end; end; end;
Veya seçilen arka plan resminin renk dağılım analizini yapıp masaüstü font rengine karar veren bir kısayol yönetimi var edildi. Yine çoklu çözünürlük desteği için smooth icon resize algoritması geliştirildi. Bütün bunlar object oriented yaklaşımı içinde LDesktopManager sınıfı ile tek bir çatı altında toplandı (sadece Desktop Manager için 6500 satır kod geliştirildi.) Tasarıma uygun yerleşim yönetimi için LayoutManager implement edildi böylece hem masa üstü deneyimi sağlandı hem de kullanıcı bazında yerleşim kısayollar, iconlar desteklendi. Farklı çözünürlükte kaydedilmiş masa üstleri için auto layout seçeneği ile kullanıcı deneyimi üst noktaya taşındı.
A,B testi yapabilmek için hem eski yapı korundu, hem de lisansa bağlı olarak yeni yapı devreye alındı. Yüzlerce saatlik yoğun emek sonrası aşağıdaki gibi bir değişim/gelişim tamamlandı. Umarım paydaşlarımız bu değişimden memnun olmuşlardır.
Bu internet sitesinde yer alan tüm içerikler, ziyaretçilere bilgi verilmesi amacıyla hazırlanmış olup tavsiye amacı taşımaz. Logo sitede yer alan bilgilerin doğruluğu, güncelliği ve kullanılması konusunda herhangi bir güvence sunmaz. İlgili bilgiler kullanılmadan önce ilgili konu hakkında bir profesyonelle ile görüşülmesi tavsiye edilir. Logo bu sitede yer alan içerikler sebebiyle doğabilecek zararlar bakımından sorumluluk kabul etmez. Lütfen siteyi ve sitedeki bilgileri kullanmadan önce Kullanım Koşulları’nı okuduğunuzdan emin olunuz.
Ürünler hakkında bilgi isteyebilir, demo talebinde bulunabilirsiniz. Uzmanlarımız sizi ihtiyacınıza göre en doğru çözüme yönlendirecektir.