È perché sono stati tutti scritti in lingue gestite, immerse nella spazzatura anziché in codice nativo?
No. Il codice lento funzionerà male a prescindere. Certo, un linguaggio particolare può introdurre alcune classi di problemi mentre risolve gli altri. Ma i bravi programmatori sono abbastanza in grado di trovare soluzioni alternative con abbastanza tempo.
Sono i singoli programmatori che hanno scritto il software per questi dispositivi?
In parte. In molti casi è abbastanza probabile almeno un fattore che contribuisce. Questo è uno sfortunato effetto collaterale di un settore in cui i buoni programmatori sono molto richiesti e scarsamente disponibili. Anche i divari tra i vari livelli di abilità tecnica possono essere piuttosto ampi. Quindi è ovvio che a volte i programmatori incaricati di implementare determinati software potrebbero essere congratulati solo per farlo funzionare (in un certo senso ).
In tutti questi casi gli sviluppatori di app sapevano esattamente quale piattaforma hardware stavano prendendo di mira e quali erano le sue capacità; non l'hanno preso in considerazione?
In parte. Per cominciare, la piattaforma hardware esatta probabilmente non è nota, poiché spesso viene negoziata con vari produttori in parallelo durante lo sviluppo del software. In effetti, dopo il rilascio iniziale possono esserci anche piccole (ma non necessariamente insignificanti) modifiche all'hardware sottostante. Tuttavia, concordo sul fatto che saranno note le capacità generali.
Parte del problema è che il software probabilmente non è sviluppato sull'hardware, è fatto con gli emulatori. Ciò rende difficile tenere conto delle prestazioni reali del dispositivo anche se gli emulatori sono precisi al 100%, cosa che non lo sono.
Ovviamente ciò non giustifica realmente i test insufficienti sull'hardware prototipo appropriato prima del rilascio. Quella colpa probabilmente è al di fuori del controllo dev / qa.
È il tipo che va in giro a ripetere "l'ottimizzazione è la radice di tutti i mali", li ha portati fuori strada?
No. Sono abbastanza certo che non lo ascoltano comunque; altrimenti non verrebbe citato erroneamente così spesso (dovrebbe essere " ottimizzazione prematura ..."). :-D
È più probabile che troppi programmatori prendano uno dei 2 estremi per quanto riguarda l'ottimizzazione.
- O lo ignorano completamente.
- Oppure si ossessionano con le minuzie che non hanno nulla a che fare con i reali requisiti di prestazione. L'effetto netto è che il budget si esaurisce e il codice è troppo offuscato per ottimizzare in modo sicuro i problemi di prestazioni reali .
Era una mentalità di "oh, sono solo altri 100 ms" ogni volta fino a quando tutti quei millisecondi si sommano in minuti?
Possibilmente. Ovviamente se Sleep(100)
è stato usato come equivalente della carta velina utilizzata per rallentare l'emorragia di un arto reciso, allora ci si devono aspettare problemi. Tuttavia, sospetto che il problema sia più sottile di così.
Il fatto è che l'hardware di elaborazione moderno (compresi i dispositivi integrati) è molto più veloce di quanto le persone attribuiscano loro credito. Molte persone, anche i programmatori "esperti" non riescono ad apprezzare quanto siano veloci i computer. 100ms è un tempo lungo - un tempo molto lungo . E come accade, questo "tempo molto lungo" taglia 2 modi:
- Il primo è che i programmatori si preoccupano inutilmente delle cose che un computer fa in modo estremamente rapido. (Accade così che sia stata proprio una tale preoccupazione " incrementare un valore 300 volte al secondo " che mi ha portato qui in primo luogo.)
- Il secondo è che a volte non riescono a mostrare la dovuta preoccupazione quando le cose richiedono molto tempo (sulla scala di calcolo). Così:
- se ignorano gli effetti della latenza quando comunicano su una rete o con un dispositivo di archiviazione;
- se ignorano l'impatto di un thread bloccato e in attesa di un altro thread;
- se dimenticano che, poiché i computer funzionano così rapidamente, è molto in grado di ripetere un'attività molto più spesso di quanto dovrebbe, senza che lo sviluppatore sia a conoscenza di un problema
- ... se si verifica una combinazione di tali sviste, una routine verrà eseguita inaspettatamente molto lentamente (sulla scala dei tempi di calcolo). Alcune ripetizioni e sarà persino evidente dagli umani, ma potrebbe essere difficile da definire perché centinaia di cose interconnesse corrono rapidamente da sole.
È colpa mia, per aver comprato questi prodotti in primo luogo?
Sì, sicuramente. Bene, non tu personalmente ma i consumatori in generale. I prodotti sono venduti (e acquistati ) dalle liste di controllo delle funzionalità. Troppi consumatori richiedono prestazioni migliori.
Per illustrare il mio punto: l'ultima volta che ho voluto acquistare un telefono cellulare, il negozio non poteva nemmeno offrire un modello demo con cui giocare in negozio. Tutto ciò che avevano erano gusci di plastica con adesivi per mostrare come sarebbe stato lo schermo. Non puoi nemmeno avere un'idea del peso del genere - per non parlare delle prestazioni o dell'usabilità. Il mio punto è che se un numero sufficiente di persone si opponesse a quel modello di business e votasse con i loro portafogli per esprimere la propria obiezione, saremmo un piccolo passo nella giusta direzione.
Ma non lo fanno, quindi non lo siamo; e ogni anno i nuovi telefoni cellulari funzionano più lentamente su hardware più veloce.
(Le domande non sono state poste.)
- La colpa è del marketing? In parte. Hanno bisogno di date di uscita. E quando incombe la data, la scelta tra "farlo funzionare" e "renderlo più veloce" è un gioco da ragazzi.
- I responsabili delle vendite sono i responsabili? In parte. Vogliono più funzionalità nella lista di controllo. Promuovono elenchi di funzionalità e ignorano le prestazioni. (A volte) fanno promesse non realistiche.
- I responsabili sono i responsabili? In parte. I manager inesperti possono commettere molti errori, ma anche i manager molto esperti possono (giustamente) sacrificare il tempo per risolvere i problemi di prestazioni a favore di altre preoccupazioni.
- Le specifiche sono da biasimare? In parte. Se qualcosa viene lasciato fuori specifica, è molto più facile "dimenticarsene" in un secondo momento. E se non è espressamente indicato, qual è l'obiettivo? (Anche se credo personalmente che se una squadra è orgogliosa del proprio lavoro, si preoccuperebbe delle prestazioni a prescindere.)
- L'educazione è la colpa? Può essere. L'istruzione probabilmente sarà sempre in secondo piano. Certamente disapprovo l '"educazione" che sforna rapidamente i principianti con una comprensione superficiale dello sviluppo del software. Tuttavia, l'educazione sostenuta dalla teoria e instillando una cultura dell'apprendimento non può essere cattiva.
- La colpa è degli aggiornamenti? In parte. Nuovo software, vecchio hardware è davvero un destino allettante. Anche prima che venga rilasciata la versione X, X + 1 è in fase di pianificazione. Il nuovo software è compatibile, ma il vecchio hardware è abbastanza veloce? È stato testato? Una particolare correzione delle prestazioni può essere inserita nel nuovo software, incoraggiando un aggiornamento software sconsigliato.
Fondamentalmente, credo che ci siano molti fattori che contribuiscono. Quindi, sfortunatamente, non esiste un proiettile d'argento per ripararlo. Ma ciò non significa che sia tristezza e tristezza. Ci sono modi per contribuire a migliorare le cose.
Quindi, a che punto le cose sono andate male per questi prodotti?
IMHO non possiamo davvero identificare nessun singolo punto. Ci sono molti fattori che si sono evoluti nel tempo.
- Contatori di fagioli: riduzione dei costi, tempistica del mercato. Ma poi avremmo fatto i progressi che abbiamo ottenuto senza la pressione?
- Elevata domanda e scarsa offerta di personale qualificato nel settore. Non solo programmatori, ma anche manager, tester e persino venditori. La mancanza di abilità ed esperienza porta ad errori. Ma poi porta anche all'apprendimento.
- Tecnologia all'avanguardia. Fino a quando una tecnologia non matura, morde regolarmente in modi inaspettati. Ma poi di nuovo spesso ha offerto una serie di vantaggi in primo luogo.
- Complicazione composta. Nel tempo, l'industria si è evoluta: aggiungendo più strumenti, tecnologie, livelli, tecniche, astrazioni, hardware, lingue, variazioni, opzioni. Ciò rende in qualche modo impossibile avere una "piena" comprensione dei sistemi moderni. Tuttavia, siamo anche in grado di fare molto di più in un tempo molto più breve di conseguenza.
Cosa possiamo fare come programmatori per evitare di infliggere questo dolore ai nostri clienti?
Ho alcuni suggerimenti (sia tecnici che non tecnici) che possono aiutare:
- Per quanto possibile, usa il tuo prodotto. Non c'è niente come l'esperienza di prima mano per rivelare cose imbarazzanti, lente o scomode. Tuttavia dovrai evitare consapevolmente di evitare le carenze dovute alla "conoscenza privilegiata". Ad esempio, se non hai problemi a sincronizzare i contatti perché lo fai con uno script Python backdoor, non stai usando "il prodotto". Il che fa apparire il punto successivo ...
- Ascolta i tuoi utenti (preferibilmente di prima mano, ma almeno di seconda mano tramite supporto). So che i programmatori (in genere) preferiscono rimanere nascosti ed evitare l'interazione umana; ma ciò non ti aiuta a scoprire i problemi che altre persone incontrano durante l'utilizzo del tuo prodotto. Ad esempio, potresti non notare che le opzioni del menu sono lente, perché conosci tutte le scorciatoie e le usi esclusivamente. Anche se il manuale documenta completamente tutte le scorciatoie, alcune persone preferiranno comunque i menu, nonostante siano insopportabilmente lente.
- Sforzati di migliorare le tue abilità e conoscenze tecniche su base continua. Sviluppa l'abilità per analizzare criticamente tutto ciò che impari. Rivaluta regolarmente le tue conoscenze. In alcuni casi, preparati a dimenticare ciò che pensavi di sapere. Il che fa apparire ...
- Alcune tecnologie / tecniche possono essere molto complicate, portando a sottili malintesi e implementazioni errate. Altri, attraverso l'evoluzione della conoscenza comune o degli strumenti disponibili, potrebbero cadere in disgrazia o favore (ad es. Singletons). Alcuni argomenti sono così complicati che generano un gruppo di "esperti di hoc-pocus" che propagano un enorme corpus di disinformazione. Un mio particolare bugbear è la disinformazione che circonda il multi-threading. Una buona implementazione multi-thread può migliorare significativamente l'esperienza dell'utente. Sfortunatamente molti approcci disinformati al multi-threading ridurranno significativamente le prestazioni, aumenteranno i bug irregolari, aumentano i rischi di dead-lock, complicano il debugging ecc. Quindi ricorda: solo perché lo ha detto un "esperto", non lo rende vero.
- Assumere la proprietà. (No sul serio, non sto giocando a bingo nella sala del consiglio.) Negoziare con gestori, proprietari di prodotti, addetti alle vendite per caratteristiche prestazionali che hanno la precedenza su alcuni elementi della checklist. Richiedi specifiche migliori. Non infantilmente, ma ponendo domande che inducono le persone a pensare alle prestazioni.
- Sii un consumatore esigente. Scegli il telefono che ha meno funzioni ma è più veloce. (CPU non più veloce, UI più veloce.) Quindi vantati ! Più consumatori iniziano a richiedere prestazioni elevate, più contatori di bean inizieranno a preventivare il budget.