OpenJDK : un rapport de bogue souligne la présence d’expressions grossières au sein du code source
De l’implémentation open source de Java SE
Les revues de code, notamment, de la section réservée aux commentaires peuvent s’avérer très intéressantes quant aux possibles trouvailles. Un contributeur au projet OpenJDK s’est prêté au jeu avec le code source de l’implémentation open source de Java SE et il faut dire que les développeurs qui sont passés par là n’ont pas « lésiné sur les mots. »
Illustration avec la ligne 1475 de cette portion de code au sein de la bibliothèque softchannel.java :
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 1455 controlChange(100, 127); // RPN = Null 1456 controlChange(101, 127); // RPN = Null 1457 1458 // see DLS 2.1 (Power-on Default Values) 1459 if (allControls) { 1460 1461 keybasedcontroller_active = null; 1462 keybasedcontroller_value = null; 1463 1464 controlChange(7, 100); // Volume 1465 controlChange(10, 64); // Pan 1466 controlChange(91, 40); // Reverb 1467 1468 for (int controller : co_midi_rpn_rpn.keySet()) { 1469 // don't reset tuning settings 1470 if (controller != 3 && controller != 4) 1471 rpnChange(controller, 0); 1472 } 1473 for (int controller : co_midi_nrpn_nrpn.keySet()) 1474 nrpnChange(controller, 0); 1475 rpnChange(0, 2 << 7); // Bitch Bend sensitivity 1476 rpnChange(1, 64 << 7); // Channel fine tunning 1477 rpnChange(2, 64 << 7); // Channel Coarse Tuning 1478 rpnChange(5, 64); // Modulation Depth, +/- 50 cent 1479 1480 tuning_bank = 0; 1481 tuning_program = 0; 1482 tuning = new SoftTuning(); 1483 1484 } 1485 1486 } 1487 } 1488 1489 @Override 1490 public void allNotesOff() { 1491 if (current_mixer != null) 1492 current_mixer.allNotesOff(); 1493 synchronized (control_mutex) { 1494 for (int i = 0; i < voices.length; i++) 1495 if (voices[i].on && voices[i].channel == channel
Le commentaire qui accompagne la ligne 136 au sein du code source de la bibliothèque java de manipulation de bits (BitArray.java) est tout aussi digne d’intérêt.
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 116 */ 117 public final int getNextBit(int startBit) { 118 for (int i = (startBit >>> 5) ; i<=_intSize; i++) { 119 int bits = _bits[i]; 120 if (bits != 0) { 121 for (int b = (startBit % 32); b<32; b++) { 122 if ((bits & _masks[b]) != 0) { 123 return((i << 5) + b); 124 } 125 } 126 } 127 startBit = 0; 128 } 129 return(DTMAxisIterator.END); 130 } 131 132 /** 133 * This method returns the Nth bit that is set in the bit array. The 134 * current position is cached in the following 4 variables and will 135 * help speed up a sequence of next() call in an index iterator. This 136 * method is a mess, but it is fast and it works, so don't fuck with it. 137 */ 138 private int _pos = Integer.MAX_VALUE; 139 private int _node = 0; 140 private int _int = 0; 141 private int _bit = 0; 142 143 public final int getBitNumber(int pos) { 144 145 // Return last node if position we're looking for is the same 146 if (pos == _pos) return(_node); 147 148 // Start from beginning of position we're looking for is before 149 // the point where we left off the last time. 150 if (pos < _pos) { 151 _int = _bit = _pos = 0; 152 } 153 154 // Scan through the bit array - skip integers that have no bits set 155 for ( ; _int <= _intSize; _int++) { 156 int bits = _bits[_int];
Bitc*, f*ck, etc. D’après Adam Farley, on dénombre au minimum 12 expressions de ce type au sein de la bibliothèque open source et on peut allonger la liste si on fouille dans les dictionnaires dédiés aux phases de test de logiciels. « Le code source d’OpenJDK intègre trop de jurons disséminés un peu partout. Étant donné qu’OpenJDK est utilisé dans un contexte professionnel, il semble inapproprié de laisser ces 12 instances dans le code », écrit-il. Adam Farley a proposé une version préliminaire du jeu de modifications qu’il entend introduire. On verra par exemple un « Bitc* bend sensitivity » céder sa place à « Pitch bend sensitivity. »
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 1455 controlChange(100, 127); // RPN = Null 1456 controlChange(101, 127); // RPN = Null 1457 1458 // see DLS 2.1 (Power-on Default Values) 1459 if (allControls) { 1460 1461 keybasedcontroller_active = null; 1462 keybasedcontroller_value = null; 1463 1464 controlChange(7, 100); // Volume 1465 controlChange(10, 64); // Pan 1466 controlChange(91, 40); // Reverb 1467 1468 for (int controller : co_midi_rpn_rpn.keySet()) { 1469 // don't reset tuning settings 1470 if (controller != 3 && controller != 4) 1471 rpnChange(controller, 0); 1472 } 1473 for (int controller : co_midi_nrpn_nrpn.keySet()) 1474 nrpnChange(controller, 0); 1475 rpnChange(0, 2 << 7); // Pitch Bend sensitivity 1476 rpnChange(1, 64 << 7); // Channel fine tunning 1477 rpnChange(2, 64 << 7); // Channel Coarse Tuning 1478 rpnChange(5, 64); // Modulation Depth, +/- 50 cent 1479 1480 tuning_bank = 0; 1481 tuning_program = 0; 1482 tuning = new SoftTuning(); 1483 1484 } 1485 1486 } 1487 } 1488 1489 @Override 1490 public void allNotesOff() { 1491 if (current_mixer != null) 1492 current_mixer.allNotesOff(); 1493 synchronized (control_mutex) { 1494 for (int i = 0; i < voices.length; i++) 1495 if (voices[i].on && voices[i].channel == channel
Ou encore un « method is as mess, but it is fast and it works, so don’t fuck with it » faire ses adieux a profit de « method is as mess, but it is fast and it works, so don’t change it. »
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 116 */ 117 public final int getNextBit(int startBit) { 118 for (int i = (startBit >>> 5) ; i<=_intSize; i++) { 119 int bits = _bits[i]; 120 if (bits != 0) { 121 for (int b = (startBit % 32); b<32; b++) { 122 if ((bits & _masks[b]) != 0) { 123 return((i << 5) + b); 124 } 125 } 126 } 127 startBit = 0; 128 } 129 return(DTMAxisIterator.END); 130 } 131 132 /** 133 * This method returns the Nth bit that is set in the bit array. The 134 * current position is cached in the following 4 variables and will 135 * help speed up a sequence of next() call in an index iterator. This 136 * method is a mess, but it is fast and it works, so don't change it. 137 */ 138 private int _pos = Integer.MAX_VALUE; 139 private int _node = 0; 140 private int _int = 0; 141 private int _bit = 0; 142 143 public final int getBitNumber(int pos) { 144 145 // Return last node if position we're looking for is the same 146 if (pos == _pos) return(_node); 147 148 // Start from beginning of position we're looking for is before 149 // the point where we left off the last time. 150 if (pos < _pos) { 151 _int = _bit = _pos = 0; 152 } 153 154 // Scan through the bit array - skip integers that have no bits set 155 for ( ; _int <= _intSize; _int++) { 156 int bits = _bits[_int];
D’après ce qui ressort du rapport de bogue, la communauté n'est pas en total accord avec la proposition. Une version étendue des modifications est à paraître et prendra en compte les consensus, notamment, sur les termes à considérer comme des jurons. On parle du pouvoir des mots et un observateur qui s’inscrit en faux avec l’initiative commente qu’ « un développeur est libre de faire usage d’un juron si celui-ci constitue le meilleur moyen de faire passer un message. »
Il y a quelques mois, la communauté Python s’est engagée sur un front similaire. En septembre, elle a engagé le processus de suppression des termes « master » et « slave » de sa documentation et de sa base de code. On évoquait alors la nécessité de prendre de la distance d’avec ces derniers pour des raisons de diversité et pour leur connotation à l’esclavage.
Source : rapport de bogue
Et vous ?
Que pensez-vous de l’initiative ?
Que pensez-vous de l’utilisation des jurons dans l’univers du génie logiciel ?
Vous est-il arrivé d’en faire usage ? Si oui, quel était l’objectif à atteindre ?
Êtes vous d’accord avec l’observateur qui affirme qu’ « un développeur est libre de faire usage d’un juron si celui-ci constitue le meilleur moyen de faire passer un message » ?
Voir aussi :
Python va supprimer les termes "master/slave" de sa documentation et sa base de code pour des raisons de diversité et leur connotation à l'esclavage
Andrew Haley de Red Hat donne son avis sur l'avenir d'OpenJDK, l'implémentation libre de Java SE, après la sortie de JDK 11 sous licence commerciale
OpenJDK pour MacOS : le projet a débuté, les premiers codes sont disponibles
Java SE : Oracle soumet l'utilisation des fonctionnalités commerciales à une souscription mensuelle, la licence permanente n'est plus d'actualité
OpenJDK bientôt présent sur Windows Azure, Microsoft travaille sur une implémentation open source de « Java as a Service »
Partager