Per software si intende la serie di istruzioni o programmi che indicano a un computer cosa fare. È indipendente dall'hardware e rende programmabili i computer. Esistono fondamentalmente tre tipi di software:
Software di sistema: fornisce le funzioni principali come sistemi operativi, gestione del disco, utility, gestione dell'hardware e altre necessità operative.
Software di programmazione: fornisce ai programmatori strumenti come editor di testo, compilatori, linker, debugger e altri strumenti per la creazione di codice.
Software applicativo (applicazioni o app): consente agli utenti di eseguire attività. Ne sono esempi le suite di produttività per ufficio, i software di gestione dei dati, i lettori multimediali e i programmi di sicurezza. Il termine applicazioni si riferisce anche alle applicazioni per il web e per i dispositivi mobili, come quelle che si usano per fare acquisti su Amazon.com, socializzare con Facebook o pubblicare foto su Instagram.1
Un quarto tipo di software può essere considerato il cosiddetto software embedded. I software di sistema embedded si usano per controllare macchine e dispositivi non tipicamente considerati computer, come ad esempio reti di telecomunicazioni, automobili, robot industriali e altro ancora. Questi dispositivi e il relativo software possono essere connessi nell'ambito dell'Internet of Things (IoT).2
Lo sviluppo del software viene condotto principalmente dai programmatori, dagli ingegneri informatici e dagli sviluppatori di software. Sono figure che interagiscono e si sovrappongono, e le dinamiche tra di loro variano notevolmente tra i vari reparti e comunità di sviluppatori.
I programmatori scrivono il codice sorgente per la programmazione dei computer per attività specifiche come l'unione di database, l'elaborazione di ordini online, l'instradamento di comunicazioni, la conduzione di ricerche o la visualizzazione di testo e grafica. Di solito, i programmatori interpretano le istruzioni fornite dagli sviluppatori di software e dagli ingegneri informatici e per attuarle utilizzano linguaggi di programmazione come C++ o Java.
Gli ingegneri informatici applicano i principi ingegneristici per creare software e sistemi per la risoluzione di problemi. Utilizzano il linguaggio di modellazione e altri strumenti per ideare soluzioni che spesso possono essere applicate ai problemi in modo generale, anziché limitarsi a soluzioni applicabili solo a un'istanza o a un cliente specifico. Le soluzioni di ingegneria informatica aderiscono al metodo scientifico e devono essere utilizzabili nel mondo reale, per esempio con ponti o ascensori. Man mano che i prodotti sono diventati sempre più intelligenti, grazie all'aggiunta di microprocessori, sensori e software, la responsabilità degli ingegneri informatici è aumentata. Infatti, non solo il numero dei prodotti che si basano sul software per differenziarsi sul mercato è in continua crescita, ma il loro sviluppo software deve essere coordinato con l'attività di sviluppo meccanico ed elettrico.
Gli sviluppatori software svolgono un ruolo meno formale rispetto agli ingegneri e possono essere strettamente coinvolti in aree specifiche del progetto, inclusa la scrittura di codice. Allo stesso tempo, guidano l'intero ciclo di vita dello sviluppo software, compresa la collaborazione con i vari team funzionali per trasformare i requisiti in funzioni, gestire i team e i processi di sviluppo e condurre le operazioni di test e manutenzione del software.3
L'attività di sviluppo del software non è limitata agli sviluppatori o ai team di sviluppo: anche professionisti come scienziati, fabbricanti di dispositivi e produttori di hardware creano codice software, benché non siano in primo luogo sviluppatori. E nemmeno si limita ai tradizionali settori informatici, come le aziende produttrici di software o di semiconduttori. Tant'è che, secondo il Brookings Institute (link esterno a ibm.com), queste aziende “rappresentano meno della metà delle aziende che si occupano di sviluppo software”.
Una distinzione importante si ha tra lo sviluppo di software personalizzato e quello di software commerciale. Per sviluppo di software personalizzato si intende il processo di progettazione, creazione, implementazione e gestione di software destinato a un gruppo specifico di utenti, funzioni o organizzazioni. Per contro, il software commerciale pronto all'uso (COTS) viene progettato per soddisfare un'ampia serie di requisiti e può dunque essere confezionato, commercializzato e distribuito sul mercato.