Après cinq ans de programmation professionnelle en Java (et dans une moindre mesure, en Python) et sentant lentement mes études en informatique s'évanouir, j'ai décidé d'élargir mes horizons/utilité générale pour le monde et de faire quelque chose de plus agréable (pour moi). comme j'ai vraiment une influence sur la machine. J'ai choisi d'apprendre la programmation C et Unix car je pense que c'est là que se trouvent la plupart des problèmes les plus intéressants.
Mon objectif final est de pouvoir le faire de manière professionnelle, ne serait-ce que pour le fait que je dois passer 40 à 50 heures par semaine à un travail payant, ce qui pourrait également être le type de codage I veux aller mieux à. Bien sûr, vous n'êtes pas embauché pour faire des choses que vous n'avez jamais faites auparavant, alors pour l'instant, je monte en puissance tout seul.
À cette fin, j’ai commencé avec K & R, qui était une excellente ressource en partie en raison des exercices répartis dans chaque chapitre. Après cela, je suis passé à Systèmes informatiques: le point de vue d'un programmeur , suivi de dix chapitres de Programmation avancée dans l'environnement Unix . Quand j'aurai fini avec ce livre, je lirai Programmation réseau Unix .
Ce qui me manque dans les livres de Stevens, c’est le manque de problèmes de programmation; ils documentent principalement les fonctionnalités et fournissent des exemples, suivis de quelques questions de fin de chapitre. Je pense qu'il serait beaucoup plus avantageux de mettre à profit les connaissances de chaque chapitre à la K & R. Je pourrais écrire un programme de test pour chaque fonction, mais cette méthode est moins souhaitable car (1) je serais probablement moins motivée que si je relevais un défi externe et (2) je ne penserais naturellement qu'à utiliser la fonction. de la manière qui m'est déjà arrivée.
Donc, j'aimerais avoir des recommandations sur la façon de pratiquer. De toute évidence, mon premier choix serait de trouver une ressource qui présente des problèmes de programmation Unix. J'ai également envisagé de trouver et de tenter de contribuer à un projet C open source, mais c'est un peu intimidant, car il serait fastidieux d'apprendre à utiliser le logiciel, puis d'apprendre le code source. Python est le seul projet C open-source auquel je puisse penser que j'utilise régulièrement. Je ne sais pas à quel point il serait facile de se lancer.
Cela dit, je suis ouvert à toutes sortes de suggestions car il y a probablement des choses auxquelles je n'ai même pas pensé.
Réinventez beaucoup des utilitaires Unix de base. La plupart d'entre eux étaient (et sont toujours) écrits en C, ils constituent donc un bon moyen de commencer à apprendre. Selon vos compétences, choisissez des utilitaires plus difficiles ou plus faciles à copier.
Essayez d'écrire votre propre malloc. Vous en apprendrez beaucoup sur Unix et beaucoup de programmation en C.
Google pour les cours de système d'exploitation informatique et faire les projets là-bas. De nombreuses écoles ont ces projets sur des sites Web publics afin que vous puissiez obtenir tout ce dont vous avez besoin. Ici est un lien vers le site de Purdue. Donnez un coup de feu au projet Shell; c'était difficile, mais vraiment éducatif.
Voici quelques publications de stackoverflow traitant des livres de programmation C/Unix. Leur principale prétention à la gloire est une large diffusion vers d’autres ressources.
Pratiquez certains des idiomes (comprenez les tenants et les aboutissants des pointeurs, etc.) et choisissez des projets qui vous aideront. Le troisième élément de la liste a une réponse (avertissement, je l'ai écrit) avec un tas d'idiomes de haut niveau en C où un programme C idiomatique serait différent de Java.
Apprendre à programmer avec XLIB ou Win32 avec C est probablement moins utile, car presque tout le monde est meilleur que pour C et il est généralement beaucoup plus facile d’envelopper un moteur C avec un autre langage - à moins que la vitesse ne vous préoccupe vraiment. Pour commencer, concentrez-vous sur les applications de programmation «systèmes», qui sont les domaines où vous êtes le plus susceptible de tirer un véritable kilométrage de C. Découvrez comment l'interface C de l'un des langages de script tels que Tcl ou Python fonctionne.
L’écriture de codes complexes (par exemple, en séparant des paquets réseau ou en interprétant un protocole) ou d’éléments côté serveur à l’aide de sockets vous mènera directement aux compétences fondamentales du C. Si vous avez quelques-uns des livres WRS, essayez de faire fonctionner les pthreads (IIRC UNP2 contient une grande section sur les pThreads). Pour un contraste, écrivez quelque chose qui utilise des E/S non bloquantes. C’est ce qui fait la force de C et vous obtiendrez une bonne connaissance pratique de C en faisant cela. Parcourez les RFC pour trouver quelques idées de protocoles réseau à mettre en œuvre.
Êtes-vous ouvert aux suggestions de livre? Bien qu'il soit un peu démodé (où "un peu" est peut-être un énorme euphémisme), Maurice Bach est un excellent livre. Il appartient à côté de K & R sur votre bibliothèque.
C'est assez intéressant. Comme nous savons que Unix est conçu en utilisant le langage C, il n’est pas difficile de l’apprendre. Si vous utilisez le système d'exploitation Windows, vous pouvez utiliser une application "Windows services for Unix" pour vous exercer à utiliser vos programmes. Si vous utilisez Unix, nous pouvons utiliser des éditeurs tels que vi .
Vous pouvez essayer de parcourir tous les exemples du livre Outils logiciels (Amazon). Une bonne partie est plutôt piétonne (texte justifié à droite, décompilation, etc.), mais c'est une excellente introduction à la philosophie Unix et à la programmation en C de base.
Écrivez un serveur Web.
Faites-le en multi-thread.
Demandez-lui de supporter un nouveau langage de script que vous développez (à la PHP, etc.)
Autoriser les téléchargements d'utilisateurs authentifiés.
Ecrivez un plugin pour votre outil préféré (c’est-à-dire intégrer avec SVN pour donner une vue Web).
Je recommanderais une chose fortement.
Essayez de réécrire tous les outils de lignes de commande Linux habituels tels que ls, mkdir, cd etc.
Vous allez acquérir beaucoup de connaissances sur la programmation et Linux en même temps.
Choisissez les commandes parmi les plus faciles, dites «temps» et travaillez jusqu'aux commandes les plus compliquées.
Le meilleur moyen de consolider vos apprentissages c'est de le pratiquer. Il suffit donc de choisir un type d’application qui vous intéresse et de commencer à le développer (par exemple, une application simple réseau client/serveur).
Essayez de tester la plupart des API Unix (fichiers, sockets, etc.) pour voir comment elles fonctionnent. Vous pouvez par exemple obtenir un livre de programmation Unix, suivre ses chapitres et tester sur votre application tout ce que vous lisez en créant vos propres fonctions. De cette façon, vous pouvez commencer à développer votre propre bibliothèque de fonctions à utiliser dans d'autres projets.