C# technikai interjú – meddig jutsz el 90 perc alatt?

Az alábbi feladat a jelentkezők gyakorlati tapasztalatát hivatott mérni. A megoldás mindössze 30-40 programsor, így elviekben előfordulhat, hogy valaki 15-20 perc alatt végez. A gyakorlatban azonban a kezdeti bizonytalanság, a vizsgadrukk, illetve bizonyos fokú rutintalanság miatt legtöbben nem fognak végezni 90 perc alatt. Ez nem is elvárt – a problémához való hozzáállás és a megfelelő útkeresés már meggyőző tud lenni egy interjún.

A bemutatott feladat nem feltétlenül tükrözi az EPAM technikai interjú követelményeit.

Ha mégis…

…ledaráltad a feladatot fél óra alatt, vagy szeretnél olyan tapasztalatot szerezni, hogy erre képessé válj, küldd el hozzánk az önéletrajzod!

EPAM_Poster_1000

A forráskód

  • A forráskód letölthető: Proctology.Interview.CSharp.LikeStatistics.zip.
  • A feladat megoldása szempontjából fontos file-ok a MainWindow.cs, illetve a Parsers könyvtár alatti két forrás. A többi forráshoz várhatólag nem kell hozzányúlni:

LikeStatImportantFiles

  • A kód működéséhez szükségesek adatfile-ok, ezek letölthetőek: NetworkData.zip. A zip-et ki kell bontani tetszőleges helyre, a path később a fejlesztett alkalmazásban beállítható.
  • Az alkalmazás WPF alapú, de semmi WPF ismeretre nincs szükség a megoldáshoz, a WPF-es kód érintetlen marad a feladat megoldása során. A WPF csak a keretet adja, hogy a program működhessen.

A feladat leírása

Like Statistics alkalmazás bemutatása

Az alkalmazás egy kapcsolati hálózat adatait dolgozza fel. A célja, hogy mérje, a kapcsolati hálózatban kiket kedvelnek a legjobban. Az alkalmazás véglegesen letisztított adatokból dolgozik. Az adatbázis egy rekordja egy személyhez tartozik, és pusztán a személy nevét, és a személy által kedvelt többi személy nevének listáját tartalmazza:

LikeStatSingleRecord

A fentihez hasonló rekordok halmazából egy hálózat építhető fel aszerint, hogy kit mely másik személyek kedvelnek:

LikeStatSampleNetwork

A fenti ábra alapján Dorsett Yarrow és Barre Covey a legkedveltebb személy.

A Like Statistics alkalmazás több ezer személyből álló adatbázison dolgozik. Az adatbázis file alapú, és több file-ból állhat. Több file esetén minden file egy külön hálózatot ír le, de ez a program működése szempontjából kevéssé érdekes:

LikeStatMultiFileNet

Az alkalmazás beolvassa az adatbázist alkotó összes file-t, majd kielemezve a tartalmát, megjeleníti a tíz legkedveltebb személyt:

LikeStatDataProcessed

Az alkalmazással kapcsolatos feladatok

Az alkalmazás fejlesztését nemrégiben vettük át. Több bővítési és javítási igény érkezett az ügyféltől, ezek leprogramozása a feladat.

Igény 1.

Támogatott adatformátumok kibővítése

Az alkalmazás jelenleg két különböző típusú adatformátumot támogat. Ezek az XML és egy egyedi bináris formátum. Az ügyfél több formátumot szeretne kezelni. Az első fejlesztési igény egy CSV file formátum, melyet a későbbiekben várhatólag további formátumok követnek.

A formátum specifikációja

A CSV adat file a korábban látott rekordok halmazát írja le. Felépítése egyszerű. Ha adott a következő két rekord:

LikeStatCSVRecord

Akkor a CSV file a következőképpen épül fel:

Nazario Hulburt,Dorsett Yarrow,Barre Covey,Herron Dolan
Herron Dolan,Barre Covey

Minden rekordhoz tartozik tehát egy sor a szöveg file-ban. A sor első neve a rekord „Name” mezőjének felel meg. A további nevek a kedvelt személyek listája. A nevek szóköz nélküli vesszővel vannak elválasztva. Az utolsó név után a sorban nincs vessző. A file ASCII kódolású. Egy név mindig szerepel egy sorban, így a Name mező mindig kaphat értéket.

Egyéb tudnivalók

A program felhasználói felülete fel van készítve a CSV file-ok kezelésére, így ennek lefejlesztésével nem kell foglalkozni:

LikeStatCSVPrepared

A program kódjában a következő hívásnál derül ki, hogy a felhasználó melyik formátumot választotta:

LikeStatCodeGetsFormat

A sourceType változó típusa string, és a formátumra jellemző értéket vesz fel, mint „csv”. A forráskód egyszerű felépítésű. A visual studio projekt tartalmaz egy NotImportant mappát, az ebben található állományokra várhatóan nem lesz szükség a feladat megoldása során.

A működő kód jelentős része a MainWindow.cs állományban van. A projekt tartalmaz egy Parsers nevű mappát, itt találhatóak a különböző formátumok feldolgozását végző osztályok:

LikeStatSolExpl

A CsvParser.cs jelenleg nem része a projektnek, ennek létrehozása a feladat része. A parserek felépítése, illetve használata a másik kettő, már implementált parser működése alapján felderíthető.

Igény 2.

Adatbázis felépítésének kibővítése

Az adatbázis file alapú és több file-ból állhat. Az adatbázis útvonala a felhasználói felületen keresztül megadható:

LikeStatDBPath

Az alkalmazás a megadott mappában levő, összes adott kiterjesztésű file-t felolvassa és feldolgozza.

A file-ok száma azonban folyamatosan növekszik, emiatt az ügyfél hierarchikus tárolást szeretne:

LikeStatDBTree

Az alkalmazásnak az adatbázis root mappájából indulva az összes alkönyvtárban lévő file-t fel kell olvasnia.

Egyéb tudnivalók

A program a feldolgozandó file-ok listáját a GetFileList() metódus hívásával szerzi meg:

private IEnumerable<string> GetFileList()
{
    return FileSystem.GetFiles(
                this.GetDatabasePath(),
                this.GetSelectedSourceType());
} // GetFileList()

A filerendszer a programban a FileSystem osztály statikus metódusain keresztül érhető el. Más osztály (System.IO.File, System.IO.Directory) nem használható. A FileSystem a következő két metódussal rendelkezik:

static string[] GetFiles(string path, string extension)
static string[] GetDirectories(string path)

A GetFiles() az adott path-on levő, adott kiterjesztésű összes file nevét visszaadja, full path-szal. A kiterjesztésnek nem kell tartalmaznia a pontot:

FileSystem.GetFiles(@"c:\NetworkData", "csv");
{string[2]}
    [0]: "c:\\NetworkData\\RegionEast.csv"
    [1]: "c:\\NetworkData\\RegionWest.csv"

A GetDirectories() az megadott path alatt levő összes alkönyvtárt adja vissza full path-szal:

FileSystem.GetDirectories(@"c:\NetworkData");
{string[4]}
    [0]: "c:\\NetworkData\\East"
    [1]: "c:\\NetworkData\\North"
    [2]: "c:\\NetworkData\\South"
    [3]: "c:\\NetworkData\\West"

Igény 3.

Feldolgozási sebesség javítása

A növekvő adatmennyiséggel a feldolgozási idő drámai módon, szinte kivárhatatlanul hosszúra növekedett. A feladat a feldolgozó algoritmus javítása.

Igény 4.

Tervezési hibák összegyűjtése

A program felépítése számos tervezési/implementációs problémát rejt magában. A feladat ezek összegyűjtése, és szóbeli bemutatása, javaslattétel a hatékonyabb megoldásokra.

A megoldást…

lépésenként haladava, 1-2 naponta fogjuk megnézni.

  1. #1 by Ozsvárt Károly on 2016. November 19. - 17:11

    Sikerült 60 perc alatt megoldani az első három igényt + a negyedikhez is vannak tippjeim de azt nincs kedvem leírni. Boldog vagyok, mert ezt úgy tudtam megcsinálni hogy nincs különösebb gyakorlatom nagyobb projektekben és még az egyetemmel sem végeztem.

    Nagyszerű volt a feladat, köszi az agytornát!
    (Egyébként a végleges változatom egy ~9 éves gépen ~80-90 ms alatt végezte el a feladatot a 3. igény előtti 8-9 másodperchez képest. Ez jó?)

    • #2 by Peller Viktor on 2016. November 21. - 20:54

      Gratulalok, hogy boldogultal vele! A gyorsulast elnezve gondolom, hogy a szamitast vegzo algoritmust sikerult linearissa alakitanod, ez volt a cel.

  1. C# Tech. interjú – Code Smells - pro C# tology - devPortal
  2. C# Tech. interjú – rekurzív könyvtárbejárás - pro C# tology - devPortal

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: