{"action":"created","comment":{"url":"https://api.github.com/repos/lewagon/www-sinatra/pulls/comments/26663619","id":26663619,"diff_hunk":"@@ -0,0 +1,69 @@\n+---\n+layout: post\n+title: \"Pourquoi apprendre à coder en Ruby ?\"\n+thumbnail: pourquoi-ruby-sebastien-saunier.jpg\n+author: cedric\n+labels:\n+  - Startup\n+  - Misc\n+description: Pourquoi apprendre à coder en Ruby ? Question récurrente posée par de nombreux entrepreneurs  désireux d’apprendre à coder, nous vous proposons une liste de 7 points clés explicitant ce parti pris.\n+---\n+\n+Pourquoi apprendre à coder en Ruby ? Question récurrente posée par de nombreux entrepreneurs  désireux d’apprendre à coder, nous vous proposons une liste de 7 points clés explicitant ce parti pris.\n+\n+![Pourquoi apprendre à coder en Ruby ?](blog_image_path pourquoi-ruby-sebastien-saunier.jpg)\n+\n+\n+###Un language accessible\n+\n+Une des premières choses agréable avec Ruby repose sur le langage en lui-même. La syntaxe est simple, proche de la langue anglaise. Son aspect dynamiquement typé le rend peu verbeux et très souple. Il ouvre la voie à la **meta-programmation** de manière unique. Intellectuellement, c’est un plaisir de structurer sa pensée et d'écrire du code dans ce langage.\n+\n+\n+###Un *tool set* minimal\n+\n+Une fois le [setup](https://github.com/lewagon/setup) et la [config](https://github.com/lewagon/dotfiles) de votre machine opérationnel, le *tool set* associé à Ruby on Rails est le plus simple qui soit : un éditeur de texte, un terminal et un navigateur. Aucun temps et écran de chargement lorsque vous mettez votre code à jour. Votre ordi respire. Vous aussi.\n+\n+\n+###Une flexibilité extraordinaire\n+\n+Rails est un *framework*, c'est-à-dire un cadre dans lequel le développeur doit s'inscrire. Il s’agit également d’un outil unique et parfaitement adapté aux développement d'applications web. Pour une startup, aller vite, pivoter, itérer, changer d’avis, scaler, faire et défaire fait partie du quotidien. Rails offre une flexibilité extraordinaire pour encaisser sans broncher tous ces changements.\n+\n+Quel que soit le domaine dans lequel vous souhaitez vous investir, votre besoin sera généralement le suivant : une base de données, un *front* (la partie visible de votre application) et un *back-end* (le code côté serveur). La réunification et l’agencement sans douleur de ces trois éléments sont définitivement le *sweet spot* de Rails.\n+\n+###Un apprentissage et une collaboration simplifiés\n+\n+Rails repose sur le principe de ***Convention over Configuration***. L'architecture des dossiers de votre code est normalisée, et rendue obligatoire par le framework. Il existe donc le ***rails way***. Ce dernier permet à un développeur Rails de prendre en main en seulement quelques heures n'importe quelle application, même s'il n'en a pas codé une ligne, et ainsi d’en faciliter la collaboration et l’apprentissage.\n+\n+Cet aspect peut décontenancer les développeurs venant d'un langage plus verbeux, qui vont souvent se demander où se trouve le code. Il faut se faire à cette abstraction. Une fois les conventions internalisées, la vitesse de développement d'une nouvelle fonctionnalité est alors extraordinaire.\n+\n+\n+###La force de sa communauté\n+\n+Rails est une *gem*, c'est à dire un module open-source, développé et maintenue depuis plus de 10 ans par des [milliers de développeurs](https://github.com/rails/rails/graphs/contributors). Il existe  en supplément des [milliers de *gems*](https://rubygems.org/), d'ailleurs nous vous en avions présenté [25 récemment](http://www.lewagon.org/blog/25-gems-indispensables-pour-debuter-une-application-rails). Ainsi, lorsqu'une nouvelle fonctionnalité est à développer, dans 90% des cas le travail peu être réalisé rapidement en se basant sur un module existant.\n+\n+La communauté Ruby a une culture d'ouverture et de partage depuis ses débuts. Le code est sur GitHub, si il manque quelque chose dans une gem, aucun soucis, il suffit de *forker* et d'ajouter soi-même la fonctionnalité pour son propre produit. Libre à vous d’ensuite faire une **pull request** au projet initial pour partager ce développement avec la communauté (give back). Cet esprit est formidable, sur le plan éthique / moral mais aussi économique, car les développeurs ruby ne **réinventent pas la roue** et intègrent au mieux ces **briques** existantes afin de se concentrer sur **les besoins business** des utilisateurs / clients.\n+\n+###Une skill reconnue dans le milieu Startup…\n+\n+Si il est vrai que dans le monde *corporate* des languages comme Java et C# restent les rois, Ruby de son côté est souvent plébiscité par le milieu startup. De nombreuses startups devenues de grand succès du web ont commencé et continuent avec Rails (GitHub, Twitter, Basecamp, Shopify…) et quelques alumni du Wagon ont d’ailleurs trouvé [des postes de junior developer](http://www.lewagon.org/blog/portrait-developpeur-sebastien-ferre) sur Paris.\n+\n+###…qui fait sens au sein d’une stack complète\n+\n+Turing nous a montré que tous les langages sont équivalents en terme d'expressivité, ce qui veut dire qu'une fois que vous savez programmer dans un langage, vous savez programmer dans tous les langages. Le plus dur reste d'acquérir le *mindset* de programmeur.\n+\n+Par la suite, si un job vous demande de coder dans un autre langage, après une semaine intensive à fond dessus vous ferez rapidement l'analogie syntaxique entre votre langage préféré et ce nouveau. Dans les faits il vous faudra au minimum maîtriser une stack plus complète :\n+\n+**HTML & CSS** : ce ne sont pas des langages de programmation, mais de représentation de la donnée. C'est ce que le navigateur sait lire pour pouvoir afficher une page web (contenu et style)\n+**JavaScript** : c'est le langage de programmation que connaît le navigateur, qui permet de rendre les pages dynamiques. Par exemple, sur Gmail, les nouveaux emails apparaissent automatiquement sans rafraîchir la page, et c'est grâce à JavaScript (et AJAX plus précisément)\n+**GitHub Flow** : il est toujours pertinent de versionner et d'utiliser git, même si on est seul. C'est un formidable outil et [GitHub l'a sublimé](http://scottchacon.com/2011/08/31/github-flow.html) en apportant au dessus une couche sociale ainsi que des outils de collaboration formidables.\n+**SQL** : c'est le langage de requête utilisé pour parler avec une base de donnée comme PostgreSQL. Une application web présente des données à l'utilisateur, et permet de les modifier (par exemple, Facebook affiche des posts dans un feed, et vous permet d'en créer de nouveaux), et c'est le rôle de la base de données de stocker tout cela.\n+**Ruby** : le language executé côté serveur (on parle de backend, par opposition au frontend composé de HTML/CSS/JavaScript), pour pouvoir utiliser Rails.\n+\n+L’ensemble de ces concepts sont abordés et intégrés lors du programme full-stack du Wagon et c’est incroyable de voir les étudiants emmagasiner en 9 semaines ce que j'ai mis des années à acquérir. Les profils entrepreneurs des élèves du Wagon amènent une grande diversité dans les projets, et challengent en permanence les compétences techniques du staff. Rafraîchissant !\n+Sans parler des [résultats bluffants](http://www.lewagon.org/blog/alumni-wagon-projets-partie-2) !\n+\n+*Let's build our world!*\n+\n+\n+Sebastien Saunier","path":"posts/2015-03-16-pourquoi-ruby-sebastien-saunier.md","position":68,"original_position":68,"commit_id":"a5da2e2b01b800c45c6912138900c9a13bee7819","original_commit_id":"a5da2e2b01b800c45c6912138900c9a13bee7819","user":{"login":"ssaunier","id":414418,"avatar_url":"https://avatars.githubusercontent.com/u/414418?v=3","gravatar_id":"","url":"https://api.github.com/users/ssaunier","html_url":"https://github.com/ssaunier","followers_url":"https://api.github.com/users/ssaunier/followers","following_url":"https://api.github.com/users/ssaunier/following{/other_user}","gists_url":"https://api.github.com/users/ssaunier/gists{/gist_id}","starred_url":"https://api.github.com/users/ssaunier/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ssaunier/subscriptions","organizations_url":"https://api.github.com/users/ssaunier/orgs","repos_url":"https://api.github.com/users/ssaunier/repos","events_url":"https://api.github.com/users/ssaunier/events{/privacy}","received_events_url":"https://api.github.com/users/ssaunier/received_events","type":"User","site_admin":false},"body":"S**é**bastien","created_at":"2015-03-18T13:50:15Z","updated_at":"2015-03-18T13:50:15Z","html_url":"https://github.com/lewagon/www-sinatra/pull/152#discussion_r26663619","pull_request_url":"https://api.github.com/repos/lewagon/www-sinatra/pulls/152","_links":{"self":{"href":"https://api.github.com/repos/lewagon/www-sinatra/pulls/comments/26663619"},"html":{"href":"https://github.com/lewagon/www-sinatra/pull/152#discussion_r26663619"},"pull_request":{"href":"https://api.github.com/repos/lewagon/www-sinatra/pulls/152"}}},"pull_request":{"url":"https://api.github.com/repos/lewagon/www-sinatra/pulls/152","id":30952043,"html_url":"https://github.com/lewagon/www-sinatra/pull/152","diff_url":"https://github.com/lewagon/www-sinatra/pull/152.diff","patch_url":"https://github.com/lewagon/www-sinatra/pull/152.patch","issue_url":"https://api.github.com/repos/lewagon/www-sinatra/issues/152","number":152,"state":"open","locked":false,"title":"Pourquoi Ruby v1","user":{"login":"cedricmenteau","id":6224412,"avatar_url":"https://avatars.githubusercontent.com/u/6224412?v=3","gravatar_id":"","url":"https://api.github.com/users/cedricmenteau","html_url":"https://github.com/cedricmenteau","followers_url":"https://api.github.com/users/cedricmenteau/followers","following_url":"https://api.github.com/users/cedricmenteau/following{/other_user}","gists_url":"https://api.github.com/users/cedricmenteau/gists{/gist_id}","starred_url":"https://api.github.com/users/cedricmenteau/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cedricmenteau/subscriptions","organizations_url":"https://api.github.com/users/cedricmenteau/orgs","repos_url":"https://api.github.com/users/cedricmenteau/repos","events_url":"https://api.github.com/users/cedricmenteau/events{/privacy}","received_events_url":"https://api.github.com/users/cedricmenteau/received_events","type":"User","site_admin":false},"body":"@ssaunier J'ai commencé la mise en page & illustration. Je me demande si on ne devrait pas cuter la partie personnelle et juste tourner ça comme ton manifeste Ruby & ses vertus pédagogiques au sein du Wagon ?","created_at":"2015-03-11T15:09:52Z","updated_at":"2015-03-18T13:50:15Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8d9ad73373ec31a9f40a31df8c75d0df0ea46f84","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/lewagon/www-sinatra/pulls/152/commits","review_comments_url":"https://api.github.com/repos/lewagon/www-sinatra/pulls/152/comments","review_comment_url":"https://api.github.com/repos/lewagon/www-sinatra/pulls/comments{/number}","comments_url":"https://api.github.com/repos/lewagon/www-sinatra/issues/152/comments","statuses_url":"https://api.github.com/repos/lewagon/www-sinatra/statuses/a5da2e2b01b800c45c6912138900c9a13bee7819","head":{"label":"lewagon:pourquoi-ruby-sebastien-saunier","ref":"pourquoi-ruby-sebastien-saunier","sha":"a5da2e2b01b800c45c6912138900c9a13bee7819","user":{"login":"lewagon","id":5470001,"avatar_url":"https://avatars.githubusercontent.com/u/5470001?v=3","gravatar_id":"","url":"https://api.github.com/users/lewagon","html_url":"https://github.com/lewagon","followers_url":"https://api.github.com/users/lewagon/followers","following_url":"https://api.github.com/users/lewagon/following{/other_user}","gists_url":"https://api.github.com/users/lewagon/gists{/gist_id}","starred_url":"https://api.github.com/users/lewagon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lewagon/subscriptions","organizations_url":"https://api.github.com/users/lewagon/orgs","repos_url":"https://api.github.com/users/lewagon/repos","events_url":"https://api.github.com/users/lewagon/events{/privacy}","received_events_url":"https://api.github.com/users/lewagon/received_events","type":"Organization","site_admin":false},"repo":{"id":21740933,"name":"www-sinatra","full_name":"lewagon/www-sinatra","owner":{"login":"lewagon","id":5470001,"avatar_url":"https://avatars.githubusercontent.com/u/5470001?v=3","gravatar_id":"","url":"https://api.github.com/users/lewagon","html_url":"https://github.com/lewagon","followers_url":"https://api.github.com/users/lewagon/followers","following_url":"https://api.github.com/users/lewagon/following{/other_user}","gists_url":"https://api.github.com/users/lewagon/gists{/gist_id}","starred_url":"https://api.github.com/users/lewagon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lewagon/subscriptions","organizations_url":"https://api.github.com/users/lewagon/orgs","repos_url":"https://api.github.com/users/lewagon/repos","events_url":"https://api.github.com/users/lewagon/events{/privacy}","received_events_url":"https://api.github.com/users/lewagon/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/lewagon/www-sinatra","description":"The French innovative coding school for entrepreneurs","fork":false,"url":"https://api.github.com/repos/lewagon/www-sinatra","forks_url":"https://api.github.com/repos/lewagon/www-sinatra/forks","keys_url":"https://api.github.com/repos/lewagon/www-sinatra/keys{/key_id}","collaborators_url":"https://api.github.com/repos/lewagon/www-sinatra/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/lewagon/www-sinatra/teams","hooks_url":"https://api.github.com/repos/lewagon/www-sinatra/hooks","issue_events_url":"https://api.github.com/repos/lewagon/www-sinatra/issues/events{/number}","events_url":"https://api.github.com/repos/lewagon/www-sinatra/events","assignees_url":"https://api.github.com/repos/lewagon/www-sinatra/assignees{/user}","branches_url":"https://api.github.com/repos/lewagon/www-sinatra/branches{/branch}","tags_url":"https://api.github.com/repos/lewagon/www-sinatra/tags","blobs_url":"https://api.github.com/repos/lewagon/www-sinatra/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/lewagon/www-sinatra/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/lewagon/www-sinatra/git/refs{/sha}","trees_url":"https://api.github.com/repos/lewagon/www-sinatra/git/trees{/sha}","statuses_url":"https://api.github.com/repos/lewagon/www-sinatra/statuses/{sha}","languages_url":"https://api.github.com/repos/lewagon/www-sinatra/languages","stargazers_url":"https://api.github.com/repos/lewagon/www-sinatra/stargazers","contributors_url":"https://api.github.com/repos/lewagon/www-sinatra/contributors","subscribers_url":"https://api.github.com/repos/lewagon/www-sinatra/subscribers","subscription_url":"https://api.github.com/repos/lewagon/www-sinatra/subscription","commits_url":"https://api.github.com/repos/lewagon/www-sinatra/commits{/sha}","git_commits_url":"https://api.github.com/repos/lewagon/www-sinatra/git/commits{/sha}","comments_url":"https://api.github.com/repos/lewagon/www-sinatra/comments{/number}","issue_comment_url":"https://api.github.com/repos/lewagon/www-sinatra/issues/comments{/number}","contents_url":"https://api.github.com/repos/lewagon/www-sinatra/contents/{+path}","compare_url":"https://api.github.com/repos/lewagon/www-sinatra/compare/{base}...{head}","merges_url":"https://api.github.com/repos/lewagon/www-sinatra/merges","archive_url":"https://api.github.com/repos/lewagon/www-sinatra/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/lewagon/www-sinatra/downloads","issues_url":"https://api.github.com/repos/lewagon/www-sinatra/issues{/number}","pulls_url":"https://api.github.com/repos/lewagon/www-sinatra/pulls{/number}","milestones_url":"https://api.github.com/repos/lewagon/www-sinatra/milestones{/number}","notifications_url":"https://api.github.com/repos/lewagon/www-sinatra/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/lewagon/www-sinatra/labels{/name}","releases_url":"https://api.github.com/repos/lewagon/www-sinatra/releases{/id}","created_at":"2014-07-11T15:17:15Z","updated_at":"2015-03-18T09:39:52Z","pushed_at":"2015-03-18T13:38:27Z","git_url":"git://github.com/lewagon/www-sinatra.git","ssh_url":"git@github.com:lewagon/www-sinatra.git","clone_url":"https://github.com/lewagon/www-sinatra.git","svn_url":"https://github.com/lewagon/www-sinatra","homepage":"http://www.lewagon.org/en","size":105527,"stargazers_count":1,"watchers_count":1,"language":"CSS","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":6,"mirror_url":null,"open_issues_count":3,"forks":6,"open_issues":3,"watchers":1,"default_branch":"master"}},"base":{"label":"lewagon:master","ref":"master","sha":"dddf5d9c81ae74e196653af3699057a62591e803","user":{"login":"lewagon","id":5470001,"avatar_url":"https://avatars.githubusercontent.com/u/5470001?v=3","gravatar_id":"","url":"https://api.github.com/users/lewagon","html_url":"https://github.com/lewagon","followers_url":"https://api.github.com/users/lewagon/followers","following_url":"https://api.github.com/users/lewagon/following{/other_user}","gists_url":"https://api.github.com/users/lewagon/gists{/gist_id}","starred_url":"https://api.github.com/users/lewagon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lewagon/subscriptions","organizations_url":"https://api.github.com/users/lewagon/orgs","repos_url":"https://api.github.com/users/lewagon/repos","events_url":"https://api.github.com/users/lewagon/events{/privacy}","received_events_url":"https://api.github.com/users/lewagon/received_events","type":"Organization","site_admin":false},"repo":{"id":21740933,"name":"www-sinatra","full_name":"lewagon/www-sinatra","owner":{"login":"lewagon","id":5470001,"avatar_url":"https://avatars.githubusercontent.com/u/5470001?v=3","gravatar_id":"","url":"https://api.github.com/users/lewagon","html_url":"https://github.com/lewagon","followers_url":"https://api.github.com/users/lewagon/followers","following_url":"https://api.github.com/users/lewagon/following{/other_user}","gists_url":"https://api.github.com/users/lewagon/gists{/gist_id}","starred_url":"https://api.github.com/users/lewagon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lewagon/subscriptions","organizations_url":"https://api.github.com/users/lewagon/orgs","repos_url":"https://api.github.com/users/lewagon/repos","events_url":"https://api.github.com/users/lewagon/events{/privacy}","received_events_url":"https://api.github.com/users/lewagon/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/lewagon/www-sinatra","description":"The French innovative coding school for entrepreneurs","fork":false,"url":"https://api.github.com/repos/lewagon/www-sinatra","forks_url":"https://api.github.com/repos/lewagon/www-sinatra/forks","keys_url":"https://api.github.com/repos/lewagon/www-sinatra/keys{/key_id}","collaborators_url":"https://api.github.com/repos/lewagon/www-sinatra/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/lewagon/www-sinatra/teams","hooks_url":"https://api.github.com/repos/lewagon/www-sinatra/hooks","issue_events_url":"https://api.github.com/repos/lewagon/www-sinatra/issues/events{/number}","events_url":"https://api.github.com/repos/lewagon/www-sinatra/events","assignees_url":"https://api.github.com/repos/lewagon/www-sinatra/assignees{/user}","branches_url":"https://api.github.com/repos/lewagon/www-sinatra/branches{/branch}","tags_url":"https://api.github.com/repos/lewagon/www-sinatra/tags","blobs_url":"https://api.github.com/repos/lewagon/www-sinatra/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/lewagon/www-sinatra/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/lewagon/www-sinatra/git/refs{/sha}","trees_url":"https://api.github.com/repos/lewagon/www-sinatra/git/trees{/sha}","statuses_url":"https://api.github.com/repos/lewagon/www-sinatra/statuses/{sha}","languages_url":"https://api.github.com/repos/lewagon/www-sinatra/languages","stargazers_url":"https://api.github.com/repos/lewagon/www-sinatra/stargazers","contributors_url":"https://api.github.com/repos/lewagon/www-sinatra/contributors","subscribers_url":"https://api.github.com/repos/lewagon/www-sinatra/subscribers","subscription_url":"https://api.github.com/repos/lewagon/www-sinatra/subscription","commits_url":"https://api.github.com/repos/lewagon/www-sinatra/commits{/sha}","git_commits_url":"https://api.github.com/repos/lewagon/www-sinatra/git/commits{/sha}","comments_url":"https://api.github.com/repos/lewagon/www-sinatra/comments{/number}","issue_comment_url":"https://api.github.com/repos/lewagon/www-sinatra/issues/comments{/number}","contents_url":"https://api.github.com/repos/lewagon/www-sinatra/contents/{+path}","compare_url":"https://api.github.com/repos/lewagon/www-sinatra/compare/{base}...{head}","merges_url":"https://api.github.com/repos/lewagon/www-sinatra/merges","archive_url":"https://api.github.com/repos/lewagon/www-sinatra/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/lewagon/www-sinatra/downloads","issues_url":"https://api.github.com/repos/lewagon/www-sinatra/issues{/number}","pulls_url":"https://api.github.com/repos/lewagon/www-sinatra/pulls{/number}","milestones_url":"https://api.github.com/repos/lewagon/www-sinatra/milestones{/number}","notifications_url":"https://api.github.com/repos/lewagon/www-sinatra/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/lewagon/www-sinatra/labels{/name}","releases_url":"https://api.github.com/repos/lewagon/www-sinatra/releases{/id}","created_at":"2014-07-11T15:17:15Z","updated_at":"2015-03-18T09:39:52Z","pushed_at":"2015-03-18T13:38:27Z","git_url":"git://github.com/lewagon/www-sinatra.git","ssh_url":"git@github.com:lewagon/www-sinatra.git","clone_url":"https://github.com/lewagon/www-sinatra.git","svn_url":"https://github.com/lewagon/www-sinatra","homepage":"http://www.lewagon.org/en","size":105527,"stargazers_count":1,"watchers_count":1,"language":"CSS","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":6,"mirror_url":null,"open_issues_count":3,"forks":6,"open_issues":3,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/lewagon/www-sinatra/pulls/152"},"html":{"href":"https://github.com/lewagon/www-sinatra/pull/152"},"issue":{"href":"https://api.github.com/repos/lewagon/www-sinatra/issues/152"},"comments":{"href":"https://api.github.com/repos/lewagon/www-sinatra/issues/152/comments"},"review_comments":{"href":"https://api.github.com/repos/lewagon/www-sinatra/pulls/152/comments"},"review_comment":{"href":"https://api.github.com/repos/lewagon/www-sinatra/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/lewagon/www-sinatra/pulls/152/commits"},"statuses":{"href":"https://api.github.com/repos/lewagon/www-sinatra/statuses/a5da2e2b01b800c45c6912138900c9a13bee7819"}}}}