ABONAMENTE VIDEO REDACȚIA
RO
EN
Numărul 148 Numărul 147 Numărul 146 Numărul 145 Numărul 144 Numărul 143 Numărul 142 Numărul 141 Numărul 140 Numărul 139 Numărul 138 Numărul 137 Numărul 136 Numărul 135 Numărul 134 Numărul 133 Numărul 132 Numărul 131 Numărul 130 Numărul 129 Numărul 128 Numărul 127 Numărul 126 Numărul 125 Numărul 124 Numărul 123 Numărul 122 Numărul 121 Numărul 120 Numărul 119 Numărul 118 Numărul 117 Numărul 116 Numărul 115 Numărul 114 Numărul 113 Numărul 112 Numărul 111 Numărul 110 Numărul 109 Numărul 108 Numărul 107 Numărul 106 Numărul 105 Numărul 104 Numărul 103 Numărul 102 Numărul 101 Numărul 100 Numărul 99 Numărul 98 Numărul 97 Numărul 96 Numărul 95 Numărul 94 Numărul 93 Numărul 92 Numărul 91 Numărul 90 Numărul 89 Numărul 88 Numărul 87 Numărul 86 Numărul 85 Numărul 84 Numărul 83 Numărul 82 Numărul 81 Numărul 80 Numărul 79 Numărul 78 Numărul 77 Numărul 76 Numărul 75 Numărul 74 Numărul 73 Numărul 72 Numărul 71 Numărul 70 Numărul 69 Numărul 68 Numărul 67 Numărul 66 Numărul 65 Numărul 64 Numărul 63 Numărul 62 Numărul 61 Numărul 60 Numărul 59 Numărul 58 Numărul 57 Numărul 56 Numărul 55 Numărul 54 Numărul 53 Numărul 52 Numărul 51 Numărul 50 Numărul 49 Numărul 48 Numărul 47 Numărul 46 Numărul 45 Numărul 44 Numărul 43 Numărul 42 Numărul 41 Numărul 40 Numărul 39 Numărul 38 Numărul 37 Numărul 36 Numărul 35 Numărul 34 Numărul 33 Numărul 32 Numărul 31 Numărul 30 Numărul 29 Numărul 28 Numărul 27 Numărul 26 Numărul 25 Numărul 24 Numărul 23 Numărul 22 Numărul 21 Numărul 20 Numărul 19 Numărul 18 Numărul 17 Numărul 16 Numărul 15 Numărul 14 Numărul 13 Numărul 12 Numărul 11 Numărul 10 Numărul 9 Numărul 8 Numărul 7 Numărul 6 Numărul 5 Numărul 4 Numărul 3 Numărul 2 Numărul 1
×
▼ LISTĂ EDIȚII ▼
Numărul 24
Abonament PDF

Rețeaua StackExchange

Radu Murzea
PHP Developer
@Pentalog



DIVERSE


Dacă citești acest articol, cel mai probabil ești programator. Și, ca orice programator, ai fost nevoit să cauți online soluții la problemele de programare pe care le întâmpini. Sunt convins că ați observat ceva interesant: în ultimii ani, atunci când căutăm un răspuns la o întrebare despre programare, printre primele trei rezultate afișate de Google se află aproape de fiecare dată un link către StackOverflow.

Aceasta nu e o coincidență: StackOverflow-ul s-a strecurat cumva în viața programatorilor, încet dar sigur. Ne folosim de el practic zilnic, dar am observat că cei mai mulți programatori nu știu prea multe despre cum s-a născut acest site, pe ce principii funcționează și de ce are atât de mult succes.

StackOverflow e doar unul din cele 119 site-uri ale rețelei StackExchange, cele două NU sunt sinonime. În acest articol, vom expune filosofi care stă la acestei rețele și vom arunca o privire de ansamblu asupra mecanismelor care îi permit să funcționeze practic independent.

Sperăm că aspectele aduse la lumină să ofere mai mult confort în utilizarea acestei rețele și să vedem o participare mai puternică din partea programatorilor români.

Filosofia rețelei

Istorie și motivație

Înainte de StackOverflow, era foarte dificil să găsești o soluție (corectă) la o problemă de programare, cu excepția celor des întâlnite. Motivele acestei situații sunt multiple:

  1. Oamenii care scriau documentație pentru un limbaj, un framework sau o tehnologie erau practic incapabili să o pună pe Internet și să-i facă conținutul ușor accesibil.
  2. Soluția putea fi într-o carte de programare. Însă realitatea e că extrem de puțini programatori mai învață din cărți. Această industrie e cam în moarte clinică.
  3. Răspunsurile existente pe forumuri erau îngropate în pagini și pagini de discuții.
  4. În multe locuri, răspunsurile aveau o tonă de probleme: de la sfaturi proaste și rezolvări care funcționau doar pentru anumiți oameni până la soluții sub forma de hack-uri și cod plin de vulnerabilități. Nu era nici o modalitate de a le modifica, repara și îmbunătăți.
  5. Multe probleme erau până la urma rezolvate de către platformă sau de către framework, dar nu știai aceasta pentru că soluția veche era încă prima în lista de rezultate de pe Google.
  6. Dacă problema era rară (un API care se comporta ciudat într-o anumită situație), atunci pagerank-ul motoarelor de căutare nu funcționa: problema afecta doar câțiva oameni, deci nimeni nu posta link-uri către soluție și prin urmare nu apărea în rezultatele căutărilor.
  7. Sunt prea multe feluri în care poți formula o întrebare, trebuie să găsești cuvintele potrivite pentru a avea o șansă.

Pentru a rezolva aceste probleme și pentru a avea o mult mai bună accesibilitate a soluțiilor online, Joel Spolsky și Jeff Atwood decid în ianuarie 2008 să deschidă un site Q&A numit StackOverflow. Dezvoltarea acestuia a început în Aprilie 2008, iar în August 2008 acesta a fost lansat sub forma unui beta privat. După 4 săptămâni, în Septembrie 2008, StackOverflow-ul a devenit public.

Joel avea blogul joelonsoftware.com iar Jeff avea codinghorror.com. Aceste bloguri cunoscute s-au dovedit a fi rețeta de succes a StackOverflow-ului pentru că, prin intermediul lor, Jeff și Joel au popularizat noua lor idee. Au făcut aceasta printr-un Podcast în care vorbeau despre site și pe care l-au postat pe cele două bloguri. Acesta a fost un aspect important pentru ca un vizitator nou să poată găsi conținut de calitate încă de la bun început.

StackOverflow-ul e o combinație între un forum, un blog, un wiki și un agregator de știri. Ideea de bază e ca oamenii să întrebe și să primească răspunsuri, nu doar să comenteze aiurea. E un loc unde calitatea este votată și promovată, iar conținutul inutil este împins în jos și dispare.

În StackOverflow se vrea acumularea a cât mai multe cunoștințe de programare și soluții ale problemelor din acest domeniu. Comunitatea evaluează toate problemele și soluțiile prin intermediul votării. Pe măsură ce voturile se acumulează, experții și oamenii de încredere ies la iveală, iar comunitatea are încredere tot mai mare în ei.

A fost un succes instantaneu, fapt care i-a convins pe fondatori să deschida ServerFault în Aprilie 2009, un site pentru administratorii de sistem bazat pe aceeași filosofie ca StackOverflow-ul. A urmat SuperUser în Iulie 2009, un site pentru utilizatori entuziaști ai computerelor.

Succesul acestor site-uri a pus baza rețelei StackExchange, care acum cuprinde o multitudine de site-uri, toate urmând aceeași structură și filosofie de funcționare pe care a fost construit StackOverflow-ul.

Modificarea și menținerea conținutului într-o stare cât mai actualizată este crucială pe site-urile StackExchange-ului. Accesibilitatea conținutului este de asemenea foarte importantă, site-urile practicând politici agresive de SEO.

Popularitatea StackOverflow-ului și prezența constantă a programatorilor în mediul online are o consecință interesantă: atunci când apare o nouă tehnologie sau un nou limbaj de programare, în loc să fie create forumuri sau site-uri pentru suport, utilizatorii acestora sunt redirecționați spre tag-urile corespunzătoare de pe StackOverflow.

Varietate si profesionalism

După cum am menționat în introducere, rețeaua StackExchange are 119 site-uri. Acest număr variază în timp (vezi capitolul "Area51").

Fiecare dintre aceste site-uri funcționează pe aceleași principii de bază: sunt site-uri de Q&A, folosesc aceeași platformă și au ca utilizatori țintă acei oameni care activează în mod profesionist într-un anumit domeniu.

Diferența e că fiecare are propria lui comunitate care le conduce și administrează total independent de celelalte site-uri. De fapt, singura colaborare este atunci când întrebările migrează de la un site la altul; fiind vorba de aceeași platformă, acest lucru este posibil.

Fiecare site are propriul lui subiect, dar varietatea acestora menționată în titlu este prea modestă. Cele mai populare subiecte sunt cele axate în jurul programatorilor și tehnologiilor, remarcându-se printr-o diversitatea foarte mare: de la matematică, jocuri pe calculator, poker, sporturi, politică și fotografie până la management financiar, șah, design grafic, sfaturi părintești, istorie, religie și lingvistică. Sunt foarte slabe șanse să nu îți găsești măcar unul sau două hobby-uri sau interese printre multitudinea de subiecte.

După cum am menționat mai sus, fiecare site are ca scop acumularea a cât mai multă informație prin intermediul experților din acel domeniu prezenți pe site. Atunci când cineva caută o anumită informație, trebuie ca rezultatul să fie un răspuns profesionist, obiectiv și complet. Acesta e idealul comunităților StackExchange.

Licența asupra conținutului

Filosofia rețelei include conceptul de a face publică întreaga informație a acesteia. Orice întrebare sau răspuns care ajunge pe rețea intră automat sub incidența licenței Creative Commons Attribution-ShareAlike. Aceasta înseamnă că fiecărei persoane îi este recunoscut dreptul de autor asupra respectivului text, care trebuie să rămână 100 % public, putând fi folosit și modificat de oricine (cu condiția ca modificarea să rămână sub incidența aceleași licențe), inclusiv cu scopuri comerciale.

Atribuirea acestei licențe conținutului permite folosirea datelor în multe feluri. Vezi capitolul "Big Data" pentru mai multe detalii.

Mecanisme de funcționare

Q&A, repuțatie și privilegii

În mare, sistemul este foarte simplu: o persoană pune o întrebare și alții răspund. Fiecare întrebare și fiecare răspuns pot fi votate cu un "upvote" sau cu un "downvote". În funcție de aceste voturi, autorul primește "reputație" sub formă de puncte. Cu cât mai multe puncte se acumulează, cu atât mai multe privilegii vei primi și comunitatea va avea încredere mai mare în tine.

Un "upvote" aduce autorului +5 puncte dacă e vorba de o întrebare și +10 puncte dacă e vorba de un răspuns. Această discrepanță este pentru că răspunsurile sunt cele care oferă cel mai de calitate conținut, prin urmare sunt valorificate mai mult.

Un "downvote" scade reputația autorului cu 2 puncte, indiferent dacă e vorba de o întrebare sau de un răspuns. În schimb, dacă acorzi un "downvote" unui răspuns, și ție îți va scădea reputația cu 1 punct. Această decizie a fost luată pentru a încuraja îmbunătățirea răspunsurilor, nu doar marcarea lor ca fiind de calitate proastă.

Fiecare întrebare trebuie să aibă tag-uri: minim 1, maxim 5. Aceste tag-uri ajută la categorisirea întrebărilor, pentru a fi mai ușor de sortat și găsit. De exemplu, o întrebare despre cum se aplica un Look-and-feel în Java va avea probabil tag-urile "java", "swing" și "look-and-feel".

Autorul întrebării este încurajat să aleagă un răspuns ca fiind cel mai bun. În acest caz, autorul răspunsului va primi +15 puncte, iar autorul întrebării va primi +2 puncte.

Privilegiile obținute pe măsură ce crește reputația sunt variate: crearea de bounty-uri, flag-uri de atenționare a moderatorilor, camere de chat, posibilități tot mai avansate de editare și protejare a conținutului și multe altele.

Moderare

Fiind o rețea bazată pe ideea de rețea socială, moderarea se face un pic altfel. Aceasta e împărțită în trei nivele:

a) Membrii obișnuiți fac cele mai multe activități de moderare. Aceștia modifică conținutul de pe site-uri, pot vota să închidă sau chiar să șteargă anumite întrebări și pot atrage atenția moderatorilor asupra anumitor aspecte. Pentru a face toate astea, membrii au acces la niște unelte de revizuire care devin accesibile pe măsură ce membrul acumulează reputație. Cei cu reputație foarte mare au acces chiar și la o parte din uneltele moderatorilor.

Prin urmare, cele mai multe și mai des întâlnite probleme sunt rezolvate de către membri, fiind o comunitate care se administrează singură.

b) Moderatorii sunt polițiștii rețelei, aceștia intervin acolo unde comunitatea nu poate. Ei se ocupă de flag-urile de atenționare, identifică conturi duble, migrează întrebări de pe un site pe altul, fac managementul tag-urilor și multe altele. Printre cele mai importante atribuții, însă, se află rezolvarea disputelor și certurilor.

Numărul de moderatori fluctuează constant, de obicei sunt între 700 și 1000 în întreaga rețea. Aceștia sunt aleși de către Community Managers atunci când un site e în private beta și în public beta. În aceste stagii ale site-urilor, moderatorii sunt aleși pe baza activității și diplomației de care dau dovada pe respectivul site.

Odată ce un site ajunge la maturitate, se organizează alegeri democratice, unde membrii se auto-nominalizează și apoi sunt votați de către restul comunității în funcție de discursurile oferite. Aceste alegeri pot avea loc de mai multe ori. De exemplu, pe StackOverflow, aceste alegeri sunt ținute o dată sau de două ori pe an.

c) Atunci când apar situații excepționale, problemele sunt rezolvate de către un Community Manager. Aceștia sunt angajați ai StackExchange-ului, al căror rol este să se asigure că totul funcționează corect, monitorizează și ghidează activitatea în Area51, răspund la întrebari pe site-urile Meta și oferă ghidare în folosirea uneltelor disponibile în rețea.

Rețeaua ca un Wiki

Rețeaua are o foarte puternică tendință de wiki. Membrii sunt încurajați să modifice și să îmbunătățească constant conținutul de pe site. Este atât de puternică această tendință încât membrii sunt încurajați să-și adauge cunoștințele sub formă de întrebări și răspunsuri, adică să-și răspundă la propria întrebare. În acest sens, fiecare întrebare împreună cu răspunsurile asociate sunt un fel de pagină wiki despre un anumit subiect. Ca să vă faceți o idee: 39 % din întrebări și 19% din răspunsuri sunt modificate cel puțin o dată după post-are[1].

Există situații când, pentru a răspunde la o întrebare, este nevoie de multă cercetare care să conducă la un răspuns foarte complex care să implice mai mulți autori lucrând împreună sau liste lungi de răspunsuri. De exemplu o întrebare de tipul "Care sunt cele mai bune cărți de programare ?" implică un răspuns de o asemenea complexitate.

În acest caz, întrebarea va primi foarte multe răspunsuri care vor deveni populare, vor primi "upvote"-uri și vor fi modificate foarte des de către mulți oameni. Aceste aspecte ridică o problemă interesantă: dacă atât de mulți oameni contribuie la respectivul conținut, este cinstit ca autorul original să primească atât de multă reputație ?

Pentru a rezolva această problemă, întrebările de acest gen sunt marcate ca fiind "Community Wiki". Aceasta înseamnă că reputația generată de acea întrebare și de răspunsurile asociate ei nu va fi atribuită nimănui. Autorul nu va mai fi afișat, ci membrul care a contribuit cel mai mult la respectivul conținut. De asemenea, modificarea lor e mult mai accesibilă pentru că pragul privilegiului pentru aceasta cade de la reputație 2000 la reputație 100.

Comentarii, chat și site-urile Meta

În vremurile timpurii ale rețelei, se puteau adăuga doar întrebări și răspunsuri. Dar membrii aveau nevoie de un loc unde să discute regulile site-urilor, variatele situații excepționale care apăreau și calitatea întrebărilor și răspunsurilor.

Așa că s-a introdus un sistem prin care membrii să poată adăuga comentarii atât întrebărilor cât și răspunsurilor. Aceste comentarii pot primi "upvote"-uri, însă fără a genera reputație.

Un alt sistem de acest gen este chat-ul, unde membrii pot vorbi despre tot și orice. Chat-ul este împărțit în "camere", fiecare având propria discuție. În general, fiecare site are camera lui, însă noi camere pot fi create de membri care au suficiente privilegii pentru aceasta. Există și camere dedicate exclusiv moderatorilor, pentru ca aceștia să poată discuta probleme de moderare fără intervenția utilizatorilor obișnuiți.

Fiecare site din rețea are un site Meta asociat. Acestea sunt separate dar funcționează pe aceleași principii. Singurul lucru pe care-l au în comun cu site-ul părinte sunt moderatorii. Pe ele se discută doar aspecte legate de site-ul părinte, adăugarea sau eliminarea de reguli, se pun anunțuri și multe altele. Site-urile Meta sunt create atunci când site-ul părinte ajunge în stadiul de private beta (vezi "Area51").

Area51

După cum am menționat în capitolele precedente, rețeaua are un număr foarte mare de site-uri, fiecare cu subiectul lui. Dar cum se nasc aceste site-uri ? Și cine decide care site-uri se deschid și ce subiecte vor avea ? Răspunsul este: tu, membrul de rând. Rețeaua e socială la bază, prin urmare comunitatea este cea care decide ce site-uri noi trebuie să apară și pe baza căror reguli vor funcționa.

Acest proces are loc în Area51, un site special unde site-urile sunt definite și lansate aplicând următorii pași:

  1. se propune un nou site. Acesta trebuie să aibă un nume, un subiect (ex: arhitectură navală) și o descriere. Oricine poate să facă o astfel de propunere.
  2. urmează stagiul de definire, când se încearcă atragerea de oameni interesați de noul site și crearea unor întrebări ipotetice care s-ar potrivi pe acesta. Se face asceata pentru a se stabili ce domeniu va avea noul site, ce subiecte de discuție vor fi acceptabile, ce se consideră o întrebare bună, un răspuns bun ș.a.m.d. Aceste întrebări vor fi modificate și discutate până când se ajunge la un comun acord legat de conținutul lor. Odată ce se atinge cifra critica de 40 de astfel de întrebări și un număr minim de oameni care urmăresc dezvoltarea, site-ul e considerat "definit".
  3. următorul stagiu este angajamentul. În acest stagiu se încearcă acumularea unui număr cât mai mare de oameni care "își iau angajamentul" că vor participa pe site odată ce e lansat. Aceștia trebuie să "semneze digital" o petiție care confirmă acest lucru.Motivul pentru acest angajament e faptul că un site are nevoie de o masă critică de oameni care să îl folosească și să-l popularizeze în prima perioadă a existenței. Nu se poate trece la stagiul următor fără minim 200 de astfel de persoane.
  4. Urmeaza beta-ul privat când site-ul este efectiv lansat, împreună cu un site Meta asociat acestuia. În acest stagiu, site-ul nu e disponibil decât celor care, în stagiul precedent, și-au luat angajamentul că-l vor folosi. Acum se definește FAQ-ul site-ului, se atribuie primele funcții de moderator și se fac ultimele șlefuiri. De asemenea, se începe adăugarea unui număr cât mai mare de întrebări și răspunsuri și popularizarea site-ului prin Facebook, Twitter, blog-uri ș.a.m.d.
  5. Următorul stagiu este beta-ul public când site-ul este deschis publicului și toată lumea îl poate folosi.
  6. Dacă site-ul îndeplinește criteriile de trafic și activitate cerute, atinge o masă critică de utilizatori și comunitatea are certitudinea că acesta va rămâne popular, atunci se îndeplinesc toate condițiile de trecere în stagiul matur al site-ului. Când se ajunge aici, site-ul va primi un design grafic unic care să-i reflecte cât mai bine subiectul. De asemenea, acum se organizează alegeri democratice ale moderatorilor.

Careers

StackOverflow are momentan 3 milioane de utilizatori și 6.6 milioane de vizitatori zilnici. Este cel mai popular site al rețelei și generează peste 80 % din întrebările, răspunsurile și traficul acesteia [2]. Prezența unei astfel de audiențe uriașe de programatori deschide porțile unei oportunități unice: job-uri și cariere. Așa s-a născut Careers.StackOverflow, un fel de LinkedIn strict pentru programatori și profesioniști IT.

Fiecare membru își poate crea un profil, un CV electronic. Pe acesta se pot trece o sumedenie de informații: de la istoria job-urilor avute, tehnologiile cu care s-a lucrat și articole scrise până la proiectele realizate și cărțile citite. Pentru o cât mai bună funcționare, site-ul are integrare cu LinkedIn, GitHub, BitBucket, Amazon, SourceForge și multe altele. Profilele avute pe diferitele site-uri StackExchange pot fi listate și ele aici, împreună cu cele mai bune și mai votate răspunsuri de pe acestea.

Nici companiile nu sunt lăsate mai prejos: acestea pot să își creeze propriile pagini de profil unde să includă o descriere a companiei, o hartă cu locația acesteia, job-urile disponibile în acel moment, poze, lista cu profilele unor angajați cheie, beneficii, tehnologiile folosite în proiecte și multe altele.

Big Data

Toate profilele, întrebările, răspunsurile, comentariile adăugate în rețeaua StackExchange sunt puse la dispoziția publicului printr-o serie specială de site-uri și API-uri. Acest lucru este posibil datorită licenței, vezi capitolul "Licența asupra conținutului".

Data.StackExchange

Acesta este un site special care permite oricui accesul la conținutul rețelei StackExchange. Membrii pot scrie query-uri SQL într-un câmp mare de text, pot să execute aceste query-uri și să vadă rezultatele în timp real. Pentru a ajuta utilizatorul în acest sens, site-ul permite vizualizarea completă a structurii tabelelor bazelor de date.

Datorită faptului că arhitectura StackExchange-ului funcționează folosind baze de date SQL Server, query-urile trebuie să respecte sintaxa corespunzătoare acestui produs.

Bazele de date folosite de acest site nu sunt aceleași ca acele folosite în producție de către site-urile StackExchange, ci e vorba de o copie a acestora. Aceasta înseamnă că nu vei obține cele mai actualizate date. O actualizare a bazelor de date de pe Data.StackExchange are loc de obicei o dată pe lună.

Utilizatorii care se loghează pe acest site pot să-și salveze query-urile și să revină oricând la ele pentru a le modifica și îmbunătăți.

Având în vedere natura publică a datelor, anumite informații nu sunt accesibile prin acest site, cum ar fi de exemplu e-mail-urile membrilor.

StackExchange API și StackApps

Un alt mod de a accesa datele de pe rețea e prin StackExchange API, care e un webservice REST cu rezultate în format JSON sau JSONP (padded JSON).

Acest API poate fi folosit în aplicații 3rd-party orientate spre rețeaua StackExchange; deja există o multitudine publicate, în special pentru platformele mobile.

O mare parte din date nu pot fi accesate prin acest API decât prin autentificare. Pentru a face aceasta, aplicația trebuie înregistrată în StackApps, moment în care se va primi o cheie de autentificare și se va permite efectuarea unui trafic mult mai mare către API.

StackApps este, după cum am afirmatmai sus, un site unde aplicațiile care se folosesc de API pot fi înregistrate. Autorii își prezintă aici aplicația împreună cu instrucțiuni pentru instalarea acestora. De asemenea, discuții legate de API și folosirea lui au loc tot aici.

Concluzie

Formatul și filosofia pe care a fost construită rețeaua StackExchange este de un real succes, popularitatea acesteia fiind evidentă. Site-urile de aici au ușurat mult munca a milioane de oameni din toate domeniile. Personal, economisesc foarte multe ore folosind aceste site-uri, ore care altfel le-aș petrece scormonind colțuri îndepărtate ale Internetului pentru a găsi răspunsuri la întrebări. Este practic imposibil să calculezi câți bani se economisesc folosind StackExchange-ul, dar e clar că e vorba de multe miliarde de dolari [3].

Referințe

[1] Cristoph Treude, Ohad Barzilay, Margaret-Anne Storey. How do programmers ask and answer questions on the web? In ACM, 21-28 May 2011.

[2] stackexchange.com/sites#traffic

[3] skeptics.stackexchange.com/q/18539

LANSAREA NUMĂRULUI 149

Marți, 26 Octombrie, ora 18:00

sediul Cognizant

Facebook Meetup StreamEvent YouTube

În aceeaşi ediţie ... (24)

▼ TOATE ARTICOLELE ▼

NUMĂRUL 147 - Automotive

Sponsori

  • Accenture
  • BT Code Crafters
  • Accesa
  • Bosch
  • Betfair
  • MHP
  • BoatyardX
  • .msg systems
  • P3 group
  • Ing Hubs
  • Cognizant Softvision
  • Colors in projects