Koskinen, J., Sakkinen, M. & Paakki, J. (2001). Ohjelmistotekniikka (234 s.). Tietojenkäsittelytieteen julkaisuja, Opetusmonisteita OM-10. Jyväskylän yliopisto, Tietojenkäsittelytieteiden laitos (jakelu: CopyShop, MaA).

SISÄLLYSLUETTELO

1

JOHDANTO

7

1.1

Historiallinen kehitys

7

1.2

Yleiset myytit

10

1.2.1

Johdon myyttejä

10

1.2.2

Asiakkaan myyttejä

10

1.2.3

Ohjelmistoammattilaisen myyttejä

10

1.3

Keskeiset ongelmat

11

1.4

Keskeiset tuottavuus- ja riskitekijät

13

1.5

Ohjelmistojen luokittelua

15

1.5.1

Kehittämisen vaativuus

15

1.5.2

Ohjelmistotyypit

16

1.5.2.1

Systeemi (eli varus) ohjelmistot

17

1.5.2.2

Tosiaika- eli reaaliaikaohjelmistot

17

1.5.2.3

Tieteelliset ohjelmistot

17

1.5.2.4

Hallinnolliset ohjelmistot

17

1.5.2.5

Sulautetut ohjelmistot

17

1.5.2.6

Henkilökohtaiset ohjelmistot

18

1.5.2.7

Asiantuntijajärjestelmät

18

1.5.3

Tehtävätyypit

18

1.5.4

Sovellusalue

18

2

OLEELLISET ONGELMAT JA EDISTYSASKELEET

21

2.1

Oleellisia vaikeuksia

21

2.1.1

Monimutkaisuus

21

2.1.2

Yhteensopivuus, mukautuvuus

21

2.1.3

Muuttuvuus

22

2.1.4

Näkymättömyys

22

2.2

Edistysaskeleita

22

2.2.1

Korkean tason kielet

22

2.2.2

Osituskäyttö

22

2.2.3

Yhtenäiset ohjelmointiympäristöt

23

2.3

Toivottuja ”taikaluoteja”

23

2.3.1

Ada ja muu korkean tason kielten kehitys

23

2.3.2

Olio-ohjelmointi

23

2.3.3

Tekoäly ja asiantuntijajärjestelmät

23

2.3.4

”Automaattinen” ohjelmointi

24

2.3.5

Graafinen ohjelmointi

24

2.3.6

Ohjelmien formaali todentaminen

24

2.3.7

Ympäristöt ja työkalut

25

2.3.8

Työasemat

25

2.3.9

Oleellisten tehtävien tukeen keskittyminen

25

2.3.10

Ostaminen ja ulkoistaminen

25

2.3.11

Vaatimusten tarkentaminen ja nopea protoilu

26

2.3.12

Vähittäinen kehittäminen

26

2.3.13

”Suurten suunnittelijoiden” kouluttaminen

26

3

OHJELMISTOTUOTANNON MALLIT

27

3.1

Vesiputousmalli

27

3.2

Prototyyppimalli

29

3.3

Inkrementaalinen malli

30

3.4

Spiraalimalli

30

3.4.1

Spiraalimallin standardilomake

31

3.5

Muita malleja

32

3.5.1

”B-malli”

32

3.5.2

Rekursiivis-rinnakkainen malli

32

3.5.3

Asiantuntijajärjestelmien kehittämisen vaihejakomalli

33

3.5.4

Vaihtoehtoisia luokittelutapoja

33

4

MALLINNUS-, KUVAUS- JA SPESIFIOINTITAVAT

34

4.1

Informaalit ja puoliformaalit menetelmät

35

4.1.1

Rakenteiset menetelmät

35

4.1.2

Oliomenetelmät ja oliolähestymistapa

35

4.1.2.1

Oliolähestymistavan keskeiset periaatteet

36

4.1.2.2

UML (Unified Modeling Language)

38

4.2

Formaalit menetelmät

53

4.2.1

Esi- ja jälkiehdot

53

4.2.2

Logiikka ja mallit

53

4.2.3

Reaktiiviset spesifikaatiot

54

5

ANALYYSI

55

5.1

Ohjelmisto tietojärjestelmän osana

55

5.2

Vaatimusanalyysi

56

5.2.1

Vaatimusanalyysin vaiheet

57

5.2.1.1

Yleinen tapaus

57

5.2.1.2

Oliokeskeinen tapaus

57

5.2.2

Vaatimusdokumentin rakenne

57

5.2.3

Vaatimusanalyysin ongelmat

58

5.2.4

Haastattelutekniikat

59

5.2.4.1

Alustus

59

5.2.4.2

Vaatimusmäärittelyn luonnostelu

59

5.2.4.3

Vaatimusmäärittelyn katselmointi

60

6

SUUNNITTELU

61

6.1

Suunnitteludokumentti

61

6.2

Suunnitteluprosessin luonne

62

6.2.1

“Viisasten kiven” etsintä

63

6.2.2

Suunnitteluprosessin idealisoitu luonne

63

6.2.3

Ideaalisen prosessin kuvauksen hyödyllisyys

63

6.2.4

Kehitysprosessin kuvauksen osat

63

6.2.5

Rationaalisen suunnitteluprosessin luonne

63

6.2.6

Dokumenttien merkitys rationaalisessa suunnitteluprosessissa

64

6.2.7

Ideaalisen prosessin teeskentelemisen merkitys

65

6.3

Järjestelmän yleisrakenteen suunnittelu

65

6.4

Moduulien suunnittelu

66

6.4.1

Tiedon piilottaminen

68

6.4.2

Kiinteys

68

6.4.3

Kytkentä

68

6.5

Tietorakenteiden suunnittelu

69

6.6

Algoritmien suunnittelu

70

6.6.1

Vuokaavio

71

6.6.2

Ohjelmansuunnittelukieli ja pseudokoodi

71

6.6.3

Nassi-Shneiderman-kaavio

72

6.6.4

Päätöstaulu

72

6.7.

Oliosuunnittelu

73

6.7.1

Luokkien suunnittelu

73

6.7.1.1

Mallien yhdistäminen operaatioiden löytämiseksi

73

6.7.1.2

Algoritmien suunnittelu operaatioiden toteuttamiseksi

74

6.7.1.3

Tiedonsaantipolkujen optimointi

74

6.7.1.4

Ohjelmakontrollin toteutus

74

6.7.1.5

Perinnän tehostaminen

74

6.7.1.6

Assosiaatioiden suunnittelu

75

6.7.1.7

Olioiden toteutus arvoina

75

6.7.1.8

Moduulien valinta

76

6.8

Spekulatiivinen suunnittelu

77

6.9

Käyttöliittymien suunnittelu

77

6.9.1

Yleisiä suunnitteluperiaatteita

78

6.9.2

Syntaktis-semanttinen malli

79

6.9.3

Vuorovaikutustyylit

79

6.9.3.1

Valikkopohjainen tyyli

80

6.9.3.2

Lomakepohjainen tyyli

80

6.9.3.3

Komentokieli

81

6.9.3.4

Suorakäsittely

82

6.9.3.5

Luonnollinen kieli

83

6.9.4

Graafisten liittymien standardointi

83

6.9.5

Näyttöjen suunnittelu

85

7

TOTEUTUS

87

7.1

Ohjelmointikielet

87

7.1.1

Ohjelmointikielen valinta

87

7.1.2

Ohjelmointikielten luokittelua

88

7.1.2.1

Imperatiiviset kielet

89

7.1.2.2

Rakenteiset kielet

89

7.1.2.3

Modulaariset kielet

89

7.1.2.4

Oliokielet

89

7.1.2.5

Funktionaaliset ja deklaratiiviset kielet

89

7.1.2.6

Logiikkakielet

90

7.1.2.7

Rinnakkaiset kielet

90

7.1.2.8

Ortogonaalisia kielten ominaisuuksia

91

7.2

Olio-ohjelmointi

91

7.2.1

Oliokielten eroja

92

7.2.1.1

C++

92

7.2.1.2

Java

93

7.2.1.3

Smalltalk

93

7.2.1.4

Muita oliosuuntautuneita kieliä

93

7.2.2

Olio-ohjelmoinnin periaatteita

94

7.2.2.1

Luokkien määrittely

94

7.2.2.2

Olioiden luominen ja tuhoaminen

95

7.2.2.3

Operaattorien kuormitus

96

7.2.2.4

Monimuotoisuus eli polymorfismi

98

7.2.2.5

Perintä

99

7.2.2.6

Assosiaatiot ja koosteet

101

7.2.2.7

Tiedon piilotus

101

7.2.2.8

Geneerisyys ja luokkamallit

101

7.3

Oliomallin (OMT) toteuttaminen

102

7.3.1

Toteutusvaihtoehdot

102

7.3.1.1

Oliosuuntautuneen kielen käyttö

102

7.3.1.2

Yleisen ohjelmointikielen käyttö

103

7.3.1.3

Olio- tai relaatiotietokantajärjestelmän käyttö

103

7.3.2

OMT-suunnittelumallin toteuttaminen C++:lla tai Javalla

103

7.3.2.1

Oliomallin perusasiat

103

7.3.2.2

Assosiaatiot

104

7.3.2.3

Koosteet

106

7.3.2.4

Periytyminen

107

7.3.2.5

Dynaamisuus

107

8

TESTAUS

109

8.1

Testausstrategia

110

8.2

Sisäinen testaus

111

8.2.1

Silmukoiden testaus

114

8.2.2

Oliokeskeisten ohjelmien testauksen erityispiirteitä

114

8.3

Ulkoinen testaus

114

8.4

Virheenjäljitys

116

9

YLLÄPITO JA TUOTTEENHALLINTA

118

9.1

Ylläpidon luonne ja merkitys

118

9.1.1

Ylläpidon ongelmat

119

9.1.1.1

Tutkimukselliset ongelmat

119

9.1.1.2

Asenteelliset ja tekniset ongelmat

120

9.1.2

Ylläpidon periaatteita

121

9.1.3

Ylläpidon geneeriset osatehtävät

122

9.1.3.1

Ohjelmamuutokset

122

9.1.3.2

Vaikutusanalyysi

123

9.1.4

Ylläpitäjän tietotarpeet

123

9.1.5

Ehkäisevä ylläpito

124

9.1.6

Korjaavan ylläpidon erityispiirteet

125

9.1.6.1

Yleiset ongelmien aiheuttajat

125

9.1.6.2

Ongelmien yksityiskohtaiset syyt

125

9.1.6.3

Ongelmien ratkaisumenetelmät

126

9.1.6.4

Ongelmalliset ohjelmointikielen rakenteet

126

9.1.6.5

Vuosi 2000 –ongelma (Y2K)

127

9.1.7

Ohjelmien lukeminen, tulkitseminen ja ymmärtäminen

128

9.1.7.1

Ymmärtämismallit

129

9.1.8

Ylläpidettävyys

131

9.1.8.1

Vaikuttavat tekijät

131

9.1.8.2

Laatutekijät

132

9.1.8.3.

Metriikat

132

9.1.9

Ylläpidon kustannukset

133

9.1.10

Yleisiä neuvoja ylläpidon tueksi

134

9.2

Ylläpidon tuen tekniikat

135

9.2.1

Tietokyselyt

136

9.2.2

Ohjelmien visualisointi

137

9.2.3

Ohjelmien viipalointi

140

9.2.3.1

Taaksepäin viipalointi

142

9.2.3.2

Eteenpäin viipalointi

144

9.2.3.3

Interproseduraalinen viipalointi

145

9.2.4

Systemaattinen korjaava ylläpito

146

9.3

Tuotteenhallinta ja konfiguraationhallinta

149

10

OHJELMISTOTYÖN TUKIVÄLINEET (CASE)

153

10.1

CASE-järjestelmien luokitteluja

154

10.1.1

Analyysin ja suunnittelun työkalupaketit

157

10.1.2

Ohjelmoinnin työkalupaketit

158

10.1.3

Testauksen työkalupaketit

159

10.1.4

Meta-CASE työkalupaketit

161

10.1.5

Laajat integroidut CASE-ympäristöt

161

10.1.5.1

PCTE (Portable Common Tool Environment)

162

10.2

Integraation lajit

163

10.2.1

Alustaintegraatio

163

10.2.2

Tietointegraatio

163

10.2.3

Esitysmuotointegraatio

164

10.2.4

Kontrolli-integraatio

164

10.2.5

Prosessi-integraatio

165

10.3

CASE-järjestelmien elinkaari

165

11

LAADUNVARMISTUS

167

11.1

CMM (Capability Maturity Model)

168

11.2

SPICE (Software Process Improvement and Capability dEtermination)

171

11.3

Tarkastukset

173

12

LUOTETTAVUUS

177

12.1

Ohjelmointikielten rakenteet

177

12.2

Vikasietoisuus

180

12.2.1

Poikkeustenkäsittely

180

12.2.2

Defensiivinen ohjelmointi

182

12.2.3

Virheestä toipuminen

183

13

UUDELLEENKÄYTTÖ

185

13.1

Edellytykset, ongelmat ja keinot

186

13.2

Uudelleenkäytettävän ohjelmiston kehittäminen

187

13.3

Uudelleenkäytettävän ohjelmiston hyödyntäminen

188

13.4

Siirrettävyys ja standardit

190

13.4.1

Standardit

191

13.5

Uudelleenkäytön oliomekanismit

191

13.5.1

Muuntava uudelleenkäyttö

191

13.5.2

Kokoava uudelleenkäyttö

192

13.6

Suunnittelumallit

192

13.6.1

Luontimallit

193

13.7

Sovelluskehykset

194

13.7.1

Sovelluskehysten suunnittelu

196

14

OHJELMISTOMITTARIT

198

14.1

Ohjelmiston koon arviointi (FPA; Function Point Analysis)

199

14.2

Projektin kustannusten ja työmäärän arviointi

202

14.2.1

Ositustekniikat

203

14.2.2

Empiiriset estimointimallit

204

14.2.2.1

COCOMO (Constructive Cost Model)

204

14.2.2.2

Putnamin malli

208

KIRJALLISUUTTA

209

HAKEMISTO

221

 

Updated: 10th Jan. 2001 by Jussi Koskinen.