Miksi copy-paste on hyvä asia

Samuli Siivonen
Aug 17, 2018 · 4 min read

Osallistuin alkukesästä Talentedin kesäjuhliin. Paljon koodareita hienoissa puitteissa syömässä hyvin ja juomassa paljon. Tällaisessa seurassa keskustelu kääntyy helposti teknologiaan. Juttelin porealtaan reunalla tuoreen koodari-tuttavan kanssa ja nyökyttelimme hyväksyvästi molemmat ajatukselle, että koodauksessa oleellisinta on koodin tuottama arvo (business value). Kun sitten mainitsin, että copy-pastekin on joskus hyvä asia, alkoi yhteinen näkemys selvästi rakoilla. Pian tilanne eskaloitui jo täydeksi tappeluksi. Tai no sen verran tappeluksi mihin kaltaiseni ruipelo ja rauhaa rakastava nörtti nyt pystyy. Eli kuvaavampi termi olisi sanaharkka.

Tämän tapauksen innoittamana päätin perustella ihan julkisesti miksi copy-paste on mielestäni hyvä asia. Siihen on kaksi yksinkertaista syytä.

1. Copy-paste on tehokasta

Toimivan koodin tuottaminen on työlästä. Se pitää olla pilkulleen oikein ja toimia kuten halutaan. Koodia ei kirjoiteta rivi kerrallaan alusta loppuun vaan prosessi etenee iteratiivisesti. Ensin kirjoitetaan jotain toimivaa ja sitten korjaillaan, lisäillään, parannellaan, yksinkertaistetaan, jne. Sama prosessi ei lopu silloinkaan, kun koodi on “valmis” eli menee oikeasti käyttöön. Usein löydetään asioita, joita halutaan vielä parannella ja korjailla. Mitä pidempään koodia on iteroitu, sitä enemmän siinä on näkymätöntä työtä tehtynä. Jos tällaisen koodin ottaa pohjaksi uuden tekemiselle, säästää usein monia harhapolkuja.

Toinen copy-pasten tehokkuuden aspekti on ihan vain mekaaninen. Jos työnäsi on tehdä tekninen raportti, on se paljon helpompaa ja nopeampaa tehdä ottamalla pohjaksi se edellinen raportti. Tai sitten se yksi tosi hyvä, joka sai hyvää palautetta. Ei myyjät lähetettyjä tarjouksiaan tyhjästä kirjoita. Tai lakimiehet sopimuksiaan. Tai opettajat kokeita ja kurssimateriaaleja. Sehän on vain fiksua ottaa pohjaksi joku hyvä esimerkki tai kopioida sopivia valmiita paloja jos niitä löytyy. Ei tarvitse ihan kaikkea tyhjästä tehdä ja saa helpommin aikaan jotain valmiin näköistä.

Tietyssä mielessä koodin kirjoittaminen ei paljon eroa vaikkapa dokumentin kirjoittamisesta. Tavoitteena on saada aikaan sellainen kokonaisuus, joilla tietokone toimii halutulla tavalla. Kyllä se usein nopeampaa on, jos ei jokaista asiaa tarvitse viilata itse kuntoon. Olen nyt 20 vuotta kirjoittanut koodia työkseni ja hyvin pieni osa kaikesta tästä koodista on sellaista, minkä kirjoittamisessa sopiva copy-paste ei olisi auttanut.

Copy-pasten tehokkuuden pitäisi itse asiassa olla sen verran itsestään selvä asia, että voisin jopa kysyä:

Mutta jätän nämä kysymykset kysymättä ja siirryn siihen toiseen syyhyn.

2. Copy-pasten välttäminen on yliarvostettua

Tämä tulee olemaan vaikeampi pointti niellä. Yleinen mielipide on, että copy-paste koodissa on aina paha asia. Puhdas koodi on tiivistä eikä sisällä mitään toisteisuutta. Jos jokin asia on kerran kirjoitettu, niin se kannatta käyttää uudelleen muilla tavoin kuin kopioimalla. On jopa automaattisia työkaluja jotka käyvät läpi koodia ja kertovat mitkä rivit ovat keskenään samanlaisia tai melkein samanlaisia ja antavat arvosanan koodin hyvyydestä tämän perusteella.

Koodin hyvyyden mittaminen koodia katsomalla ei oikein toimi. Paras mittari, jonka itse olen keksinyt, on koodin tuottama hyöty. Tässä mielessä copy-paste ei itsessään ole mitenkään huono asia. Ellei sillä sitten ole negatiivista vaikutusta koodin tuottamaan hyötyyn. Ja väittäisin, että aika usein sen negatiiviset vaikutukset jäävät kaikkineen aika pieniksi.

Liiallinen copy-pasten välttäminen johtaa helposti vaikeammin luettavaan koodiin ja ajan myötä monimutkaistuvaan toteutukseen. Ajatellaan koodia, jonka pitäisi saada aikaan punainen nappi, jossa lukee Älä paina. Seuraavaksi pitäisi tehdä sininen nappi, jossa lukee Älä klikkaa. Fiksua on tietysti tehdä yhteinen koodi molemmille napeille ja antaa vain väri ja teksti parametreina. Valitettavasti tämä hyvin harvoin riittää. Kohta halutaan pyöreä nappi ja vilkkuva nappi ja nappi, joka reagoi käyttäjän painallukseen. Ja sitten pitää kovalla kiireellä saada se pomppiva nappi, joka näyttää erilaiselta eri laitteilla.

Nappi-koodin iterointia kun jatkaa tarpeeksi kauan, niin jossain olisi hyvä lopettaa copy-pasten välttely. Muuten päädytään suureen määrään jokseenkin tyhjiä nappi-luokkia, joita luodaan nappi-luokka-tehtaassa, joita saa helposti nappi-luokka-tehtaiden-tehtaasta. Ja kun pitää lisätä se nappi, joka huokaisee syvään kun sitä painaa, niin kehittäjän pitäisi tietää kuuluuko se klikattaviin nappeihin, reagoiviin nappeihin vai abstrakteihin nappeihin.

No ei ole. Siellä lopputuloksena on esimerkiksi pitkä lista erilaisia nappi-funktioita, joille annetaan vaihteleva lista erilaisia parametreja. Kielestä ja teknologiasta huolimatta lopulta päädytään turhan monimutkaiseen ratkaisuun. Perusongelma ei häviä mihinkään: mitä enemmän poikkeustapauksia ja abstraktiotasoja toteutukseen tulee sen vaikeampaa sitä on seurata ja ylläpitää.

Olen nähnyt loistavien koodarien kirjoittamaa eleganttia koodia, jossa ei ole yhtään toisteista riviä. Silti pienen muutoksen tekeminen on ollut hyvin vaikeaa ja työlästä. Aluksi pitää löytää villakoiran ydin, sitten muodostaa kokonaiskuva villakoirasta ja lopuksi lisäillä sopiviin paikkoihin pölyä. Jos minun koodauskokemuksellani tämä on vaikeaa, niin voi vain kuvitella kuinka helposti se onnistuu innokkaalta junior kehittäjältä (jota kielloista huolimatta kutsutaan Junnuksi). Jos meillä olisi ne 10 copy-pastettua nappia, niin kyllä moni asia vaan olisi helpompaa. Ei nyt todellakaan täydellistä, mutta ainakin Junnu saisi joitain muutoksia tuotantoonkin asti. Hän kyllä osaa seurata koodia ja löytää sieltä sen Älä paina -napin. Ja jopa muuttaa sen Älä vaan paina! -napiksi, kun käyttäjät tuntuvat sitä edelleenkin painavan.

Koodin yksinkertaisuudella on suuri arvo. Yksinkertainen koodi ei useinkaan tarkoita mahdollisimman lyhyttä koodia vaan mahdollisimman yksinkertaista ja ymmärrettävää ratkaisua. Olen aikoinaan ollut hyvinkin idealistinen koodaaja ja vannonut hyvän ja tiiviin koodin nimeen. Noista vuosista on jo kauan aikaa. Nykyään kun joku valittaa copy-pastesta tai muista ulkoisista seikoista koodissa mietin vain itsekseni: epäoleellista. Jos copy-pasten välttäminen oikeasti tuo hyötyjä, kannattaa se tehdä. Oma kokemukseni on, että melko usein copy-pasten välttely kannattaa jättää tekemättä. Sitä tehdään enemmänkin koodin puhtauden ja oikeaoppisuuden takia. Käytännössä se on usein vain turhaa hinkkamista ja pilkun viilamista, kun samaan aikaan voisi tehdä jotain paljon hyödyllisempää.


Siis vanhemman softakonsultin luvalla: copy-pastea ihan rauhassa, jos siltä tuntuu. Niin minäkin teen.

Kiitos lukemisesta!

Samuli Siivonen

Written by

Samuli Siivonen Oyn vanhempi konsultti, neljän nuoremman konsultin isä, Batmanin alainen ja superkoodari