How Many Eyeballs Tame Complexity

Miten monimutkaisesta tulee läpinäkyvää


It's one thing to observe in the large that the bazaar style greatly accelerates debugging and code evolution. It's another to understand exactly how and why it does so at the micro-level of day-to-day developer and tester behavior. In this section (written three years after the original paper, using insights by developers who read it and re-examined their own behavior) we'll take a hard look at the actual mechanisms. Non-technically inclined readers can safely skip to the next section.

Yleisellä tasolla voi sanoa, että basaarityyli nopeuttaa ohjelmavirheiden korjausta ja koodin evoluutiota. Se ei vielä selitä tarkasti, miten ja miksi työ nopeutuu mikrotasolla kehittäjien ja testaajien päivittäisessä työssä. Tämä luku perustuu kolme vuotta aiemmin valmisteltuun artikkeliin ja sen lukeneiden kehittäjien omakohtaisiin kokemuksiin. Keskitymme tässä luvussa basaarimallin vaikutusmekanismeihin. Jos lukija ei ole kiinnostunut ohjelmistojen teknisestä puolesta, hän voi huoletta hypätä seuraavaan lukuun.


One key to understanding is to realize exactly why it is that the kind of bug report non–source-aware users normally turn in tends not to be very useful. Non–source-aware users tend to report only surface symptoms; they take their environment for granted, so they (a) omit critical background data, and (b) seldom include a reliable recipe for reproducing the bug.

Yksi nopeuseroa selittävistä tekijöistä on, että käyttäjät, joiden saatavissa ei ole lähdekoodia, eivät yleensä tuota kovin hyödyllisiä virheraportteja. He kertovat tavallisesti vain ongelmien pinnallisista oireista. Käyttöympäristö otetaan itsestään selvyytenä, joten he (a) jättävät huomiotta olennaista taustatietoa ja (b) harvoin tuottavat tarkkoja kuvauksia siitä, millaisessa tilanteessa virhe syntyy.

bug report = bugiraportti


The underlying problem here is a mismatch between the tester's and the developer's mental models of the program; the tester, on the outside looking in, and the developer on the inside looking out. In closed-source development they're both stuck in these roles, and tend to talk past each other and find each other deeply frustrating.

Taustalla vaikuttaa testaajien ja kehittäjien ajatusmallien ero. Testaaja katsoo ohjelmaa ulkoa sisään ja kehittäjä sisältä ulos. Suljetun lähdekoodin kehityksessä molemmat toimijat ovat jumiutuneet rooleihinsa, joten heillä on taipumus puhua toistensa ohi ja turhautua toisiinsa perinpohjaisesti.


Open-source development breaks this bind, making it far easier for tester and developer to develop a shared representation grounded in the actual source code and to communicate effectively about it. Practically, there is a huge difference in leverage for the developer between the kind of bug report that just reports externally-visible symptoms and the kind that hooks directly to the developer's source-code–based mental representation of the program.

Avoimen lähdekoodin kehitysmalli rikkoo rooleihin liittyvät kahleet. Se tekee yhteisen näkemyksen luomisen testaajien ja kehittäjien välille helpommaksi ja vuorovaikutuksen tehokkaammaksi. Ohjelmoijan näkökulmasta virheraportti, joka perustuu lähdekoodiin on huomattavasti antoisampi kuin käyttäjälle näkyvään toiminnallisuuteen perustuva tieto.

Muuttelin lauserakennetta jonkin verran enkä vieläkään ole aivan tyytyväinen.


Most bugs, most of the time, are easily nailed given even an incomplete but suggestive characterization of their error conditions at source-code level. When someone among your beta-testers can point out, "there's a boundary problem in line nnn", or even just "under conditions X, Y, and Z, this variable rolls over", a quick look at the offending code often suffices to pin down the exact mode of failure and generate a fix.

Useimmat ohjelmavirheet on helppo ratkaista, jos virheraportissa on edes suuntaa antavat tiedot siitä, missä kohtaa lähdekoodia ongelma esiintyy. Kun joku beta-testaajista voi osoittaa "rivillä n on rajaongelma" tai kertoa edes, että "olosuhteissa X, Y ja Z tämä muuttuja vuotaa yli", vilkaisu ohjelmakoodiin riittää useimmiten yksilöimään virheen ja mahdollistaa sen korjauksen.

rajaongelma? vuotaa yli? käsitteitä voisi miettiä vielä tarkemmin (en tosin itse keksi nyt parempia)

kirjan tämän luvun alussa oli jargon-varoitus, vuotaa yli on käytetty termi.

Boundary problemille tarvitaan joku eri käännös kuin 'rajaongelma' jota mm. google ei tunne.. Miten olisi 'rivillä nnn rikkoutuu aikaisemmin asetettu raja-arvo' tms? --rhk

Alkuperäisessä tekstissä "rivillä nnn", mutta mielestäni luettavampi ja ymmärrettävämpi on "rivillä n" (JarkkoIH)


Thus, source-code awareness by both parties greatly enhances both good communication and the synergy between what a beta-tester reports and what the core developer(s) know. In turn, this means that the core developers' time tends to be well conserved, even with many collaborators.

Kun sekä ohjelmoijat että käyttäjät voivat käyttää lähdekoodia, tiedonvaihto heidän välillään tarkentuu. Testaajien raportoinnin ja varsinaisten ohjelmoijien tietämyksen yhteisvaikutus vahvistuu. Ohjelman kehittäjien aika tulee tehokkaasti käytetyksi, vaikka apukehittäjiä olisi paljonkin.

Core developers ei viitanne ytimen kehittäjiin vaan ydinkehittäjiin, pääylläpitäjiin, miten se nyt sitten muotoillaankaan. Laitoin nyt että varsinaiset kehittäjät.


Another characteristic of the open-source method that conserves developer time is the communication structure of typical open-source projects. Above I used the term "core developer"; this reflects a distinction between the project core (typically quite small; a single core developer is common, and one to three is typical) and the project halo of beta-testers and available contributors (which often numbers in the hundreds).

Kehittäjien aikaa säästää lisäksi avoimen lähdekoodin projektien tyypillinen tiedonvaihtotapa. Äsken käytin termiä "varsinaiset ohjelmoijat", mikä viittaa eroon, joka voidaan tehdä toisaalta projektin pienen ydinryhmän (usein 1-3 henkilöä) ja toisaalta projektin ympärillä parveilevien, yhteensä satojen betatestaajien ja muiden avustajien välillä.

Käännöksessä on ennen korjailua ollut melko paljon virheitä, joten työ kannattaa vielä oikolukea huolellisesti. Tässä oli virheellisesti käännetty, että "Toinen kehittäjän aikaa kuluttava tyypillinen piirre ..." - Jopi. Alla jonkin kirjoittajan kommentti aiempaan versioon.

Ydinryhmä lienee ok. Olisiko "core developer" sitten "ydinkehittäjä", vrt. edellisen kappaleen kommentti.


The fundamental problem that traditional software-development organization addresses is Brook's Law: Adding more programmers to a late project makes it later. More generally, Brooks's Law predicts that the complexity and communication costs of a project rise with the square of the number of developers, while work done only rises linearly.

Perusongelma, jonka tavallinen ohjelmistoa kehittävä organisaatio kohtaa, on Brooksin laki: "Jos aikataulusta jäljessä olevaa ohjelmaa kehittävien ohjelmoijien määrää lisätään, työ viivästyy entisestään." Yleistäen Brooksin Laki ennustaa, että projektin kompleksisuus ja yhteydenpidon kustannukset kasvavat suhteessa kehittäjien lukumäärän neliöön, kun taas työn tulokset kasvavat vain lineaarisesti.

Tässä oli jälleen paha virhe: Brooks on käännetty Brookeksi; tosin alkuperäisessäkin tekstissä nimessä on tässä kohtaa kirjoitusvirhe. - Jopi.

Korjasin tekstin loogisen virheen. Jos työteho pysyy vakiona, kasvaa tehdyn työn määrä vakiona. Jos työteho kasvaa, kavaa tehty työ nopeammin kuin lineaarisesti. -- Korjasin tuota vielä: tekstissä ei puhuta työtehosta vaan valmiiksi tehdyn työn määrästä, työsaavutuksesta.


Brooks's Law is founded on experience that bugs tend strongly to cluster at the interfaces between code written by different people, and that communications/coordination overhead on a project tends to rise with the number of interfaces between human beings. Thus, problems scale with the number of communications paths between developers, which scales as the square of the humber of developers (more precisely, according to the formula N*(N - 1)/2 where N is the number of developers).

Brooksin laki perustuu kokemukseen, jonka mukaan ohjelmointivirheet kasaantuvat eri henkilöiden kirjoittamien osien rajapinnoille ja projektin kommunikaatio- ja koordinaatiokustannukset kasvavat ihmisten välisten rajapintojen määrän mukana. Ongelmat lisääntyvät suhteessa kehittäjien välisten yhteydenpitoreittien määrään ja suhteessa kehittäjien määrän (N) neliöön kaavan N*(N - 1)/2 mukaisesti.


The Brooks's Law analysis (and the resulting fear of large numbers in development groups) rests on a hidden assummption: that the communications structure of the project is necessarily a complete graph, that everybody talks to everybody else. But on open-source projects, the halo developers work on what are in effect separable parallel subtasks and interact with each other very little; code changes and bug reports stream through the core group, and only within that small core group do we pay the full Brooksian overhead. [SU]

Brooksin laki ja siitä johtuva suurten kehittäjäryhmien pelko perustuvat julkilausumattomaan oletukseen, jonka mukaan projektin viestintä on kattavaa, kun kukin osallistuja kommunikoi kaikkien muiden kanssa. Kuitenkin avoimen lähdekoodin projekteissa ydinryhmän ulkopuoliset kehittäjät työskentelevät käytännössä erillisten, rinnakkaisten osatehtävien parissa ja kommunikoivat keskenään hyvin vähän. Ohjelmakoodin muutokset ja virheraportit kulkevat pienen ydinryhmän kautta, ja Brooksin laki pätee täysin vain sen piirissä. [SU]

subtask?


There are are still more reasons that source-code–level bug reporting tends to be very efficient. They center around the fact that a single error can often have multiple possible symptoms, manifesting differently depending on details of the user's usage pattern and environment. Such errors tend to be exactly the sort of complex and subtle bugs (such as dynamic-memory-management errors or nondeterministic interrupt-window artifacts) that are hardest to reproduce at will or to pin down by static analysis, and which do the most to create long-term problems in software.

On muitakin syitä, joiden takia lähdekooditason virheraportointi on yleensä tehokasta. Nämä syyt liittyvät siihen, että yksittäisellä ohjelmistovirheella voi olla useita oireita, jotka ilmenevät eri tavoilla riippuen käyttäjien toimintatavoista ja ympäristöstä. Esimerkiksi dynaamiseen muistinhallintaan liittyvät kömmähdykset tai näennäisen satunnaisesti keskeytysikkunoihin liittyvät häiriöt ovat niin monimutkaisia ja salakavalia virheitä, että virhetilannetta on hankala toistaa eikä sitä ole helppo yksilöidä staattisellakaan analyysillä. Tällaiset virheet aiheuttavat eniten pitkäaikaisia ongelmia ohjelmistoissa.

Korjattu virhe: static ei ole sama kuin tilastollinen. - Jopi.

nondeterministic interrupt-window artifacts?

-- epämääräiset keskeytymiset?

--epäennustettevat on hyvä

--keskeytysikkuna vois olla parempi

-- miten olisi 'satunnaisen oloiset (laitteisto?)keskeytyksiin liittyvät ongelmat'. Toimivaa ja ymmärrettävää käännöstä lienee vaikea löytää.. -- rhk


A tester who sends in a tentative source-code–level characterization of such a multi-symptom bug (e.g. "It looks to me like there's a window in the signal handling near line 1250" or "Where are you zeroing that buffer?") may give a developer, otherwise too close to the code to see it, the critical clue to a half-dozen disparate symptoms. In cases like this, it may be hard or even impossible to know which externally-visible misbehaviour was caused by precisely which bug—but with frequent releases, it's unnecessary to know. Other collaborators will be likely to find out quickly whether their bug has been fixed or not. In many cases, source-level bug reports will cause misbehaviours to drop out without ever having been attributed to any specific fix.

Testaaja, jolla on käytössään lähdekoodi, voi lähettää monioireisesta virheestä alustavan kuvauksen. Hän voi todeta esimerkiksi, että signaalinkäsittelyssä näyttää olevan ongelma lähellä riviä 1250, tai hän voi kysyä, missä se-ja-se puskuri nollataankaan. Tällaiset viestit voivat olla vihje, jotka auttavat ohjelmoijaa ratkaisemaan puolenkymmentä erillistä ongelmaa. Voi olla hankalaa tai jopa mahdotonta tietää, mikä ongelma liittyi mihinkin virheeseen, mutta se onkin usein tarpeetonta. Muut apukehittäjät ottavat pian selvää, ratkaisivatko korjaukset niitä ongelmia, joita he ovat seuranneet. Monesti lähdekoodiin perustuvat virheraportit auttavat poistamaan ongelmia ilman että niiden täsmälliset syyt selviävät.

Kun viitataan suuruusluokkaan, englannissa puhutaan usein tusinoista, suomessa on parempaa tyyliä puhua kymmenistä. - Jopi.

Muokkasin aika radikaalisti.


Complex multi-symptom errors also tend to have multiple trace paths from surface symptoms back to the actual bug. Which of the trace paths a given developer or tester can chase may depend on subtleties of that person's environment, and may well change in a not obviously deterministic way over time. In effect, each developer and tester samples a semi-random set of the program's state space when looking for the etiology of a symptom. The more subtle and complex the bug, the less likely that skill will be able to guarantee the relevance of that sample.

Monimutkaisissa ja monioireisissa virheissä pinnallisista oireista on usein löydettävissä monia jäljitysreittejä itse virheisiin. Se, mitä reittejä kukin kehittäjä tai testaaja voi seurata riippuu tämän henkilön käyttämästä ympäristöstä. Reitit voivat muuttua yllättävällä tavalla uusien ohjelmaversioiden tullessa käyttöön. Jokainen jonkin oireen syytä hakeva kehittäjä tai testaaja tarkastelee puolittain satunnaista ohjelman tila-avaruuden osajoukkoa. Mitä ovelampi ja monimutkaisempi virhe on, sitä pienemmällä todennäköisyydellä pelkkä ammattitaito takaa sen, että tarkasteltavaksi otetaan osajoukko, joka on merkityksellinen virheen kannalta.

Korjattu viimeisen lauseen virheellinen käännös: "sitä epätodennäköisemmin tällä keinolla tulee valituksi oikea joukko." - Jopi.

Olipas hankala! Mikä on tämä "trace path"? Se on avaintermi noiden loppukappaleiden käännöksessä. Käänsin "trace path" -sanaliiton jäljityspoluksi 5.12.2008 (JP); "Aetiology/etiology" - oppi tautien syistä


For simple and easily reproducible bugs, then, the accent will be on the "semi" rather than the "random"; debugging skill and intimacy with the code and its architecture will matter a lot. But for complex bugs, the accent will be on the "random". Under these circumstances many people running traces will be much more effective than a few people running traces sequentially—even if the few have a much higher average skill level.

Yksinkertaisten ja helposti toistettavien virheiden kohdalla työstettävänä olevan otoksen satunnaisuus ei vaikuta paljoakaan. Taito korjata virheitä sekä ohjelmakoodin tuttuus ja sen rakenne ovat silloin ratkaisevia. Monimutkaisten virheiden kohdalla satunnaisuus korostuu. Silloin on tehokkaampaa, että virheitä jäljittää monia ihmisiä, kuin että työ etenee järjestelmällisesti muutaman ihmisen voimin, vaikka nämä olisivatkin erityisen taitavia.

"Run traces"???


This effect will be greatly amplified if the difficulty of following trace paths from different surface symptoms back to a bug varies significantly in a way that can't be predicted by looking at the symptoms. A single developer sampling those paths sequentially will be as likely to pick a difficult trace path on the first try as an easy one. On the other hand, suppose many people are trying trace paths in parallel while doing rapid releases. Then it is likely one of them will find the easiest path immediately, and nail the bug in a much shorter time. The project maintainer will see that, ship a new release, and the other people running traces on the same bug will be able to stop before having spent too much time on their more difficult traces [RJ].

Ero on vielä suurempi, jos virheiden jäljittämisen vaikeus vaihtelee tavalla, jota ei voi ennakoida oireiden perusteella. Silloin satunnainen ohjelmistokehittäjä valitsee yhtä todennäköisesti vaikean kuin helpon reitin tarkasteltavakseen. Toisaalta jos jäljitystyötä tekee suuri joukko osallistujia rinnakkain ja jos uusia versioita julkaistaan nopeassa tahdissa, on todennäköistä, että joku mukana olevista sattuu valitsemaan helpon reitin ja ratkaisee ongelman nopeasti. Silloin ohjelmiston ylläpitäjä voi julkaista uuden version, eikä muiden, pidemmän tien kulkijoiden, tarvitse enää käyttää aikaa kyseisen ongelman pohtimiseen [RJ].

viite RJ; "trace path" - kääntämiseen tarvitaan ohjelmoimiseen perehtynyt henkilö; ehkä jokin looginen hyppykäskyjen seuranta koodissa?; Käänsin "jäljityspolku" 5.12.2008 (JP)

--tähän jätin sanan bugi, koska se sopii tilanteeseen hyvin, ensin metsästys ja sitten liiskaus. (ja onhan tämä kappale jargon varoituksen alainen)


Katedraali ja basaari: Luku5 (last edited 2009-05-15 22:39:58 by JarkkoIH)