ChatGPT, muut kielimallit ja tekoäly

Alkaa tuntua siltä, että kuulun tässä asiassa ns. old school dinosauruksiin, mutta esitän hieman eriävän näkemyksen asiasta.

Lähtökohtaisesti tilanne on nähdäkseni se, että mikään (järjellinen) määrä yksikkötestejä ei sinänsä voi tyypillisessä tilanteessa taata ohjelman toiminnan oikeellisuutta. Vain poikkeustapauksissa testipatteristoista voidaan tehdä aukottoman kattavia.

Miksikö? No lähinnä siitä syystä, että esimerkiksi jo vain yhden 32-bittisen kokonaisluvun syötteeksi ottava ohjelma tarvitsee yli neljä miljardia testitapausta, jos se halutaan syötteiden osalta testata kattavasti. Joissain tilanteissa tällainen brute force -testaus on mahdollista, mutta lähes aina käytännössä syöteavaruuden kombinatorinen räjähdys kohtaa sitä, joka aikoo testata ohjelman täydellisesti.

Tästä syystä toinen keskeinen komponentti on mielestäni se, että pyritään koodia lukemalla (tai kirjoittamalla) ymmärtämään, että ollaan ratkaisemassa oikeaa ongelmaa. Kun on pyritty ensin varmistumaan logiikan oikeellisuudesta, kohtuullisella määrällä yksikkötestejä voi varmistaa, että esimerkiksi corner caseissa ei tullut söhlittyä ja saadaan jonkinlainen testipenkki, mitä vastaan samalla tavalla ajatuksella tehtyjä muutoksia voi testata.

Jos koodia ei ole edes katsottu, mennään käytännössä uskon varassa sen osalta, että koodin on edes aikomus ratkaista oikea ongelma eikä pelkästään läpäistä testitapauksia. Tähän liittyy esimerkiksi tuo aiempaan agenttien testihuijauksiin liittyvä viestini. Oleellista noissa huijaustapauksissa ei mielestäni ole se, miten ne nyt johonkin benchmarkin tuloslistaan vaikuttavat. Nuo ovat niitä asioita, jotka voivat tulla vastaan myös silloin, kun itse laatii testipenkkiä agentien tuotoksille.

Yhtenä esimerkkinä voisi nostaa tähän edeltä seuraavan:

Linkin takaa löytyi tarkempikin analyysi siitä, miltä tämä huijaus näytti:

Agentti siis rakenteli hankalassa tilanteessa ratkaisuksi kasan if-lausekkeita, jossa jokaista testicasea kohden palautettiin se vastaus, joka testicasesta piti saada ulos.

Tässä on yhdenlainen (erittäin räikeä toki) esimerkkitapaus siitä, miten pelkät yksikkötestit voi läpäistä, mutta kuitenkaan taustalla ei ole ollut edes yritystä ratkaista varsinaista ongelmaa. Helposti on kuviteltavissa vastaavanlaisia hienovaraisempia “kumilenkityksiä”, joilla läpäistään testitapauksia, mutta ei kuitenkaan ratkaista varsinaista ongelmaa. Tämä on yhdenlainen esimerkki ohjelman ylisovittumisesta testiaineistoon, mistä tuossa joku aika takaperin jotain kirjoitin.

Yksi tapa tällaisten (ainakin osittaiseen) estämiseen olisi se, että osa testitapauksista olisi sellaisia, että agenteille ei niitä koskaan näytetä, vaan ne toimivat vasta myöhemmässä vaiheessa jonkinlaisena “happotestinä” agenttituotoksen verifioinnille. Mutta tuo tietysti rikkoo sitten automaatioputken, jos koko homma oli tarkoitus automatisoida ja lopulta antaa agentille automaattista palautetta virheistä.

Agenttinen lähestymistapa on tietysti virittää sitten agentit tutkimaan agenttien tuotoksia, kuten tuossa blogikirjoituksen selvityksessä. Mutta tämäkään ei tietysti tuo itselle sitä ymmärrystä siitä, yrittääkö kirjoitettu koodi ratkaista sitä ongelmaa, jota piti olla ratkomassa. Homma lepää uskon varassa siihen, että agentit saivat keskenään homman toimimaan ja testattua.

Kuten aiemminkin olen sanonut, niin varmaan tämä johonkin hommaan sopii, mutta joissain toleranssit ovat sitten pienemmät sählingin sietämiselle. Ja itselläni kantapään kautta hankittu kokemus sotii vahvasti sitä vastaan, että käsistään voi päästään mitään, minkä toimintaa ei riittävän hyvin tunne. Historiallisesti tuommoisissa tilanteissa on varsin usein käynyt niin, että tilanteen löytää sitten edestään myöhemmin ja mahdollisesti myös vielä harmistuneen asiakkaan pelkän teknisen ongelman lisäksi.

No, mutta kuten sanottu, nämä ajatukset eivät ole nykyään oikein muodissa. :slight_smile:

19 tykkäystä

Nykyään tilanne on siitä onnellinen (tai onneton), että koodauksessa ei tarvitse ymmärtää koodista mitään, mikäli ohjelmointiprojekti on pieni ja yksinkertainen. Yhä enenevissä määrin myös taitavat koodarit ovat siirtymässä hyödyntämään agenttikoodausta käsinkoodauksen sijaan. Toki on myös paljon sellaista ohjelmointityötä, mihin kielimalleja ei kannata tai edes oikein voi hyödyntää.

Käytännön esimerkki aloittelijan vibe-koodauksesta lienee paikallaan. Avaat terminaalin ja sitä kautta koodaustyökalun:


Kirjoitat sinne vaikkapa “/plan Haluaisin tehdä moninpelattavan matopelin.” Sen jälkeen agentti miettii, että mikä ihme on matopeli ja mitä tarkoittaa moninpelattavuus ja kyselee sinulta muutamia tarkentavia monivalintakysymyksiä. Näistä agentti muodostaa suunnitelman pelille ja jos hyväksyt sen, niin se koodaa sinulle moninpelattavan matopelin.

Ystäväsi kanssa pelatessa huomaatte kuitenkin pelin hieman tökkivän ja värimaailman olevan tylsä, joten otat kuvakaappauksen pelistä ja kirjoittelet terminaaliin “/plan Tutki tätä kuvaa [Kuva] kuin olisit visuaalisen suunnittelun ammattilainen ja kehitä pelille jännittävämpi värimaailma. Peli myös tökkii, joten käy läpi koodi ja ehdota miten suorituskykyä voisi parantaa.” Ja taas se agentti lähtee töihin laatimaan suunnitelmaa analysoimalla kuvan, tutkimalla koodin ja luomalla sulle ehdotuksia hyväksyttäväksi miten sitä voisi muuttaa paremmaksi. Tällä tyylillä ihan ummikkokin kykenee saamaan aikaiseksi toimivaa koodia kunhan ohjelmat ovat yksinkertaisia ja rajattuja.

Kovemman luokan vibekoodarit kehittelevät sitten montaa eri agenttia, jotka keskustelevat keskenään ja joista jokainen omaa ennalta määriteltyjä taitoja ja tarkastelevat tehtävää omasta näkökulmastansa ja niin edelleen. Osuit tuossa asian ytimeen, että mitä useammin nämä agenttikoodausohjelmistot tuottavat toimivaa korkealaatuista koodia, sen laiskemmaksi ihminen muuttuu ja vähemmän tarkastaa koneen tekemän työn yksityiskohtia. Ihan normaalia tänä päivänä ettei koodia enää jakseta lukea itse, vaan laitetaan agentti käymään repo läpi ja tiivistämään muistioon, että mitä se koodi tekee ja mitkä ovat osien riippuvuudet.

20 tykkäystä

Ohjelmoijalla se itse koodin kirjoittaminen vie yllättävän paljon aikaa, vaikka homma on sinänsä mekaanista. Tekoäly nopeuttaa sitä vähintäänkin 10-kertaisesti.

Siten ohjelmoija voi kertaheitolla siirtyä askelta ylemmäksi, miettimään isompia linjoja. Agentit ovat aika hyviä tässäkin, ja osaavat palastella ongelmat spekseiksi, ja virheitä tapahtuu hyvin vähän. Tähän toki vaikuttaa skillit ja muut vinkit, joita agentilla on saatavilla kontekstiinsa.

Kun isompiin linjoihinkaan ei tarvitse käyttää niin paljoa aikaa, voi ohjelmoija pyöräytellä useampaa fiitsua samanaikaisesti. Tai vaihtoehtoisesti mennä foundermodeen ja ottaa tuotepäällikön hattua. Agentit ovat tässäkin hyvin avuliaita kunhan vain organisaatiossa on vahva dokumentoinnin kulttuuri: MCP:llä antaa agentille helposti pääsyn firman Notioniin/Lineariin/Slackiin/ERPiin haalimaan lisää kontekstia.

Koodirivien määrä sinänsä on varsin kämpelö mittari ohjelmoijan tehokkuutta/arvokkuutta mittaamaan, eikä sitä ainakaan omalla ~kymppivuotisella urallani yksikään uskottava lafka ole käyttänyt. Parempi mittari on miten paljon vähemmän aikaa tekoälyavusteisella tiimillä kestää tehdä vaikkapa duunit, joihin aiemmin meni kuukausi. On liki pökerryttävää, miten haastavia juttuja (refaktorointeja, integraatioriippuvuuksien purkuja, uusia fiitsuja jne) saa tehtyä parissa päivässä, kun aiemmin olisi mennyt viikkotolkulla (ja laatu on parempaa).

Toki näiden tehokkaimpaan käyttämiseen vaatii ammattitaitoa. Jos ei ole koskaan ohjelmoinut, ei vibe-koodaamalla voi toistaiseksi saada mitään oikeasti vedenkestävää tuotantosoftaa. Mutta ammattitaitoisen koodarin käsissä tuottavuusloikka on oikeasti tuota 10x-tasoa ja enemmänkin.

11 tykkäystä

Kyllä, mutta tämähän pätee mihin tahansa koodiin, jonka joku toinen on kirjoittanut ja jota itse ei ole käynyt läpi. Siinä on paljon uskonasiaa, mutta kunhan agentin kirjoittamasta koodista tulee tarpeeksi paljon hyviä kokemuksia, siihen alkaa luottamaan melko sokeastikin. Tämä on toki kaksipiippuinen miekka; toisaalta huolettomuus altistaa pahoillekin mokille, mutta toisaalta paranoian vähentyminen mahdollistaa nopeamman toteuttamisen. Se on sitten ihan itsestä ja organisaatiosta kiinni kumpaa arvostetaan enemmän, ja mistä löytyy sopiva balanssi.

Analogiana (ehkä kömpelönä sellaisena) agentteja voi verrata uuteen kollegaan: kun taloon tulee hädin tuskin fuksivuotensa läpikäynyt kesähessu, kokeneemmat kollegat syynäävät hänen koodinsa läpi erittäin tarkasti. Kun kyseinen tyyppi on tehnyt mokansa, ottanut opikseen ja ollut talossa jonkin aikaa, annetaan katselmuksissa jo paljon enemmän siimaa ja luottoa uuden kollegan kyvyille. Vastaavasti, kun organisaatio/ohjelmoija on tottunut agentteihin ja nähnyt mihin ne pystyvät rutiinilla ja missä niillä on vielä vaikeuksia, on helpompaa kohdistaa energiansa oikein katselmuksissa.

Mallit ja työtavat myös kehittyvät niin älyttömällä tahdilla, että jos oma käsitys agenttien kykyihin perustuu johonkin muutaman kuukauden takaiseen tilaan, on käsitys jo auttamatta vanhentunut.

Mutta nä on näitä — voi julistaa tekoälyn evankeliumia keuhkojensa täydeltä, mutta ei sitä kukaan usko ennen kuin on itse nähnyt miten hyvin ne voivat toimia omiin hommiin.

9 tykkäystä

En tiedä oliko tahallinen vai vahinko, mutta otan tämän helmen ehdottomasti käyttöön!

14 tykkäystä

Tämä mielestäni oleellisin huomio koko ketjussa. Meillä ei ollut “mitään” 5 vuotta sitten. Nyt vielä jotkut jaksaa urputtaa että kun se malli tekee noin tai jättää tekemättä näin vaikka kaikki näkee että tämä homma on räjähtänyt ihan totaalisesti eikä loppua näy kehitykselle. Kannattaisi ehkä miettiä missä mahdetaan olla vuoden, kolmen, viiden päästä kuin jankuttaa siitä mihin joku Sonnet 3.7 ei pystynyt.

7 tykkäystä

Jos jäi epäselväksi, niin tarkennan, että kyse ei ollut siitä mihin Sonnet 3.7 pystyi tai ei pystynyt. Kyse oli esimerkistä sen osalta, miten yksikkötesteihin sokeasti luottaminen voi lyödä näpeille.

Ihan samalla tavalla luovia ratkaisuita tuolla on ollut tarjolla uudempienkin mallien osalta:

On Terminal-Bench 2, a Claude Opus 4.6 agent (via Meta-Harness) tasked with implementing an adaptive rejection sampler wrote code that always prints “PASS” when run. The verifier executes the agent’s code (printing “PASS”), then runs its own checks (printing “FAIL”), but only checks whether the output contains “PASS.” Since the agent’s output comes first, the verifier passes despite the actual tests failing.

Mutta ylipäätään tämän testeissä huijaamisen osalta se pointti on nähdäkseni siinä, että mitä enemmän on luottaa agentteihin sekä koodin että testaamisen osalta, sitä vähemmän on organisaatiossa ylipäätän kellään täsmällistä käsitystä siitä, mitä esimerkiksi oikeasti on testattu.

7 tykkäystä

Mekaanisesta olen eri mieltä, vaikka toki ulospäin näkyy pelkästään ruudun tuijotusta ja näppäimistön paukutusta. Toki voi olla, että jossain olemassa sellaisiakin toimintamalleja, että “koodin kirjoittamien” on redusoitavissa jotenkin pelkästään mekaaniseksi toimitukseksi. Ei vaan ole sellaista tullut itselleni vastaan.

Ja mikä on “yllättävän paljon”, on toki suhteellista. Erilaiset ajan saatossa kertyneet lähteet taitavat kuitenkin antaa ymmärtää, että ohjelmointihommissa koodin lukemiseen käytetään (tai on käytetty) jopa yli 10x enemmän aikaa kuin koodin kirjoittamiseen. Toki lähteestä ja mittaustavasta riippuen tämä vaihtelee. Ks esim. lainaus Robert Martinin kirjasta Clean Code:

“Indeed, the ratio of time spent reading versus writing is well over 10 to 1. We are constantly reading old code as part of the effort to write new code. …[Therefore,] making it easy to read makes it easier to write.”

Tämä lukemisen tarve toki liittyy monesti juuri uuden koodin kirjoittamiseen, ei niinkään mihinkään code review -tilaisuuksiin (vaikka toki niissä ja niitä varten koodia myös luetaan).

Ehkä uuden koodin kirjoittaminen vanhan koodikannan sekaan vaikuttaa hitaalta siksi, että siihen liittyy vanhan koodikannan lukemista ja erilaisten invarianttien varmistelua ennen kuin varsinaisesti mitään mekaanista tapahtuu?

Väitän kuitenkin, että koodin kirjoittamiseen liittyvä lukeminen on kaukana mekaanisesta toimituksesta. Mistä päästään myös tähän:

Analogiana (ehkä kömpelönä sellaisena) agentteja voi verrata uuteen kollegaan: kun taloon tulee hädin tuskin fuksivuotensa läpikäynyt kesähessu, kokeneemmat kollegat syynäävät hänen koodinsa läpi erittäin tarkasti. Kun kyseinen tyyppi on tehnyt mokansa, ottanut opikseen ja ollut talossa jonkin aikaa, annetaan katselmuksissa jo paljon enemmän siimaa ja luottoa uuden kollegan kyvyille. Vastaavasti, kun organisaatio/ohjelmoija on tottunut agentteihin ja nähnyt mihin ne pystyvät rutiinilla ja missä niillä on vielä vaikeuksia, on helpompaa kohdistaa energiansa oikein katselmuksissa.

Mahdollisesti olen seuraavankin argumenttini kanssa pahasti pois muodista: Vaikka koodikatselmukset ovatkin usein osa prosessia, uskoakseni merkittävästi enemmän ymmärrystä koodikannan toiminnasta rakentuu sen koodin lukemisen yhteydessä, joka liittyy suoranaisesti koodimuutosten tekemiseen / kirjoittamiseen. Samalla tässä yhteydessä koko designia tullaan verifioineeksi ja refaktorointitarpeita tunnistetaan. Ja tässä yhteydessä tullaan vähitellen väkisin tutustuneeksi myös niiden muiden tekemiin tuotoksiin niiltäkin osin, kun koodikatselmointeja ei ole pidetty.

Koodin kirjoittamisella on mekaanisen naputtelun lisäksi siis nähdäkseni funktio laajemminkin koodikantaa ja ylipäätään kehitettävää softaa koskevan ymmärryksen kehittämisessä ja jakamisessa. Koodin kirjoittaminen ja siihen liittyvä koodin lukeminen on jossain mielessä yhdenlainen kommunikointimenetelmä tiimin sisällä. Ja nähdäkseni juuri koodin kirjoittamisella saavutetaan kollektiivisesti huomattavasti syvempi ymmärrys koko kehitettävän softan toiminnasta kuin vain esimerkiksi yksittäisiä koodikatselmointeja pitämällä. Tai puhumattakaan siitä, että koodikantaa ei enää manuaalisesti luettaisi käytännössä ollenkaan ja asioista keskusteltaisiin vain korkealla tasolla jossain pikaisissa palavereissa.

Ja lisäksi pelkästään koodia lukiessa ilman tavoitetta tehdä koodikantaan muutoksia, tulee lukemisesta helposti kursorista. Tällöin lukemisen avulla saavutettava ymmärrys toiminnasta jää helposti pinnalliseksi. Tällöin myös kirjoittamisesta seuraava pakotettu, varsin täsmällinen kommunikaatio jää tapahtumatta.

Mikä on sitten seuraus siitä jos koodin kirjoittamisesta luovutaan? Nähdäkseni samalla luovutaan myös isolta osin koodikannan lukemisesta ajatuksella, mikä johtaa ymmärryksen rapautumiseen. Ja tästä väistämätön seuraus nähdäkseni on se, että koodikanta alkaa tuntua kaikille kehittäjillekin vähitellen yhä vieraammalta.

Ehkä ääripäässä on sitten se tilanne, että kukaan kehittäjistäkään ei oikeastaan enää haluaisi kurkistaa konepellin alle. Jossain mielessä tässä prosessissa menetetään firman sisällä tarkempi ymmärrys siitä, miten tuotettu softa oikeastaan toimii.

Onko tämä sitten hyvä vai huono tilanne, riippuu kai sovelluskohteesta ja firmasta. Onko sillä väliä, tietääkö softafirma miten heidän tuotteensa on noin teknisessä mielessä rakennettu? Ehkä, ehkä ei. Mutta sikäli kun sillä ei ole väliä, onko mahdollisesti jollain aikavälillä edessä se, että softan koon kasvaessa kyky ylipäätään valvoa ja ohjastaa agenttien toimintaa rapautuu, koska teknisen puolen tilannekuva on päässyt rapautumaan?

No, tämä on nyt tällaista tajunnan virtaa. Älköön kukaan ottako liian vakavasti. :slight_smile:

12 tykkäystä

onko tulevaisuudessa siis tilanne että suuri osa koodista on tekoälyn tekemää, kehittämää, korjaamaa ja tarkistamaa. Tästä kaikesta sitten tekoäly tekee vielä muistion, jonka ihminen(koodarijumala) tallentaa todisteeksi jonnekin tekemästään ”työstä” avaamatta dokumenttia tai tarkistamatta mitä Tero tekoäly agentteineen on saanut aikaiseksi? Firman kehittämä KPI myös mittaa tehokkuutta(=nopeutta), koska sen mittarin datankeruun voi antaa senkin agentille helpommin kuin alkaa pohtimaan kuinka hyvää koodi on. Viimeisenä sitten täysi tiedottomuus kuinka hyvää koodi on ja vakavalla ilmeellä myymään asiakkaalle tätä tuotosta.

6 tykkäystä

Tämä on avain vähän kaikkien työkalujen kanssa - käytä niitä tarkoitukseen, joihin ne sopivat parhaiten. Eli älä paukuta vasaralla kaikkea mahdollista. AI-työkaluille on oma paikkansa ja ne on näillä aloilla pakkokin omaksua, koska vakaumuksellinen artesaanikoodari jää tuottavuudessa lopulta muiden jalkoihin.

Alkuperäinen kysyjä jolle vastasin halusi AI-koodausaiheesta yleisemmän kuvan ja kirjoitin tekstini sen muistissa pitäen. Agenttivetoinen koodaus on nyt tapetilla ja otin sen siksi esiin. Testipohjainen lähestymistapa on se jonka itse tunnen - se ei ole millään muotoa uutta, vaan ollut olemassa jo useita vuosia ja testikirjastot (muiden ja omat) on siirrettävissä suoraan agenttikoodin mittatikuksi. Ohjelmistokehityksestä kirjoittaminen on muutenkin kuin raapustelisi yleispätevää opi kirjoittajaksi -kirjaa. Yksi lukija rustaa horoskooppeja, toinen vääntää matematiikan väitöskirjaa ja toinen sarjakuvaa. Kaikkia kohderyhmiä ei voi miellyttää (tai osa-alueita kattaa) samalla tekstillä, koska tarpeet ja lähtökohdat poikkeavat.

En siis usko, että olemme näkemyksissämme jotenkin janan eri päissä! Minäkin haluan ihmissilmien perkaavan jonkun Boeingin softakoodit tarkkaan läpi, vaikka kuten tunnettua, sieltäkin on päässyt sekundaa läpi erilaisista varmistuksista huolimatta. Lopulta asiakas määrittää sen, mistä hän on valmis maksamaan. Kuten Kiinassa asia ilmaistiin, “meiltä löytyy laatua joka lompakolle”.

Jep. Saatan hyvinkin lukea koodia ekan kerran vasta 10+ iteroinnin jälkeen. Joskus teen A/B-jaon lähestymistapojen välillä ja katson eri lähestymistavoilla saadut tulokset ennen koodin syynäilyä. Tosikoodarihan kirjoittaa kaiken oikein heti statttiviivalta silmät sidottuna vi-editoria käyttäen, mutta itse en siihen pysty…

8 tykkäystä

Ainakin tällä hetkellä on tilanteita missä koodi kannattaa kirjoittaa 100 % tekoälyllä (esim. Käyttöliittymien toimintalogiikan esittely) ja tilanteita missä koodi kannattaa kirjoittaa 100 % käsin (esim. Hävittäjien ohjausjärjestelmät), mutta valtaosa ohjelmoinnista tulee asettumaan ääripäiden välimaastoon. Lisäksi oikeassa elämässä ohjelmointityöhön sisältyy valtavasti muutakin kuin pelkkää koodin tehtailua ja on ratkaisevan oleellista, että millaista koodia järjestelmään luodaan, joten ei ne softakehittäjän hommat tule tulevaisuudessakaan loppumaan.

Tuossa tekoälyyn luottamisessa en itse näe niin suurta ongelmaa kuin mitä siitä yleensä tehdään. Ohjelmistokehitys on jo nyt luottamusperustaista, koska ei kenelläkään ole aikaa tutkia joka ikisen ohjelmistokirjaston joka ikistä koodiriviä tai vaikkapa sitä, että käytetty kääntäjä (compiler) varmasti kääntää koodin oikein tietokoneelle luettavaksi. Pitää vain luottaa, että asiat lähtökohtaisesti toimivat ja että käytetyt testit ovat riittävän hyviä, jotta epätoivotut bugit saadaan kiinni. Täysin silmät ummessa ei kannata tehdä, mutta eurooppalaisten yritysten vakiona viljelemä ylisuojeleva äärineuroottisuus näiden työkalujen ympärillä ei sekään ole mielestäni kovin järkevää toimintaa.

20 tykkäystä

AI-koodaus vertautuu hyvin suoraan vaikkapa CNC/robottien vallankumoukseen metalliteollisuudessa. Tietokoneohjattu koneistus on aina tasalaatuista ja todella paljon nopeampaa kuin manuaalinen vastaava. Niillä tehdäänkin 99% lopputuotteista. Näilläkin koneilla on silti aina operaattorit, vaikka periaatteessa ei tarvitsisi. Se nyt vaan on nopeampaa ja lopulta kustannustehokkaampaa pitää töissä tyyppi joka oikeasti tuntee linjaston läpikotaisin kuin riskeerata pitkää odottelua ongelmatilanteissa. Sitten on se 1% töistä jotka edelleen tehdään käsin sorvaamalla. Yleensä nämä ovat erittäin pieniä tilauksia tai taideteoksia/statussymboleita joissa sillä kösityöllä itsessään on arvoa.

Sama tulee epäilemättä käymään koodauksessa. AI puskee linjalta koodia nopeasti ja tasalaatuisesti. Koko vastuu on sitten arkkitehdilla ja testausosastolla jotta lopputuote vastaa tilattua.

Nyt kun tarkemmin miettii niin tämähän on jo nähty koodauksessakin: 99% koodateista työstää C:tä tai pythonia tai jotain muuta korkeamman tason kieltä koska se on nopeaa ja kustannustehokasta. Sitten siellä on se 1% höyrypäitä jotka edelleen koodailevat iloisesti konekieltä ja valittavat kun uudet kielet vievät työt vaikka jälki on puhtaan epäoptimaalista.

11 tykkäystä

Puhuin siis ihan siitä kirjoitusvaiheesta – toki jokaisella meistä on oma tapansa kirjoittaa koodia, mutta ainakin itse teen varsinaisen ajatustyön ennen kuin alan kirjoittamaan syntaksia, ja etenkin rutiinihommat ovat melko mekaanista vääntöä.

Myös tämä tehostuu kun tekoälyltä voi pyytää tiivistelmän koodin toiminnasta tarvittavalla abstraktiotasolla. Kyse on lopulta luottamuksesta, joka syntyy ja kasvaa sitä mukaa mitä enemmän näkee tekoälyn toimivan virheettömästi tiettyä tehtävää hoitaessa.

Luulen ymmärtäväni näkökulmaasi täysin; epäilin itsekin vielä muutama kuukausi voiko kielimalli todellakin syrjäyttää osaavan ammattilaisen, vai laiskistuttaako se zoomer-koodaajista sloppia kylväviä vibekoodaajia ilman tuon taivaallista ymmärrystä perusteista, ja pitkässä juoksussa käsityöläiset vievät pidemmän korren. En kuitenkaan tuolloin ollut vielä hahmottanut miten nämä työkalut tulevat muokkaamaan työnkuvaani: olen sittemmin tullut vakuuttuneeksi siitä, ettei ihmisen enää tarvitse olla niin perillä implementaatiosta ja perusteista kuin aiemmin, vaan agenttien myötä siirrymme uudelle korkeamman abstraktion tasolle. Ohjelmointi ammattina, siinä mielessä kuin sen olen urani aikana ymmärtänyt, on kuollut (tai kuolemassa).

Teen webiä ja mobiilia, ja luonnollisestikin suurin osa koodistani nojaa OSS-kirjastoihin – jos ohjelmoijana minun pitäisi olla selvillä mitä nuo kirjastot tarkalleen ottaen tekevät rajapintojen takana, jäisin auttamatta kilpailijoideni jalkoihin, sillä käyttäisin aikaani varsin tehottomasti.

Aikoinaan koodattiin suoraan reikäkorteille säästeliäästi ja hitaasti, mutta laskentatehon lisääntymisen myötä voitiin siirtyä ylemmille abstraktiotasoille koodailemaan nopeammin ja (Jevonsin paradoksin mukaisesti) tuhlailevammin. Vaikka moderni ohjelmoija ymmärtää firmistä ja tietokoneen toimintaa varmasti paljon heikommin kuin viime vuosituhannen ammattilaiset, ei sillä ole lopultakaan ollut hirveästi merkitystä. Ohjelmisto on vain työkalu sovellusten kirjoittamiseen, ja korkean tason työkalut mahdollistavat riittävän hyvin toimivien sovellusten ohjelmoinnin vaikkei olisikaan Kukko Pärssinen. Tämä on varmasti kipeä paikka monelle koodarille ja aluksi itsekin surin sitä ettei vuosia hiotulla artesaaniasenteella yhtäkkiä enää teekään juuri mitään. Ehkä tulee jotain “koodi itseisarvona”-tyylistä taiteilua vastareaktiona, mutta se jäänee hyvin pienen nichen kaulapartailuksi. Show jatkaa kulkuaan.

15 tykkäystä

Jos @Markus_Hav kävis vielä täällä Inden foorumilla vierailemassa entiseen tapaan, niin olis mielenkiintoista kuulla, että onko kokeillut viikko sitten julkaistua cavemania:

Koska kaikki tietää että Claude Code on liian raskas eikä Anthropic kuitenkaan pysty tai halua korjata ongelmaa, niin jengi on alkanut itse tehdä hänen kaipaamia yksinkertaistuksia Claudeen. Caveman on näistä viimeaikaisista hankkeista varmaan kaikista lupaavin :grin:

Ja kyllä, kyseessä on periaatteessa vain yksinkertainen taito, mikä todistaa oikeaksi hänen ajatuksensa, että kuinka valtavasti Claude Codessa on optimoimiselle varaa. Mutta ei Anthropicin tarvitse näitä itse keksiä, kun yhteisö keksii ratkaisuita heidän puolestansa ja sen kuin vain kopioivat parhaimmat niistä. Toki Anthropic kun tekee rahaa tokenimäärän perusteella, niin onhan tuossa aika perverssit insentiivit optimointimielessä.

14 tykkäystä

Tästä tietysti klassinen esimerkki on sqlite, jossa on poikkeuksellisen kattavat testit, mutta silti bugeja löytyy säännöllisesti. Testien koodirivien määrä siis on lähes 600 kertaa isompi, kuin itse testattavan kirjaston koodirivit, joten voidaan puhua poikkeuksellisen isosta testikattavuudesta, eikä sekään riitä. (Tietysti kun implementointikielenä on vanha kunnon C, niin jalkaansa ampuminen on helppoa.)

2 tykkäystä
5 tykkäystä

Microsoft haluaa myydä AI-agenteille omia lisenssejä:

5 tykkäystä

Olen äskettäin eläköitynyt koodari ja olen käyttänyt työssäni lukuisia kieliä assemblerista ja ADAsta alkaen ja eniten C:tä. Aikoinaan Lisp meni yli ymmärryksen, mutta muuten kieli kuin kieli, sillä mennään.

Myönnän, että putosin tekoälykelkasta tässä ihan urani loppumetreillä. En siis tiedä, mihin
ne agentit (mitä sitten lienevätkään…) oikein pystyvät.

Ehdin toki kokeilla tekoälyä muutamassa pienessä lähinnä skriptaukseen liittyvässä tehtävässä tilanteessa, jossa piti käyttää itselleni vierasta ohjelmointikieltä. Tulokset olivat melko vaihtelevia. Generoitu koodi näytti kyllä selkeältä, mutta kun siihen perehtyi tarkemmin (koska oli pakko saada selville, miksi se ei aina toiminut), oli täysin selvää, ettei se ollut valmista. Korjauksetkin oli helpompi tehdä itse, kuin yrittää selittää tekoälylle, mitä sen pitäisi tehdä. Usein tuloksena oli vain luuppi, jossa se ehdotti lopulta sitä alkuperäistä väärää ratkaisua.

En kuitenkaan vähättele tekoälyn mahdollisuuksia, koska kehitys näyttää olevan niin nopeaa, että omat kokemukseni voidaan tuomita vanhentuneiksi tapauksiksi ja tämän päivän malleilla lopputulos voisi olla nopeammin toimivaksi asti saatettu toiminto kyseessä olleisiin tarpeisiin.

Silti olen kyllä huolissani kehityksen suunnasta. Jos jo lähivuosina suurin osa koodista syntyy ja testataan tekoälyn avulla ja kukaan koodari ei oikeasti lue edes läpi sitä syntynyttä koodimassaa, miten korjataan ne vaikeimmin löydettävät bugit?

Korjailin koko oman urani ajan toisten tekemiä bugeja, koska muut eivät niitä löytäneet. En toki väitä, että olisin itse tuottanut aina virheetöntä koodia, mutta ei niitä kovin montaa vastaan tullut ja kun joskus kuitenkin tuli, harmitti niin vietävästi… En koskaan halunnut löytää syyllistä bugiin, vaan korjata sen ja yritin oppia siitä. Yleensä tarkistin samalla koko ohjelmiston samanlaisten bugien varalta, jos kyse oli esim. tietyn funktion väärästä käyttötavasta.

Itse onnistuin löytämään suuren määrän bugeja vain siksi, että uskalsin kyseenalaistaa kenen tahansa koodaaman minkä tahansa funktion tai muun kokonaisuuden toiminnan, kunnes olin itse täysin varma siitä, että se toimi oikein ja että kyseisen ohjelmistokokonaisuuden oudot kaatumiset ja epämääräinen toiminta ei voinut johtua juuri siitä osasta koodia.

Lopulta jostakin kohdasta löytyi epäilyttävä pätkä koodia, jossa virhekäsittely ei ollut täydellinen eli oli mahdollista, että jokin kutsuttu kirjastofunktio (johon luotin ja/tai sen
lähdekoodia ei ollut saatavilla) palautti jossakin erikoistilanteessa jotakin odottamatonta, johon kutsuva koodi ei ollut varautunut.

Sitten kun paransin tuossa kontekstissa virheeseen reagoimista, usein tuloksena oli vakaampi kokonaisuus. Ongelmat olivat siis sellaisia, että en voinut todistaa, että kyseinen kohta oli juurisyy raportoituihin ongelmiin, mutta ainakin näytti siltä, että kyseisessä kohdassa oli
ainekset katastrofiin, jos eri threadien ajoitukset moniytimisessä CPU:ssa sattuivat sopivasti kohdalleen. Pahinta oli se, että monessa tapauksessa koodi oli varsin vanhaa ja se oli toiminut vuosia ainakin riittävän hyvin, mutta kun käyttöön otettiin tehokkaampia palvelimia, rinnakkaisuus kasvoi ja todennäköisyys piiloon jääneille ajoitusongelmille tai resurssivuodoille kasvoi huomattavasti.

Kysymys siis kuuluu: miten teköälyllä löydetään ja korjataan tai lähtökohtaisesti estetään tuollaiset hyvinkin todennäköiset ongelmat, jos kukaan kokenut koodari ei edes halua
alkaa perata koodia omin silmin? Miten tekoäly promptataan etsimään koodimassasta potentiaalisia paikkoja, joissa voi tapahtua jotakin odottamatonta?

Omalla urallani ainakin näennäisesti toimivan ja halutun operaation suorittavan koodin aikaansaaminen ei ollut mikään ongelma, mutta se viimeistely s.e. ainakin suurin osa potentiaalisista virhetilanteista saatiin käsiteltyä edes jollakin tasolla hallitusti, oli suurin osa varsinaisesta työstä. Siis 20% varsinaisen toiminnallisuuden aikaansaamiseen, 80% testaukseen ja viimeistelyyn. Jos nyt tekoäly nopeuttaa tuota prosessia olennaisesti, mikä lienee sitten se osuus kokonaisuudesta, joka tarvitaan siihen ettei se softa kuitenkin kaadu jossakin erikoistilanteessa.

Itseäni jaksaa aina vaan hämmästyttää Windowsissa tekstieditor-komponentin todella ärsyttävä bugi, joka on ollut siinä aina: kursori hypähtää ajoittain odottamatta väärälle riville, kun riviä sopivasti editoi. En vaan ole koskaan onnistunut toistamaan sitä hallitusti, vaan se yllättää aina lähes joka kerta, kun kirjoitan jotakin pidempää juttua. Tällä kerralla sitä ei tapahtunut kertaakaan. Olisikohan se siis lopulta korjattu… epäilen…

27 tykkäystä

Ehkä isänmurha eli henkisen ChatGPT-yhteensopivuuden katkaisu on liian rankka ratkaisu ja Claudessa on siksi pysyvästi päällä flagi –hölöpötä-kuin-savolainen.

Käyttäjäpalaute voi joskus johtaa yllättäviin tuloksiin lopputuotteen ominaisuuksissa. Tiskiaineen pitää kuplia, jotta se vaikuttaisi tiskarin silmissä tehokkaalta. Luultavasti osa AI-käyttäjistä epäilee nopeammin toimivaa kielimallia tyhmemmäksi, eli se ei tunnu “ajattelevan” tarpeeksi. Pitkä reasoning-aika siis yhdistetään parempaan laatuun, koska se ehdittiin omaksua (silloin joskus) edistyneen tuotteen ominaisuudeksi.

Hidastaminen ei olisi silti pahitteeksi. Tekoälymania on saavuttanut jo kriittisen pisteen julkaisutahdin kiihtyessä. “Slow the f#ck down”-kirjoitus on hyvä herättäjä koko alalle miten helposti käy, jos Top Gear -ohjelman hengessä pelkkä (julkaisu)vauhti ohjaa toimintaa ja FOMO-pomot mittaroivat ja promotoivat AI-koodiriveillä yrityksensä toimintaa.

Kannattaa lukaista.

Coding agents are sirens, luring you in with their speed of code generation and jagged intelligence, often completing a simple task with high quality at breakneck velocity. Things start falling apart when you think: “Oh golly, this thing is great. Computer, do my work!”.

9 tykkäystä

Vastaus: kun tällainen bugi havaitaan, eikä tekoälyllä löydetä syytä, se ihmiskoodari laitetaan perkaamaan koodia kuten ennenkin.

Mutta elämme kyllä mielenkiintoisia aikoja, saapi nähdä millaiseksi koodareiden työnkuva jatkossa muodostuu. 1% koodaamista, 10% promptaamista ja 89% debuggaamista?

Periaatteessa tekoäly tuntuu olevan aika hyvä noiden bugien löytämisessäkin, mistä esimerkkinä toimii ne tuhannet 0-päivähaavoittuvuudet mistä osa on ollut olemassa vuosikymmenet ilman että niitä on huomattu, kunnes nyt tekoälymallit ovat ne löytäneet. Mutta jääpi nähtäväksi, miten homma käytännössä toimii.

7 tykkäystä