Ser un buen período de Ingeniero de Software significa que entiendes Sistemas de Computación / Arquitectura. Cualquiera puede escribir código que resuelva un problema, pero comprender cómo funciona el hardware / plataforma lo diferenciará de ser capaz de resolver un problema frente a resolverlo de manera eficiente.
Por ejemplo, supongamos que tiene un número X y desea saber si es una potencia de dos. Puedes resolver esto de diferentes maneras:
1. 2 ^ n = X -> Resolver esto usando cualquier método matemático que le enseñaron álgebra no es eficiente en un x86, ARM u otro microprocesador fabricado en masa. No tienen instrucciones nativas para ejecutar la resolución de expresiones matemáticas exponenciales.
- ¿Cuáles son algunos libros o recursos introductorios para alguien que esté interesado en ingresar a la ingeniería?
- Colocaciones de MSRIT: ¿Debo ir a compañías de reclutamiento masivo, o debo apegarme al tipo de compañías con las que me gustaría trabajar?
- ¿Es la honestidad un inconveniente en las entrevistas para la ingeniería de software?
- ¿Qué cualidades hacen un buen ingeniero de control de calidad?
- Como ingeniero escandinavo de EE que desea trabajar en un país de habla inglesa, ¿a dónde debo ir?
2. Iterando a través de la variable ‘n’ desde arriba con un ciclo pero esto tiene sus propios problemas obvios.
3. O la mejor manera: dado que sabemos que los microprocesadores implementan una instrucción nativa para hacer operaciones de resta y bit a bit, podemos resolver esto con dos instrucciones más la cantidad de instrucciones necesarias para ejecutar una instrucción if (esto puede variar según la arquitectura )
Así es cómo:
Si tiene una potencia de dos y resta 1 de ella, pasará de una seguida de una cantidad arbitraria de 0 a cero en la misma ubicación seguida de 1. Por ejemplo:
0b1000 – 0b1 = 0b0111
Si a continuación, bit a bit Y el número que está probando (X) con (X-1) obtendrá lo siguiente:
0b1000
0b0111
———–
0b0000
El resultado de estos dos pasos en X siempre será cero para cualquier potencia de dos y es muy eficiente de implementar.
Comprender la arquitectura de la computadora, el álgebra booleana y la representación binaria de números, etc., le permite pensar esto y, en última instancia, hace que sus soluciones a problemas programáticos sean mucho más elegantes y optimizadas que otros codificadores.