D'un traducteur : Nous publions pour vous une traduction d'un article de Steve Merrit , un employé de Google qui explique comment il résout des problèmes de programmation typiques. Le message sera principalement utile aux programmeurs débutants.Dans cet article, je vais parler de ma stratégie pour résoudre les problèmes qui surviennent pendant le travail sur un projet, du début à la fin. Je l'utilise dans le flux de travail quotidien de Google, ainsi que lorsque je travaille avec des codeurs de tous niveaux (collègues, diplômés de bootcamps, étudiants universitaires). Une technique structurée minimise le temps consacré au débogage et conduit en même temps à la création d'un meilleur code.
Soit dit en passant, la même stratégie fonctionne souvent lors des entretiens dans les grandes entreprises technologiques. Il y a trois ans, j'ai obtenu un emploi chez Google grâce à elle.
Nous vous rappelons: pour tous les lecteurs de «Habr» - une remise de 10 000 roubles lors de l'inscription à un cours Skillbox en utilisant le code promo «Habr».
Skillbox recommande: Le cours éducatif en ligne "Profession Java-developer" .
Pas à pas
Je vais montrer des exemples sous forme de problèmes typiques pour révéler le sujet.
Problème: «Étant donné deux lignes, sourceString et searchString, vous devez renvoyer le premier index lorsque sourceString apparaît dans searchString. Si searchString n'est pas dans sourceString, retournez -1. "
1. Dessinez-le
Commencer à écrire du code tout de suite n'est pas une bonne idée. Vous devez d'abord définir un moyen de résoudre le problème. Commencez par former une hypothèse et une preuve de votre point de vue. Et ne vous mettez au travail que si vous avez déjà un plan clair. Si cela n'est pas fait, alors lorsque le travail a déjà commencé, vous pouvez rencontrer le fait que des morceaux de code individuels ne correspondent pas les uns aux autres.
La solution peut souvent être non triviale, même si la tâche semble simple. La planification papier vous aide à trouver la bonne approche et à vous assurer qu'elle fonctionne dans d'autres situations. Et vous apprendrez tout cela avant même que la première ligne de code ne soit écrite.
Alors ne commencez pas à écrire du code, n'y pensez même pas. Vous aurez beaucoup de temps pour travailler. Vous êtes un ordinateur humain et vous résolvez le problème.
Mettez l'algorithme de solution sur papier. Si quelque chose vous aide à visualiser votre plan, faites-le. La tâche consiste à résoudre le problème avec un crayon et du papier, sans clavier.
Venez avec une entrée simple. Si la fonction "passe la chaîne", alors "abc" est le premier excellent exemple. Essayez de comprendre quel devrait être le bon résultat. Réfléchissez ensuite à la façon dont vous avez compris le problème et aux mesures qui ont été prises.
Imaginez que les chaînes aient les valeurs suivantes:
sourceString: "abcdyesefgh"
searchString: "yes"
Nous pouvons donc voir que searchString est à l'intérieur de sourceString. Mais comment en sommes-nous arrivés là? Nous avons commencé depuis le début de sourceString et l'avons lu jusqu'à la fin, en regardant chaque fragment de trois caractères pour voir s'il correspond au mot «oui». Par exemple, "abc", "bcd", "cde" et ainsi de suite. Lorsque nous sommes arrivés à l'index 4, nous avons trouvé «oui» et avons donc décidé qu'il y avait une correspondance, et cela commence à l'index 4.
J'ai eu un professeur à l'institut qui a fixé la tâche de proposer des instructions pour créer un sandwich au beurre d'arachide. Pour une instruction détaillée et compréhensible, ils nous ont promis la note la plus élevée.
J'ai écrit ce qui suit:
«Ouvrez le beurre d'arachide, étalez-le sur le pain. Mettez un autre morceau de pain sur le dessus et vous avez terminé. "
Je pensais avoir réussi jusqu'à ce que le professeur prenne le beurre et l'étale sur le pain, qui était toujours dans un sac en plastique.
Les programmes, comme mon professeur, nécessitent des instructions très détaillées pour rendre la tâche possible. Par conséquent, lorsque nous créons l'algorithme, nous nous assurons que nous fournissons tout - tous les scénarios possibles. Renvoyer la bonne réponse lorsque la correspondance est TROUVÉE est excellent, mais il est nécessaire de renvoyer la réponse même si la correspondance n'est PAS TROUVÉE.
Essayons à nouveau avec une autre paire de lignes:
sourceString: "abcdyefg"
searchString: "yes"
Ici, nous avons commencé depuis le début de sourceString et l'avons lu jusqu'à la fin, en regardant chaque fragment de trois caractères pour voir s'il correspond au mot «oui». Lorsque nous sommes arrivés à l'index 4, nous avons trouvé yef, qui était presque une coïncidence, mais incomplète, car le troisième caractère était différent. Ainsi, nous avons continué à lire jusqu'à ce que nous ayons atteint la fin de la ligne, puis avons décidé qu'il n'y avait pas de correspondance, nous avons donc renvoyé -1.
Nous avons créé une série d'étapes (en programmation, cela s'appelle un algorithme) que nous effectuons pour résoudre le problème, et nous avons essayé d'exécuter plusieurs scénarios, obtenant chaque fois le résultat correct. Pour le moment, nous pouvons être sûrs que notre algorithme fonctionne, et maintenant il est temps de le formaliser, ce qui nous mènera à la prochaine étape.
2. Nous écrivons l'algorithme en mots
Cela rend les étapes réelles, ce qui signifie que nous pouvons y faire référence plus tard lors de l'écriture du code.
- Commencez au début de la ligne.
- Nous examinons toutes les combinaisons de trois caractères (ou le nombre de caractères indiqués dans searchString).
- Si l'un d'eux est égal à searchString, nous renvoyons l'index actuel.
- Si nous arrivons à la fin de la ligne sans trouver de correspondance, renvoyez -1.
3. Nous écrivons un pseudocode
Le pseudocode n'est pas vraiment un code, mais il prétend être un code. Un exemple de ce dont je parle, compte tenu de notre algorithme:
for each index in sourceString,
there are N characters in searchString
let N chars from index onward be called POSSIBLE_MATCH
if POSSIBLE_MATCH is equal to searchString, return index
at the end, if we haven't found a match yet, return -1.
Je peux le rendre encore plus comme du vrai code comme celui-ci:
for each index in sourceString,
N = searchString.length
POSSIBLE_MATCH = sourceString[index to index+N]
if POSSIBLE_MATCH === searchString:
return index
return -1
4. Nous traduisons tout ce que nous pouvons dans le code
Maintenant, nous devons prendre soin de la syntaxe, des paramètres de fonction et des règles de langage. Peut-être que vous ne pouvez pas tout écrire, et c'est normal. Écrivez dans le code ce que vous savez à coup sûr!
function findFirstMatch (searchString, sourceString) { let length = searchString.length; for (let index = 0; index < sourceString.length; index++) { let possibleMatch = <the LENGTH chars starting at index i> if (possibleMatch === searchString) { return index; } } return -1; }
Notez que j'ai laissé une partie de ce morceau de code vierge. C'est intentionnel! Je n'étais pas sûr de la syntaxe de traitement des chaînes en JavaScript, mais plus à ce sujet plus tard.
5. Ne comptez pas sur la chance
Une erreur assez courante, en particulier pour les programmeurs débutants, consiste à utiliser quelque chose trouvé sur le réseau dans l'espoir que cela fonctionnera. Le fragment trouvé est simplement inséré dans votre propre projet sans test. Plus vous ne comprendrez pas de sections de votre programme, plus l'achèvement réussi du travail est irréaliste.
La probabilité d'une erreur double lorsque vous ajoutez un élément dont vous n'êtes pas sûr. En conséquence, le processus devient tout simplement incontrôlable.
Commentaire: la probabilité d'une erreur peut être calculée à l'aide de la séquence de Mersenne: a (n) = (2 ^ n) - 1
Testez votre code. Trouver quelque chose en ligne est cool, mais avant d'ajouter un extrait à votre programme, essayez cette section séparément de tout.
À l'étape précédente, j'ai dit que je ne savais pas comment sélectionner une certaine partie de la chaîne à l'aide de JavaScript. Allons sur Google.
https://www.google.com/search?q=how+to+select+part+of+a+string+in+javascriptLe premier résultat provient de w3schools. Un peu dépassé, mais fonctionnera:
http://www.w3schools.com/jsref/jsref_substr.aspJe suppose que je devrais utiliser substr (index, searchString.length) pour mettre en évidence la partie sourceString à chaque fois. Mais jusqu'à présent, c'est une hypothèse et rien de plus. Je vais donc le vérifier d'abord.
let testStr = "abcdefghi"
let subStr = testStr.substr(3, 4); // simple, easy usage
console.log(subStr);
"defg"
subStr = testStr.substr(8, 5); // ask for more chars than exist
"i"
Maintenant, je sais exactement comment cette fonction fonctionne. Par conséquent, lorsque j'ajouterai ce fragment à mon programme, je saurai déjà que s'il ne fonctionne pas, le problème n'est pas dans la section ajoutée.
Et enfin, j'ajoute la dernière partie du code.
function findFirstMatch(searchString, sourceString) { let length = searchString.length; for (let index = 0; index < sourceString.length; index++) { let possibleMatch = ( sourceString.substr(index, searchString.length)); if (possibleMatch === searchString) { return index; } } return -1; }
Conclusion
Si vous avez lu jusqu'à la fin, essayez l'astuce. Trouvez un problème que vous ne pouvez pas gérer. Je vous garantis que tout ira bien maintenant.
Bonne chance et bon codage!
Skillbox recommande: