Tengo una pregunta que ha sido planteada por mi último trabajo (más bien pasante).
Solo para poner las cosas en contexto: tengo 21 años y he terminado mi segundo año de universidad antes de eso, tengo alrededor de 2 años de experiencia haciendo trabajos de administración / control de calidad de sys y básicamente puedo decir que he visto cuán diferente Sectores de TI operados. Avancemos a los tiempos actuales y aquí estoy yo obteniendo un puesto de interno en una de las principales instituciones de investigación del Reino Unido.
Lo que tengo que hacer es crear algunas herramientas internas utilizando una combinación de tecnologías, principalmente AWS / Java / Bash, para obtener la imagen. Todo está bien, estoy haciendo mi trabajo PERO no estoy contento. ¿Por qué es eso? Porque se espera que trabaje en un asunto ad-hoc. Eso es crear cosas rápidamente, sin perder tiempo diseñando. Mi gerente dijo explícitamente que se esperaba que se "apresurara" a través de los problemas a medida que surgieran, y nosotros esencialmente. Como consecuencia, resultó que las cosas tenían que volverse a hacer y rediseñar, y todavía no son perfectas. En lo que respecta a las pruebas, manténgalo al mínimo, siempre que parezca que funciona, entonces está bien.
¿Tengo la culpa de estar en desacuerdo con esta forma de conducir el trabajo? ¿Es incorrecto querer pensar sobre el sistema como un todo, luego enfocarse en diferentes componentes y ver cómo podrían interactuar, para concentrarse en diferentes "puntos clave" que podrían resultar problemáticos en el futuro? ¿Es un delito querer hacer un buen trabajo y no un "trabajo rápido"? ¿Es un error o una actitud equivocada querer investigar las estructuras de datos aplicables a un problema para poder elegir lo mejor en función de un conjunto de problemas en particular? Según tengo entendido, el bit de "Ingeniería" en "Ingeniería de software" tiene que ver exactamente con esto: investigue su dominio del problema y encuentre una solución informada y luego refine según sea necesario.
Estuve en una entrevista en una oficina de Arm en el Reino Unido y me mostraron su sala SCRUM y parecía que tenían una idea bastante buena de cómo administrar su proyecto: tenían una cartera de pedidos, tenían métricas de cuánto tiempo cada uno el problema puede tardar en resolverse, lo habitual para SCRUM, completamente diferente de la forma en que se ejecutan las cosas "aquí"
¿He construido una idea equivocada sobre la industria del software en general? Me gustaría escuchar tu opinión sobre eso. Quiero decir que "ingresé" al desarrollo de software simplemente porque quiero crear cosas, simple y llanamente, pero quiero crear cosas de calidad. Quiero ver mi software utilizado en varios escenarios, quiero verlo a prueba de balas, ¿no es esa la fuerza impulsora para todos los ingenieros de software? Creo que todos pueden ser programadores / programadores simplemente aprendiendo la sintaxis, pero para mí donde comienza la verdadera diversión es cuando realmente tienes que idear un diseño que sea factible en el mundo real.
Solía hacer mis tareas universitarias con solo mirarlas y comenzar a codificar directamente y fácilmente podía obtener calificaciones superiores al 75% y nunca aprecié realmente el módulo del "ciclo de vida del desarrollo de software". Pero ahora, cuando vi en el mundo real lo malo que es trabajar sin ningún proceso formal y la frustración inherente a una situación en la que no sabes si los requisitos van a cambiar mañana (oh, dije que no ¿Tiene un análisis de requisitos claramente definido?)
Realmente me gusta creer que acabo de conseguir un puesto en el que algunas personas solo necesitaban un código mono para hacer su trabajo sucio y este no es el caso de cómo funciona el mundo del software en general.
fuente
because I'm expected to work in an ad-hoc matter. That is create things quickly, without spending time on designing
- Bienvenido a The Real World ™, donde hay plazos y se espera que las empresas produzcan resultados.Respuestas:
Hacer que el software sea reutilizable y a prueba de balas no es la fuerza impulsora de la ingeniería de software. La ingeniería consiste en resolver problemas del mundo real de manera óptima dentro de las limitaciones del mundo real . La mayoría de los ingenieros preferirían trabajar en un Ferrari, pero una camioneta necesita la misma ingeniería, y la razón por la que una camioneta no funciona tan bien (de alguna manera) se debe a restricciones de diseño más difíciles, no a una peor ingeniería. .
Cuando dice que quiere hacer un "buen trabajo" en lugar de un "trabajo rápido", la mayoría de los ingenieros lo hacen, pero a veces parte de lo que define el bien es lo rápido que es completarlo. Por lo tanto, no es correcto pensar en "bueno" y "rápido" como opciones opuestas. O pensar que está haciendo un mal trabajo, o que simplemente es un "código mono", por hacer el mejor trabajo posible en el tiempo disponible.
Por supuesto, es bastante posible que el proceso no sea óptimo y que funcione mejor con un poco más de diseño por adelantado. La prueba de fuego sería, ¿es la forma actual de hacer las cosas creando más problemas de los que resuelve para los usuarios , o simplemente está molestando a los desarrolladores que tienen que trabajar de esa manera? Si en realidad está causando problemas a los usuarios, parte de su trabajo es tratar de demostrar que este es el caso y tratar de atraer a las personas a un proceso un poco más controlado.
fuente
En realidad, esto me molesta. Estás en una profesión donde desarrollas herramientas para investigadores científicos, correcto. Sin embargo, se le dice que acelere estos programas y que parezca que funcionan de manera mínima. Sorpresa sorpresa. Este es simplemente el enfoque típico del investigador para programar con el dinero pasado a un programador real.
La principal preocupación aquí es que la falta de pruebas en particular puede ser éticamente dudosa si las herramientas tienen un propósito importante. Si no está seguro de que el software tenga defectos porque está restringido a un tiempo de prueba mínimo, esto significa que NADIE es responsable de las condiciones de funcionamiento del software y Atlas se encoge de hombros.
Sin embargo, detengámonos y pensemos en esto por un segundo. ¿Qué tipo de herramientas estás desarrollando? Si está desarrollando software que modela datos, aquí hay un gran dilema ético . En algunas situaciones, la investigación científica conduce a decisiones que afectan a muchas personas a gran escala.
Supongamos por un instante el tema controvertido del cambio climático provocado por el hombre. Digamos que pusieron los mismos estándares en el software de modelado que usan para llegar a las conclusiones que tienen hoy. El tema tiene un gran impacto en cómo abordamos correctamente la gestión del medio ambiente y la política internacional.
¿No es ético garantizar que el software de modelado no tenga problemas importantes con sus predicciones?
Todo el problema no es que los gases de efecto invernadero calientan la tierra. El problema es si el resultado neto de los efectos de retroalimentación es una ganancia acelerada de temperatura, que después de romper un umbral ya no sería reversible.
Si se produjera dicha ganancia, la evidencia de un resultado neto sería marginal, probablemente dentro del rango de error.
Por lo tanto, los errores de cálculo leves, incluso la metodología que implica el almacenamiento y la recuperación de datos en el back-end, podrían resultar en ignorar un problema ambiental grave en un extremo de la falla o en una política internacional que afecta a muchas personas (destruye empleos, destruye pensiones, etc.) ) en el otro.
Entonces, sí, tienes razón. No me importa cuál sea el ritmo de la investigación ... Si los investigadores quieren confiar en herramientas de software para administrar datos y realizar cálculos, deben aprender a esperar que el software se haga correctamente. De lo contrario, este software se convierte en un punto de vulnerabilidad en sus teorías de las que no son responsables, lo que resulta en mala conducta ética.
fuente
No tienes una idea equivocada sobre qué es la ingeniería de software. Sin embargo, le falta un aspecto muy importante: esta es una industria de servicios. Algunos de nosotros trabajamos en un producto durante años y pasamos por el diseño y luego muchas iteraciones antes de que esté en v1. Otros tienen que producir algo en 3 horas. Depende de a quién atiende y cuál es el propósito.
Si puede producir una aplicación en 3 horas (o días) que haga lo que debe hacer, ¿por qué dedicar más tiempo a diseñarla por adelantado? Solo estás desperdiciando dinero. Perder dinero es, en general, no es una buena idea ™.
fuente
Como otros ya han dicho, una gran parte de lo que se trata la ingeniería de software son las "restricciones extrínsecas". p.ej. Tiempo, presupuesto, servicio, soporte, satisfaciendo demandas idiotas irracionales, etc.
Muchos de nosotros (incluido yo mismo) nos metimos en la programación pensando que todo se trata de la programación misma: codificar piezas de software hermosas y elegantes en un vacío (o un vacío relativo al menos). Rara vez lo es. Puede haber algunos trabajos raros académicos o de software de I + D que se acerquen a él, pero en su mayor parte, la gran mayoría del trabajo de desarrollo de software no es nada de eso. Especialmente en la fase de mantenimiento, que suele ser más del 90% de la vida útil de un producto, y la rutina diaria de la mayoría de los trabajos permanentes de software comercial.
Durante mucho tiempo, tuve un conflicto interno sobre esto que a menudo me hizo infeliz sobre mi trabajo (y es parte de lo que finalmente llevó a un agotamiento el año pasado). Siempre sentí que un trabajo apesta si no se trata de crear un código hermoso y tomarse el tiempo para hacerlo apropiadamente. Pero realmente, esta es la realidad, y algunas personas realmente prosperan en un flujo de trabajo muy orientado a los servicios. Es lo que los hace sentir pragmáticos y útiles. Incluso si los aspectos reales de "ingeniería de software puro" de un proyecto se vuelven relativamente apresurados y descuidados.
De todos modos, es bueno que estés cuestionando esto ahora. Esta es una de esas cosas que nunca explican correctamente en la escuela. Y a las empresas les encanta fingir que siguen muy buenas prácticas de ingeniería, incluso si no lo hacen. Sugerencia: la mayoría no.
Todo lo dicho, las cosas varían. Ciertas compañías (en su mayoría aquellas para quienes el software es su negocio principal, y aquellas que trabajan en software altamente crítico para la seguridad, como equipos médicos) siguen un proceso de ingeniería muy estricto. Pero en general, sí, le diré a quemarropa ahora que la mayoría del trabajo de software comercial es relativamente descuidado. Por lo general, hay algún proceso formal, pero cumplirlo estrictamente casi siempre pasa a un segundo plano para reaccionar ante los comentarios de los clientes y otras presiones comerciales. No es realmente "descuido" per se, es simplemente una utilidad pragmática. El truco es encontrar su nicho y ver un rol desde el punto de vista desde el servicio que brinda, en lugar de lo genial que es el aspecto de "programación pura".
EDITAR : Creo que podría haber sonado demasiado unilateral en mi evaluación inicial. Me gustaría agregar que a menudo también hay problemas genuinos con cosas demasiado descuidadas y falta de un buen proceso, hasta el punto de conducir el proyecto a una deuda técnica y en realidad es malo para el negocio. Pero ver esto viene con experiencia. El punto inicial sigue básicamente en pie: la mayoría del trabajo de software comercial hoy en día no está tan rígidamente orientado a la ingeniería como los puristas quisieran.
fuente
¡Qué excelente pregunta! A veces puedes hacer algo valioso siendo rápido . Este suele ser el caso en un laboratorio de investigación donde cuanto más rápido podamos aprender lo que no sabemos, mejor estaremos. El software que produce existe solo para responder preguntas. Es "desechar código". Este es también el caso de las startups que no saben lo que los clientes realmente quieren. Además, la primera vez que hagas algo, será horrible. Lea el mes mítico del hombre .
A veces puedes hacer algo valioso siendo bueno . Este suele ser el caso con el software encogido como Adobe Photoshop. La investigación ya se realizó hace años y ahora la pregunta es cómo agregar la lista de características que los clientes desean de una manera que no introduzca errores. Es una cuestión de arquitectura, diseño y pruebas, pruebas, pruebas. El código en sí es lo que es valioso, no lo que aprendes de él.
Si no está satisfecho con la investigación (hacer lo primero de algo, aprender cosas nuevas que nadie sabía antes), pruebe el software reducido. De hecho, a tu edad deberías probar tantas cosas como sea posible. ¡Ve a correr riesgos! Aprenderá mucho y estará mejor a largo plazo.
fuente
Creo que te has dado cuenta muy temprano en tu carrera de que hacer las cosas rápidamente, sin un diseño adecuado o una prueba adecuada, tiende a morderte. Obviamente no te gusta esto y tienes buenas razones para no hacerlo. Es ridículo esperar que "apresure los problemas", especialmente si tiene que revisarlos más tarde cuando las soluciones iniciales son incorrectas o están incompletas. Solo puede proporcionar soluciones a los problemas si los comprende completamente, y eso requiere tiempo y una planificación cuidadosa.
Mi sugerencia para usted es que sus superiores sepan que esto le molesta y sugerirles un mejor enfoque para hacer su trabajo. Si no están de acuerdo y quieren que continúes "apresurándote" a través de tu trabajo, comenzaría a buscar trabajo en otro lado. No tiene sentido hacer las cosas de una manera que no cumpla con sus propios estándares, y mucho menos con un estándar de calidad de desarrollo de software que la industria espera.
fuente
Aquí está mi consejo basado en mis experiencias, tengo 20 años y actualmente estoy trabajando para una importante institución financiera en el Reino Unido y tenía los mismos sentimientos que tenía hace unos meses, lo que noté es que esto puede deberse a la naturaleza de El trabajo que estás haciendo.
Lo que quiero decir con eso es que dijiste:
También tuve que crear herramientas internas para ayudar a administrar y automatizar ciertos procesos y el hecho es que en un entorno de ritmo rápido se requieren cosas "pequeñas" para ser implementadas rápidamente. No tuve el lujo de aplicar la mayoría de los principios de ingeniería de software o algoritmos y estructura de datos que me enseñaron en mi segundo año porque se requirió una versión funcional de la herramienta en unas pocas semanas. Sin embargo, estaba muy frustrado con esto. No todo está mal, ya que aprendí a escribir un código mejor y más legible.
Tenía que ser paciente y recientemente me cambié a un nuevo equipo que está trabajando en una nueva iteración del sistema interno que utilizan los usuarios de 10K + y puedo asegurarle que el aspecto de ingeniería de software se toma muy en serio. Me han dicho que ganaré exposición al ciclo de vida completo del software desde la captura / análisis de requisitos hasta la implementación y las pruebas. Creo que voy a obtener esta experiencia porque no estoy trabajando en herramientas internas, sino que estoy trabajando en un sistema a gran escala con una gran base de usuarios.
Lo que recomiendo es que sea paciente, termine de crear las herramientas y haga un muy buen trabajo para que sus supervisores ganen más confianza en usted y le asignen tareas más desafiantes que requerirán el uso de principios de ingeniería de software. Obtenga un conocimiento adicional al leer un poco más y aplique ese conocimiento a lo que está haciendo actualmente. Recuerdo que saqueé toda la biblioteca de libros electrónicos de la compañía solo para ampliar mi conocimiento muhahah, de todos los libros que leí, sentí que Java era efectivo. Muy buen libro que me ayudó mucho.
Solo sea paciente, invierta mucho en su propio conocimiento y aplique ese conocimiento cuando sea posible. Si está haciendo un muy buen trabajo, alguien pronto lo notará.
fuente
Estoy de acuerdo en que la forma en que funciona su trabajo actual es subóptima, sí. Sin embargo, si quiere decir que no funciona en absoluto, no estaría de acuerdo con usted allí ya que hay varios resultados y la institución todavía está presente.
Mi pregunta principal para usted es en qué medida está lidiando con incendios que requieren soluciones inmediatas hechas rápidamente, de manera similar a dar primeros auxilios a un paciente médico versus solicitudes que podrían configurarse como proyectos y manejarse en una escala muy diferente, similar al paciente médico. tener que programar pruebas y diversos procedimientos que no es necesario hacer de inmediato, sino a corto plazo.
Tomarse el tiempo para hacer un trabajo bien depende un poco de la madurez de la organización junto con la importancia de que algo se haga bien en lugar de una afirmación de que se haga.
La pregunta sobre la investigación de las estructuras de datos es cuánto tiempo quieren hacer esto. Si desea dedicar una década a investigar una estructura de datos que sea bastante diferente de querer un par de horas. Si bien puedo apreciar el deseo de obtener la mejor respuesta, hay algo que decir sobre la disminución de los rendimientos después de pasar algún tiempo en un problema, por ejemplo, ¿podría pasar horas buscando una solución para FizzBuzz ya que podría tratar de resolverlo en varios idiomas en varios hardware para optimizar cuán rápido podría ejecutarse.
Si bien puede ser importante investigar, también es importante entregar algo. Si no entregas algo, ¿qué tan bueno eres realmente? El programador de cinta adhesiva sería más un ejemplo de cómo hacer las cosas aquí.
Scrum es una metodología específica que posiblemente podría intentar adoptar en su lugar de trabajo actual. Sin embargo, no pienses que Scrum es una bala de plata. ¿Bajo qué circunstancias pueden fallar los proyectos bajo Scrum y Agile? sería una publicación de blog sobre ese tema que puede ser de interés.
Supongo que no estás viendo cuán informales son los procesos de tu lugar actual y estás pensando que la hierba es inmensamente más verde en el otro lado, donde hay una metodología formal. Si bien puede ser mejor allí, algunas personas pueden preferir lo que tienes ahora con la libertad masiva de ser un vaquero .
fuente
Creo que su situación todavía está en la escala del mundo real hacia un menor énfasis en el lado de la calidad. Su preferencia está en el otro extremo del mundo real. Las especificaciones cambian, supéralo. Las cosas deben hacerse.
Considere formas de identificar este tipo de empresas cuando solicite su próximo trabajo. Pocos lugares tienen un modelo de negocio en el que puedan permitirse que los desarrolladores analicen sus diseños para siempre (incluso los profesores tienen que enseñar). Los clientes rara vez pagan si su trabajo no abandona la pizarra de borrado en seco. Odio verte enloquecer tan temprano en tu carrera.
fuente