Faut-il se former soi-même ou par un organisme ?

Lorsqu’on souhaite se mettre à une technologie qu’on ne maîtrise pas encore, il existe deux voies pour se former:

  1. Se former soi-même.
  2. Suivre une formation dispensée par un organisme.

En auto-formation

Au niveau du prix, le calcul est simple:  il s’agit du prix des supports, tels que les livres ou les abonnements à des sites web et autres achats de vidéos. Ça peut même être gratuit.

Pour ce qui est du temps passé, cela est souvent difficile à quantifier, parce qu’il ne se réduit pas  au temps de lecture ou de visionnage: il faudra aussi essayer des choses, et surtout se tromper. Cela prend un temps dingue !

Notez bien que ce mode de formation est tout à fait envisageable; je me suis moi-même formé à iOS de cette manière. D’ailleurs, une formation par une organisme ne peut pas couvrir tous les sujets, et le recours à des livres sera indispensable pour tout sujet un peu pointu.

Passer par un organisme de formation

Le coût

Il n’y a pas de mystère, le coût d’une formation dispensée par un organisme est élevé, parce que l’organisme doit payer le formateur, son personnel, la logistique et ses locaux. En dehors du prix de la formation, le client doit également payer son employé pendant qu’il se forme; il n’est donc pas productif durant la durée de la formation. Des frais annexes, tels que des frais d’hôtel ou de déplacement peuvent aussi s’ajouter.

Cela dit, si l’organisme de formation est conventionné, le fond de formation de l’entreprise pourra prendre à sa charge tout ou partie du prix de la formation. Je m’explique. D’après ce que j’ai compris, toute entreprise ayant des employés doit s’acquitter de la taxe d’apprentissage, mais peut déduire une partie si elle les place dans un fond. De fait, une entreprise a plutôt intérêt à utiliser le fond et former son personnel. Elle ne paie donc pas la formation “plein pot”.

(Soit dit en passant, l’existence de ces fonds explique pourquoi la formation est une activité plutôt lucrative en France. Puisque la formation “ne coûte rien” à l’entreprise, elle n’est pas trop regardante sur les tarifs. Je dirais que c’est aussi ce qui permet d’accueillir les stagiaires dans les meilleures conditions).

Le temps

Le gros avantage de la formation par un organisme se situe au niveau du temps. La formation classique que je donne dure cinq jours, et les stagiaires sont toujours étonnés de sa densité. Ils vont gagner beaucoup de temps parce que:

  • je les mets sur les bons rails dès le départ.
    Les stagiaires arrivent avec un bagage technique et donc des idées pré-conçues. Mon rôle est de leur inculquer la culture de cette technologie, ce qui leur évite d’utiliser des techniques familières mais inefficaces.
  • j’insiste sur ce qui est important.
    Il existe des principes incontournables (pour Cocoa Touch, c’est le MVC et la délégation) que les stagiaire doivent maîtriser. Ignorer ces principes génère des questions qui n’ont pas de raison d’exister.
  • le retour est immédiat.
    Il est normal de se tromper, cela fait partie intégrante de l’apprentissage. Seulement, il n’est pas rentable de rester bloqué sur un point de détail pendant des heures. Le formateur peut fournir rapidement un remède et proposer des alternatives techniques.
  • la formation est cohérente.
    Si les stagiaires sont là pour apprendre une technologie, il est important de faire un lien avec la méthodologie. Dans mes formations, nous cernons d’abord le problème et nous voyons comment implémenter une solution technique. Cet aspect est essentiel pour apporter de l’autonomie au stagiaire. Il s’agit du gros point faible des livres et autres supports, qui donnent des recettes, mais n’expliquent pas comment les imbriquer pour obtenir une application complète.
  • on sort du quotidien.
    Les stagiaires vont disposer d’une semaine rien qu’à eux, débarrassés du mode projet, et des requêtes des clients.

En conclusion

Vous aurez compris que pour moi, faire appel à un organisme de formation est plus avantageux dès lors que le temps est un critère important. Je vois trop de personnes sur les forums qui essaient de se former par eux-mêmes, dans des délais irréalistes, parce qu’on leur a demandé de programmer le prochain Instagram en deux mois !

Une formation fait gagner du temps sur le court terme, en rendant rapidement le salarié opérationnel, et sur le moyen terme, en assurant une certaine qualité du travail, qui n’aura pas trop besoin d’être repris par la suite.
Sur le long terme, une formation ne sera pas suffisante, et il sera de toute façon nécessaire de se documenter et de tester des points particuliers.

 

 

Parallèle entre la conduite et le développement logiciel

Un développeur logiciel chevronné mais qui venait de se mettre au développement sous iOS me demandait —avec quelques craintes — si un débutant avec quelques mois d’expérience pourrait être plus doué que lui.

Avant d’apprendre à conduire une voiture, on pense que la difficulté réside dans la manipulation des commandes: comme il semble compliqué de tourner le volant tout en appuyant sur les pédales et en actionnant le commodo du clignotant ! Voilà qui exige beaucoup de coordination pour ne pas entrer en collision avec les autres véhicules.

Après quelques semaines de conduite, on sait que la difficulté se trouve ailleurs: il s’agit  essentiellement d’anticiper, de comprendre les intentions des autres usagers de la route et d’adapter ses gestes et sa vitesse pour éviter les obstacles et s’insérer dans le trafic.

Un conducteur aguerri qui changerait de type de véhicule — disons qui passerait de la voiture au scooter — serait bien évidemment déboussolé dans un premier temps, ne serait-ce que par l’équilibre, le placement des commandes, et les capacités d’accélération. Mais il s’y ferait rapidement, parce qu’il maîtrise les fondamentaux de la conduite.

Cela pour dire qu’un développeur expérimenté qui se mettrait au développement sous iOS serait désorienté au départ, peut-être par le langage Objective-C, le tactile, les multiples classes ou Xcode. Mais les fondamentaux sont déjà là: savoir gérer la complexité, trouver son chemin dans la documentation, avoir une méthodologie. Il peut s’attendre à être bon en deux ou trois mois.

Un débutant peut parvenir à créer une application et la publier sur l’App Store. Mais certainement pas une application seulement un peu complexe. Il lui manque trop de fondamentaux.

Quelles versions du système d’exploitation cibler ?

En tant que développeurs, voici une question à laquelle nous sommes confrontés à chaque fois que nous lançons une nouvelle version d’une application: sous quelles versions du système d’exploitation devra-t-elle tourner ?

Accès aux dernières API

Lorsque j’ai lancé PortraiMatic pour Mac, le logiciel exigeait Mac OS 10.4, alors le tout récent système d’Apple. Sur les forums, des développeurs m’ont demandé pour quelle raison technique il ne tournait pas sous 10.3. Après tout, le logiciel était faisable sous 10.3. J’ai répondu par une autre question: “et pourquoi il ne tourne pas sous 10.2 ?”, puis “et pourquoi il ne tourne pas sous 10.1 ?”, et (quitte à être lourd jusqu’au bout) “et pourquoi il ne tourne pas sous 10.0 ?”. Inutile d’aller jusqu’au Système 7, vous avez saisi. Si j’ai tourné cette question en ridicule, c’est parce qu’elle sous-entend que c’est la faisabilité technique qui impose les versions d’OS ciblées. Or, PortraiMatic est sans doute faisable même sous Système 7. Dès lors, la question peut être mieux posée ainsi: “Quelles API utilisées n’existent que sous Mac OS 10.4 ?”. Cette question a une réponse: j’ai utilisé les CGLayers, qui permettent d’afficher rapidement des blocs graphiques. J’aurais bien pu trouver une alternative technique, comme utiliser OpenGL, mais j’avais là un outil facile et rapide à mettre en œuvre. J’ai donc sacrifié la compatibilité pour gagner du temps et simplifier mon code.

D’autres raisons de lâcher la compatibilité

Je n’ai pas de statistiques, mais je peux affirmer sans trop me tromper qu’il y a actuellement un bon pourcentage de Mac sous 10.6, la majorité sous 10.7, quelques-uns sous 10.8. Donc, pour toucher le maximum de clients, il faudrait qu’un logiciel soit compatible avec ces trois versions. Malgré cela, si je lançais une nouvelle application aujourd’hui, elle exigerait 10.8. Voici les raisons.

  • Être compatible n’est pas seulement se limiter aux API d’un OS, mais aussi tester entièrement l’application sous cet OS, et corriger les écarts. Mon expérience est que la compatibilité ascendante est rarement défaillante. Par contre il y a des différences graphiques pour lesquelles il faut compenser, par exemple en décalant un bouton de quelques points. C’est souvent moins beau, et c’est toujours du travail inutile.
  • Il faut nécessairement maintenir des ordinateurs sous toutes les versions de l’OS. D’abord pour tester, mais aussi reproduire les problèmes soulevés par les utilisateurs. Je commence à manquer de place dans mon bureau.
  • Apple ne nous simplifie pas la vie. Ainsi chaque nouvelle version de Xcode peut retirer un vieil SDK; il faut donc passer au SDK plus récent, mais on n’est plus averti de l’absence des méthodes dans le vieil SDK… Apple peut aussi retirer des cibles de compilation; par exemple, Xcode 4 ne peut pas compiler pour PowerPC, je suis obligé d’utiliser Xcode 3.2.5 sous 10.5 et de bidouiller.
  • Et comment fait Apple pour assurer la compatibilité ? Très simple: ils ne font pas ! Ils exigent souvent les dernières versions de Mac OS X pour leur logiciels.
  • Tous les utilisateurs ne se valent pas. Si on faisait des statistiques, on verrait que ceux sous 10.8 passent plus de temps dans le Mac App Store. Ceux qui sont restés sous 10.6 n’y vont probablement jamais. Or, les early adopters sont les plus à même de faire progresser un nouveau logiciel en dialoguant avec le développeur.
  • Pour finir, les statistiques évoluent: dans deux ans, on en sera peut-être à Mac OS 10.10, et 10.8 sera ringard.

Retour d’expérience sur PortraiMatic

Quand j’ai abandonné la compatibilité avec 10.4, je m’attendais à des remous. En fait non ! Peut-être un message ou deux pour me dire que c’était dommage, et même pas de la part de mes premier clients (qui eux avaient déjà changé d’OS).

PortraiMatic est encore compatible avec 10.5, avec grand mal. Toutes les semaines, je reçois un message de quelqu’un qui me demande s’il fonctionne sous 10.5, et je réponds que oui, mais qu’ils ne pourront pas l’acheter, parce qu’il n’est vendu que sur le Mac App Store, qui exige un OS 10.6. La compatibilité n’est assurée que pour les anciens utilisateurs puissent profiter des mises à jour. Mac OS 10.6 ne tourne pas sur un Mac PowerPC, alors mettre à jour l’OS est impossible sans changer d’ordinateur.

La prochaine mise-à-jour exigera Mac OS 10.6. Je n’ai pas le temps de tester sous 10.8, 10.7, 10.6 et 10.5. Il arrive un moment où il faut être réaliste et décider de comment utiliser au mieux les ressources de sa petite société. Rester compatible avec une minorité d’ordinateurs n’est pas un bon investissement de ces ressources.

Live Code iOS: résumé de la soirée

Comme je vous l’avais indiqué, le jeudi 26 juillet avait lieu le premier Live Code iOS, au théâtre Auguste à Paris.

PhotoRenaudSeul

Avec BeMyApp, nous nous étions mis d’accord pour présenter un petit jeu, dont voici le principe:

PrincipeDuJeu

L’écran défile vers la gauche, la balle restant calée à gauche. Toucher l’écran la fait bondir; le but du jeu est de parcourir la plus longue distance en évitant qu’elle ne touche les pics.

Le syndrome du peintre qui refait sa toile

Lorsque j’ai annoncé l’événement, j’ai également expliqué que le programme était déjà codé. Mon objectif d’alors était de bien cerner le problème, d’anticiper les questions techniques, et surtout, de trouver les raccourcis pour que cela ne dure qu’une heure. Parmi les remarques qu’on m’a faites, l’une m’a paru particulièrement juste: “Alors, c’est un peu comme si un peintre avait déjà peint une toile et devait refaire exactement la même en public”. Nous avons donc pris la décision que ce ne serait pas moi qui coderais, mais des gens du public.

PhotoRenaudEtMichael

Je tiens à remercier les trois volontaires pour qui ce fut pour le moins stressant ! Ils se sont bien débrouillé et beaucoup impliqué. Il y eu un vrai moment de flottement, avec un problème difficile à résoudre, faisant intervenir des mathématiques et de l’algorithmique. À cet instant, je me suis demandé si nous y parviendrions, mais c’est le moment où le public fut le plus impliqué!

Finalement, cela a montré le vrai travail de programmeur: il y a parfois des obstacles, mais en s’accrochant on y arrive.

Pari tenu ?

Les objectifs étaient de coder en une heure un jeu jouable et intéressant. Je dois admettre que le pari ne fut techniquement pas tenu. Nous y avons passé 1h30, le jeu est trop facile parce que la balle peut être maintenue en l’air, et il faut relancer le jeu par Xcode en fin de partie.

PhotoFin

Si vous disposez de Xcode, vous pouvez essayer vous-mêmes: Le code source du jeu codé pendant l’événement. Le code source de celui que j’avais préparé.

En conclusion

Le but de ce genre d’événements est de créer un esprit communautaire et d’ouvrir l’esprit à de nouvelles techniques. De ce point de vue, ce fut une réussite, d’autant plus que j’ai eu de bons échos de cette soirée. Un deuxième Live Code sera sans doute organisé à la rentrée.

TeleLineo 1.1

Il y a quelques mois de cela, je profitai d’un week-end pour créer une application complète. Pour rappel TeleLineo est la version numérique d’un célèbre jouet où on dessine en actionnant deux molettes qui déplacent une mine. J’avais relaté son développement éclair ici même. Depuis quelques jours, je me suis remis au travail afin de corriger plusieurs défauts de la première version.

Les graphismes avaient constitué l’essentiel du temps de développement. Pour autant, je les ai repris entièrement pour cette nouvelle version, parce qu’entre temps, l’écran Retina du Nouvel iPad est apparu. Il fallait donc tout redessiner au double de la résolution. Heureusement, j’ai récemment remplacé mon ancien logiciel de dessin vectoriel par Sketch, qui est bien mieux adapté et m’a fait gagner beaucoup de temps, tout en m’offrant un meilleur rendu.

Icône de l’application

L’icône de la première version avait été faite rapidement en bricolant l’image de l’écran principal puis en rajoutant les images des molettes par-dessus:

AppIcon1_0

L’icône de la version 1.1 a été dessinée à part, mais demeure très similaire:

AppIcon_1_1

Finalement, je considère que l’icône représente bien l’application, et j’ai conservé l’idée générale, en soignant les détails.

Écran principal

La couleur bleue, la taille de l’écran et l’emplacement des molettes étaient des choix de conception.

SnapshotTeleLineo

 

De fait, l’apparence est quasiment la même:

Bateau_v1_1

Quelques détails ont été changés, tels que l’ombre sur l’écran. J’ai remplacé le titre, qui était un simple texte, par du graphisme. Une icône, en haut à droite fait aussi son apparition. Elle permet d’enregistrer le dessin dans l’album photo. Vous pourrez ainsi conserver vos œuvres ! Voilà enfin un avantage à utiliser la version numérique.

Écran d’informations

J’avais réalisé un écran d’information en 30 mn chrono pour la version 1:

LineoInfo

Le nouvel écran m’a pris une demi-journée à réaliser:

EcranInfo_v1_1

Ce temps assez long s’explique par le dessin de l’illustration de secouement de l’iPad, et parce que l’écran n’est pas fixe. Je m’explique: il ne s’agit pas d’un simple graphisme que j’aurais collé. L’ombre du fond est une image étirable, de même pour l’image du bouton. C’est plus long à réaliser mais c’est plus flexible. J’admets que ce n’était pas forcément nécessaire, mais je voulais y travailler pour de prochains projets.

Pour télécharger

TeleLineo.com.

LiveCode iOS Paris

L’équipe de BeMyApp, décidément pleine d’idées, m’a proposé un nouveau concept, celui de réaliser une application devant un public. Le premier LiveCode iOS se tiendra donc le jeudi 26 juillet 2012 à 19h30 à Paris.

J’y écrirai un jeu pour iPhone avec les technologies Cocoa Touch classiques, et les contraintes suivantes:

  • une heure de développement au maximum
  • le jeu devra être jouable
  • le jeu devra avoir un intérêt

Venez voir si le challenge pourra être tenu ! L’interaction avec le public est essentielle. Informations et inscriptions

Correction: l’événement se tiendra le 26 juillet, et non le 23 comme je l’avais tout d’abord annoncé.

App Store: facture et TVA

Si comme moi, vous exercez un activité dans une structure qui perçoit la TVA, et qu’il vous arrive de faire des achats sur les App Store iOS ou Mac OS, vous avez sans doute constaté que les factures envoyées par Apple n’indiquent pas le montant de la TVA et que vous ne pouvez donc pas la récupérer. Il vous faut réclamer une facture indiquant la TVA à iTunes SàRL. Voici la démarche pour le Mac App Store:

  • Rendez vous sur http://www.apple.com/fr/support/itunes/contact/
  • Cliquez le bouton ”Assistance iTunes via Express Lane” * Vous verrez un affichage à trois colonnes. Sélectionnez Apps et logiciels > Apps Mac > Mac App Store, puis Achats, facturation et remboursement.
  • Dans la rubrique Description du problème, sélectionnez Facturation du compte Mac App Store. Saisissez la version de Mac OS X, le nom de l’application et son numéro de commande (que vous trouverez sur la première facture).
  • Vous devez vous connecter à votre compte iTunes.
  • Enfin, un cadre vous permet de donner des informations complémentaires. Expliquez que vous voulez une facture indiquant le montant de la TVA et donnez le numéro de TVA de votre société. Vous recevrez un double de la facture dans les 48 heures en général. Voilà une longue démarche, et on peut hésiter à la faire pour de faibles montants. iTunes doit clairement changer quelque chose, pour que nous arrêtions de perdre notre temps avec leurs factures qui devraient indiquer la TVA par défaut. Pour protester, c’est par ici que ça se passe. Mais à vrai dire, je pense que la seule manière de les faire changer de position est de réclamer systématiquement une facture pour que leurs équipes perdent leur temps.

Mise à jour le 13/07/2012: les rubriques d’Express Lane ont changé d’intitulés.

CERoundProgressView

J’ai développé une classe qui affiche une progression à l’instar de UIProgressView; la grosse différence étant que l’affichage est circulaire plutôt que linéaire. CERoundProgressView.

L’objet se veut graphiquement simple et sera habituellement utilisé en conjonction avec d’autres vues. Cependant, la progression est animée et le proxy UIAppearance est géré.

Calcul de distance et réflexion sur notre métier

Lors de l’une de mes dernières formations pour Mediabox, j’ai posé une question qui me paraissait bien anodine: “Comment calcule-t-on la distance entre deux points” ? Je fus bien étonné qu’aucun de mes élèves ne sache répondre.

Les deux points sont placés dans un repère cartésien et leurs coordonnées sont connues. J’ai commencé par dessiner deux points aux tableau. En complétant le dessin, et en faisant de ces deux points des sommets d’un triangle rectangle, cela donne:

Distance2Points

Une fois la figure tracée, une réponse me fut enfin donnée: “Il faut utiliser le théorème de Pythagore”. Exact.

Le calcul

La figure montre clairement que la distance est l’hypoténuse du triangle. D’après la réciproque du théorème de Pythagore:

distance = √(largeur^2 + hauteur^2)

Nous obtenons les largeurs et hauteurs par les coordonnées des points:

largeur = abs(p1.x – p2.x) hauteur = abs(p1.y – p2.y)

Il faut utiliser la fonction valeur absolue abs() parce que p2.x peut très bien être supérieur à p1.x. De même pour les y. Cependant, comme le carré d’un nombre réel est forcément positif, le code fera l’économie de l’appel à cette fonction abs().

Implémentation du calcul de distance

Passons donc au code en langage C:

Quelques remarques sur l’implémentation:

  • on utilise la fonction sqrtf() et non sqrt() pour le calcul de racine carrée. Les fonctions mathématiques de math.h travaillent normalement sur des doubles et non des floats. Les fonctions adaptées aux floats, comme sqrtf() sont plus rapides.
  • on n’utilise surtout pas powf(largeur, 2), pour élever la largeur au carré. Une simple multiplication est très rapide comparée à un appel de fonction, encore plus comparée à cette fonction powf().

Réflexion sur notre métier

En fait, si j’en suis à vous donner ces explications, c’est parce qu’une fois la réponse donnée à mes élèves, l’un d’eux m’a dit: “À quoi bon savoir comment calculer une distance, je vais trouver la fonction toute faite sur le net en deux minutes”. Il me semble que l’argument que je lui ai donné à ce moment était mauvais, à savoir qu’il était important d’avoir une culture générale de l’informatique.

En y réfléchissant, j’ai commencé à programmer à une époque où Internet n’existait pas. Même les rares livres d’informatique ne donnaient pas forcément ce genre d’informations. À l’époque, je n’avais d’autres choix que me creuser la tête ou poser des questions à un prof de math ou de physique, voire parler avec d’autres programmeurs amateurs. L’avantage est que j’ai des connaissances variées, et que je peux revenir aux bases si besoin. Avec suffisamment de temps, peu de choses me paraissent infaisable. L’inconvénient est que j’ai tendance à réinventer la roue: plutôt qu’adopter une bibliothèque toute faite trouvée sur le net, je vais souvent préférer la programmer moi-même; elle sera ainsi plus flexible et plus adaptée à mes besoins, mais l’écrire va me prendre du temps.

Finalement, j’ai tout de même trouvé un bon argument. Voici un cas typique: on clique à la souris, et il faut sélectionner le point le plus proche. Pour ce faire, un algorithme simple consiste à calculer la distance entre tous les points du diagramme et les coordonnées du clic. Or, utiliser la fonction ci-dessus est lent. Une bien meilleure méthode est de comparer non pas les distances, mais les carrés des distances. On élimine ainsi l’appel à la fonction sqrt(), et on gagne énormément de temps! Mon argument est que si on utilise du code sans vraiment le comprendre, alors on n’en connait pas non plus les limites, et on ne peut pas l’adapter à ses besoins.