Tempo di esecuzione rimanente più breve. Pianificazione (informatica) Il processo di calcolo della quantità di qualcosa che rimane nel tempo


Tutto quanto descritto nei vari paragrafi precedenti era più orientato ad ulteriori ricerche sul problema dei tempi propri del processo e in misura molto minore sulle applicazioni pratiche. Colmando questa lacuna, presenteremo uno dei modi per calcolare il tempo proprio di un processo basandosi su dati statistici sulla sua evoluzione.

Consideriamo un processo unidimensionale, il cui stato è caratterizzato da una variabile reale x. Supponiamo che le osservazioni della dinamica del processo siano effettuate in tempo astronomico t, in modo che t = t k e x = x k, k =1, ..., n siano momenti fissi di osservazione e i corrispondenti valori di recita il processo. Esistono molti metodi matematici diversi che rendono possibile costruire curve che passano attraverso i punti (t k, Xk) o "l'approccio migliore" ad essi. Le funzioni x = x(t) così ottenute fanno sorgere nella nostra mente l'impressione che il processo in esame dipenda dal movimento meccanico dei corpi celesti e, quindi, il suo stato sia espresso attraverso il tempo astronomico t. Questa conclusione potrebbe essere presa in considerazione; se non si presentassero difficoltà costanti nel tentativo di prevedere l'ulteriore corso del processo. Per un gran numero di processi diversi che non sono direttamente correlati ai movimenti meccanici dei corpi celesti, le previsioni teoriche ottenute utilizzando la funzione x = x(t) al di fuori dell'intervallo di osservazione iniziano a discostarsi significativamente dai successivi dati sperimentali. Di solito cercano di spiegare il motivo della discrepanza tra teoria ed esperimento con un metodo di elaborazione selezionato senza successo, ma questa potrebbe non essere l'essenza della questione.

Qualsiasi processo che ci interessa avviene nell'Universo. Certamente “sente” l'influenza del movimento dei corpi celesti. Tuttavia, questa influenza può rivelarsi “non rigida”, non determinante. Ciò, in particolare, può manifestarsi nel fatto che a determinati intervalli di tempo astronomico lo stato del processo rimane invariato. A questo proposito, ricordiamo l'esempio precedente di una stanza vuota chiusa, isolata dal mondo esterno. Lasciamo che ne voli uno solo nella stanza. Nel corso di più giorni, i cambiamenti dello stato del sistema “room-fly” dipenderanno dai movimenti della mosca, poiché non si possono prevedere cambiamenti dello stato della stanza. Allo stesso tempo, è difficile immaginare che il comportamento della mosca sia strettamente correlato al corso del tempo astronomico.

Dopo aver fatto una digressione così lunga, passiamo a descrivere l’algoritmo per il calcolo del tempo proprio del processo.

In questo algoritmo, l'unità per il calcolo dei massimi locali viene scelta come misura naturale del tempo. Inoltre, vengono prese in considerazione le possibili sezioni dello stato stazionario del processo, in cui, come notato in precedenza, si ferma il tempo proprio. Poiché l'identità di due stati può essere definita solo entro i limiti della precisione di misurazione, di seguito viene utilizzato un certo numero positivo e: l'errore di misurazione consentito.

Quindi, i dati di input per l'algoritmo sono il numero naturale n, il numero positivo 8, gli array (tk) e (x k), k = 1, ..., n. Per facilità di programmazione, l'algoritmo è presentato nel formato di quattro moduli eseguiti in sequenza.

Modulo 1, utilizzando i dati p, e, t k), (x k), nel caso generale, forma nuovi array 7 = (7+ X = (X t) e un array di accompagnamento molto specifico P = (?), dove 1 = 1, ..., t e t<Сп. Основное назначение этого модуля -- выявление в массиве x k) последовательностей идентичных состояний процесса, сохранение первых элементов в таких последовательностях и удаление всех остальных и, наконец, уменьшение по определенному, правилу исходного интервала наблюдения от t до на сумму тех промежутков времени, в которых процесс протекает стационарно.

Il Modulo 1 comprende le seguenti procedure:

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

Alle pagg. 1, 2 vengono introdotti contatori con valori iniziali specifici:

Alle pagg. 3, 4 i valori del contatore aumentano di 1.

Controllare la condizione k^n. Se è completata, vai al passo 6, altrimenti vai al passo 11.

Controlla la disuguaglianza x k --x k = e. Se vale, vai al passaggio 7, altrimenti vai al passaggio 9.

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

Questa procedura significa che se i valori di Xk e Xk 1 sono indistinguibili all'interno dell'errore, allora tutti i punti temporali a partire da tk vengono ridotti della quantità tki-tk.

r = r. Ritorna al punto 4.

Tv = tk; Xv:=xk ; p = p v = v+l., cioè vengono formati gli elementi degli array T, X, P e viene assegnato il valore successivo v.

  • 10. Prendi (t k, ..., t n AND (Xk, - X n) come array originali di dimensione n--k 1 + 1 e poi torna al passaggio 2.
  • 11. Stampa m, (T), (X,) e (P,), dove i = l, ..., t.

Spieghiamo il significato degli elementi dell'array associato P. Dal testo precedente segue che il valore di pk è uguale al numero di quegli elementi dell'array (xk) che seguono direttamente e differiscono da x pi+ ... +, + per meno di e Notiamo anche che pi+ ... +p m = n.

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

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

Come risultato dell'esecuzione del modulo 1, si ottiene m = 11,

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

i(d.) = (2, 4, 1, 1, 1.3, 2, 1.3, 1, 1), vedere fig. 9, b.

Modulo 2. I dati di input per esso sono un numero naturale m, così come gli array (7+ (X L), = 1, ..., m. Questo modulo nell'array (TJ identifica i momenti di tempo [TM a], 1 = 1 m (ml

Esempio 2. I valori m, (Ть) e (X,] sono presi in prestito dall'esempio precedente. Dopo aver completato il modulo 2, otteniamo ml = 3, m2 = 8, (Ш,) = (3, 8, 17 ), (Т*) = (3, 4, 6, 8, 11, 12, 15, 17), vedere anche Fig. 9, b.

Modulo 3. Immettere i dati ml, m2, (TM n), 1 = 1, ..., ml, (G*), /2 = 1, ..., gn2.

Questo modulo è progettato per costruire un array (t(-r) utilizzando la formula

Dov'è TV 6 [TMp, TMn+i]

La variabile t è il tempo proprio generato dalla variazione della variabile x. La sua misura naturale è l'unità per il calcolo dei massimi locali.

Esempio 3. I dati iniziali per T 2) sono gli stessi dei valori di ml, m2 ITM e nell'esempio 2. . Dopo gli opportuni calcoli otteniamo Í = (0; 0,2; 0,6; 1; 1,33; 1,78; 2).

Modulo 4. Genera l'output dei risultati stabilendo una corrispondenza tra i valori di m e gli elementi x dell'array (xk).

Esempio 4. Sulla base dei dati degli esempi 2 e 3, viene prodotto il seguente risultato, vedere fig. 9, in:

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

x: 6; 3; 2; 4; 3T02;

Pertanto, l’algoritmo considerato ci consente di sviluppare il concetto del tempo proprio di un processo sulla base delle informazioni sui cambiamenti nello stato del processo registrati su una scala temporale astronomica. È abbastanza chiaro che si possono utilizzare altri algoritmi, basati, ad esempio, sul calcolo di una sequenza di minimi locali o di una sequenza mista composta da massimi e minimi locali. Quando si elaborano i dati sperimentali, probabilmente dovrebbero essere testate varie opzioni. Se per qualche motivo lo sperimentatore scegliesse uno dei tempi propri specifici e ricevesse le matrici (t4 e (xk), nella fase successiva dovrebbe utilizzare alcuni metodi matematici per approssimare i punti sperimentali (t*, x) mediante una linea d'universo approssimativa del processo x = x(t). Estrapolando questa linea oltre il periodo di osservazione iniziale, può fare previsioni sull'ulteriore andamento del processo.

È interessante citare un esperimento computazionale volto a valutare le prospettive di utilizzo dell'algoritmo proposto. Come materiale sperimentale sono stati scelti i dati sulle portate annuali dei fiumi. Vakhsh (Tagikistan) negli ultimi 40 anni. Nello stesso periodo sono state raccolte informazioni sulla dinamica del numero di Wolf, l'indice integrale dell'attività solare più comunemente utilizzato. Quest'ultimo è stato la base per sviluppare il momento opportuno del processo di attività solare. Nei tempi moderni, le informazioni sulle spese fluviali sono state trasformate. Vakhsh e poi durante il periodo di osservazione è stata data una dipendenza teorica del flusso d'acqua in funzione del momento opportuno dell'attività solare. Una caratteristica del grafico risultante è il comportamento quasi periodico delle spese massime e minime. I costi, tuttavia, non rimangono costanti.

Introduzione

Lo scopo del workshop sull'organizzazione della produzione è quello di ampliare e approfondire le conoscenze teoriche, per infondere le competenze necessarie per risolvere i problemi più frequenti riscontrati nella pratica riguardanti l'organizzazione e la pianificazione della produzione.

Il workshop prevede attività per le sezioni principali del corso. All'inizio di ogni argomento vengono presentate brevi istruzioni metodologiche e informazioni teoriche, problemi tipici con soluzioni e problemi per soluzione indipendente.

La presenza di istruzioni metodologiche e brevi informazioni teoriche in ciascun argomento consente di utilizzare questo laboratorio per la formazione a distanza.


Calcolo della durata del ciclo produttivo

La durata del ciclo produttivo funge da indicatore dell'efficienza del processo produttivo.

Ciclo produttivo– il periodo di permanenza degli oggetti di lavoro nel processo di produzione dal momento del lancio delle materie prime fino al momento del rilascio dei prodotti finiti.

Il ciclo produttivo è composto da orari di lavoro, durante il quale viene speso il lavoro, e tempi di pausa. Le pause, a seconda dei motivi che le hanno provocate, possono essere suddivise in:

1) su naturale o tecnologici: sono determinati dalla natura del prodotto;

2) organizzativo(pause tra un turno e l'altro).

La durata del ciclo produttivo è costituita dalle seguenti componenti:

Ciclo T = T quelli + T mangia + T tr+ T k.k. + T m.o. + T m.ts.

Dove T quelli– momento delle operazioni tecnologiche;

t mangia - tempo dei processi naturali (essiccazione, raffreddamento, ecc.);

t tr – tempo di trasporto degli oggetti di lavoro;

t k.k. – tempo di controllo qualità;

t m.o – tempo di cura interoperatoria;

t m.c. – tempo di stoccaggio nei magazzini internegozi;

(T tre T k.k. può essere combinato con T m.o).

Il calcolo del tempo del ciclo produttivo dipende dal tipo di produzione. Nella produzione di massa, la durata del ciclo produttivo è determinata dal tempo in cui il prodotto è in produzione, vale a dire

Ciclo T = T nella M,

Dove T V– corsa di rilascio;

M– numero di posti di lavoro.

Sotto corsa di rilascioè necessario comprendere l'intervallo di tempo tra il rilascio di un prodotto fabbricato e quello successivo.

La corsa di rilascio è determinata dalla formula

tin = Teff /V,

Dove Tef– fondo effettivo del tempo lavoratore per il periodo di fatturazione (turno, giorno, anno);

IN– volume della produzione per lo stesso periodo (in unità naturali).

Esempio: T cm = 8 ore = 480 min; T per = 30 minuti; → Teff = 480 – – 30 = 450 min.

B = 225 pezzi; → T pollici = 450/225 = 2 minuti.

Nella produzione in serie, dove la lavorazione viene effettuata in lotti, la durata del ciclo tecnologico è determinata non per unità di prodotto, ma per l'intero lotto. Inoltre, a seconda del metodo di avvio di un lotto in produzione, otteniamo tempi di ciclo diversi. Esistono tre modi per spostare i prodotti nella produzione: sequenziale, parallelo e misto (serie-parallelo).


IO. A sequenziale Quando si spostano le parti, ogni operazione successiva inizia solo dopo il completamento di quella precedente. La durata del ciclo per il movimento sequenziale delle parti sarà pari a:

Dove N – numero di parti del lotto in lavorazione;

t pzio- tempo a cottimo per un'operazione;

Ci– numero di posti di lavoro pro io l'operazione;

M– numero di operazioni del processo tecnologico.

Viene fornito un lotto di prodotti composto da 5 pezzi. Il lotto viene fatto passare in sequenza attraverso 4 operazioni; la durata della prima operazione è di 10 minuti, la seconda di 20 minuti, la terza di 10 minuti, la quarta di 30 minuti (Fig. 1).

Figura 1

T ciclo = T ultimo = 5·(10+20+10+30) = 350 min.

Il metodo sequenziale di spostamento delle parti ha il vantaggio di garantire il funzionamento dell'attrezzatura senza tempi di fermo. Ma il suo svantaggio è che la durata del ciclo produttivo in questo caso è la più lunga. Inoltre, nei cantieri vengono create notevoli scorte di pezzi, il che richiede ulteriore spazio di produzione.

II. A parallelo Durante la movimentazione del lotto, le singole parti non vengono trattenute nelle postazioni di lavoro, ma vengono trasferite singolarmente all'operazione successiva immediatamente, senza attendere il completamento della lavorazione dell'intero lotto. Pertanto, con il movimento parallelo di un lotto di pezzi, in ogni postazione di lavoro vengono eseguite contemporaneamente diverse operazioni su diversi pezzi dello stesso lotto.

Il tempo di elaborazione di un lotto con movimento parallelo di prodotti è drasticamente ridotto:

dl .

Dove n n– numero di parti in lotto di trasferimento(lotto di trasporto), cioè il numero di prodotti trasferiti contemporaneamente da un'operazione all'altra;

Lunghezza – il ciclo operativo più lungo.

Quando si lancia un lotto di prodotti in parallelo, le parti dell'intero lotto vengono lavorate in modo continuo solo nei luoghi di lavoro dove le operazioni lunghe seguono quelle brevi. Nei casi in cui alle operazioni brevi seguono quelle lunghe, ad es. più a lungo (nel nostro esempio, la terza operazione), queste operazioni vengono eseguite in modo discontinuo, cioè l'attrezzatura è inattiva. Qui un lotto di pezzi non può essere lavorato immediatamente, senza ritardi, poiché la precedente (lunga) operazione non lo consente.

Nel nostro esempio: N= 5, T 1 = 10; T 2 = 20; T 3 = 10; T 4 = 30; Con= 1.

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

Consideriamo lo schema del movimento parallelo delle parti (Fig. 2):

Figura 2

III. Per eliminare le interruzioni nella lavorazione delle singole parti di un lotto in tutte le operazioni, utilizzare parallelo-seriale O misto un metodo di lancio in cui i pezzi (dopo la lavorazione) vengono trasferiti all'operazione successiva uno per uno, o sotto forma di lotti di “trasporto” (diversi pezzi) in modo tale che l'esecuzione delle operazioni non venga interrotta in nessun luogo di lavoro. Nel metodo misto, la continuità della lavorazione viene presa dal metodo sequenziale e la transizione del pezzo da un'operazione all'altra immediatamente dopo la lavorazione viene presa dal metodo parallelo. Con un metodo misto di messa in produzione, la durata del ciclo è determinata dalla formula

nucleo .

dov'è il cor. – il ciclo operativo più breve (di ciascuna coppia di operazioni adiacenti);

M-1 numero di combinazioni

Se l'operazione successiva è più lunga della precedente o uguale nel tempo, questa operazione viene avviata individualmente, immediatamente dopo l'elaborazione della prima parte nell'operazione precedente. Se invece l'operazione successiva è più breve della precedente, allora qui si verificano delle interruzioni durante il trasferimento del pezzo. Per prevenirli, è necessario accumulare una riserva di trasporto di volume tale da garantire il lavoro durante l'operazione successiva. Per trovare praticamente questo punto sul grafico è necessario trasferire l'ultima parte del batch e spostare a destra la durata della sua esecuzione. Il tempo di lavorazione per tutte le altre parti del lotto è riportato a sinistra nel grafico. L'inizio dell'elaborazione della prima parte indica il momento in cui l'arretrato di trasporto dell'operazione precedente deve essere trasferito a questa operazione.

Se le operazioni adiacenti hanno la stessa durata, solo una di esse è considerata breve o lunga (Fig. 3).

Figura 3

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

I principali modi per ridurre il tempo del ciclo produttivo sono:

1) Ridurre l'intensità di manodopera nella produzione di prodotti migliorando la producibilità del progetto prodotto, utilizzando computer e introducendo processi tecnologici avanzati.

2) Organizzazione razionale dei processi lavorativi, sistemazione e mantenimento dei luoghi di lavoro basati sulla specializzazione e cooperazione, ampia meccanizzazione e automazione della produzione.

3) Riduzione delle varie pause di lavoro pianificate e non pianificate sulla base dell'uso razionale dei principi di organizzazione scientifica del processo produttivo.

4) Accelerazione delle reazioni a seguito dell'aumento della pressione, della temperatura, della transizione a un processo continuo, ecc.

5) Migliorare i processi di trasporto, stoccaggio e controllo e combinarli nel tempo con il processo di lavorazione e assemblaggio.

Ridurre la durata del ciclo produttivo è uno dei compiti seri dell'organizzazione della produzione, perché influisce sul turnover del capitale circolante, riducendo il costo del lavoro, riducendo lo spazio di stoccaggio, la necessità di trasporto, ecc.

Compiti

1 Determinare la durata del ciclo di lavorazione di 50 pezzi con tipi di movimento sequenziale, parallelo e seriale-parallelo nel processo di produzione. Il processo di elaborazione delle parti consiste in cinque operazioni, la cui durata è, rispettivamente, min: T 1 =2; T 2 =3; T 3 =4; T 4 =1; T 5 = 3. La seconda operazione viene eseguita su due macchine e ciascuna delle altre su una. La dimensione del lotto di trasferimento è di 4 pezzi.

2 Determinare la durata del ciclo di lavorazione di 50 pezzi con tipi di movimento sequenziale, parallelo e seriale-parallelo nel processo di produzione. Il processo di elaborazione delle parti consiste in quattro operazioni, la cui durata è, rispettivamente, min: T 1 =1; T 2 =4; T 3 =2; T 4 = 6. La quarta operazione viene eseguita su due macchine e ciascuna delle altre su una. La dimensione del lotto di trasferimento è di 5 pezzi.

3 Un lotto di particolari da 200 pezzi viene lavorato con movimento sequenziale parallelo durante il processo produttivo. Il processo di elaborazione delle parti consiste in sei operazioni, la cui durata è, rispettivamente, min: T 1 =8; T 2 =3; T 3 =27; T 4 =6; T 5 =4; T 6 = 20. La terza operazione viene eseguita su tre macchine, la sesta su due e ciascuna delle restanti operazioni su una macchina. Determinare come cambierà la durata del ciclo di lavorazione per un lotto di parti se la versione sequenziale parallela del movimento in produzione viene sostituita da una parallela. La dimensione del lotto di trasferimento è di 20 pezzi.

4 Un lotto di particolari da 300 pezzi viene lavorato con movimento sequenziale parallelo durante il processo produttivo. Il processo di lavorazione delle parti consiste in sette operazioni, la cui durata è, rispettivamente, min: T 1 =4; T 2 =5; T 3 =7; T 4 =3; T 5 =4; T 6 =5; T 7 = 6. Ogni operazione viene eseguita su una macchina. Lotto di trasferimento – 30 pezzi. Come risultato del miglioramento della tecnologia di produzione, la durata della terza operazione è stata ridotta di 3 minuti, la settima di 2 minuti. Determinare come cambia il ciclo di lavorazione di un lotto di parti.

5 Viene fornito un lotto di grezzi composto da 5 pezzi. Il batch passa attraverso 4 operazioni: la durata della prima è di 10 minuti, la seconda è di 20 minuti, la terza è di 10 minuti, la quarta è di 30 minuti. Determinare la durata del ciclo mediante metodi analitici e grafici con movimento sequenziale.

6 Viene fornito un lotto di grezzi composto da quattro pezzi. Il batch passa attraverso 4 operazioni: la durata della prima è di 5 minuti, la seconda è di 10 minuti, la terza è di 5 minuti, la quarta è di 15 minuti. Determinare la durata del ciclo mediante metodi analitici e grafici con movimento parallelo.

7 Viene fornito un lotto di grezzi composto da 5 pezzi. Il batch passa attraverso 4 operazioni: la durata della prima è di 10 minuti, la seconda è di 20 minuti, la terza è di 10 minuti, la quarta è di 30 minuti. Determinare la durata del ciclo mediante metodi analitici e grafici per il movimento seriale-parallelo.

8 Determinare la durata del ciclo tecnologico per la lavorazione di un lotto di prodotti di 180 pezzi. con varianti parallele e sequenziali del suo movimento. Costruisci grafici del processo di elaborazione. La dimensione del lotto di trasferimento è di 30 pezzi. Gli standard temporali e il numero di posti di lavoro nelle operazioni sono i seguenti.

Una versione commutata dell'algoritmo precedente è l'algoritmo con il tempo di esecuzione rimanente più breve. Secondo questo algoritmo, lo scheduler seleziona ogni volta il processo con il tempo di esecuzione rimanente più breve. In questo caso è necessario conoscere in anticipo anche il tempo di completamento dell'attività. Quando arriva una nuova attività, il suo tempo di esecuzione totale viene confrontato con il tempo di esecuzione rimanente dell'attività corrente. Se il tempo di esecuzione della nuova attività è più breve, il processo corrente viene sospeso e il controllo viene trasferito alla nuova attività. Questo schema consente di soddisfare rapidamente richieste brevi.

Pianificazione a tre livelli

I sistemi di elaborazione batch consentono la pianificazione a tre livelli, come mostrato nella figura. Quando nuove attività arrivano nel sistema, vengono prima inserite in una coda archiviata su disco. Ingresso pianificazione degli accessi seleziona un'attività e la trasferisce al sistema. Le attività rimanenti rimangono in coda.

Non appena un lavoro entra nel sistema, verrà creato un processo corrispondente e potrà immediatamente iniziare a competere per l'accesso al processore. Tuttavia, è possibile che ci siano troppi processi e che non entrino tutti in memoria, quindi alcuni di essi verranno paginati su disco. Il secondo livello di pianificazione determina quali processi possono essere archiviati in memoria e quali possono essere archiviati su disco. Questo è quello che fa pianificatore di memoria .

Lo scheduler della memoria esamina periodicamente i processi sul disco per decidere quali spostare in memoria. Tra i criteri utilizzati dallo schedulatore ci sono i seguenti:

1. Quanto tempo è trascorso dall'ultima volta che il processo è stato scambiato su disco o caricato da disco?

2. Da quanto tempo il processo utilizza la CPU?

3. Qual è la dimensione del processo (i piccoli processi non interferiscono)?

4. Qual è l'importanza del processo?

Il terzo livello di pianificazione è responsabile di consentire ai processi nello stato pronto di accedere al processore. Quando parliamo di "programmatore", di solito intendiamo Pianificatore della CPU . Questo scheduler utilizza qualsiasi algoritmo adatto alla situazione, sia con che senza interruzione. Abbiamo già esaminato alcuni di questi algoritmi e ne conosceremo altri in seguito.

Pianificazione in sistemi interattivi.

Pianificazione ciclica.

Uno dei più antichi, semplici, equi e utilizzati più frequentemente è l'algoritmo di pianificazione ciclica. Ad ogni processo viene assegnata una certa quantità di tempo del processore, la cosiddetta fetta di tempo. Se il processo è ancora in esecuzione alla fine dell'intervallo di tempo, viene terminato e il controllo viene trasferito a un altro processo. Naturalmente, se il processo si blocca o termina anticipatamente, a questo punto avviene una transizione di controllo. L'implementazione della pianificazione round-robin è semplice. Lo scheduler deve solo mantenere un elenco di processi in uno stato pronto. Quando un processo ha raggiunto il limite di tempo, viene inviato alla fine dell'elenco.

L'unico aspetto interessante di questo algoritmo è la lunghezza del quanto. Il passaggio da un processo all'altro richiede del tempo: è necessario salvare e caricare registri e mappe di memoria, aggiornare tabelle ed elenchi, salvare e ricaricare la cache di memoria, ecc. La conclusione può essere formulata come segue: un quanto troppo piccolo porterà a frequenti cambi di processo e ad una piccola efficienza, ma un quanto troppo grande può comportare una risposta lenta a brevi richieste interattive. Un valore quantico di circa 2 0 -5 0 ms è spesso un compromesso ragionevole.

Pianificazione delle priorità.

La pianificazione round robin parte dal presupposto importante che tutti i processi siano uguali. Nel caso di un computer con un numero elevato di utenti, ciò potrebbe non essere il caso. Ad esempio, in un'università, dovrebbero essere serviti prima i presidi, poi i professori, i segretari, gli addetti alle pulizie e solo dopo gli studenti. La necessità di tenere conto di tali fattori esterni porta a una pianificazione prioritaria. L'idea di base è semplice: a ogni processo viene assegnata una priorità e il controllo viene trasferito al processo pronto con la priorità più alta.

Diverse code.

Uno dei primi pianificatori di priorità è stato implementato nel sistema CTSS (sistema compatibile a tempo condiviso). Il problema principale con il sistema CTSS era che il cambio di processo era troppo lento, poiché il computer IBM 7094 poteva contenere solo un processo in memoria. Ogni passaggio significava scaricare il processo corrente su disco

e leggere il nuovo processo dal disco. Gli sviluppatori di CTSS si sono resi conto rapidamente che l'efficienza sarebbe stata maggiore se ai processi limitati dal processore fosse stato concesso un intervallo di tempo più ampio rispetto a quando fossero stati concessi intervalli di tempo piccoli, ma spesso. Ciò da un lato ridurrà il numero di trasferimenti dalla memoria al disco e, dall'altro, porterà a un peggioramento dei tempi di risposta, come abbiamo già visto.

Di conseguenza, è stata sviluppata una soluzione con classi di priorità. Ai processi nella classe di priorità più alta veniva assegnato un quanto, ai processi nella classe successiva venivano assegnati due quanti, ai processi nella classe successiva venivano assegnati quattro quanti, ecc. Quando un processo aveva utilizzato tutto il tempo assegnato, veniva spostato a una classe inferiore. classe.

Ad esempio, considera un processo che deve calcolare oltre 100 quanti. Per prima cosa gli verrà assegnato un quanto, poi verrà pompato su disco. La prossima volta ottiene 2 quanti, poi 4, 8,16, 32, 64, anche se su 64 ne usa solo 37. In questo caso saranno necessari solo 7 trasferimenti (compreso il carico iniziale) invece dei 100 che sarebbero necessari utilizzando l'algoritmo round-robin. Inoltre, man mano che il processo si addentra nella coda di priorità, verrà avviato sempre meno spesso, dedicando il processore a processi più brevi.

“Il processo più breve è il prossimo”

Poiché l'algoritmo Shortest Task First riduce al minimo il tempo medio di consegna nei sistemi di elaborazione batch, si vorrebbe utilizzarlo anche nei sistemi interattivi. In una certa misura questo è possibile. I processi interattivi molto spesso seguono lo schema di "attesa di un comando, esecuzione di un comando, attesa di un comando, esecuzione di un comando..." Se si considera l'esecuzione di ciascun comando come un'attività separata, è possibile ridurre al minimo la risposta media complessiva tempo eseguendo prima l'attività più breve. L'unico problema è

è capire quale dei processi di attesa è il più breve.

Un metodo si basa sulla stima della durata del processo in base al comportamento precedente del processo. In questo caso viene avviato il processo con il tempo stimato più breve. Supponiamo che il tempo di esecuzione previsto del comando sia T 0 e il tempo previsto dell'esecuzione successiva sia T 1 . È possibile migliorare la stima del tempo prendendo la somma ponderata di questi tempi aT 0 + (1 - a)T 1 . Scegliendo il valore appropriato per a, possiamo fare in modo che l'algoritmo di stima dimentichi rapidamente le esecuzioni precedenti o, al contrario, le ricordi per molto tempo. Prendendo a = 1/2, otteniamo una serie di stime:

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.

Dopo tre esecuzioni, il peso di T 0 nella stima diminuirà a 1/8.

Il metodo per stimare il valore successivo in una serie attraverso una media ponderata del valore precedente e della stima precedente è spesso chiamato invecchiamento. Questo metodo è applicabile in molte situazioni in cui è necessaria la stima dai valori precedenti. Il modo più semplice per implementare l'invecchiamento è a = 1/2. Ad ogni passo hai solo bisogno

aggiungi un nuovo valore alla stima corrente e dividi la somma a metà (spostando a destra di 1 bit).

Pianificazione garantita.

Un approccio fondamentalmente diverso alla pianificazione consiste nel fare promesse reali agli utenti e poi mantenerle. Ecco una promessa facile da dire e facile da mantenere: se condividi un processore con n utenti, ti verrà dato 1/n della potenza del processore.

E in un sistema con un utente e n processori in esecuzione, ciascuno otterrà 1/n cicli del processore.

Per mantenere questa promessa, il sistema deve tenere traccia dell'allocazione della CPU tra i processi dal momento in cui ciascun processo viene creato. Il sistema calcola quindi la quantità di risorse CPU a cui ha diritto il processo, ad esempio il tempo trascorso dalla creazione diviso per n. Ora possiamo calcolare il rapporto tra il tempo concesso al processo e il tempo a cui ha diritto. Il valore risultante di 0,5 significa che il processo ha ricevuto solo la metà dell'importo assegnato, mentre 2,0 significa che il processo ha ricevuto il doppio di quanto avrebbe dovuto. Quindi viene avviato il processo con il rapporto più piccolo, fino a

non diventerà più grande di quello del suo vicino più prossimo.

Pianificazione della lotteria.

L'algoritmo si basa sulla distribuzione dei biglietti della lotteria ai processi per l'accesso a varie risorse, incluso il processore. Quando il pianificatore deve prendere una decisione, un biglietto della lotteria viene selezionato casualmente e il suo proprietario ha accesso alla risorsa. In termini di accesso alla CPU, la "lotteria" può avvenire 50 volte al secondo, con il vincitore che ottiene 20 ms di tempo CPU.

Ai processi più importanti possono essere assegnati biglietti aggiuntivi per aumentare la probabilità di vincita. Se ci sono solo 100 ticket e 20 di essi sono in un processo, otterrà il 20% del tempo del processore. A differenza del programmatore di priorità, in cui è molto difficile valutare cosa significhi, ad esempio, priorità 40, nella pianificazione della lotteria tutto è ovvio. Ogni processo riceverà una percentuale di risorse approssimativamente uguale alla percentuale di ticket di cui dispone.

La pianificazione della lotteria ha diverse proprietà interessanti. Ad esempio, se durante la creazione un processo riceve più biglietti, nella lotteria successiva le sue possibilità di vincita saranno proporzionali al numero di biglietti.

I processi comunicanti possono scambiarsi i ticket, se necessario. Pertanto, se un processo client invia un messaggio a un processo server e poi si blocca, può passare tutti i suoi ticket al processo server per aumentare le possibilità di avvio del server. Al termine del processo del server, può restituire tutti i ticket.

Pianificazione equa.

Finora abbiamo ipotizzato che ciascun processo sia controllato indipendentemente da chi ne sia il proprietario. Pertanto, se l'utente 1 crea 9 processi e l'utente 2 - 1 processo, utilizzando la pianificazione round-robin o in caso di priorità uguali, l'utente 1 otterrà il 90% del processore e l'utente 2 solo 10.

Per evitare tali situazioni, alcuni sistemi prestano attenzione al proprietario del processo prima della pianificazione. In questo modello, ogni utente ottiene una certa quota del processore e lo scheduler seleziona un processo in base a questo fatto. Se nel nostro esempio ogni utente avesse

hanno promesso il 50% del processore, quindi otterranno il 50% del processore, indipendentemente dal numero di processi.

Pianificazione in sistemi real-time.

Nei sistemi in tempo reale, il tempo gioca un ruolo essenziale. Molto spesso, uno o più dispositivi fisici esterni generano segnali di ingresso e il computer deve rispondere adeguatamente ad essi entro un determinato periodo di tempo.

I sistemi in tempo reale sono suddivisi in sistemi in tempo reale , il che significa la presenza di scadenze rigorose per ciascuna attività (devono essere rispettate) e sistemi flessibili in tempo reale , in cui le violazioni del calendario sono indesiderabili, ma accettabili. In entrambi i casi, il programma è suddiviso in diversi processi, ognuno dei quali è prevedibile. Questi processi sono spesso brevi e completano il loro lavoro in un secondo. Quando appare un segnale esterno, è il pianificatore che deve garantire il rispetto del programma.

Gli eventi esterni ai quali il sistema deve rispondere possono essere suddivisi in periodico(che si verificano a intervalli regolari) e non periodico(che si verifica in modo imprevedibile). Potrebbero esserci diversi flussi periodici di eventi che il sistema deve elaborare. A seconda del tempo necessario per elaborare ciascun evento, il sistema potrebbe non essere in grado di elaborare tutti gli eventi in modo tempestivo.


Informazioni correlate.


(viene compreso il tempo dal lavoro fino al suo completamento nel caso di attività periodica, oppure fino a quando il sistema risponde e consegna la prima uscita utente nel caso di attività interattiva); o massimizzazione giustizia(un uguale ammontare di tempo CPU per ciascun processo, o più in generale tempi corrispondenti a seconda della priorità e del carico di lavoro di ciascun processo). In pratica, questi obiettivi sono spesso in conflitto (ad esempio, throughput e latenza), quindi lo scheduler troverà un compromesso appropriato. La preferenza viene misurata in base a uno qualsiasi dei problemi sopra menzionati, a seconda delle esigenze e degli obiettivi dell'utente.

OS/360 e successori

AIX

In AIX Versione 4, sono disponibili tre impostazioni possibili per la policy di pianificazione dei thread:

  • Innanzitutto, il primo: una volta pianificato un thread con questa policy, viene eseguito fino al completamento, a meno che non venga bloccato, non ceda volontariamente il controllo del processore o un thread con priorità più elevata diventi distribuibile. Solo i thread a priorità fissa possono avere una politica di pianificazione FIFO.
  • Round Robin: è simile allo scheduler di circuito AIX versione 3 che esegue il ciclo in base a intervalli di tempo di 10 ms. Quando un thread PP ha il controllo alla fine di un time slot, si sposta in coda alla coda dei thread con la stessa priorità. Solo i thread a priorità fissa possono avere una politica di pianificazione Round Robin.
  • ALTRO: questa politica è definita dall'implementazione da POSIX1003.4a. In AIX Versione 4, questa policy è definita equivalente a RR, tranne per il fatto che si applica ai thread con priorità non fissa. Ricalcolare il valore di priorità di un thread in esecuzione per ciascun interrupt significa che un thread può perdere il controllo perché il suo valore di priorità è aumentato rispetto a quello di un altro thread. Questo è il comportamento di AIX Versione 3.

I thread interessano principalmente le applicazioni che attualmente consistono in più processi asincroni. Queste applicazioni possono imporre un carico leggero sul sistema se convertite in una struttura multi-thread.

AIX 5 implementa le seguenti politiche di pianificazione: FIFO, round robin e fair round robin. La politica FIFO si compone di tre diverse implementazioni: FIFO, FIFO2 e FIFO3. La politica del round robin del sistema Robin si chiama SCHED_RR in AIX, mentre la politica del round robin corretto si chiama SCHED_OTHER.

Linux

Linux2.4

Brain Fuck Scheduler (BFS), anch'esso creato da Kolivas, è un'alternativa alla CFS.

FreeBSD

FreeBSD utilizza una coda di feedback multi-livello con priorità nell'intervallo 0-255. 0-63 sono riservati agli interrupt, 64-127 per la metà superiore del kernel, 128-159 per thread utente in tempo reale, 160-223 per thread utente in time-sharing e 224-255 per thread utente inattivi. Inoltre, come Linux, utilizza un'impostazione della coda attiva, ma ha anche una coda inattiva.

Spesso gli sviluppatori, soprattutto quelli inesperti, si confondono quando viene loro chiesto di fissare delle scadenze per il completamento delle attività. Tuttavia, la capacità di pianificare è un'abilità molto utile e necessaria che aiuta non solo nel lavoro, ma anche nella vita. Abbiamo deciso di chiedere agli esperti come imparare a pianificare correttamente e consegnare i progetti in tempo.

Alla fine dell’articolo troverete brevi conclusioni.

Uno sviluppatore di solito deve prendere in considerazione diversi parametri contemporaneamente per stimare il tempo necessario per completare un'attività:

  1. Esperienza nell'esecuzione di tali compiti e nel lavoro con questo stack tecnologico. Se devi fare qualcosa di fondamentalmente nuovo, devi prestare particolare attenzione alla tua valutazione.
  2. Esperienza di lavoro con questo cliente. Conoscendo il cliente, è possibile prevedere approssimativamente alcuni requisiti aggiuntivi e la portata delle modifiche.
  3. La qualità del codice con cui lavorerai. Questo è il fattore più influente, per cui tutto può richiedere molto tempo e generalmente non andare secondo i piani. Se il progetto ha dei test, ci sono solo dipendenze esplicite ovunque e la funzionalità è ben isolata, tutto non è così spaventoso. È molto peggio se hai a che fare con codice legacy senza test o con codice sovraccarico di dipendenze implicite. Anche cose come le "funzioni magiche" (quando è difficile vedere lo stack di chiamate finale dal codice) e la duplicazione del codice (quando è necessario modificare diverse sezioni indipendenti per cambiare alcune funzionalità) possono complicare le cose.

Per imparare a stimare adeguatamente le scadenze lavorative, è necessario esercitarsi costantemente. All'inizio del mio lavoro, ho fatto esattamente questo: ho stimato il tempo per completare qualsiasi attività in arrivo, anche se nessuno lo richiedeva, e poi ho osservato con quanta precisione sono riuscito a rientrare nella mia stima. Durante il completamento dell'attività, ha notato quali azioni richiedevano più tempo. Se qualcosa ha aumentato significativamente il periodo, ho ricordato questo momento e ne ho tenuto conto nelle valutazioni successive.

Ad una valutazione oggettiva del tempo necessario esclusivamente al lavoro, va aggiunto un piccolo margine per coprire le situazioni di forza maggiore. Viene spesso valutato come percentuale del completamento dell'attività principale, ma è diverso per tutti: alcuni aggiungono il 20% delle volte, altri il 10% e altri il 50%.

È utile anche analizzare le ragioni del mancato rispetto delle scadenze dopo ogni grave violazione delle scadenze. Se ti mancano le qualifiche, devi lavorare sui tuoi punti deboli. Se il problema era organizzativo, capisci cosa gli ha impedito di funzionare normalmente.

Promuovere Retrocedere

, direttore tecnico del centro per tecnologie e soluzioni innovative "Jet Infosystems"

Un gran numero di articoli sono dedicati ai metodi per valutare l'intensità del lavoro di un progetto, compresa la durata del lavoro e le attività individuali. Tuttavia, ciò causa ancora conflitti sia all'interno del team di progetto che nella comunicazione con il cliente.

L'assistente principale nella valutazione è l'esperienza. Prova a confrontare in qualche modo la nuova attività con quelle già svolte. Se stai facendo un report, guarda quanto tempo è stato necessario per un report simile in passato. Se stai facendo qualcosa di nuovo, prova a scomporlo in parti conosciute e a valutarle. Se l'attività è completamente nuova, dedica del tempo allo studio (meglio ancora, coordina questo tempo con la persona che imposta l'attività).

Presta attenzione alle fasi di accompagnamento: se devi sviluppare un servizio, la valutazione deve includere anche i test unitari (e forse non solo i test unitari), la preparazione dei dati di test richiederà del tempo. Dovresti considerare l'integrazione con altri servizi, ecc. Concediti il ​​tempo per correggere i difetti che trovi tu stesso o con l'aiuto dei tester. Si può sprecare molto tempo in attività “invisibili”. Ad esempio, esiste una valutazione per lo sviluppo e una valutazione per il test, ma il trasferimento di un manufatto per il test può comportare lo spiegamento di stand. Pertanto, è importante visualizzare mentalmente l'intero processo per non perdere nulla.

Dopo aver determinato la complessità, è necessario includere nuovi lavori nel calendario, senza dimenticare altri compiti e attività che vanno in parallelo.

E non dimenticare che i piani sono inutili, ma la pianificazione non ha prezzo. Impara ad adattare i piani in modo tempestivo, a tenere informate tutte le persone coinvolte e ad intensificare le attività in modo tempestivo in modo che le scadenze mancate non costituiscano una sorpresa per nessuno.

Promuovere Retrocedere

Una domanda a cui non è possibile rispondere in forma breve. Se fosse semplice, il problema del mancato rispetto delle scadenze non esisterebbe.

Per rendere le scadenze di sviluppo più prevedibili, dobbiamo prima comprendere i motivi per cui i programmatori commettono continuamente errori.

Il primo motivo è che la maggior parte dei compiti svolti da un programmatore sono unici in un modo o nell'altro. Cioè, molto probabilmente, il programmatore eseguirà un compito simile per la prima volta. Non ha una buona idea di quanto tempo richiederà questo lavoro. Se si tratta di un programmatore con una solida esperienza e ha dovuto svolgere un compito simile, la sua valutazione sarà più vicina alla realtà.

Usiamo una semplice analogia: se non hai mai scavato fossati, non puoi dire esattamente quanto tempo impiegherai per scavare una trincea larga 30 cm, profonda 60 cm e lunga 20 metri. Se hai già scavato in precedenza, la tua stima del tempo di lavoro sarà molto più vicina alla durata effettiva del lavoro.

La seconda ragione è che i programmatori sono ottimisti per natura. Cioè, quando si considera un'attività, si seleziona un'opzione di implementazione e si valutano i miglioramenti, lo sviluppatore si aspetta che tutto funzioni come previsto. E non pensa ai problemi che incontrerà lungo il percorso. Spesso non riesce a prevederli. Ad esempio, esiste un'attività che un programmatore può implementare utilizzando una libreria software open source di terze parti. In fase di valutazione, l'ha trovato su Internet, ha letto la sua descrizione: gli va bene. E ha anche stimato correttamente la quantità di lavoro che avrebbe dovuto fare per incrementare l'uso di questa biblioteca. Ma non aveva affatto previsto che in questa libreria si sarebbe verificato un errore nell'ambiente del suo prodotto software.

Lo sviluppatore dovrà non solo integrare l'utilizzo della libreria nel suo codice, ma anche correggere un bug nella libreria stessa. E spesso lo sviluppatore non fornisce il tempo per correggere i propri errori. Le statistiche mostrano che testare e correggere gli errori può richiedere circa il 50% del tempo dedicato alla codifica. La cifra dipende dalle qualifiche dello sviluppatore, dall'ambiente e dalle pratiche di sviluppo utilizzate (ad esempio, i test unitari riducono significativamente questo tempo e la durata finale/intensità di lavoro dell'attività di sviluppo è inferiore).

Se torniamo all'analogia con lo scavatore, lo scavatore non si aspettava che la sua pala si rompesse e avrebbe dovuto passare due ore a cercare un nuovo taglio.

Il terzo motivo sono i requisiti imprevisti. In nessun altro settore della produzione materiale, con il quale i clienti amano così tanto confrontare lo sviluppo del software, si registra un tale flusso di nuove esigenze. Immaginate il passaggio di uno scavatore che ha scavato 19 metri su 20 e ha sentito dal cliente il desiderio che il fossato non andasse in linea retta, ma in un serpente con un braccio lungo 97 centimetri.

Come affrontare tutto questo e come vivere in condizioni di tale incertezza? Ridurre l’incertezza e accumulare riserve di tempo.

Il modo più semplice per avvicinare le tue aspettative alla realtà è utilizzare la giocosa regola pratica del Pi. Dopo aver ricevuto una stima dallo sviluppatore (in termini di tempo o intensità di lavoro), è necessario moltiplicarla per Pi (= 3,14159). Quanto più esperto è lo sviluppatore nella valutazione, tanto più basso potrebbe essere questo rapporto.

È obbligatoria la pratica di scomporre il problema originale in piccoli compiti di durata non superiore a 4 ore. Quanto più dettagliata è la scomposizione, tanto maggiori sono le possibilità che la stima si avvicini alla complessità/durata effettiva.
Se torniamo all'assegnazione della riserva, questa volta dovrebbe essere assegnata alla fine del progetto. È una cattiva pratica creare una riserva e includerla per ogni attività. La legge di Parkinson “Il lavoro riempie tutto il tempo che gli viene assegnato” viene rispettata rigorosamente.

Riassumendo brevemente, per poter determinare correttamente le scadenze di completamento dei lavori, saranno utili le seguenti azioni:

  • eseguire una scomposizione del lavoro, suddividendo il compito in passaggi quanto più dettagliati possibile;
  • effettuare la prototipazione;
  • limitare l’attuazione di requisiti precedentemente imprevisti. Ciò non significa che non debbano essere realizzate, ma è opportuno evidenziare tali esigenze e concordare con il cliente modifiche nei tempi e nei costi per la loro realizzazione;
  • tenere conto del tempo necessario per stabilizzare la soluzione;
  • utilizzare pratiche per migliorare la qualità del codice, come scrivere unit test;
  • costituire una riserva generale.

Bene, ricorda che se un fatto supera la tua stima del 30%, allora questo è un ottimo risultato.

Promuovere Retrocedere

Per la valutazione più accurata, è necessaria esperienza nello sviluppo reale e in particolare in un'area specifica. Ma esistono anche regole generali che ti aiuteranno a evitare errori di pianificazione e problemi nella consegna del lavoro al cliente. Descriverei queste regole in questo modo.

Innanzitutto è necessario comprendere il problema. Ciò sembra ovvio e non si riferisce direttamente alle stime temporali, ma in realtà è un punto chiave. Anche in progetti seri e di grandi dimensioni, uno dei principali fattori di fallimento e ritardo è il problema nella definizione dei requisiti. Per gli sviluppatori principianti, sfortunatamente, questo è un problema serio: non leggono le specifiche tecniche o leggono e comprendono in modo molto selettivo (su dieci punti, ne ricordavano e ne completavano cinque, e ricordavano il resto quando inviavano il risultato). È chiaro che un compito frainteso non può essere implementato correttamente in tempo.

Il prossimo è stimare il tempo di sviluppo stesso. La particolarità della programmazione è che non esistono compiti assolutamente identici. Questo rende il nostro lavoro più interessante, ma stimare le scadenze è più difficile. La decomposizione funziona bene qui, ad es. dividere un problema complesso e unico in una sequenza di sottoattività piccole e familiari. E ognuno di essi può già essere valutato abbastanza adeguatamente in poche ore. Sommiamo le stime delle attività secondarie e otteniamo una stima per l'intera attività.

Di norma, tale stima include solo i costi della codifica stessa. Questa è, ovviamente, la parte più importante dello sviluppo, ma non è l'unica (e spesso non la più voluminosa). Il completamento completo dell'attività comprende anche la lettura e il chiarimento delle specifiche, gli incontri con i colleghi o con il cliente, il debugging e il test, la stesura della documentazione, la consegna del risultato (dimostrazione al cliente ed eventuali modifiche in base ai suoi commenti). Solo l'esperienza ti dirà esattamente quanto tempo ti occorrerà per completare queste azioni. All'inizio è importante, almeno, non dimenticare di tenerne conto nei calcoli, e puoi chiedere ai colleghi più esperti una stima approssimativa del tempo.

Quindi, prendiamo una stima dei costi di manodopera per la codifica, aggiungiamo una stima dei costi del lavoro aggiuntivo e otteniamo la stima del tempo richiesto per completare l'attività. Ma non è tutto! È necessario indicare la data di completamento pianificata per l'attività. Sarebbe un errore dividere semplicemente il costo della manodopera (in ore) per 8 ore e sommarlo alla data corrente. Nella pratica reale, uno sviluppatore non lavora mai (okay, quasi mai) il 100% delle volte su un'attività specifica. Dedicherai sicuramente del tempo ad altri lavori, importanti, ma non direttamente correlati a quello principale. Ad esempio, aiutare i colleghi, formare, scrivere rapporti, ecc. In genere, durante la pianificazione, si ritiene che il 60-70% del tempo lavorativo venga dedicato direttamente al progetto attuale. Inoltre, è necessario tenere conto dei possibili ritardi che ti impediranno di lavorare continuamente sull'attività. Ad esempio, se per questo è necessario interagire con altre persone (colleghi, clienti), tenere conto della loro disponibilità, orario di lavoro, ecc.

Ecco le regole base che, a mio avviso, aiuteranno lo sviluppatore a evitare problemi nella stima e nel rispetto delle scadenze. Inoltre, la chiave è accumulare la propria esperienza sia nell'implementazione dei compiti che nella valutazione. Ad esempio, è molto utile dopo aver completato un'attività per confrontare la stima iniziale con le scadenze effettive e trarre conclusioni per il futuro. E, naturalmente, vale la pena studiare le esperienze degli altri. Consiglierei i libri sull'argomento di S. McConnell "Quanto costa un progetto software" e S. Arkhipenkov "Lezioni sulla gestione dei progetti software".

Promuovere Retrocedere

Quando si stimano e pianificano le scadenze, è necessario:

  1. Suddividere l'attività in piccole parti funzionali in modo tale da avere una chiara comprensione del tempo necessario per sviluppare ciascuna di queste parti.
  2. Parallelamente alla scomposizione sorgeranno sicuramente ulteriori domande relative alla funzionalità che non è stata descritta nella dichiarazione del problema. È necessario ottenere risposte a tali domande, poiché ciò è direttamente correlato all'ambito del lavoro e, quindi, ai tempi.
  3. Aggiungere una certa percentuale di rischi alla valutazione finale. Questo è determinato empiricamente. Puoi iniziare, ad esempio, con rischi del 10–15%.
  4. Comprendi quante ore al giorno un programmatore è disposto a dedicare al completamento di un'attività.
  5. Dividiamo la stima finale per il numero di ore che assegniamo al giorno e otteniamo il numero di giorni necessari per l'implementazione.
  6. Ci concentriamo sul calendario e sul numero di giorni richiesti per il completamento. Prendiamo in considerazione i fine settimana e gli altri giorni in cui il programmatore non sarà in grado di lavorare sull'attività, nonché la data di inizio del lavoro (lo sviluppatore non è sempre pronto ad affrontare l'attività lo stesso giorno). Pertanto, otteniamo le date di inizio e fine del lavoro.

Promuovere Retrocedere

Nella nostra azienda, la pianificazione delle attività passa sempre attraverso diverse fasi. Dal punto di vista aziendale, formuliamo 5-6 obiettivi strategici per l'anno. Si tratta di compiti di alto livello, ad esempio, aumentare alcuni parametri di una certa percentuale. Successivamente, varie divisioni dell'azienda formulano compiti aziendali per tutti i team IT. Le scadenze per queste attività ricevono una stima approssimativa iniziale, che spesso è formata da tutti i membri del team: manager, analista, sviluppatore e tester. Una volta che l'azienda riceve questa valutazione, dà la priorità alle attività in base agli obiettivi strategici dell'azienda. Gli obiettivi strategici trasversali aiutano in questo; con essi diventa ovvio che stiamo tutti lavorando per una causa comune; non esiste una situazione del genere in cui qualcuno tira solo nella propria direzione; Raccogliamo sprint da compiti accuratamente stimati in termini di scadenze. Per alcune squadre sono trimestrali, per altre mensili. I team forniscono una stima accurata di diversi compiti che, secondo una stima preliminare, rientreranno nel prossimo sprint. I compiti di grandi dimensioni sono suddivisi in compiti di livello inferiore, per ciascuno dei quali è responsabile un esecutore specifico, ed è lui che fornisce una valutazione accurata.

In questa fase è importante non dimenticare di aggiungere una riserva di tempo per correggere i bug, perché solo chi non fa nulla non commette errori. Sia i Product Owner che i clienti aziendali lo capiscono molto bene. Allo stesso tempo, il tempo richiesto deve essere adeguato: nessuno capirà uno sviluppatore che fissa una scadenza per un compito semplice troppo lungo; gli verrà chiesto di giustificare la decisione; La cosa più difficile è spiegare all'azienda perché ci vuole tempo per il refactoring. Siamo grati alla nostra azienda per il fatto che di tanto in tanto ci riusciamo, perché alla fine il refactoring porta alla semplificazione dell'infrastruttura e alla messa in ordine del codice, il che aumenta la stabilità del sistema e può accelerare significativamente lo sviluppo di nuove funzioni.

A volte si verificano ancora errori di valutazione. A mio avviso, è impossibile per il dipartimento di sviluppo delle grandi aziende con infrastrutture sviluppate evitarlo completamente. In questo caso, è importante che lo sviluppatore informi tempestivamente il suo manager di ciò che sta accadendo e lui, a sua volta, riesca ad avvisare l'azienda e a “riprodurre” qualcosa nei piani generali dell'azienda. Lavorare in questa modalità è molto più corretto che cercare freneticamente di fare in 3 giorni ciò che ne richiede 5, per poi affogare in un gran numero di errori sorti a causa di tanta fretta.

Promuovere Retrocedere

La risposta corretta ad entrambe le parti della domanda [come imparare a pianificare correttamente e consegnare un progetto in tempo - Rosso.] - esperienza. Non ci sono altri modi per “conoscere lo Zen”. Secondo la teoria della decisione, è possibile trarre conclusioni accurate solo sulla base dell’analisi di una serie di dati già disponibili. E più dati ci sono, più accurate saranno la previsione e la valutazione finale.

Nelle parole di Herbert Shaw: “L’esperienza è la scuola in cui un uomo impara quanto fosse sciocco prima”. Ciò porta ad una conclusione abbastanza semplice: se un programmatore ha già un’esperienza correlata al compito da svolgere, può fare affidamento su di essa, altrimenti può fare affidamento sull’esperienza dei suoi “colleghi”.

Successivamente, è necessario comprendere che la pianificazione diretta delle scadenze è un compito con cui le persone affrontano molto, molto male, soprattutto nello sviluppo. Nella stima delle scadenze è considerata buona pratica introdurre “fattori di rettifica” nella stima originaria. Questa metrica può variare da 1,5 a 3, a seconda dell'esperienza dello sviluppatore e della totalità dei gradi di incertezza dei compiti da risolvere all'interno del progetto.

Promuovere Retrocedere

È importante considerare molti fattori quando si determinano le scadenze.

Ad esempio, esperienza lavorativa. Quanto chiaramente comprendi la portata del lavoro che ti aspetta? Hai già fatto qualcosa del genere prima? È chiaro che maggiore è l'esperienza, più velocemente il lavoro sarà completato.

Una specifica tecnica ben scritta gioca un ruolo significativo nel determinare le scadenze. Le cose sono molto difficili nella nostra zona. Spesso il cliente stesso non sa cosa vuole, quindi consiglio di dedicare un giorno o due in più, ma facendo in modo che il cliente abbia un'idea chiara del risultato desiderato. È importante che questa comprensione sia reciproca. E solo dopo puoi iniziare a negoziare l'importo e i termini.

Inoltre, includi sempre i rischi. Per i principianti, consiglio di moltiplicare per due il tempo di completamento stimato. Dopotutto, è meglio consegnare un progetto prima del previsto e crescere come specialista agli occhi del cliente, piuttosto che consegnarlo in un secondo momento e rovinare la propria reputazione.

Promuovere Retrocedere

Una raccomandazione generale è che lo sviluppatore impari a scomporre correttamente le attività, cerchi sempre possibili insidie, faccia affidamento sulla propria esperienza e non dimentichi di avvisare tempestivamente clienti e colleghi se l'attività non può essere risolta entro il tempo specificato telaio.

Costruire un piano chiaro è molto più difficile che determinare la scadenza per il completamento di una singola attività. Allo stesso tempo, è importante non solo consegnare il progetto in tempo, ma anche garantire che il sistema sviluppato risolva correttamente i problemi aziendali. Qui, i team IT sono aiutati da varie metodologie di sviluppo software: da RUP e MSF a SCRUM e altri formati Agile. La scelta degli strumenti è molto ampia e molti dei nostri clienti vogliono capire in anticipo come lavoreremo con loro nel progetto, a quali principi aderiamo.

A proposito, il tema Agile oggi si sta avvicinando sia al business che ai singoli progetti del settore pubblico, poiché i principi di questa metodologia consentono di implementare i progetti molto rapidamente, gestendo le aspettative dei clienti ad ogni iterazione. Ad esempio, in un team Agile non ci sono praticamente discussioni prolungate con il cliente. Dimentica decine di pagine che descrivono dettagli tecnici non necessari, ad esempio la velocità con cui appare un elenco a discesa. Dai al cliente l'opportunità di provare una versione intermedia del sistema, quindi diventerà molto più facile per voi capirvi.

Il team Agile pianifica tutto insieme e determina il livello ottimale di manodopera necessario per risolvere un particolare problema. Ad esempio, una delle tecniche si chiama “Poker Planning”, in cui ogni partecipante fornisce in modo anonimo la sua valutazione del costo della manodopera richiesto per un compito specifico. Successivamente, il team determina il peso medio del compito in story point o ore uomo e distribuisce i compiti secondo il principio “a chi piace cosa”. Allo stesso tempo, ogni giorno il team si riunisce per una riunione di 15 minuti, durante la quale in un paio di minuti tutti parlano dello stato dei loro compiti attuali, inclusa la segnalazione di eventuali difficoltà sorte. Il team risolve rapidamente il problema rilevato, in modo che il cliente possa passare alla fase successiva del lavoro del programmatore il più rapidamente possibile. Gli sviluppatori non ritardano il completamento delle attività a causa della riluttanza a disturbare ancora una volta il team o a inutili tentativi di capirlo da soli, perdendo tempo prezioso. A proposito, con tali mini-statu, gli sviluppatori hanno il desiderio di mostrare il loro lato migliore, di dimostrare che ti avvicini al tuo lavoro in modo responsabile. Motiva davvero e autodisciplina.