31 januari, 2008

PHP: Arbeta med projekt i PHP

Förord
Tycker ni PHP är häftigt? Vill ni få tips om hur man kan arbeta med PHP som projekt? (t.ex en webbsida, forum, databas, e-handel ...) Har ni svårt att övertala er lärare, om ni nu går i skolan, att ni verkligen vill göra ett projekt med PHP? Då tror jag att denna artikeln kan vara bra för er. Jag ska nämligen tipsa om upplägg, kodning, arbete i grupp, säkerhet (inklusive skyddad kod) och liknande. Jag är ingen utbildad projektledare eller expert inom ämnet utan talar bara efter ren erfarenhet och mindre undersökningar.

Artikeln riktar sig mest till nybörjare men även till dig som redan arbetar i projekt men som vill se efter om det finns några tips att tänka på när man arbetar. Jag vill att så många som möjligt börjar använda PHP på riktigt och inte bara sitter och kodar små skript som sedan inte blir färdiga eller färdiga skript som skickas ut till diverse skriptarkiv. Jag tycker istället att man lär sig PHP ordentligt och sedan satsar på lite större skript efter att man programmerat grundläggande koder. Trevlig läsning!

Introduktion
Om man väjer att göra ett projekt med PHP som exempelvis ett diskussionsforum, statistikapplikation, nätverksövervakning, en webbsida för e-handel, rapporthantering, webbmail, en sökmotor, databashantering, databaslagring av information, fakturor och offerter, beställningar, eller liknande, så används nästan alltid samma arbetssätt och utvecklingmetoder. Men hur lyckas man med detta? Det finns många olika sätt att lösa problemen på och det är stor chans att ni får utveckla och komma på ett eget sätt för att åstadkomma ert projektmål, men sammanfattat kan jag säga att det egentligen inte finns ett "korrekt" sätt. Om ni använder ett sätt som fungerar com ni tycker är bra så tycker jag att ni borde fortsätta med det tills ni möter motgångar.

Det finns regler som helst bör följas när man arbetar med projekt, både stora som små, men om man utvecklar (i fortsättningen av artikeln kommer jag skriva utveckling som synonym till programmering) till exempel en tjänst eller en vanlig webbsida måste man även tänka på sådant som underlättar utvecklingen för samtliga parter i projektgruppen.

Upplägg
När ni har kommit på vad det är för projekt ni vill göra och tänkt igenom det noggrannt som kommer ni till hur ni ska lägga upp arbetet. Visst att ni redan har en projektplanering och en lista över sysslor och liknande men har ni tänkt på allt förarbete? När man ska arbeta med ett projekt inom utveckling är det viktigt att man först skriver upp minsta lilla krav. Detta hoppas jag ni redan har gjort i er kravlista för projektet. Detta är mycket viktigt eftersom när man väl börjar utveckla sitt projekt kan det vara knappt med tid och då är det bra att ha en kravlista med prioriteringar över vad som är viktigast för att projektet ska fungera. Har ni (eller du om du är ensam) de kunskaper som krävs för att nå projektmålet? När detta är igenomtänkt kan man sedan utesluta några punkter tills man känner att man har mera tid och man är säker på att man kommer nå sitt huvudmål nummer 1.

Det viktigaste man kan tänka på om man designar en typ av webbsida/webbtjänst är att skissa upp så mycket som möjligt på ett papper, måla modeller, använd t.ex Microsoft Visio för att visa ett händelseförlopp eller hur allt fungerar tillsammans. Webbdesignen bör skissas på några papper först så att alla får en klar bild över design och eventuell funktion. De som kodar i PHP kan diskuttera om huruvuda man ska använda redan befintliga skriptbibliotek, vilka tillägg som krävs i projektet (t.ex GD2, MySQL, eller kanske ReWriteRule i Apache). I ett projekt där man utvecklar en typ av webbsida så går nästan all tid åt till förarbete och forskning av lösningar och idéer. Mycket brainstorming samt hur mycket tid man har på sig inför varje delmoment. När allt detta sedan är klart är det bara att börja med utvecklingen, vilket inte brukar vara så svårt, eller ta så lång tid att utföra. Utvecklingen i ett projekt brukar ta cirka 20-30% av tiden men det beror givetvis även på vilket typ av projekt man tänker göra. Det är i alla fall ett estimerat värde ni kan använda i er utvecklingsprocess och förarbete.

Hur har ni tänkt dela upp arbetet?
Är ni en som designar webbsidan och designen, en som utvecklar koden i PHP, en som hanterar databasen eller filsystemet för lagring, eller är ni helt enkelt flera som arbetar inom samma område, och i så fall, arbetar ni på samma kod? Vet ni hur ni ska koppla ihop allt för att nå en slutgiltig produkt? I vilket fall kan det vara svårt att samarbeta om man inte har en väl utformad stategi för hur man ska dela upp arbetet. Det måste tydligt framgå vem som gör vad och att personen eller personerna i fråga verkligen gör det han eller hon har blivit tilldelad och inget annat.

När detta är uppklarat så kan det uppstå vissa problem. Om man är ensam så är problemen tydliga om man inte är mycket väl förberedd. Det kan vara svårt att utvärdera sin kod och fråga efter hjälp och stöd från andra plus att det är ett enormt jobb att ha koll på allt så att allt fungerar tillsammans. Det är inte omöjligt men definitivt en utmaning. Är man två eller fler så uppstår tydliga problem om någon part inte kan eller förstår den andra partens uppgift och lösningar. Ett exempel är att en person designar en webbsida (som inte kan PHP) där det sedan krävs PHP för att utföra specifika uppgifter på serversidan som sedan kommer visa ett resultat på sidan. Detta är det en annan person som arbetar med och en lösning arbetas fram. Problemet uppstår då detta slås samman; design (logik) med funktion. På sidan, tillsammans med HTML koden, visas även PHP som inte webbdesignern förstår. Om sedan designen kanske måste ändras eller om något liknande måste modifieras så kan han eller hon råka komma åt PHP koden och ändra- eller radera något av misstag. Koden kanske måste flyttas men det kan vara svårt om koden har anpassats för just den positionen (från t.ex en tabell till en annorlunda tabell eller div). Om inte webbdesignern förstår koden kan det bli krångligt plus att det blir rörigt och osmidigt med en massa PHP kod som är nästlat i HTML koden för webbsidan. För att lösa detta problem måste kan man börja med att separera logik från funktion, med andra ord "design från PHP". Detta kan göras med hjälp av ett så kallat "Template"-system eller mallar.

Hur fungerar ett "Template"-system eller mallar?
Det fungerar som så att på de platser på webbsidan där PHP måste användas för att visa information eller liknande (från t.ex ett register i en databas) ska visas eller upprepas kan man använda ett system som använder Nyckelord - speciella fraser. En sådan fras eller nyckelord kan t.ex se ut så här
  • {example_show_username}
  • [example_show_username]
  • |example_show_username|
  • (detta var bara exempel)
När mallen har fyllts med dessa på strategiska platser används ett mycket enkelt PHP skript som inkluderas med en rad kod som är enkel att förstå:
  • require_once(templatesystem.php)
  • include_once(templatesystem.php)
Det skriptet gör är att det hämtar mallen för att sedan söka upp valda nyckelord och ersätta dessa med text, bilder, varor, kommentarer, statistik eller liknande. Efter att mallen har uppdaterats med ny information skickas den till webbläsaren och den visas för slutanvändaren.

Ett populärt system som utför detta heter Smarty men det finns även många andra. Själv utvecklade jag en egen så kallad "Template-engine" för ett projekt eftersom jag inte hade tid att lära mig Smarty. Googla eller läs om det på Wikipedia för att veta mer.

Hur man kan flera personer modifiera en och samma fil samtidigt och få det rätt?
Låt oss säga att ni är två eller fler inom samma område (t.ex PHP utvecklingen), sitter och uppdaterar kod i samma skript hemma eller på jobbet som de andra, och sedan laddar upp det till projektet på servern för att se om det fungerar. Vad tror ni händer, eller kan hända? Det värsta är att en annans lösning skrivs över med kod som inte fungerar som tänkt och viktig tid har gått till spillo. Det kan också vara att två stycken sitter med samma problem och kommer upp med olika lösningar. Eller så ändrar man kod på ett annat ställe än vad det från början var tänkt. Då är nu den stora frågan: hur har man kontroll över detta för att minska eventuella problem och tiden det tar att återställa allt om det blir fel?

Lösningen på problemet som används nästan överallt i nästan varenda projekt är CVS-hantering. CVS står för "Concurrent Versions System" och hjälper till under utvecklingsprocesser för att spåra eventuella ändringar gjorda av en eller flera medlemmar i projektgruppen eller från allmänheten. Man kan enkelt se vad som har ändrats och av vem. Det är också även enklare att utvärdera flera lösningar på ett problem. Googla på CVS eller kolla upp det på Wikipedida. Kan tipsa om programmet Subversion.

Kodning
Okej, så ni har ordnat så att ert arbete är ihopkopplat, men hur ser koden ut? Är den väl kommenterad eller snabbt ihopkodad? Används samma kodstil utöver hela projektet; även kallat för kodkonvention (viktigt om ni är fler än en inom ett och samma område)? Är koden säker (mer om detta lite senare i artikeln)? I vilket fall gäller det att tänka till ordentligt. Det är bra att tänka på att någon annan redan kanske har löst ett visst problem. Kolla upp det så ni slipper "... uppfinna hjulet på nytt".

Tänk även enligt en MVC (Model View Controller) modell - ett bra sätt att dela upp funktion (kod) i olika delar som är väldigt flexibelt. Googla eller sök på Wikipedia om ni vill veta mer.

Om två stycken inom samma område arbetar i en speciell fil och utvecklar på två olika sätt. Då får man oftast mycket svårläst kod och det kan faktiskt vara svårare att förstå vad koden utför om man inte är van vid just den kodstilen - kodkonventionen. För att undvika detta är det viktigt att komma överrens om en gemensam kodkonvention som används utöver hela projektet. Det blir enklare för alla i projektgruppen att läsa och förstå koden samt att man får bättre struktur. Här nedanför kommer exempel på tre olika kodkonventioner som är vanliga:

Exempel 1
<?php
// Check if bla bla is true and then do that bla bla
if (true) callFunctionHere();
else callOtherFunctionHere();
?>


Exempel 2
<?php
if (true) {
callfunctionhere();// do something not so cool
} else {
callotherfunctionhere();//do something cool
}
?>


Exempel 3
<?php
if (true)
{
// Do important thing
call_function_here();
}
else
{
// Not so very important
call_other_function_here();
}
?>

Kan ni se skillnaderna? Jag hoppas ni gör det och att ni sedan bestämmer en gemensam kodkonvention som jag nämnde tidigare.

Arbeta i grupp
Grupparbete är väldigt vanligt när man arbetar med projektarbeten och det är många som tycker det är bra. Men det finns även de som aboslut inte tycker om att arbeta i grupp och då kan det vara svårt att kommunicera med parterna i gruppen eller komma fram till slutgiltiga beslut. Planeringen kan då bli svårt att få optimerad eftersom man kanske inte föra en diskussion med de involverade medlemmarna.

För att försöka lösa dessa problem måste man lära sig att börja tänka tillsammans - dela era åsikter med hela gruppen och lämna aldrig någon utanför. Ni är en grupp och då ska alla få ta del av all information som är nödvändig för att man ska nå projektmålet (eller deadline!). Man kan även i början hitta på aktiviteter någon dag eller två; kanske gå ut på stan och roa sig, umgås, prata och ta reda på lite information om varandra, eller ta en middag. Hitta gärna på minst en aktivitet som kräver samarbete två och två eller hela gruppen tillsammans.

När ni väl har gjort detta så kan ni sätta upp små delmål med projektet som måste nås för att klara av sin planering, om ni inte redan har gjort detta. När eller om ni når ett delmål får ni gärna belöna hela gruppen. Då är chansen större att man peppas inför nästa steg i utveckligen.

Handledning
Tala ofta med gruppens handledare för att ge statusrapporter och för att komma igång snabbt med arbetet i början. Om man vet att man måste visa upp sitt resultat så långt i arbetet för sin handledare brukar man få ett stadig flöde av arberskraft. Alla personer i gruppen gör sina delar för att sedan visa upp eller utvärderas inför nästa steg.

Om man talar med en handledare kan man också reda ut eventuella problem som gruppen har eller ställa lite mer allmänna frågor.

Projektrapport och loggbok
Detta kommer jag inte gå igenom eftersom ni redan borde kunna detta men det är en mycket viktig sak jag måste tipsa er om. Bara för att ni kan webbdesign, databashantering och PHP så är det inte säkert att er lärare/instruktör/chef kan detta. Förklara därför först väldigt ingående varför ni har valt att göra på vissa sätt, hur det fungerar och vad ni förväntar er av projektet. Ni behöver inte lära han/hon allt om PHP utan istället bara förklara enkla grunder och principer: till exempel att PHP används på serversidan för att utföra speciella viktiga uppgifter som t.ex hämta informationen ni har lagrat i en databas och sedan skicka detta till designmallen som senare omvandlas till en komplett webbsida. Det viktigaste är betoningen av Varför!

Säkerhet i PHP
När man arbetar med PHP är det även viktigt med säkerhet. Ofta när man arbetar med projekt (större arbeten) så brukar man skippa säkerheten i början för att sedan försöka implementera det när man har nått sitt mål. Detta gör man för att spara tid eftersom det alltid finns säkerhetsbrister som måste lösas, även om man redan har gjort klart projektet och implementerat viss säkerhet. Det uppstår hela tiden nya hot.

Om man börjar implementera säkerhetsrutiner när projektet är klart så är det lätt att man missar något litet som man tänkte på när man utvecklade just den koden, men som man har glömt vid projektets slut. En enkel lösning på detta är att antingen låta en tredje part - någon ni känner som har kunskaper inom PHP och säkerhet - få undersöka er kod. En annan lösning är att ni själva låter implementera säkerhet i koden vid varje delmål. Ni behöver inte skydda allt men använd i alla fall grundläggande säkerhet som att t.ex endast tillåta heltal om ni förväntar er ett heltal.

I framtiden kommer jag skriva några artiklar här på bloggen om säkerhet i PHP och vad man ska tänka på. Tills vidare kan ni söka efter det ämnet på Google.

Slutord
Så där... har ni lärt er något nytt eller har något klarnat nu som har legat dolt i er sinne? Jag hoppas i alla fall att ni har lärt er något som kan vara användbart i framtida projekt med PHP och att om ni arbetar i grupp har lärt er samarbete på högsta nivå.

Se inte problemen - se lösningarna. Om ni fastnar med något för länge så fortsätt med något annat istället. Om ni fastnar vi ett speciellt problem kan ni testa ta en paus och/eller börja tala med någon i er närnet om problemet så kanske ni till slut kommer fram till en lösning efter att sinnet har klarnat litegrann. Hjärnan måste också vila ibland.

Detta är en artikel om hur man "kan" arbeta med projekt i PHP och vad man bör tänka på under tiden och innan man väl har börjat. Själv har jag arbetat med ett par projekt, vilka två av dem har varit riktigt stora och mödosamma. Jag har arbetat både själv och i grupp och det har varit lärorikt - mycket lärorikt.

För att citera mig själv:
"Jag är ingen utbildad projektledare eller expert inom ämnet utan talar bara efter ren erfarenhet och mindre undersökningar. Jag skriver detta för att tipsa er alla och för att även tipsa och hjälpa mig själv vid framtida projekt i PHP. Jag vill dela med mig av min kunskap för att underlätta för andra."

Källor
Smarty - Template Engine
CVS - Concurrent Versions System
Subversion - CVS Application (v1.4.6 datum 080201)
Wikipedia: CVS
MVC Programmering i PHP
Gymnasial utbildning - Projektarbete (skolverket)

Inga kommentarer:

Välkomna till bloggen

Välkomna ska ni vara kära besökare. Jag skriver om IT för att det är kul och för att jag vill dela med mig av information och kunskap. Jag försöker hålla bloggen så kategoriserad som möjligt för att ni enklare ska hitta intressanta länkar och artiklar.