De un traductor : Estamos publicando una traducci贸n de un art铆culo de Steve Merrit , un empleado de Google que habla sobre c贸mo resuelve los problemas de programaci贸n t铆picos. La publicaci贸n ser谩 煤til principalmente para programadores novatos.En este art铆culo hablar茅 sobre mi estrategia para resolver los problemas que surgen durante el trabajo en un proyecto, de principio a fin. Lo uso en el flujo de trabajo diario en Google, as铆 como cuando trabajo con codificadores de todos los niveles (colegas, graduados de bootcamps, estudiantes universitarios). Una t茅cnica estructurada minimiza el tiempo dedicado a la depuraci贸n y al mismo tiempo conduce a la creaci贸n de un mejor c贸digo.
Por cierto, la misma estrategia a menudo funciona durante las entrevistas en grandes corporaciones tecnol贸gicas. Hace tres a帽os consegu铆 un trabajo en Google gracias a ella.
Le recordamos: para todos los lectores de "Habr": un descuento de 10.000 rublos al registrarse en cualquier curso de Skillbox con el c贸digo de promoci贸n "Habr".
Skillbox recomienda: El curso educativo en l铆nea "Profession Java-developer" .
Paso a paso
Mostrar茅 ejemplos en forma de problemas t铆picos para revelar el tema.
Problema: "Dadas dos l铆neas, sourceString y searchString, debe devolver el primer 铆ndice cuando sourceString aparece en searchString. Si searchString no est谩 en sourceString, devuelve -1 ".
1. Dib煤jalo
Comenzar a escribir c贸digo de inmediato no es una buena idea. Primero debes delinear una forma de resolver el problema. Comience formando una hip贸tesis y evidencia de su punto de vista. Y trabaje solo cuando ya tenga un plan claro. Si esto no se hace, entonces cuando el trabajo ya ha comenzado, puede encontrar el hecho de que las piezas individuales de c贸digo no se corresponder谩n entre s铆.
La soluci贸n a menudo puede ser no trivial, incluso si la tarea parece simple. La planificaci贸n en papel lo ayuda a encontrar el enfoque correcto y a asegurarse de que funcione en otras situaciones. Y aprender谩 todo esto incluso antes de que se escriba la primera l铆nea de c贸digo.
As铆 que no empieces a escribir c贸digo, ni siquiera lo pienses. Tendr谩s mucho tiempo para trabajar. Eres una computadora humana y resuelves el problema.
Ponga el algoritmo de soluci贸n en papel. Si algo te ayuda a visualizar tu plan, hazlo. La tarea es resolver el problema con l谩piz y papel, sin teclado.
Ven con una entrada simple. Si la funci贸n "pasa la cadena", entonces "abc" es el primer excelente ejemplo. Intenta comprender cu谩l deber铆a ser el resultado correcto. Luego piense c贸mo entendi贸 el problema, qu茅 pasos se tomaron.
Imagine que las cadenas tienen los siguientes valores:
sourceString: "abcdyesefgh"
searchString: "yes"
Entonces podemos ver que searchString est谩 dentro de sourceString. 驴Pero c贸mo llegamos a esto? Comenzamos desde el principio de sourceString y lo le铆mos hasta el final, observando cada fragmento de tres caracteres para ver si coincide con la palabra "s铆". Por ejemplo, "abc", "bcd", "cde", etc. Cuando llegamos al 铆ndice 4, encontramos "s铆" y, por lo tanto, decidimos que hab铆a una coincidencia, y comienza en el 铆ndice 4.
Tuve un maestro en el instituto que se propuso elaborar las instrucciones para crear un s谩ndwich de mantequilla de man铆. Para una instrucci贸n detallada y comprensible, nos prometieron la calificaci贸n m谩s alta.
Escrib铆 lo siguiente:
鈥淎bre la mantequilla de man铆, extiende sobre el pan. Pon otro pedazo de pan encima y listo.
Pens茅 que lo hab铆a logrado hasta que la maestra tom贸 la mantequilla y unt贸 el pan, que todav铆a estaba en una bolsa de pl谩stico.
Los programas, como mi maestro, requieren instrucciones muy detalladas para hacer posible la tarea. Por lo tanto, cuando creamos el algoritmo, nos aseguramos de proporcionar todo, todos los escenarios posibles. Devolver la respuesta correcta cuando el partido se ENCUENTRA es excelente, pero es necesario devolver la respuesta incluso si el partido NO SE ENCUENTRA.
Intentemos nuevamente con otro par de l铆neas:
sourceString: "abcdyefg"
searchString: "yes"
Aqu铆, comenzamos desde el principio de sourceString y lo le铆mos hasta el final, observando cada fragmento de tres caracteres para ver si coincide con la palabra "s铆". Cuando llegamos al 铆ndice 4, encontramos yef, que fue casi una coincidencia, pero incompleta, ya que el tercer personaje era diferente. Por lo tanto, continuamos leyendo hasta llegar al final de la l铆nea, y luego decidimos que no hab铆a coincidencia, por lo que devolvimos -1.
Creamos una serie de pasos (en la programaci贸n que se llama algoritmo) que realizamos para resolver el problema, e intentamos ejecutar varios escenarios, cada vez obteniendo el resultado correcto. Por el momento, podemos estar seguros de que nuestro algoritmo funciona, y ahora es el momento de formalizarlo, lo que nos llevar谩 al siguiente paso.
2. Escribimos el algoritmo en palabras.
Esto hace que los pasos sean reales, lo que significa que podemos consultarlos m谩s adelante al escribir el c贸digo.
- Comience al principio de la l铆nea.
- Examinamos todas las combinaciones de tres caracteres (o cu谩ntos caracteres hay indicados en searchString).
- Si alguno de ellos es igual a searchString, devolvemos el 铆ndice actual.
- Si llegamos al final de la l铆nea sin encontrar una coincidencia, devuelve -1.
3. Escribimos un pseudoc贸digo
El pseudoc贸digo no es realmente un c贸digo, pero pretende ser un c贸digo. Un ejemplo de lo que estoy hablando, dado nuestro algoritmo:
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.
Puedo hacerlo a煤n m谩s como un c贸digo real como este:
for each index in sourceString,
N = searchString.length
POSSIBLE_MATCH = sourceString[index to index+N]
if POSSIBLE_MATCH === searchString:
return index
return -1
4. Traducimos todo lo que podemos al c贸digo
Ahora tenemos que ocuparnos de la sintaxis, los par谩metros de la funci贸n y las reglas del lenguaje. Tal vez no puedas escribir todo, y eso es normal. 隆Escriba en el c贸digo lo que sabe con seguridad!
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; }
Tenga en cuenta que dej茅 parte de este c贸digo en blanco. 隆Esto es intencional! No estaba seguro de la sintaxis para procesar cadenas en JavaScript, pero m谩s adelante en eso.
5. No conf铆es en la suerte
Un error bastante com煤n, especialmente para los programadores novatos, es usar algo que se encuentra en la red con la esperanza de que simplemente funcione. El fragmento encontrado simplemente se inserta en su propio proyecto sin probarlo. Cuantas m谩s secciones de su programa no comprenda, m谩s irreal ser谩 la finalizaci贸n exitosa del trabajo.
La probabilidad de un error se duplica cuando agrega cualquier elemento del que no est谩 seguro. Como resultado, el proceso simplemente se sale de control.
Comentario: la probabilidad de un error se puede calcular utilizando la secuencia de Mersenne: a (n) = (2 ^ n) - 1
Prueba tu c贸digo. Encontrar algo en l铆nea es genial, pero antes de agregar un fragmento a su programa, intente esta secci贸n por separado de todo.
En el paso anterior, dije que no sab铆a c贸mo seleccionar una determinada parte de la cadena usando JavaScript. Vamos a buscarlo en google.
https://www.google.com/search?q=how+to+select+part+of+a+string+in+javascriptEl primer resultado es de w3schools. Un poco anticuado, pero funcionar谩:
http://www.w3schools.com/jsref/jsref_substr.aspSupongo que deber铆a usar substr (index, searchString.length) para resaltar la parte sourceString cada vez. Pero hasta ahora esto es una suposici贸n y nada m谩s. As铆 que lo comprobar茅 primero.
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"
Ahora s茅 exactamente c贸mo funciona esta funci贸n. Por lo tanto, cuando agregue este fragmento a mi programa, ya sabr茅 que si no funciona, el problema no est谩 en la secci贸n agregada.
Y finalmente, agrego la 煤ltima parte del c贸digo.
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; }
Conclusi贸n
Si has le铆do hasta el final, prueba el consejo. Encuentre un problema que no pueda resolver. Te garantizo que todo saldr谩 bien ahora.
隆Buena suerte y feliz codificaci贸n!
Skillbox recomienda: