Wprowadzenie: Dlaczego zielone oprogramowanie jest koniecznością
Sektor ICT odpowiada za ok 2-4% światowej emisji CO₂, odsetek porównywalny z przemysłem lotniczym. Globalne centra danych pochłonęły energię w przybliżeniu 460 TWh w 2022 r. i według Międzynarodowej Agencji Energetycznej (IEA) byłoby to możliwe pokonać 1000 TWh do 2026 r. W samych Stanach Zjednoczonych centra danych absorbują już ponad 4% krajowej energii elektrycznej, a prognozy wskazują na możliwe 12% do 2030 r.
W tym kontekście Fundacja Zielonego Oprogramowania (GSF) — konsorcjum założone w 2021 r od Accenture, GitHub, Microsoft i ThinkWorks w ramach Linux Foundation – zdefiniował systematyczne ramy ograniczania wpływu oprogramowania na środowisko. To nie jest prosta optymalizacja: jest to zmiana paradygmatu, która wprowadzaefektywność węglowa jako miernik jakości oprogramowania na równi z wydajnością, bezpieczeństwem i łatwością konserwacji.
W tym artykule omówimy je szczegółowo 8 zasad zielonej inżynierii oprogramowania, specyfikacja SCI (oprogramowanie do pomiaru intensywności emisji dwutlenku węgla) ratyfikowana jako norma ISO/IEC 21031:2024, oraz praktyczne narzędzia do pomiaru i redukcji emisji wynikających z naszego kodeksu.
Czego się nauczysz
- 8 podstawowych zasad Fundacji Zielonego Oprogramowania
- Wzór SCI i sposób obliczania intensywności emisji dwutlenku węgla w oprogramowaniu
- Praktyczne strategie efektywności węglowej, efektywności energetycznej i świadomości węglowej
- Wydajność sprzętu i koncepcja ucieleśnionego węgla
- Narzędzia pomiarowe: Cloud Carbon Footprint, CodeCarbon, Carbon Aware SDK
- Zielone wzorce kodu z konkretnymi przykładami w Pythonie, TypeScript i Javie
- Zobowiązania klimatyczne: różnica między neutralizacją, kompensacją i ograniczaniem emisji
Fundacja Zielonego Oprogramowania: misja i struktura
La Fundacja Zielonego Oprogramowania (GSF) jest organizacją non-profit, której misją jest „stwórz zaufany ekosystem ludzi, standardów, narzędzi i najlepszych praktyk w zakresie ekologicznego oprogramowania”. Z poza 80 organizacji członkowskich — w tym Intel, Goldman Sachs, NTT Data, Avanade, UBS i Globant – GSF działa poprzez kilka grup roboczych.
Struktura Fundacji Zielonego Oprogramowania
| Grupa Robocza | Cel | Główne wyjścia |
|---|---|---|
| Standardy | Zdefiniuj specyfikacje i metryki | Specyfikacja SCI (ISO/IEC 21031), SCI dla AI |
| Otwarte źródło | Twórz narzędzia i pakiety SDK | Zestaw SDK uwzględniający emisję dwutlenku węgla, platforma Impact |
| Wspólnota | Szkolenie i rozpowszechnianie | Certyfikat Green Software Practitioner |
| Polityka | Regulacje wpływu | SOFT Framework (dawniej TOSS), wytyczne ESG |
W 2025 r. GSF osiągnął znaczący kamień milowy w postaci ratyfikacji Konwencji Struktura MIĘKKA (Sustainable Organisational Framework for Technology), kierowany przez Pindy Bhullar przy wsparciu firmy Microsoft. Cztery organizacje globalne już pilotażowo wdrażają te ramy, rozwiązując takie wyzwania, jak luki w danych, decyzje dotyczące integracji narzędzi i uzyskania akceptacji biznesowej.
8 zasad zielonej inżynierii oprogramowania
Zasady ekologicznego oprogramowania nie są opcjonalnymi sugestiami: są jednym z nich filozofia projektowania co wpływa na każdą decyzję, od architektury po wybór infrastruktury. Zobaczmy je szczegółowo.
Przegląd zasad
| # | Zasada | Centrum | Kluczowa metryka |
|---|---|---|---|
| 1 | Efektywność węglowa | Emituj mniej węgla na jednostkę pracy | gCO₂eq na operację |
| 2 | Efektywność energetyczna | Zużywaj mniej energii dla tej samej funkcji | kWh na transakcję |
| 3 | Świadomość węgla | Dostosuj się do intensywności emisji dwutlenku węgla w sieci | gCO₂eq/kWh sieci |
| 4 | Wydajność sprzętu | Maksymalizuj wykorzystanie i żywotność sprzętu | Ucieleśniony węgiel (gCO₂eq) |
| 5 | Pomiar | Mierz i śledź emisję | Wynik SCI |
| 6 | Zobowiązania klimatyczne | Zobowiązania klimatyczne przedsiębiorstw | Zero netto, neutralność pod względem emisji dwutlenku węgla |
| 7 | Sieć | Zmniejsz ruch sieciowy | Bajty przesłane na operację |
| 8 | Kształtowanie popytu | Modeluj zapotrzebowanie w oparciu o dostępną energię | Ładuj w okresach niskoemisyjnych |
Zasada 1: Efektywność węglowa
Efektywność węglowa oznacza emitować jak najmniejszą ilość węgla na jednostkę pracy. Jest to zasada podstawowa: wszystko inne z niej wynika. Oprogramowanie Efektywność emisyjna niekoniecznie jest najszybsza ani najtańsza, ale tak jest co produkuje mniejszy wpływ na środowisko w stosunku do generowanej wartości.
Analogia dotyczy wydajności pojazdu: interesuje nas nie tylko to, ile km przejedzie samochód, ale ile gramów CO₂ emitowanych na km. Podobnie środki ekologicznego oprogramowania, tj gramy ekwiwalentu CO₂ na wywołanie API, na obsługiwanego użytkownika, na zrealizowaną transakcję.
Zasada w działaniu
Jeśli dwie implementacje funkcji dają ten sam wynik, ale jedna zużywa 50% mniej energii, to drugie jest jednak bardziej energooszczędne trwa kilka milisekund dłużej. W świecie, w którym centra danych zużywają setki TWh, oszczędności te kumulują się wykładniczo.
Praktyczne strategie efektywności węglowej
1. Optymalizacja algorytmiczna
Wybór algorytmu ma większy wpływ na energię niż wybór języka programowania. Algorytm O(n log n) jest nie tylko szybszy niż algorytm O(n²): zużywa pieniądze znacząco mniej energii na dużych zbiorach danych.
# Ricerca INEFFICIENTE: O(n) - scansione lineare su lista non ordinata
def find_user_linear(users: list, target_id: str) -> dict | None:
"""Scansione lineare: consuma energia proporzionale a N."""
for user in users:
if user["id"] == target_id:
return user
return None
# Ricerca EFFICIENTE: O(1) - lookup su dizionario (hash map)
def build_user_index(users: list) -> dict:
"""Costruzione indice: investimento una tantum O(n)."""
return {user["id"]: user for user in users}
def find_user_indexed(index: dict, target_id: str) -> dict | None:
"""Lookup O(1): consumo energetico costante."""
return index.get(target_id)
# Impatto su 1 milione di utenti con 10.000 ricerche:
# - Lineare: ~10 miliardi di confronti = ~15 Wh
# - Indicizzato: ~10.000 lookup = ~0.001 Wh
# Risparmio: 99.99% di energia per la stessa funzionalità
2. Buforowanie strategiczne
Każde żądanie do bazy danych lub zewnętrznego API wiąże się z kosztem energii. Buforowanie zmniejsza liczbę obliczeń powtarzalny, eliminując niepotrzebną pracę i związaną z nią emisję.
interface CacheEntry<T> {
readonly data: T;
readonly timestamp: number;
readonly ttlMs: number;
}
class GreenCache<T> {
private readonly cache = new Map<string, CacheEntry<T>>();
private hits = 0;
private misses = 0;
get(key: string): T | undefined {
const entry = this.cache.get(key);
if (!entry) {
this.misses++;
return undefined;
}
const isExpired = Date.now() - entry.timestamp > entry.ttlMs;
if (isExpired) {
this.cache.delete(key);
this.misses++;
return undefined;
}
this.hits++;
return entry.data;
}
set(key: string, data: T, ttlMs: number = 300_000): void {
// Immutable: creiamo un nuovo entry, non mutiamo
const entry: CacheEntry<T> = {
data,
timestamp: Date.now(),
ttlMs,
};
this.cache.set(key, entry);
}
/** Metriche di efficienza: un alto hit rate = meno energia consumata */
getEfficiencyReport(): object {
const total = this.hits + this.misses;
const hitRate = total > 0 ? (this.hits / total) * 100 : 0;
// Stima: ogni cache hit risparmia ~0.5-2ms di CPU + network I/O
const estimatedSavedWh = this.hits * 0.000002; // ~2mWh per hit
return {
hits: this.hits,
misses: this.misses,
hitRate: hitRate.toFixed(1) + '%',
estimatedSavedWh: estimatedSavedWh.toFixed(6),
};
}
}
// Uso:
// const cache = new GreenCache<UserProfile>();
// cache.set('user:123', profile, 600_000); // TTL 10 minuti
// const cached = cache.get('user:123'); // O(1), zero network
3. Grupowanie operacji
Agregowanie wielu operacji w jedno żądanie zmniejsza obciążenie sieci, serializację/deserializację oraz cykle procesora przeznaczone do zarządzania połączeniami.
class BatchProcessor {
private readonly queue: Array<{ id: string; resolve: Function }> = [];
private timer: ReturnType<typeof setTimeout> | null = null;
private readonly batchSize: number;
private readonly delayMs: number;
constructor(batchSize = 50, delayMs = 100) {
this.batchSize = batchSize;
this.delayMs = delayMs;
}
async fetchItem(id: string): Promise<unknown> {
return new Promise((resolve) => {
this.queue.push({ id, resolve });
if (this.queue.length >= this.batchSize) {
this.flush();
} else if (!this.timer) {
this.timer = setTimeout(() => this.flush(), this.delayMs);
}
});
}
private async flush(): Promise<void> {
if (this.timer) {
clearTimeout(this.timer);
this.timer = null;
}
// Svuota la coda in modo immutabile
const batch = [...this.queue];
this.queue.length = 0;
const ids = batch.map(item => item.id);
// UNA sola richiesta invece di N richieste separate
// Risparmio: ~95% overhead TCP/TLS per batch da 50
const results = await fetch('/api/batch', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ ids }),
}).then(r => r.json());
batch.forEach((item, i) => item.resolve(results[i]));
}
}
Zasada 2: Efektywność energetyczna
Efektywność energetyczna oznacza sprawić, że oprogramowanie wykona tę samą ilość pracy z mniejszą ilością energii. Energia jest czynnikiem pośrednim między oprogramowaniem a emisją dwutlenku węgla: poprzez zmniejszenie zużycia energii, emisje są proporcjonalnie redukowane, niezależnie od źródło energii.
Efektywność energetyczna oprogramowania osiągana jest na kilku poziomach: aplikacja (algorytmy i architektura), czas wykonania (zarządzanie zasobami i konkurencją), e infrastrukturalne (rozmiar serwera i automatyczne skalowanie).
Zużycie energii według języka programowania
| Język | Energia względna | Czas względny | Pamięć względna |
|---|---|---|---|
| C | 1,00x (wartość bazowa) | 1,00x | 1,00x |
| Rdza | 1,03x | 1,04x | 1,54x |
| Jawa | 1,98x | 1,89x | 6,01x |
| Go | 3,23x | 2,83x | 1,05x |
| Maszynopis | 21,50x | 46,20x | 4,69x |
| Pyton | 75,88x | 71,90x | 2,80x |
Źródło: „Efektywność energetyczna w różnych językach programowania” — Uniwersytet Minho (2017, aktualizacja 2021)
Ostrzeżenie: język to nie wszystko
Powyższe dane mierzą syntetyczne benchmarki. W realnym świecie wybór algorytmu, architektury i wzorce we/wy często mają wpływ lepszy od wyboru języka. Dobrze zaprojektowana aplikacja w języku Python z inteligentnym buforowaniem może być bardziej ekologiczna źle zaprojektowanej aplikacji C, która przelicza wszystko przy każdym żądaniu.
Wzorce efektywności energetycznej w Kodeksie
/**
* Pattern Green: Lazy Initialization
* Calcola risorse costose SOLO quando effettivamente necessarie.
* Risparmio stimato: 30-70% CPU per richieste che non accedono
* a tutte le proprietà dell'oggetto.
*/
public final class LazyReport {
private final String reportId;
private final Supplier<ReportData> dataSupplier;
private volatile ReportData cachedData;
public LazyReport(String reportId, Supplier<ReportData> dataSupplier) {
this.reportId = reportId;
this.dataSupplier = dataSupplier;
// NON calcoliamo i dati nel costruttore
}
public ReportData getData() {
// Double-checked locking: calcolo solo al primo accesso
ReportData result = cachedData;
if (result == null) {
synchronized (this) {
result = cachedData;
if (result == null) {
cachedData = result = dataSupplier.get();
}
}
}
return result;
}
public String getReportId() {
return reportId; // Zero CPU: nessun calcolo costoso
}
}
// Confronto energetico:
// - Eager: 100 report creati, tutti calcolano dati = 100 query DB
// - Lazy: 100 report creati, solo 10 consultati = 10 query DB
// Risparmio: 90% energia per le query non necessarie
import csv
from typing import Generator, Iterator
def process_large_csv_green(filepath: str) -> Generator[dict, None, None]:
"""
Pattern Green: Streaming con generatore.
Elabora file da milioni di righe senza caricare tutto in memoria.
- Memoria: O(1) invece di O(n)
- Energia: proporzionale solo alle righe effettivamente processate
"""
with open(filepath, 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
# Yield una riga alla volta: zero allocazione bulk
yield {
"id": row["id"],
"value": float(row["amount"]),
"processed": True,
}
def aggregate_green(rows: Iterator[dict], limit: int = 1000) -> dict:
"""
Aggregazione streaming: calcola statistiche senza
materializzare l'intera collezione in memoria.
"""
total = 0.0
count = 0
max_val = float('-inf')
for row in rows:
total += row["value"]
count += 1
if row["value"] > max_val:
max_val = row["value"]
if count >= limit:
break # Early termination: non sprechiamo energia
return {
"count": count,
"total": round(total, 2),
"average": round(total / count, 2) if count > 0 else 0,
"max": max_val,
}
# Confronto:
# Anti-pattern: data = list(csv.DictReader(f)) # Carica TUTTO in RAM
# - File 2GB = 2GB RAM + swap potenziale + GC overhead
# Pattern green: usa generatore + early termination
# - File 2GB = ~1KB RAM costante, si ferma appena ha abbastanza dati
Zasada 3: Świadomość emisji dwutlenku węgla
Świadomość węgla to najbardziej innowacyjna zasada: robić siebie ilości pracy, ale w czasie lub miejscu, gdzie energia elektryczna jest najczystsza. Intensywność emisji dwutlenku węgla w sieci elektroenergetycznej jest bardzo zróżnicowana w zależności od pory dnia, pory roku, do warunków pogodowych i miksu energetycznego regionu.
Intensywność emisji dwutlenku węgla w sieci elektroenergetycznej według kraju (2024–2025)
| Kraj/region | gCO₂eq/kWh (średnio) | Główny miks energetyczny | Klasyfikacja |
|---|---|---|---|
| Szwecja | ~12 | Hydroelektrownia + energia jądrowa | Bardzo niski |
| Francja | ~56 | Energia jądrowa (70%) | Niski |
| Kanada | ~120 | Hydroelektrownia + gaz | Przeciętny |
| Niemcy | ~350 | Odnawialne źródła energii + węgiel | Wysoki |
| USA (średnia) | ~390 | Gaz + Węgiel + Odnawialne Źródła Energii | Wysoki |
| Polska | ~650 | Węgiel (dominujący) | Bardzo wysoki |
| Indie | ~700 | Węgiel (przeważający) | Bardzo wysoki |
Świadomość węglową jest wdrażana za pomocą dwóch uzupełniających się strategii określonych przez GSF:
Przesunięcie czasowe
Przenieś obciążenia nadgodziny aby je wykonać, gdy intensywność emisji dwutlenku węgla siatki jest niższa. Przykład: planowanie nocnych zadań wsadowych w przypadku energii wiatrowej produkuje więcej. Badania wykazują redukcję 45-55% emisji bez wpływ na postrzeganą wydajność.
Spatial Shifting
Spostare i workload nello spazio, eseguendoli in data center situati in regioni con energia più pulita. Se il tuo provider cloud ha regioni in Svezia (12 gCO₂/kWh) e in Polonia (650 gCO₂/kWh), scegliere la Svezia riduce le emissioni del 98% per lo stesso workload.
API e Strumenti per la Carbon Awareness
Diversi servizi forniscono dati in tempo reale sull'intensità carbonica della rete elettrica, permettendo al software di prendere decisioni informate.
Principali Provider di Dati Carbon Intensity
| Provider | Copertura | Tipo Dati | Accesso |
|---|---|---|---|
| Electricity Maps | Globale (160+ zone) | Tempo reale + forecast | API (free tier disponibile) |
| WattTime | USA, Europa, Australia | Marginal emissions | API (registrazione gratuita) |
| Carbon Intensity UK | Gran Bretagna | Forecast 96h + storico | API pubblica gratuita |
| Ember | Globale (200+ paesi) | Media annuale/mensile | Dataset open data |
interface CarbonIntensityData {
readonly zone: string;
readonly carbonIntensity: number; // gCO2eq/kWh
readonly fossilFuelPercentage: number;
readonly datetime: string;
}
interface ScheduleDecision {
readonly shouldRun: boolean;
readonly currentIntensity: number;
readonly threshold: number;
readonly reason: string;
}
const CARBON_THRESHOLD_LOW = 100; // gCO2eq/kWh
const CARBON_THRESHOLD_HIGH = 400; // gCO2eq/kWh
async function getCarbonIntensity(zone: string): Promise<CarbonIntensityData> {
const response = await fetch(
`https://api.electricitymap.org/v3/carbon-intensity/latest?zone=${zone}`,
{
headers: {
'auth-token': process.env['ELECTRICITY_MAPS_TOKEN'] ?? '',
},
}
);
if (!response.ok) {
throw new Error(`Carbon API error: ${response.status}`);
}
return response.json();
}
async function shouldRunWorkload(
zone: string,
priority: 'low' | 'medium' | 'high'
): Promise<ScheduleDecision> {
const data = await getCarbonIntensity(zone);
const intensity = data.carbonIntensity;
// Alta priorità: esegui sempre (ma logga le emissioni)
if (priority === 'high') {
return {
shouldRun: true,
currentIntensity: intensity,
threshold: Infinity,
reason: 'High priority: executing regardless of carbon intensity',
};
}
// Media priorità: esegui sotto la soglia alta
if (priority === 'medium') {
return {
shouldRun: intensity < CARBON_THRESHOLD_HIGH,
currentIntensity: intensity,
threshold: CARBON_THRESHOLD_HIGH,
reason: intensity < CARBON_THRESHOLD_HIGH
? 'Medium priority: intensity acceptable'
: 'Medium priority: deferring to lower intensity period',
};
}
// Bassa priorità: esegui solo con energia pulita
return {
shouldRun: intensity < CARBON_THRESHOLD_LOW,
currentIntensity: intensity,
threshold: CARBON_THRESHOLD_LOW,
reason: intensity < CARBON_THRESHOLD_LOW
? 'Low priority: clean energy available'
: 'Low priority: waiting for cleaner energy window',
};
}
// Esempio d'uso:
// const decision = await shouldRunWorkload('IT-SO', 'low');
// if (decision.shouldRun) {
// await runBatchJob();
// } else {
// scheduleRetry(decision);
// }
Carbon Aware SDK della GSF
La Green Software Foundation sviluppa il Carbon Aware SDK, uno strumento open source che espone un'API REST e una CLI per interrogare i dati di carbon intensity da provider multipli (WattTime, Electricity Maps). Il SDK permette di implementare sia temporal shifting che spatial shifting con poche righe di codice, integrando direttamente la carbon awareness nelle pipeline CI/CD e nei sistemi di orchestrazione.
Principio 4: Hardware Efficiency
Hardware Efficiency è il principio più spesso sottovalutato. La produzione di un dispositivo elettronico genera enormi quantità di CO₂: questo è il embodied carbon (carbonio incorporato). Per un laptop, circa il 70-80% delle emissioni totali del suo ciclo di vita proviene dalla produzione, non dall'uso.
Embodied Carbon di Dispositivi Comuni
| Dispositivo | Embodied Carbon (kgCO₂eq) | Vita Media | Ammortamento Annuo |
|---|---|---|---|
| Smartphone | ~70 | 3 anni | ~23 kgCO₂eq/anno |
| Laptopy | ~300-400 | 4 lata | ~75-100 kgCO₂eq/rok |
| Serwery (stojaki) | ~1000-2000 | 5-6 lat | ~200-400 kgCO₂eq/rok |
| Serwer GPU (AI) | ~5 000-8 000 | 3-5 lat | ~1000–2600 kgCO₂eq/rok |
Jako programiści możemy wpływać na wydajność sprzętu na dwa sposoby:
Przedłuż żywotność sprzętu
- Napisz oprogramowanie kompatybilne ze starszym sprzętem
- Unikaj zależności od niepotrzebnych funkcji specyficznych dla sprzętu
- Obsługa płynnej degradacji na starszych urządzeniach
- Optymalizuj, aby zmniejszyć minimalne wymagania systemowe
Maksymalizuj wykorzystanie
- Preferuj architektury bezserwerowe lub zoptymalizowane kontenery
- Zaimplementuj automatyczne skalowanie, aby uniknąć bezczynności serwerów
- Używaj instancji typu spot/wywłaszczania w przypadku niekrytycznych obciążeń
- Konsoliduj usługi, aby zwiększyć średnie wykorzystanie serwera
Wpływ rozmiaru
Serwer o średnim obciążeniu 15% marnuje 85% zainwestowanego węgla. Przynieś pożytek do 60% zmniejsza koszt środowiskowy na jednostkę pracy o 4 razy. Przetwarzanie w chmurze i bezserwerowe ogromnie w tym pomagają, udostępnianie sprzętu tysiącom użytkowników i amortyzacja emisji dwutlenku węgla przy wielu obciążeniach.
Zasada 5: Pomiar – Specyfikacja SCI
„Jeśli nie możesz czegoś zmierzyć, nie możesz tego ulepszyć”. Zasadą pomiaru jest most pomiędzy teorią a praktyką. Tam Oprogramowanie do pomiaru intensywności emisji dwutlenku węgla (SCI). jest specyfikacja opracowany przez GSF w celu ilościowego określenia emisji dwutlenku węgla z aplikacji. W 2024 r został ratyfikowany jako standard międzynarodowy ISO/IEC 21031:2024.
Formuła SCI
Wzór SCI oblicza a raty, nie w sumie. To jest fundamentalne: cel jest zmniejszenie intensywności emisji dwutlenku węgla na jednostkę pracy, a nie tylko całość emisji (która może spaść po prostu poprzez ograniczenie korzystania z oprogramowania).
Formuła SCI
SCI = ((E × I) + M) / R
| Część | Oznaczający | Jednostka | Jak mierzyć |
|---|---|---|---|
| E | Energia zużywana przez oprogramowanie | kWh | Miernik mocy, RAPL, CodeCarbon, monitorowanie w chmurze |
| I | Intensywność emisji dwutlenku węgla w sieci elektroenergetycznej | gCO₂eq/kWh | Interfejs API map energii elektrycznej, WattTime, zbiór danych Ember |
| M | Ucieleśniony węgiel zastosowanego sprzętu | gCO₂równoważnik | Producent arkusza danych, baza danych LCA, dostawca chmury |
| R | Jednostka funkcjonalna | Zmienny | Na wywołanie API, na użytkownika, na transakcję, na token |
Praktyczny przykład: Obliczenia SCI dla API REST
Obliczmy wynik SCI dla mikrousługi API obsługującej 100 000 żądań dziennie, hostowane na serwerze w chmurze w Niemczech.
# === Dati di Input ===
# E (Energia): il server consuma in media 150W
# Funziona 24h/giorno = 150W * 24h = 3.600 Wh = 3.6 kWh/giorno
E = 3.6 # kWh/giorno
# I (Intensità carbonica): grid tedesca media
I = 350 # gCO2eq/kWh (media Germania 2024-2025)
# M (Embodied carbon): server rack con 5 anni di vita
# Embodied totale: 1.500 kgCO2eq
# Ammortamento giornaliero: 1.500.000 / (5 * 365) = 821.9 gCO2eq/giorno
M = 822 # gCO2eq/giorno
# R (Functional unit): 100.000 richieste API al giorno
R = 100_000
# === Calcolo SCI ===
# Emissioni operative: E * I = 3.6 * 350 = 1.260 gCO2eq/giorno
operational = E * I # 1.260 gCO2eq
# Totale giornaliero: (E * I) + M = 1.260 + 822 = 2.082 gCO2eq/giorno
total_daily = operational + M # 2.082 gCO2eq
# SCI = totale / R = 2.082 / 100.000 = 0.02082 gCO2eq per richiesta
SCI = total_daily / R # 0.02082 gCO2eq/richiesta
# === Confronto: stessa API ospitata in Svezia ===
I_sweden = 12 # gCO2eq/kWh
operational_sweden = E * I_sweden # 3.6 * 12 = 43.2 gCO2eq
total_sweden = operational_sweden + M # 43.2 + 822 = 865.2 gCO2eq
SCI_sweden = total_sweden / R # 0.00865 gCO2eq/richiesta
# Riduzione: da 0.02082 a 0.00865 = -58.4% emissioni
# Solo cambiando la regione di hosting!
Wybór jednostki funkcjonalnej (R)
Jednostka funkcjonalna R jest to niezwykle istotne i musi odzwierciedlać rzeczywistą wartość oprogramowania. Zły wybór R może sprawić, że wynik SCI będzie mylący. Oto zalecane opcje według typu aplikacji:
- API/Mikroserwisy: na żądanie API lub na zrealizowaną transakcję
- Aplikacje internetowe: na aktywnego użytkownika lub na sesję
- Modele AI/ML: przez wnioskowanie, wygenerowany token lub przebieg szkolenia
- Przetwarzanie wsadowe: na przetworzony rekord lub na przetworzony GB
- Transmisja strumieniowa: za minutę transmisji strumieniowej lub za przesłany GB
SCI dla AI: nowy standard
W 2025 r. GSF ratyfikował specyfikację SCI dla sztucznej inteligencji, przedłużenie SCI który obejmuje cały cykl życia systemów AI: od szkolenia, przez wnioskowanie, aż po dostrajanie i RAG. Specyfikacja obsługuje kilka typów systemów: klasyczne uczenie maszynowe, wizja komputerowa, NLP, generatywne AI i systemy agentowe, z dedykowanymi jednostkami funkcjonalnymi takimi jak znak dla modeli językowych, np wnioskowanie dla klasyfikatorów.
from codecarbon import EmissionsTracker
from dataclasses import dataclass
@dataclass(frozen=True)
class SCIResult:
"""Risultato immutabile del calcolo SCI."""
operational_emissions_g: float # E * I in gCO2eq
embodied_emissions_g: float # M in gCO2eq
functional_units: int # R
sci_score: float # SCI in gCO2eq/R
region: str
@property
def total_emissions_g(self) -> float:
return self.operational_emissions_g + self.embodied_emissions_g
def measure_api_sci(
handler_fn,
requests_count: int,
server_embodied_gco2: float = 822.0, # giornaliero
country_iso_code: str = "DEU",
) -> SCIResult:
"""
Misura lo SCI score di una funzione API usando CodeCarbon.
CodeCarbon traccia automaticamente E e calcola E*I basandosi
sulla grid locale.
"""
tracker = EmissionsTracker(
project_name="api-sci-measurement",
country_iso_code=country_iso_code,
log_level="warning",
)
tracker.start()
# Esegui il workload
for _ in range(requests_count):
handler_fn()
# Ottieni emissioni operative (E * I) in kg, convertiamo in grammi
emissions_kg = tracker.stop()
operational_g = emissions_kg * 1000
# Calcola SCI
total = operational_g + server_embodied_gco2
sci = total / requests_count if requests_count > 0 else 0
return SCIResult(
operational_emissions_g=round(operational_g, 4),
embodied_emissions_g=server_embodied_gco2,
functional_units=requests_count,
sci_score=round(sci, 6),
region=country_iso_code,
)
# Esempio d'uso:
# result = measure_api_sci(my_handler, requests_count=10000)
# print(f"SCI Score: {result.sci_score} gCO2eq/request")
# print(f"Total: {result.total_emissions_g} gCO2eq")
Zasada 6: Zobowiązania klimatyczne
Aby uniknąć popadnięcia w takie zobowiązania, niezbędne jest zrozumienie terminologii dotyczącej zobowiązań klimatycznych greenwashing. GSF wyraźnie rozróżnia trzy podejścia, z poziomami bardzo różna skuteczność.
Porównanie zobowiązań klimatycznych
| Zbliżać się | Definicja | Skuteczność | Ryzyko |
|---|---|---|---|
| Neutralny pod względem emisji dwutlenku węgla | Zrównoważ emisję za pomocą kredytów węglowych | Przeciętny | Zmienna jakość kredytów, nie zmniejsza realnej emisji |
| Zero netto | Zmniejsz emisję o ponad 90% i zrównoważ pozostałości | Wysoki | Często odległe ramy czasowe (2040–2050) |
| Redukcja emisji dwutlenku węgla | Wyeliminuj emisję u źródła | Maksymalny | Wysoki koszt początkowy, wymaga głębokiej transformacji |
Uwaga na greenwashing
Specyfikacja SCI nie przyznaje rekompensaty (kompensaty) jako mechanizm obniżyć wynik SCI. Tylko rzeczywista redukcja emisji — dzięki mniejszej ilości energii, energii czystszy lub wydajniejszy sprzęt — obniż SCI. To jest wybór podjęta przez GSF, aby zachęcićobniżka (eliminacja) w porównaniu do neutralizacja (odszkodowanie).
Dla nas, programistów, zasada ta przekłada się na: najpierw zmniejsz, potem kompensuj. Każda optymalizacja kodu, każdy bardziej efektywny wybór architektury, każda migracja do jednego bardziej zielony region chmur to prawdziwa redukcja. Kredyty węglowe to ostateczność.
Zasada 7: Efektywność sieci
Każdy bajt przesłany przez sieć wiąże się z kosztem energii. Transmisja danych przez Internet zużywa energię do routerów, przełączników, anten komórkowych i kabli podmorskich. Zmniejsz ruch sieciowy jest to bezpośrednia dźwignia redukcji emisji.
Strategie zmniejszania ruchu sieciowego
- Kompresja: włącz gzip/brotli dla odpowiedzi HTTP (redukcja o 60-90%)
- Optymalizacja obrazu: korzystaj z nowoczesnych formatów (WebP, AVIF) i responsywnych obrazów
- Leniwe ładowanie: ładuj zasoby tylko wtedy, gdy są potrzebne
- Wydajne interfejsy API: GraphQL żąda tylko niezbędnych pól, paginacji, filtrów po stronie serwera
- CDN: udostępniaj treści z lokalizacji brzegowej najbliżej użytkownika
- Nagłówki pamięci podręcznej: ETag, Cache-Control, aby uniknąć zbędnych transferów
- Podział kodu: załaduj tylko JavaScript potrzebny dla bieżącej strony
# Nginx: configurazione ottimizzata per green networking
# Compressione Brotli (superiore a gzip: -20% dimensioni)
brotli on;
brotli_comp_level 6;
brotli_types text/html text/css application/javascript application/json;
# Cache aggressiva per asset statici (1 anno)
location /assets/ {
expires 1y;
add_header Cache-Control "public, immutable";
add_header Vary "Accept-Encoding";
}
# Cache per API responses con ETag
location /api/ {
add_header Cache-Control "public, max-age=300"; # 5 minuti
etag on;
}
# Risparmio stimato su 1M pagine/giorno:
# - Senza compressione: ~2TB/giorno trasferiti
# - Con Brotli + cache: ~200GB/giorno trasferiti
# - Riduzione: ~90% traffico = ~90% energia di rete
Zasada 8: Kształtowanie popytu
Il Kształtowanie popytu jest najbardziej ambitną zasadą: zamiast dostosowywać oprogramowanie do dostępnej energii (jak w programie Carbon Awareness), samo pytanie użytkownika w oparciu o warunki energetyczne. Może to oznaczać zaoferowanie wersji zmniejszona służba w okresach dużej intensywności emisji dwutlenku węgla lub ulegająca stopniowej degradacji najdroższe funkcje.
interface VideoQualityConfig {
readonly resolution: '4K' | '1080p' | '720p' | '480p';
readonly bitrate: number; // kbps
readonly estimatedKwhPerHour: number;
}
const QUALITY_PROFILES: Record<string, VideoQualityConfig> = {
ultra: { resolution: '4K', bitrate: 25000, estimatedKwhPerHour: 0.042 },
high: { resolution: '1080p', bitrate: 8000, estimatedKwhPerHour: 0.018 },
medium: { resolution: '720p', bitrate: 5000, estimatedKwhPerHour: 0.012 },
eco: { resolution: '480p', bitrate: 2500, estimatedKwhPerHour: 0.007 },
};
function selectQualityByCarbon(
carbonIntensity: number, // gCO2eq/kWh
userPreference: string = 'auto'
): VideoQualityConfig {
// Se l'utente ha scelto manualmente, rispetta la scelta
if (userPreference !== 'auto') {
return QUALITY_PROFILES[userPreference] ?? QUALITY_PROFILES['high'];
}
// Demand shaping: adatta la qualità all'energia disponibile
if (carbonIntensity < 50) {
return QUALITY_PROFILES['ultra']; // Energia pulita: massima qualità
}
if (carbonIntensity < 200) {
return QUALITY_PROFILES['high']; // Moderata: alta qualità
}
if (carbonIntensity < 400) {
return QUALITY_PROFILES['medium']; // Alta: qualità ridotta
}
return QUALITY_PROFILES['eco']; // Critica: modalità eco
}
// Trasparenza: mostra all'utente il motivo della scelta
function getEcoMessage(config: VideoQualityConfig, intensity: number): string {
const saved = QUALITY_PROFILES['ultra'].estimatedKwhPerHour
- config.estimatedKwhPerHour;
const savedPercent = (saved / QUALITY_PROFILES['ultra'].estimatedKwhPerHour * 100)
.toFixed(0);
return `Streaming in ${config.resolution} (grid: ${intensity} gCO2/kWh). `
+ `Risparmio energetico: ${savedPercent}% rispetto al 4K.`;
}
Kształtowanie popytu w świecie rzeczywistym
Firmy takie jak Google e Microsoftu wdrażają już formy popytu kształtowanie w swoich centrach danych, przenoszenie obciążeń związanych z indeksowaniem i szkoleniem ML do czasów i regionów z czystszą energią. Nawet usługi konsumenckie, takie jak tryb ekologiczny z niektóre usługi strumieniowego przesyłania wideo są przykładami kształtowania popytu stosowanego po stronie użytkownika.
Narzędzia i ramy pomiarowe
Ekosystem ekologicznych narzędzi programowych szybko się rozwija. Oto najbardziej przydatne narzędzia dojrzałe i przystosowane do pomiaru i ograniczenia wpływu oprogramowania na emisję dwutlenku węgla.
Porównanie narzędzi pomiarowych
| Instrument | Typ | Języki/platformy | Przypadek użycia |
|---|---|---|---|
| KodWęgiel | Biblioteka Pythona | Python (PyTorch, TF, HF) | Śledzenie emisji, szkolenia i skrypty ML |
| Ślad węglowy w chmurze | Pulpit nawigacyjny + interfejs wiersza polecenia | AWS, GCP, Azure | Monitorowanie emisji z infrastruktury chmurowej |
| Pakiet SDK uwzględniający emisję dwutlenku węgla | SDK + API REST | Poliglota (.NET, REST) | Planowanie uwzględniające emisję dwutlenku węgla i optymalizacja regionu |
| Scaphandre | Agent monitorujący | Linux (bare metal + maszyna wirtualna) | Monitorowanie mocy na poziomie procesu |
| Narzędzie zielonych wskaźników | Platforma CI/CD | Dowolny (oparty na kontenerze) | Benchmark energetyczny w rurociągu CI |
| API Climatiqa | API RESTOWE | Każdy | Współczynniki emisji do obliczeń LCA |
| Kumulator | Zestaw narzędzi Pythona | Pyton | Obliczanie śladu węglowego + przesyłanie danych ML |
CodeCarbon: Śledzenie emisji w Pythonie
KodWęgiel to najpopularniejsza biblioteka do śledzenia emisji CO₂ kodu Pythona. Monitoruj procesor, procesor graficzny i pamięć RAM podczas pracy i łącz dane z intensywnością regionalny poziom emisji dwutlenku węgla w celu oszacowania emisji. Integruje się natywnie z PyTorch, TensorFlow i Przytulanie Twarzy.
from codecarbon import track_emissions, EmissionsTracker
import pandas as pd
import numpy as np
# Metodo 1: Decoratore (più semplice)
@track_emissions(
project_name="data-pipeline",
output_dir="./emissions",
country_iso_code="ITA",
)
def run_data_pipeline(input_path: str) -> pd.DataFrame:
"""Pipeline di elaborazione dati con tracking automatico."""
df = pd.read_csv(input_path)
# ... trasformazioni ...
result = df.groupby("category").agg({
"revenue": ["sum", "mean"],
"transactions": "count",
})
return result
# Metodo 2: Context manager (più controllo)
def train_model_green(X_train, y_train, X_test, y_test):
"""Training con misurazione granulare delle emissioni."""
tracker = EmissionsTracker(
project_name="model-training",
measure_power_secs=15, # Campiona ogni 15 secondi
tracking_mode="process", # Solo il processo corrente
country_iso_code="ITA",
save_to_api=False, # Salva solo localmente
)
tracker.start()
# Fase 1: Preprocessing
tracker.start_task("preprocessing")
X_scaled = preprocess(X_train)
emissions_preprocess = tracker.stop_task("preprocessing")
# Fase 2: Training
tracker.start_task("training")
model = train(X_scaled, y_train)
emissions_training = tracker.stop_task("training")
# Fase 3: Evaluation
tracker.start_task("evaluation")
metrics = evaluate(model, X_test, y_test)
emissions_eval = tracker.stop_task("evaluation")
total_emissions = tracker.stop()
return {
"model": model,
"metrics": metrics,
"emissions": {
"preprocessing_kgCO2": emissions_preprocess,
"training_kgCO2": emissions_training,
"evaluation_kgCO2": emissions_eval,
"total_kgCO2": total_emissions,
},
}
Ślad węglowy w chmurze: monitorowanie infrastruktury w chmurze
Ślad węglowy chmur (CCF) to narzędzie typu open source służące do szacowania emisji CO₂ infrastruktury chmurowej na AWS, Google Cloud i Azure. Analizuj dane rozliczeniowe i wykorzystywane do obliczania zużytej energii i związanych z nią emisji, oferując interaktywny pulpit nawigacyjny i zalecenia optymalizacyjne.
# Installazione
npm install -g @cloud-carbon-footprint/cli
# Esecuzione (richiede credenziali cloud configurate)
ccf --startDate 2025-01-01 --endDate 2025-03-31
# Output esempio:
# +------------+----------+-----------+----------+
# | Servizio | kWh | kgCO2eq | Costo |
# +------------+----------+-----------+----------+
# | EC2 | 1,247.3 | 436.6 | $892.40 |
# | S3 | 89.2 | 31.2 | $45.60 |
# | RDS | 456.8 | 159.9 | $312.00 |
# | Lambda | 12.4 | 4.3 | $8.20 |
# +------------+----------+-----------+----------+
# | TOTALE | 1,805.7 | 632.0 | $1,258.2 |
# +------------+----------+-----------+----------+
#
# Top raccomandazioni:
# 1. Right-size EC2 i3.xlarge (util. 12%) -> risparmio 340 kgCO2/mese
# 2. Migra a Graviton (ARM) -> risparmio 15% energia
# 3. Abilita S3 Intelligent Tiering -> risparmio 40% storage
Przyjęcie i trendy przemysłowe
Według raportu Stan Zielonego Oprogramowania 2025 GSF, stosowanie zasad ekologicznego oprogramowania szybko rośnie. Rynek ekologicznych centrów danych jest wyceniany na ok w przybliżeniu 95 miliardów dolarów w 2025 roku i oczekuje się, że osiągnie I 396 miliardów do 2034 roku. Komponent oprogramowania to najszybciej rozwijająca się kategoria, z CAGR na poziomie 30,4%.
Inicjatywy Big Tech na rzecz zielonego oprogramowania
| Agencja | Cel | Kluczowe inicjatywy |
|---|---|---|
| Microsoftu | Ujemny pod względem emisji dwutlenku węgla do 2030 r | Pulpit nawigacyjny wpływu emisji, Windows Update uwzględniający emisję gazów cieplarnianych |
| Energia bezemisyjna 24 godziny na dobę, 7 dni w tygodniu do 2030 roku | Inteligentne obliczenia węglowe, pulpit nawigacyjny śladu węglowego | |
| AWS | Zero netto do 2040 r | Narzędzie do pomiaru śladu węglowego klienta, Graviton (efektywność energetyczna) |
| Połowa | Łańcuch wartości zerowej netto do 2030 r | Otwarte pozyskiwanie zrównoważonych badań nad sztuczną inteligencją, wydajność centrum danych |
Rola regulacji
Unia Europejska jest liderem w zakresie regulacji wraz z Raportowanie dotyczące zrównoważonego rozwoju firmy Dyrektywa (CSRD), które wymaga od dużych przedsiębiorstw zgłaszania emisji w zakresie 1, 2 i 3. Dla producentów oprogramowania Zakres 3 (emisje pośrednie z łańcucha dostaw, w tym korzystanie z oprogramowania przez klientów) często stanowi 80–90% całości. To sprawia, że pomiar SCI nie istnieje bardziej opcjonalne, ale wymaganie zgodności.
Praktyczny plan działania: od zera do ekologicznego oprogramowania
Wdrażanie zasad zielonego oprogramowania nie wymaga rewolucji. Oto postępowy plan działania włączenie efektywności węglowej do cyklu rozwojowego.
Faza 1: Pomiar (tydzień 1-2)
- Zintegrować KodWęgiel o Ślad węglowy w chmurze w swoim projekcie
- Zdefiniuj jednostka funkcjonalna (R) dla Twojego oprogramowania
- Oblicz bazowy wynik SCI
- Dokumentuj bieżące zużycie energii przez kluczowe usługi
Faza 2: Optymalizacja (tydzień 3-6)
- Narzędzie buforowanie strategiczne aby ograniczyć powtarzające się obliczenia
- Stosować dozowanie do operacji we/wy i baz danych
- Zoptymalizuj algorytmy krytyczne (profilowanie → hotspot → doskonalenie)
- Umiejętność kompresja e leniwe ładowanie w interfejsie
- Sprawdź wielkość serwera (właściwy rozmiar)
Faza 3: Świadomość emisji dwutlenku węgla (tydzień 7-10)
- Integruje API intensywność węgla (Mapy energii elektrycznej, WattTime)
- Narzędzie przesunięcie czasowe dla niekrytycznych zadań wsadowych
- Oceń przesunięcie przestrzenne: Czy obecny obszar chmur jest najbardziej zielony?
- Dodaj wskaźniki uwzględniające emisję dwutlenku węgla do pulpit monitorujący
Faza 4: Kultura (ciąg dalszy)
- Zintegruj to Wynik SCI w CI/CD jako miernik jakości
- Trenuj drużynę dalej Certyfikat Green Software Practitioner z GSF
- Uwzględnij wpływ węgla w przegląd kodu
- Podziel się wynikami: przejrzystość emisji i postępu
Szybkie zwycięstwo: 5 najbardziej wpływowych działań
- 1. Włącz kompresję Brotli we wszystkich odpowiedziach HTTP (→ -70% ruchu sieciowego)
- 2. Zaimplementuj buforowanie z odpowiednimi TTL (→ -50-90% zapytań DB)
- 3. Wybierz najbardziej ekologiczny dostępny region chmur (→ aż do -98% emisji operacyjnych)
- 4. Serwery o odpowiedniej wielkości i umożliwiające automatyczne skalowanie (→ -30-60% energii w stanie bezczynności)
- 5. Stosuj leniwe ładowanie i dzielenie kodu w interfejsie (→ -40-60% transferu danych)
Wniosek
8 zasad Green Software Foundation nie stanowi ram teoretycznych odległych od rzeczywistości codzienny rozwój. Jestem jeden praktyczny obiektyw dzięki któremu można ocenić każdą decyzję technika: od wyboru algorytmu po region wdrożenia, od strategii buforowania do politykę skalowania.
Specyfikacja SCI (ISO/IEC 21031:2024) zapewnia wspólny język pomiarów postęp i ekosystem narzędzi — od CodeCarbon po pakiet SDK Carbon Aware Przy minimalnych nakładach inwestycyjnych możliwe jest przejście od teorii do praktyki.
Ponieważ centra danych zaczynają zużywać więcej 1000 TWh rocznie i regulacja Unii Europejskiej (CSRD), która wymaga przejrzystości w zakresie emisji, zielone oprogramowanie nie jest już „miło mieć”: to a wymogi konkurencyjne i regulacyjne. Najlepszy czas na początek był wczoraj. Drugi najlepszy czas jest teraz.
„Najbardziej ekologiczne oprogramowanie to nie to, które kompensuje emisję, ale to, co z nią robi produkuje mniej na jednostkę wartości. Prawdziwy zrównoważony rozwój mierzy się za pomocą SCI, nie z kredytami węglowymi.” — Zasada założycielska Fundacji Zielonego Oprogramowania
Zasoby, aby dowiedzieć się więcej
- Naucz się ekologicznego oprogramowania — Learn.greensoftware.foundation (kurs bezpłatny)
- Specyfikacja SCI — sci.greensoftware.foundation (norma ISO/IEC 21031)
- Pakiet SDK uwzględniający emisję dwutlenku węgla — github.com/Green-Software-Foundation/carbon-aware-sdk
- KodWęgiel — codecarbon.io (śledzenie emisji Pythona)
- Mapy energii elektrycznej — app.electricitymaps.com (intensywność emisji dwutlenku węgla w czasie rzeczywistym)
- Ślad węglowy w chmurze — cloudcarbonfootprint.org (śledzenie w chmurze)
- Praktyk zielonego oprogramowania — Oficjalna certyfikacja GSF
W kolejnym artykule z tej serii zagłębimy się w temat zrównoważony wzór projektowy ze specyficznymi architekturami dla mikrousług, frontendów i potoków danych, ze wskaźnikami oszczędności mierzalne dla każdego wzoru.







