¿Cuánto tiempo necesita una persona normal para comprender y desarrollar software en C?

Hemos estado escribiendo inglés y otros idiomas humanos durante mucho, mucho tiempo, y la pedagogía literaria ha avanzado hasta el punto en que sabemos lo que una persona “normal” debería poder leer en el momento en que comienza la educación formal hasta el momento. Reciben su título de posgrado. Por lo tanto, tendría sentido preguntar cuánto tiempo debería tomar un estudiante estadounidense normal en los primeros años del siglo XXI para leer a un nivel de quinto grado.

Pero no hemos escrito casi tanto código C, y el rango de experiencia es, en todo caso, incluso más amplio. He estado usando C durante 25 años y tengo un doctorado en este campo, pero cuando estaba abriendo un poco el código C utilizado por el ks.test de R () no tenía idea de lo que estaba sucediendo. ¿Entendí las “palabras” individuales? Por supuesto. Pero en el nivel de “párrafo” estaba completamente perdido.

/ * Distribución asintótica bilateral de dos muestras * /
estático void pkstwo (int n, double * x, doble tol)
{
/ * x [1: n] es entrada y salida
* Calcular \ sum_ {k = – \ infty} ^ \ infty (-1) ^ ke ^ {- 2 k ^ 2 x ^ 2}
* = 1 + 2 \ sum_ {k = 1} ^ \ infty (-1) ^ ke ^ {- 2 k ^ 2 x ^ 2}
* = \ frac {\ sqrt {2 \ pi}} {x} \ sum_ {k = 1} ^ \ infty \ exp (- (2k-1) ^ 2 \ pi ^ 2 / (8x ^ 2))
*
* Véase, por ejemplo, J. Durbin (1973), Teoría de la distribución para pruebas basadas en la
* Función de distribución de la muestra. SIAM.
*
* La expansión de la serie ‘estándar’ obviamente no se puede usar cerca de 0;
* usamos la serie alternativa para x <1, y una estimación bastante cruda
* del término resto de la serie en este caso, en particular utilizando ese
* ue ^ (- lu ^ 2) \ le e ^ (- lu ^ 2 + u) \ le e ^ (- (l-1) u ^ 2 – u ^ 2 + u) \ le e ^ (- (l -1))
* siempre que u y l sean> = 1.
*
* (Pero tenga en cuenta que para tolerancias razonables, uno podría simplemente tomar 0 como
* el valor para x <0.2, y use la expansión estándar de lo contrario.)
*
* /
doble nuevo, antiguo, s, w, z;
int i, k, k_max;

k_max = (int) sqrt (2 – log (tol));

para (i = 0; i <n; i ++) {
si (x [i] <1) {
z = – (M_PI_2 * M_PI_4) / (x [i] * x [i]);
w = log (x [i]);
s = 0;
para (k = 1; k <k_max; k + = 2) {
s + = exp (k * k * z – w);
}
x [i] = s / M_1_SQRT_2PI;
}
else {
z = -2 * x [i] * x [i];
s = -1;
k = 1;
antiguo = 0;
nuevo = 1;
while (fabs (old – new)> tol) {
viejo = nuevo;
nuevo + = 2 * s * exp (z * k * k);
s * = -1;
k ++;
}
x [i] = nuevo;
}
}
}

Esto no me preocupa demasiado; una de las cosas buenas de tener un Ph.D. es que sé con quién hablar cuando tengo que hacer una optimización del rendimiento en el código estadístico.

Pero sí señala la inutilidad de su pregunta. ¿Qué es una persona “normal”? ¿Qué nivel de “comprensión” estás preguntando? ¿Qué tipo de “desarrollo” tiene en mente, y en qué nivel de calidad y complejidad? ¿Es la persona autodidacta? ¿Cuánto es el maestro una influencia de confusión? ¿El ambiente de aprendizaje permite el aprendizaje asistido por pares?

Ignorando todo lo anterior …

Con un gran maestro y un grupo motivado de estudiantes de ciencias de la computación, diría que la mayoría puede llegar al punto de escribir un simple editor de texto en un semestre, un módulo de kernel simple (no trivial) en dos semestres y un compilador rudimentario en tres semestres Después de dos años, puede considerar pagarles por sus soluciones, y después de cinco años más, es posible que no esté perdiendo dinero en ese trato.

Depende de cuánto tiempo invertirás en aprender todos los días. Necesitará no solo el lenguaje, sino también algunas técnicas / metodologías / conceptos generales de ingeniería de software para poder desarrollar software, como patrones de diseño de software / arquitecturas, además de alguna herramienta de control de fuente (como git / svn / .. ).

También depende también de muchos otros factores, ya sea:

  • Es para la asignación de estudiante / trabajo profesional.
  • Quieres trabajar para una start-up o gran empresa.
  • Qué nivel (principiante, intermedio, senior). Es posible que no necesite conocer técnicas avanzadas, pero busque un trabajo adecuado según su conjunto de habilidades.

Personalmente: aprendí C para poder desarrollar programas típicos útiles (apropiados para un trabajo de inicio) al tomar un curso de 6 meses, pero ya sabía algoritmos y estructuras de datos.

La gente normal no desarrolla software.

Esta es una de las grandes falacias que las personas están vendiendo actualmente cuando afirman que “a todos los niños en edad escolar se les debe enseñar los conceptos básicos de la programación”. Pero irónicamente, no en BASIC.

Tienes que tener una mentalidad particular para ser bueno en el desarrollo de software, y de muchas maneras, eso es algo innato.

Para alguien que tiene la razón …

Puede comenzar de inmediato, levantando y leyendo una copia de K&R, y haciendo los ejercicios.

No dominarás, pero entenderás C y podrás desarrollarte en ella.

Si quieres dominar, te llevará mucha práctica.

Si ya sabe cómo programar en otro lenguaje de computadora, está aún más avanzado en el camino a la competencia: encuentre un programa de tamaño mediano en el idioma que ya conoce, recoja esa misma copia de K&R y traduzca el programa a C .

Pero una persona normal probablemente ni siquiera va a estar interesada.

Puede tomar más de una vida dependiendo de lo que quiera entender, hay muchas cosas en C, y su relación con * NIX no ha facilitado las cosas, y hay bibliotecas y cadenas de herramientas alrededor de ellas. Por otro lado, el estándar ANSI es más corto que la mayoría de los lenguajes populares, dependiendo de su capacidad para leer un simple programa de C puede tomar menos de una semana.

Esto realmente depende del tipo de software que desee desarrollar. Uno puede volar un ala delta con un mínimo de experiencia, pero si uno desea dominar un avión de combate, tomará más tiempo. Una persona puede escribir un programa de “hola mundo” después de unos días; Un programa razonable después de un semestre o dos de estudio.

En mi posición actual, estoy desarrollando un código C para un sistema de archivos escalable de alto rendimiento, tolerante a fallos. Tengo más de 30 años de experiencia en el desarrollo de código C, pero todavía estoy aprendiendo a medida que obtengo más experiencia con este sistema.

Creo que es más o menos lo mismo que aprender a jugar snooker.

Probablemente puedas comenzar a jugar de una manera básica después de unas pocas horas.

Si quieres llegar al Campeonato del Mundo, es casi seguro que no lo harás.

Como en casi todo, no se trata de poder hacer algo, o de no poder hacer algo, hay una cuestión de habilidad.

Si quieres hacer un juego muy básico en C, digamos un juego de cartas, como Blackjack, en el que la computadora escoge dos cartas, luego escoges dos cartas y luego puedes elegir más cartas con el riesgo de quebrar. Para tratar de vencer la mano de la computadora. Espero que puedas aprender a escribir algo así en C en unos pocos días de aprendizaje intensivo.

Si quisieras hacer un nuevo kernel de SO para mostrarle al equipo de Plan 9 cómo se hace, entonces probablemente nunca serás tan bueno.

Es realmente una cuestión de qué tan bueno quieres ser, y cuánto estás dispuesto a trabajar para llegar allí.