Aramayı tamamlamak için enter'a basınız.

Bilgi talebi

Yatırımcı ilişkileri
anketi
Dijital danışmana sorun Dijital
danışmana
sorun
Logo Blog
Logo Blog
0

Logo’da Teknoloji: Logo 3 Serisi Ürün Ailesi Doğuyor

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ı.

Milli Takım altyapı kadrosu😊

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.

Bazen işletim sisteminin izin vermediği işlemleri (davranışı değiştirmek için) çalışma zamanında kod yamaladı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;

Bazen bileşen kütüphanelerini ezdik (Developer Express Bileşenleri)

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;

Çoklu masaüstü, menü yönetimi, sürükle bırak gibi ihtiyaçlar için 8.000 satırdan fazla kod geliştirildi. Örneğin sürükleme sırasında nesnenin o anki görüntüsünü alıp kopyalamak için control sanal bir Canvas üzerine çizildi ve buradan elde edilen görüntü “Drag Object” olarak kullanıldı.

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.

İsmail Duran / Yazılım Mimarisi Direktörü