Je dois concilier ces 2 faits:
Quelques antécédents: j'ai plus de 10 ans d'expérience en programmation sous Windows (presque exclusivement C/C++, mais aussi certains .NET), j'étais un utilisateur de FreeBSD à la maison pendant environ 3 ans (puis j'ai dû revenir à Windows), et je n'ai jamais eu beaucoup de chance avec Linux. Et maintenant, je dois développer un logiciel pour Linux. J'ai besoin d'un plan.
Sur Windows, vous pouvez vous en tirer en connaissant simplement un langage de programmation, une API contre laquelle vous codez, votre IDE (VisualStudio) et quelques outils très basiques pour le dépannage (Depends, ProcessExplorer, DebugView, WinDbg) .Tout le reste vient naturellement.
Sous Linux, c'est une histoire très différente. Comment diable saurais-je ce que DLL (désolé, objet partagé) se chargerait, si je me connecte à celui-ci à partir du plugin Firefox? Quel est l'équivalent Linux d'insérer __asm int 3/DebugBreak () dans le source et exécution du programme, puis laisser le système d'exploitation appeler un débogueur.Pourquoi les versions de l'enfer utilisent quelque chose, appelé appLoader, tandis que les versions de débogage fonctionnent d'une manière ou d'une autre? Le pire: comment provisionner l'environnement de développement Linux?
Donc, compte tenu du fait que la haine est généralement associée à un manque de connaissances, que recommanderiez-vous? Je suis d'accord avec Emacs et GCC. J'ai besoin de me former en tant qu'administrateur/utilisateur Linux et j'ai besoin d'apprendre les outils de dépannage appropriés (strace est cool, btw), équivalents à ceux que j'ai mentionnés ci-dessus.
Dois-je faire Linux à partir de zéro? Ou dois-je simplement lire quelques livres (j'ai lu "Environnement de programmation UNIX" par Kernighan et "Programmation avancée ..." par Stevens, mais j'ai besoin d'apprendre quelque chose de plus pratique)? Ou dois-je avoir une distribution Linux sur mon ordinateur personnel?
Vous pourriez trouver l'article Liaison dynamique sous Linux et Windows intéressant qui explique comment chaque système d'exploitation fait la liaison dynamique. L'article Chemins de recherche de bibliothèque partagée explique comment les bibliothèques sont trouvées. Aussi Bibliothèques Linux statiques, dynamiques partagées et chargeables est très bon. Une bonne chose à propos des bibliothèques Linux est qu'elles ont un meilleur support pour le contrôle de version et avoir plusieurs versions d'une bibliothèque autour de Windows (AFAIK, je ne fais pas Windows). Voir Versionnement de l'interface de bibliothèque sous Solaris et Linux pour cela. Ces articles devraient vraiment vous couvrir de bibliothèques.
Le GDB est très puissant, une bonne introduction est probablement Tutoriel gdb de RMS . Vous voudrez peut-être lire les points d'arrêt conditionnels. Pour les équivalents de __asm(int 3)
voir la question Définir le point d'arrêt en code C ou C++ par programmation pour gdb sous Linux .
Le livre Advanced Unix Programming de Marc Rochkind est un IMHO à lire absolument. A beaucoup d'exemples et couvre tous les sujets POSIX/SUS d'une manière très bien expliquée. C'est le meilleur livre sur ce sujet que j'ai lu jusqu'à présent.
Mais pour vous faciliter la vie, je recommande en fait d'utiliser une API de haut niveau qui résume des choses pour vous, comme Qt. Facilite également l'écriture multiplateforme.
Faire Linux From Scratch vous aide à comprendre comment un système Linux est composé, mais je pense que cela n'améliore pas beaucoup vos connaissances à ce sujet du point de vue des développeurs. Cela vous rend plus à l'aise avec Linux, car vous apprenez quelles parties sont là dans un environnement Linux (et en partie aussi pourquoi ). Un Linux ne sera pas une grosse boîte noire pour vous après avoir travaillé sur Linux From Scratch.
Si vous aimez strace
, n'oubliez pas ltrace
: l'équivalent pour les appels de bibliothèque.
Aussi, oui, je recommande Linux From Scratch . C'est un bon exercice pour déterminer les éléments essentiels du système d'exploitation et comment ils s'emboîtent.
Pour un traitement de référence de programmation système moderne et complet, je recommanderais de choisir The Linux Programming Interface .
Le Mac OS X est comme une Mercedes; c'est le plus joli et le plus propre mais ça coûte cher. Windows est comme une Toyota; il vous y amènera et reviendra.
Linux est comme un hot rod; C'est aux gens de creuser, de démonter et de remonter. Linux n'est pas pour quelqu'un qui veut simplement utiliser l'ordinateur; c'est pour les gens qui aiment les ordinateurs. Les personnes qui n'aiment pas les ordinateurs devraient s'en tenir éloignées.
Ce que vous avez appris dans Windows ne se traduira pas très bien, non. Mais vous pouvez voir les composants internes et regarder le moteur tourner.
Essayez de prendre Linux comme un nouveau jouet, avec lequel vous pouvez jouer et explorer et voir ce qui se passe. Les choses faciles sous Windows sont plus difficiles sous Linux; des choses impossibles sous Windows sont possibles sous Linux.
Si vous aimez les ordinateurs, vous pouvez aimer Linux; si vous n'aimez pas les ordinateurs, pourquoi programmez-vous du tout?
Et si vous développiez sur Mono avec Monodevelop? Cela vous permettrait de démarrer assez facilement en réutilisant votre expérience dans .NET.
C'est intimidant lorsque vous le regardez depuis le début (tout comme si vous étiez un développeur Linux chargé de faire du développement Windows). Je m'attaquerais à ce seul problème à la fois.
Plus important encore, laissez toutes vos opinions subjectives à la porte. Et non, vous n'avez pas besoin d'être un gourou pour développer sous Linux, j'en sais assez pour me déplacer, et pas tout - mais je suis à l'aise avec ça ...
Je pense que vous avez répondu à votre question dans la question:
"Sous Windows, vous pouvez vous en sortir en connaissant simplement un langage de programmation, une API contre laquelle vous codez, votre IDE (VisualStudio) et quelques outils de base pour le dépannage (Depends, ProcessExplorer, DebugView , WinDbg). Tout le reste vient naturellement. "
Gues quoi, sur Linux, vous pouvez vous en tirer en connaissant simplement un langage de programmation, une API (ou un couple), votre IDE (Eclipse ou NetBeans, même Geany, Emacs ou vim, si vous comme) et quelques outils de base pour le dépannage (gdb, outils de traçage, lint, htop, ps).
Vous avez beaucoup de connaissances investies dans l'écosystème de programmation Windows. Une grande partie de cela est (espérons-le) une connaissance abstraite (qu'est-ce qu'un compilateur, un débogueur, une bibliothèque partagée, un processus, un thread? Que font-ils?) Qui se traduira facilement, une fois que vous serez familiarisé avec les différents outils. Certains sont spécifiques au domaine (Qu'est-ce DLL est lié lorsque j'ajoute X à un projet?), Mais même passer d'une classe de langue à une autre dans Windows nécessiterait un nouvel apprentissage.
Installez Ubuntu ou Fedora dans une machine virtuelle, lisez quelques tutoriels C++ Hello World dans Eclipse ou NetBeans, et quelques débogages dans les tutoriels Eclipse/NetBeans, et laissez la capacité naturelle de votre cerveau à s'adapter prendre le dessus. Cela traduira des idées pour vous si vous vous détendez et que vous les mettez simplement à exécution.
The success or failure of many thing in life comes down to our attitude, looking for positives and keeping your mind focused on the positives will do more to adide you as you start down this new interesting adventure.
Combien de temps vous a-t-il fallu pour devenir compétent dans le travail dans un environnement Windows. Vous pourriez dire que c'était facile de commencer. Mais vous avez déjà travaillé quelques années avec Windows. Depuis combien de temps utilisiez-vous Windows avant d'écrire votre premier programme. Cela faisait 8 ans pour moi, même si j'utilise Linux presque exclusivement depuis 5 ans. Je maîtrise maintenant mieux Linux que Windows. Vous devez vous donner au moins autant de temps pour vous familiariser avec un nouveau système.
Commencez avec la liste des applications que vous ne pouvez pas vivre avec dans Windows et recherchez des alternatives dans le monde * nix. http://alternativeto.net/ et les autres sections de lecture de Wikipedia peuvent être utiles ici.
Voici une liste de logiciels alternatifs qui pourraient s'avérer très utiles. Voici quelques alternatives aux choses que vous avez mentionnées.
Autres ressources utiles pour passer d'un système à un autre
Pour devenir un meilleur utilisateur avec pouvoir ou administrateur, jetez un œil à ces ressources
Il semble également que cela fait un moment que vous n'avez pas regardé le monde * nix. Je recommanderais certaines des nouvelles versions de distributions de Fedora , suse , debian , ou mon poste de travail préféré bunt .
Vous pouvez maintenant probablement vous en sortir sans connaître les composants internes du système et juste les bases comme dans Windows. Je n'essaierais pas simplement de m'en tirer avec le minimum. Si vous voyez Linux comme un outil qui vous assiste réellement dans votre développement et non simplement un système d'exploitation dans lequel vous le développez, ce serait utile.
Linux From Scratch sera beaucoup plus important si vous développez spécifiquement pour Linux est un sens très spécifique et technique. C'EST À DIRE. vous souhaitez développer pour le noyau ou porter votre programme sur un super ordinateur exécutant Linux. Ce serait néanmoins très utile. Je pense que vous pourriez probablement laisser cela pendant quelques mois pendant que vous essayez de vous lancer dans Ubuntu. Ubuntu sera aussi proche des choses qui fonctionnent du monde mac et windows.
J'ai appris Unix en général en lisant les pages de manuel. Vous devriez au moins les parcourir. Oui, je veux dire tous. La méthode que je l'utilise pour cd dans les répertoires des pages de manuel, et les attaquer une section à la fois.
J'utilise ceci:
for i in *; do f=`basename $i .gz`; man `basename $f .1` ; done
... en remplaçant le . 1 par le numéro de la section que vous lisez, .2, .3, etc. Appuyez sur ctrl-Z ctrl-C pour sortir de la boucle. Votre kilométrage peut varier si votre distribution Linux stocke les choses différemment, c'est-à-dire pas sous cmdname.1.gz.
Parcourez simplement les descriptions, et plus si c'est quelque chose d'intéressant. Les sections 1, 2 et 3 sont les plus importantes pour un programmeur. 1 couvre les commandes utilisateur générales, qui incluent vos outils de compilation et divers utilitaires de criminalistique. 2 correspond aux appels système et 3 correspond aux appels de bibliothèque.
Ne vous forcez pas à faire quelque chose que vous n'aimez pas. Utilisez Windows comme environnement de développement, écrivez un code portable, compilez-le de manière croisée pour Linux et ne le testez qu'occasionnellement sur une machine virtuelle.
J'étais l'un des deux chargés de quelque chose de similaire, mais différent. Je travaille dans un district scolaire de la maternelle à la 12e année et le système d'entreprise (RH, finances, etc.) migre d'une base de données HP3000/TurboImage vers une plate-forme Linux/MS SQL. Je suis à l'aise avec le côté MS SQL. Mais pas du côté Linux. Nous sommes tous les deux du côté administrateur, pas du côté programmation. La programmation se fait à l'extérieur - application d'entreprise tierce pour les organisations K-12.
J'ai suivi un cours d'introduction à Linux (Redhat) pendant 5 week-ends le week-end - se faisait principalement en mode ligne de commande - et cela valait le temps pour moi en tant que début rapide de la manière Linux de faire les choses. Évidemment YMMV selon la classe/l'enseignant.
Vous avez mentionné "Le pire de tous: comment approvisionner un environnement de développement Linux?"? Puisque vous êtes déjà très familier avec Windows, je vous suggère fortement d'obtenir une copie de vmWare Workstation. Avec cela, vous pouvez garder Windows comme poste de travail et installer Linux comme systèmes invités - supprimer, rincer et répéter au besoin. Lorsque vous obtenez une bonne configuration, je pense que vous pouvez la prendre en photo, mais je ne peux pas dire avec certitude quelles versions sont capables de prendre la photo en photo. Et si vous suivez la route vmWare Workstation pour activer plusieurs configurations de développement - augmentez la mémoire, certainement.
Cela ne me dérange pas non plus de recommander l'utilisation de CentOS comme système d'exploitation Linux pour les invités. D'après ce que je comprends, c'est comme RedHat sans la marque et/ou l'argumentaire de vente et/ou les frais de support. Je ne connais pas les autres versions de Linux, donc je ne peux pas donner leur avis sur celles-ci.
Greg
Je ne suis pas sûr que cela fonctionne pour les plates-formes, mais pour les langages de programmation, j'ai trouvé utile de réfléchir à la façon dont je me suis familiarisé avec ceux avec lesquels je suis bon et d'essayer de rejouer ces expériences et activités pour ce que je ' m essayant d'apprendre.
Peut-être quelque chose sur ces lignes?
D'une manière générale cependant, mon intérêt et ma confiance envers GNU/Linux sont venus par le fait qu'il est beaucoup plus bricolable (et nécessitant de bricoler au début) que Windows. J'avais besoin de jouer avec beaucoup de choses pour faire fonctionner les choses et cela m'a aidé à apprendre beaucoup de choses. Les choses vont beaucoup mieux maintenant, mais toutes ces heures ont aidé.
Considérez ceci: vous ne saviez rien de Windows, mais vous l'avez appris et avec le temps, vous vous êtes familiarisé avec lui.
Ensuite, MS a changé le système de programmation avec lequel vous étiez à l'aise en .NET et vous ne saviez plus rien sur DLLS, COM, et quoi que ce soit, vous avez dû apprendre des choses comme les assemblys, GAC, les domaines d'application. Vous les avez bien appris.
Alors pourquoi vous inquiétez-vous maintenant de faire de même avec Linux?
Il existe de nombreux didacticiels de mise en route sur le Web pour toutes sortes d'environnements de programmation. Maintenant vous dites GCC donc je vais supposer le développement C++. Procurez-vous Eclipse, installez le CDT (outils de développement c) au-dessus de votre plate-forme Eclipse (Eclipse est un IDE polyvalent, vous pouvez l'utiliser pour C++ , PHP, Java, peu importe - mais vous devez installer les outils pour votre langue car vous ne voudriez pas vraiment que tout soit préinstallé comme VS et que l'installation prenne 3 jours :))
Il existe des didacticiels faciles à utiliser sur tout le Web. IBM en a un ici qui est assez complet.
Outils de débogage ... Eclipse l'a intégré ( tutoriel ), mais vous pouvez trouver de nombreux outils comme ceux que vous avez mentionnés, recherchez simplement sur le Web et vous trouverez de nombreuses options. Il vous faudra un peu de temps pour comprendre comment lire un vidage de mémoire (par opposition à un vidage d'utilisateur Windows par exemple), mais vous y arriverez.
Il peut également être utile de démarrer un blog avec vos expériences, non seulement cela vous permettra de vous rappeler ce que vous avez fait (par exemple, configurer Eclipse comme vous l'aimez, vous oublierez quand vous devrez le refaire dans un mais cela va aider les autres dans votre situation.
J'aime les deux plates-formes et pour toutes les différences dans l'interface utilisateur et l'écosystème de développement, je les trouve plus similaires que différentes sous couvert. En fait, pour la plupart des concepts Windows, vous pouvez trouver des équivalents Linux simplement en recherchant sur Internet.
Cela dit, je suggère fortement d'apprendre à faire les choses à la "manière Unix". Utilisez la ligne de commande plutôt que les frontaux de l'interface graphique boguée (je parle principalement de gdb ici); ne cherchez pas un IDE et apprenez à utiliser un ensemble d'outils spécialisés à la place. Choisissez un bon éditeur (pointant vers vim) et apprenez-le bien. Découvrez comment make
fonctionne même si vous ne prévoyez pas de devenir un expert. Peut-être que vous pouvez même aimer Linux. Il est convivial pour les geek et amusant à jouer avec.
Je ne pense pas que vous ayez besoin de faire Linux from Scratch. Si j'étais vous, j'irais pour Ubuntu. Il est plus confortable et étant basé sur Debian, il y a beaucoup de matériel technique disponible.
Si vous voulez plus d'une plongée tête première dans Linux, Gentoo est une bonne option. Il vous oblige à lire beaucoup sur la configuration et les noyaux, mais il vous donne également un système assez fonctionnel pour travailler en af
La première question que je poserais est: qu'est-ce que vous voulez développer? S'il s'agit d'une application gui, cela peut être différent d'avoir à écrire quelque chose comme une extension du noyau.
Dans le cas d'une application gui, je trouve que la méthode la plus simple est d'utiliser Qt, qui a son propre environnement de développement (Qt-Creator) et étant multiplateforme, vous permet d'apprendre une seule API qui peut être utilisée pour Windows/Linux/OSX et même le développement mobile. Comme Visual Studio dans Windows, ou XCode dans OSX, vous pouvez créer et mettre en page des fenêtres et des éléments à partir d'un éditeur graphique et l'API est très facile à récupérer avec de nombreux exemples d'applications.
Si vous avez besoin d'obtenir plus de bas niveau, une fois que vous vous familiarisez avec linux sur la ligne de commande, savez comment parcourir les répertoires, manipuler les fichiers, comprendre les autorisations, etc., puis commencez à lire comment compiler un programme simple avec gcc, comment lier des fichiers et exécuter l'exécutable, puis comment déboguer avec gdb.
Alternativement, si cela semble un peu intimidant, vous pouvez télécharger Eclipse ou un autre IDE, mais vous deviendrez probablement beaucoup plus à l'aise avec Linux à long terme, si vous mettez d'abord le temps et l'effort dans la ligne de commande.
Google "L'art de la programmation Unix" et lisez-le. OMI, votre principale difficulté est la philosophie différente, et ce livre est une excellente lecture pour cela.
Il vous présente également des différences non évidentes mais techniquement très importantes entre * n * x et les systèmes Windows - celles-ci étant essentielles pour comprendre pourquoi faire les choses d'une autre manière est logique sous Linux.