Skip to content

Commit cfb0d28

Browse files
committed
Merge branch 'master' of github.com:rage/programming-20
2 parents d5ca0e4 + 0c07dd6 commit cfb0d28

File tree

1 file changed

+184
-25
lines changed

1 file changed

+184
-25
lines changed

data/osa-3/1-virheiden-etsimisesta.md

Lines changed: 184 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,51 @@
11
---
22
path: '/osa-3/1-virheiden-etsimisesta'
3-
title: 'Virheiden etsimisestä'
3+
# title: 'Virheiden etsimisestä'
4+
title: 'On searching errors'
45
hidden: false
56
---
67

7-
<text-box variant='learningObjectives' name='Oppimistavoitteet'>
8+
<!-- <text-box variant='learningObjectives' name='Oppimistavoitteet'> -->
9+
<text-box variant='learningObjectives' name='Learning Objectives'>
810

911
- TODO
1012

1113
</text-box>
1214

1315

14-
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. -->
1517

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.
1719

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.
1926

2027
<youtube id="Ahg6qcgoay4"></youtube>
2128

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. -->
2330

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.
2532

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ä. -->
2734

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.
2936

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
3149
Scanner lukija = new Scanner(System.in);
3250
int lukuja = 0;
3351
int summa = 0;
@@ -48,18 +66,48 @@ if (summa == 0) {
4866
} else {
4967
System.out.println("Lukujen keskiarvo: " + (1.0 * summa / lukuja));
5068
}
69+
``` -->
70+
71+
```java
72+
Scanner scanner = new Scanner(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));
91+
}
5192
```
5293

94+
5395
<quiznator id="5c3740e43972a914740fe479"></quiznator>
5496

55-
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. -->
5698

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.
57100

58-
## Lähdekoodin kommentointi
59101

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
61104

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
63111
/*
64112
Tulostaa luvut kymmenestä yhteen. Jokainen
65113
luku tulostetaan omalle rivilleen.
@@ -81,16 +129,49 @@ while (luku > 0) {
81129
// vähennetään yksi luku-muuttujan arvosta
82130
luku = luku - 1;
83131
}
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+
}
84158
```
85159

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. -->
87161

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.
89163

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.
91164

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ä. -->
92166

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
94175
public static void tulostaLuvutKymmenestaYhteen() {
95176
int luku = 10;
96177
while (luku > 0) {
@@ -107,15 +188,40 @@ public static void tulostaLuvutIsoimmastaPienimpaan(int mista, int mihin) {
107188
mista = mista - 1;
108189
}
109190
}
191+
``` -->
192+
```java
193+
public static void 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+
public static void printValuesFromLargestToSmallest(int start, int end) {
204+
while (start >= end) {
205+
System.out.println(start);
206+
start = start - 1;
207+
}
208+
}
110209
```
111210

112-
## Virheiden etsintä print-debuggauksella
211+
<!-- ## Virheiden etsintä print-debuggauksella -->
212+
## Searching for errors with print debugging
113213

114-
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.
115214

116-
Tarkastellaan alla olevaa edellisestä kyselystäkin tuttua ohjelmaa, jota käytetään ei-negatiivisten lukujen keskiarvon laskemiseen.
117215

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
119225
Scanner lukija = new Scanner(System.in);
120226
int lukuja = 0;
121227
int summa = 0;
@@ -136,11 +242,35 @@ if (summa == 0) {
136242
} else {
137243
System.out.println("Lukujen keskiarvo: " + (1.0 * summa / lukuja));
138244
}
245+
``` -->
246+
```java
247+
Scanner scanner = new Scanner(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+
}
139267
```
140268

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. -->
142270

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.
143272

273+
<!--
144274
```java
145275
Scanner lukija = new Scanner(System.in);
146276
int lukuja = 0;
@@ -169,9 +299,38 @@ if (summa == 0) {
169299
} else {
170300
System.out.println("Lukujen keskiarvo: " + (1.0 * summa / lukuja));
171301
}
172-
```
302+
``` -->
303+
304+
```java
305+
Scanner scanner = new Scanner(System.in);
306+
int values = 0;
307+
int sum = 0;
308+
309+
while (true) {
310+
System.out.println("-- values: " + values + ", sum: " + sum);
173311

174-
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");
316+
break;
317+
}
318+
319+
values = values + 1;
320+
sum = sum + value;
321+
}
322+
323+
System.out.println("-- loop exited");
324+
System.out.println("-- values: " + values + ", sum: " + sum);
325+
326+
if (sum == 0) {
327+
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+
```
175332

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. -->
176334

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.
177336
<quiznator id="5c385de6ddb6b814af31d7d0"></quiznator>

0 commit comments

Comments
 (0)