</motto<Kaikki, mik{ ylip{{ns{ voidaan ajatella, voidaan ajatella selv{sti.
        Kaikki ilmaistavissa oleva voidaan ilmaista selv{sti.

        -- -- Ludwig Wittgenstein: Tractatus
>>

/chapter<Ohjelmoinnin kultaiset s{{nn|t>


</beginitems
</noindent/bf Pari yleisohjetta>

/item<$/bullet$> Yleiss{{nt| on, ett{ se mik{ on ihmiselle helposti luettavaa,
ymm{rrett{v{{ ja helposti yll{pidett{v{{ ohjelmaa, on my|s k{{nt{j{lle helppoa
k{sitell{. 

/item<$/bullet$> Kirjoita j{sennetty{, selke{{ ja luettavaa ohjelmakoodia.
Ohjelmasi seuraava tulkitsija ja lukija on mit{ todenn{k|isemmin sin{
itse muutaman "unohduskuukauden" j{lkeen.

/item<$/bullet$> Sano se mit{ haluat yksinkertaisesti, suoraan ja selke{sti;
v{lt{ kikkoja. 

/item<$/bullet$> Anna ohjelman ja tietokoneen tehd{ "likainen" ty|. K{yt{
valmiita aliohjelmakirjastoja, {l{ keksi py|r{{ uudestaan.


</noindent/bf/ii<Kontrollirakenteet>>

/item<$/bullet$> V{lt{ sotkuista ohjelmalogiikkaa, erityisesti moniaita
goto-lauseita. 

/item<$/bullet$> V{lt{ huonoja ja vanhentuneita Fortranin
rakenteita, kuten aritmeettista </tt if>-lausetta, assigned
</tt/ii<goto>> -lausetta, ekvivalenssim{{rittelyj{, reaalisia
indeksilausekkeita, tarpeettomia tilap{ismuuttujia,
Hollerith-formaatteja /dots.  Useimmat n{ist{ ovat my|s
vektoroinnin tai optimoinnin esteit{.  Niiden sijaan k{yt{
hyvi{ piirteit{: </tt if-then-else-endif> -rakenteita, </tt
do>-looppeja, loogisia muuttujia ehdollisten haarojen
asemesta, merkkijonomuuttujia, /dots.  Computed </tt goto>
-lause vastaa kehittyneempien kielten </tt
case>-konstruktiota. 

/item<$/bullet$> [l{ numeroi (labeloi) mit{{n muita
lauseita, kuin </tt/ii<continue>>-lauseita (ja mahdollisesti
</tt format>-lauseita).  N{in v{lt{t </tt do>-silmukan
viimeisen{ olevaan lauseeseen kuuluvat rajoitukset, ja
simuloit k{tev{sti kehittyneemmiss{ kieliss{ ja er{iss{
Fortran-toteutuksia esiintyvi{ </tt enddo>, </tt endwhile>,
yms.  rakenteita.  Ohjelmasi luettavuus paranee. 


</noindent/bf M{{rittele>

/item<$/bullet$> M{{rittele </sl kaikki> k{ytt{m{si
muuttujat, my|s </tt integer>- ja </tt real>-tyyppiset.  [l{
nojaa Fortranin s{{nt||n, jonka mukaan kirjaimilla </tt i>,
</tt j>, </tt k>, </tt l>, </tt m> ja </tt n> alkavat
muuttujat ovat </tt integer>-tyyppisi{, ja muut </tt
real>-tyyppisi{.  K{yt{ toistaiseksi ep{standardia </tt
implicit none> -m{{rittely{ (tai standardia, l{hes yht{
hyv{{ </tt implicit logical> -m{{rittely{).  [l{
tarpeettomasti k{yt{ typeri{ </tt amass>- ja </tt
icount>-tyyppisi{ nimi{. 

/item<$/bullet$> K{yt{ </tt program>-lausetta.

/item<$/bullet$> M{{rittele my|s funktiot ja aliohjelmat 
</tt external>-lauseella.

/item<$/bullet$> [l{ k{yt{ </tt dimension a(10)>-m{{rittely{, vaan 
suoraa tyyppim{{rittely{ </tt real a(10)>.


</noindent/bf Strukturoi>

/item<$/bullet$> Koeta erist{{ asiat teht{v{si kannalta
loogisiksi mielekk{iksi, ja samalla riitt{v{n pieniksi
kokonaisuuksiksi, ja ohjelmoi sitten t{m{ omaksi
aliohjelmaksi tai aliohjelmajoukoksi.  Toisin sanoen, tee
ohjelmistasi modulaarisia.  Anna teht{v{si (p{{m{{r{si)
m{{r{t{ ohjelman rakenne.  Testaa ohjelmaasi pieniss{
paloissa. 

/item<$/bullet$> Jokaisen aliohjelman tulee tehd{ yksi ja
vain yksi asia, ja tehd{ se sitten hyvin, ja jokaisen
aliohjelman tulee "piilottaa" ohjelman jonkin yksityiskohdan
toteutustekniikka kutsuvilta ohjelmilta.  Tee kunkin
aliohjelman liittym{t muihin ohjelmiin mahdollisimman
selkeiksi.  Toisaalta: {l{ tee turhia rajoituksia
aliohjelmasi yleisyyden suhteen, mik{li mahdollista. 


</noindent/bf Standardoi>

/item<$/bullet$> Kirjoita standardia, luettavaa, muutettavaa
ja siirrett{v{{ ohjelmateksti{.  Pyri erist{m{{n "kone- ja
k{{nt{j{riippuvat" asiat omiin, helposti l|ydett{viin ja
muutettaviin paikkoihin, jos niit{ ylip{{ns{ tarvitset, </sl
ja dokumentoi ne>.  [l{ paikkaa huonoa koodia, vaan kirjoita
se uusiksi. 


</noindent/bf Dokumentointi>

/item<$/bullet$> Dokumentoi ohjelmasi kunnolla, my|s sen k{ytt{m{ data
ja tiedostot.

/item<$/bullet$> Kommentoi ohjelmaasi.  Hyv{ kommentti
harvoin vain toistaa sanoin sen mit{ Fortraniksi on
kirjoitettu, vaan selitt{{ miksi niin tehd{{n.  [l{
kommentoi huonoja ratkaisuja, vaan kirjoita ohjelma
paremmin.  Kommentoi erityisen tarkkaan laite- ja
k{{nt{j{riippuvuudet, poikkeamat standardeista ja poikkeaman
syyt, ja muut erikoiset ja ep{tavalliset ratkaisut.  [l{
kommentoi trivialiteetteja, {l{k{ liikaa.  Huomaa, ett{
kommentti voi alkaa </tt c>-kirjaimen lis{ksi my|s t{hdell{
</tt *>, ja ett{ t{ysin tyhj{ rivi kelpaa my|s kommentiksi. 


</noindent/bf Luettavuus>

/item<$/bullet$> [l{ kirjoita "p|tk|spagettia".  Kirjoita
selke{sti, k{yt{ mielekk{it{ nimi{, sisenn{ ohjelmateksti
oikein.  Kirjoita ohjelmat siten, ett{ ne etenev{t ylh{{lt{
alasp{in oikeassa j{rjestyksess{.  Voit jopa kirjoittaa ne
ensin j{rkev{ll{ pseudo-Fortranilla, ja "k{{nt{{" ne sitten
standardi-Fortraniksi. 

/item<$/bullet$> K{yt{ selkeit{ ja mielekk{it{ muuttujien
nimi{ (31 merkki{ on Crayn Fortranin pituuden yl{raja
lokaaleille nimille, kuten muuttujien nimille, 8
globaaleille, kuten aliohjelmat ja </tt common>-lohkot;
huomaa, ett{ standardit rajoittavat nimen pituuden
korkeintaan kuuteen merkkiin). 

/item<$/bullet$> [l{ k{yt{ sarkain- eli
tabulaattorimerkkej{; sen sijaan voit k{ytt{{ pieni{
kirjaimia, vaikka ne eiv{t olekaan standardeja; l{hes
jokainen k{{nt{j{ sallii nyky{{n pienet kirjaimet, ja pienet
kirjaimet on tarvittaessa helppo muuttaa suuriksi. 
(Skandeja ei voi kuitenkaan k{ytt{{ muuten kuin kommenteissa
tai merkkijonoissa.)


</noindent/bf Debuggaus>

/item<$/bullet$> [l{ pys{hdy yhteen luteeseen. 

/item<$/bullet$> Testaa rajatapaukset.  Varo taulukkojen
indeksien ylityksi{, ja laskureiden "yhdell{ pieless{"
tilanteita.  Tarkkaile muuttujien arvojen erikoistapauksia,
ja muita erikoistilanteita, jotka usein ovat virheiden
syin{.  Varmistu erityisesti siit{, ett{ ohjelmasi toimii
oikein niiss{ erikoistilanteissa, joissa sen ei tule tehd{
mit{{n. 

/item<$/bullet$> Varo alustamattomia (initialisoimattomia)
muuttujia.  Alusta kaikki muuttujat, {l{ luota, ett{ ne ovat
nollia automaattisesti.  Initialisoi globaalit muuttujat
data-lauseilla, paikalliset muuttujat suoritettavilla lauseilla. 
(Poikkeus: Kaikissa koneissa (esimerkiksi VAX//VMS:ss{) ei
kannata nollata taulukkoja, jos niit{ ei tarvitakaan, koska
muisti joskus varataan vasta jos sit{ todella k{ytet{{n. 
Usein kannattaa taulukon nollaukseen k{ytt{{
systeemiohjelmakutsua.)

/item<$/bullet$> Varo py|ristysvirheit{: $10.0 /times 0.1$
on tuskin koskaan 1.0! [l{ vertaa liukulukujen
("reaalilukujen") yht{suuruutta.  K{yt{ numeerisesti
luotettavia algoritmeja (t{m{ on ei-triviaali asia!); k{yt{
asiantuntijoita ja tunnettuja aliohjelmakirjastoja!


</noindent/bf/ii<Optimointi>>

/item<$/bullet$> Aluksi ohjelman kirjoituksen p{{m{{r{n{
tulee olla pelk{st{{n oikein toimivan ohjelman
kirjoittaminen.  Harkitse kuitenkin k{ytt{m{{si algoritmia
heti tarkkaan.  Usein huomattavasti tehokkaampaa ohjelmaa
saa k{ytt{m{ll{ tehokkaampaa algoritmia, ei viilaamalla. 

/item<$/bullet$> [l{ viilaa ohjelmaa liian aikaisin.  Ja kun
viilaat, mittaa ensin, miss{ ohjelmasi kuluttaa aikaansa, ja
viilaa sitten sit{ 10/%:n aluetta, jossa kuluu 90/% ajasta. 
N{in hy|dyt nopeimmin ja eniten.  Ja kun viilat, ohjelmasi
pit{{ tietysti pysy{ oikein toimivana.  [l{k{ koskaan uhraa
selkeytt{ pieniin "tehokkuusetuihin". 

Siis "ensin oikein, sitten tehokkaammin (ja edelleen oikein)!"


</noindent/bf/ii<I//O>>

/item<$/bullet$> Testaa sy|tt|arvojen j{rkevyys. Identifioi j{rjett|m{t 
sy|tt|arvot, ja toivu tilanteesta mik{li mahdollista. Testaa erityisesti
(odottamattomat) tiedostojen loput. 

/item<$/bullet$> Tee sy|tt| mahdollisimman yksinkertaiseksi
ja helpoksi.  Vapaamuotoinen sy|tt| on j{rkev{{ pieni{
kontrolliarvoja varten, vain suuret data-aineistot kannattaa
lukea m{{r{muotoisena.  Tulostus sen sijaan kannattaa
useimmiten tehd{ m{{r{muotoisesti.  Tee sy|tt|aineisto
helpoksi lukea. 


/item<$/bullet$> Sijoita sy|tt|- ja tulostus selkeisiin
aliohjelmiin.  [l{ sirottele tulostuskomentoja joka paikkaan
(est{v{t vektoroinninkin). 

/item<$/bullet$> K{yt{ sy|tt|arvoille oletuksia, jos mahdollista. Kaiuta
sy|tetyt arvot tulostukseen (lokiin). 

/item<$/bullet$> V{lt{ my|s </tt format>-lauseita ja niiden
numerointia.  Vain kerran tai kahdesti k{ytett{v{n </tt
format>-lauseenkin voi sijoittaa merkkijonovakiona suoraan
sit{ k{ytt{v{{n </tt write>- tai </tt read>-lauseeseen,
jolloin kyseinen I//O-lause ja sit{ vastaava formaatti ovat
samassa paikassa helposti l|ydett{viss{. 

/item<$/bullet$> Tarkkaile I//O:ta.  Se voi usein olla
tehottomin osa ohjelmaasi.  K{yt{ j{rkevi{ ja tehokkaita
I//O-menetelmi{.  Suunnittele sy|tt| ja tulostus huolella. 

/enditems

>

T{rkeimp{n{ kaikista:

</leftskip1cm

/bf Harkitse k{ytt{m{si algoritmi tarkkaan!

>

Aiheesta l|ytyy lis{{ mm. seuravasta hauskasta ja hy|dyllisest{ kirjasesta:

Kernighan and Plauger: </sl The Elements of Programming Style>,
Yourdon, Inc. (McGraw-Hill), New York, second edition, 1978.

