Ryba smrdí od návrhu

Srakyi blognul odkaz na docela zajímavý článek Franka Kellyho. Pár míst bych hned podepsal – třebas automatizované sestavení aplikace včetně provedení testů úžasně podporuje i další dobré zvyky. Ale s jedním bodem bych polemizoval: žádná nebo minimalistická dokumentace nemusí u mnoha projektů vadit. Pokud se třída dobře jmenuje, je umístěna ve správně pojemnovaném namespace a její metody jsou šikovně a výstižně pojmenovány, proč duplikovat námahu? Stačí přeci okomentovat jen to, co není očividné.

Dokumentace vždy a všude je navíc strašlivou koulí na noze. Duplikuje informaci a tudíž vytváří riziko vzniku nekonzistence. Není dobře podchytitelná při refacoringu. Jednou větou: Řekni to raději kódem! Dokumentovat má smysl jenom věci, které nejsou patrné na první pohled (a u těch by se programátor měl raději zamyslet, zda je nenapsat lépe než dokumentovat).

PS: o zmíněné teorii rozbitých oken před časem psal Scienceworld. Článek má i neméně zajímavou a k teorii poměrně kritickou diskusi.

Mock testing – Potěmkinovy vesnice

Před pár týdny jsem objevil skvělou knihovnu EasyMock. Chystal jsem se o ní něco málo blognout, ale Otec Fura mne předběhnul. Rozhodně si jeho post přečtěte. Nazajde moc do hloubky, ale na první dojem to stačí.

A pokud by vám i potom vrtalo hlavou, jak přesně se liší mocky a stuby a jak se mezi nimi rozhodnout, rozhodně mrkněte na skvělé vysvětlení od Martina Fowlera. A možná stojí za to věnovat EasyMocku pozornost i pokud vás problematika mocků příliš nezaujala – je na nich dobře vidět, jak se může knihovna změnit přepsáním do Javy 5.

Hon na Rudý Říjen

Lovit tuhle chybu mi trvalo pár desítek minut. Ale dovedu si snadno představit i to, že by mi to trvalo dny…

Píšu wapovou aplikaci, kde je jedním z možných vstupů GPS souřadnice. Zadejte souřadnici v některém podporovaném formátu, klik a jede se dál. Parsování souřadnic není úplně jednoduché – není těžké ho napsat, ale je to i za použití regexpů docela pracné. A jednoho dne se mi v bugzille objeví chyba, která tvrdí, že souřadnice 50°5’7.74″N,14°26′­26.08″E jsou označeny za nekorektní.

  • Copy&paste souřadnic do aplikace. Opravdu to nefunguje.
  • Od oka ty souřadnice vypadají správně, ten formát bych měl spolehlivě parsovat.
  • Log čistý. Mám chuť si nastavit logování na podrobnější.
  • Mrknu do zdrojáků unittestů, opravdu je tam ověřováno parsování stejně naformátovaných souřadnic. Liší se jenom čísly.
  • OK, vyrobím si selhávající unittest. Copy&paste souřadnic do Eclipse.
  • Unittest v zelené. Takže se mi pokazí data někde cestou.
  • Cvičně si vezmu podobné souřadnice z unittestu a pastnu je do aplikace. Načteny.
  • Přepnout logy na DEBUG.
  • Nic zajímavého.
  • Takže kontrolní výpis někam na půl cesty mezi jsp a parser.
  • Kruci, nikde se nic nepokazilo.
  • A výpis do parseru.
  • Přišla stejná data, jako jsou v unittestu.
  • Někde něco očividně hnije.
  • Chvilka odreagování se na kompost.cz
  • Copy&paste souřadnic z bugzilly do aplikace. Opravdu to nefunguje.
  • Kouknu na zdrojáky unittestu, přidám jedeno failování, abych si byl jistý, že je kód opravdu zavolán.
  • Unittest poslušně selže. Sakra.
  • Copy&paste souřadnic z unittestu do aplikace. Ono to funguje!
  • Copy&paste souřadnic z bugzilly do aplikace. Nefunguje.
  • Copy&paste souřadnic z unittestu do aplikace. Funguje!
  • Copy&paste souřadnic z bugzilly do aplikace. Nefunguje.
  • Opsání souřadnic z bugzilly do aplikace. Funguje.
  • Grrrrrrrr.
  • Nyní již máte na této stránce dostatek indicií k tomu, abyste odhalili chybu. Pokud chcete rozuzlení, čtěte dál.
  • Copy&paste souřadnic z bugzilly do aplikace. Nefunguje. Log OK. Zkusím si maličko změnit formát, tohle stupnítko nahradím písmenkem D. A tohle minutítko emkem. A voila, co se to tu děje? Abych smazal minutítko, musím zmáčknout backspace dvakrát.
  • A už je to vlastně hotovo. Mrknu do zdrojáku stránky, ze které kopíruji, zda není uvnitř souřadnic nějaký whitechar. A je. Kdoví proč tam straší ­. Grrr.

Takže co se stalo? Když jsem z bugzilly kopíroval souřadice do své aplikace, byl v nich jeden skrytý znak navíc. Ale při vložení do JUnit testu v Eclipse někdo (nejspíš SWT, možná Carbon) ten paznak odstranil. To vysvětluje celé podivuhodné chování, které jsem při ladění pozoroval.

Pokud by měl mít příběh nějaké rozuzlení, tak je to: Ať ladíš, jak ladíš, stejně nakonec potřebuješ trochu štěstí a bystré oko.

Hasta la vista, Vista

Joel Spolsky se pěkně otřel o to, jak budou uživatelé vypínat Windows Vista. Rozhraní označil za příliš komplikované, nabízí podle něj příliš mnoho možností.

Shodou okolností máme možnost přečíst si i názor z Microsoftu – programátor, který implementoval uživatelské rozhraní k vypnutí počítače vzpomíná na to, jak strávil vývojem této vlastnosti rok. Joelova kritika je zajímavá, ale popis vývoje je ještě mnohem zajímavější. Z blogpostu – a z dlouhé, ale velmi zajímavé diskuse pod ním – lze vyčíst mnoho o tom, jak funguje Microsoft.

První příjemné zjištění je, že malá měkká firma je už velká a zkostnatělá – do takové drobnosti tak či onak remcalo 43 lidí. Navíc poměrně těžkopádný systém buildů způsoboval, že každá oprava se integrovala do zbytku systému týdny až měsíce.

V diskusi schytalo sestavování Windows pěknou dávku kritiky – systém je rozsáhlý a tak je rozdělen do mnoha komponent, které mají vlastní vývojářské teamy. Ty nemají k dispozici snadno přístupné společné uložiště zdrojových kódů, ale změny jsou do něj postupně integrovány v několika krocích. Na tom by nebylo nic špatného, pokud by byly komponenty volně svázané přes slušně definovaná rozhraní (ne, v hodinách softwarového inženýrství, se o něčem takovém nemluví druhou hodinu). Protože jsou však komponenty svázány dost těsně a závislosti jsou mnohdy i cyklické, nastává pro vývojáře peklo na zemi. Jen v něm jsou místo kotlů schůze a místo čertů s vidlemi managoři.

Anonym to v diskusi shrnul takto:

The people who designed the source control system for Windows were *not* idiots. They were trying to solve the following problem:
- thousands of developers,
- promiscuous dependency taking between parts of Windows without much analysis of the consequences
–> with a single codebase, if each developer broke the build once every two years there would never be a Longhorn build (or some such statistic – I forget the actual number)

There are three obvious solutions to this problem:

1. federate out the source tree, and pay the forward and reverse integration taxes (primarily delay in finding build breaks), or…

2. remove a large number of the unneccesary dependencies between the various parts of Windows, especially the circular dependencies.

3. Both 1&2

#1 was the winning solution in large part because it could be executed by a small team over a defined period of time. #2 would have required herding all the Windows developers (and PMs, managers, UI designers…), and is potentially an unbounded problem.

Pěkně také vysvětlil, proč open source netrpí v takové míře podobnými problémy:

- rarely take dependencies on unshipped code
- rarely make circular dependencies
- mostly take depemdencies on mature stable components.

Jak později poznamenává (jiný nebo stejný?) Anonym, který o sobě tvrdí, že je vývojářem Windows – oddělení různých větví vývoje funguje v prvních fázích vývoje, protože dobře separuje nefunkční kód, ale při přípravě milestonů je to nepříjemný zádrhel – každá dosud neintegrovaná větev se chce nejednou dostat do release a to působí neplechu.

Několik pisatelů v diskusi také zmiňuje důležitost akceptačních testů – to je pro mne důležité zjištění, je to oblast, kterou bych si měl lépe nastudovat.

Těžko říci, jak z toho ven. Možná je lepší se nikdy nedostat dovnitř… Možná je nutné změnit paradigma (OK, ten článek je zastaralý, tedy chci říci klasika), abyste nezjistili, že jste napsali 200 funkčních řádek za rok. Rád si v diskusi přečtu i váš názor.

JUG o testování a Java EE 5

Ve čtvrtek se opět sejde Česká Java user group, tentokrát se dvěma zahraničními hosty. Bruno Bossola promluví o opensource řešeních pro automatické testování. A Filippo Diolatevi ukáže Java EE 5. Oba přednášející jsou Java championi, takže je jistě na co se těšit.

Setkání CZJUG probíhají od 18:00 na Elektrotechnické fakultě ČVUT, v místnosti K1. Adresa: Karlovo náměstí 13, Praha, vstup přes Strojní fakultu.