Choix d'un langage

Avec des critères précis

Le problème exposé dans ce sujet a été résolu.

Salut salut :)

Je continue ma réflexion à propos d'un projet qui me trotte dans la tête (et pour lequel je m'étais renseigné sur le Java). A mesure que ma réflexion avance, je suis de plus en plus en mesure de lister les qualités précises du (ou des) langage que je cherche.

Concrètement, je veux développer une application qui puisse faire les choses suivantes :

  • Communiquer facilement via des API REST (donc où HTTP est bien géré, avec des bibliothèques pour les requêtes/les réponses par exemple)
  • Performant, voire très performant. J'entends par là que toutes les minutes, il y aura un paquet de calculs mathématiques à faire sur un paquet d'entités (plusieurs centaines, voire quelques milliers)
  • Web ou pas, je m'en fiche. Si ce n'est pas un langage qui puisse faire du Web, je veux pouvoir créer des interfaces graphiques assez facilement.
  • Eventuellement cross-platform

Suite à mes recherches, j'ai l'impression que deux choix se dégagent : Java et C++. J'aimerais savoir si vous pouviez confirmer mes recherches, et éventuellement me proposer d'autres voies à explorer. Je précise aussi que je pratique quotidiennement Python, PHP et Javascript. J'ai de très bonnes notions en OO, et aucune en programmation fonctionnelle. Je travaille quasi-exclusivement sous Linux.

J'espère avoir donné assez d'infos, mais n'hésitez pas s'il en manque ;)

Merci d'avance et à plus !

+0 -0

Est-ce qu'un mix de plusieurs langages ne pourrais pas être une bonne solution? Il serait tout à fait faisable d'utiliser C++ pour les performances et un langage plus haut niveau (genre javascript avec node.js) pour les parties plus complexes (web, api et autres).

L'interface entre les deux dépendra pas mal de ce dont tu as besoin exactement. La chose la plus importante sera de limiter les allez-retours entre les deux langages pour éviter d'annuler les gains de performances induits par le C++.

Java et C++ semblent répondre a tes besoins

Mixer 2 langages quand on en connait aucun des 2, c'est deux fois plus de boulot d'apprentissage. Pas sur que ce soit une bonne idée.

Et si tu ne connais aucun des deux langages, il faut oublier les performances (dans un premier temps). Faut d'abord avoir un programme fonctionnel. 50% du boulot sur le performances sera surtout de ne pas faire de conneries (choix des algos et structure de données).

Bref, choisis celui qui te connais le mieux. Ou qui te semble le moins pire

+0 -0

Est-ce qu'un mix de plusieurs langages ne pourrais pas être une bonne solution? Il serait tout à fait faisable d'utiliser C++ pour les performances et un langage plus haut niveau (genre javascript avec node.js) pour les parties plus complexes (web, api et autres).

L'idée semble intéressante, par contre je n'ai jamais fait des choses de ce genre, donc je ne sais pas trop comment m'y prendre.

Je peux détailler un petit peu plus le fonctionnement si tu veux :

  • Le programme doit récupérer des données provenant d'API boursières externes (toutes les minutes)
  • En moins d'une minute, il doit effectuer plusieurs calculs mathématiques (moyennes mobiles, indicateurs, etc) sur plusieurs centaines de valeurs
  • Il doit alors renvoyer des ordres (achat/vente) à d'autres API

Le tout doit se faire en moins d'une minute car ce sera certainement le temps d'actualisation des cours. Et aussi parce que je pense qu'en moins de temps ce sera difficilement faisable.

Bien sûr il y a des solutions alternatives, comme répartir la charge sur plusieurs machines, etc. Pour l'instant, j'aimerais trouver les solutions les plus adaptées d'un point de vue logiciel uniquement.

Du coup, est-ce que ces infos peuvent te permettre de m'indiquer un peu plus en détail comment je pourrais faire, notamment cette histoire d'interfaçage entre des langages, ce qui me semble assez ardu ^^

Mais dans l'idée, je vois ce que tu veux dire : je récupère les données via un truc relativement orienté Web comme Node, puis je passe ça à C++ qui fait les calculs, et les résultats sont renvoyés à Node.

Mais je me demande vraiment comment on peut faire passer des données d'un langage à l'autre "à chaud" (sans utiliser de stockage comme une BDD, ou peut-être quelque chose comme du Redis en mémoire ?). Merci d'avance de tes éclaircissements :)

Bref, choisis celui qui te connais le mieux. Ou qui te semble le moins pire

J'ai fait un peu de Java en école, j'ai donc des vagues notions dans le langage lui-même. Par contre la POO en elle-même, aucun problème. Pour décider, j'aurais peut-être besoin d'infos sur les différences de perf entre les deux, voir si c'est si énorme que ça. Si vraiment y'a un facteur assez important, je pense que le C++ sera plus adapté. Sinon, en ce qui concerne la communication via API, à ton avis les deux se valent ?

De ce que tu dis, je n'ai vraiment l'impression qu'il soit forcément nécessaire d'utiliser un langage bas niveau. Pour avoir fait pas mal de programmes nécessitant des calculs très intensifs, je peux te dire que même en javascript, tu peux monter sans soucis à plus d'un million d'opérations pas trop complexes dans un temps de l'ordre de la seconde.

Typiquement, si tu as 1000 listes de 100 valeurs chacune, calculer une dizaine d'indicateurs pour chaque liste ne devrait pas se faire en plus de 10 secondes en javascript. D'autant qu'il y a des moyens d'améliorer relativement facilement ces performances en utilisant les tableaux typés ou en faisant du multi-thread.

Autrement, si les API ne sont pas trop complexes, il doit aussi être possible de tout faire en C++ dans trop de problèmes.

Oui, cela ne semble pas être critique (tout dépend des opérations effectuées).

Puisque tu connais Python, tu devrais faire un prototype rapide avec lui. Juste lire les données, faire un calcul complexe (au pire que tu répètes X fois pour estimer la charge) et renvoyer les données.

Tu auras une estimation de ce que tu obtenir comme gain en performance (cela ne devrait pas prendre plus d'une journée pur faire cela)

+0 -0

Bien sûr il y a des solutions alternatives, comme répartir la charge sur plusieurs machines, etc. Pour l'instant, j'aimerais trouver les solutions les plus adaptées d'un point de vue logiciel uniquement.

Pourquoi ?

Du coup, est-ce que ces infos peuvent te permettre de m'indiquer un peu plus en détail comment je pourrais faire, notamment cette histoire d'interfaçage entre des langages, ce qui me semble assez ardu

Typiquement, ce que tu veux faire ici, c'est du Remote Procedure Call (RPC). Tu devrais faire des recherches à ce sujet (puisque tu connais Python, peut-être connais-tu le blog de Sam et Max et le protocole favori du premier : WAMP).

+0 -0

Personnellement j'aurais fais ça en Python :

  • la lib requests rend les requêtes web ultra simple.
  • pour le calcul numérique et scientifique Python est très bien fournit. Avec numpy et scipy tu pourra faire tes calculs plus efficacement qu'en Java et probablement plus rapide qu'avec un code en C++ mal optimisé
  • web ou gui, en Python ça manque pas.
  • c'est cross plateforme

Bonus : tu le connais déjà.

Je suis un grand adepte de Python, c'est pas nouveau. Mais en toute honnêteté ce serait vraiment un bon choix. Python est de plus en plus utilisé par la communauté scientifique, ce n'est pas pour rien : il dispose d'un écosystème ultra efficace pour le calcul et des libs natives pour à peut prêt tout. Surtout pour des trucs aussi simple que ce que tu cherche à faire.

Je l'utiliseau boulot dans ce contexte. On a viré la quasi totalité de notre code en C++ par du Python car beaucoup plus rapide à développer et simple à maintenir avec des perfs comparable. Et on fait des requêtes web + calculs et traitement d'image.

Merci beaucoup à tous pour vos réponses très instructives.

De ce que j'en retiens, c'est qu’apparemment pour les calculs que je veux faire, ça ne semble pas nécessaire d'aller vers un langage un peu plus bas niveau que je connais, et qui risquent d'être longs à apprendre pour optimiser comme il faut.

Du coup je vais suivre vos conseils, et faire ça en Python (au moins le prototype), je verrai si ensuite j'ai besoin d'optimiser.

Et juste pour te répondre plus spécifiquement Vayel, c'est parce que je n'ai pas les moyens immédias de payer plusieurs serveurs si le besoin s'en fait sentir :)

Très sincèrement, en une minute tu as le temps de faire des tonnes de calculs. Mais pour que ça reste efficace, utilise numpy. Sinon tu va faire des boucles et tu auras des perfs moyennes.

PS: je trouve ça méga long une minute de taux de rafraichissement pour ce genre d'app.

Ok je vais regarder numpy, je ne l'ai jamais utilisé (un tuto ou autre particulier à me conseiller ?).

En ce qui concerne le taux de rafraîchissement, ça dépend de deux choses : le type de produit financier, et sa liquidité (par exemple, les devises sont bien plus liquides que les actions) et les frais de commission (qui dépendent du produit financier, et par conséquent qui mettent un certain plancher à ce que tu dois gagner).

(Si tu veux en parler par MP n'hésite pas).

+0 -0

Ok je vais regarder numpy, je ne l'ai jamais utilisé (un tuto ou autre particulier à me conseiller ?).

La doc officiel si tu n'a pas de soucis avec l'anglais. J'ai dans l'idée d'en faire un mais j'ai pas des tonnes de temps.

Pour le reste, c'était plus par curiosité. Je trouve qu'un rafraichissement d'une minute c'est méga long mais en soit ça dépend probablement beaucoup de l'échelle sur laquelle tu travaille.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte