Kortaste återstående körningstid. Schemaläggning (beräkning) Processen att beräkna mängden av något som återstår i tiden


Allt som beskrevs i de flera föregående avsnitten var mer inriktat på vidare forskning kring problemet med processens egen tid och i mycket mindre utsträckning på praktiska tillämpningar. För att fylla denna lucka kommer vi att presentera ett av sätten att beräkna rätt tid för en process baserat på statistiska data om dess utveckling.

Låt oss överväga en endimensionell process, vars tillstånd kännetecknas av en reell variabel x. Låt oss anta att observationer av processens dynamik utförs i astronomisk tid t, så att t = t k och x = x k, k =1, ..., n är fasta observationsmoment och motsvarande värden för processen säger. Det finns många olika matematiska metoder som gör det möjligt att konstruera kurvor som antingen går genom punkterna (t k, Xk) eller ”bästa tillvägagångssätt” till dem. Funktionerna x = x(t) som erhålls på detta sätt ger upphov till intrycket i våra sinnen att processen i fråga beror på himlakropparnas mekaniska rörelse och därför uttrycks dess tillstånd genom den astronomiska tiden t. Denna slutsats skulle kunna beaktas; om ständiga svårigheter inte uppstod när man försökte förutsäga processens vidare förlopp. För ett stort antal olika processer som inte är direkt relaterade till himlakropparnas mekaniska rörelser börjar teoretiska förutsägelser som erhålls med funktionen x = x(t) utanför observationsintervallet avvika signifikant från efterföljande experimentella data. De brukar försöka förklara orsaken till diskrepansen mellan teori och experiment med en misslyckad vald bearbetningsmetod, men detta kanske inte är kärnan i saken.

Alla processer som intresserar oss sker i universum. Han "känner" verkligen inflytandet av himlakroppars rörelse. Denna påverkan kan dock visa sig vara "icke-stel", icke-avgörande. Detta kan i synnerhet yttra sig i det faktum att processens tillstånd vid vissa astronomiska tidsintervall förblir oförändrat. Låt oss i detta avseende komma ihåg det tidigare exemplet på ett stängt tomt rum, isolerat från omvärlden. Låt oss bara låta en levande flyga in i rummet. Under loppet av flera dagar kommer förändringar i tillståndet för "rumfluga"-systemet att bero på flugans rörelser, eftersom förändringar i rummets tillstånd inte kan förväntas. Samtidigt är det svårt att föreställa sig att en flugs beteende är strikt kopplat till den astronomiska tidens förlopp.

Efter att ha gjort en så lång utvikning, låt oss gå vidare till att beskriva algoritmen för att beräkna processens egen tid.

I denna algoritm väljs enheten för beräkning av lokala maxima som ett naturligt mått på tiden. Dessutom beaktas möjliga delar av processens stationära tillstånd, vid vilka, som tidigare noterats, den korrekta tiden stannar. Eftersom identiteten för två tillstånd endast kan sägas inom gränserna för mätnoggrannhet, används i det följande ett visst positivt tal e - det tillåtna mätfelet.

Så indata för algoritmen är det naturliga talet n, det positiva talet 8, arrayer (tk) och (x k), k = 1, ..., n För att underlätta programmeringen presenteras algoritmen i formen av fyra sekventiellt körda moduler.

Modul 1, använder data p, e, t k), (x k), i det allmänna fallet, bildar nya arrayer 7 = (7+ X = (X t) och en mycket specifik medföljande array P = (?), där 1 = 1, ..., t och t<Сп. Основное назначение этого модуля -- выявление в массиве x k) последовательностей идентичных состояний процесса, сохранение первых элементов в таких последовательностях и удаление всех остальных и, наконец, уменьшение по определенному, правилу исходного интервала наблюдения от t до на сумму тех промежутков времени, в которых процесс протекает стационарно.

Modul 1 innehåller följande procedurer:

p: = 1, t: = 0, k: = 1.

I pp. 1, 2 räknare med specifika initiala värden introduceras:

I pp. 3, 4 ökar räknarvärdena med 1.

Kontrollera skick k^n. Om det är klart, gå till steg 6, annars gå till steg 11.

Kontrollera olikheten x k --x k = e Om den håller, gå till steg 7, annars gå till steg 9.

7. tii = ti - (tkl - tk), i = k1, ..., sid.

Denna procedur innebär att om värdena för Xk och Xk 1 inte går att särskilja inom felet, så reduceras alla tidpunkter som börjar från tk med mängden tki-tk.

r = r. Återgå till punkt 4.

TV = tk; Xv:=xk; p = p v = v+l., dvs. element i arrayerna T, X, P bildas och nästa värde v tilldelas.

  • 10. Ta (t k, ..., t n OCH (Xk, - X n) som de ursprungliga matriserna med dimension n--k 1 + 1 och återgå sedan till steg 2.
  • 11. Skriv ut m, (T), (X,) och (P,), där i = l, ..., t.

Låt oss förklara innebörden av elementen i den medföljande arrayen P. Av föregående text följer att värdet på pk är lika med antalet av de element i arrayen (xk) som direkt följer och skiljer sig från x pi+ ... +, + med mindre än e. Vi noterar också att pi+ ... +p m = n.

Exempel 1. Givet: n = 20, (/*) = (2, 4, 7, 10, 12, 13, 15, 17, 20, 22, 24, 25,

  • 27, 30, 32, 33, 34, 35, 36) och (x,)= (4, 4, 6, 6, 6, 3, 2, 4, 3, 3, 3, 2, 2, 4, 5 , 5,
  • 5, 4, 3), se fig. 9, a.

Som ett resultat av exekvering av modul 1 erhålls m = 11,

(G) = (2, 3, 4, 6, 8, 11, 1-2, 15, 17, 18, 19,) = (4, 6, 3, 2, 4, 3, 2; 4,5,4,3)

i(d.) = (2, 4, 1, 1, 1,3, 2, 1,3, 1, 1), se fig. 9, b.

Modul 2. Indata för det är ett naturligt tal m, såväl som arrayer (7+ (X L), = 1, ..., m. Denna modul i arrayen (TJ identifierar tidpunkter [TM a], 1 = 1 m (ml

Exempel 2. Värdena m, (Ть) och (X,] är lånade från föregående exempel. Efter att ha slutfört modul 2 får vi ml = 3, m2 = 8, (Ш,) = (3, 8, 17 ), (Т*) = (3, 4, 6, 8, 11, 12, 15, 17), se även Fig. 9, b.

Modul 3. Indata ml, m2, (TM n), 1 = 1, ..., ml, (G*), /2 = 1, ..., gn2.

Denna modul är utformad för att konstruera en array (t(-r) med hjälp av formeln

Var är TV 6 [TMp, TMn+i]

Variabeln t är den korrekta tid som genereras av förändringen i variabeln x. Dess naturliga mått är enheten för beräkning av lokala maxima.

Exempel 3. Initialdata för T 2) är desamma som värdena för ml, m2 ITM och i exempel 2. . Efter lämpliga beräkningar får vi Н = (0; 0.2; 0.6; 1; 1,33; 1,78; 2).

Modul 4. Genererar resultatet av resultat genom att upprätta en överensstämmelse mellan värdena för m och elementen x från matrisen (xk).

Exempel 4. Baserat på data från exempel 2 och 3 framställs följande resultat, se fig. 9, i:

t: 0; 0,2; 0,6; 1; 1,33; 1,44;

x: 6; 3; 2; 4; 3T 0 2;

Således tillåter den övervägda algoritmen oss att utveckla konceptet för en processs egen tid baserat på information om förändringar i processens tillstånd registrerade på en astronomisk tidsskala. Det är helt klart att man kan använda andra algoritmer, baserade till exempel på att beräkna en sekvens av lokala minima eller en blandad sekvens bestående av lokala maxima och minima. Vid bearbetning av experimentella data bör förmodligen olika alternativ testas. Om försöksledaren av någon anledning valde en av de specifika rätta tidpunkterna och tog emot arrayer (t4 och (xk), bör han i nästa steg använda några matematiska metoder för att approximera experimentpunkterna (t*, x) med någon ungefärlig världslinje av processen x = x(t) Genom att extrapolera denna linje bortom den initiala observationsperioden kan han göra förutsägelser om processens vidare förlopp.

Det är intressant att nämna ett beräkningsexperiment avsett att utvärdera möjligheterna att använda den föreslagna algoritmen. Data om årliga flodflöden valdes som försöksmaterial. Vakhsh (Tadzjikistan) under de senaste 40 åren. Under samma tidsperiod togs information om dynamiken i Wolf-numret - det mest använda integralindexet för solaktivitet. Det senare var grunden för att utveckla den rätta tiden för solaktivitetsprocessen. I modern tid har information om flodutgifter förändrats. Vakhsh och sedan under observationsperioden gavs ett teoretiskt beroende av vattenflödet som en funktion av den korrekta tiden för solaktiviteten. Ett karakteristiskt drag för den resulterande grafen är det nästan periodiska beteendet för maximala och lägsta kostnader. Kostnaderna förblir dock inte konstanta.

Introduktion

Syftet med workshopen om produktionsorganisation är att utöka och fördjupa teoretiska kunskaper, att ingjuta nödvändiga färdigheter för att lösa de vanligaste problemen i praktiken gällande organisation och planering av produktionen.

Workshopen innehåller uppgifter för kursens huvuddelar. I början av varje ämne presenteras korta metodinstruktioner och teoretisk information, typiska problem med lösningar och problem för självständig lösning.

Närvaron av metodologiska instruktioner och kort teoretisk information i varje ämne gör att du kan använda denna workshop för distansundervisning.


Beräkning av produktionscykelns varaktighet

Produktionscykelns varaktighet fungerar som en indikator på effektiviteten i produktionsprocessen.

Produktionscykel– uppehållsperioden för arbetsobjekt i produktionsprocessen från tidpunkten för lansering av råvaror till tidpunkten för frisläppande av färdiga produkter.

Produktionscykeln består av arbetstid, under vilken arbetskraft förbrukas, och paustider. Avbrott, beroende på orsakerna som orsakade dem, kan delas in i:

1) på naturlig eller tekniska - de bestäms av produktens natur;

2) organisatoriska(pauser mellan skift).

Produktionscykelns varaktighet består av följande komponenter:

T cykel = t de där + täter + t tr + t k.k. + t m.o. + t m.ts.

Där t dessa– Tidpunkt för tekniska operationer.

t äter - tid för naturliga processer (torkning, kylning, etc.);

t tr – transporttid för arbetsobjekt;

t k.k. – kvalitetskontrolltid;

t m.o – interoperativ vårdtid;

t m.c. – lagringstid i mellanbutiker;

(t tre t k.k. kan kombineras med t m.o).

Beräkningen av produktionscykeltiden beror på typen av produktion. Vid massproduktion bestäms produktionscykelns varaktighet av den tid produkten är i produktion, d.v.s.

T cykel = t i M,

Där t V– släpp slag;

M– antal jobb.

Under släpp slag det är nödvändigt att förstå tidsintervallet mellan lanseringen av en tillverkad produkt och nästa produkt.

Släppslaget bestäms av formeln

t in = Teff /V,

Där Tef– effektiv fond av arbetstid för faktureringsperioden (skift, dag, år).

I– volym av produktion för samma period (i naturliga enheter).

Exempel: T cm = 8 timmar = 480 min; T per = 30 min; → Teff = 480 – – 30 = 450 min.

B = 225 st; → t in = 450/225 = 2 min.

Vid serieproduktion, där bearbetningen utförs i partier, bestäms varaktigheten av den tekniska cykeln inte per produktenhet, utan för hela partiet. Dessutom, beroende på metoden för att lansera en batch i produktion, får vi olika cykeltider. Det finns tre sätt att flytta produkter i produktionen: sekventiell, parallell och blandad (serieparallell).


jag. På sekventiell Vid rörliga delar börjar varje efterföljande operation först efter att den föregående är klar. Cykelns varaktighet för sekventiell rörelse av delar kommer att vara lika med:

Där n – Antal delar av partiet som bearbetas.

t sti- stycketid för en operation;

C i– antal jobb per i operationen;

m– antal tekniska processoperationer.

Ett parti produkter som består av 5 stycken ges. Satsen passerar sekventiellt genom 4 operationer; varaktigheten av den första operationen är 10 minuter, den andra är 20 minuter, den tredje är 10 minuter, den fjärde är 30 minuter (Fig. 1).

Bild 1

T cykel = T sista = 5·(10+20+10+30) = 350 min.

Den sekventiella metoden med rörliga delar har fördelen att den säkerställer driften av utrustningen utan stillestånd. Men dess nackdel är att produktionscykelns varaktighet i detta fall är den längsta. Dessutom skapas betydande lager av delar på arbetsplatserna, vilket kräver ytterligare produktionsutrymme.

II. På parallell Under förflyttningen av partiet kvarhålls inte enskilda delar på arbetsstationer, utan överförs individuellt till nästa operation omedelbart, utan att vänta på att bearbetningen av hela partiet ska slutföras. Med den parallella förflyttningen av ett parti delar utförs således olika operationer på varje arbetsplats samtidigt på olika delar av samma parti.

Bearbetningstiden för en sats med parallell rörelse av produkter reduceras kraftigt:

dl .

Där n n– antal delar i överföringssats(transportparti), d.v.s. antalet produkter som samtidigt överförs från en operation till en annan;

Längd – den längsta driftscykeln.

Vid parallelllansering av ett parti produkter bearbetas delarna av hela partiet kontinuerligt endast på de arbetsplatser där långa operationer följer korta. I de fall korta operationer följer på långa, d.v.s. längre (i vårt exempel, den tredje operationen), utförs dessa operationer diskontinuerligt, d.v.s. utrustningen är inaktiv. Här kan en sats av delar inte bearbetas omedelbart, utan förseningar, eftersom den tidigare (långa) operationen inte tillåter detta.

I vårt exempel: n= 5, t 1 = 10; t 2 = 20; t 3 = 10; t 4 = 30; Med= 1.

Tånga = 1·(10+20+10+30)+(5-1)·30=70+120 = 190 min.

Låt oss betrakta diagrammet för parallella rörelser av delar (fig. 2):

Figur 2

III. För att eliminera avbrott i behandlingen av enskilda delar av en batch i alla operationer, använd parallell-seriell eller blandad en lanseringsmetod där delar (efter bearbetning) överförs till nästa operation en efter en, eller i form av "transport" partier (flera stycken) på ett sådant sätt att utförandet av operationer inte avbryts på någon arbetsplats. I den blandade metoden tas kontinuiteten i bearbetningen från den sekventiella metoden, och övergången av delen från drift till drift omedelbart efter dess bearbetning tas från den parallella metoden. Med en blandad metod för lansering i produktion, bestäms cykelns varaktighet av formeln

kärna .

var är kor. – den kortaste driftscykeln (av varje par av angränsande operationer).

m-1 antal kombinationer.

Om den efterföljande operationen är längre än den föregående eller lika i tid, startas denna operation individuellt, omedelbart efter bearbetning av den första delen i föregående operation. Om tvärtom den efterföljande operationen är kortare än den föregående, uppstår här avbrott vid stycköverföring. För att förhindra dem är det nödvändigt att ackumulera en transportreserv med en sådan volym som är tillräcklig för att säkerställa arbete vid den efterföljande operationen. För att praktiskt taget hitta denna punkt på grafen är det nödvändigt att överföra den sista delen av partiet och flytta varaktigheten av dess utförande till höger. Bearbetningstiden för alla andra delar i partiet plottas till vänster på grafen. Början av bearbetningen av den första delen indikerar det ögonblick då transporteftersläpningen från den tidigare operationen måste överföras till denna operation.

Om angränsande operationer har samma varaktighet, anses endast en av dem vara kort eller lång (Fig. 3).

Figur 3

T sista paren = 5·(10+20+10+30)-(5-1)·(10+10+10) = 350-120 = 230 min.

De huvudsakliga sätten att minska produktionscykeltiden är:

1) Minska arbetsintensiteten för att tillverka produkter genom att förbättra tillverkningsbarheten för den tillverkade designen, använda datorer och introducera avancerade tekniska processer.

2) Rationell organisation av arbetsprocesser, arrangemang och underhåll av arbetsplatser baserat på specialisering och samarbete, omfattande mekanisering och automatisering av produktionen.

3) Minskning av olika planerade och oplanerade pauser i arbetet baserat på rationell användning av principerna för vetenskaplig organisation av produktionsprocessen.

4) Acceleration av reaktioner till följd av ökande tryck, temperaturer, övergång till en kontinuerlig process m.m.

5) Förbättra processerna för transport, lagring och kontroll och kombinera dem i tid med bearbetning och monteringsprocessen.

Att minska varaktigheten av produktionscykeln är en av de allvarliga uppgifterna med att organisera produktionen, eftersom påverkar omsättningen av rörelsekapital, minskar arbetskostnaderna, minskar lagerutrymmen, transportbehovet m.m.

Uppgifter

1 Bestäm varaktigheten av bearbetningscykeln för 50 delar med sekventiella, parallella och seriell-parallella typer av rörelse i produktionsprocessen. Processen att bearbeta delar består av fem operationer, vars varaktighet är minst: t 1 =2; t 2 =3; t 3 =4; t 4 =1; t 5 = 3. Den andra operationen utförs på två maskiner och var och en av de andra på en. Storleken på överföringspartiet är 4 stycken.

2 Bestäm varaktigheten av bearbetningscykeln av 50 delar med sekventiella, parallella och seriell-parallella typer av rörelse i produktionsprocessen. Processen att bearbeta delar består av fyra operationer, vars varaktighet är minst: t 1 =1; t 2 =4; t 3 =2; t 4 = 6. Den fjärde operationen utförs på två maskiner, och var och en av de andra på en. Storleken på överföringspartiet är 5 stycken.

3 En sats av delar om 200 stycken bearbetas med parallell-sekventiell rörelse under produktionsprocessen. Processen att bearbeta delar består av sex operationer, vars varaktighet är minst: t 1 =8; t 2 =3; t 3 =27; t 4 =6; t 5 =4; t 6 =20. Den tredje operationen utförs på tre maskiner, den sjätte på två och var och en av de återstående operationerna på en maskin. Bestäm hur varaktigheten av bearbetningscykeln för ett parti delar kommer att förändras om den parallellsekventiella versionen av rörelsen i produktionen ersätts med en parallell. Storleken på överföringspartiet är 20 stycken.

4 En sats av delar om 300 stycken bearbetas med parallell-sekventiell rörelse under produktionsprocessen. Processen att bearbeta delar består av sju operationer, vars varaktighet är minst: t 1 =4; t 2 =5; t 3 =7; t 4 =3; t 5 =4; t 6 =5; t 7 = 6. Varje operation utförs på en maskin. Överföringssats - 30 stycken. Som ett resultat av förbättrad produktionsteknik reducerades varaktigheten av den tredje operationen med 3 minuter, den sjunde - med 2 minuter. Bestäm hur bearbetningscykeln för en sats av delar förändras.

5 En sats ämnen bestående av 5 stycken ges. Batchen går igenom 4 operationer: varaktigheten av den första är 10 minuter, den andra är 20 minuter, den tredje är 10 minuter, den fjärde är 30 minuter. Bestäm cykelns längd med analytiska och grafiska metoder med sekventiell rörelse.

6 En sats ämnen som består av fyra delar ges. Batchen går igenom 4 operationer: varaktigheten av den första är 5 minuter, den andra är 10 minuter, den tredje är 5 minuter, den fjärde är 15 minuter. Bestäm cykelns längd med analytiska och grafiska metoder med parallell rörelse.

7 En sats ämnen bestående av 5 stycken ges. Batchen går igenom 4 operationer: varaktigheten av den första är 10 minuter, den andra är 20 minuter, den tredje är 10 minuter, den fjärde är 30 minuter. Bestäm cykelns längd med analytiska och grafiska metoder för seriell-parallell rörelse.

8 Bestäm varaktigheten av den tekniska cykeln för bearbetning av ett parti produkter på 180 stycken. med parallella och sekventiella varianter av dess rörelse. Bygg bearbetningsprocessgrafer. Överlåtelsepartiets storlek är 30 st. Tidsnormerna och antalet jobb i verksamheten är som följer.

En växlad version av den tidigare algoritmen är den kortaste återstående exekveringstidsalgoritmen. Enligt denna algoritm väljer schemaläggaren processen med den kortaste återstående exekveringstiden varje gång. I det här fallet är det också nödvändigt att veta tiden för uppgiftens slutförande i förväg. När en ny uppgift anländer jämförs dess totala exekveringstid med den återstående exekveringstiden för den aktuella uppgiften. Om exekveringstiden för den nya uppgiften är kortare, avbryts den aktuella processen och kontrollen överförs till den nya uppgiften. Detta schema låter dig snabbt betjäna korta förfrågningar.

Planering i tre nivåer

Batchbearbetningssystem tillåter schemaläggning i tre nivåer, som visas i figuren. När nya uppgifter kommer in i systemet placeras de först i en kö som lagras på disken. Inlopp åtkomstschemaläggare väljer en uppgift och överför den till systemet. De återstående uppgifterna ligger kvar i kön.

Så snart ett jobb kommer in i systemet kommer en motsvarande process att skapas för det, och det kan omedelbart börja konkurrera om tillgång till processorn. Det är dock möjligt att det finns för många processer och att de alla inte får plats i minnet, då kommer en del av dem att skickas ut till disk. Den andra nivån av schemaläggning avgör vilka processer som kan lagras i minnet och vilka som kan lagras på disken. Detta är vad han gör minnesschemaläggare .

Minnesschemaläggaren tittar regelbundet på processer på disken för att avgöra vilka som ska flyttas in i minnet. Bland kriterierna som används av schemaläggaren är följande:

1. Hur länge har det gått sedan processen byttes till disk eller laddades från disk?

2. Hur länge har processen använt processorn?

3. Hur stor är processen (små processer stör inte)?

4. Vad är processens betydelse?

Den tredje schemaläggningsnivån är ansvarig för att tillåta processer i redo-tillståndet att komma åt processorn. När vi talar om en "schemaläggare" menar vi vanligtvis CPU-schemaläggare . Denna schemaläggare använder vilken algoritm som helst som är lämplig för situationen, både med och utan avbrott. Vi har redan tittat på några av dessa algoritmer, och vi kommer att bekanta oss med andra senare.

Planering i interaktiva system.

Cyklisk planering.

En av de äldsta, enklaste, rättvisaste och mest använda är den cykliska schemaläggningsalgoritmen. Varje process ges en viss mängd processortid, den så kallade tidsdelen. Om processen fortfarande körs vid slutet av tidsdelen, avslutas den och kontrollen överförs till en annan process. Naturligtvis, om processen blockerar eller avslutas tidigt, sker en kontrollövergång vid denna punkt. Implementeringen av round-robin-schemaläggning är enkel. Schemaläggaren behöver bara upprätthålla en lista över processer i ett klart tillstånd. När en process har nått sin tidsgräns skickas den till slutet av listan.

Den enda intressanta aspekten av denna algoritm är kvantets längd. Att byta från en process till en annan tar lite tid - det är nödvändigt att spara och ladda register och minneskartor, uppdatera tabeller och listor, spara och ladda om minnescachen etc. Slutsatsen kan formuleras på följande sätt: för litet kvantum leder till frekvent processväxling och en liten effektivitet, men ett för stort kvantum kan resultera i långsamma svar på korta interaktiva förfrågningar. Ett kvantvärde på runt 2 0 -5 0 ms är ofta en rimlig kompromiss.

Prioriterad planering.

Round robin-schemaläggning har ett viktigt antagande att alla processer är lika. I situationen med en dator med ett stort antal användare, kanske detta inte är fallet. Till exempel på ett universitet ska dekaner betjänas först, sedan professorer, sekreterare, städare och först sedan studenter. Behovet av att ta hänsyn till sådana externa faktorer leder till prioriteringsplanering. Grundidén är enkel: varje process tilldelas en prioritet och kontrollen överförs till den färdiga processen med högsta prioritet.

Flera köer.

En av de första prioriterade schemaläggarna implementerades i CTSS-systemet (kompatibelt tidsdelat system) Huvudproblemet med CTSS-systemet var att processväxlingen var för långsam, eftersom IBM 7094-datorn bara kunde hålla en process i minnet. Varje switch innebar att den aktuella processen laddades ner till disken

och läsa den nya processen från disken. Utvecklarna av CTSS insåg snabbt att effektiviteten skulle bli större om processorbegränsade processer fick en större tidsdel än om de fick små tidsdelar, men ofta. Å ena sidan kommer detta att minska antalet överföringar från minne till disk, och å andra sidan kommer det att leda till en försämring av svarstiden, som vi redan har sett.

Som ett resultat utvecklades en lösning med prioriterade klasser. Processer i den högst prioriterade klassen tilldelades ett kvantum, processer i nästa klass tilldelades två kvantum, processer i nästa klass tilldelades fyra kvant, etc. När en process hade förbrukat all sin tilldelade tid flyttades den till en lägre klass.

Som ett exempel, tänk på en process som behöver beräkna över 100 kvanta. Först kommer det att ges ett kvantum, sedan kommer det att pumpas till disk. Nästa gång han får 2 kvanta, sedan 4, 8,16, 32, 64, även om han av 64 bara använder 37. I det här fallet kommer endast 7 överföringar (inklusive den initiala laddningen) att behövas istället för 100, vilket skulle vara behövs med hjälp av round-robin-algoritmen. Dessutom, när processen kommer djupare in i prioritetskön, kommer den att starta allt mindre ofta, vilket ger processorn kortare processer.

"Den kortaste processen är nästa"

Eftersom Shortest Task First-algoritmen minimerar den genomsnittliga omloppstiden i batchbearbetningssystem, skulle man vilja använda den i interaktiva system också. Till viss del är detta möjligt. Interaktiva processer följer oftast mönstret av "väntar på ett kommando, utför ett kommando, väntar på ett kommando, utför ett kommando..." Om du behandlar utförandet av varje kommando som en separat uppgift kan du minimera det totala genomsnittliga svaret tid genom att köra den kortaste uppgiften först. Det enda problemet är

är att förstå vilken av vänteprocesserna som är kortast.

En metod bygger på att uppskatta processlängden baserat på processens tidigare beteende. I det här fallet startas processen med den kortaste beräknade tiden. Låt oss anta att den förväntade exekveringstiden för kommandot är T 0 och den förväntade tiden för nästa körning är T 1 . Det är möjligt att förbättra tidsuppskattningen genom att ta den viktade summan av dessa tider aT 0 + (1 - a)T 1 . Genom att välja lämpligt värde för a kan vi tvinga uppskattningsalgoritmen att snabbt glömma tidigare körningar eller, omvänt, att komma ihåg dem under lång tid. Om vi ​​tar a = 1/2 får vi en serie uppskattningar:

T 0, T 0/2 + T 1/2, T 0/4 + T 1/4 + T 2/2, T 0/8 + T 1/8 + T 2/4 + T 3/2.

Efter tre körningar kommer vikten av T 0 i skattningen att minska till 1/8.

Metoden att uppskatta nästa värde i en serie genom ett vägt medelvärde av det tidigare värdet och den tidigare skattningen kallas ofta åldrande. Denna metod är tillämpbar i många situationer där uppskattning från tidigare värden är nödvändig. Det enklaste sättet att implementera åldrande är vid a = 1/2. Vid varje steg du bara behöver

lägg till ett nytt värde till den aktuella skattningen och dela summan på mitten (växling åt höger med 1 bit).

Garanterad planering.

Ett fundamentalt annorlunda tillvägagångssätt för planering är att ge verkliga löften till användarna och sedan leverera på dem. Här är ett löfte som är lätt att säga och lätt att hålla: om du delar en processor med n användare kommer du att få 1/n av processorns kraft.

Och i ett system med en användare och n processorer igång, kommer var och en att få 1/n processorcykler.

För att uppfylla detta löfte måste systemet hålla reda på CPU-allokeringen mellan processer från det ögonblick varje process skapas. Systemet beräknar sedan mängden CPU-resurser som processen är berättigad till, såsom tiden sedan skapandet dividerat med n. Nu kan vi beräkna förhållandet mellan den tid som ges till processen och den tid som den har rätt till. Det resulterande värdet 0,5 betyder att processen bara fick hälften av sitt tilldelade belopp och 2,0 betyder att processen fick dubbelt så mycket som den var tänkt. Därefter påbörjas processen med minsta förhållandet, tills

den blir inte större än sin närmaste grannes.

Lotteriplanering.

Algoritmen bygger på att distribuera lotter till processer för tillgång till olika resurser, inklusive processorn. När planeraren behöver fatta ett beslut väljs en lott ut slumpmässigt och dess ägare får tillgång till resursen. När det gäller CPU-åtkomst kan "lotteriet" ske 50 gånger per sekund, där vinnaren får 20 ms CPU-tid.

Viktigare processer kan ges ytterligare lotter för att öka sannolikheten att vinna. Om det bara finns 100 biljetter och 20 av dem är i en process, kommer den att få 20 % av processortiden. Till skillnad från prioritetsschemaläggaren, där det är mycket svårt att utvärdera vad, säg, prioritet 40 betyder, är allt uppenbart vid lotterischemaläggning. Varje process kommer att få en procentandel av resurserna som är ungefär lika med procentandelen biljetter som den har.

Lotteriplanering har flera intressanta egenskaper. Till exempel, om en process tar emot flera lotter under skapandet, är chanserna att vinna i nästa lotteri proportionella mot antalet lotter.

Kommunikationsprocesser kan byta biljetter om det behövs. Så om en klientprocess skickar ett meddelande till en serverprocess och sedan blockerar, kan den skicka alla sina biljetter till serverprocessen för att öka chansen att servern startar. När serverprocessen är klar kan den returnera alla biljetter.

Rättvis planering.

Hittills har vi antagit att varje process styrs oberoende av vem dess ägare är. Därför, om användare 1 skapar 9 processer och användare 2 - 1 process, då med round-robin-schemaläggning eller i fallet med lika prioriteringar, kommer användare 1 att få 90 % av processorn och användare 2 endast 10.

För att undvika sådana situationer uppmärksammar vissa system ägaren av processen innan schemaläggning. I denna modell får varje användare en viss andel av processorn, och schemaläggaren väljer en process enligt detta faktum. Om i vårt exempel varje användare hade

lovat 50% av processorn, då får de 50% av processorn, oavsett antal processer.

Planering i realtidssystem.

I realtidssystem spelar tiden en viktig roll. Oftast genererar en eller flera externa fysiska enheter ingångssignaler, och datorn måste svara adekvat på dem inom en given tidsperiod.

Realtidssystem är indelade i hårda realtidssystem , vilket innebär förekomsten av strikta deadlines för varje uppgift (de måste uppfyllas), och flexibla realtidssystem , där överträdelser av tidsplanen är oönskade, men acceptabla. I båda fallen är programmet uppdelat i flera processer som var och en är förutsägbar. Dessa processer är oftast korta och slutför sitt arbete inom en sekund. När en extern signal visas är det upp till schemaläggaren att se till att schemat hålls.

Externa händelser som systemet måste reagera på kan delas in i periodisk(förekommer med jämna mellanrum) och icke periodisk(förekommer oförutsägbart). Det kan finnas flera periodiska strömmar av händelser som systemet måste bearbeta. Beroende på hur lång tid det tar att bearbeta varje händelse kanske systemet inte kan bearbeta alla händelser i rätt tid.


Relaterad information.


(tid från arbetet inkluderas tills det är slutfört i fallet med periodisk aktivitet, eller tills systemet svarar och lämnar den första användarutgången i fallet med interaktiv aktivitet); eller maximering rättvisa(lika mängd CPU-tid för varje process, eller mer allmänt motsvarande tider beroende på prioritet och arbetsbelastning för varje process). I praktiken är dessa mål ofta i konflikt (till exempel genomströmning kontra latens), så schemaläggaren kommer att göra en lämplig avvägning. Preferensen mäts av någon av de ovan nämnda frågorna, beroende på användarens behov och mål.

OS/360 och efterföljare

AIX

I AIX version 4 finns det tre möjliga inställningar för trådschemaläggningspolicyn:

  • Först, först ut: När en tråd med den här policyn är schemalagd körs den till slut, såvida den inte är blockerad, den avstår frivilligt från kontrollen över processorn eller så kan en tråd med högre prioritet skickas. Endast trådar med fast prioritet kan ha en FIFO-schemaläggningspolicy.
  • Round Robin: Detta liknar AIX Version 3-kretsschemaläggaren som cyklar baserat på 10ms tidssnitt. När en PP-tråd har kontroll i slutet av en tidslucka, flyttas den till slutet av kön av trådar med samma prioritet. Endast trådar med fast prioritet kan ha en Round Robin-schemaläggningspolicy.
  • ÖVRIGT: Denna policy är implementeringsdefinierad av POSIX1003.4a. I AIX version 4 definieras denna policy som likvärdig med RR, förutom att den gäller icke-fixerade prioritetstrådar. Att räkna om en löpande tråds prioritetsvärde för varje avbrott innebär att en tråd kan tappa kontrollen eftersom dess prioritetsvärde har stigit högre än en annan tråd. Detta är AIX version 3 beteende.

Trådar är främst av intresse för applikationer som för närvarande består av flera asynkrona processer. Dessa applikationer kan lägga en lätt belastning på systemet om de konverteras till en flertrådig struktur.

AIX 5 implementerar följande schemaläggningsprinciper: FIFO, round-robin och fair round-robin. FIFO-policyn består av tre olika implementeringar: FIFO, FIFO2 och FIFO3. Robinens round-robin-policy kallas SCHED_RR i AIX och den rättvisa round-robin-policyn kallas SCHED_OTHER.

Linux

Linux 2.4

Brain Fuck Scheduler (BFS), också skapad av Kolivas, är ett alternativ till CFS.

FreeBSD

FreeBSD använder en återkopplingskö på flera nivåer med prioriteter i intervallet 0-255. 0-63 är reserverade för avbrott, 64-127 för den övre halvan av kärnan, 128-159 för användartrådar i realtid, 160-223 för användartrådar för tidsdelning och 224-255 för inaktiva användartrådar. Liksom Linux använder den också en aktiv köinställning, men den har också en ledig kö.

Ofta blir utvecklare, särskilt oerfarna sådana, förvirrade när de uppmanas att sätta deadlines för att slutföra uppgifter. Förmågan att planera är dock en mycket användbar och nödvändig färdighet som hjälper inte bara i arbetet utan också i livet. Vi bestämde oss för att fråga experterna hur man lär sig att planera rätt och leverera projekt i tid.

Korta slutsatser finns i slutet av artikeln.

En utvecklare behöver vanligtvis ta hänsyn till flera parametrar samtidigt för att uppskatta tiden det tar att slutföra en uppgift:

  1. Erfarenhet av att utföra sådana uppgifter och arbeta med denna teknikstack. Om du måste göra något i grunden nytt måste du vara extra noggrann med din bedömning.
  2. Erfarenhet av att arbeta med denna kund. Genom att känna kunden kan du grovt förutse några ytterligare krav och omfattningen av förändringar.
  3. Kvaliteten på koden du kommer att arbeta med. Detta är den mest inflytelserika faktorn, på grund av vilken allt kan ta lång tid och i allmänhet inte gå enligt plan. Om projektet har tester finns det bara explicita beroenden överallt och funktionaliteten är väl isolerad, allt är inte så skrämmande. Det är mycket värre om du har att göra med äldre kod utan tester eller med kod överbelastad med implicita beroenden. Saker som "magiska funktioner" (när det är svårt att se den slutliga anropsstacken från koden) och kodduplicering (när du behöver redigera flera oberoende sektioner för att ändra viss funktionalitet) kan också komplicera saken.

För att lära dig att på ett adekvat sätt uppskatta arbetsdeadlines måste du ständigt öva. I början av mitt arbete gjorde jag exakt detta: jag uppskattade tiden för att slutföra en inkommande uppgift, även om ingen krävde det, och tittade sedan på hur exakt jag lyckades komma in i min uppskattning. När han slutförde uppgiften noterade han vilka åtgärder som tog längre tid. Om något ökade perioden avsevärt, kom jag ihåg detta ögonblick och tog hänsyn till det i nästa bedömningar.

Till en objektiv bedömning av den tid som krävs enbart för arbete bör en liten marginal läggas till för att täcka force majeure-situationer. Det bedöms ofta som en procentandel av slutförandet av huvuduppgiften, men det är olika för alla: vissa lägger till 20% av tiden, vissa - 10% och några - 50%.

Det är också användbart att analysera orsakerna till missade tidsfrister efter varje allvarlig överträdelse av deadline. Saknar du kvalifikationer måste du arbeta med dina svaga punkter. Om problemet var organisatoriskt, förstå vad som hindrade det från att fungera normalt.

Främja nedflyttning

, teknisk chef för centret för innovativa teknologier och lösningar "Jet Infosystems"

Ett stort antal artiklar ägnas åt metoder för att bedöma ett projekts arbetsintensitet, inklusive arbetets varaktighet och individuella uppgifter. Detta orsakar dock fortfarande konflikter både inom projektteamet och när man kommunicerar med kunden.

Huvudassistent vid bedömning är erfarenhet. Försök att på något sätt jämföra den nya uppgiften med de som redan gjorts. Om du gör en rapport, titta på hur lång tid en liknande rapport tog tidigare. Om du gör något nytt, försök dela upp det i kända delar och utvärdera dem. Om uppgiften är helt ny, avsätt tid för att studera (ännu bättre, samordna denna tid med personen som ställer uppgiften).

Var uppmärksam på de medföljande stegen - om du behöver utveckla en tjänst, då måste bedömningen även omfatta enhetstestning (och kanske inte bara enhetstestning), förberedelsen av testdata kommer att ta lite tid. Du bör överväga integration med andra tjänster etc. Avsätt tid för att åtgärda defekter som du själv eller med hjälp av testare. Mycket tid kan slösas bort på "osynliga" uppgifter. Till exempel finns det en bedömning för utveckling och det finns en bedömning för testning, men överföringen av en artefakt för testning kan innebära utplacering av montrar. Därför är det viktigt att mentalt visualisera hela processen för att inte missa något.

Efter att ha bestämt komplexiteten är det nödvändigt att inkludera nytt arbete i kalendern, inte att glömma andra uppgifter och aktiviteter som går parallellt.

Och glöm inte att planer är värdelösa, men planering är ovärderlig. Lär dig att justera planer i tid, hålla alla inblandade informerade och eskalera i tid så att missade deadlines inte kommer som en överraskning för någon.

Främja nedflyttning

En fråga som inte kan besvaras i kort form. Om det vore enkelt, skulle problemet med att deadlines saknas inte existera.

För att göra utvecklingsdeadlines mer förutsägbara måste vi först förstå orsakerna till varför programmerare gör misstag hela tiden.

Det första skälet är att de flesta av de uppgifter som en programmerare gör är unika i en eller annan grad. Det vill säga, troligen kommer programmeraren att göra en liknande uppgift för första gången. Han har ingen bra uppfattning om hur lång tid det här arbetet kommer att ta. Om detta är en programmerare med gedigen erfarenhet och han var tvungen att utföra en liknande uppgift, kommer hans bedömning att ligga närmare verkligheten.

Låt oss använda en enkel analogi - om du aldrig har grävt diken kan du inte säga exakt hur lång tid det tar att gräva ett dike 30 cm brett, 60 cm djupt och 20 meter långt. Om du har grävt tidigare kommer din uppskattning av arbetstiden att ligga mycket närmare den faktiska varaktigheten av arbetet.

Det andra skälet är att programmerare är optimister av naturen. Det vill säga när utvecklaren överväger en uppgift, väljer ett implementeringsalternativ för den och utvärderar förbättringar, förväntar sig utvecklaren att allt kommer att fungera som han förväntar sig. Och han tänker inte på problemen som han kommer att stöta på på vägen. Ofta kan han inte förutse dem. Till exempel finns det en uppgift som en programmerare kan implementera med hjälp av ett tredjepartsbibliotek med öppen källkod. Vid utvärderingsstadiet hittade han det på Internet, läste dess beskrivning - det passar honom. Och han uppskattade till och med korrekt hur mycket arbete han skulle behöva göra för att bygga upp användningen av detta bibliotek. Men han förutsåg inte alls att ett fel skulle uppstå i detta bibliotek i miljön för hans mjukvaruprodukt.

Utvecklaren måste inte bara bygga in användningen av biblioteket i sin kod, utan också fixa en bugg i själva biblioteket. Och ofta ger utvecklaren inte tid för att rätta till sina misstag. Statistik visar att testning och åtgärdande av fel kan ta upp cirka 50 % av tiden som läggs på kodning. Siffran beror på utvecklarens kvalifikationer, miljön och de utvecklingsmetoder som används (till exempel minskar enhetstester denna tid avsevärt och den slutliga varaktigheten/arbetsintensiteten för utvecklingsuppgiften är mindre).

Om vi ​​återgår till analogin med grävaren så förväntade grävaren inte att hans spade skulle gå sönder och han skulle behöva lägga två timmar på att leta efter en ny stickling.

Det tredje skälet är oförutsedda krav. På inget annat område av materialproduktion, som kunderna är så förtjusta i att jämföra mjukvaruutveckling med, finns det ett sådant flöde av nya krav. Föreställ dig passagen av en grävare som grävde 19 meter av 20 och hörde från kunden en önskan om att diket inte skulle gå i en rak linje, utan i en orm med en armlängd på 97 centimeter.

Hur ska man hantera allt detta och hur man lever under sådana osäkerhetsförhållanden? Minska osäkerheten och bygga in tidsreserver.

Det enklaste sättet att föra dina förväntningar närmare verkligheten är att använda den lekfulla Pi-tumregeln. Efter att ha fått en uppskattning från utvecklaren (i termer av tid eller arbetsintensitet), måste du multiplicera den med Pi (= 3,14159). Ju mer erfaren utvecklaren har gjort bedömningen, desto lägre kan detta förhållande vara.

Det är obligatoriskt att bryta ner det ursprungliga problemet i små uppgifter på högst 4 timmar. Ju mer detaljerad nedbrytningen är, desto större är chansen att uppskattningen kommer att ligga nära den faktiska komplexiteten/varaktigheten.
Om vi ​​återgår till tilldelningen av reserv bör denna tid tilldelas i slutet av projektet. Det är en dålig praxis att göra en reserv och inkludera den för varje uppgift. Parkinsons lag "Arbetet fyller hela tiden som tilldelas det" följs strikt.

För att sammanfatta det kortfattat, för att korrekt bestämma deadlines för att slutföra arbetet, kommer följande åtgärder att vara användbara:

  • utföra en arbetsnedbrytning, dela upp uppgiften i så detaljerade steg som möjligt;
  • utföra prototypframställning;
  • begränsa genomförandet av tidigare oförutsedda krav. Detta betyder inte att de inte bör göras, men det är tillrådligt att lyfta fram dessa krav och komma överens med kunden om ändringar i tidpunkten och kostnaden för deras implementering;
  • ta hänsyn till den tid som krävs för att stabilisera lösningen;
  • använda metoder för att förbättra kodkvaliteten, såsom att skriva enhetstester;
  • fastställa en allmän reserv.

Tja, kom ihåg att om ett faktum överstiger din uppskattning med 30 %, så är detta ett mycket bra resultat.

Främja nedflyttning

För den mest exakta bedömningen behöver du erfarenhet av verklig utveckling, och specifikt inom ett specifikt område. Men det finns också generella regler som hjälper dig att undvika misstag i planeringen och problem när du levererar arbetet till kunden. Jag skulle beskriva dessa regler så här.

Först måste du förstå problemet. Detta verkar uppenbart och har inte direkt samband med tidsuppskattningar, men i själva verket är det en nyckelpunkt. Även i seriösa stora projekt är en av huvudfaktorerna för misslyckande och förseningar problemet med att definiera krav. För nybörjarutvecklare är detta tyvärr ett allvarligt problem - de läser inte de tekniska specifikationerna eller de läser och förstår väldigt selektivt (av tio punkter kom de ihåg och slutförde fem, och kom ihåg resten när de skickade in resultatet). Det är uppenbart att en missförstådd uppgift inte kan genomföras korrekt i tid.

Nästa är att uppskatta själva utvecklingstiden. Det speciella med programmering är att det inte finns några absolut identiska uppgifter. Detta gör vårt arbete mer intressant, men att uppskatta deadlines är svårare. Nedbrytning fungerar bra här, d.v.s. dela upp ett komplext, unikt problem i en sekvens av små, välbekanta deluppgifter. Och var och en av dem kan redan bedömas i timmar ganska adekvat. Låt oss lägga ihop uppskattningarna av deluppgifterna och få en uppskattning för hela uppgiften.

En sådan uppskattning omfattar i regel endast kostnaderna för själva kodningen. Detta är naturligtvis den viktigaste delen av utvecklingen, men långt ifrån den enda (och ofta inte den mest omfattande). Fullständigt slutförande av uppgiften innefattar även att läsa och förtydliga specifikationen, möten med kollegor eller kunden, felsökning och testning, upprättande av dokumentation, leverans av resultatet (demonstration för kunden och eventuella modifieringar utifrån dennes kommentarer). Endast erfarenhet kommer att berätta exakt hur lång tid det kommer att ta dig att slutföra dessa åtgärder. Till en början är det viktigt, åtminstone, att inte glömma att ta hänsyn till dem i beräkningarna, och du kan be mer erfarna kollegor om en ungefärlig uppskattning av tiden.

Så vi tar en uppskattning av arbetskostnaderna för kodning, lägger till en uppskattning av kostnaderna för ytterligare arbete - och vi får den erforderliga uppskattningen av tiden för att slutföra uppgiften. Men det är inte allt! Du måste ange det planerade slutdatumet för uppgiften. Det skulle vara ett misstag att helt enkelt dividera arbetskostnaderna (i timmar) med 8 timmar och lägga dem till det aktuella datumet. I praktiken arbetar en utvecklare aldrig (okej, nästan aldrig) 100 % av tiden med en specifik uppgift. Du kommer definitivt att lägga tid på annat arbete - viktigt, men inte direkt relaterat till det huvudsakliga. Till exempel att hjälpa kollegor, utbilda, skriva rapporter m.m. Vanligtvis, när man planerar, tror man att 60-70 % av arbetstiden går åt direkt till det aktuella projektet. Dessutom måste du ta hänsyn till eventuella förseningar som kommer att hindra dig från att kontinuerligt arbeta med uppgiften. Till exempel, om du för detta behöver interagera med andra människor (kollegor, kunder), ta då hänsyn till deras tillgänglighet, arbetsschema, etc.

Här är de grundläggande reglerna som, enligt min mening, hjälper utvecklaren att undvika problem med att uppskatta och hålla deadlines. Dessutom är nyckeln att samla din egen erfarenhet både av att genomföra uppgifter och i bedömning. Till exempel är det mycket användbart efter att ha slutfört en uppgift att jämföra din första uppskattning med de faktiska deadlines och dra slutsatser för framtiden. Och självklart är det värt att studera andras erfarenheter. Jag skulle rekommendera böckerna om ämnet av S. McConnell "Hur mycket kostar ett programvaruprojekt" och S. Arkhipenkov "Föreläsningar om projektledning för programvara."

Främja nedflyttning

När du beräknar och planerar deadlines måste du:

  1. Dela upp uppgiften i små funktionella delar på ett sådant sätt att det finns en klar förståelse för hur lång tid det kommer att ta att utveckla varje sådan del.
  2. Parallellt med nedbrytningen kommer säkerligen ytterligare frågor att uppstå angående funktionalitet som inte beskrevs i problembeskrivningen. Det är nödvändigt att få svar på sådana frågor, eftersom detta direkt relaterar till omfattningen av arbetet och därför timingen.
  3. Lägg till en viss procentandel av riskerna till den slutliga bedömningen. Detta bestäms empiriskt. Du kan till exempel börja med risker på 10–15 %.
  4. Förstå hur många timmar om dagen en programmerare är villig att ägna åt att slutföra en uppgift.
  5. Vi dividerar den slutliga uppskattningen med antalet timmar vi avsätter per dag och får det antal dagar som krävs för implementering.
  6. Vi fokuserar på kalendern och det antal dagar som krävs för att genomföra. Vi tar hänsyn till helger och andra dagar då programmeraren inte kommer att kunna arbeta med uppgiften, samt startdatumet för arbetet (utvecklaren är inte alltid redo att ta på sig uppgiften samma dag). Därmed får vi start- och slutdatum för arbetet.

Främja nedflyttning

I vårt företag går uppgiftsplaneringen alltid genom flera steg. På affärssidan formulerar vi 5-6 strategiska mål för året. Det här är uppgifter på hög nivå, till exempel att öka någon parameter med så många procent. Därefter formulerar olika divisioner av företaget affärsuppgifter för alla IT-team. Deadlines för dessa uppgifter får en initial grov uppskattning, som ofta bildas av alla teammedlemmar - chef, analytiker, utvecklare och testare. När verksamheten väl fått denna bedömning prioriterar den uppgifter utifrån företagets strategiska mål. Övergripande strategiska mål hjälper till med detta, det blir uppenbart att vi alla arbetar för någon gemensam sak, det finns ingen sådan situation när någon bara drar i sin egen riktning. Vi samlar sprints från uppgifter exakt uppskattade i termer av deadlines. För vissa lag är de kvartalsvis, för andra är de månadsvis. För flera uppgifter som enligt preliminära uppskattningar kommer att falla in i nästa sprint ger teamen en korrekt uppskattning. Stora uppgifter är uppdelade i lägre nivåer, för var och en av dem är en specifik utförare ansvarig, och det är han som ger en korrekt bedömning.

I det här skedet är det viktigt att inte glömma att lägga till en reserv av tid för att fixa buggar, för bara de som inte gör något gör inga misstag. Både produktägare och företagskunder förstår detta mycket väl. Samtidigt måste den tid som krävs vara tillräcklig: ingen kommer att förstå en utvecklare som sätter en deadline för en enkel uppgift som är för lång, han kommer att bli ombedd att motivera beslutet. Det svåraste är att förklara för verksamheten varför det tar tid att omstrukturera. Vi är tacksamma mot vårt företag för att vi då och då lyckas med detta, för i slutändan leder refactoring till förenkling av infrastrukturen och ordning på koden, vilket ökar stabiliteten i systemet och avsevärt kan påskynda utvecklingen av nya funktioner.

Ibland förekommer fortfarande fel i bedömningen. Enligt min mening är det omöjligt för utvecklingsavdelningen i stora företag med utvecklad infrastruktur att helt undvika detta. I det här fallet är det viktigt att utvecklaren omgående informerar sin chef om vad som händer, och han lyckas i sin tur varna verksamheten och "spela om" något i företagets allmänna planer. Att arbeta i det här läget är mycket mer korrekt än att frenetiskt försöka göra det som tar 5 dagar på 3 dagar och sedan drunkna i ett stort antal fel som uppstod på grund av sådan brådska.

Främja nedflyttning

Rätt svar på båda delarna av frågan [hur man lär sig att planera rätt och leverera ett projekt i tid - Röd.] - erfarenhet. Det finns inga andra sätt att "känna Zen." Enligt beslutsteorin kan några korrekta slutsatser endast dras baserat på analysen av ett antal redan tillgängliga data. Och ju mer data det finns, desto mer exakt blir den slutliga prognosen och bedömningen.

Med Herbert Shaws ord: "Erfarenhet är skolan där en man lär sig vilken dåre han var förut." Detta leder till en ganska enkel slutsats: om en programmerare redan har erfarenhet som korrelerar med den aktuella uppgiften, kan han lita på det, om inte, kan han lita på erfarenheten från sina "kollegor".

Därefter måste du förstå att direkt planering av deadlines är en uppgift som människor klarar mycket, mycket dåligt, särskilt i utveckling. Vid uppskattning av förfallodatum anses det vara god praxis att införa "justeringsfaktorer" i den ursprungliga uppskattningen. Detta mått kan variera från 1,5 till 3, beroende på utvecklarens erfarenhet och totala grad av osäkerhet för de uppgifter som löses inom projektet.

Främja nedflyttning

Det är viktigt att ta hänsyn till många faktorer när man bestämmer deadlines.

Till exempel arbetslivserfarenhet. Hur tydligt förstår du omfattningen av det kommande arbetet? Har du gjort något liknande tidigare? Det är klart att ju mer erfarenhet desto snabbare kommer arbetet att slutföras.

En välskriven teknisk specifikation spelar en viktig roll för att fastställa deadlines. Det är väldigt svårt med detta i vårt område. Ofta vet inte kunden själv vad han vill ha, så jag råder att spendera en extra dag eller två, men att få kunden att ha en tydlig uppfattning om det önskade resultatet. Det är viktigt att denna förståelse är ömsesidig. Och först efter detta kan du börja förhandla om beloppet och villkoren.

Inkludera också alltid risker. För nybörjare rekommenderar jag att multiplicera den beräknade slutförandetiden med två. Det är trots allt bättre att leverera ett projekt i förtid och växa som specialist i kundens ögon, snarare än att leverera det senare och förstöra ditt rykte.

Främja nedflyttning

En generell rekommendation är att utvecklaren behöver lära sig hur man korrekt sönderdelar uppgifter, alltid leta efter möjliga fallgropar, lita på sin egen erfarenhet och inte glömma att varna kunder och kollegor i tid om uppgiften inte kan lösas inom den angivna tiden ram.

Att bygga en tydlig plan är mycket svårare än att bestämma deadline för att slutföra en enskild uppgift. Samtidigt är det viktigt att inte bara leverera projektet i tid, utan också att säkerställa att systemet du utvecklar korrekt löser affärsproblem. Här får IT-team hjälp av olika metoder för mjukvaruutveckling: från RUP och MSF till SCRUM och andra Agile-format. Urvalet av verktyg är mycket omfattande och många av våra kunder vill på förhand förstå hur vi kommer att arbeta med dem i projektet, vilka principer vi följer.

Förresten, ämnet Agile i dag börjar bli nära både näringslivet och till och med i enskilda projekt till den offentliga sektorn, eftersom principerna för denna metod gör det möjligt att implementera projekt mycket snabbt och hantera kundernas förväntningar vid varje iteration. Till exempel i ett agilt team finns det praktiskt taget inga utdragna diskussioner med kunden. Glöm dussintals sidor som beskriver onödiga tekniska detaljer, som hur snabbt en rullgardinslista visas. Ge kunden möjlighet att prova en mellanversion av systemet, då blir det mycket lättare för er att förstå varandra.

Agile-teamet planerar allt tillsammans och bestämmer den optimala arbetsnivån som kommer att behövas för att lösa ett visst problem. Till exempel kallas en av teknikerna "Poker Planning", där varje deltagare anonymt ger sin bedömning av de arbetskostnader som krävs för en specifik uppgift. Efter detta bestämmer teamet den genomsnittliga vikten av uppgiften i berättelsepoäng eller mantimmar och fördelar uppgifter enligt principen om "vem gillar vad." Samtidigt samlas teamet varje dag till ett 15-minutersmöte, då alla på ett par minuter pratar om status för sina aktuella uppgifter, inklusive att rapportera eventuella svårigheter som uppstått. Teamet fixar snabbt det upptäckta problemet, så att kunden tittar på nästa steg i programmerarens arbete så snabbt som möjligt. Utvecklare försenar inte slutförandet av uppgifter på grund av en ovilja att besvära laget igen eller meningslösa försök att ta reda på det på egen hand, vilket dödar dyrbar tid. Förresten, vid sådana ministatusar har utvecklare en önskan att visa sin bästa sida, att visa att du närmar dig ditt arbete på ett ansvarsfullt sätt. Det motiverar verkligen och självdisciplinerar.