J'ai 28 ans aujourd'hui, et je n'ai jamais eu de formation formelle en développement de logiciels, mais j'ai deux diplômes d'enseignement supérieur équivalant à un baccalauréat en relations publiques et un MBA exécutif axé sur la gestion de projet. J'ai travaillé dans ces domaines pendant environ 6 ans au total et il y a 2,5 ans, j'ai quitté/perdu mon emploi 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 de petits sites Web dans WordPress. J'ai appris par moi-même et aujourd'hui je peux dire que je mène une carrière humble mais réussie en développant des thèmes et des plugins à partir de zéro pour mes clients - principalement des agences externalisant une partie de leur travail de développement pour des sites Web de moyenne/grande taille.
Mais parfois, je pense simplement que le fait de ne pas avoir étudié suffisamment de mathématiques ou de ne pas avoir une compréhension formelle des choses me retient vraiment quand je dois rivaliser ou travailler avec des développeurs plus expérimentés. Je suis constamment à la recherche de moyens pour en savoir plus, mais il me semble manquer les bases.
Malheureusement, passer 4 ans de plus en informatique n'est pas une option pour le moment, donc j'essaie d'apprendre tout ce que je peux à partir de livres et de ressources en ligne. Cette méthode ne me fera jamais employer par la NASA, mais je m'en fiche vraiment en ce moment. Mon objectif est d'abord de passer la barre et de pouvoir m'appeler un vrai programmeur.
Je passe actuellement mon temps libre à étudier Java For Programmers (pour obtenir une langue que tout le monde dit être difficile/exigeant), lire des extraits de Code Complete (pour obtenir des meilleures pratiques) et aussi Code: Le langage caché du matériel informatique et des logiciels (pour saisir le fonctionnement interne des ordinateurs).
TL; DR
Donc, 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 de quelques livres), en intégrant Ajax, SQL et ainsi de suite, et peut-être un peu plus lent qu'un développeur expérimenté ne s'y attendrait en raison de toutes les recherches impliquées.
Mais j'étais coincé hier à essayer de trouver (pas Google) une solution pour le test FizzBuzz parce que je n'avais pas la if($n1 % $n2 == 0)
méthode opérateur de module mémorisé.
Que suggéreriez-vous comme un bon moyen de résoudre ce dilemme? Quels sujets/livres devrais-je étudier qui me permettraient de résoudre les problèmes plus rapidement et peut-être plus "à la manière des programmeurs"?
[~ # ~] edit [~ # ~] - Il semble qu'il y ait eu une certaine confusion sur ce que je ne savais pas pour résoudre FizzBuzz.
Je ne me suis peut-être 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 fait le test pour le plaisir, après avoir lu à ce sujet sur CodingHorror . J'ai juste décidé que c'était une bonne comparaison de base entre moi et les développeurs formellement formés.
Je viens de l'utiliser comme un exemple de la façon dont le fait de ne pas avoir traité les mathématiques dans un environnement informatique auparavant me fait perdre du temps à rechercher des choses de base comme les opérateurs de module pour pouvoir résoudre des problèmes simples.
Dans votre cas, comme vous êtes autodidacte et que vous avez déjà ce qui semble être une bonne approche d'apprentissage saine et sans BS. Encore quelques suggestions ...
Je pense que vous devriez plonger dans des exercices de programmation, comme:
Prenez même les dernières questions d'examen des universités connues autour de vous, ou des compétitions de programmation locales (ou à distance). Par exemple, nous en avons un de Nice en France pour les aspirants programmeurs de lycée qui s'appelle Prologin , et il fournit chaque année une bonne série de puzzles à gratter la tête (probablement en français seulement, 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 de programmation?
Nous pourrions également recommander une très longue liste de incroyablelivres , mais je dirais que la réponse zen est qu'il n'y a pas de bonne voie unique vers les Lumières.
Il serait difficile de vous dire lesquels sont en tête de 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 maintenant.
Pour en savoir plus:
Recherchez également du matériel qui gratte la tête, comme:
Pas nécessairement à prendre comme exemple de choses à faire de nos jours, mais cela vaut la peine d'essayer de comprendre ce qui se passe là-dedans.
Vous pouvez également vouloir rôder (et vous impliquer) dans les communautés suivantes pour améliorer progressivement vos compétences en étant confronté aux autres.
Si vous n'avez pas le temps ou la motivation pour vous engager dans un autre cours de 4 ans ou quelque chose de similaire (qui peut même ne pas être nécessaire ou gratifiant de toute façon et coûteux), vous pourriez envisager de rechercher du matériel pédagogique en ligne. Bien sûr, ceux-ci ne se limitent pas à l'informatique.
Grâce à l'effort original MIT OpenCourseWare , il y a maintenant des tonnes d'universités qui 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 de zéro et aller assez haut, pensez également à regarder la Khan Academy .
Certains vont un peu plus loin et proposent gratuitement de véritables cours en ligne, où vous avez également accès au matériel du cours, mais où ils offrent également des cours rythmés et des auto-évaluations régulières. Par exemple, visitez Coursera ou dacity .
La plupart des publications ci-dessus publient souvent leurs conférences sur Youtube ou iTunesU, vous trouverez donc beaucoup de matériel si votre soif de connaissances n'était pas déjà é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, qui vous permettent également de travailler à temps partiel, mais vous obligent à suivre le rythme, à avoir à la fois des auto-évaluations et des examens de l'année (parfois sur place), comme avec le OpenUniversity et ses variantes internationales.
(et obtenez suffisamment de globes oculaires en regardant votre code pour vous critiquer et avoir différentes perspectives)
Les Français disent:
C'est en forgeant que l'on devient forgeron.
Continuez à faire ce que vous faites et vous finirez par devenir un expert. Prend du temps et du travail.
Voir aussi J'ai des problèmes d'apprentissage pour plus de suggestions.
PS: Bien que ce soit un outil très controversé pour les entretiens et qu'il n'aide pas à identifier les bons candidats, j'utilise souvent FizzBuzz pour éliminer au minimum les incroyablement "mauvais". Alors lancez-vous sur cette chose pratique! :)
I didn't have the if($n1 % $n2 == 0) method memorized.
Je n'ai pas codé depuis très longtemps (j'ai commencé à m'enseigner SQL il y a environ 27 mois et j'ai commencé à coder en Perl il y a environ 20 mois), mais la citation ci-dessus ressemble à certaines choses que j'ai entendues d'anciens étudiants:
Comment suis-je censé mémoriser la technique d'intégration à utiliser pour chaque problème?
Je n'ai pas mémorisé si je devais ajouter ou multiplier les probabilités, ou utiliser "n choisir k" ou utiliser des factorielles.
Attends une minute! Vous avez dit que x équivalait à 2 hier! Maintenant, c'est égal à zéro?!
D'accord, ce dernier était probablement un peu dur ... mais le point que j'essaie de faire 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 de nous n'aurait jamais à réfléchir à nouveau (quel monde infernal ce serait ...).
Maintenant, il est vrai que toute entreprise intellectuelle consiste au moins en un peu de mémorisation. En particulier, si vous allez coder en PHP, vous devez comprendre les types de données de base (nombres, chaînes, tableaux), les choses de base que vous pouvez faire avec eux (pour les nombres: addition, soustraction, multiplication, division et module; pour les chaînes: concaténation, sous-chaînes, remplacement et au moins une certaine connaissance des expressions régulières; pour les tableaux: concaténation, virement de bord sur les éléments, épissage d'éléments, bouclage, comptage d'éléments, etc.), et les structures logiques de base que l'on peut utiliser (instructions if/then/else, boucles foreach, boucles while, etc.).
Ensuite, lorsque vous rencontrez un problème, utilisez-le pour fournir le contexte des outils dont vous avez besoin. Pour FizzBuzz, vous devez dire quand un nombre est divisible par 3, 5 ou 15. D'accord, nous avons donc 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 avoir envie de voir si le dernier chiffre de $n
est 0 ou 5, et/ou si les chiffres de $n
additionne à quelque chose de divisible par 3, mais je m'écarte ...) Vous devez le faire pour chaque nombre entre 1 et 100, donc pour éviter d'avoir un tunnel carpel, utilisez une boucle foreach
.
Le moral de l'histoire est que si d'une part vous dites "je suis fondamentalement capable d'écrire n'importe quel système complet en PHP" et d'autre part vous ne pouvez pas coder FizzBuzz, alors la première affirmation est incorrecte. Certains de mes anciens étudiants en calcul ont juré de haut en bas qu'ils comprenaient les concepts, mais ils ne pouvaient tout simplement pas faire les problèmes à l'examen ... ou les problèmes de devoirs ... ou les problèmes de quiz. Ils se trompaient également sur leur compréhension.
Arrêtez de faire des excuses et apprenez les bases.
Vous pensez peut-être que FizzBuzz est un problème de jouets; quand aurai-je besoin d'utiliser l'opérateur de module dans un vrai programme. Mais vous l'utilisez vraiment tout le temps. Trois exemples courants:
row_number % 2 == 0
) et afficher une couleur pour les lignes paires et une pour les lignes impaires.if item_number % N == 0
a été écrit comme équivalent (if item_number|divisbleby: N
).if cur_item_number % 50 == 0 then commit_data
.Bien sûr, il existe d'autres façons de faire toutes ces choses. Mais vous pouvez faire un buzz sans utiliser l'opérateur de module ou comparer la division flottante à la division entière. Par exemple, pour FizzBuzz, vous pouvez faire quelque chose comme le pseudo-code suivant.
div_by_3_rem = 0
div_by_5_rem = 0
for(i = 0; i< 50; i++) {
if(div_by_3_rem == 0 && div_by_5_rem == 0) {
print "FizzBuzz"
} Elif(div_by_3_rem == 0) {
print "Fizz"
} Elif(div_by_5_rem == 0) {
print "Buzz"
} else {
print i
}
div_by_3_rem += 1
div_by_5_rem += 1
if(div_by_3_rem == 3) {
div_by_3_rem = 0
}
if(div_by_5_rem == 5) {
div_by_5_rem = 0
}
}
Pour conclure, si vous voulez devenir un grand programmeur un jour, ne vous lancez pas dans l'apprentissage des livres de langue. Oui, un livre PHP/Java vous permettra d'obtenir des réponses de Google/stackoverflow et des programmes à moitié fonctionnels beaucoup plus rapidement que toute autre chose. Mais pour être en mesure de savoir comment écrire des programmes optimaux de qualité et penser comme un programmeur, vous avez besoin d'une certaine exposition à 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 des programmes informatiques (qui enseignera Scheme - un dialecte LISP) ou peut-être quelque chose d'autre comme - Pensez Python Comment penser comme un informaticien (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 de CLRS (non gratuit), bien que ce livre en ligne gratuit livre d'algorithmes pourrait être un remplacement à faible coût (bien que si vous pouvez simplement acheter CLRS). Le livre sur les algorithmes vous apprendra comment résoudre les problèmes informatiques et vous présentera une variété de structures de données (tableaux/listes liées/tas/arbres binaires/arbres B/tables de hachage) et des algorithmes importants que vous devez savoir utiliser de manière optimale . Vous n'avez pas besoin de mémoriser chaque preuve ou de savoir comment écrire parfaitement chaque algorithme (qui utilise un tas de Fibonacci); mais vous devriez intuitivement savoir que deux boucles imbriquées est O (N ^ 2); les sortes 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 de disques durs utilisent des B-Trees, etc.). Au minimum, une solide connaissance du livre d'algorithmes vous aidera à réussir les entretiens de programmation technique de la variété google/facebook. Lorsque vous lisez des livres de programmation, ne vous contentez pas de parcourir/lire; vous apprendrez beaucoup mieux si vous travaillez/codez à travers des exemples et des problèmes, et réfléchissez activement à la logique.
Je recommanderais également un livre sur l'ingénierie logicielle (Code Complete ou Pragmatic Programmer) après avoir parcouru le livre CS et les algorithmes, qui enseignera les meilleures pratiques pour écrire un bon code qui est maintenable (noms clairs; commentez juste lorsque cela est nécessaire) ; garder le code ensemble; refactoriser si nécessaire; utiliser le contrôle de version; etc.).
Mais j'étais coincé hier à essayer de trouver (pas google) une solution pour le test FizzBuzz parce que je n'avais pas la méthode if ($ n1% $ n2 == 0) mémorisée.
Personne ne mémorise cette chose. Vous êtes censé le faire vous-même. Si vous connaissez l'opérateur de module et que vous savez ce qu'il fait, alors c'est un excellent ajustement au problème FizzBuzz.
Je vais sortir sur un membre ici 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 est le pire langage jamais , car même ses créateurs admettent qu'il n'a jamais été conçu. C'est difficile 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 veut pas dire beaucoup.
Je passe actuellement mon temps libre à étudier Java Pour les programmeurs (pour maîtriser un langage que tout le monde dit difficile/exigeant)
Java est l'un des langages les plus simples et les plus mauvais qui existe. Il n'a qu'une chose: l'héritage manuel récupéré. Si vos amis ou conseillers disent que Java est difficile, alors trouvez de nouveaux amis. C++ est un langage difficile qui comprend beaucoup de concepts, et que personne ne contestera. Vous pouvez aussi faire du C #, qui a au moins quelques génériques et lambdas.
Comment allez-vous apprendre à coder, lorsque vos langages ont été conçus et mis en œuvre par des personnes qui ne savent pas coder, et que vous dépendez de frameworks pour tout ce que vous faites?
Je pense que vous devez regarder attentivement pourquoi vous avez été bloqué en essayant de comprendre FizzBuzz. Supposons donc que vous vous souveniez qu'il existe un opérateur qui donne $n
vous indique s'il est divisible par un nombre. Et vous n'avez pas de chance d'oublier ce que c'est. Très bien, pourquoi ne tentez-vous pas de le faire autrement? Si vous savez quelque chose sur le code, vous devriez pouvoir trouver une douzaine d'autres façons de le faire. Certains d'entre eux peuvent sembler étranges - comme, par exemple, mettre chaque multiple de 5 dans un tableau puis vérifier si $n
en fait partie - 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 simplement 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 vous, la description semble avoir commencé avec la première partie, mais quelque peu manquante dans la deuxième partie. Un bon cours CS aide généralement beaucoup, mais ce n'est pas le seul moyen. Essayer de résoudre différents problèmes et lire comment ces problèmes doivent être résolus, en lisant les livres fondamentaux cités ici - tout cela pourrait aider. Une fois que vous aurez l'état d'esprit du programmeur, vous découvrirez que l'utilisation d'un nouveau sac de trucs ne sera pas un gros problème. Il faudrait bien sûr aller sur Google ici et là, mais vous ne serez jamais bloqués.
Vous devenez bon en développement de la même façon que vous devenez bon en toute autre chose: la pratique. Il existe un concept sympa dans le monde de la programmation appelé code kata . Il s'agit essentiellement d'un exercice où vous codez une solution à un problème relativement petit, analysez ce qui est bon et ce qui est mauvais, supprimez tout et recommencez. FizBuzz est un kata à part entière. Alors, faites-le et faites-en plus. Lorsque vous trouvez des choses qui ne semblent pas très bonnes ou qui ne fonctionnent tout simplement pas, faites des recherches et approfondissez-les. Posez des questions sur les sites de questions/réponses, lisez des articles et des blogs, voyez comment les autres gèrent 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 dont vous pourriez avoir besoin. Si vous tombez sur des concepts que vous ne pouvez tout simplement pas comprendre, alors lisez-les et leurs connaissances préalables et décidez au cas par cas si vous souhaitez suivre un cours ou quoi que ce soit d'autre afin d'élargir votre contexte théorique.
... parce que je n'ai pas mémorisé la méthode if ($ n1% $ n2 == 0).
J'interprète cela comme signifiant que vous ne connaissiez pas et/ou ne vous souveniez pas de l'opérateur de module. Si tel est le cas, le point de départ est de revoir les constructions de langage dans la langue que vous utilisez. Passez en revue tout ce que vous ne savez pas froid et apprenez tout ce que vous ne savez pas.
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. Beaucoup d'entreprises posent une question de style FizzBuzz au tout début de leurs entretiens, donc échouer une fois signifie que vous avez au moins appris quelque chose sur le processus d'embauche.
Continuez simplement à écrire du code, à trouver des idées de projets et à faire des recherches.
Puis-je recommander d'apprendre JavaScript avant Java, C++? Raisons pour vous:
http://www.codecademy.com/tracks/code-year
https://stackoverflow.com/tags/javascript/info
J'avais environ 10 autres liens, mais SE ne me laissera pas les publier avant d'avoir atteint 10 rep.
L'apprentissage de C++, Java, etc. est également utile, mais pas à mon humble avis n'a pas l'impact global sur la programmation Web comme le fait JS, puisque vous pouvez l'utiliser à la fois sur le front et le back-end. S'amuser!
Vous pourriez trouver et aider les autres, par exemple give.code (divulgation: mon site) ou Code for America ou autre chose. C'est un excellent moyen d'obtenir plus d'exposition aux problèmes de création de pages Web non PHP et de se sentir bien aussi.
Lorsque vous avez un problème à résoudre - ou à aider à résoudre, ou simplement à comprendre - la récupération du code se fait naturellement en cours de route. Avoir un objectif est la meilleure façon d'apprendre quelque chose.
Je ne pense pas que je refuserais de recommander quelqu'un à embaucher parce qu'il ne savait pas que c'était l'opérateur du module à condition que:
Ce n'est pas toujours (bien que généralement)%, et certaines langues sont étranges. Et l'enfer, après une décennie, je ne peux pas honnêtement dire que je connais tous les opérateurs Perl (et qu'est-ce que le vaisseau spatial fait à nouveau?), Je ne me souviens pas toujours parfaitement des opérateurs au niveau du bit. Cela fait quelques années que je n'ai rien fait qui en aurait même besoin.
Ce qui pourrait me faire hésiter à recommander quelqu'un serait si cela leur faisait avoir une attaque de panique pour avoir manqué cette question/test. Cela pourrait me donner l'impression qu'ils étaient un peu trop verts (à moins que ce ne soit un poste très débutant). Personne n'a besoin de quelqu'un qui mémorise (ou en ressent le besoin). Vous avez besoin de quelqu'un qui comprend des concepts beaucoup plus larges. Personne ne s'en souciera si vous recherchez cela sur google, mais vous devrez être confiant dans l'interview que connaître% n'était pas une grosse affaire et aussi que vous savez utiliser "opérateur" comme mot-clé lorsque vous faites un google rapide chercher.
De plus, ce n'est qu'une idée ... mais si votre collège communautaire local a un programme compsci, vos autres crédits seraient tous transférés, et vous n'auriez probablement besoin que d'environ 20 crédits pour le diplôme de 2 ans. Pourrait presque terminer cela dans un semestre. Ils vous feraient suivre un cours sur les structures de données, et j'espère aussi que les algorithmes ... pourraient vous rendre un peu plus fort.
Vous ne pouvez donc pas résoudre le problème FizzBuzz. Grosse affaire. Maintenant vous pouvez, et je parie que vous n'oublierez jamais toutes les myriades de façons. Essayez de ne pas être si impatient de vous qualifier de mauvais programmeur simplement parce que vous ne pouvez pas résoudre un problème stupide du haut de votre tête.
Voilà un problème. L'autre est que vous semblez vous sentir un peu derrière la courbe d'apprentissage de la programmation. Comme d'autres l'ont dit, continuez à coder et continuez à lire. Plus vous en ferez, mieux vous en tirerez. C'est aussi simple que ça. Commencez par ce que vous pensez être le plus grand trou de votre arrière-plan et continuez à partir de là.