You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Olemme tähän mennessä harjoitelleet ohjelmointikielen perusrakenteiden kuten muuttujien, ehtolauseiden, toistolauseiden ja metodien käyttöä. Tutustutaan seuraavaksi lyhyesti ohjelmien ymmärrettävyyteen vaikuttaviin tekijöihin sekä virheiden etsimiseen.
16
+
<!--Olemme tähän mennessä harjoitelleet ohjelmointikielen perusrakenteiden kuten muuttujien, ehtolauseiden, toistolauseiden ja metodien käyttöä. Tutustutaan seuraavaksi lyhyesti ohjelmien ymmärrettävyyteen vaikuttaviin tekijöihin sekä virheiden etsimiseen.-->
15
17
16
-
## Ohjelmoija sokeutuu koodilleen
18
+
We've so far been practicing the fundamentals of the language, such as variables, conditionals, loops, and methods. Let's now move on to look at some of the factors affecting the understandability of programs, and how errors are found.
17
19
18
-
Ohjelmoija sokeutuu omalle koodilleen. Tutustutaan tähän efektiin alla olevan lyhyen videon avulla. Laske alla olevalta videolta kuinka monta kertaa valkopaitaiset pelaajat syöttävät palloa toisilleen. Videossa on mukana englanninkieliset ohjeistukset.
20
+
<!-- ## Ohjelmoija sokeutuu koodilleen -->
21
+
## A programmer becomes blind to their own code
22
+
23
+
<!-- Ohjelmoija sokeutuu omalle koodilleen. Tutustutaan tähän efektiin alla olevan lyhyen videon avulla. Laske alla olevalta videolta kuinka monta kertaa valkopaitaiset pelaajat syöttävät palloa toisilleen. Videossa on mukana englanninkieliset ohjeistukset. -->
24
+
25
+
A programmer develops blind spots in their code. Let's familiarize ourselves to the effect with the aid of the short video below. Count how many times the white-shirted players pass the ball between each other. The video contains instructions in English.
19
26
20
27
<youtubeid="Ahg6qcgoay4"></youtube>
21
28
22
-
Videossa tapahtuu jotain muutakin, mutta tämä saattaa jäädä aluksi huomaamatta. Tätä efektiä kutsutaan tahattomaksi sokeudeksi (inattentional blindness). Tahaton sokeus selittyy sillä, että keskittyessämme tiettyyn tehtävään, aivomme pyrkivät suodattamaan tehtävän kannalta epäoleellista tietoa. Emme kuitenkaan aina tiedä -- esimerkiksi opiskellessamme -- mikä osa tiedosta on oleellista ja mikä osa epäoleellista, mutta keskittyminen tiettyyn osaan opiskelutehtävää voi silti johtaa tilanteeseen, missä osa relevantista osasta suodattuu pois.
29
+
<!--Videossa tapahtuu jotain muutakin, mutta tämä saattaa jäädä aluksi huomaamatta. Tätä efektiä kutsutaan tahattomaksi sokeudeksi (inattentional blindness). Tahaton sokeus selittyy sillä, että keskittyessämme tiettyyn tehtävään, aivomme pyrkivät suodattamaan tehtävän kannalta epäoleellista tietoa. Emme kuitenkaan aina tiedä -- esimerkiksi opiskellessamme -- mikä osa tiedosta on oleellista ja mikä osa epäoleellista, mutta keskittyminen tiettyyn osaan opiskelutehtävää voi silti johtaa tilanteeseen, missä osa relevantista osasta suodattuu pois.-->
23
30
24
-
Onneksi kuitenkin tehtävään harjaantuminen vähentää tahattoman sokeuden ilmentymistä -- toisin sanoen, harjoittelu kehittää oleellisten ja epäoleellisten asioiden erottelukykyä.
31
+
Something else also happens in the video that may pass by unnoticed at first. This effect is known as perceptual blindness, which is explained by the fact that as we focus on a specific task, our brains tend to filter out information that is irrelevant to the task. However, we don't always know what information is indeed essential and what is not - an example of this is when we're studying. Concentrating on a specific exercise part can, nonetheless, lead to some relevant information being filtered out.
25
32
26
-
Ohjelmoinnin harjoittelun kannalta tahaton sokeus näkyy muunmuassa siinä, että tiettyyn ohjelman osaan keskittyminen vie huomiota muista osista, jotka saattavat mielessä tällöin näyttää oikeellisilta vaikka niissä olisi virhe. Esimerkiksi ohjelman tulostuksen oikeellisuutta tarkasteltaessa ohjelmoija saattaa keskittyä tulostuslauseisiin ja vahingossa jättää osan logiikasta huomioimatta.
33
+
<!-- Onneksi kuitenkin tehtävään harjaantuminen vähentää tahattoman sokeuden ilmentymistä -- toisin sanoen, harjoittelu kehittää oleellisten ja epäoleellisten asioiden erottelukykyä. -->
27
34
28
-
Vastaavasti toistolauseen sisältävässä ohjelmassa olevaa virhettä etsiessä ohjelmoija saattaa keskittyä monimutkaisimpaan asiaan ensin, vaikka virhe on täysin muualla. Esimerkkinä alla oleva käyttäjän syötteiden keskiarvon laskemiseen tarkoitettu ohjelma, jossa on virhe -- virheen etsinnässä tyypillisesti keskitytään ensin toistolauseeseen.
35
+
Fortunately, however, applying oneself to a given task lessens the occurrence of perceptual blindness. In other words, practice develops one's ability to distinguish between relevant and irrelevant information.
29
36
30
-
```java
37
+
<!-- Ohjelmoinnin harjoittelun kannalta tahaton sokeus näkyy muunmuassa siinä, että tiettyyn ohjelman osaan keskittyminen vie huomiota muista osista, jotka saattavat mielessä tällöin näyttää oikeellisilta vaikka niissä olisi virhe. Esimerkiksi ohjelman tulostuksen oikeellisuutta tarkasteltaessa ohjelmoija saattaa keskittyä tulostuslauseisiin ja vahingossa jättää osan logiikasta huomioimatta. -->
38
+
39
+
40
+
One way in which perceptual blindness manifests itself in programming practice is when concentrating on a specific part of a program draws attention away from seemingly correct, yet erroneous parts. For instance, while inspecting the correctness of a program's output, a programmer may fixate on print statements, and mistakenly neglect aspects of the program's logic.
41
+
42
+
<!--
43
+
Vastaavasti toistolauseen sisältävässä ohjelmassa olevaa virhettä etsiessä ohjelmoija saattaa keskittyä monimutkaisimpaan asiaan ensin, vaikka virhe on täysin muualla. Esimerkkinä alla oleva käyttäjän syötteiden keskiarvon laskemiseen tarkoitettu ohjelma, jossa on virhe -- virheen etsinnässä tyypillisesti keskitytään ensin toistolauseeseen. -->
44
+
45
+
46
+
Likewise, a programmer may focus on the most complicated aspect of a program featuring a loop, although the error lies somewhere else completely. An example of this is the program below used to calculate the average of user-inputted values. It contains an error, and focus is typically first placed on the loop when searching for it.
47
+
48
+
<!-- ```java
31
49
Scanner lukija = new Scanner(System.in);
32
50
int lukuja = 0;
33
51
int summa = 0;
@@ -48,18 +66,48 @@ if (summa == 0) {
48
66
} else {
49
67
System.out.println("Lukujen keskiarvo: " + (1.0 * summa / lukuja));
50
68
}
69
+
``` -->
70
+
71
+
```java
72
+
Scanner scanner =newScanner(System.in);
73
+
int values =0;
74
+
int sum =0;
75
+
76
+
while (true) {
77
+
System.out.println("Provide a value, a negative value ends the program");
78
+
int value =Integer.valueOf(scanner.nextLine());
79
+
if (value <0) {
80
+
break;
81
+
}
82
+
83
+
values = values +1;
84
+
sum = sum + value;
85
+
}
86
+
87
+
if (sum ==0) {
88
+
System.out.println("The average of the values could not be calculated.");
89
+
} else {
90
+
System.out.println("Average of values: "+ (1.0* sum / value));
Tahaton sokeus on asia, jota ei voi varsinaisesti kytkeä pois päältä. Ohjelmoija voi kuitenkin muutamien kikkojen avulla vähentää sen esiintymistä -- näistä ensimmäinen on taukojen pitäminen, joka luonnollisesti vaatii työn ajoissa aloittamisen. Lisäksi esimerkiksi koodin kommentointi, nimentä ja "debug"-tulosteet auttavat myös.
97
+
<!--Tahaton sokeus on asia, jota ei voi varsinaisesti kytkeä pois päältä. Ohjelmoija voi kuitenkin muutamien kikkojen avulla vähentää sen esiintymistä -- näistä ensimmäinen on taukojen pitäminen, joka luonnollisesti vaatii työn ajoissa aloittamisen. Lisäksi esimerkiksi koodin kommentointi, nimentä ja "debug"-tulosteet auttavat myös.-->
56
98
99
+
Perceptual blindness is something that cannot be switched off completely. However, there are ways by which a programmer can lessen its effect - the first one being taking breaks. This, of course, requires that work is begun early. Additionally, commenting code, the naming of things, and "debugging" prints are examples of things that help too.
57
100
58
-
## Lähdekoodin kommentointi
59
101
60
-
Kommenteilla on useita käyttötarkoituksia, joista yksi on ohjelman toiminnallisuuden itselleen selittämiseen esimerkiksi virhettä etsittäessä. Alla melko yksinkertaisen ohjelman suoritus on kuvattu auki kommentein.
102
+
<!-- ## Lähdekoodin kommentointi -->
103
+
## Commenting the source code
61
104
62
-
```java
105
+
106
+
<!-- Kommenteilla on useita käyttötarkoituksia, joista yksi on ohjelman toiminnallisuuden itselleen selittämiseen esimerkiksi virhettä etsittäessä. Alla melko yksinkertaisen ohjelman suoritus on kuvattu auki kommentein. -->
107
+
108
+
Comments have many purposes, and one of them is explaining the working of the code to oneself when searching for bugs. Below, the execution of a relatively simple program is described using comments.
109
+
110
+
<!-- ```java
63
111
/*
64
112
Tulostaa luvut kymmenestä yhteen. Jokainen
65
113
luku tulostetaan omalle rivilleen.
@@ -81,16 +129,49 @@ while (luku > 0) {
81
129
// vähennetään yksi luku-muuttujan arvosta
82
130
luku = luku - 1;
83
131
}
132
+
``` -->
133
+
134
+
135
+
```java
136
+
137
+
/*
138
+
Prints the numbers from ten to one.
139
+
Each number is printed on its own line.
140
+
*/
141
+
142
+
// We create an integer variable named value,
143
+
// assigning the value 10 to it.
144
+
int value =10;
145
+
146
+
// The loop execution continues until
147
+
// the value of the variable named value is less than or equal to
148
+
// zero. The excution doesn't stop _immediately_ when the value zero
149
+
// is assigned to the variable, but only when the condition of the
150
+
// loop is evaluated the following time.
151
+
// This always happens after the loop has executed
152
+
while (value >0) {
153
+
// we print out the value in the variable and a new line
154
+
System.out.println(value);
155
+
// we decrement the value by one
156
+
value = value -1;
157
+
}
84
158
```
85
159
86
-
Kommentit eivät vaikuta ohjelman suoritukseen, eli ohjelma toimii kommenttien kanssa täysin samalla tavalla kuin ilman kommentteja.
160
+
<!--Kommentit eivät vaikuta ohjelman suoritukseen, eli ohjelma toimii kommenttien kanssa täysin samalla tavalla kuin ilman kommentteja.-->
87
161
88
-
Edellä käytetty ohjelmoinnin opetteluun tarkoitettu kommentointityyli on toistaalta ohjelmistokehityksene kelpaamaton hyvin raskas. Ohjelmistoja rakennettaessa pyritään siihen, että **lähdekoodi kommentoi itse itsensä**. Tämä tarkoittaa sitä, että ohjelman toiminnallisuus tulee ilmi luokkien, metodien ja muuttujien nimistä.
162
+
Comments have no impact on the execution of the program, i.e., the program works in the same way with the comments as it does without them.
89
163
90
-
Esimerkki voidaan "kommentoida" kapseloimalla ohjelmakoodi sopivasti nimettyn metodin sisään. Alla on kaksi esimerkkiä yllä olevan koodin kapseloivista metodeista -- toinen metodeista on hieman yleiskäyttöisempi kuin toinen. Toisaalta, jälkimmäisessä metodissa oletetaan, että käyttäjä tietää kumpaan parametreista asetetaan isompi ja kumpaan pienempi luku.
91
164
165
+
<!-- Edellä käytetty ohjelmoinnin opetteluun tarkoitettu kommentointityyli on toistaalta ohjelmistokehityksene kelpaamaton hyvin raskas. Ohjelmistoja rakennettaessa pyritään siihen, että **lähdekoodi kommentoi itse itsensä**. Tämä tarkoittaa sitä, että ohjelman toiminnallisuus tulee ilmi luokkien, metodien ja muuttujien nimistä. -->
92
166
93
-
```java
167
+
The commenting style used above for learning programming is, however, quite burdensome in real development, where the goal instead is for the source code to be **self documenting**. This means that the functionality of the program should be evident from the way classes, methods, and variables are named.
168
+
169
+
<!--
170
+
Esimerkki voidaan "kommentoida" kapseloimalla ohjelmakoodi sopivasti nimettyn metodin sisään. Alla on kaksi esimerkkiä yllä olevan koodin kapseloivista metodeista -- toinen metodeista on hieman yleiskäyttöisempi kuin toinen. Toisaalta, jälkimmäisessä metodissa oletetaan, että käyttäjä tietää kumpaan parametreista asetetaan isompi ja kumpaan pienempi luku. -->
171
+
172
+
The example can be "commented out" by encapsulating the code into an appropriately named method. Below are two examples of methods that do this - one of the methods is more general-purpose than the other. The more general method assumes, however, that the user knows which of the two parameters is assigned the higher value and which the lower.
173
+
174
+
<!-- ```java
94
175
public static void tulostaLuvutKymmenestaYhteen() {
95
176
int luku = 10;
96
177
while (luku > 0) {
@@ -107,15 +188,40 @@ public static void tulostaLuvutIsoimmastaPienimpaan(int mista, int mihin) {
107
188
mista = mista - 1;
108
189
}
109
190
}
191
+
``` -->
192
+
```java
193
+
publicstaticvoid printValuesFromTenToOne() {
194
+
int value =10;
195
+
while (value >0) {
196
+
System.out.println(value);
197
+
value = value -1;
198
+
}
199
+
}
200
+
```
201
+
202
+
```java
203
+
publicstaticvoid printValuesFromLargestToSmallest(int start, int end) {
Eräs ohjelmoinnissa tarvittava taito on testaus- ja debuggaustaito, jota käytetään virheiden etsimisessä. Yksinkertaisin tapa ohjelmissa olevien virheiden etsimiseen on ns. print-debuggaus, joka käytännössä tarkoittaa rivikohtaista viestien lisäämistä. Viestejä käytetään ohjelman suorituksen seuraamiseen, ja viestit voivat sisältää myös ohjelmassa olevien muuttujien arvot.
115
214
116
-
Tarkastellaan alla olevaa edellisestä kyselystäkin tuttua ohjelmaa, jota käytetään ei-negatiivisten lukujen keskiarvon laskemiseen.
117
215
118
-
```java
216
+
<!-- Eräs ohjelmoinnissa tarvittava taito on testaus- ja debuggaustaito, jota käytetään virheiden etsimisessä. Yksinkertaisin tapa ohjelmissa olevien virheiden etsimiseen on ns. print-debuggaus, joka käytännössä tarkoittaa rivikohtaista viestien lisäämistä. Viestejä käytetään ohjelman suorituksen seuraamiseen, ja viestit voivat sisältää myös ohjelmassa olevien muuttujien arvot. -->
217
+
218
+
One required skill in programming is the ability to test and debug when searching for errors. The simplest way to search for errors is to use so-called print debugging, which in practice means adding messages to certain rows of code. These messages are used to follow the program-execution flow, and can also contain values of variables existing in the program.
219
+
220
+
<!-- Tarkastellaan alla olevaa edellisestä kyselystäkin tuttua ohjelmaa, jota käytetään ei-negatiivisten lukujen keskiarvon laskemiseen. -->
221
+
222
+
Let's inspect the program already familiar to us from the previous question that was used to calculate the average of non-negative values.
223
+
224
+
<!-- ```java
119
225
Scanner lukija = new Scanner(System.in);
120
226
int lukuja = 0;
121
227
int summa = 0;
@@ -136,11 +242,35 @@ if (summa == 0) {
136
242
} else {
137
243
System.out.println("Lukujen keskiarvo: " + (1.0 * summa / lukuja));
138
244
}
245
+
``` -->
246
+
```java
247
+
Scanner scanner =newScanner(System.in);
248
+
int values =0;
249
+
int sum =0;
250
+
251
+
while (true) {
252
+
System.out.println("Provide a value, a negative value ends the program");
253
+
int value =Integer.valueOf(scanner.nextLine());
254
+
if (value <0) {
255
+
break;
256
+
}
257
+
258
+
values = values +1;
259
+
sum = sum + value;
260
+
}
261
+
262
+
if (sum ==0) {
263
+
System.out.println("The average of the values could not be calculated.");
264
+
} else {
265
+
System.out.println("Average of values: "+ (1.0* sum / value));
266
+
}
139
267
```
140
268
141
-
Mikäli ohjelmassa olisi virhe, print-debuggauksella ohjelman toimintaa voisi purkaa lisäämällä print-komentoja sopiviin kohtiin. Alla olevassa esimerkissä on eräs mahdollinen esimerkki print-debuggauskomentoja sisältävästä ohjelmasta.
269
+
<!--Mikäli ohjelmassa olisi virhe, print-debuggauksella ohjelman toimintaa voisi purkaa lisäämällä print-komentoja sopiviin kohtiin. Alla olevassa esimerkissä on eräs mahdollinen esimerkki print-debuggauskomentoja sisältävästä ohjelmasta.-->
142
270
271
+
Had the program container an error, print debugging could have been used to unravel its functionality by adding print statements in the appropriate places. The example below contains one possible example of a program containing print-debug statements.
143
272
273
+
<!--
144
274
```java
145
275
Scanner lukija = new Scanner(System.in);
146
276
int lukuja = 0;
@@ -169,9 +299,38 @@ if (summa == 0) {
169
299
} else {
170
300
System.out.println("Lukujen keskiarvo: " + (1.0 * summa / lukuja));
Kun ohjelman suorittaa useampaan otteeseen sopivilla syötteillä, ohjelmasta löytynee siinä piilevä virhe. Sopivien syötteiden keksiminen on myös oma taitonsa -- tärkeää on pyrkiä tarkastelemaan ns. corner caseja, eli tilanteita, joissa ohjelman suoritus voisi olla poikkeava. Tällaisia tilanteita ovat esimerkiksi tilanne, missä käyttäjä ei syötä yhtään hyväksyttävää lukua, käyttäjä syöttää pelkkiä nollia, tai käyttäjä syöttää hyvin isoja lukuja.
312
+
System.out.println("Provide a value, a negative value ends the program");
313
+
int value =Integer.valueOf(scanner.nextLine());
314
+
if (value <0) {
315
+
System.out.println("-- value is negative, exiting loop");
System.out.println("The average of the values could not be calculated.");
328
+
} else {
329
+
System.out.println("Average of values: "+ (1.0* sum / value));
330
+
}
331
+
```
175
332
333
+
<!-- Kun ohjelman suorittaa useampaan otteeseen sopivilla syötteillä, ohjelmasta löytynee siinä piilevä virhe. Sopivien syötteiden keksiminen on myös oma taitonsa -- tärkeää on pyrkiä tarkastelemaan ns. corner caseja, eli tilanteita, joissa ohjelman suoritus voisi olla poikkeava. Tällaisia tilanteita ovat esimerkiksi tilanne, missä käyttäjä ei syötä yhtään hyväksyttävää lukua, käyttäjä syöttää pelkkiä nollia, tai käyttäjä syöttää hyvin isoja lukuja. -->
176
334
335
+
When a program is executed multiple times with the appropriate inputs, the hidden error is most likely found. Coming up with suitable inputs is a skill in its own right. It's essential to test the so-called corner cases, i.e., circumstances where the program execution could be exceptional. An example scenario is one where the user only inputs unacceptable numbers, or zeros, or very large numbers.
0 commit comments