Le blog de Vincent Battaglia

RSS

Je ne dois pas choisir ma langue !

Pour les non-belges qui me lisent, il faut savoir que la Belgique est un pays compliqué où on parle trois langues : le français, le néerlandais et, dans une moindre de mesure, l’allemand.

La plupart du temps, les sites belges sont donc proposés en plusieurs langues (les besoins en traductions bouffent d’ailleurs pas mal de budget ce qui donne au final un site moins bien que s’il avait été en une langue… ce qui explique sans doute pourquoi la Belgique est en retard sur le Web… mais c’est un autre débat).

Bref, même si cela reste encore une pratique courante sur le Web, s’il y a bien quelque chose que je trouve qu’on pourrait facilement éviter, c’est l’utilisation des splash pages de choix de langue !

Le débat est assez intense à ce sujet et si vous ne voyez toujours pas de quoi je veux parler, allez jeter un coup d’oeil à ces quelques exemples :

Ces pages intermédiaires de choix de langues ne sont pas conseillées d’un point de vue référencement car elles sont considérées de façon prioritaire par les moteurs de recherche ce qui est un peu du gâchis car vous ne pouvez y mettre aucun contenu (forcément, dans quelle langue mettriez vous ce contenu ?)

En plus, c’est un peu idiot de les utiliser, vu qu’on peut facilement les éviter en quelques lignes de code…

En effet, il est facile de détecter la langue du navigateur et d’orienter le visiteur vers sa langue de façon automatique et invisible.

Voilà ce que cela pourrait donner en PHP :

<?php

$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);

header('HTTP/1.1 301 Moved Permanently');
header('Location: /index_'.$lang.'.php');

Évidemment, si la langue détectée est l’espagnol et que notre site n’existe qu’en français et en anglais, nous avons un problème… Il faut donc établir une langue par défaut de façon arbitraire (par exemple : si les clients de votre entreprise sont majoritairement francophones, vous pouvez opter pour le français) et rediriger vers cette langue par défaut au cas où nous détecterions une langue qui n’existe pas sur le site :

<?php

$langs = array('fr','en','nl'); // the first item is the default language

$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);

if (!in_array($lang, $langs))
	$lang = $langs[0];

header('HTTP/1.1 301 Moved Permanently');
header('Location: /index_'.$lang.'.php');

C’est déjà mieux…

Bien sûr, il faut pouvoir offrir la possibilité au visiteur de changer de langue à tout moment sur le site et enregistrer cette valeur dans un cookie. Si le cookie est détecté, il prend le dessus par rapport à la langue du navigateur :

<?php

$langs = array('fr','en','nl'); // the first item is the default language

if (isset($_COOKIE['lang']) && in_array($_COOKIE['lang'], $langs)) {
	$lang = $_COOKIE['lang'];
}
else {
	$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);

	if (!in_array($lang, $langs))
		$lang = $langs[0];
}

header('HTTP/1.1 301 Moved Permanently');
header('Location: /index_'.$lang.'.php');

Pour encore améliorer la chose, on pourrait établir que la langue par défaut est la langue la plus utilisée sur le site. Il faut pour cela pouvoir surveiller le comportement des visiteurs et faire les comptes pour déterminer la langue dominante sur le site.

A vous de jouer !

La recursivité, c’est utile !

Dans un article récent, j’ai choqué pas mal de monde en disant que la récursivité est un concept assez peu utilisé. Je me focalisais sur mon expérience personnelle récente. Il est vrai que ces derniers mois, je n’ai pas eu besoin d’utiliser de fonctions récursives, sans doute car les projets sur lesquels j’ai travaillé ne s’y prêtaient pas.

A vrai dire, la question m’a un peu hanté alors j’ai décidé de faire des recherches et j’ai finalement retrouvé un vieux site où j’avais du utiliser la récursivité pour arriver à mes fins.

Il s’agit d’un problème tout bête sur lequel vous êtes déjà certainement tombé : j’avais un simple système de catégorisation au nombre de sous-niveaux arbitraires (donc, potentiellement infini) et je voulais afficher un sitemap tout ce qu’il y a de plus classique via des listes et sous-listes (tags ul et li).

Ma table category ressemblait à ceci :

+-----------+
| category  |
+-----------+
| id        |
| name      |
| parent_id |
+-----------+
  • id est l’identifiant unique de la catégorie
  • name est le nom de la catégorie
  • parent_id est l’id de la catégorie parente (0 si c’est une catégorie qui se trouve à la racine)

L’algorithme pour afficher mon sitemap est on ne peut plus simple. Je vous épargne volontairement les lignes de code concernant la connexion à la base de données…

<?php

function displaySitemap($n) {
	$query = mysql_query("SELECT * FROM category WHERE parent_id = '$n' ORDER BY name");
	if (mysql_num_rows($query)) {
		echo '<ul>';
		while ($category = mysql_fetch_assoc($query)) {
			echo '<li><a href="category.php?id='.$category['id'].'">'.$category['name'].'</a>';
			displaySitemap($category['id']);
			echo '</li>';
		}
		echo '</ul>';
	}
}

displaySitemap(0);

Ce n’est absolument pas la façon la plus propre de procéder mais cela prouve que la récursivité est une notion indispensable et utile !

Mea culpa, donc.

Le grand décalage entre université et réalité

Il y a peu, j’ai eu l’occasion de voir à quoi ressemblait l’examen d’informatique d’étudiants en deuxième année de la Faculté des Sciences appliquées (école polytechnique) de l’ULB.

Le langage qui a été choisi pour enseigner la programmation à ces étudiants est le C++. Quand j’étais moi même à l’université de Mons-Hainaut (désormais UMons), j’ai appris la programmation avec le langage C. Je sais que pour les étudiants de l’UMons aujourd’hui, c’est le langage Java Python qui a été choisi.

Cette disparité n’est pas encore tellement dérangeante. Le langage doit être considéré comme un outil. Au départ, ce sont les principes fondamentaux de la programmation (types, variables, conditions, boucles, fonctions, etc.) qui sont enseignés. Que ce soit en C, C++ ou Java, cela fonctionne (à peu de choses près) de la même façon. Je me rappelle d’ailleurs avoir reçu beaucoup de cours où les algorithmes étaient écrits dans ce que nous appelions un « métalangage », c’est-à-dire dans une notation indépendante de tout langage de programmation.

En deuxième année polytech, j’ai pu apercevoir que les étudiants commencent à découvrir les concepts de la programmation object (jusque là, tout va bien) mais également des trucs un peu plus folkloriques comme la recursivité et les listes chaînées.

Et c’est là que je commence à percevoir un problème.

D’une part, les listes chaînées sont pour moi un concept typiquement scolaire destiné à appliquer de façon concrète une notion faisant désormais partie du passé : les pointeurs. Je ne sais pas vous, mais moi, et c’est peut-être un aveu de faiblesse, je n’ai jamais pu maîtriser les yeux fermés cette notion de pointeurs… J’ai réussi mes examens mais quand je m’y replonge (principalement pour l’expliquer à des étudiants comme ce fut le cas ici), j’ai toujours besoin de relire attentivement un article explicatif pour m’en rappeler le fonctionnement exact. Les principaux langages utilisant les pointeurs sont le C, le C++ et le Pascal. Je ne programme plus dans ces langages. Ceci explique sans doute cela. Les langages dits « modernes » ont laissé tomber les pointeurs et l’allocation manuelle de mémoire au profit de références et de mécanismes automatiques tels que le garbage collector (comme c’est le cas pour Java, pour ne citer que lui). Le développeur ne doit (quasiment) plus se soucier de rien. Pourquoi encore enseigner les pointeurs dans ce cas ?

D’autre part, cela fait maintenant plusieurs années que je programme, développe, scripte, bidouille du code (appeler ça comme vous voulez) dans le monde réel et je ne me rappelle plus avoir eu besoin d’utiliser une fonction récursive pour résoudre un problème. De plus, je sais que les algorithmes récursifs bouffent la mémoire de façon impressionnante. Pour m’assurer ne pas être le seul dans le cas, je vous le demande : utilisez-vous souvent la récursivité dans vos algorithmes ?

Là où je veux en venir avec toutes ces interrogations, c’est que je trouve purement et simplement qu’il y a un trop grand décalage entre ce qu’on apprend à l’université et le monde du business et du travail.

Pour des polytechniciens, je sais qu’un cours d’informatique n’est pas forcément destiné à former de parfaits petits développeurs PHP mais plutôt à leur ouvrir l’esprit et à leur proposer une façon différente de penser et d’aborder un problème. Malheureusement, cet état des lieux s’applique également aux personnes qui étudient l’informatique à l’université, comme ce fut mon cas.

A la décharge des universités, il est vrai que celles-ci doivent garder leur aspect « lieu de recherche scientifique » car c’est ce qui fait leur attrait mais est-ce que cela doit se faire au dépend de l’avenir des étudiants ?

J’y vais sans doute un peu fort mais les deux questions suivantes me taraudent et j’aimerais avoir votre avis à ce propos :

  • Est-ce que les gens qui étudient l’informatique à l’université sont moins bien préparés au marché du travail que les étudiants qui font des graduats en informatique (ou d’autres formations) ?
  • Est-ce que les universités doivent changer leur fusil d’épaule ou continuer de prôner la science pour la science comme c’est le cas actuellement ?

Merci d’avance pour vos réponses !

Too Cool for Internet Explorer