Un peu de fond
J'ai 28 ans aujourd'hui et je n'ai jamais eu de formation officielle en développement de logiciel, mais j'ai deux diplômes d'études supérieures équivalant à un baccalauréat en relations publiques et à un Executive MBA axé sur la gestion de projet. Je travaille dans ces domaines depuis environ 6 ans et il y a deux ans et demi, j’ai démissionné de mon travail et j’ai décidé de changer de direction.
Après un mois de réflexion, j'ai décidé de commencer à développer en freelance le développement de petits sites Web dans WordPress. J'ai moi-même appris la voie et aujourd'hui, je peux dire que je mène une carrière humble mais réussie, développant des thèmes et des plugins de toutes pièces pour mes clients - la plupart des agences externalisant une partie de leur travail de développeur pour des sites Web de moyenne / grande taille.
Mais parfois, j’ai le sentiment que ne pas avoir suffisamment étudié les mathématiques ou ne pas avoir une compréhension formelle des choses me retient vraiment lorsque je dois faire concurrence ou travailler avec des développeurs plus expérimentés. Je suis constamment à la recherche de moyens d'en apprendre davantage, mais il me semble que je manque des bases.
Malheureusement, passer quatre années de plus en informatique n’est pas une option pour le moment, j’essaie donc d’apprendre tout ce que je peux à partir de livres et de ressources en ligne. Cette méthode ne fera jamais que la NASA m'emploie mais je m'en fiche vraiment pour le moment. Mon objectif est d’abord de passer la barre et de pouvoir me considérer comme un véritable programmeur.
Je passe actuellement mon temps libre à étudier Java pour les programmeurs (pour maîtriser une langue que tout le monde dit est difficile / exigeante), à lire des extraits de Code Complete (pour dénicher les meilleures pratiques) et aussi dans Code: Le langage caché de l'ordinateur Matériel et logiciel (pour comprendre le fonctionnement interne des ordinateurs).
TL; DR
Ma situation actuelle est la suivante: je suis fondamentalement capable d’écrire n’importe quel système complet en PHP (avec l’aide de Google et quelques livres), d’intégrer Ajax, SQL, etc., et peut-être un peu plus lentement que ce qu’attend un développeur expérimenté. en raison de toutes les recherches impliquées.
Mais hier, je me suis retrouvé coincé à essayer de trouver (pas à Google) une solution pour le test FizzBuzz, car je n'avais pas mémorisé l' opérateur de module de if($n1 % $n2 == 0)
méthode .
Que suggéreriez-vous comme un bon moyen de résoudre ce dilemme? Quels sujets / livres devrais-je étudier pour que je puisse résoudre les problèmes plus rapidement et peut-être davantage "à la manière des programmeurs"?
EDIT - Il semble y avoir une certaine confusion quant à ce que je ne savais pas résoudre FizzBuzz.
Peut-être que je ne me suis pas exprimé correctement: je connaissais les étapes nécessaires pour résoudre le problème. Ce que je n'ai pas mémorisé, c'est l'opérateur de module. Le problème était de transposer les mathématiques de base au programme, pas de connaître les mathématiques de base.
J'ai pris le test pour le plaisir, après avoir lu à ce sujet sur Coding Horror . J'ai juste décidé que c'était une bonne ligne de comparaison de base entre moi et les développeurs formés de manière formelle.
Je viens d’utiliser cet exemple pour montrer que le fait de ne pas avoir traité les mathématiques dans un environnement informatique auparavant me fait perdre du temps à rechercher des éléments fondamentaux tels que les opérateurs de module pour pouvoir résoudre des problèmes simples.
I'm basically capable of writing any complete system in PHP (with the help of Google and a few books)
et que vous combinez ceci avec le fait que vous ne le sachiez pasif($n1 % $n2 == 0)
, je m'interroge sur l'exposition que vous avez eue à des choses écrites en PHP. Je pense que la plupart des choses que vous faites vont au-delà d’un simple calcul modulo. Pourriez-vous donner un aperçu de ce que vous pensez pouvoir faire?stuck b/c I didn't memorize %
problème, il est intéressant de noter qu’il existe d’autres moyens de le faire: (en supposant que $ n2! = 0)if (is_int ($n1 / $n2))
ouif (($n1 / $n2) == (int) ($n1 / $n2))
connaître des mots-clés est une chose, et savoir comment exprimer les idées sous-jacentes en l’absence de solution intégrée est: un autre.Réponses:
Dans votre cas, vous êtes autodidacte et avez déjà ce qui semble être une bonne approche d'apprentissage, saine et saine. Encore quelques suggestions ...
C'est en forgeant qu'on devient forgeron
Je pense que vous devriez vous plonger dans des exercices de programmation, tels que:
Prenez même les questions d’examen des universités connues autour de vous ou des compétitions de programmation locales (ou distantes). Prologin , par exemple, nous en avons un bon en France pour les aspirants programmeurs de lycée . Il propose chaque année une bonne série de casse-tête qui vous grattent (probablement uniquement en français, désolé, mais c'est le genre de choses que je veux dire. ).
Pour en savoir plus: Où puis-je trouver des puzzles et des défis en matière de programmation?
Livres classiques et références
Nous pourrions également recommander une très longue liste de livres étonnants , mais je dirais que la réponse zen est qu’il n’existe pas de voie unique vers l’Illumination.
Il serait difficile de vous dire lesquels sont en haut de la liste. Continuez donc à lire une tonne de choses pour apprendre les pièges généraux à éviter et les meilleures pratiques à suivre, comme vous le faites correctement à présent.
Pour plus:
Pousser les limites
Aussi, recherchez un matériau qui gratte la tête, comme:
Ce n’est pas nécessairement à prendre pour exemple des choses à faire de nos jours, mais cela vaut la peine d’essayer de comprendre ce qui se passe là-bas.
Les systèmes de pairs sont motivants
Vous pouvez également vous attarder (et vous impliquer) dans les communautés suivantes pour améliorer vos compétences progressivement en vous confrontant à d'autres.
Éducation à temps partiel
Si vous n'avez ni le temps ni la motivation nécessaire pour suivre un autre cours de 4 ans ou quelque chose de similaire (ce qui peut ne pas être nécessaire ni gratifiant de toute façon et coûteux), vous pouvez envisager de rechercher du matériel pédagogique en ligne. Bien entendu, ceux-ci ne se limitent pas à l'informatique.
Grâce aux efforts initiaux du MIT OpenCourseWare , de nombreuses universités ont emboîté le pas et vous pouvez trouver gratuitement de nombreux supports de cours de niveau universitaire. Ce n'est pas toujours facile de naviguer et de le lire par vous-même, mais certains sont plutôt bien faits. Pour commencer à partir du sol et aller assez haut, songez également à la Khan Academy .
Certains vont un peu plus loin et proposent de véritables cours en ligne gratuits, où vous avez également accès au matériel du cours, mais où ils proposent également des conférences stimulées et des auto-évaluations régulières. Par exemple, visitez Coursera ou Udacity .
La plupart des personnes ci-dessus publient souvent leurs conférences sur Youtube ou iTunesU. Vous pourrez donc trouver beaucoup de matériel si votre soif de connaissances n'a pas déjà été étanchée par tous les liens précédents.
Si vous voulez quelque chose qui offre une expérience plus proche de la "vraie" université, vous pouvez envisager des universités éloignées, ce qui vous permet également de travailler à temps partiel, mais vous oblige à suivre le rythme et à avoir à la fois des auto-évaluations et des finales. examens annuels (parfois sur site), comme avec OpenUniversity et ses variantes internationales.
La passion vous permet de continuer
(et obtenez assez de globes oculaires en regardant votre code pour vous critiquer et avoir différentes perspectives)
Les Français disent:
Continuez à faire ce que vous faites et vous finirez par devenir un expert. Prend du temps et du travail.
Voir aussi J'ai du mal à apprendre pour plus de suggestions.
PS: Bien qu’il s’agisse d’un outil très controversé pour les entretiens et ne permet pas d’identifier de bons candidats, j’utilise souvent FizzBuzz pour au moins éliminer les incroyablement "mauvais". Alors lancez-vous sur cette pratique! :)
la source
Je ne code pas depuis très longtemps (j'ai commencé à apprendre le SQL il y a environ 27 mois et en Perl il y a environ 20 mois), mais la citation ci-dessus ressemble à des propos tenus par d'anciens étudiants:
D'accord, ce dernier était probablement un peu dur ... mais ce que j'essaie de dire, c'est que la résolution de problèmes n'est pas la mémorisation . Si c'était le cas, alors un génie pourrait programmer un ordinateur pour résoudre tous les problèmes, et aucun d'entre nous n'aurait jamais à réfléchir à nouveau (quel monde infernal ce serait ...).
Or, il est vrai que tout effort intellectuel consiste en au moins un peu de mémorisation. En particulier, si vous envisagez de coder en PHP, vous devez comprendre les types de données de base (nombres, chaînes, tableaux), ainsi que les opérations élémentaires que vous pouvez en faire (pour les nombres: addition, soustraction, multiplication, division et module; pour les chaînes: concaténation, sous-chaînes, remplacement et au moins quelques notions d'expressions régulières; pour les tableaux: concaténation, pointage sur des éléments, épissage d'éléments, mise en boucle, éléments de comptage, etc.), ainsi que les structures logiques de base utilisables (déclarations if / then / else, boucles foreach, boucles while, etc.).
Ensuite, lorsque vous rencontrez un problème, utilisez-le pour définir le contexte des outils dont vous avez besoin. Pour FizzBuzz, vous devez savoir quand un nombre est divisible par 3, 5 ou 15. Bon, alors nous avons affaire à des nombres ... quels outils de base nous permettent de dire quand un entier est divisible par un autre? Eh bien, l'opérateur de module. Alors, utilisez ça. (Bien sûr, si votre numéro est
$n
, vous pourriez être chic et voir si le dernier chiffre$n
est 0 ou 5, et / ou si les chiffres$n
correspondent à quelque chose de divisible par 3, mais je m'éloigne du sujet ...) Vous devez faites cela pour chaque nombre compris entre 1 et 100, afin d'éviter de passer par un tunnel carpien, utilisez uneforeach
boucle.Le moral de l'histoire est que si d'un côté vous dites "Je suis fondamentalement capable d'écrire un système complet en PHP" et d'un autre côté, vous ne pouvez pas coder FizzBuzz, alors la première affirmation est incorrecte. Certains de mes anciens étudiants en calcul juraient de tout leur cœur qu'ils comprenaient les concepts, mais ils ne pouvaient tout simplement pas résoudre les problèmes de l'examen ... ou des problèmes de devoirs ... ni des problèmes de quiz. Ils se sont également trompés sur leur compréhension.
Arrêtez de faire des excuses et apprenez les bases.
la source
Vous pensez peut-être que FizzBuzz est un problème de jouet; Quand aurai-je besoin d'utiliser l'opérateur de module dans un programme réel? Mais vraiment, vous l'utilisez tout le temps. Trois exemples courants:
row_number % 2 == 0
) et affichez une couleur pour les lignes paires et une autre pour les lignes impaires.if item_number % N == 0
soit écrite comme l'équivalent (if item_number|divisbleby: N
).if cur_item_number % 50 == 0 then commit_data
.Bien sûr, il y a d'autres façons de faire toutes ces choses. Mais vous pouvez faire du bruit sans utiliser l’opérateur de module ni comparer la division de float à la division de nombre entier. Par exemple, pour FizzBuzz, vous pouvez faire quelque chose comme le pseudo-code suivant.
Pour conclure, si vous voulez être un bon programmeur un jour, ne vous lancez pas dans l'apprentissage d'une langue. Oui, un livre PHP / Java vous permettra d'obtenir les réponses de google / stackoverflow et de programmes à moitié fonctionnels beaucoup plus rapidement que tout le reste. Mais pour être en mesure de savoir écrire des programmes de qualité optimale et de penser comme un programmeur, vous devez vous familiariser avec de vrais livres CS.
Commencez avec un livre CS qui présente un langage de programmation et l’arrière-plan CS, avec le célèbre exemple de Structure et interprétation de programmes informatiques (qui enseignera Scheme - un dialecte Lisp) ou éventuellement quelque chose comme Think Python. Comment penser comme un ordinateur Scientifique (que je n'ai pas lu). Les deux sont gratuits en ligne.
Vous devez éventuellement lire un bon livre d’algorithmes, le meilleur étant Algorithmes du CLRS (non gratuit), bien que ce livre d’algorithmes en ligne gratuitpourrait être un remplacement à faible coût (mais si vous pouvez simplement acheter CLRS). Le livre d'algorithmes vous apprendra comment résoudre des problèmes informatiques et vous présentera diverses structures de données (Tableaux / Listes liées / Heaps / Arbres binaires / B-Trees / HashTables) et d'importants algorithmes que vous devez savoir utiliser de manière optimale. . Vous n'avez pas besoin de mémoriser chaque preuve ni de savoir écrire parfaitement chaque algorithme (que vous utilisiez un segment de Fibonacci); mais vous devriez savoir intuitivement que deux boucles imbriquées sont O (N ^ 2); les types de comparaison sont au mieux O (N lg N), la recherche binaire est O (lg N), peut trouver la médiane dans O (N), pourquoi les bases de données sur disque dur utilisent des arbres B, etc.). Au minimum, une solide connaissance du livre d'algorithmes vous aidera à réussir des entretiens de programmation technique avec Google / Facebook. Lorsque vous lisez des livres de programmation, ne vous contentez pas de parcourir / lire; toi'
Je recommanderais également un livre sur l'ingénierie logicielle (Code Complete ou Pragmatic Programmer) une fois que vous aurez lu le manuel CS et algorithmes, qui expliquera les meilleures pratiques pour écrire du bon code maintenable (noms clairs; commenter juste au besoin). ; conserver le code ensemble; refactoriser si nécessaire; utiliser le contrôle de version; etc.).
la source
Personne ne mémorise cette chose. Vous êtes censé le trouver vous-même. Si vous connaissez l'opérateur de module et que vous savez ce qu'il fait, alors, il est trivial de trouver une solution au problème FizzBuzz.
Je vais m'exprimer et suggérer généralement que le problème est PHP. J'aime dire que Java est le pire langage jamais conçu, et PHP, le pire , car même ses créateurs admettent qu'il n'a jamais été conçu. Il est difficile d’apprendre de bonnes pratiques d’ingénierie logicielle lorsque votre environnement est pratiquement la définition de la façon de ne pas le faire. Et dépendre d'un cadre pour tout faire ne dit pas grand chose.
Java est l’un des langages les plus faciles et les pires qui existent. Il n’a qu’une chose: l’héritage manuel ramassé par les ordures ménagères. Si vos amis ou vos conseillers disent que Java est difficile, trouvez-vous de nouveaux amis. C ++ est un langage difficile qui inclut beaucoup de concepts et que personne ne contestera. Vous pouvez également faire du C #, qui contient au moins des génériques et des lambdas.
Comment allez-vous apprendre à coder, lorsque vos langues ont été conçues et implémentées par des personnes qui ne savent pas coder, et que vous dépendez de cadres pour tout ce que vous faites?
la source
Je pense que vous devez jeter un regard critique sur la raison pour laquelle vous avez échoué à essayer de comprendre FizzBuzz. Alors, supposons que vous vous souveniez qu'un opérateur
$n
vous a dit si c'est divisible par un nombre. Et vous n'avez pas de chance d'oublier ce que c'est. Bien, pourquoi ne tentez-vous pas de le faire autrement? Si vous connaissez le code, vous devriez pouvoir trouver une douzaine d'autres moyens de le faire. Certains d'entre eux peuvent sembler étranges - comme, par exemple, placer tous les multiples de 5 dans un tableau et ensuite vérifier si se$n
trouve parmi eux - et c'est une mauvaise solution, mais ce serait quand même une solution. Cependant, vous dites que vous n'en aviez pas, vous étiez coincé. Cela peut être le symptôme d'un problème plus important.Il y a deux choses dans la programmation que vous devez apprendre.
D'après votre description, on dirait que vous avez commencé avec la première partie, mais qu'il manque quelque peu sur la deuxième partie. Un bon cours de CS aide généralement beaucoup à cela, mais ce n’est pas le seul moyen. Essayer de résoudre différents problèmes et découvrir comment ces problèmes doivent être résolus, en lisant les livres fondamentaux cités ici - tout cela aiderait. Une fois que vous aurez compris l'état d'esprit du programmeur, vous découvrirez que commencer à utiliser un nouveau paquet d'astuces ne posera plus vraiment problème. Vous auriez à google ici et là, bien sûr, mais vous ne serez jamais bloqués.
la source
Vous devenez bon au développement comme vous le faites ailleurs: pratiquez. Il existe un concept intéressant dans le monde de la programmation appelé code kata . Il s’agit essentiellement d’un exercice qui consiste à coder une solution à un problème relativement petit, à analyser ce qui est bon et ce qui est mauvais, à tout éliminer et à le refaire. FizBuzz est un kata à part entière. Alors, faites-le et faites-en plus. Quand vous trouvez des choses qui ne semblent pas très bonnes ou qui ne fonctionnent pas, faites des recherches et soyez minutieux à ce sujet. Posez des questions sur les sites de questions-réponses, lisez des articles et des blogs, voyez comment les autres traitent cela, puis mettez en pratique ce que vous avez appris.
Au cours de cette pratique, vous apprendrez combien de connaissances mathématiques / théoriques supplémentaires vous pourriez avoir besoin. Si vous rencontrez des concepts que vous ne pouvez tout simplement pas comprendre, renseignez-vous sur ces concepts et sur leurs connaissances préalables et décidez au cas par cas si vous souhaitez suivre un cours ou quoi que vous ayez afin d'élargir votre contexte théorique.
la source
J'interprète cela comme voulant dire que vous ne saviez pas et / ou ne vous souveniez pas de l'opérateur de module. Si tel est le cas, vous devez commencer par examiner les constructions de langage dans le langage que vous utilisez. Passez en revue tout ce que vous «ne connaissez pas froid» et apprenez tout ce que vous ne connaissez pas.
la source
Continuez à coder, continuez à apprendre. Finalement, avec suffisamment de dévouement, vous regarderez FizzBuzz et vous vous demanderez pourquoi vous avez même dû y penser. De nombreuses entreprises répondent très tôt à une question de style FizzBuzz. Par conséquent, si vous échouez une fois, vous avez au moins appris quelque chose sur le processus d'embauche.
Continuez simplement à écrire du code, à proposer des idées de projets et à effectuer des recherches.
la source
Puis-je recommander l'apprentissage de JavaScript avant Java, C ++? Raisons pour vous:
Ressources gratuites pour débutants
http://www.codecademy.com/tracks/code-year
https://stackoverflow.com/tags/javascript/info
J'avais environ 10 liens supplémentaires, mais SE ne me laissera pas les poster avant d'avoir atteint 10 rep.
L'apprentissage de C ++, de Java, etc. est également utile, mais pas mon humble avis n'a pas d'impact global sur la programmation Web, contrairement à JS, car vous pouvez l'utiliser à la fois en amont et en aval. S'amuser!
la source
Vous pouvez trouver et aider les autres, par exemple en donnant.code (divulgation: mon site) ou Code for America ou autre. C'est un excellent moyen de mieux connaître les problèmes de création de pages Web autres que PHP et de vous sentir bien aussi.
Lorsque vous avez un problème à résoudre - ou que vous aidez à résoudre, ou simplement à comprendre -, le ramassage du code se fait naturellement. Avoir un objectif est le meilleur moyen d'apprendre quelque chose.
la source
Donc, vous ne pouviez pas résoudre le problème FizzBuzz. Grosse affaire. Maintenant vous pouvez le faire, et je parie que vous n'oublierez jamais toutes les mille façons de procéder. Essayez de ne pas être aussi pressé de vous faire passer pour un mauvais programmeur, simplement parce que vous ne pouvez pas résoudre un seul problème stupide par la tête.
C'est un problème. L'autre est que vous semblez vous sentir un peu en retard sur la courbe d'apprentissage de la programmation. Comme d'autres l'ont dit, continuez à coder et à lire. Plus vous en ferez, mieux vous irez. C'est aussi simple que ça. Commencez par ce que vous croyez être le plus gros trou de votre arrière-plan et procédez ensuite.
la source
Je ne pense pas que je refuserais de recommander quelqu'un à embaucher, car ils ne savaient pas que c'était l'opérateur de module à condition que:
Ce n'est pas toujours (bien que d'habitude)%, et certaines langues sont étranges. Et bon sang, après une décennie, je ne peux honnêtement pas dire que je connais tous les opérateurs perl (et que fait-on encore du vaisseau spatial?) Et que je ne me souviens pas toujours parfaitement des opérateurs bitwise. Cela fait quelques années que j'ai fait quelque chose qui en aurait même besoin.
Ce qui pourrait me faire hésiter à recommander quelqu'un, ce serait si cela leur causait une attaque de panique après avoir raté cette question / ce test. Cela pourrait me donner l'impression qu'ils étaient un peu trop verts (à moins que ce soit un poste très débutant). Personne n'a besoin de quelqu'un qui (ou ressent le besoin de) mémoriser ces choses. Vous avez besoin de quelqu'un qui comprend des concepts beaucoup plus larges. Personne ne s'en souciera si vous le consultez sur Google, mais vous devrez être sûr, dans l'interview, que connaître% n'est pas grave et que vous savez également utiliser "opérateur" comme mot clé lorsque vous faites une recherche rapide sur Google. chercher.
En outre, il ne s'agit que d'une idée ... mais si votre collège communautaire local propose un programme compsci, vos autres crédits seront tous transférés et vous n'aurez probablement besoin que d'environ 20 crédits pour le programme de deux ans. Pourrait presque finir cela en un semestre. Ils vous demanderaient de suivre un cours sur les structures de données et, espérons-le, des algorithmes… pourraient vous rendre plus fort.
la source
Voici un exemple de cours: http://www.ox.ac.uk/admissions/undergraduate_courses/courses/computer_science/computer_science_.html
Je suggère de lire en premier lieu la programmation suivante: Programmation orientée objet (très courante, utilisée partout, c’est là que java entre en jeu) Concurrence (pour écrire des programmes java qui ne se plantent pas mystérieusement dans le monde réel, en savoir plus sur les blocages) Concepts de base de données (La plupart des applications ont besoin de sauvegarder des données, la théorie est importante ici) Paradigmes de programmation (lisez au moins un langage non-oops, de préférence fonctionnel, pour élargir votre réflexion et apprendre de nouvelles choses)
Quand je regarde les quatre années d’enseignement des sciences informatiques, pour être honnête, je pense qu’il n’ya qu’une poignée de cours à prendre au sérieux.
Les structures de données et les algorithmes (et vous avez besoin de mathématiques ici pour être vraiment bons et être pris au sérieux par les autres programmeurs), les réseaux informatiques et les systèmes d'exploitation sont les plus importants. D'autres sujets traitant du code de niveau inférieur, comme pouvoir coder en assemblage, ne sont sans doute pas si importants pour vous. L'ingénierie logicielle et les tests vous exposent à des concepts utiles que vous pouvez comprendre avec le temps.
Il suffit de télécharger un pdf qui explique ces concepts de manière intuitive et vous serez sur votre chemin.
Dans certains cours de sciences informatiques, du moins dans le mien, la première année est une introduction à tous les domaines de l’ingénierie, tels que la mécanique, l’électricité, le génie civil, etc. Il y a beaucoup de calculs compliqués, cela peut être pertinent ou non. pour la plupart des programmeurs d'applications aujourd'hui. Ainsi, beaucoup d’ingénieurs d’aujourd’hui n’ont en réalité que trois ans d’enseignement scientifique en informatique (espérons que cela vous fera vous sentir mieux :)
Point crucial de la réponse: vous pouvez prendre le temps d’étudier tous les jours, par exemple environ une heure, et de devenir au fil du temps un très bon programmeur. Continuez simplement à apprendre. Et n'oubliez pas d'écrire du code tous les jours.
la source
Pour moi, ma stratégie est que je n’attaque que le problème qui est pertinent pour ce que je travaille. Donc, mon conseil est que vous n’avez pas à tout apprendre, lisez simplement les choses qui sont pertinentes pour ce que vous travaillez, parce que si vous essayez de tout apprendre en même temps, il y a une tendance à être prosterné et à finir par détester la programmation.
Paix
la source