En uppkopplad produkt kan se färdig ut långt innan allt konstruktionsarbete kring den är klart. Prototypen är stabil, data når molnet, appen visar rätt värden och den första omgången enheter finns redan i användarnas händer. Vid den tidpunkten kan backend-systemet fortfarande vara tillräckligt enkelt för att teamet ska känna till nästan varje enhet individuellt. Provisionering kan hanteras med ett skript, konfigurationsändringar kan göras manuellt och om något går fel kan en ingenjör vanligtvis spåra problemet direkt.

Sedan måste den börja leva i verkligheten. En andra hårdvarurevision dyker upp. Vissa kunder använder fortfarande den första revisionen. Firmware-versionerna börjar skilja sig åt. En ny konfiguration behövs för en annan kund eller marknad, medan äldre enheter fortfarande behöver uppdateringar och support.

Ingenting är nödvändigtvis trasigt. Programvaran bakom enheten har helt enkelt fått en egen livscykel.

Den övergången är lätt att missa eftersom prototypen kan fortsätta fungera perfekt. Men när flera versioner av samma fysiska produkt måste samexistera ute i fält är backend-systemet inte längre bara infrastruktur bakom hårdvaran. Det blir en del av själva produktarkitekturen.

En fungerande uppkopplad prototyp är ännu inte en skalbar produkt

En prototyp har en viktig uppgift: att bevisa att systemet fungerar från början till slut. Enheten utför sin kärnfunktion, firmware kommunicerar med backend-systemet, telemetri anländer dit den ska, kommandon gör returresan och ett mobilt eller webbgränssnitt exponerar funktionaliteten för en användare.

Vad det vanligtvis inte har bevisat är hur väl samma system hanterar variation.

De första tjugo enheterna kan alla köra samma firmware, vara byggda med samma hårdvarurevision och konfigureras av samma ingenjörer. I det skedet kan manuell registrering, direkta konfigurationsändringar eller ett litet onboarding-skript vara helt förnuftigt. Att bygga verktyg i produktionsklass innan produkten har bevisat sin potential kan vara förhastat.

Skala förändrar problemet. Enheter förblir offline, byts ut, kör olika firmware och kräver olika kundkonfigurationer. Supporten måste skilja på en enhet som aldrig provisionerades korrekt från en som är felkonfigurerad eller helt enkelt oåtkomlig.

Prototypskuld börjar ofta så här: inte med ett dåligt beslut, utan med ett tillfälligt beslut som kvarstår efter att produkten har gått vidare. Och en av de första sakerna som tvingar fram den övergången är själva hårdvaran. En ny revision ersätter inte bara den gamla; den måste samexistera med den.

Varje hårdvarurevision skapar ett problem med mjukvarans livscykel

En ny hårdvarurevision kommer sällan som en ren ersättning för den gamla. I praktiken finns båda versionerna kvar i fält, ibland i åratal. Lägg till en övergångsbatch, några firmwaregrenar och kundspecifika konfigurationer, och flottan blir snabbt mer diversifierad än den ursprungliga produktmodellen antyder.

Programvaruskiktet kan inte längre behandla varje enhet som en abstrakt "enhet". Det behöver veta vad just den enheten är kapabel till.

Ett reviderat kort kan använda en annan sensor, kommunikationsmodul eller styrenhet. Ett kommando som är giltigt för den senaste versionen kanske inte stöds av ett tidigare. Kalibreringsvärden kan ändras. Konfigurationsgränser kan förskjutas. Ett firmwarepaket som är lämpligt för en generation kan vara osäkert för en annan.

Fysiska produktingenjörer arbetar redan på detta sätt. Två komponenter som ser nästan identiska ut är inte utbytbara om deras revisioner, toleranser eller specifikationer skiljer sig åt. Sammankopplade produkter skapar samma problem på programvarusidan: plattformen behöver ett tillförlitligt sätt att förstå vilken version av den fysiska produkten den kommunicerar med och vilka regler som gäller för den.

Tänk dig en produkt vars första revision använder en kalibreringsprocedur medan den andra introducerar en ny sensor och en annan uppsättning parametrar. För kunden kan båda enheterna fortfarande vara samma produkt. För plattformen kan de inte vara det.

Om dessa skillnader inte representeras explicit tenderar de att läcka in i applikationslogiken som specialfall. Ett arbetsflöde kontrollerar ett serienummerintervall. Ett annat använder en firmwareversion som en proxy för hårdvarugenerering. Ett tredje innehåller ett undantag som lagts till efter att supporten upptäckte att en äldre batch beter sig annorlunda ute i fält. Ingen av dessa korrigeringar ser särskilt farliga ut i sig, men tillsammans gör de varje framtida ändring svårare att resonera kring.

Äldre hårdvara försvinner sällan enligt schemat. Produktteam fokuserar naturligtvis på den senaste revisionen, medan kunder ofta behåller tidigare versioner mycket längre än förväntat. Plattformen måste därför stödja flera generationer samtidigt snarare än att anta att den installerade basen någonsin kommer att konvergera till ett enda nuvarande tillstånd.

När det väl händer blir hårdvaruutveckling och programvarulivscykelhantering oskiljaktiga. Plattformen behöver inte bara veta var en enhet befinner sig och om den är online, utan även vad den är, vad den kan köra, hur den ska konfigureras och vilka ändringar som är säkra att tillämpa.

Och innan någon av dessa frågor kan besvaras på ett tillförlitligt sätt måste varje enhet anslutas till systemet på ett konsekvent sätt.

Provisionering är där manuell ingenjörskonst slutar skalning

Provisionering ser enkelt ut när flottan är liten: skapa en enhetspost, ange ett serienummer, generera inloggningsuppgifter, tilldela enheten till en kund, tillämpa en konfiguration och fortsätt. För några dussin enheter kan det fortfarande vara rätt val att hantera en del av detta manuellt.

I produktionsskala ligger dock provisioneringen i skärningspunkten mellan enhetsidentitet, autentiseringsuppgifter, ägarskap, konfiguration och livscykeltillstånd. Ett misstag som görs under onboarding kan påverka hur enheten drivs och stöds långt efter att den lämnat fabriken.

Ett kalkylblad kanske inte längre matchar det som faktiskt är installerat. En ersättningsenhet behöver rätt kundassociation utan att ärva fel identitet. Fabriksåterställningar skapar en annan väg genom processen. En installatör kan tilldela en enhet till fel konto, vilket lämnar åt supporten att avgöra om den är offline, felaktigt provisionerad eller helt enkelt har fel konfiguration.

När det rutinmässigt krävs att en utvecklare inspekterar en databas eller kör ett internt skript för att besvara dessa frågor, har processen slutat skalas med produkten.

Duplicering är ytterligare ett varningstecken. Varje produktvariant börjar få sitt eget onboarding-skript, konfigurationsverktyg eller installationsarbetsflöde. Dessa skillnader kan se små ut, men det underliggande ansvaret är detsamma. Provisionering har blivit en återanvändbar plattformsinfrastruktur snarare än en installationsuppgift kopplad till en viss enhet.

Och det är sällan den enda kapaciteten som behöver återanvändas.

Plattformslagret bör bli återanvändbar infrastruktur

När flera produkter eller hårdvarurevisioner delar samma grundläggande behov, slutar vissa programvarufunktioner att vara produktspecifika. Enhetsidentitet, provisionering, anslutning, telemetri, leverans av firmware, livscykeltillstånd, flottans synlighet och diagnostik är bra exempel. Att bygga om dem för varje ny variant skapar mer kod och fler operativa vägar att underhålla utan att göra själva produkten mer distinkt.

Team ger sig sällan ut på att skapa denna duplicering. Små skillnader ackumuleras runt varje produkt tills teamet underhåller flera implementeringar av vad som har blivit samma tekniska ansvar.

En tydligare gräns är att separera produktlagret från plattformslagret. Produktlagret innehåller beteendet, arbetsflödena, gränssnitten, integrationerna och domänlogiken som gör en viss enhet värdefull. Plattformslagret hanterar mekanik som bör förbli konsekvent även när hårdvaran ändras.

Allt eftersom uppkopplade produkter går längre än sin första release blir enhetsprovisionering, enhetslivscykelhantering, flotthantering och supportverktyg delad infrastruktur snarare än engångsprojektdetaljer. En IoT PaaS för företag kan tillhandahålla det återanvändbara plattformslagret över flera produkter eller produktvarianter, och hantera standardenhets- och datahantering genom återanvändbara byggstenar medan ingenjörsteamen håller sina anpassade insatser fokuserade på hårdvara, arbetsflöden och användarupplevelse.

En gemensam grund måste fortfarande lämna utrymme för verkliga produktskillnader. En ny enhet kan behöva en annan datamodell, konfigurationsflöde, integration eller kontrolllogik, och dessa skillnader bör förbli enkla att introducera. Målet är helt enkelt att undvika att varje skillnad släpar med sig ytterligare ett enhetsregister, telemetri-pipeline, provisioneringsmekanism eller uppsättning verktyg för vagnparkshantering.

Plattformen kan se ut som en omkostnadskostnad medan teamet bygger den första produkten och som en tillgång vid den andra eller tredje. När de gemensamma operativa mekanikerna är på plats kan en ny variant ärva en fungerande grund istället för att komma med en annan backend som teamet måste underhålla under resten av produktens livslängd.

Behåll specialdesign där produkten faktiskt är annorlunda

En återanvändbar plattform bör inte göra uppkopplade produkter mer generiska. Dess uppgift är att ta bort upprepad ingenjörskonst från de delar som inte skapar differentiering.

Anpassade ansträngningar hör fortfarande hemma i enhetsbeteende, domänspecifik logik, arbetsflöden, användarupplevelse, specialiserade integrationer och hur en viss produkt interagerar med den fysiska världen. Det är just de områden där tekniska val kan göra en produkt betydligt bättre än en annan.

Det som sällan förtjänar samma behandling är den omgivande rörledningen. En grundversion och en industriell version av samma maskin kan behöva olika sensorer, kontroller och gränssnitt, men de bör inte kräva separata sätt att identifiera enheter, spåra firmwareversioner eller hantera en maskinpark.

Jag skulle hellre se att ingenjörer lägger den tiden på att förfina hur produkten beter sig ute i fält än att bygga om mekaniken som teamet redan har på plats för en annan produkt. En gemensam grund minskar inte utrymmet för specialanpassad ingenjörskonst; den skyddar den ansträngningen från att förbrukas av infrastruktur.

Det riktiga testet kommer när teamet börjar med produkt nummer två.

En bra plattform gör nästa produkt enklare än den första

Om produkt nummer två kräver nästan samma plattformsarbete som produkt nummer ett, har väldigt lite faktiskt återanvänts.

En ny variant bör kunna ärva de delar av driftsmodellen som inte har ändrats: provisioneringsflöden, identitet, livscykelmekanik, flottverktyg, firmwareprocesser, supportsynlighet och gemensamma integrationer. Ingenjörsarbetet går sedan in på skillnaderna – kanske ett nytt sensorpaket, ett annat kontrollarbetsflöde eller en kundspecifik integration – istället för att rekonstruera grunden.

En ny hårdvarugeneration sätter samma idé under större press. Dess kapacitet kan komma att förändras avsevärt medan äldre enheter förblir aktiva inom området. En mogen plattform kan stödja båda utan att tvinga teamet att underhålla två separata plattformsstackar för vad kunderna fortfarande uppfattar som en produktfamilj.

Inget av detta kräver en enda monolitisk backend. Olika produkter kan fortfarande behöva tydliga arkitektoniska gränser. Det viktiga är att undvika en andra implementering av samma tekniska ansvar utan goda skäl.

Det är då plattformen blir en tillgång snarare än ackumulerad overhead. Supporten har färre parallella verktyg att förstå, versioner följer mer konsekventa vägar, och att lägga till ytterligare en produkt blir en kontrollerad tilläggstjänst istället för ytterligare en backend som företaget ärver på obestämd tid.

Behandla plattformen som en del av produktarkitekturen

Fysiska produkter utformas med hänsyn till revisioner, servicevänlighet, tillverkningsbarhet och framtida förändringar. Uppkopplade produkter behöver samma disciplin på programvarusidan.

Den första backend-plattformen kan vara tillfällig. Det kan även det första provisioneringsskriptet eller supportverktyget. Det är inget fel med det i sig. Problem börjar när de tillfälliga mekanismerna i tysthet blir permanent arkitektur medan själva produkten fortsätter att utvecklas.

Vid det laget är den uppkopplade produkten inte längre bara hårdvara, firmware och en app. Den är också beroende av den infrastruktur som identifierar varje enhet, förstår dess funktioner, tillämpar rätt konfiguration, stöder uppdateringar och hjälper team att diagnostisera problem flera år efter leverans.

När det lagret behandlas som produktarkitektur blir uppdelningen tydligare: standardmekanik förblir återanvändbar, medan anpassat arbete handlar om vad som faktiskt skiljer en produkt eller produktfamilj från en annan.

Den starkaste plattformen är inte bara den som möjliggör den första uppkopplade produkten. Det är den som låter ingenjörsteamet bygga den andra, tredje och fjärde utan att ärva en ny backend varje gång.

Författare