Szakmai önéletrajz

Hogyan is mutathatnánk be a legjobban a technikai kompetenciánkat?!


Egy szakmai önéletrajz C# Fluent API-val kifejtve.



public class ConsultancyService
{
    public void CompleteTask()
    {
        using (Microsoft.NET.Framework)
        {
            MySelf.OnPlatform(Windows.Any)
           .WithLanguage(Languages.CSharp)
            .WithTool(Tools.VisualStudio)
            .Utilizing
            (
                Utilization.Persistence
                    .With(SubSonic.Instance)
                    .Or(LinqToSql.Instance)
                    .Or(FluentNHibernate.Instance)
            )
            .Utilizing(Utilization.WCF)
            .Utilizing
            (
                Utilization.ESB
                    .With(NServiceBus.Instance)
            )
            .Utilizing
            (
                Utilization.IoC
                    .With(CastleWindsor.Instance)
            )
            .ToAbstract<YourDomain>(Model.YourDomainModel)
            .Provides
            (
                Solution<YourRequirement>.WithTesting.Implement().Deploy()
            )
            .Provides
            (
                Solution<YourRefactoringRequirement>.WithTesting.Refactor()
            );
        }
    }
}

Többet mond minden szónál...

Happy Coding!

ASP.NET Modular Composite Pattern, A facebook "pattern"

A facebook  "pattern"

A Modern Kiterjeszthető Webalkalmazásról, avagy az útkeresés...


Az előző postomban arról írtam hogy milyen problémákkal kell szembenézni amikor egy modern, moduláris alkalmazást szeretnénk létrehozni.




A megoldás kutatása közben bukkantam erre a blog-ra (angol nyelvű)

Kivonatolva a bejegyzés lényege:


A modul kisebb funkcionális egység amelyekből többet összerakva a kívánt rendszer felépíthető. A modul üzleti logikát, infrastruktúrát vagy akár felhasználói felületet is definiálhat.

A kompozíció határozza meg illetve definiálja az egyes modulok közti függőségeket valamint a kommunikációt.


A modulok, illetve függőségeinek leírására számtalan módszer áll a rendelkezésünkre, de mindegyik módszernek meg vannak a maga erősségei, illetve gyengeségei.

A Microsoft-os környezetben a Web Client Software Factory áll rendelkezésre

Annak ellenére hogy jó néhány problémára lehet megoldást adni a környezet használatával van egy nagy hiányossága.
Sajnálatos módon ezzel a környezettel sem lehetséges a felhasználói felület moduláris definiciója. (a környezethez adott minta alkalmazás is mindösszesen az üzleti logikára illetve az üzleti logika függőségeire ad választ, de pl az oldalak html (aspx) erőforrásai a runtime futtatási környezetben kerültek definiálásra)

Így sajnos nem lehetséges Valóban moduláris felépítést elérni vele.
(Vessük össze a modul definíciójával: üzleti logika, infrastruktúra, felhasználói felület)



A probléma boncolgatása közben egy lehetséges alternatíva merül fel:

Amennyiben webalkalmazásról beszélünk (márpedig igen) lehetséges a felhasználói felületet iframe struktúrán keresztül dinamikusan beágyazni bármely keretrendszerbe.


A facebook, valamint a facebook alkalmazások tipikus példái ennek a megközelítésnek


Nézzük meg az egyik népszerű facebook alkalmazást (játékot) a zynga által fejlesztett Maffia Wars alkalmazást.

  • iframe-be beágyazva Cross Domain kommunikációval beépül a facebook portálba biztosítva a facebook-os modult.
  • a facebook Single Sign On szolgáltatását felhasználva biztosítja a zökkenő mentes használatot.
  • a facebook szolgáltatás API-ját felhasználva biztosítja az integrációt. (a játékbeli maffián belüli illetve azon kívüli kommunikáció)


Rendszer szinten elemezve:
  • A facebook mint keretrendszer biztosítja az API-t (szolgáltatások) illetve az iframe-et amibe a modul beágyazásra kerül.
  • A modul a facebook-tól függetlenül egy html controller szolgáltatásként kiszolgálja a kéréseket.
  • a két rendszer közti interakciót az iframe-re épülő Cross Site kommunikáció biztosítja.
  • a két rendszer közti kommunikáció a publikált API-ra épülve megoldható.



A megoldás további előnyei:

  • A keretrendszer komplexitását, tesztelhetőségét új modulok hozzáadása nem befolyásolja.
  • A modulok a rendszertől csak annak publikált szolgáltatásain keresztül függnek.
  • Az így felépített portál jól skálázható mind modul, mind keretrendszer szinten.
    Pl: A megnövekedett forgalom új szerverek munkába állításával megoldható, az ehhez szükséges technológia a webkiszolgálók terén adott. (A kapcsolódási pontok a szolgáltatások URL címei mind a két oldalon...)


Lehetséges vitatkozni, tovább elmélkedni ezen a dolgon, de egy dolog bizton állítható:
A megoldás használható lehet lehet egy moduláris alkalmazás felépítéséhez.

A facebook bizonyította:
  • A facebook nem egy kis alkalmazás, 
  • Számtalan alkalmazás (modul) kapcsolódik már most is hozzá. 
  • Sok ember használja (terhelhetőség) nap mint nap



Happy Coding

ASP.NET WebForms vs. Modern Webalkalmazás?

Az ASP.NET WebForms, hogy kicsit szabadosan fogalmazzak szívás!


Tegyük fel hogy szeretném a világ legjobb Webes alkalmazását létrehozni .NET környezetben, ami:

  • könnyen kiterjeszthető
  • könnyen módosítható
  • a felhasználói számára könnyen kezelhető
  • könnyen testre szabható
  • nem utolsó sorban megfelel a mai kor technikai és felhasználói elvárásainak


Én azt állítom, hogy az ASP.NET WebForms erre nem alkalmas eszköz.
A ViewState, a Postback, a Modulok (Pluginok) összehangolt kezelése csak nagy nehézségek árán érhető el vele.


A gond a WebForms-sal hogy nem erre tervezték, bármennyire is igyekszik az ember szépíteni, nem lehet vele olyan moduláris webalkalmazást felépíteni ami megfelel a következő kritériumoknak:
  • Zárt Alkalmazás API,
  • Független Modulok
  • Dinamikusan Betöltött  Modulok (Plugin)
  • Központi Futtatási környezet

Zárt Alkalmazás API:

A legfontosabb megoldandó probléma az üzleti logika definiálása, a modulok interfészeinek definiálása.

Ez ideáig stimmel, sehol sincs ASP.NET a képben.

Független Modulok:

Kezd kissé problémássá válni a helyzet, de nem megoldhatatlan...
Elsőként mi is a modul, mit várunk el tőle?

A Modul olyan alkalmazás rész ami a Core.API-ra épülve annak erőforrásait felhasználva valami hasznos dologgal egészíti ki az alkalmazást.

No de, ha ASP-NET-ről beszélünk akkor elengedhetetlen hogy a kiegészítés mind Üzleti Logika mind pedig Felhasználó felületen megoldható legyen.

Ehhez vegyük hozzá az ASP.NET WebForms felépítését
(gyk: Control Fa -> ViewState -> Postback)
Hogy egy Nyomógombot helyezzünk el a Modul egyik űrlapján biztosítani kell hogy Postback esetében az adott Control a Postback feldolgozásakor is példányosítva legyen.

(Tehát pl. nem lehet a Modul control-t ASP.NET Cache-elt controlba beágyazni, csak akkor ha a beágyazáskor figyelembe vesszük a postback követelményeket is... Ugyanígy kell eljárni akkor is ha N mélységben ágyazunk be Controlokat egy Cache-elt Controlba)


Ha az adott Controlt dinamikusan hoztuk létre egy Másik Control értékére alapozva, a vonatkozott control inicializálása, és felépítése meg kell hogy előzze az adott Modul control felépítését.

Ez utóbbi a ViewState feladata. Mondhatnánk, hogy meg van a megoldás, de sajnos nem teljesen igaz:

Az ASP.NET control inicializálás, kiértékelés több mint nagy figyelmet igényel a Modul felhasználói felületének megtervezésekor.

Elméletben a Modul független. Modulon belül hegesztéssel megoldható a korrekt inicializálás, de a később kifejtett futtatási környezet erről semmit se tud.

Dinamikusan Betöltött Modul - Plugin:

Az adott modul ideális esetben teljesen független minden más modultól, és kizárólag az API-ra épül.
Egy adott modult ideális esetben az API-ra alapozva mások / máskor is létrehozhatnak.


Ezeket a modulokat amit nevezzünk plugin-nak Reflection-nel be lehet tölteni, feltéve hogy a modulok definíciója az API-ban megtörtént.

Így a Runtime az adott interfészeken keresztül tud kommunikálni a Plugin-nal.


De,
mivel ASP.NET-ről van szó biztosítani kell a felhasználói felületet.

Hogyan lehet elérni:
Definiáljunk a Modul ős Controljait a Core.API-ban és rendereljük adott Controlt az ősön keresztül amikor szükséges.

Hogy a kép árnyaltabb legyen, az ASP.NET compiler bizonyos esetekben eléggé szűkszavú tud lenni ami a hibaüzeneteket illeti.


Központi futtatási környezet:

Kell egy webalkalmazás ami az egész rendszer számára biztosítja a példányosítást minden esetben.
(Vizuális felületnél az oldallekérés és postback, üzleti logika esetében pedig az adott szolgáltatások hostolása)

Ezt végezze el mind az API, mind pedig a Modulok / Pluginok esetében


Biztosítsa a lehetőséget hogy a felhasználói felületet dinamikusan építsük fel (CMS)


És a legfontosabb, stabilan valamint skálázhatóan működjön.






Hogy mi is a probléma a fenti rendszerrel?

Működőképesség: megoldható

Átláthatóság: az üzleti logika mindenképpen átlátható, DE
ott van az a fránya ASP.NET WebForms
a Control-jainak az életcikusával, a ViewState-tel és a Postback-kel


Az ASP.NET oldala sajnos mindennek nevezhető csak átláthatónak nem.
Mert az adott modulok Felhasználói felületének működése
  • Függ attól hogy hogyan vannak beágyazva a szölő control-okban.
  • Függ attól hogy hogyan építettük fel a controlt a postbacket megelőzően.
  • Függ a Control ViewState-től (ami nem ér semmit ha nem építettük újra a control fát a posback feldolgozása közben).
  • Nem utolsó sorban függ a szülő Control postback/viewstate feldolgozási állapotától.


Emberi erőforrás igény: legyen egy csapat aki képes időben megoldani, illetve ledokumentálni a fentebb említett rendszert.



Hogy mi lehet a megoldás?!

Az üzleti logika eléréséhez
Rest WCF szolgáltatások a postback "szolgáltatások" helyett...
vagy
Soap WCF szolgáltatások a postback "szolgáltatások" helyett...

Bővebben itt MSDN - WCF


A felhasználói felület definiálására
ASP.NET MVC a WebForms helyett...
vagy
Castle Monorail (Spark View enginnel) a WebForms helyett...

Bővebben itt
ASP.NET MVC
Castle Monorail és Spark View Engine

vagy...


???


Ez egy nem egyszerű kérdés,



Véleményem szerint aki ezt most megoldja azé lesz a jövő generációs web programozása Windows .NET környezetben...



Akármi is lesz a megoldás időtálló megoldás kell!
Az elfogadhatatlan hogy az ember épp mire befejezte a "Nagy" projektet lehet is kezdeni az újraírást mert épp egy újabb technológia jön be és az MS. szépen csendben megszünteti a régebbi technológia támogatását... (épp ahogy történt az asmx webszervízzel napjainkban MSDN WebService (asmx))




Addig is "gyönyörködjük" az ASP.NET webforms lassú kínhalálában...



Happy Coding

Új év, 2010

Új év, új esztendő!

Általában az emberek fogadalmat tesznek, "kommersz" dolgokat ígérnek. Nem hinném hogy nagy baj lenne ez, sőt egy fogadalmat én is teszek az idei évre...

(Ha jobban meggondolom lehetne az bőven több is, de épp elég ha egy fogadalmat nem teljesít az ember)




Én azt fogadom meg hogy minden nap egyre jobban  leszek.
Minden nap.
Egyre jobban.




Persze nem, nem vagyok beteg, és még csak megoldhatatlan problémáim sincsenek.
Egyszerűen annyit ígérek, hogy a 2010-es esztendőben nem fogok az elrontott, elmulasztott dolgok miatt keseregni, sem pedig elégedetlenkedni.


Egy barátom szokta mindig azt mondani ha megkérdezték hogy "hogy van.",
"jobban mint tegnap, egyre jobban..." mondta


Ez több mint puszta udvariassági válasz,
Több mint egyszerű szavak.

Ez Életfelfogás.


Egy szó mint száz, ünnepélyesen ígérem hogy:

Nekem mától kezdve minden nap egy fokkal jobb lesz.

Megfogadom!

Boldog új évet, Boldog 2010-et!