Ward van der Put

Al 10 jaar zijn Ward en ik in discussie over of een webwinkel een taxonomie moet hebben of niet. We vonden elkaar ooit via het blog van Karel Geenen (geloof ik?) en zetten onze discussies voort via de mail, Twitter, dit blog en op een forum voor webwinkeliers. Als ik een nieuwe invalshoek heb om hem te overtuigen dat een taxonomie meer kwaad dan goed doet laat ik dat weten en hij legt dan geduldig uit waarom een taxonomie onmisbaar is. Af en toe stuurt Ward een artikel waaruit ik afleid dat hij twijfelt. En zo zijn wij al jarenlang met elkaar in gesprek.

Qua kennis en denkwijze zijn wij elkaars absolute tegenpolen:
Ward ontwikkelt webwinkelsoftwareheeft 18 boeken geschreven, leest alles wat ie erover kan vinden en spreekt vloeiend vreemde talen waaronder alle programmeertalen.
Ik ben autodidact. Ik lees zelden iets hierover. Omdat er niks was toen ik de webwinkel startte in 2002. Omdat het vaak in het Engels is en daar heb ik moeite mee. En later haakte ik af omdat iedereen er vanuit gaat dat een taxonomie een verplicht gegeven is. Ik ben code-blind; ik kan geen reeksen van tekens onthouden omdat ik er geen beeld bij heb.

Vrijwel iedereen, inclusief Google, is het met Ward eens en maakt een taxonomie aan waardoor mijn inziens de database ingewikkelder wordt dan nodig en de flexibiliteit afneemt.

Beeld
Bij de data van een webwinkel zie ik een totaalplaatje: een 4-dimensionale tabel waarmee je berekeningen doet: Je telt verzamelingen op, trekt ze van elkaar af en maakt doorsnedes. Ik benader het wiskundig; matrixberekeningen en verzamelingenleer. 

Taal
Bij Ward is data omschreven; het is vastgelegd in taal en code. Op die data laat je -omschreven- commando's los. Hij benadert het vanuit taal. Programmeertaal. Zoals ik code-blind ben vermoed ik dat Ward geen 4-dimensionale tabel kan zien.

We waren weer eens in een discussie beland die ik hier ga publiceren. Omdat we het bijna eens leken te zijn geworden. Discussie tot aan dat moment.*
Wards antwoorden in courier.

********************

Aanleiding was dat ik Ward enthousiast berichtte dat Artoek bij de nieuwe winkelhost bijna kan draaien met categorie = label = filter. Dat ik het alleen zo raar vind dat ik de filters moet koppelen aan een categorie. Hij stuurde me een link van WooCommerce:

Bron: WooCommerce
Het is goed dat ik nooit in woocommerce gedoken ben. Mijn hemel. Da's 8x dezelfde functie (search op een woord) maar dan steeds met een ander naampje.
Waarom heeft WooCommerce in hemelsnaam 8 verschillende filters?

Dat komt doordat WooCommerce is gebouwd op een WordPress-datamodel: dat is oorspronkelijk bedoeld voor blogs en is ongeschikt voor het goed structureren van producten.
Dat is ook de reden waarom WooCommerce niet goed schaalbaar is: zodra de hoeveelheid data een kritieke omvang heeft bereikt, wordt het fysiek onmogelijk die voldoende snel op te vragen. Dan krijg je webpagina’s die in meer dan 4 seconden laden — en daarvan weten we  dat het vele duizenden euro’s omzet kost.
Om het meer technisch te maken: beide problemen worden veroorzaakt door het EAV-datamodel.  Hierbij worden data opgeslagen als de drie-eenheid entiteit-attribuut-waarde (entity-attribute-value), bijvoorbeeld:
Product 234 - Kleur - Geel
Product 345 - Kleur - Rood
Product 234 - Maat - XL
Product 345 - Maat - L
Dat is heerlijk eenvoudig, maar juist daardoor ook te simplistisch: je kunt er géén complexe, natuurlijke relaties tussen entiteiten én tussen attributen mee opslaan. En dat kan al helemaal niet op grote schaal.

Waarom zouden blogartikelen niet op dezelfde manier gestructureerd kunnen worden als producten?
Zelfs de chronologische sortering komt voor bij webwinkels (sortering op “laatst toegevoegd”).
Wordpress is een prima pakket. Dat gehamer van Yoast op taxonomie, voorkeurscategorie en broodkruimel is waarom zovelen het zo ingewikkeld maken.

Omdat er geen AA-batterijen in hoeven, bijvoorbeeld.
Stuurt dit plaatje.

Kwestie van een extra filtergroep.
Bij mijn filtergroepen kun je ook merken, kleuren, maten, materialen of inderdaad batterij-keuze aanmaken.
Nou zul je niet snel op batterij-keuze filteren. Dus toon je deze filtergroep alleen op de productpagina. Als attribuut.

Niet het wiel opnieuw uitvinden:
In dat schema van een datamodel (dat door een bepaald platform wordt gebruikt) zie je rechtsonder hoe product feature categories tot stand kunnen komen op basis van productattributen. Met andere woorden: een categorie is hier geen container waar je een product in doet, maar ontstaat uit de intrinsieke eigenschappen die een product al heeft en waarin dat product overeenkomt met óf verschilt van andere producten.

Naast deze intrinsieke product feature categories heb je nog extrinsieke categorieën die vooral worden bepaald door relaties van producten met andere dingen, bijvoorbeeld toepassingen en doelgroepen.


Kenmerk = alle dingen die je een aan product kunt koppelen (extrinsieke categorieën, relaties, toepassingen, doelgroepen, intrinsieke eigenschappen, product feature categories).

1e winkel via MijnWinkel
Producten zijn eenduidig geordend. Hebben een vaste plek in een monohiërarchie. Dit is een lineaire ordening met broodkruimels. Tweedimensionaal.
Kenmerken zijn hier categorieën

2e winkel via Luondo
Producten zijn meerduidig geordend. Ik kan ze in meerdere verzamelingen tegelijk zetten. Een driedimensionale ordening. (Die oa Yoast weer op een tweedimensionale wilt laten lijken met voorkeurscategorieën om de broodkruimels te kunnen definiëren. Tweedimensionaal is een vereiste bij een fysiek product omdat die maar op een plek kan staan. Ik snap al 15 jaar niet waarom iedereen online een vaste plek wilt kunnen definiëren.)
Kenmerken zijn hier labels

3e winkel waar ik nu mee bezig ben TheShopBuilders
Producten zijn meerduidig geordend en ik kan de verzamelingen combineren (optellen, doorsnede). Vierdimensionaal, krijg je niet meer op papier getekend.
Kenmerken zijn hier filters

Persoonlijk ben ik het meest gecharmeerd van de filters van Coolblue. Die zijn wat mij betreft de de facto standaard. Vergelijk deze bijvoorbeeld maar eens:

Bron: Coolblue
Dit zijn subcategorieën waarvan er enkele ook als filter voorkomen. En dan ben je dus als Coolblue dingen dubbel aan het doen.

Subcategorieën met een broodkruimel in de url.

Ik kan begrijpen dat je als beelddenker het totaalplaatje holistisch als één geheel ziet. Ik zie het meer als een proces: productkenmerken -> selectiecriterium -> subset-selectie
En dus: attributen -> filter -> categorie (met producten die attributen hebben die voldoen aan het filtercriterium)
Het is voor mij als systeemdenker, of systeembouwer, niet één ding maar een samenspel van drie samenwerkende systeemonderdelen:
1. invoer (input): producteigenschappen 
2. doorvoer (throughput): filter 
3. uitvoer (output): categorie

Of visueler: 
1. ik weet iets (productattributen) 
2. ik doe iets (filteren) 
3. ik heb iets (categorie of selectie)

Ik zie dit hetzelfde: Een subcategorie is het resultaat van filteren met 2 attributen. 2 attributen in vaste volgorde, de broodkruimel. Daarom snap ik niet dat ze bij Coolblue een subcategorie stofzuiger (attribuut 1) voor dierenharen (attribuut 2) hebben en een los attribuut dierenharen. Dit is dubbelop en maakt de structuur onnodig complex.

Stofzuigen, een toepassing, kan met producten zoals stofzuigers met zak, steelstofzuigers en robotstofzuigers:
  • coolblue·nl/stofzuigen
  • coolblue·nl/stofzuigers/stofzuigers-met-zak
  • coolblue·nl/stofzuigers/steelstofzuigers
  • coolblue·nl/robotstofzuigers
(Met pseudo-URL’s, zodat Twitter ze niet ingekort weergeeft.)

Bij Coolblue staan zoekwoorden relatief vaak naast elkaar. Zo voorkom je juist dat je subcategorieën moet knutselen. Robotstofzuigers staan naast stofzuigers, niet eronder.

Jawel, robotstofzuigers behoort onder stofzuigers te staan. Het is een type stofzuiger.

Een landingspagina voor het zoekwoord ‘stofzuigen’ is nuttig als je er gebruikers mee helpt. Het hangt er daarom mede van af of er daadwerkelijk zoekvolume en bezoekersverkeer is op het werkwoord ‘stofzuigen’. En daarvoor moet je zoekwoordenonderzoek uitvoeren — of gewoon erg veel bezoekers hebben, want dan kun je het afleiden uit hun gedrag en wat ze in de zoekbalk typen. Helpt het gebruikers echter niet, dan is het weinig meer dan een doorway-pagina en daarvan is Google niet gecharmeerd: support.google.com/webmasters/ans… 

Je moet een bezoeker niet laten kiezen tussen het woord stofzuigen en stofzuiger. Dan doe je iets dubbel.
Niemand die in een winkel bij stofzuigen gaat kijken als ie stofzuigerzakken zoekt. Je loopt in een Blokker naar de stofzuigers of naar de schoonmaakartikelen.


Accessoires zoals stofzuigerzakken bewijzen waarom een model moet kunnen omgaan met meer dan alleen hiërarchische relaties tussen producten. Bij Coolblue staan de stofzuigerszakken gewoon hier: coolblue·nl/stofzuigerzakken En níét hier, want een stofzuigerzak is géén afstammeling of subcategorie van een stofzuiger: coolblue·nl/stofzuigers/stofzuigers-met-zak/stofzuigerzakken
Bron: Coolblue

Ik tikte als zoekterm “stofzuigen” op Coolblue en kreeg deze idiote, debiele subcategorieën. Geen stofzuigerzak te bekennen.

Daarom is vasthouden aan een hiërarchie zo fout. Je moet kijken in welke verzameling de stofzuigerzakken passen en daar zet je ze neer. Ik zou ze bij de stofzuigers en bij de schoonmaakartikelen zetten.


In het kruimelpad staat dezelfde pagina wél onder stofzuigen, de hoofdtoepassing: Coolblue·nl > Stofzuigen > Stofzuigerzakken Met andere woorden, de hoofdnavigatie is niet per se identiek aan tweedimensionale URL’s: je kunt niet alleen stapjes omhoog en omlaag maken, maar ook zijsprongen.

Omhoog, omlaag en naar de zijkant is nog steeds lineair. Een boomstructuur. Een subcategorie staat altijd naast een andere subcategorie. Daar is het een subcategorie voor. En coolblue/stofzuigers en coolblue/stofzuigen zijn 2 hele rare categorieën om naast elkaar te hebben staan omdat stofzuigers onder stofzuigen valt…
Ik zou de robotstofzuiger in 2 autonome verzamelingen zetten als ik Coolblue was: stofzuigers en robots. Bij de stofzuigers staat ie naast de steelstofzuigers en zo. Bij de robots staat ie naast de grasmaaiers en zo. Uiteraard geen hiëarchie want robots kan boven stofzuigers staan en stofzuigers kan boven robots staan.
De stofzuigerzakken zou ik in 3 autonome verzamelingen zetten: stofzuigers, schoonmaakartikelen en stofzuigerzakken. De bezoeker kan rechtstreeks naar de stofzuigerzakken. Of via de schoonmaakartikelen. Of via de stofzuigers.
(Coolblue vind ik dus een van de slechtste wat betreft informatie-architectuur. Daar zit nul logica in qua verzamelingenleer.)


Het antwoord dat ik schreef met de bedoeling om het in een blog te zetten:

Om jouw 3 nummers aan te houden:
  1. Ik zie inderdaad een totaalplaatje van de data. Een 4-dimensionaal plaatje. Met de producten op de x-as, de kenmerken op de y-as, de plaatsen op de z-as en de productvarianten op de 4e as.
  2. Wat ik steeds een search noem is de actie die je uitvoert op die data. Het optellen van verzamelingen, een doorsnede maken van verzamelingen en soms verzamelingen aftrekken. De welbekende zoekopdrachten OR, AND en NOT.
  3. De gewenste selectie van artikelen is de uitkomst.
Om spraakverwarringen te voorkomen met categorie, filter en label noem ik dat:
  1. Data
  2. Actie
  3. Resultaat
Met mijn theorie:
  1. Heb je minder data nodig
  2. Is de actie een matrixberekening
  3. Krijg je makkelijker het gewenste resultaat.

1. DATA:

Wat vrijwel alle webwinkels fout doen is “duplicate content” in de data zetten:
  • Verouderde software gaat uit van 2-dimensionale data. Om een product op meerdere plaatsen te laten zien moet je het dupliceren.
  • Bij Coolblue staat dierenharen-stofzuigers als subcategorie èn als filter.
  • Heel wat winkels hebben merken als categorie èn als filter.
  • Vanwege SEO worden op elkaar lijkende categorieën aangemaakt. Coolblue heeft stofzuigers èn stofzuigen.
  • De al ingerichte winkel die ik kreeg bij mijn nieuwe host had kleuren en maten als filter en als optie. Kleuren en maten staan dan op de z-as (plaats) én de 4e as (productvariant).
Duplicate content maakt een database nodeloos ingewikkeld omdat er bij een actie een keuze gemaakt moet worden door de programmeur, google én de bezoeker. Reden waarom de, in mijn ogen idiote, voorkeurscategorie ontstaan is.

Het andere wat vrijwel iedere webwinkel fout doet is een hiërarchie aanbrengen in de waardes op de z-as. Er worden subcategorieën aangemaakt waardoor broodkruimels ontstaan. Een broodkruimel is een verbinding tussen 2 of meer plaatsen op de z-as. Een hoofdcategorie wordt opgesplitst in subcategorieën. Daardoor is de hoofdcategorie leeg, de producten staan in de subcategorie. Categorieën staan onder, boven of naast elkaar. Robot staat onder stofzuigers en niet erboven, waardoor de weg om naar robotstofzuigers via robot is geblokkeerd. Om een hiërarchie kloppend te krijgen moet je zorgvuldig structureren, meestal extra categorieën aanmaken, voorkeurscategorieën instellen en kruisverwijzingen maken. Een ander groot nadeel van hiërarchie is dat je deze moet communiceren met de bezoeker wat al snelt resulteert in een megamenu.

Hiërarchie beperkt de mogelijkheden:
Bron: Page Laubheimer
Bij het inmiddels failliete Athleteshop kon je de categorie schoenen niet filteren op voetbal. Omdat schoenen NAAST voetbal staat in de hiërarchie. Het gewenste resultaat; de verzameling voetbalschoenen bestond niet. Het is dat groene streepje in deze figuur dat ontbrak:
Bij de Hema kun je luiertassen niet vinden via tassen. Omdat de hoofdcategorie tassen niet bestaat, er zijn alleen subcategorieën dames/tassen en heren/tassen. En bij de hoofdcategorie baby’s hebben ze geen subcategorie tassen aangemaakt.

Ik vind dat je producten moet LABELEN zonder hiërarchie in deze labels aan te brengen. Je zet ze in elke UNIEKE verzameling waarvan je denkt dat mensen ze gaan zoeken. Het label is een woord dat de inhoud zo gedetailleerd mogelijk omschrijft. Als Coolblue nog andere zakken verkoopt label je de stofzuigerzakken met zakken. Verkopen ze geen andere zakken dan kun je dat label beter stofzuigerzakken noemen. Een verzameling omvat meer dan 3 producten. Daarom vind ik het idioot dat er bij Coolblue een subcategorie is waarin één electrische dweil staat.


2. ACTIE:

Met mijn theorie is de actie het combineren van labels: Het optellen van verzamelingen, een doorsnede maken van verzamelingen en soms verzamelingen aftrekken. De welbekende zoekopdrachten OR, AND en NOT. Ook wel genoemd FILTEREN.
Om zo’n matrixberekening uit te kunnen voeren heb je unieke, autonome waardes nodig. Als je een hiërarchie aanbrengt heb je geen autonome waardes meer! Merken worden er alleen maar dubbel ingezet omdat je met de categorie niet kunt filteren.

De gangbare actie bij webwinkels met een hiërarchie is dan ook:
Broodkruimels volgen en daarna pas filteren. De filters zijn gekoppeld aan waar je je in de hiërarchie bevindt.

En dat brengt mij terug bij de aanleiding van deze discussie, dat ik het zo raar vond dat ik filters moest koppelen aan een categorie…

Ik denk trouwens dat het probleem niet bij het *vormen* van deelverzamelingen ligt maar vooral bij het *ontsluiten* van die deelverzamelingen. Iedereen die iets met databases doet, kent dit spiekbriefje:

Bron: C.L. Moffatt

Jaaaaaaaaah! Dat is het! Het is het ontsluiten van die deelverzamelingen (=subcategorie) wat het in mijn ogen onnodig complex maakt.
Daarom beter geen deelverzamelingen aanmaken maar ze laten ontstaan uit 2 autonome verzamelingen.



* Waarna we weer als vanouds vrolijk verder gingen over wat er dan in de url moet komen 😂. Ook een geinige discussie die jammer genoeg via Twitter DM ging en niet via de reacties hier omdat ik dit pas later publiceerde.

Bonus:
Als je je een vierdimensionale tabel niet kunt voorstellen kun je ook uitgaan van 3 tweedimensionale tabellen:
  1. Producten zijn de rijen, vaste kenmerken de kolommen
  2. Producten zijn de rijen, mappen waarin het product staat de kolommen (labels)
  3. Producten zijn de rijen, productvarianten (maat, kleur) de kolommen
Wat iedereen (echt iedereen hé, ik ben nog geen webshop tegengekomen die ik niet kan versimpelen) doet is de labels van de 2e tabel in een monohiërarchie zetten zodat je een vaste plaats kunt duiden in de 1e tabel. Dat is broodkruimelen, hetgeen ik al jaren als de allergrootste SEO-mythe beschouw. Op het moment dat je dat doet ontstaan er lege mappen (die worden opgesplitst in subcategorieën) en dan kun je er niet meer mee filteren. Bovendien ben je verplicht de broodkruimel te volgen, je kunt niet starten met een label dat onder een ander label staat.