Está en la página 1de 60

Dedicatoria A los programadores de Hire.com. Tabla de Contenido 1. Introduccin 2.

Principiante Habilidades Personales Aprende a Depurar Cmo Depurar Dividiendo el Espacio del Problema Cmo eliminar un Error Cmo Depurar Usando una Bit cora Cmo Comprender Problemas de Desempe!o Cmo Corregir Problemas de Desempe!o Cmo "ptimi#ar Ciclos Cmo $idiar con el Costo de E%& Cmo Administrar la 'emoria Cmo $idiar con Bugs Intermitentes Cmo Aprender Habilidades de Dise!o Cmo Conducir E(perimentos Habilidades de E)uipo Por *u+ la Estimacin es Importante Cmo Estimar el ,iempo de Programacin Cmo Encontrar In-ormacin Cmo Utili#ar a la .ente como /uentes de In-ormacin Cmo Documentar &abiamente Cmo ,raba0ar con Cdigo Pobre Cmo Usar el Control del Cdigo /uente Cmo Probar Unidades ,oma Descansos Cuando est+s Con-undido Cmo 1econocer Cu ndo Ir a Casa Cmo $idiar con .ente Di-2cil 3. Intermedio Habilidades Personales Cmo Permanecer 'otivado Cmo ser Ampliamente Con-iable Cmo 4egociar ,iempo vs. Espacio Cmo Hacer Pruebas de Estr+s Cmo Balancear Brevedad 5 Abstraccin Cmo Aprender 4uevas Habilidades Aprende a ,eclear Cmo Hacer Pruebas de Integracin $engua0es de Comunicacin Herramientas Pesadas Cmo Anali#ar Datos Habilidades de E)uipo Cmo Administrar el ,iempo de Desarrollo Cmo 'ane0ar 1iesgos de &o-t6are de ,erceras Partes Cmo 'ane0ar Consultores Cmo Comunicar la Cantidad Adecuada Cmo Disentir Honestamente 5 &obrellevarlo 7uicio Cmo 4egociar Calidad /rente a ,iempo de Desarrollo

Cmo 'ane0ar la Dependencia del &istema de &o-t6are Cmo Decidir si el &o-t6are es 'u5 Inmaduro Cmo Hacer una Decisin de Compra vs. Construccin Cmo Crecer Pro-esionalmente Cmo Evaluar Entrevistados Cmo &aber Cu ndo Aplicar Ciencia Computacional /antasiosa Cmo Hablar con 4o Ingenieros 8. Avan#ado 7uicio ,ecnolgico Cmo Di-erenciar lo Di-2cil de lo Imposible Cmo Utili#ar $engua0es Embebidos Escogiendo $engua0es Comprometi+ndote &abiamente Cmo Combatir Presin de Calendario Cmo Comprender al Usuario Cmo "btener una Promocin &irviendo a ,u E)uipo Cmo Desarrollar ,alento Cmo Elegir &obre *u+ ,raba0ar Cmo "btener lo ' (imo de ,us Compa!eros de E)uipo Cmo Dividir Problemas Cmo 'ane0ar las ,areas Aburridas Cmo Conseguir Apo5o para un Pro5ecto Cmo Hacer Crecer un &istema Cmo Comunicar Bien Cmo Decirle a la .ente Cosas )ue 4o Desean Escuc9ar Cmo $idiar con 'itos Administrativos Cmo $idiar con el Caos "rgani#acional .losario A. B. Historia :Como la de /ebrero; 2<<3= C. $icencia de Documentacin $ibre de la .4U P1EA'BU$" AP$ICABI$IDAD > DE/I4ICI"4E& C"PIA1 A$ PIE DE $A $E,1A C"PIA1 E4 CA4,IDAD '"DI/ICACI"4E& C"'BI4A4D" D"CU'E4,"& C"$ECCI"4E& DE D"CU'E4,"& A.1E.ACI"4 C"4 ,1ABA7"& I4DEPE4DIE4,E& ,1ADUCCI"4 ,E1'I4ACI"4 /U,U1A& 1E?I&I"4E& DE E&,A $ICE4CIA ADE4DU'@ cmo usar esta $icencia para tus documentos Captulo 1. Introduccin &er un buen programador es di-2cil 5 noble. $a parte m s di-2cil de 9acer real una visin colectiva de un pro5ecto de so-t6are es lidiar con los compa!eros de traba0o 5 con los clientes de uno. Escribir programas de computadora es importante 5 re)uiere gran inteligencia 5 9abilidad. Pero realmente es un 0uego de ni!os comparado con todo lo dem s )ue un buen programador debe 9acer para lograr )ue un sistema de so-t6are tenga +(ito tanto para el cliente como para la mir2ada de colegas por )uienes se es

parcialmente responsable. En este ensa5o intento resumir tan concisamente como sea posible esas cosas )ue desear2a )ue alguien me 9ubiese e(plicado a m2 cuando ten2a veintiuno. Esto es mu5 sub0etivo 5; por lo tanto; este ensa5o est condenado a ser personal 5 algo testarudo. 'e con-ino a m2 mismo a los problemas )ue un programador mu5 probablemente tiene )ue en-rentar en su traba0o. 'uc9os de esos problemas 5 sus soluciones son tan generales a la condicin 9umana )ue probablemente parecer+ predicativo. A pesar de ello tengo -e de )ue este ensa5o ser Atil. $a programacin de computadoras es ense!ada en cursos. $os e(celentes libros@ El Programador Pragmtico (The Pragmatic Programmer) BPragCCD; Cdigo Completo (Code Complete) BCodeCC3D;Desarrollo Rpido (Rapid Development) B1DevCED; 5 La Programacin Extrema Explicada (Extreme Programming Explained) BFPCCD todos ense!an la programacin de computadoras 5 los aspectos m s grandes de ser un buen programador. $os ensa5os de Paul .ra9am BP.&iteD 5 Eric 1a5mond BHacGerD ciertamente deber2an ser le2dos antes o 0unto con este art2culo. Este ensa5o di-iere de esos e(celentes traba0os al en-ati#ar los problemas sociales 5 resumir comprensivamente el con0unto completo de 9abilidades necesarias a como 5o las percibo. En este ensa5o el t+rmino jefe se re-iere a )uien sea )ue te da pro5ectos para 9acer. Uso las palabrasnegocio; compa !a; 5 tri"#; sinnimamente e(cepto )ue negocio implica 9acer dinero; compa!2a implica el lugar moderno de traba0o 5 tribu es generalmente la gente con la )ue compartes lealtad. Bienvenido a la tribu. Captulo 2. Principiante Tabla de Contenido Habilidades Personales Aprende a Depurar Cmo Depurar Dividiendo el Espacio del Problema Cmo eliminar un Error Cmo Depurar Usando una Bit cora Cmo Comprender Problemas de Desempe!o Cmo Corregir Problemas de Desempe!o Cmo "ptimi#ar Ciclos Cmo $idiar con el Costo de la E%& Cmo Administrar la 'emoria Cmo $idiar con Bugs Intermitentes Cmo Aprender Habilidades de Dise!o Cmo Conducir E(perimentos Habilidades de E)uipo Por *u+ la Estimacin es Importante Cmo Estimar el ,iempo de Programacin Cmo Encontrar In-ormacin Cmo Utili#ar a la .ente como /uentes de In-ormacin Cmo Documentar &abiamente Cmo ,raba0ar con Cdigo Pobre

Cmo Usar el Control del Cdigo /uente Cmo Probar Unidades ,oma Descansos Cuando est+s Con-undido Cmo 1econocer Cu ndo Ir a Casa Cmo $idiar con .ente Di-2cil Habilidades Personales Aprende a Depurar $a depuracin es la piedra angular de ser un programador. El primer signi-icado del verbo dep#rar es eliminar errores; pero el signi-icado )ue realmente interesa es ver a lo interno de la ejec#cin de #n programa mediante s# examen. Un programador )ue no puede depurar e-ectivamente est ciego. $os idealistas )ue piensan )ue el dise!o; el an lisis; o la teor2a de la comple0idad; o lo )ue no es; son m s -undamentales no son programadores activos. El programador activo no vive en un mundo ideal. Incluso si eres per-ecto; est s rodeado por 5 debes interactuar con cdigo escrito por grandes compa!2as de so-t6are; organi#aciones como .4U; 5 tus colegas. $a ma5or2a de este cdigo es imper-ecto e imper-ectamente documentado. &in la capacidad de ganar visibilidad dentro de la e0ecucin de este cdigo el m s ligero golpe te tirar permanentemente. A menudo esta visibilidad puede ganarse solamente mediante la e(perimentacin; es decir; la depuracin. $a depuracin trata de la e0ecucin de programas; no de los programas mismos. &i compras algo de una compa!2a de so-t6are grande; usualmente no consigues ver el programa. Pero inclusive a92 aparecer n lugares donde el cdigo no se a0uste a la documentacin :el aterri#a0e de toda tu m )uina es un e0emplo comAn 5 espectacular=; o donde la documentacin es muda. Por lo general; creas un error; e(aminas el cdigo )ue escribiste 5 no tienes una pista de cmo puede estar ocurriendo el error. Inevitablemente; esto signi-ica )ue alguna suposicin )ue est s 9aciendo no es mu5 correcta; o )ue surge alguna condicin )ue no anticipaste. Algunas veces el truco m gico de ver detenidamente el cdigo -uente -unciona. Cuando no; debes depurar. Para conseguir visibilidad dentro de la e0ecucin de un programa debes ser capa# de e0ecutar el cdigo 5 observar algo acerca de +l. Algunas veces esto es visible; como lo )ue se muestra en una pantalla; o el retardo entre dos eventos. En muc9os otros casos; involucra cosas )ue no necesariamente deban estar visibles; como el estado de algunas variables dentro del cdigo; cu les l2neas de cdigo est n siendo actualmente e0ecutadas; o si ciertas a-irmaciones se mantienen a trav+s de una estructura de datos complicada. Esas cosas ocultas deben ser reveladas. $as -ormas comunes de ver dentro de las Hentra!asH de un programa en e0ecucin pueden ser categori#adas como@ Usar una 9erramienta de depuracin; Printlining III Hacer una modi-icacin temporal al programa; t2picamente adicionando l2neas )ue impriman in-ormacin; 5 $ogging III Crear una ventana permanente en la e0ecucin de los programas en la -orma de una bit cora.

$as 9erramientas de depuracin son maravillosas cuando son estables 5 est n disponibles; pero el printlining 5 el logging son aAn m s importantes. $as 9erramientas de depuracin a menudo se retrasan detr s del lengua0e de desarrollo; de tal manera )ue en cual)uier punto del tiempo pueden no estar disponibles. Adem s; debido a )ue la 9erramienta de depuracin puede cambiar sutilmente la -orma en )ue se e0ecuta el programa puede no ser siempre pr ctica. /inalmente; 9a5 algunos tipos de depuracin; tal como el c9e)ueo de una a-irmacin -rente a una gran estructura de datos; )ue re)uiere escribir cdigo 5 cambiar la e0ecucin del programa. Es bueno saber cmo usar las 9erramientas de depuracin cuando son estables; pero es cr2tico ser capa# de emplear los otros dos m+todos. Algunos principiantes temen depurar cuando ello re)uiere modi-icar cdigo. Esto es comprensibleIIIes un po)uito similar a la cirug2a e(ploratoria. Pero tA tienes )ue aprender a 9urgar en el cdigo 5 9acerlo saltarJ tienes )ue aprender a e(perimentar en +l; 5 comprender )ue nada )ue le 9agas temporalmente lo empeorar . &i sientes este temor; busca un mentorIIIperdemos un montn de buenos programadores en la delicada iniciacin de su aprendi#a0e debido a este temor. Cmo Depurar Dividiendo el Espacio del Problema $a depuracin es divertida; debido a )ue empie#a con un misterio. ,A piensas )ue deber2a 9acer algo; pero en lugar de ello 9ace algo m s. 4o siempre es tan simpleIII cuales)uiera e0emplos )ue 5o pueda dar ser n -or#ados o arti-iciales comparado a lo )ue algunas veces sucede en la pr ctica. $a depuracin re)uiere creatividad e ingenuidad. &i 9a5 una clave sencilla para depurar es usar en el misterio la t+cnica divide $ vencers. &upn; por e0emplo; )ue creaste un programa )ue deber2a 9acer die# cosas en secuencia. Cuando lo e0ecutas; aterri#a. Puesto )ue no lo programaste para )ue aterri#ara; a9ora tienes un misterio. Cuando observas la salida; ve# )ue las primeras siete cosas en la secuencia -ueron e0ecutadas e(itosamente. $as Altimas tres no son visibles en la salida; as2 )ue a9ora tu misterio es m s pe)ue!o@ HAterri# en la cosa KL; KC; o K1<.H MPuedes dise!ar un e(perimento para ver en cu l cosa aterri#N &eguro. Puedes usar un depurador o podemos agregar sentencias de impresin :o el e)uivalente en el lengua0e )ue sea en el )ue est+s traba0ando= despu+s de la KL 5 KC. Cuando lo e0ecutamos de nuevo; nuestro misterio ser m s pe)ue!o; puesto )ue HAterri# en la cosa KC.H Encuentro )ue mantener en mente e(actamente cu l es el misterio en cual)uier punto del tiempo a5uda a mantenerse en-ocado. Cuando varias personas est n traba0ando 0untas ba0o presin en un problema es - cil olvidar cu l es el misterio m s importante. $a clave para dividir 5 vencer como una t+cnica de depuracin es la misma )ue para el dise!o de algoritmos@ mientras 9agas un buen traba0o dividiendo el misterio a la mitad; no tendr s )ue dividirlo demasiadas veces; 5 estar s depurando r pidamente. Pero Mcu l es la mitad de un misterioN A92 es donde entra la verdadera creatividad 5 la e(periencia. Para un verdadero principiante; el espacio de todos los posibles errores luce como cada l2nea del cdigo -uente. 4o tienes la visin )ue m s tarde desarrollar s para ver las otras dimensiones del programa; tales como el espacio de l2neas e0ecutadas; las

estructuras de datos; el mane0o de la memoria; la interaccin con cdigo -or neo; el cdigo )ue es riesgoso; 5 el cdigo )ue es simple. Para el programador e(perimentado; esas otras dimensiones -orman un imper-ecto pero mu5 Atil modelo mental de todas las cosas )ue pueden ir mal. ,ener ese modelo mental es lo )ue le a5uda a uno a encontrar la mitad del misterio e-ectivamente. Una ve# )ue 9as subdividido eventualmente el espacio de todo lo )ue puede ir mal; debes intentar decidir en cu l espacio 5ace el error. En el caso simple dnde est el misterio@ HMCu l Anica l2nea desconocida 9ace aterri#ar a mi programaNH; puedes preguntarte a ti mismo@ HM&e e0ecuta la l2nea desconocida antes o despu+s de esa l2nea )ue 0u#go debe ser e0ecutada cerca de la mitad del programa en e0ecucinNH Usualmente no ser s tan a-ortunado como para saber )ue el error e(iste en una Anica l2nea; o aAn en un Anico blo)ue. A menudo el misterio ser m s o menos como@ H" 9a5 un puntero en ese gr -ico )ue apunta al nodo e)uivocado; o mi algoritmo )ue agrega las variables en ese gr -ico no -unciona.H En ese caso puede )ue tengas )ue escribir un pe)ue!o programa para c9e)uear )ue los punteros en el gr -ico son todos correctos a -in de decidir cu l parte del misterio subdividido puede ser eliminada. Cmo eliminar un Error He separado intencionalmente el acto de e(aminar la e0ecucin de un programa del acto de corregir un error. Pero por supuesto; dep#rar tambi+n signi-ica eliminar el bug. Idealmente tendr s per-ecta comprensin del cdigo 5 alcan#ar s un momento HOA0 PH donde per-ectamente ver s el error 5 cmo corregirlo. Pero debido a )ue tu programa a menudo usar sistemas insu-icientemente documentados en los cuales no tienes visibilidad; esto no siempre es posible. En otros casos el cdigo es tan complicado )ue tu comprensin no puede ser per-ecta. Al corregir un bug; deseas 9acer el m s pe)ue!o cambio )ue corri0a el bug. Puedes ver otras cosas )ue necesitan me0or2aJ pero no las corri0as al mismo tiempo. Intenta emplear el m+todo cient2-ico de cambiar una 5 solamente una cosa a la ve#. El me0or proceso para esto es ser capa# de reproducir - cilmente el bug; luego poner tu correccin en su lugar; 5 despu+s ree0ecutar el programa 5 observar )ue el bug no e(iste m s. Por supuesto; algunas veces debe ser cambiada m s de una l2nea; pero aAn deber2as aplicar conceptualmente un Anico cambio atmico para corregir el bug. A veces; 9a5 en realidad varios bugs )ue se ven como uno. Es tu traba0o de-inirlos 5 corregirlos uno a la ve#. Algunas veces no es claro )u+ deber2a 9acer el programa o )u+ intent el autor original. En ese caso; debes e0ercitar tu e(periencia 5 tu 0uicio 5 asignar tu propio signi-icado al cdigo. Decide )u+ deber2a 9acer; 5 com+ntalo o clari-2calo de alguna -orma 5 luego 9a# )ue el cdigo concuerde con tu signi-icado. Esta es una 9abilidad intermedia o avan#ada )ue es a veces m s di-2cil de ad)uirir )ue el escribir la -uncin original en primera instancia; pero el mundo real a menudo es desordenado. Puede )ue tengas )ue corregir un sistema )ue no puedes reescribir. Cmo Depurar Usando una it!cora

El logging es la pr ctica de escribir un sistema de tal manera )ue produ#ca una secuencia de registros in-ormativos; llamado "itcora (log). El printlining consiste en producir tan solo una bit cora simple; usualmente temporal. $os verdaderos principiantes deben entender 5 usar bit coras por)ue su conocimiento de la programacin es limitadoJ los ar)uitectos de sistemas deben comprender 5 usar

bit coras debido a la comple0idad del sistema. $a cantidad de in-ormacin )ue provea la bit cora deber2a ser con-igurable; idealmente mientras el programa est en e0ecucin. En general; las bit coras o-recen tres venta0as b sicas@ $as bit coras pueden proveer in-ormacin Atil sobre bugs )ue son di-2ciles de reproducir :tales como los )ue ocurren en el ambiente de produccin pero )ue no pueden ser reproducidos en el ambiente de prueba=. $as bit coras pueden proveer estad2sticas 5 datos relevantes para el desempe!o; tales como el tiempo )ue pasa entre sentencias. Cuando son con-igurables; las bit coras permiten )ue se capture in-ormacin general a -in de depurar problemas espec2-icos no anticipados sin tener )ue modi-icar 5%o reimplementar el cdigo lo su-iciente como para lidiar con esos problemas espec2-icos.

$a cantidad de salida a poner en la bit cora es siempre un compromiso entre in-ormacin 5 brevedad. Demasiada in-ormacin 9ace la bit cora costosa 5 produce ceg#era de despla%amiento ; 9aciendo di-2cil el encontrar la in-ormacin )ue necesitas. 'u5 poca in-ormacin 5 puede )ue no contenga lo )ue necesitas. Por esta ra#n; 9acer con-igurable lo )ue es salida para la bit cora es mu5 Atil. ,2picamente; cada registro en la bit cora identi-icar su posicin en el cdigo -uente; el 9ilo )ue lo e0ecut si es aplicable; la 9ora precisa de e0ecucin; 5; comAnmente; una pie#a Atil de in-ormacin adicional; tal como el valor de alguna variable; la cantidad de memoria libre; el nAmero de ob0etos de datos; etc. Esas sentencias de la bit cora est n diseminadas a trav+s del cdigo -uente pero particularmente en los puntos de las -uncionalidades m s grandes 5 alrededor del cdigo riesgoso. A cada sentencia se le puede asignar un nivel 5 solamente generar un registro si el sistema est actualmente con-igurado para generar salida de ese nivel. Deber2as dise!ar las sentencias bit cora para mane0ar problemas )ue anticipes. Anticipa la necesidad de medir el desempe!o. &i tienes una bit cora permanente; el printlining puede 9acerse a9ora en t+rminos de los registros de la bit cora; 5 algunas de las sentencias de depuracin probablemente ser n a!adidas permanentemente al sistema de registro de la bit cora. Cmo Comprender Problemas de Desempe"o Aprender a comprender el desempe!o de un sistema en e0ecucin es inevitable por la misma ra#n )ue tiene el aprender a depurar. Incluso si el cdigo )ue comprendes per-ectamente es 0ustamente el costo del cdigo )ue escribes; tu cdigo 9ar llamadas a lo interno de otros sistemas de so-t6are sobre los )ue tienes poco control o visibilidad. &in embargo; en la pr ctica los problemas de desempe!o son un poco di-erentes 5 un poco m s - ciles )ue la depuracin en general. &upn )ue tA o tus clientes consideran )ue un sistema o un subsistema es mu5 lento. Antes de )ue intentes 9acerlo m s r pido; debes construir un modelo mental de por )u+ es lento. Para 9acer esto puedes usar una 9erramienta de per-ilacin o una buena bit cora para determinar realmente dnde est n siendo gastados el tiempo 5 los otros recursos. Ha5 un -amoso dic9o de )ue el C<Q del tiempo ser gastado en 1<Q del cdigo. >o a!adir2a a eso la importancia de los costos de entrada%salida :E%&= a los tpicos de desempe!o. A menudo la ma5or parte del tiempo se gasta en E%& de una -orma u otra. Encontrar la E%& costosa 5 el costoso 1<Q del cdigo es un buen primer paso para construir tu modelo mental.

Ha5 muc9as dimensiones relacionadas al desempe!o de un sistema computacional; 5 muc9os recursos consumidos. El primer recurso a medir es el tiempo del reloj de pared; el tiempo total )ue pasa para la computacin. 1egistrar en la bit cora el tiempo del relo0 de pared es particularmente valioso debido a )ue +l puede in-ormar acerca de circunstancias impredecibles )ue surgen en situaciones donde otra -orma de per-ilacin es impr ctica. &in embargo; esto podr2a no siempre representar toda la escena. Algunas veces algo )ue toma un poco m s de tiempo pero )ue no )uema tantos segundos del procesador ser muc9o me0or con lo )ue tienes )ue lidiar realmente en el ambiente computacional. &imilarmente; la memoria; el anc9o de banda de la red; la base de datos u otros accesos a servidores pueden; al -inal; ser muc9o m s costosos )ue los segundos del procesador. $a contencin de recursos compartidos )ue est n sincroni#ados puede causar estancamiento e inanicin. El estancamiento es la incapacidad para proceder debido a la inapropiada sincroni#acin o demanda de recursos. $a inanicin es la -alla al calendari#ar apropiadamente un componente. &i puede ser del todo anticipado; es me0or tener una -orma de medir esta contencin desde el inicio de tu pro5ecto. AAn si esta contencin no ocurre; es mu5 Atil ser capa# de a-irmar eso con con-ian#a. Cmo Corre#ir Problemas de Desempe"o $a ma5or2a de los pro5ectos de so-t6are pueden 9acerse con relativamente poco es-uer#o de 1< a 1<< veces m s r pido de lo )ue son la primera ve# )ue son liberados. Ba0o la presin del tiempo de mercadeo; es tan sabio como e-ectivo elegir una solucin )ue obtenga el traba0o 9ec9o simple 5 r pidamente; pero menos e-iciente )ue alguna otra solucin. &in embargo; el desempe!o es una parte de la usabilidad; 5 a menudo debe eventualmente ser considerado m s cuidadosamente. $a clave para me0orar el desempe!o de un sistema mu5 complicado es anali#arlo lo su-icientemente bien para encontrar los c#ellos de "otella; o lugares donde se consumen la ma5or2a de los recursos. 4o tiene muc9o sentido optimi#ar una -uncin )ue cuenta solamente para el 1Q del tiempo de cmputo. Como una regla de ganadores deber2as pensar cuidadosamente antes de 9acer algo a menos )ue pienses )ue va a 9acer al sistema o a una parte signi-icativa de +l al menos dos veces m s r pida. Usualmente 9a5 una -orma de 9acer esto. Considera los tests 5 los es-uer#os de aseguramiento de la calidad )ue tu cambio re)uerir . Cada cambio trae una prueba apare0ada con +l; de tal manera )ue es muc9o me0or tener unos cuantos grandes cambios. Despu+s de )ue 9as 9ec9o una me0ora de dos pliegues en algo; necesitas al menos repensar 5 )ui# reanali#ar para descubrir el siguiente cuello de botella m s costoso en el sistema; 5 atacar eso para obtener otra me0ora de dos pliegues. A menudo; los cuellos de botella en el desempe!o ser n un e0emplo de contar vacas mediante el conteo de piernas 5 dividiendo entre cuatro; en lugar de contar cabe#as. Por e0emplo; 9e cometido errores tales como -allar al proveer un sistema de base de datos relacional con un 2ndice apropiado sobre una columna )ue observ+ muc9o; lo cual probablemente la 9i#o al menos 2< veces m s lenta. "tros e0emplos inclu5en 9acer E%& innecesaria en ciclos internos; de0ar sentencias de depuracin )ue no se necesitaban m s; asignacin de memoria innecesaria; 5; en particular; uso ine(perto de bibliotecas 5 otros subsistemas )ue a menudo est n pobremente documentados con

respecto al desempe!o. Este tipo de me0ora es a veces llamada fr#ta de c#elg#e "ajo; )ue signi-ica )ue puede ser - cilmente elegida para proveer algAn bene-icio. M*u+ 9aces cuando empie#as a )uedarte sin -rutas de cuelgue ba0oN Bien; puedes alcan#ar las m s altas; o derribar el rbol. Puedes continuar 9aciendo pe)ue!as me0oras o puedes redise!ar seriamente un sistema o un subsistema. :Esta es una gran oportunidad para usar tus 9abilidades de buen programador; no solamente en el nuevo dise!o sino tambi+n en convencer a tu 0e-e )ue esta es una buena idea.= &in embargo; antes de )ue argumentes por el redise!o de un subsistema; deber2as preguntarte a ti mismo si tu propuesta lo 9ar o no de cinco a die# veces me0or. Cmo $ptimi%ar Ciclos A veces encontrar s ciclos; o -unciones recursivas; )ue toman un largo tiempo para e0ecutarse 5 son cuellos de botella en tu producto. Antes de )ue intentes 9acer el ciclo un poco m s r pido; invierte unos pocos minutos en considerar si 9a5 -orma de eliminarlo completamente. M/uncionar2a un algoritmo di-erenteN MPodr2as computar eso mientras computas algo m sN &i no puedes 9allar una manera de me0orarlo; entonces puedes optimi#ar el ciclo. Esto es simple@ mueve material -uera. Al -inal; esto re)uerir no solamente ingenuidad sino tambi+n una comprensin del costo de cada tipo de sentencia 5 e(presin. He a)u2 algunas sugerencias@ elimina operaciones de punto -lotante. 4o asignes nuevos blo)ues de memoria innecesariamente. Pliega constantes 0untas. 'ueve E%& a un bA-er. ,rata de no dividir. ,rata de no 9acer costosas conversiones de tipo. 'ueve un puntero en lugar de recomputar 2ndices.

El costo de casa una de esas operaciones depende de tu sistema espec2-ico. En algunos sistemas los compiladores 5 el 9ard6are 9acen esas cosas por ti. El cdigo claro 5 e-iciente es me0or )ue el cdigo )ue re)uiere la comprensin de una plata-orma particular. Cmo &idiar con el Costo de E'( Para un montn de problemas; los procesadores son r pidos comparados al costo de comunicarse con un dispositivo de 9ard6are. Este costo es usualmente abreviado E%&; 5 puede incluir costo de red; E%& de disco; consultas de bases de datos; E%& de arc9ivo; 5 otro uso del algAn 9ard6are no mu5 cercano al procesador. Por lo tanto construir un sistema r pido es a menudo m s una cuestin de me0orar la E%& )ue me0orar el cdigo en algAn ciclo a0ustado; e incluso me0orar un algoritmo. Ha5 dos t+cnicas mu5 -undamentales para me0orar la E%&@ el cac9eo 5 la representacin. El cac9eo es evitar la E%& :generalmente evitando la lectura de algAn valor abstracto= mediante el almacenamiento local de una copia de ese valor de manera )ue no se e0ecuta ninguna E%& para obtener el valor. $a primer clave para el cac9eo es 9acer claro como el cristal cu l dato es el maestro 5 cu les son lascopias. Ha5 solamente un maestroIII punto. El cac9eo trae consigo el peligro de )ue la copia algunas veces no pueda re-le0ar los cambios instant neamente al maestro.

$a representacin es el m+todo de 9acer la E%& m s barata representando los datos m s e-icientemente. Esto est a menudo en tensin con otras demandas; como la legibilidad 9umana 5 la portabilidad. $as representaciones pueden a menudo ser me0oradas por un -actor de dos o tres de su primera implementacin. $as t+cnicas para 9acer esto inclu5en usar una representacin binaria en lugar de una )ue sea legible para los 9umanos; transmitir un diccionario de s2mbolos 0unto con los datos de tal manera )ue a la larga los s2mbolos no tengan )ue ser codi-icados; 5; en el e(tremo; cosas como la codi-icacin Hu--man. Una tercer t+cnica )ue es a veces posible es me0orar la localidad de re-erencia empu0ando la computacin m s cerca de los datos. Por e0emplo; si est s le5endo algunos datos de una base de datos 5 computando algo simple de ella; tal como una sumatoria; trata de 9acer )ue el servidor de la base de datos lo 9aga por ti. Esto es altamente dependiente del tipo de sistema con el )ue est+s traba0ando; pero deber2as e(plorarlo. Cmo Administrar la )emoria $a memoria es un recurso precioso del )ue no puedes darte el lu0o de adolecer. Puedes ignorarla por un momento pero eventualmente tendr s )ue decidir cmo administrarla. El espacio )ue necesita para persistir m s all del alcance de una sencilla subrutina es a menudo llamado heap asignado. Un tro#o de memoria es inAtil; 5 por lo tanto "as#ra; cuando nada lo re-erencia. Dependiendo del sistema )ue uses; puede )ue tengas )ue desasignar e(pl2citamente la memoria tu mismo cuando est a punto de convertirse en basura. 'u5 a menudo puedes ser capa# de usar un sistema )ue proporcione un recolector de "as#ra. Un recolector de basura nota la basura 5 libera su espacio sin ninguna accin re)uerida por el programador. $a recoleccin de basura es maravillosa@ reduce los errores e incrementa la brevedad del cdigo 5 la concisin de -orma barata. Rsala cuando puedas. Pero aAn con la recoleccin de basura; puedes llenar toda la memoria con basura. Un error cl sico es usar una tabla 9as9 como un cac9+ 5 olvidar eliminar las re-erencias en dic9a tabla. Puesto )ue las re-erencias se mantienen; el re-erente es no recolectable sino inAtil. Esto es llamado una f#ga de memoria. Debes observar 5 corregir temprano las -ugas de memoria. &i tienes tiempo de estar corriendo sistemas puede )ue la memoria nunca se agote durante las pruebas pero ser agotada por el usuario. $a creacin de nuevos ob0etos es moderadamente costosa en cual)uier sistema. $a memoria asignada directamente en las variables locales de una subrutina; sin embargo; es usualmente barata debido a )ue la pol2tica para liberarla puede ser mu5 simple. Deber2as evitar la creacin innecesaria de ob0etos. Un caso importante ocurre cuando puedes de-inir un l2mite superior en el nAmero de ob0etos )ue necesitar s a la ve#. &i todos esos ob0etos toman la misma cantidad de memoria; puedes ser capa# de asignar un Anico blo)ue de memoria; o un bA-er; para contenerlas todas. $os ob0etos )ue necesitas pueden ser ubicados 5 liberados dentro de este bA-er en un patrn de rotacin -i0o; por lo cual esto es llamado a veces un bA-er circular. Esto es usualmente m s r pido )ue la asignacin 9eap.

Algunas veces tienes )ue liberar e(pl2citamente el espacio asignado de tal -orma )ue pueda ser reasignado en lugar de con-iar en la recoleccin de basura. $uego debes aplicar cuidadosamente la inteligencia para cada tro#o de memoria asignada 5 dise!ar un m+todo para )ue sea desasignada en el momento apropiado. El m+todo puede di-erir para cada tipo de ob0eto )ue crees. Debes asegurarte )ue cada e0ecucin de una operacin de asignacin de memoria coincida eventualmente con una desasignacin de memoria. Esto es tan di-2cil )ue los programadores a menudo implementan simplemente una -orma rudimentaria de recoleccin de basura; tal como un conteo de re-erencia; para 9acer esto por ellos. Cmo &idiar con u#s Intermitentes

El bug intermitente es primo del escorpin espacial invisible de S< pies. Esta pesadilla ocurre tan raras veces )ue es di-2cil de observar; pero lo su-icientemente a menudo como para )ue no pueda ser ignorado. 4o puedes depurarlo por)ue no puedes encontrarlo. Aun)ue despu+s de L 9oras empe#ar s a dudarlo; el bug intermitente tiene )ue obedecer a las mismas le5es de la lgica )ue todo lo dem s. $o )ue lo 9ace di-2cil es )ue ocurre solamente ba0o condiciones desconocidas. ,rata de registrar las circunstancias ba0o las cuales ocurre el bug; de tal manera )ue puedas adivinar realmente en )u+ 5ace la variabilidad. $a condicin puede estar relacionada a los valores de los datos; tales como HEsto slo sucede cuando introducimos &$oming como valor.H &i eso no es la -uente de la variabilidad; la pr(ima sospec9a deber2a ser la concurrencia inapropiadamente sincroni#ada. ,rata; trata; trata de reproducir el bug de una -orma controlada. &i no puedes reproducirlo; con-igura una trampa para +l mediante la construccin de un sistema de registro de sucesos :logging=; una especial si tienes )ue 9acerlo; )ue pueda registrar lo )ue supones )ue necesitas cuando realmente ocurre. 1es2gnate a ti mismo a )ue si el bug solamente ocurre en produccin 5 no a tu anto0o; este sea )ui# un largo proceso. $as pistas )ue obtengas de la bit cora puede )ue no proporcionen la solucin pero pueden darte su-iciente in-ormacin para me0orar el registro de sucesos. El sistema me0orado de registro de sucesos puede re)uerir un largo tiempo para estar en produccin. $uego; tienes )ue esperar a )ue reapare#ca el bug para obtener m s in-ormacin. Este c2rculo puede seguir por algAn tiempo. El bug intermitente m s estApido )ue 9e creado -ue en una implementacin multiI9ilo de un lengua0e de programacin -uncional para un pro5ecto de clase. 'e 9ab2a asegurado cuidadosamente de la correcta evaluacin concurrente del programa -uncional 5 la buena utili#acin de todas las CPUs disponibles :oc9o; en este caso=. &implemente olvid+ sincroni#ar el recolector de basura. El sistema podr2a correr un largo tiempo; a menudo -inali#ando cual)uier tarea )ue comen#ara; antes de )ue algo notable -uese mal. Esto5 avergon#ado al admitir )ue 9ab2a comen#ado a cuestionar al 9ard6are antes de )ue mi error me pusiera en evidencia. En el traba0o recientemente ten2amos un bug intermitente )ue nos tom varias semanas encontrar. ,enemos servidores de aplicacin multiI9ilados en 7avaT detr s de servidores 6eb Apac9eT. Para mantener cambios de p gina r pidos; 9acemos toda la E%& en pe)ue!os con0untos de cuatro 9ilos separados )ue son di-erentes de los 9ilos cambia p ginas. Aparentemente cada cierto tiempo esos 9ilos se HclavabanH 5 cesaban de 9acer cual)uier cosa Atil; 9asta )ue nuestro registro de sucesos nos permiti

determinarlo; por 9oras. Puesto )ue ten2amos cuatro 9ilos; esto no era en s2 mismo un problema giganteIIIa menos )ue los cuatro se clavaran. $uego esas colas vaciadas por esos 9ilos r pidamente llenar2an toda la memoria disponible 5 9ac2an aterri#ar nuestro servidor. 4os tom cerca de una semana entender esto; 5 aAn no sab2amos )u+ lo causaba; cu ndo suced2a; e incluso )u+ estaban 9aciendo los 9ilos cuando se HclavabanH. Esto ilustra algunos riesgos asociados con so-t6are de terceros. Est bamos usando una pie#a de cdigo licenciada )ue elimin las eti)uetas H,'$ del te(to. Debido a su lugar de origen nos re-er2amos a +l entra!ablemente como Hel stripper -ranc+s.H Aun)ue ten2amos el cdigo -uente :Obondadosa graciaP= no lo 9ab2amos estudiado cuidadosamente 9asta cuando activamos el registro de sucesos en nuestros servidores )ue -inalmente nos dimos cuenta )ue los 9ilos del email estaban clavando en el stripper -ranc+s. El stripper se desempe!aba bien e(cepto en algunos largos e inusuales tipos de te(tos. En esos te(tos; el cdigo era cuadr tico o peor. Esto signi-ica )ue el tiempo de procesamiento era proporcional al cuadrado de la longitud del te(to. &i esos te(tos 9ubieran ocurrido comAnmente; 9ubi+semos encontrado el bug de inmediato. &i no 9ubieran ocurrido del todo; nunca 9ubi+semos tenido un problema. Como suele suceder; nos tom semanas para -inalmente comprender 5 resolver el problema. Cmo Aprender Habilidades de Dise"o Para aprender cmo dise!ar so-t6are; estudia la accin de un mentor estando -2sicamente presente cuando +l est dise!ando. $uego estudia pie#as de so-t6are bien escritas. Despu+s de eso; puedes leer algunos libros sobre las Altimas t+cnicas de dise!o. $uego debes 9acerlo tA mismo. Empie#a con un pro5ecto pe)ue!o. Cuando -inalmente 9a5as terminado; considera cmo -all o cmo tuvo +(ito el dise!o 5 cmo divergiste de tu concepcin original. $uego mu+vete 9acia pro5ectos m s grandes; pre-erentemente en con0unto con otras personas. El dise!o es una cuestin de 0uicio )ue toma a!os ad)uirir. Un programador inteligente puede aprender los -undamentos adecuadamente en dos meses 5 puede me0orar a partir de a92. Es natural 5 Atil desarrollar tu propio estilo; pero recuerda )ue el dise!o es un arte; no una ciencia. $a gente )ue escribe libros sobre el tema tiene un marcado inter+s en 9acerlo parecer cient2-ico. 4o te vuelvas dogm tico acerca de estilos de dise!o particulares. Cmo Conducir E*perimentos El gran Edsger Di0Gstra 9a e(plicado elocuentemente )ue la Ciencia de la Computacin no es una ciencia e(perimental BE(pC&D 5 no depende de computadoras electrnicas. Como +l lo se!al re-iri+ndose a los 1CE<s BUni-eD; ...el da!o estaba 9ec9o@ el tpico se volvi conocido como Vla ciencia de la computadoraWIIIlo cual; de 9ec9o; es como re-erirse a la cirug2a como Vla ciencia del cuc9illoW III 5 -ue -irmemente implantado en las mentes de las personas )ue la ciencia de la computacin es acerca de m )uinas 5 sus e)uipos peri-+ricos.

$a programacin no debe ser una ciencia e(perimental; pero la ma5or2a de los programadores activos no tienen el lu0o de enca0ar en lo )ue Di0Gstra )uiso dar a entender por ciencia de la computacin. Debemos traba0ar en el campo de la e(perimentacin; igual )ue algunos; pero no todos; los -2sicos. &i dentro de treinta a!os la programacin puede ser reali#ada sin e(perimentacin; ser un gran logro para la Ciencia de la Computacin. $os tipos de e(perimentos )ue tendr s )ue reali#ar inclu5en@ Probar sistemas con pe)ue!os e0emplos para veri-icar )ue se a0ustan a la documentacin o para comprender sus respuestas cuando no 9a5 documentacin; Probar pe)ue!os cambios en el cdigo para ver si realmente corrigen un bug; 'edir el desempe!o de un sistema ba0o dos di-erentes condiciones debido al conocimiento imper-ecto de sus caracter2sticas de desempe!o; C9e)uear la integridad de los datos; 5 1ecolectar estad2sticas )ue podr2an dar pistas para la solucin de bugs di-icultosos o di-2ciles de repetir.

4o creo )ue en este ensa5o pueda e(plicar el dise!o de e(perimentosJ tendr s )ue estudiar 5 practicar. &in embargo; puedo o-recerte dos pe)ue!os conse0os. Primero; trata de ser mu5 claro acerca de tu 9iptesis; o la a-irmacin )ue est s tratando de probar. ,ambi+n a5uda el escribir la 9iptesis; especialmente si te encuentras a ti mismo con-undido o est s traba0ando con otros. A menudo te encontrar s a ti mismo teniendo )ue dise!ar una serie de e(perimentos; cada uno de los cuales est basado en el conocimiento ganado a partir del Altimo. Por lo tanto; deber2as dise!ar tus e(perimentos para )ue proporcionen la ma5or in-ormacin posible. Desa-ortunadamente; esto est en con-licto con el mantener cada e(perimento simpleIIItendr s )ue desarrollar este 0uicio a trav+s de la e(periencia. Habilidades de E+uipo Por ,u- la Estimacin es Importante ,ener un sistema de so-t6are -uncional en uso activo tan r pidamente como sea posible no solamente re)uiere planear el desarrollo; sino tambi+n planear la documentacin; la implementacin 5 el mercadeo. En un pro5ecto comercial ello tambi+n re)uiere ventas 5 -inan#as. &in la previsibilidad del tiempo de desarrollo; es imposible planear esas cosas e-ectivamente. $a buena estimacin proporciona previsibilidad. $os administradores la aman; tan bien como deber2an. El 9ec9o de )ue es imposible; tanto terica como pr cticamente; el predecir e(actamente cu nto tiempo tomar desarrollar so-t6are est a menudo perdido en los administradores. &e nos pide 9acer este imposible todo el tiempo; 5 debemos encararlo 9onestamente. &in embargo; ser2a des9onesto no admitir la imposibilidad de esta tarea; 5 cuando sea necesario; e(plicarla. Ha5 muc9o espacio para los problemas de comunicacin sobre los estimados; puesto )ue la gente tiene una sorprendente tendencia a pensar deseosamente )ue la oracin@

Estimo )ue; si comprendo realmente el problema; 9a5 S<Q de probabilidades de )ue estar listo en cinco semanas :si nadie nos molesta durante ese tiempo=. realmente signi-ica@ Prometo tenerlo 9ec9o en cinco semanas. Este comAn problema de interpretacin re)uiere )ue e(pl2citamente discutas )u+ signi-ica el estimado con tu 0e-e o cliente como si ellos -ueran unos simplones. 1eplantea tu suposiciones; no importa cu n obvias te pare#can. Cmo Estimar el Tiempo de Pro#ramacin $a estimacin toma pr ctica. ,ambi+n conlleva traba0o. 1e)uiere tanto traba0o )ue puede ser una buena idea estimar el tiempo )ue tomar 9acer el estimado; especialmente si se te pide estimar algo grande. Cuando se nos pide proporcionar un estimado de algo grande; la cosa m s 9onesta por 9acer es detenerte. $a ma5or2a de los ingenieros son entusiastas 5 propensos a agradar; 5 el )ue detengas ciertamente desagradar al detenido. Pero un estimado al vuelo probablemente no ser preciso ni 9onesto. 'ientras est s en standb5; puede )ue sea posible considerar el 9acer un prototipo de la tarea. &i la presin pol2tica lo permite; esta es la -orma m s e(acta de producir el estimado; 5 constitu5e un progreso real. Cuando no es posible tomarse tiempo para alguna investigacin; deber2as establecer primero el signi-icado del estimado mu5 claramente. 1eplantea ese signi-icado como la primera 5 Altima parte de tu estimado escrito. Prepara un estimado escrito descomponiendo la tarea en subtareas progresivamente m s pe)ue!as 9asta )ue cada una de esas pe)ue!as tareas no e(ceda m s )ue un d2aJ idealmente a la ma5or2a en duracin. $o m s importante es no de0ar nada -uera. Por e0emplo; la documentacin; la prueba; el tiempo para la planeacin; el tiempo para comunicarse con otros grupos; 5 las -ec9as de vacaciones son tambi+n todas mu5 importantes. &i pasas una parte de cada d2a lidiando con cabe#aduras; inclu5e un 2tem para eso en el estimado. Ello le da a tu 0e-e la visibilidad de en )u+ est us ndose tu tiempo 9asta el m2nimo; 5 podr2a procurarte m s tiempo. Cono#co buenos ingenieros )ue rellenan estimados impl2citamente; pero te recomiendo )ue no lo 9agas. Uno de los resultados de rellenar es con-iar en )ue pueden reducirte. Por e0emplo; un ingeniero podr2a estimar tres d2as para una tarea )ue realmente piensa )ue tomar un d2a. El ingeniero puede planear el pasar dos d2as document ndolo; o dos d2as traba0ando en algAn otro pro5ecto Atil. Pero ser visible )ue la tarea -ue 9ec9a en solamente un d2a :si resulta ser as2=; 5 nacer la apariencia de -lo0era o sobreestimacin del tiempo. Es muc9o me0or brindar una apropiada visibilidad de lo )ue realmente est s 9aciendo. &i la documentacin toma dos veces m s tiempo )ue la codi-icacin 5 el estimado as2 lo dice; se gana una tremenda venta0a al 9acer esto visible al administrador. En su lugar rellena e(pl2citamente. &i una tarea probablemente tomar un d2aIIIpero podr2a tomar die# si tu m+todo no -uncionaIII9as notar esto de algAn modo en el estimado si puedesJ si no; al menos 9a# un promedio ponderado por tus estimados de

las probabilidades. Cual)uier -actor de riesgo )ue puedas identi-icar 5 asignarle un estimado deber2a ir en el calendario. Es poco probable )ue una persona pueda estar en-erma en alguna semana dada. Pero un pro5ecto grande con muc9os ingenieros tendr algAn tiempo de en-ermedadJ al igual )ue tiempo para vacaciones. M> )u+ 9a5 de la probabilidad de un seminario de entrenamiento obligatorio para toda la compa!2aN &i puede ser estimado; inclA5elo. E(isten por supuesto; desconocidos desconocidos; o #n'(#n's :del ingl+s unGno6nIunGno6ns=. $os unGIunGs por de-inicin no pueden ser estimados individualmente. Puedes intentar crear un 2tem global para todos los unGIunGs; o mane0arlos de alguna otra -orma para )ue puedas comunic rselo a tu 0e-e. 4o puedes; sin embargo; permitir )ue tu 0e-e olvide )ue ellos e(isten; 5 es endiabladamente - cil para un estimado convertirse en un programa sin )ue sean considerados los unGIunGs. En un entorno de e)uipo; deber2as tratar de tener a la gente )ue 9ar el traba0o de elaborar el estimado; 5 deber2as intentar tener un consenso con el e)uipo en general sobre los estimados. $a gente var2a ampliamente en 9abilidad; e(periencia; preparacin; 5 con-ian#a. $a calamidad golpea cuando un programador -uerte estima para +l mismo 5 luego se le mantiene este estimado a los programadores d+biles. El 9ec9o de tener de acuerdo al e)uipo completo en una base de l2nea por l2nea del estimado clari-ica la comprensin del e)uipo; al igual )ue permite la oportunidad para la reasignacin t ctica de recursos :por e0emplo; intercambiar carga de traba0o de miembros del e)uipo m s d+biles a otros m s -uertes=. &i e(isten grandes riesgos )ue no puedan ser evaluados; es tu deber establecerlos lo su-icientemente -uerte como para )ue tu administrador no se comprometa a ellos 5 luego se avergXence cuando sucedan los riesgos. Hope-ull5 en tales casos se 9ar lo )ue sea necesario para disminuir el riesgo. &i puedes convencer a tu compa!2a de usar la Programacin Extrema; solamente tendr s )ue estimar cosas relativamente pe)ue!as; 5 esto es tan divertido como productivo. Cmo Encontrar In.ormacin $a naturale#a de lo )ue necesitas saber determina cmo deber2as encontrarlo. &i necesitas in-ormacin so"re cosas concretas )ue son ob0etivas 5 - ciles de veri-icar; por e0emplo el Altimo nivel de parc9eo de un producto so-t6are; pregunta cort+smente a un gran nAmero de personas busc ndolas en la Internet o colocando mensa0es en un grupo de discusin. 4o bus)ues en la Internet algo )ue sabe o tiene un de0o de opinin o interpretacin sub0etiva@ el nivel de tonter2as en las )ue con-iar es demasiado alto. &i necesitas conocimiento general so"re algo s#"jetivo como la 9istoria o lo )ue la gente 9a pensado acerca de ella; ve a la biblioteca :el edi-icio -2sico en el cual 9a5 libros almacenados=. Por e0emplo; para aprender sobre matem tica u 9ongos o misticismo; ve a la biblioteca. &i necesitas saber cmo hacer algo )#e no es trivial consigue dos o tres libros sobre el tema 5 l+elos. Podr2as aprender cmo 9acer algo trivial; como instalar un pa)uete de so-t6are; desde la Internet. Puedes incluso aprender cosas importantes; como buenas t+cnicas de programacin; pero puedes - cilmente pasar m s tiempo buscando 5

ordenando los resultados e intentar adivinar la autoridad de los resultados )ue lo )ue tomar2a leer la parte pertinente de un slido libro. &i necesitas informacin )#e nadie ms podr!a esperarse )#e sepa por e0emplo; HM-unciona esta nueva marca de so-t6are sobre con0untos de datos gigantescosNH; aAn debes buscar en la Internet 5 la biblioteca. Despu+s de )ue esas opciones est+n completamente agotadas; puedes dise!ar un e(perimento para comprobarlo. &i )uieres una opinin o un 0uicio de valor )ue tome en cuenta alguna circunstancia Anica; 9abla con un e(perto. Por e0emplo; si )uieres saber si es una buena idea o no el construir un sistema de mane0o de base de datos en $I&P; deber2as 9ablar con un e(perto en $I&P 5 a un e(perto en bases de datos. &i )uieres saber )#* tan pro"a"le es )ue e(ista un algoritmo m s r pido para una aplicacin particular )ue no 9a5a sido publicado; 9abla con alguien )ue traba0e en ese campo. &i )uieres 9acer una decisin personal )#e solamente t+ p#edes hacer como si deber2as o no empe#ar un negocio; intenta poner por escrito una lista de argumentos a -avor 5 en contra de la idea. &i eso -alla; considera la adivinacin. &upn )ue 9as estudiado la idea desde todos los ngulos; 9a# 9ec9o toda tu tarea en casa; 5 anali#ado en tu mente todas las consecuencias 5 pros 5 contras; 5 todav2a est s indeciso. A9ora debes seguir a tu cora#n 5 decirle a tu cerebro )ue se calle. $a multitud de t+cnicas de adivinacin disponibles son mu5 Atiles para determinar tus propios deseos semiconscientes; puesto )ue cada uno de ellos presenta un patrn aleatorio 5 completamente ambiguo al )ue tu propio subconsciente asignar signi-icado. Cmo Utili%ar a la /ente como 0uentes de In.ormacin 1espeta el tiempo de cada persona 5 balanc+alo -rente al tu5o propio. El 9acer a alguien una pregunta conlleva muc9o m s )ue slo recibir la respuesta. $a persona aprende sobre ti; tanto al dis-rutar de tu presencia como al escuc9ar la pregunta particular. ,u aprendes sobre la persona de la misma -orma; 5 puedes aprender la respuesta )ue buscas. Esto es usualmente muc9o m s importante )ue tu pregunta. &in embargo; el valor de esto disminu5e entre m s lo repitas. Est s; despu+s de todo; usando la comodidad m s preciada )ue una persona tiene@ su tiempo. $os bene-icios de la comunicacin deben ser sopesados -rente a los costos. Adem s; los costos 5 los bene-icios particulares derivados di-ieren de persona a persona. Creo -irmemente )ue un e0ecutivo de 1<< personas deber2a invertir cinco minutos de su tiempo al mes 9ablando con cada persona de su organi#acin; lo cual representar2a cerca del SQ de su tiempo. Pero die# minutos podr2an ser demasiados; 5 cinco es demasiado si tienen mil empleados. $a cantidad de tiempo )ue inviertes 9ablando con cada persona en tu organi#acin depende de su rol :m s )ue de su posicin=. Deber2as 9ablar con tu 0e-e m s )ue con el 0e-e de tu 0e-e; pero deber2as 9ablar un poco con el 0e-e de tu 0e-e. Puede ser incmodo; pero creo )ue tienes el deber de 9ablar un po)uito con todos tus superiores; cada mes; no importa de )u+. $a regla b sica es )ue todos se bene-ician de 9ablar un po)uito contigo; 5 entre m s 9ablen contigo; menos bene-icio deriva. Es tu traba0o proporcionarles ese bene-icio; 5

obtener el bene-icio de comunicarte con ellos; manteniendo el bene-icio en balance con el tiempo invertido. Es importante respetar tu propio tiempo. &i 9ablas con alguien; incluso si ello les costar tiempo; te a9orrar una gran cantidad de tiempo; entonces deber2as 9acerlo a menos )ue pienses )ue su tiempo es m s valioso )ue el tu5o; para la tribu; por ese -actor. Un raro e0emplo de esto es el interno de verano. 4o puede esperarse )ue un interno de verano en una posicin altamente t+cnica logre muc9oJ puede esperarse de +l )ue importune el in-ierno de todos a92. Entonces Mpor )u+ es toleradoN Por)ue los importunados est n recibiendo algo importante del interno. Ellos tienen la oportunidad de ense!ar algo. ,ienen la oportunidad de escuc9ar algunas ideas nuevas; )ui# J ,ienen la oportunidad de ver las cosas desde una perspectiva di-erente. ,ambi+n pueden estar intentando reclutar al interno; pero aAn si este no es el caso 9a5 muc9o )ue ganar. Deber2as pedirle a la gente un poco de su sabidur2a 5 0uicio las veces )ue 9onestamente creas )ue tienen algo )ue decir. Esto los adula 5 tu aprender s algo 5 les ense!ar s algo. Un buen programador no necesita a menudo el conse0o de un ?icepresidente de ?entas; pero si alguna ve# lo necesitas; asegArate de pedirlo. Una ve# ped2 escuc9ar unas pocas llamadas de ventas para comprender me0or el traba0o de nuestro sta-- de ventas. Esto no tom m s de 3< minutos pero pienso )ue el pe)ue!o es-uer#o caus una impresin en las -uer#as de ventas. Cmo Documentar (abiamente $a vida es demasiado corta como para escribir basura )ue nadie leer J si escribes basura; nadie la leer . Por lo tanto un poco de buena documentacin es me0or. $os administradores a menudo no comprenden esto; debido a )ue aAn la mala documentacin les da un -also sentido de seguridad de )ue ellos no son dependientes de sus programadores. &i alguien insiste absolutamente en )ue escribas verdadera documentacin inAtil; di YsiHH 5 calladamente empie#a a buscar un me0or empleo. 4o 9a5 nada tan e-ectivo como poner un estimado preciso de la cantidad de tiempo )ue tomar producir buena documentacin en un estimado para reducir la demanda de documentacin. $a verdad es -r2a 5 dura@ la documentacin; como las pruebas; pueden tomar per2odos de tiempo muc9o m s largos )ue el desarrollo de cdigo. Escribir buena documentacin es; antes de todo; cuestin de buena escritura. ,e sugiero buscar libros sobre escritura; estudiarlos 5 practicar. Pero incluso si eres un mal escritor o tienes un pobre dominio del lengua0e en el cual debes documentar; la 1egla de "ro es todo lo )ue necesitas@ YHa# a los otros lo )ue te gustar2a )ue te 9icieran a ti.HH ,oma tiempo pensar realmente acerca de )ui+n estar le5endo tu documentacin; )u+ necesitan sacar de ella; 5 cmo puedes ense!arles eso. &i 9aces esto; ser s un escritor de documentacin por encima del promedio; 5 un buen programador. Cuando se trata de documentar cdigo por s2 mismo; como algo opuesto a producir documentos )ue realmente puedan ser le2dos por no programadores; los me0ores programadores )ue 9e conocido tienen un sentimiento universal@ escribe cdigo autoe(plicativo 5 solamente documenta el cdigo en los lugares )ue no puedes 9acerlo

claro mediante el cdigo mismo. Ha5 dos buenas ra#ones para esto. Primero; cual)uiera )ue necesite ver la documentacin a nivel de cdigo ser capa# en la ma5or2a de los casos 5 pre-erir leer el cdigo de todas -ormas. 1econocidamente; esto parece m s - cil para el programador e(perimentado )ue para el principiante. ' s importante sin embargo; es )ue el cdigo 5 la documentacin no pueden ser inconsistentes si no 9a5 documentacin. El cdigo -uente en el peor de los casos puede estar e)uivocado 5 con-uso. $a documentacin; si no est escrita per-ectamente; puede mentir; 5 eso es mil veces peor. Esto no -acilita las cosas para el programador responsable. MCmo escribe uno cdigo autoe(plicativoN M*u+ signi-ica incluso esoN Ello signi-ica@ Escribir cdigo sabiendo )ue alguien tendr )ue leerloJ Aplicar la regla de oroJ Elegir una solucin )ue sea directa; incluso si cuentas con otra solucin m s r pidaJ &acri-icar pe)ue!as optimi#aciones en lugar de o-uscar el cdigoJ Pensar en el lector e invertir algo de tu precioso tiempo en 9acerlo m s - cil para +lJ 5 O4unca usar una -uncin con nombres como Y-ooHH; YbarHH; o YHa#loHHP

Cmo Traba1ar con Cdi#o Pobre Es mu5 comAn tener )ue traba0ar con cdigo de pobre calidad )ue alguien m s 9a escrito. &in embargo; no pienses mu5 pobremente de ellos; 9asta )ue 9a5as caminado con sus #apatos. A ellos se le pudo 9aber pedido mu5 conscientemente 9acer algo r pidamente para cumplir con la presin del calendario. &in )ue esto importe; a -in de traba0ar con cdigo poco claro debes comprenderlo. Comprenderlo toma tiempo de aprendi#a0e; 5 ese tiempo tendr )ue salir del cronograma; de alguna parte; 5 debes insistir en ello. Para comprenderlo; tendr s )ue leer el cdigo -uente. Probablemente tendr s )ue e(perimentar con +l. Este es un buen momento para documentar; incluso si es solamente para ti mismo; debido a )ue el acto de intentar documentar el cdigo te -or#ar a considerar ngulos )ue podr2as no 9aber considerado; 5 el documento resultante puede ser Atil. 'ientras est s 9aciendo esto; considera lo )ue tomar2a reescribir alguna parte o todo el cdigo. M1ealmente a9orrar2a tiempo reescribir parte de +lN MPodr2as con-iar me0or en +l si lo reescribesN &e cuidadoso a)u2 con la arrogancia. &i lo reescribes; ser m s - cil para ti lidiar con +l; pero Mrealmente ser m s - cil para la pr(ima persona )ue tenga )ue leerloN &i lo reescribes; Mcu l ser la carga de la pruebaN M&obrepasar la necesidad de recomprobarlo cual)uier bene-icio )ue pudiera ganarseN En cual)uier estimado )ue 9agas para traba0ar -rente a cdigo )ue no escribiste; la calidad de +se cdigo deber2a a-ectar tu percepcin del riesgo de problemas 5 los unGI unGs. Es importante recordar )ue la abstraccin 5 la encapsulacin; dos de las me0ores 9erramientas de un programador; son particularmente aplicables al mal cdigo. Puede )ue no seas capa# de redise!ar un gran blo)ue de cdigo; pero si puedes a!adir cierta cantidad de abstraccin a +l puedes obtener algunos de los bene-icios de un buen dise!o sin reelaborar todo el desorden. En particular; puedes intentar identi-icar las

partes )ue son particularmente malas de tal -orma )ue puedan ser redise!adas independientemente. Cmo Usar el Control del Cdi#o 0uente $os sistemas de control de cdigo -uente te permiten mane0ar pro5ectos e-ectivamente. Ellas son mu5 Atiles para una persona 5 esenciales para un grupo. 1egistran todos los cambios en versiones di-erentes de manera )ue nunca se pierde ningAn cdigo 5 puede asign rsele signi-icado a los cambios. Uno puede crear 5 depurar cdigo desec9able con con-ian#a usando un sistema de control de cdigo; puesto )ue el cdigo )ue modi-icas se mantiene cuidadosamente separado del cdigo o-icial comprometido )ue ser compartido con el e)uipo o liberado. ,ard+ en apreciar los bene-icios de los sistemas de control de cdigo pero a9ora no vivir2a sin uno aAn en pro5ectos personales. .eneralmente son necesarios cuando tienes e)uipos traba0ando sobre el mismo cdigo base. &in embargo; tienen otra gran venta0a@ -omentan el pensar acerca del cdigo como un sistema org nico en crecimiento. Puesto )ue cada cambio se eti)ueta como una nueva revisin con un nuevo nombre o nAmero; uno empie#a a ver el so-t6are como series de me0oras visiblemente progresivas. Pienso )ue esto es especialmente Atil para los principiantes. Una buena t+cnica para usar un sistema de control de cdigo es permanecer a pocos d2as de estar actuali#ado todo el tiempo. El cdigo )ue no puede ser -inali#ado en unos cuantos d2as se C9e)uea; pero de una -orma )ue )ueda inactivo 5 no ser o-icialmente nombrado; 5 por lo tanto no crear problemas para nadie m s. Cometer un error )ue desacelere a tus compa!eros de e)uipo es un serio errorJ es a menudo un tabA. Cmo Probar Unidades $a prueba de unidad; la prueba de una pie#a individual de -uncionalidad codi-icada por el e)uipo )ue lo escribi; es una parte de la codi-icacin; no algo di-erente de ella. Parte del dise!o del cdigo es dise!ar cmo ser probado. Deber2as poner por escrito un plan de prueba; incluso si solamente es una oracin. A veces la prueba ser simple@ YM&e ve bien este botnNHH Algunas veces ser comple0o@ YM1etorn este algoritmo de 9ermanamiento precisamente las pare0as correctasNHH Usa c9e)ueo de a-irmaciones 5 prueba los mane0adores cada ve# )ue sea posible. Esto no solamente atrapa los bugs anticipadamente; sino )ue es mu5 Atil despu+s sobre la marc9a 5 te permite eliminar misterios de los )ue de otra -orma tendr2as )ue preocuparte. $os desarrolladores de la Programacin E(trema 9an escrito e(tensivamente sobre probar unidades e-ectivamenteJ no puedo 9acer nada me0or )ue recomendar sus escritos. Toma Descansos Cuando est-s Con.undido Cuando est+s con-undido; toma un descanso. Algunas veces medito por 1S minutos cuando esto5 con-undido 5 el problema m gicamente se desci-ra cuando regreso a +l. El sue!o de una noc9e a veces 9ace lo mismo a una escala ma5or. Es posible )ue el cambiar temporalmente a cual)uier otra actividad pueda -uncionar.

Cmo 2econocer Cu!ndo Ir a Casa $a programacin de computadoras es una actividad )ue es tambi+n una cultura. El 9ec9o desa-ortunado es )ue no es una cultura )ue valora muc9o la salud mental o -2sica. ,anto por ra#ones 9istrico%culturales :la necesidad de traba0ar por la noc9e en computadoras sin muc9a carga de traba0o; por e0emplo= 5 debido a la abrumadora presin de tiempo de mercadeo 5 la escase# de programadores; los programadores de computadoras son tradicionalmente sobretraba0ados. 4o creo )ue puedas -iarte de todas las 9istorias )ue escuc9es; pero pienso )ue E< 9oras a la semana es comAn; 5 S< es un m2nimo mu5 comAn. Esto signi-ica )ue a menudo se re)uiere muc9o m s )ue eso. Este es un serio problema para un buen programador; el cual es responsable no solamente por +l mismo sino tambi+n por sus compa!eros de e)uipo. ,ienes )ue reconocer cu ndo ir a casa; 5 a veces cu ndo sugerir )ue otras personas va5an a casa. 4o puede 9aber ninguna regla -i0a para resolver este problema; m s de lo )ue puede 9aberla para al#ar un ni!o en bra#os; por la misma ra#nIIIcada ser 9umano es di-erente. ' s all de E< 9oras a la semana es un e(traordinario es-uer#o para m2; el cual puedo aplicar por cortos periodos de tiempo :cerca de una semana=; 5 eso se espera de m2 algunas veces. 4o s+ si es legal esperar E< 9oras de traba0o de una personaJ incluso no s+ si 8< es legal. Esto5 seguro; sin embargo; )ue es estApido traba0ar tanto )ue te e(cedas de esas 9oras e(tras )ue traba0as. Personalmente para m2; eso es m s de las E< 9oras a la semana. Personalmente pienso )ue un programador deber2a e0ercer su noble obligacin 5 apo5ar una carga pesada. &in embargo; no es el deber de un programador ser un pats5. El 9ec9o triste es )ue a los programadores a menudo se les pide ser patsies es a -in de poner en escena a alguien; por e0emplo a un administrador tratando de impresionar a un e0ecutivo. $os programadores a menudo sucumben a esto debido a )ue ellos son m s propensos a agradar 5 no mu5 buenos para decir no. Ha5 cuatro de-ensas contra esto@ Comun2cate tanto como sea posible con todos en la compa!2a de tal -orma )ue nadie pueda e(traviar a los e0ecutivos acerca de lo )ue est pasando; Aprende a estimar 5 calendari#a de-ensiva 5 e(pl2citamente 5 darle a todos la visibilidad de en )u+ consiste el calendario 5 dnde se encuentra; Aprende a decir no; 5 di no como e)uipo cuando sea necesario; 5 1enuncia si tienes )ue 9acerlo.

$a ma5or2a de los programadores son buenos programadores; 5 los buenos programadores )uieren lograr 9acer un montn de cosas. Para 9acer eso; ellos tienen )ue administrar su tiempo e-ectivamente. Ha5 una cierta cantidad de inercia mental asociada con el entusiasmarse con un problema e involucrarse pro-undamente con +l. 'uc9os programadores encuentran )ue traba0an me0or cuando tienen largos e ininterrumpidos blo)ues de tiempo en los cuales entusiasmarse 5 concentrarse. &in embargo; la gente debe dormir 5 reali#ar otros deberes. Cada persona necesita encontrar una -orma de satis-acer tanto su ritmo 9umano como su ritmo de traba0o. Cada programador necesita 9acer lo )ue sea para procurar periodos de traba0o e-iciente; tales como reservar ciertos d2as en los cuales atienda solamente las 0untas m s cr2ticas. Puesto )ue tengo ni!os; trato a veces de pasar las tardes con ellos. El ritmo )ue -unciona me0or para m2 es traba0ar un mu5 largo d2a; dormir en la o-icina o cerca de ella :9ago un largo via0e de mi casa al traba0o= luego vo5 a casa lo su-icientemente

temprano al d2a siguiente para pasar tiempo con mis ni!os antes de )ue se va5an a la cama. 4o esto5 cmodo con esto; pero es el me0or compromiso )ue 9e sido capa# de 9acer. ?e a casa si tienes una en-ermedad contagiosa. Deber2as ir a casa si est s teniendo pensamientos suicidas. Deber2as tomar un descanso o ir a casa si tienes pensamientos 9omicidas por m s de unos pocos segundos. Deber2as enviar a alguien a casa si ellos muestran mal -uncionamiento mental o signos de una en-ermedad mental m s all de una leve depresin. &i est s tentado a ser des9onesto o de-raudante en una -orma )ue normalmente no eres debido a la -atiga; deber2as tomarte un descanso. 4o uses coca2na o an-etaminas para combatir la -atiga. 4o abuses de la ca-e2na. Cmo &idiar con /ente Di.cil Probablemente tienes )ue lidiar con gente di-2cil. ,A mismo incluso puedes ser una persona di-2cil. &i eres el tipo de persona )ue tiene muc9os con-lictos con los compa!eros de traba0o 5 -iguras de autoridad; deber2as apreciar la independencia )ue eso implica; pero traba0a en tus 9abilidades interpersonales sin sacri-icar tu inteligencia o principios. Esto puede ser mu5 molesto para algunos programadores )ue no tienen e(periencia en este tipo de cosas 5 cu5a e(periencia de vida precia les 9a ense!ado patrones de comportamiento )ue no son mu5 Atiles en el lugar de traba0o. $a personas di-2ciles est n a menudo 9abituadas al desacuerdo 5 son menos a-ectadas por la presin social para comprometerse )ue otras. $a clave es respetarlos apropiadamente; lo cual es m s de lo )ue tu )uerr s 9acer pero no es tanto como lo )ue ellos podr2an )uerer. $os programadores tienen )ue traba0ar 0untos como un e)uipo. Cuando surgen los desacuerdos; deben ser resueltos de algAn modo; no pueden ser es)uivados por muc9o tiempo. $as personas di-2ciles son a menudo e(tremadamente inteligentes 5 tienen algo mu5 Atil )ue decir. Es cr2tico )ue escuc9es 5 entiendas a la persona di-2cil sin pre0uicios causados por ella. Un -alla de comunicacin es a menudo la base del desacuerdo pero a veces puede ser eliminada con gran paciencia. Intenta mantener esta comunicacin -resca 5 cordial; 5 no aceptes ninguna provocacin para agrandar el con-licto )ue pueda o-recerse. Despu+s de un ra#onable periodo para intentar comprender; toma una decisin. 4o permitas )ue la intimidacin te -uerce a 9acer algo con lo )ue no est s de acuerdo. &i eres el l2der; 9a# lo )ue piensas )ue es me0or. 4o tomes una decisin por ra#ones personales; 5 est preparado para e(plicar las ra#ones de tu decisin. &i eres compa!ero de e)uipo con una persona di-2cil; no permitas )ue la decisin del l2der tenga ningAn impacto personal. &i no es a tu modo; 9a#lo de la otra -orma de todo cora#n. $a gente di-2cil cambia 5 me0ora. $o 9e visto con mis propios o0os; pero es mu5 raro. &in embargo; todos tienen altiba0os transitorios. Uno de los desa-2os )ue cada programador 5 especialmente los l2deres en-rentan es mantener a la persona di-2cil completamente comprometida. Ellos son muc9o m s propensos a evadir traba0o 5 resistir pasivamente )ue otros. Captulo 3. Intermedio Tabla de Contenido

Habilidades Personales Cmo Permanecer 'otivado Cmo ser Ampliamente Con-iable Cmo 4egociar ,iempo vs. Espacio Cmo Hacer Pruebas de Estr+s Cmo Balancear la Brevedad 5 la Abstraccin Cmo Aprender 4uevas Habilidades Aprende a ,eclear Cmo Hacer Pruebas de Integracin $engua0es de Comunicacin Herramientas Pesadas Cmo Anali#ar Datos Habilidades de E)uipo Cmo Administrar el ,iempo de Desarrollo Cmo 'ane0ar 1iesgos de &o-t6are de ,erceras Partes Cmo 'ane0ar Consultores Cmo Comunicar la Cantidad Adecuada Cmo Disentir Honestamente 5 &obrellevarlo 7uicio Cmo 4egociar Calidad /rente a ,iempo de Desarrollo Cmo 'ane0ar la Dependencia del &istema de &o-t6are Cmo Decidir si el &o-t6are es 'u5 Inmaduro Cmo Hacer una Decisin de Compra vs. Construccin Cmo Crecer Pro-esionalmente Cmo Evaluar Entrevistados Cmo &aber Cu ndo Aplicar Ciencia Computacional /antasiosa Cmo Hablar con 4o Ingenieros Habilidades Personales Cmo Permanecer )otivado Es un 9ec9o maravilloso 5 sorprendente )ue los programadores son altamente motivados por el deseo de crear arte-actos )ue sean bellos; Atiles; o ni-t5. Este deseo no es Anico para los programadores ni universal pero es tan -uerte 5 comAn entre los programadores )ue los separa de otros en otros roles. Esto tiene consecuencias pr cticas e importantes. &i a los programadores se les pide 9acer algo )ue no sea bello; Atil; o ni-t5; tendr n la moral ba0a. Ha5 un montn de dinero )ue ganar 9aciendo material -eo; estApido 5 aburridoJ pero al -inal; la diversin 9ar la ma5or cantidad de dinero para la compa!2a. "bviamente; e(isten industrias completas organi#adas alrededor de t+cnicas motivacionales algunas de las cuales se aplican a)u2. $as cosas )ue son espec2-icas a la programacin )ue puedo identi-icar son@ Usa el me0or lengua0e para el traba0o. Busca oportunidades para aplicar nuevas t+cnicas; lengua0es; 5 tecnolog2as. Intenta aprender o ense!ar algo; aun)ue sea algo pe)ue!o; en cada pro5ecto.

/inalmente; si es posible; mide el impacto de tu traba0o en t+rminos de algo )ue ser personalmente motivador. Por e0emplo; al corregir bugs; contar el nAmero de bugs )ue

9e corregido no es del todo motivacional para m2; debido a )ue es independiente del nAmero )ue puedan aAn e(istir; 5 tambi+n a-ecta el valor total )ue esto5 agregando a los clientes de mi compa!2a de la m s pe)ue!a -orma posible. 1elacionar cada bug con un cliente -eli#; sin embargo; es personalmente motivador para m2. Cmo ser Ampliamente Con.iable Para ser con-iable debes ser con-iable. Debes tambi+n ser visible. &i nadie sabe acerca de ti; no se invertir ninguna con-ian#a en ti. Con )uienes est n cerca de ti; tales como tus compa!eros de e)uipo; esto no deber2a ser un problema. ,A estableces con-ian#a siendo responsable e in-ormativo para a)uellos -uera de tu departamento o e)uipo. "casionalmente alguien abusar de esta con-ian#a; 5 pedir -avores no ra#onables. 4o temas a esto; slo e(plica a lo )ue tendr2as )ue renunciar al 9acer el -avor. 4o pretendas saber algo )ue no sabes. Con la gente )ue no son compa!eros de e)uipo; puede )ue tengas )ue 9acer una clara distincin entre Yno conocer bien el l2mite de mis capacidadesHH 5 Yno ser capa# de 9acerlo; nunca.HH Cmo 4e#ociar Tiempo vs. Espacio Puedes ser un buen programador sin ir a la universidad; pero no puedes ser un buen programador intermedio sin conocer la teor2a de la comple0idad computacional b sica. 4o necesitas conocer la notacin de la Ygran "HH; pero personalmente pienso )ue deber2as ser capa# de comprender la di-erencia entre Yconstantes de tiempoHH; Yn logaritmo de nHH 5 Yn al cuadradoHH. Podr2as ser capa# de intuir cmo negociar tiempo -rente a espacio sin ese conocimiento; pero en su ausencia no tendr s una base -irme para comunicarte con tus colegas. Al dise!ar o comprender de un algoritmo; la cantidad de tiempo )ue toma para e0ecutarse es a veces una -uncin del tama!o de la entrada. Cuando eso es cierto; podemos decir )ue el peor; el me0or 5 el caso esperado de tiempo de e0ecucin de un algoritmo es Yn log nHH si es proporcional al tama!o :ZnZ= veces el logaritmo del tama!o. $a notacin 5 -orma de 9ablar puede ser tambi+n aplicada al espacio tomado por una estructura de datos. Para m2; la teor2a de la comple0idad computacional es bella 5 tan pro-unda como la -2sicaIIIO5 con po)uito margen continAan 0untas por un largo trec9oP El tiempo :los ciclos del procesador= 5 el espacio :la memoria= pueden ser negociados entre s2. $a ingenier2a trata acerca de compromisos; 5 este es un buen e0emplo. 4o siempre es sistem tica. En general; sin embargo; uno puede a9orrar espacio al codi-icar las cosas m s -uertemente; al costo de m s tiempo de computacin cuando tienes )ue decodi-icarlas. Puedes a9orrar tiempo mediante el cac9eo; o sea; al invertir espacio para almacenar una copia local de algo; al costo de tener )ue mantener la consistencia del cac9+. Puedes a veces a9orrar tiempo manteniendo m s in-ormacin en una estructura de datos. Esto usualmente cuesta una pe)ue!a cantidad de espacio pero puede complicar el algoritmo. 'e0orar el intercambio espacio%tiempo puede a menudo cambiar a uno o al otro dram ticamente. &in embargo; antes de )ue traba0es en esto deber2as preguntarte a ti mismo si lo )ue est s me0orando es realmente lo )ue necesita la me0or2a. Es divertido traba0ar en un algoritmo; pero no puedes permitir )ue te ciegue 9asta el -r2o 5 duro

9ec9o de )ue el me0orar algo )ue no es un problema no 9ar ninguna notable di-erencia 5 )ue slo crear una carga de prueba. $a memoria en las modernas computadoras parece barata; debido a )ue a di-erencia del tiempo de procesador; no puedes verla en uso 9asta )ue golpeas la paredJ pero entonces la -alla es catastr-ica. Ha5 tambi+n otros costos ocultos al usar la memoria; tales como su e-ecto en otros programas )ue deben ser residentes; 5 el tiempo para asignarla 5 desasignarla. Considera esto cuidadosamente antes de )ue sacri-i)ues espacio para ganar velocidad. Cmo Hacer Pruebas de Estr-s $as pruebas de estr+s son divertidas. Al principio parece )ue el propsito de las pruebas de estr+s es determinar si el sistema traba0a ba0o una carga. En realidad; es comAn )ue el sistema no -uncione ba0o una carga pero -alla de alguna manera cuando la carga es lo su-icientemente pesada. $lamo a esto Igolpear la pared o "on'ingB1D. Pueden 9aber algunas e(cepciones; pero casi siempre 9a5 una HparedH. El propsito de las pruebas de estr+s es determinar dnde est la pared; 5 luego se dedu#ca cmo moverla un poco m s all . Un plan para las pruebas de estr+s deber2a desarrollarse en la etapas tempranas del pro5ecto; debido a )ue a menudo a5uda a clari-icar e(actamente lo )ue se espera. M&on dos segundos para una solicitud de p gina 6eb una -alla miserable o un +(ito aplastanteN M&on su-icientes S<< usuarios concurrentesN Eso; por supuesto; depende; pero uno debe saber la respuesta cuando se dise!a el sistema )ue conteste la pregunta. $a prueba de estr+s necesita modelar la realidad lo su-icientemente bien como para ser Atil. 4o es realmente posible simular mu5 - cilmente S<< err ticos e impredecibles 9umanos usando un sistema concurrentemente; pero uno puede al menos crear S<< simulaciones e intentar modelar alguna parte de lo )ue ellos podr2an 9acer. En las pruebas de estr+s; empie#a con una ligera carga 5 carga el sistema a lo largo de alguna dimensinIIItal como el tipo o el tama!o de la entradaIII9asta )ue golpees la pared. &i la pared est demasiado cerca para satis-acer tus necesidades; resuelve cu l recurso es el cuello de botella :usualmente 9a5 uno )ue predomina.= MEs la memoria; el procesador; la E%&; el anc9o de banda; o la contencin de datosN $uego determina cmo puedes mover la pared. 4ota )ue mover la pared; es decir; incrementar la carga m (ima )ue el sistema puede mane0ar; podr2a no a5udar o de 9ec9o a-ectar el desempe!o de sistema ligeramente cargado. Usualmente el desempe!o ba0o carga pesada es m s importante )ue el desempe!o ba0o una carga ligera. Puede )ue tengas )ue obtener visibilidad desde varias dimensiones di-erentes para construir un modelo mental de +lJ ninguna t+cnica por s2 sola es su-iciente. Por e0emplo; 9acer un registro de sucesos a menudo da una buena idea del tiempo del relo0 de pared entre dos eventos en el sistema; pero a menos )ue sea cuidadosamente construido; no proporciona visibilidad de la utili#acin de la memoria e incluso del tama!o de la estructura de datos. De manera similar; en un sistema moderno; pueden estar cooperando un nAmero de computadoras 5 muc9os sistemas de so-t6are. Particularmente cuando est s golpeando la pared :o sea; el desempe!o es no lineal en el tama!o de la entrada= esos otros sistemas de so-t6are pueden ser un cuello de botella. $a visibilidad en esos sistemas; aAn si solamente mides la carga del procesador en todas las m )uinas participantes; puede ser mu5 Atil.

&aber dnde est la pared es esencial no solamente para moverla; sino tambi+n para proporcionar previsibilidad de tal manera )ue el negocio pueda ser administrado e-ectivamente. Cmo alancear la revedad 5 la Abstraccin

$a abstraccin es clave para la programacin. Deber2as elegir cuidadosamente )u+ tan abstracto necesitas ser. $os programadores principiantes en su entusiasmo a menudo crean m s abstraccin de la )ue es realmente Atil. Una se!al de ello es si creas clases )ue realmente no contienen ningAn cdigo 5 realmente no 9agan algo e(cepto servir para abstraer algo. $a atraccin de esto es comprensible pero el valor de la brevedad del cdigo puede ser medida -rente al valor de la abstraccin. "casionalmente; uno observa un error 9ec9o por idealistas entusiastas@ al inicio del pro5ecto se de-inen un montn de clases )ue parecen maravillosamente abstractas 5 uno puede especular )ue ellas mane0ar n cada eventualidad )ue pueda surgir. A medida )ue el pro5ecto progresa 5 la -atiga empie#a a sentirse; el cdigo mismo se vuelve desordenado. El cuerpo de las -unciones se vuelve m s largo de lo )ue deber2an ser. $as clases vac2as son una carga al documentar )ue es ignorada cuando se est ba0o presin. El resultado -inal 9abr2a sido me0or si la energ2a gastada en la abstraccin 9ubiese sido invertida en mantener las cosas pe)ue!as 5 simples. Esta es una -orma de programacin espec#lativa. 1ecomiendo -uertemente el art2culo Y&uccinctness is Po6erHH :$a Concisin es Poder= de Paul .ra9am BP.&iteD. Ha5 un cierto dogma asociado con t+cnicas Atiles tales como el oc#ltamiento de la informacin 5 laprogramacin orientada a o"jetos )ue a veces se llevan demasiado le0os. Esas t+cnicas le permiten a uno codi-icar abstractamente 5 anticipar cambios. Personalmente pienso; sin embargo; )ue no deber2as producir muc9o cdigo especulativo. Por e0emplo; es un estilo aceptado ocultar una variable entera en un ob0eto tras mutators 5 accesorios; de tal manera )ue la variable misma no est+ e(puesta; solamente la pe)ue!a inter-ace a ella. Esto permite )ue la implementacin de esa variable sea cambiada sin a-ectar al cdigo de llamada; 5 es )ui# apropiado para un escritor de bibliotecas )ue debe publicar una API :Application Program Inter-ace; Inter-a# de Programa de aplicacin= mu5 estable. Pero no creo )ue el bene-icio de esto supere el costo de la palabrer2a de ello cuando mi e)uipo posee el cdigo llamador 5 por lo tanto puede recodi-icar al llamador tan - cilmente como al llamado. Cuatro o cinco l2neas e(tra de cdigo es un pesado precio a pagar por este bene-icio especulativo. $a portabilidad posee un problema similar. MDeber2a el cdigo ser portable a una computadora; compilador; sistema de so-t6are o plata-orma di-erente; o simplemente ser - cilmente portadoN Pienso )ue una pie#a de cdigo no portable; pe)ue!a 5 - cilmente portada es me0or )ue una ampliamente portable. Es relativamente - cil 5 ciertamente una buena idea con-inar el cdigo no portable a reas no designadas; tales como una clase )ue 9ace consultas a una base de datos )ue son espec2-icos para un DB'& :Data Base 'anagement &5stem= dado. Cmo Aprender 4uevas Habilidades Aprender nuevas 9abilidades; especialmente las no t+cnicas; es la diversin m s grande de todas. $a ma5or2a de las compa!2as tendr2an una me0or moral si comprendieran cu nto motiva esto a los programadores.

$os 9umanos aprenden 9aciendo. $a lectura de libros 5 la toma de cursos son Atiles. Pero Mpodr2as tener algAn respeto por un programador )ue nunca 9a escrito un programaN Para aprender cual)uier 9abilidad; tienes )ue ponerte a ti mismo en una posicin dispensadora donde puedas e0ercitar esa 9abilidad. Cuando aprendas un nuevo lengua0e de programacin; trata de 9acer un pe)ue!o pro5ecto en +l antes de )ue tengas )ue 9acer un pro5ecto grande. Cuando est+s aprendiendo a mane0ar un pro5ecto de so-t6are; trata de mane0ar primero uno pe)ue!o. Un buen mentor no es reempla#o para 9acer cosas por ti mismo; pero es muc9o me0or )ue un libro. M*u+ puedes o-recer a un mentor potencial a cambio de su conocimientoN Como m2nimo; deber2as o-recer estudiar duro de tal manera )ue su tiempo no ser desperdiciado. Intenta conseguir )ue tu 0e-e te permita tener entrenamiento -ormal; pero comprende )ue ello a menudo no es muc9o me0or )ue la misma cantidad de tiempo invertida simplemente en 0ugar con la nueva 9abilidad )ue deseas aprender. Es; sin embargo; m s - cil solicitar entrenamiento )ue tiempo para 0ugar en nuestro mundo imper-ecto; aun)ue es sabido )ue una gran parte del entrenamiento -ormal consiste solamente en dormir a trav+s de las con-erencias esperando la -iesta de la cena. &i diriges personas; entiende cmo ellos aprenden 5 ap5alos asign ndoles pro5ectos )ue sean del tama!o adecuado 5 )ue e0erciten 9abilidades en las )ue est n interesados. 4o olvides )ue las 9abilidades m s importantes para un programador no son las t+cnicas. Dale a tu gente una oportunidad para 0ugar 5 practicar cora0e; 9onestidad; 5 comunicacin. Aprende a Teclear Aprende a teclear bien. Esta es una 9abilidad intermedia debido a )ue escribir cdigo es tan di-2cil )ue la velocidad a la cual puedas teclear es irrelevante 5 no puedes 9acer muc9o durante el tiempo )ue toma escribir cdigo; no importa )u+ tan bueno eres. &in embargo; mientras seas un programador intermedio probablemente pasar s muc9o tiempo escribiendo lengua0e natural para tus colegas 5 otros. Esta es una divertida prueba de tu compromisoJ re)uiere tiempo dedicado )ue no es mu5 divertido aprender algo como eso. $a le5enda dice )ue cuando 'ic9ael ,iemann B2D estaba en el 'CC la gente se )uedaba -uera detr s de su puerta para escuc9ar el #umbido generado por sus golpes de tecla los cuales eran tan r pidos como indistinguibles. Cmo Hacer Pruebas de Inte#racin $a prueba de integracin es la prueba de la integracin de varios componentes )ue 9an sido probados como unidades independientes. $a integracin es costosa 5 el costo proviene de la prueba. Debes incluir tiempo para esto en tus estimados 5 tu cronograma. Idealmente deber2as organi#ar un pro5ecto de tal -orma )ue no sea una -ase al -inal donde la integracin debe e(pl2citamente tomar lugar. Es muc9o me0or integrar gradualmente las cosas a medida )ue se completan en el curso del pro5ecto. &i es inevitable est2malo cuidadosamente. &en#ua1es de Comunicacin

Ha5 algunos lengua0es; es decir; sistemas sint cticos -ormalmente de-inidos; )ue no son lengua0es de programacin sino leng#ajes de com#nicacinIIIson dise!ados espec2-icamente para -acilitar la comunicacin a trav+s de la estandari#acin. En el 2<<3 los m s importantes -ueron el U'$; el F'$; 5 el &*$. Deber2as tener alguna -amiliaridad con todos ellos de manera )ue puedas comunicarte bien 5 decidir cu ndo usarlos. El U'$ es un rico sistema -ormal para 9acer diagramas )ue describen dise!os. &u belle#a descansa en )ue es tanto visual como -ormal; capa# de transmitir una gran cantidad de in-ormacin si tanto el autor como la audiencia conocen el U'$. 4ecesitas saber sobre +l debido a )ue los dise!os est n algunas veces comunicados en +l. Ha5 muc9as 9erramientas Atiles para 9acer diagramas U'$ )ue lucen mu5 pro-esionales. En muc9os casos el U'$ es demasiado -ormal; 5 me descubro a m2 mismo usando un estilo m s simple de cajas $ flechas para dise!ar diagramas. Pero esto5 mu5 seguro )ue el U'$ es al menos tan bueno para ti como el estudiar $at2n. El F'$ es un est ndar para dise!ar nuevos est ndares. ,o es una solucin para problemas de intercambio de datos; aun)ue algunas veces lo veas presentado como si lo -uera. ' s bien; es una bienvenida automati#acin de las m s aburridas partes del intercambio de datos; como es; el estructurar la representacin en una secuencia lineal 5 anali#ar la estructura. Provee un agradable c9e)ueo de tipos I5 de correctitudI; aun)ue de nuevo es solamente una -raccin de lo )ue probablemente vas a necesitar en la pr ctica. El &*$ es un mu5 poderoso 5 rico lengua0e de manipulacin de datos )ue no es propiamente un lengua0e de programacin. ,iene muc9as variantes; t2picamente mu5 dependientes del producto; las cuales son menos importantes )ue el nAcleo estandari#ado. El &*$ es la ling#a franca de las bases de datos relacionales. Puede )ue traba0es o no en cual)uier campo )ue pueda bene-iciarse de una comprensin de las bases de datos relacionales; pero deber2as tener una comprensin b sica de ellas 5 de la sinta(is 5 signi-icado del &*$. Herramientas Pesadas A medida )ue nuestra cultura tecnolgica progresa; la tecnolog2a del so-t6are se mueve de lo inconcebible; a la investigacin; a nuevos productos; a productos estandari#ados; a productos ampliamente disponibles 5 baratos. Esas 9erramientas pesadas pueden sobrellevar grandes cargas; pero pueden ser intimidantes 5 re)uieren una gran inversin en su comprensin. El programador intermedio tiene )ue saber cmo mane0arlas 5 cu ndo deber2an ser usadas o consideradas. A mi entender algunas de las me0ores 9erramientas son@ Bases de Datos 1elacionales; 'otores de BAs)ueda de ,e(to Completo; Bibliotecas 'atem ticas; "pen.$; parsers F'$; 5 Ho0as de C lculo.

Cmo Anali%ar Datos

El an lisis de datos es un proceso en las primeras etapas del desarrollo de so-t6are; cuando e(aminas una actividad de negocio 5 encuentras los re)uerimientos para convertirlo en una aplicacin de so-t6are. Esta es una de-inicin -ormal; la cual puede conducir a pensar el an lisis de datos es una accin )ue deber2as de0ar me0or a los analistas de sistemas; mientras tA; el programador; deber2as en-ocarte en codi-icar lo )ue alguien m s 9a dise!ado. &i seguimos estrictamente el paradigma de la ingenier2a de so-t6are; ello podr2a ser correcto. $os programadores e(perimentados se vuelven dise!adores 5 los m s agudos dise!adores se convierten en analistas de negocios; siendo as2 intitulados a pensar en todos los re)uerimientos de datos 5 a darte tareas bien de-inidas para 9acer. Esto no es completamente e(acto; debido a )ue los datos son el nAcleo de cada actividad de la programacin. $o )ue sea )ue 9agas en tus programas; est s movi+ndote alrededor de o modi-icando los datos. El analista de negocios est anali#ando las necesidades a una ma5or escala; 5 el dise!ador de so-t6are est e(primiendo m s dic9a escala de tal -orma )ue; cuando el problema aterri#a en tu escritorio; parece )ue todo lo )ue necesitas 9acer es aplicar algoritmos inteligentes 5 comen#ar a mover los datos e(istentes. 4o es as2. 4o importa en cu l etapa empieces a verlo; los datos son el principal inter+s de una aplicacin bien dise!ada. &i miras de cerca cmo un analista de negocios obtiene los re)uirimientos de la solicitud del cliente; te dar s cuenta de )ue los datos 0uegan un papel -undamental. El analista crea los llamados Diagramas de /lu0o de Datos; donde todos las -uentes de datos est n identi-icadas 5 el -lu0o de la in-ormacin es modelada. Habiendo de-inido claramente cu les datos deber2an -ormar parte del sistema; el dise!ador modela las -uentes de datos; en t+rminos de relaciones de bases de datos; protocolos de intercambio de datos; 5 -ormatos de arc9ivos; de tal manera )ue la tarea est lista para ser pasada al programador. &in embargo; el proceso no termina todav2a; por)ue tA Yel programadorY aAn despu+s de este completo proceso de re-inamiento de datos; se te pide anali#ar los datos para llevar a cabo la tarea de la me0or -orma posible. $a l2nea -inal de tu tarea es el mensa0e central de 4iGlaus [irt9; el padre de varios lengua0es. YAlgoritmos \ Estructuras de Datos ] ProgramasY 4unca 9a 9abido un algoritmo )ue permane#ca solo; 9aciendo algo para +l mismo. Cada algoritmo est supuesto a 9acer algo para al menos una pie#a de datos. Por lo tanto; puesto )ue los algoritmos no atan sus ruedas al vac2o; necesitas anali#ar tanto los datos )ue alguien m s 9a identi-icado para ti como los datos )ue son necesarios para escribir tu cdigo. Un e0emplo trivial 9ar la cuestin m s clara. Est s implementando una rutina de bAs)ueda para una biblioteca. De acuerdo a tus especi-icaciones; el usuario puede seleccionar libros mediante la combinacin de g+nero; autor; t2tulo; editor; a!o de impresin; 5 nAmero de p ginas. $a meta Altima de tu rutina es producir una sentencia &*$ legal para buscar la base de datos sub5acente. Basado en esos re)uerimientos; tienes varias opciones@ c9e)uear cada control por turnos; usar una sentencia Ys6itc9Y; o varios Yi-sYJ 9acer un arreglo de controles de datos; c9e)uear cada elemento para ver si est establecidoJ crear :o usar= un ob0eto de control abstracto desde el cual 9eredar todos tus controles espec2-icos; 5 conectarlos a un motor conducido por eventos. &i tus re)uerimientos inclu5en tambi+n optimi#ar el desempe!o de la consulta; asegur ndote )ue los 2tems sean C9e)ueados en un orden espec2-ico; puedes considerar el uso de un rbol de componentes para construir tu sentencia &*$. Como puedes ver; la eleccin del algoritmo depende de los datos )ue decidas usar; o crear. ,ales decisiones pueden 9acer toda la di-erencia entre un algoritmo e-iciente 5 uno desastroso. &in embargo; la e-iciencia no es la Anica preocupacin. Puedes usar una docena de variables en tu

cdigo 5 9acerlo tan e-iciente como podr2a serlo. Pero tal pie#a de cdigo podr2a no ser - cilmente mantenible. *ui# el elegir un contenedor apropiado para tus variables podr2a mantener la misma velocidad 5 adicionalmente permitir a tus colegas comprender me0or el cdigo cuando lo vean el pr(imo a!o. Adem s; el escoger una estructura de datos bien de-inida puede permitirles e(tender la -uncionalidad de tu cdigo sin reescribirlo. A la larga; tus escogencias de datos determinan )u+ tanto sobrevivir tu cdigo despu+s de )ue lo -inalices. Perm2teme darte otro e0emplo; solamente algo m s en lo )ue pensar. &upongamos )ue tu tarea es encontrar todas las palabras en un diccionario con m s de tres anagramas; donde un anagrama debe ser otra palabra del mismo diccionario. &i piensas en ello como una tarea computacional; terminar s con un es-uer#o sin -in; intentando traba0ar todas las combinaciones de cada palabra 5 luego compar ndola a las otras de la lista. &in embargo; si anali#as los datos a mano; te dar s cuenta de )ue cada palabra puede ser representada por un registro conteniendo la palabra en +l mismo 5 un arreglo ordenado de sus letras como ID. Armado con tal conocimiento; encontrar anagramas signi-ica tan solo ordenar la lista sobre el campo adicional 5 seleccionar las )ue comparten el mismo ID. El algoritmo de -uer#a bruta puede tomar varios d2as para e0ecutarse; mientras )ue el inteligente solo es cuestin de unos pocos segundos. 1ecuerda este e0emplo la pr(ima ve# )ue est+s encarando un problema intratable. Habilidades de E+uipo Cmo Administrar el Tiempo de Desarrollo Al administrar el tiempo de desarrollo; mant+n un plan del pro5ecto conciso 5 actuali#ado. Un plan del pro5ecto es un estimado; un calendario; un con0unto de 9itos :marcas )ue re-le0en avances= para marcar el progreso; 5 una asignacin del tiempo de tu e)uipo o de tu propio tiempo para cada tarea en el estimado. Deber2a incluir tambi+n las cosas )ue tengas )ue recordar 9acer; tales como reunirte con la gente de aseguramiento de la calidad; preparar la documentacin; u ordenar 9ard6are. &i est s en un e)uipo; el plan del pro5ecto deber2a ser un acuerdo consensual; tanto al inicio como mientras avan#as. El plan del pro5ecto e(iste para a5udar a 9acer decisiones; no para mostrar )u+ tan organi#ado eres. &i el plan del pro5ecto es demasiado largo o no est actuali#ado; ser inAtil para 9acer decisiones. En realidad; esas decisiones son sobre personas individuales. El plan 5 tu 0uicio te permiten decidir si deber2as trans-erir tareas de una persona a otra. $os 9itos marcan tu progreso. &i usas una 9erramienta -ant stica de planeacin de pro5ecto; no te de0es seducir para crear un .ran Dise!o Desde el /rente :.DD/= para el pro5ecto; pero Asala para mantener la concisin 5 la actualidad. &i -allas un 9ito; deber2as tomar una accin inmediata tal como in-ormar a tu 0e-e )ue la -inali#acin programada de ese pro5ecto se 9a corrido por esa cantidad. El estimado 5 el cronograma nunca podr2an 9aber sido per-ectos para comen#arJ esto crea la ilusin de )ue podr2as ser capa# de reponer los d2as )ue perdiste en la Altima parte del pro5ecto. Podr2as. Pero es tan probable )ue 9a5as subestimado esa parte como )ue la 9a5as sobrestimado. Por lo tanto la -inali#acin programada del pro5ecto 5a se 9a corrido; te guste o no. AsegArate )ue tu plan inclu5e tiempo para@ reuniones internas de e)uipo; demos; documentacin; actividades peridicas programadas; pruebas de integracin; lidiar con -or neos; en-ermedades; vacaciones; mantenimiento de productos e(istentes; 5

mantenimiento del ambiente de desarrollo. El plan del pro5ecto puede servir como una v2a para de dar a los -or neos o a tu 0e-e una visin a lo interno de lo )ue tA o tu e)uipo est n 9aciendo. Por esa ra#n deber2a ser corto 5 actuali#ado. Cmo )ane1ar 2ies#os de (o.t6are de Terceras Partes Un pro5ecto a menudo depende del so-t6are producido por organi#aciones )ue +l no controla. Ha5 grandes riesgos asociados con so-t6are de terceras partes )ue deber2an ser reconocidos por todos los involucrados. 4unca; nunca; deposites ninguna esperan#a en el vapor-are. El vapor-are es cual)uier so-t6are alegado )ue 9a sido prometido pero )ue no est disponible aAn. Esta es la -orma m s segura de salir de los negocios. 4o es sabio estar solamente esc+ptico de la promesa de una compa!2a de so-t6are para liberar un cierto producto con una cierta -uncionalidad en una cierta -ec9aJ es muc9o m s sabio ignorarlo completamente 5 olvidar )ue alguna ve# lo escuc9aste. 4unca permitas )ue se inclu5a en ningAn documento usado por tu compa!2a. &i el so-t6are de terceros no es vapor6are; aAn es riesgoso; pero al menos es un riesgo )ue puede ser abordado. &i est s considerando usar so-t6are de terceros; deber2as dedicar energ2a inicialmente a evaluarlo. A la gente podr2a no gustarle el escuc9ar )ue tomar dos semanas o dos meses evaluar cada uno de los tres productos por la conveniencia; pero tiene )ue 9acerse tan pronto como sea posible. El costo de integrar no puede ser e(actamente estimado sin una apropiada evaluacin. Comprender la conveniencia de so-t6are de terceras partes para un propsito particular es conocimiento mu5 tribal. Es mu5 sub0etivo 5 generalmente radica en los e(pertos. Puede a9orrarte muc9o tiempo si puedes 9allar esos e(pertos. A menudo muc9as veces un pro5ecto depender de un sistema de so-t6are de una tercera parte de una -orma tan completa )ue si la integracin -alla el pro5ecto -allar . E(presa los riesgos como +se claramente al incluirlos en el cronograma. ,rata de tener un plan de contingencia; tal como otro sistema )ue pueda ser usado o la capacidad de escribir la -uncionalidad tA mismo si el riesgo no puede ser removido antes. 4unca de0es )ue un cronograma dependa del vapor6are. Cmo )ane1ar Consultores Usa consultores; pero no con-2es en ellos. &on gente maravillosa 5 merecen una gran cantidad de respeto. Puesto )ue tienen )ue ver muc9os pro5ectos di-erentes; a menudo saben m s sobre tecnolog2as espec2-icas e incluso de t+cnicas de programacin de lo )ue tu sabr s. $a me0or manera de usarlos es como educadores a domicilio )ue puedan ense!ar mediante el e0emplo. &in embargo; usualmente no pueden volverse parte del e)uipo en el mismo sentido )ue lo son los empleados regulares; aun)ue sea solo por)ue no puedes tener el tiempo su-iciente como para conocer sus -ortale#as 5 sus debilidades. &u compromiso -inanciero es muc9o menor. Pueden moverse m s - cilmente. Pueden tener menos )ue ganar si la compa!2a lo 9ace bien. Algunos ser n buenos; algunos promedio; 5 algunos ser n malos; pero es de esperar tu seleccin de consultores no ser tan cuidadosa como tu seleccin de empleados; de tal -orma )ue obtendr s m s malos.

&i lo consultores van a escribir cdigo; debes revisarlo cuidadosamente a medida )ue avan#as. 4o puedes llegar al -inal de un pro5ecto con el riesgo de un gran blo)ue de cdigo )ue no 9a sido revisado. Esto es cierto para todos los miembros del e)uipo; en realidad; pero usualmente tendr s m s conocimiento de los miembros del e)uipo m s cercanos a ti. Cmo Comunicar la Cantidad Adecuada Considera cuidadosamente el costo de una 0untaJ cuesta s# d#racin m#ltiplicada por el n+mero de participantes. $as 0untas son algunas veces necesarias; pero las m s pe)ue!as son usualmente las me0ores. $a calidad de la comunicacin en pe)ue!as 0untas es me0or; 5 el total de tiempo desperdiciado es menor. &i alguna persona est aburrida en la 0unta toma eso como una se!al; )ue la 0unta deber2a ser m s pe)ue!a. Deber2a 9acerse todo lo posible para -omentar la comunicacin in-ormal. El traba0o m s Atil se reali#a durante los almuer#os con colegas )ue durante cual)uier otro tiempo. Es una l stima )ue la ma5or2a de las compa!2as no recono#can ni apo5en este 9ec9o. Cmo Disentir Honestamente 5 (obrellevarlo El desacuerdo es una gran oportunidad para 9acer una buena decisin; pero deber2a ser mane0ada con delicade#a. Con muc9a esperan#a sientes )ue 9as e(presado tu opinin adecuadamente 5 9an sido escuc9adas antes de )ue la decisin sea 9ec9a. En ese caso no 9a5 nada m s )ue decir; 5 deber2as decidir si aceptar s la decisin aun)ue no concuerdes con ella. &i puedes apo5a esta decisin aun)ue no concuerdes con ella; dilo as2. Eso demuestra cu n valioso eres por)ue eres independiente 5 no eres un 9ombre Ys2 se!orY; sino respetuoso de la decisin 5 un 0ugador de e)uipo. A veces una decisin con la )ue no concuerdas ser 9ec9a cuando los tomadores de decisin no tuvieron el total bene-icio de tu opinin. Deber2as entonces evaluar si debes replantear el asunto sobre las bases del bene-icio para la compa!2a o para la tribu. &i en tu opinin es un pe)ue!o error; podr2a no valer la pena reconsiderar. &i en tu opinin es una gran error; entonces por supuesto debes presentar un argumento. Usualmente; esto no es un problema. En algunas circunstancias estresantes con algunos tipos de personalidad esto puede conducir a )ue las cosas sean tomadas personalmente. Por e0emplo; algunos mu5 buenos programadores carecen de la con-ian#a necesaria para desa-iar una decisin aAn cuando tienen buenas ra#ones para creer )ue es errada. En la peor de las circunstancias el tomador de decisiones est inseguro 5 lo toma como un desa-2o personal a su autoridad. Es me0or recordar )ue en tales circunstancias la gente reacciona con la parte rept2lea de sus cerebros. Deber2as presentar tu argumento en privado; e intentar mostrar cmo el nuevo conocimiento cambia las bases sobre las cuales se tom la decisin. &in importar si la decisin se revierta o no; debes recordar )ue tu nunca deber s decir HO,e lo di0ePH puesto )ue la decisin alternativa -ue completamente e(plorada. 7uicio Cmo 4e#ociar Calidad 0rente a Tiempo de Desarrollo

El desarrollo de so-t6are es siempre un compromiso entre lo )ue el pro5ecto 9ace 5 conseguir el pro5ecto 9ec9o. Pero puede )ue se te pida ba0ar el nivel de calidad a -in de acelerar la implantacin de un pro5ecto en una -orma )ue o-enda tu sensibilidades ingenieriles o de negocios. Por e0emplo; puede )ue se te pida 9acer algo )ue sea una pr ctica pobre de ingenier2a de so-t6are 5 )ue conducir a un montn de problemas de mantenimiento. &i esto sucede tu primer responsabilidad es in-ormar a tu e)uipo 5 claramente e(plicar el costo de la disminucin de la calidad. Despu+s de todo; tu comprensin de ello deber2a ser muc9o me0or )ue la comprensin de tu 0e-e. Aclara lo )ue se est perdiendo 5 lo )ue se est ganando; 5 a )u+ costo el terreno perdido ser recobrado en el pr(imo ciclo. En esto; la visibilidad proporcionada por un buen plan de pro5ecto deber2a ser Atil. &i el true)ue de la calidad por otra cosa a-ecta el es-uer#o de aseguramiento de la calidad; se!ala eso :tanto a tu 0e-e como a la gente de aseguramiento de la calidad=. &i el true)ue de calidad conducir a )ue se reporten m s bugs despu+s del periodo de aseguramiento de la calidad; se!ala eso tambi+n. &i +l o ella insiste deber2as intentar aislar la mala calidad en componentes individuales )ue puedas planear reescribir o me0orar en el pr(imo ciclo. E(plica esto a tu e)uipo para )ue as2 puedan planearlo. 4in0aProgrammer en &las9dot envi esta gema@ 1ecuerda )ue un buen dise o ser -le(ible -rente a implementaciones de cdigo pobre. &i e(isten buenas inter-aces 5 abstracciones a trav+s del cdigo; entonces las reescrituras eventuales ser n muc9o menos dolorosas. &i es di-2cil escribir cdigo claro )ue sea di-2cil de corregir; considera lo )ue est errado con el nAcleo del dise!o )ue est causando esto. Cmo )ane1ar la Dependencia del (istema de (o.t6are $os sistemas modernos de so-t6are tienden a depender de un gran nAmero de componentes )ue pueden no estar directamente ba0o tu control. Esto incrementa la productividad a trav+s de la sinerg2a 5 la reutili#acin. &in embargo; cada componente trae consigo algunos problemas@ MCmo corregir s los bugs en el componenteN M,e restringe el componente a sistemas de 9ard6are o so-t6are particularesN M*u+ 9ar s si el componente -alla completamenteN

&iempre es me0or encapsular el componente de alguna manera de tal -orma )ue est+ aislado 5 de tal manera )ue pueda ser reempla#ado. &i el componente prueba ser completamente inoperable; puede )ue tengas )ue conseguir uno di-erente; pero puede )ue tengas )ue escribir el tu5o propio. $a encapsulacin no es portabilidad; pero la 9ace m s - cil; lo cual es casi tan bueno. ,ener el cdigo -uente de un componente decrementa el riesgo por un -actor de cuatro. Con el cdigo -uente; puedes evaluarlo m s - cilmente; depurarlo m s - cilmente; 9allar -ormas de corregir los problemas m s - cilmente; 5 9acer correcciones m s - cilmente. &i 9aces correcciones ; deber2as d rselas al propietario

del componente 5 obtener las correcciones incorporadas en una versin o-icialJ de otro modo tendr s )ue mantener incmodamente una versin no o-icial. Cmo Decidir si el (o.t6are es )u5 Inmaduro Usar el so-t6are )ue otra persona escribi es uno de las m s e-ectivas -ormas de construir r pidamente un sistema slido. Deber2a no ser desalentado; pero los riesgos asociados con ello deben ser e(aminados. Uno de los m s grandes riesgos es el periodo de bugginess 5 la cercana inoperabilidad )ue a menudo est asociada con el so-t6are antes de )ue madure; a trav+s del uso; en un producto utili#able. Antes de )ue consideres integrar con un sistema de so-t6are; sin importar si se cre en casa o por una tercera parte; es mu5 importante considerar si en realidad es lo su-icientemente maduro para ser usado. A)u2 est n die# preguntas )ue deber2as 9acerte a ti mismo al respecto@ 1. MEs vapor6areN :$as promesas son mu5 inmaduras=. 2. MHa5 un cuerpo de ciencia accesible acerca del so-t6areN 3. MEres el primer usuarioN 8. MHa5 un -uerte incentivo para su continuacinN S. MHa tenido un es-uer#o de mantenimientoN E. M&obrevir la desercin de los actuales mantenedoresN ^. MHa5 una alternativa madura al menos la mitad de buenaN L. MEs conocido para tu tribu o compa!2aN C. MEs deseable para tu tribu o compa!2aN 1<. MPuedes contratar gente para traba0ar en +l aAn si es maloN Un poco de consideracin sobre esos criterios demuestran el gran valor del so-t6are libre bien establecido 5 del so-t6are de -uente abierta al reducir riesgos para el emprendedor. Cmo Hacer una Decisin de Compra vs. Construccin Una compa!2a emprendedora o pro5ecto emprendedor )ue est intentando 9acer algo con so-t6are tiene )ue 9acer constantemente las llamadas decisiones de compra vs. constr#ccin. Este 0uego de palabras es desa-ortunado por dos cosas@ parece ignorar el so-t6are de -uente abierta 5 el so-t6are libre el cual no es necesariamente comprado. AAn m s importante; deber2a )ui# ser llamado una decisin deo"tener e integrar vs. constr#ir a)#! e integrar debido a )ue el costo de la integracin debe ser considerado. Esto re)uiere una gran combinacin de negocios; administracin; 5 engineering savv5. M*u+ tan bien satis-ace las necesidades para las cuales -ue dise!adoN M*u+ porcin de lo )ue compres necesitar sN MCu l es el costo de evaluar la integracinN MCu l es el costo de la integracinN MComprar incrementar o decrementar a largo pla#o los costos de mantenimientoN MConstruirlo te pondr en una posicin de negocios en la )ue no )uieres estarN

Deber2as pensar dos veces antes de construir algo )ue sea lo su-icientemente grande como para servir de base para otro negocio completo. ,ales ideas son a menudo

propuestas por gente brillante 5 optimista )ue tendr muc9o )ue contribuir a tu e)uipo. &i su idea es obligatoria; puede )ue desees cambiar tu plan de negociosJ pero no investigues una solucin m s grande )ue tu propio negocio sin un an lisis consciente. Despu+s de considerar esas preguntas; deber2as )ui# preparar dos borradores de planes de pro5ecto; uno para construir 5 otro para comprar. Eso te -or#ar a considerar los costos de integracin. Deber2as tambi+n considerar los costos de mantenimiento a largo pla#o de ambas soluciones. Para estimar los costos de integracin; tendr s )ue 9acer una evaluacin completa del so-t6are antes de )ue lo compres. &i no puedes evaluarlo; asumir s un riesgo irra#onable al comprarlo 5 deber2as decidir contra comprar ese producto particular. &i 9a5 varias decisiones de compra ba0o consideracin; tendr )ue invertirse alguna energ2a en evaluar cada una de ellas. Cmo Crecer Pro.esionalmente Asume responsabilidad encima de tu autoridad. 7uega el rol )ue deseas. E(presa aprecio por la contribucin de la gente para el +(ito de la organi#acin; al igual )ue a las cosas como las )ue te a5udan personalmente. &i )uieres convertirte en un l2der de e)uipo; instiga la -ormacin de consenso. &i )uieres convertirte en un administrador; toma responsabilidad por el cronograma. Usualmente puedes 9acer esto cmodamente mientras traba0as con un l2der o un administrador; puesto )ue ello les libera de tomar una responsabilidad m s grande. &i eso es demasiado para probar; 9a#lo un poco a la ve#. EvalAate tu mismo. &i )uieres convertirte en un me0or programador; pregAntale a alguien )ue admiras cmo puedes convertirte en alguien como +l. Puedes tambi+n preguntarle a tu 0e-e; )uien sabr menos pero tendr un impacto m s grande sobre tu carrera. Planea -ormas de aprender nuevas 9abilidades; tanto del tipo trivial t+cnico; como aprender un nuevo sistema de so-t6are; 5 el tipo trivial di-2cil; como escribir bien; integr ndolas en tu traba0o. Cmo Evaluar Entrevistados A la evaluacin de empleados potenciales no se le da la energ2a )ue merece. Una mala contratacin; como un mal matrimonio; es terrible. Una porcin signi-icativa de la energ2a de todos deber2a dedicarse al reclutamiento; aun)ue esto se 9ace raramente. Ha5 di-erentes estilos de entrevista. Algunas son tortuosas; dise!adas para poner al candidato ba0o una gran carga de estr+s. Esto sirve al mu5 valioso propsito de revelar posiblemente las -allas de car cter 5 las debilidades ba0o estr+s. $os candidatos no son m s 9onestos con los entrevistadores de lo )ue lo son con ellos mismos; 5 la capacidad 9umana para auto decepcin es asombrosa. Deber2as; como m2nimo; dar al candidato el e)uivalente de un e(amen oral sobre las 9abilidades t+cnicas por dos 9oras. Con pr ctica; ser s capa# de cubrir r pidamente lo )ue ellos saben 5 r pidamente retractarse de lo )ue no saben para marcar la -rontera. $os entrevistados respetar n esto. He escuc9ado varias veces a entrevistados )ue

dicen )ue la calidad del e(amen -ue una de sus motivaciones para escoger una compa!2a. $a gente buena )uiere ser contratada por sus 9abilidades; no por dnde traba0aron por Altima ve# o a )u+ escuela -ueron o algunas caracter2sticas no esenciales. Al 9acer esto; deber2as tambi+n evaluar su capacidad para aprender; la cual es muc9o m s importante de lo )ue ello saben. Deber2as tambi+n observar las bocanadas de a#u-re )ue da la gente di-2cil. Puedes ser capa# de reconocerlo al comparar notas despu+s de la entrevista; pero al calor de la entrevista es di-2cil reconocer. *u+ tan bien se comunica la gente 5 traba0a con la gente es m s importante )ue estar capacitado en el Altimo de los lengua0es de programacin. Un lector 9a tenido buena suerte usando una prueba Hpara llevar a casaH para los entrevistados. Esto tiene la venta0a de )ue puede descubrir a los entrevistados )ue pueden presentarse bien a s2 mismos pero )ue no pueden realmente codi-icarIII5 9a5 muc9a gente como esa. Personalmente no 9e probado esta t+cnica; pero suena sensible. /inalmente; entrevistar es tambi+n un proceso de venta. Deber2as estar vendiendo tu compa!2a o pro5ecto al candidato. &in embargo; est s 9ablando con un programador; as2 )ue no trates de colorear la verdad. Empie#a con lo malo; luego -inali#a -uerte con lo bueno. Cmo (aber Cu!ndo Aplicar Ciencia Computacional 0antasiosa Ha5 una base de conocimientos sobre algoritmos; estructuras de datos; matem ticas; 5 otras cara0os tpicos sobre la )ue la ma5or2a de los programadores saben pero )ue raramente usan. En la pr ctica; este maravilloso material es mu5 complicado 5 generalmente innecesario. 4o 9a5 punto en me0orar un algoritmo cuando la ma5or2a de tu tiempo se invierte en 9acer ine-icientes llamadas a bases de datos; por e0emplo. Una cantidad desa-ortunada de programacin consiste en obtener sistemas para 9ablar a cada uno de los otros 5 usar estructuras de datos mu5 simples para construir una inter-ace de usuario agradable. MCu ndo es la alta tecnolog2a la tecnolog2a apropiadaN MCu ndo deber2as abrir un libro para obtener algo distinto a un algoritmo de batallaN A veces es Atil 9acer esto pero deber2a ser evaluado cuidadosamente. $as tres consideraciones m s importantes para la t+cnica de la ciencia computacional potencial son@ MEst bien encapsulado de tal manera )ue el riesgo para otros sistemas es ba0o 5 el incremento general en comple0idad 5 costo de mantenimiento es ba0oN MEs el bene-icio sorprendente :por e0emplo; un -actor de dos en un sistema maduro o un -actor de die# en un nuevo sistema=N M&er s capa# de probarlo 5 evaluarlo e-ectivamenteN

&i un algoritmo bien aislado )ue usa un algoritmo ligeramente -antasioso puede decrementar el costo del 9ard6are o incrementar el desempe!o por un -actor de dos a trav+s de un sistema completo; entonces ser2a criminal no considerarlo. Una de las claves para argumentar por tal apro(imacin es mostrar )ue el riesgo es realmente

mu5 ba0o; puesto )ue la tecnolog2a propuesta 9a sido probablemente bien estudiada; el Anico punto importante es el riesgo de la integracin. A)u2 la e(periencia 5 el 0uicio de un programador pueden verdaderamente sinergi#arse con la tecnolog2a -antasiosa para 9acer la integracin - cil. Cmo Hablar con 4o In#enieros $os ingenieros 5 los programadores en particular son generalmente reconocidos por la cultura popular por ser di-erentes de las otras personas. Esto implica )ue las otras personas son di-erentes de nosotros. ?ale la pena tener esto en mente cuando te comuni)ues con no ingenierosJ deber2as siempre comprender a la audiencia. $os no ingenieros son inteligentes; pero no son tan aterri#ados en crear cosas t+cnicas como nosotros. 4osotros 9acemos cosas. Ellos venden cosas 5 mane0an cosas 5 cuentan cosas 5 administran cosas; pero no son e(pertos en 9acer cosas. Ello no son tan buenos en el traba0o en e)uipos como los son los ingenieros :sin duda 9a5 e(cepciones.=B3D &us 9abilidades sociales son generalmente tan buenas o me0ores )ue la de los ingenieros en ambientes donde no 9a5 e)uipos; pero su traba0o no siempre demanda )ue practi)uen el tipo de intimidad; comunicacin precisa 5 las cuidadosas subdivisiones de tareas )ue nosotros 9acemos. $os no ingenieros pueden ser demasiado dados a agradar 5 pueden ser intimidados por ti. Al igual )ue nosotros; ellos pueden decir HsiH sin realmente )uerer decirlo a -in de agradarte o por)ue est n un poco asustados por tu causa; 5 luego no respaldar su palabra. $os no programadores pueden comprender cosas t+cnicas pero no tienen lo )ue incluso es di-2cil para nosotros IIIel 0uicio t+cnico. Ellos comprenden cmo -unciona la tecnolog2a; pero no pueden entender por )u+ cierto acercamiento tomar2a tres meses 5 otro tres d2as. :Despu+s de todo; los programadores son tambi+n anecdticamente 9orribles en este tipo de estimacin.= Esto representa una gran oportunidad para sinergi#arse con ellos. Cuando le 9ablas a tu e)uipo usar s; sin pensarlo; una suerte de ta)uigra-2a; un lengua0e abreviado )ue es e-ectivo debido a )ue tendr s muc9a e(periencia compartida sobre la tecnolog2a en general 5 tu producto en particular. 1e)uiere algo de es-uer#o no usar este vocabulario con los )ue no tienen esa e(periencia compartida; especialmente cuando los miembros de tu e)uipo est n presentes. Este vocabulario crea una pared entre tA 5 los )ue no la comparten; 5; peor aAn; desperdicia su tiempo. Con tu e)uipo; las suposiciones b sicas 5 metas no necesitan ser restablecidas a menudo; 5 la ma5or2a de la conversacin se en-oca en los detalles. Con los -or neos; debe ser del otro modo. Ellos pueden no comprender cosas )ue das por entendidas. Puesto )ue las das por entendidas 5 no las repites; puedes de0ar una conversacin con un -or neo pensando )ue comprendiste a los dem s cuando realmente 9a5 una gran incomprensin. Deber2as asumir )ue te comunicar s mal 5 vigilar cuidadosamente para encontrar esta mala comunicacin. Intenta resumirlas o para-rasear lo )ue est s diciendo para asegurarte de )ue comprenden. &i tienes la oportunidad de reunirte con ellos a menudo; invierte un poco de tiempo preguntando si te est s comunicando e-ectivamente; 5 cmo puedes 9acerlo me0or. &i 9a5 un problema en la comunicacin; busca alterar tus propias pr cticas antes de -rustrarte con las su5as.

Adoro traba0ar con no ingenieros. Proporciona grandes oportunidades para aprender 5 ense!ar. A menudo puedes guiar mediante el e0emplo; en t+rminos de la claridad de tu comunicacin. $os ingenieros est n entrenados para poner orden al caos; para traer claridad a la con-usin; 5 a los no ingenieros les agrada eso de nosotros. Debido a )ue tenemos 0uicio t+cnico 5 usualmente podemos comprender tpicos de negocios; a menudo podemos encontrar una solucin simple a un problema. A menudo los no ingenieros proponen soluciones )ue piensan nos -acilitar n las cosas sin bondades 5 por un deseo de 9acer lo correcto; cuando de 9ec9o e(iste una solucin general muc9o me0or la cual solamente puede verse sinergi#ando las visiones de los -or neos con tu 0uicio t+cnico. Personalmente me gusta la Programacin E(trema por)ue resuelve esta ine-icienciaJ casando la estimacin r pidamente a la idea; 9ace m s - cil 9allar la idea )ue sea la me0or combinacin de costo 5 bene-icio.

B1D

Vto 9itW

Captulo 8. Avan%ado Tabla de Contenido 7uicio ,ecnolgico Cmo Di-erenciar lo Di-2cil de lo Imposible Cmo Utili#ar $engua0es Embebidos Escogiendo $engua0es Comprometi+ndote &abiamente Cmo Combatir Presin de Calendario Cmo Comprender al Usuario Cmo "btener una Promocin &irviendo a ,u E)uipo Cmo Desarrollar ,alento Cmo Elegir &obre *u+ ,raba0ar Cmo "btener lo ' (imo de ,us Compa!eros de E)uipo Cmo Dividir Problemas Cmo 'ane0ar las ,areas Aburridas Cmo Conseguir Apo5o para un Pro5ecto Cmo Hacer Crecer un &istema Cmo Comunicar Bien Cmo Decirle a la .ente Cosas )ue 4o Desean Escuc9ar Cmo $idiar con 'itos Administrativos Cmo $idiar con el Caos "rgani#acional 7uicio Tecnol#ico Cmo Di.erenciar lo Di.cil de lo Imposible Es nuestro traba0o 9acer lo di-2cil 5 discernir lo imposible. Desde el punto de vista de la ma5or2a de los programadores activos; algo es imposible si no puede ser desarrollado a partir de un sistema simple o no puede ser estimado. 'ediante esta de-inicin lo )ue se denomina investigacin es imposible. Un gran volumen de mero tra"ajo es di-2cil; pero no necesariamente imposible.

$a distincin no es 0ocosa debido a )ue se te puede pedir mu5 bien 9acer lo )ue es pr cticamente imposible; 5a sea desde un punto de vista cient2-ico o desde un punto de vista de la ingenier2a de so-t6are. $uego se vuelve tu traba0o a5udar al emprendedor a encontrar una solucin ra#onable la cual es meramente dif!cil 5 )ue sea m s de lo )ue )uer2an. Una solucin es meramente di-2cil cuando puede ser con-idencialmente calendari#ada 5 son comprendidos los riesgos. &i es imposible satis-acer un re)uerimiento vago; tal como HConstru5e un sistema )ue computar el m s atractivo estilo 5 color de cabello para cual)uier persona.H &i el re)uerimiento puede 9acerse m s e(presivo; se volver a menudo meramente di-2cil; tal como HConstru5e un sistema para computar un estilo 5 color atractivo de cabello para una persona; permiti+ndoles previsuali#arlo 5 9acer cambios; 5 tener la satis-accin del cliente basado en )ue el estilo original sea tan grandioso )ue 9agamos muc9o dinero.H &i no 9a5 una de-inicin e(presiva; no tendr s +(ito. Cmo Utili%ar &en#ua1es Embebidos incrustar un lengua0e de programacin dentro de un sistema tiene una -ascinacin casi ertica para un programador. Es uno de los m s creativos actos )ue pueden ser reali#ados. Hace al sistema tremendamente poderoso. ,e permite e0ercitar tus 9abilidades m s creativas 5 prometeas. Convierte al sistema en tu amigo. ,odos los me0ores editores de te(to del mundo tienen lengua0es embebidos. Este puede ser usado 9asta el punto )ue la audiencia pretendida pueda dominar el lengua0e. Por supuesto; el uso del lengua0e puede ser opcional; como lo es en los editores de te(to; de tal manera )ue los iniciados puedan usarlo 5 nadie m s tenga )ue 9acerlo. >o 5 muc9os otros programadores 9emos ca2do en la trampa de crear lengua0es embebidos de propsito general. Ca2 en ello dos veces. >a e(isten muc9os lengua0es dise!ados espec2-icamente para ser lengua0es embebidos. Deber2as pensarlo dos veces antes de crear uno nuevo. $a verdadera pregunta )ue uno debe 9acerse a s2 mismo antes de incrustar un lengua0e es@ M/unciona esto con o en contra de la cultura de mi audienciaN &i tu audiencia pretendida es e(clusivamente no programadores; Mcmo a5udar N &i tu audiencia pretendida es e(clusivamente programadores; Mpre-erir2an ellos una inter-ace de programacin de aplicaciones :API=N M> )u+ lengua0e ser N $os programadores no desean aprender un nuevo lengua0e )ue sea estrec9amente usadoJ pero si enca0a con su cultura no tendr n )ue invertir muc9o tiempo en aprenderlo. Es una broma crear un nuevo lengua0e. Pero no deber2amos permitir )ue nos cieguen las necesidades del usuario. A menos )ue tengas algunas necesidades e ideas verdaderamente originales; Mpor )u+ no usar un lengua0e e(istente de tal manera )ue puedas aprovec9ar la -amiliaridad )ue los usuarios 5a tienen con +lN Esco#iendo &en#ua1es El programador solitario )ue ama su traba0o :un 9acGer= puede elegir el me0or lengua0e para la tarea. $a ma5or2a de los programadores activos tienen mu5 poco control del lengua0e )ue usar n. .eneralmente; este punto es dictado por 0e-es encopetados )uienes est n 9aciendo una decisin pol2tica; en lugar de una decisin tecnolgica; 5 carecen del cora0e para promover una 9erramienta no convencional aAn

cuando saben; a menudo con conocimiento de primera mano; )ue la 9erramienta menos aceptada es la me0or. En otros casos el verdadero bene-icio de la unidad entre el e)uipo; 5 en alguna e(tensin con una comunidad m s grande; e(clu5e la eleccin por parte del individuo. A menudo los administradores se conducen por la necesidad de ser capaces de contratar programadores con e(periencia en un lengua0e dado. &in duda est n sirviendo a lo )ue ellos perciben como el me0or inter+s del pro5ecto o la compa!2a; 5 deben ser respetados por eso. &in embargo; personalmente creo )ue esto es el ma5or desperdicio 5 la pr ctica errnea m s comAn con la )ue probablemente te encuentres. Pero por supuesto; las cosas no son nunca unidimensionales. Incluso si se ordena usar un lengua0e central 5 est m s all de tu control; a menudo es el caso )ue las 9erramientas 5 otros programas pueden 5 deber2an ser escritos en un lengua0e di-erente. &i un lengua0e debe ser incrustado :O5 deber2as siempre considerarloP= la escogencia del lengua0e depender muc9o de la cultura de los usuarios. Uno deber2a tomar venta0a de esto para servir a tu compa!2a o pro5ecto mediante el uso del me0or lengua0e para el traba0o; 5 al 9acerlo as2 9aces el traba0o m s interesante. $os lengua0es de programacin deber2an ser llamados en realidad notaciones en el sentido )ue aprender uno no es del todo tan di-2cil como aprender un lengua0e natural. Para los principiantes 5 para algunos -or neos Yaprender un nuevo lengua0eHH parece una tarea dantescaJ pero despu+s de )ue tienes tres ba0o tu -a0a es realmente slo cuestin de -amiliari#arse con las bibliotecas disponibles. Uno tiende a pensar de un gran sistema )ue tiene componentes en tres o cuatro lengua0es como una me#colan#a desordenadaJ pero 5o argumento )ue tal sistema es en muc9os casos m s -uerte )ue un sistema 9ec9o en un Anico lengua0e de varias -ormas@ Ha5 necesariamente un d+bil acoplamiento entre los componentes )ue est n escritos en di-erentes notaciones :aun)ue )ui# sin inter-aces limpias=; Puedes evolucionar a un nuevo lengua0e o plata-orma - cilmente al reescribir cada componente de manera individual; Es posible )ue alguno de los mdulos est+ realmente actuali#ado.

Algunos de esos e-ectos pueden ser solamente sicolgicosJ pero la sicolog2a importa. Al -inal los costos de la tiran2a del lengua0e sobrepasan cual)uier venta0a )ue provea. Comprometi-ndote (abiamente Cmo Combatir Presin de Calendario $a presin de tiempo de mercadeo es la presin para entregar un buen producto r pidamente. Es bueno debido a )ue re-le0a una realidad -inanciera; 5 es saludable 9asta cierto punto. $a presin de tiempo de mercadeo es la presin para entregar algo m s r pido de lo )ue puede ser entregado 5 es prdigo; insalubre; 5 mu5 comAn. $a presin del cronograma e(iste por varias ra#ones. $a gente )ue traba0a con programadores no aprecia completamente la -uerte +tica de traba0o )ue tenemos 5 cu n divertido es ser un programador. *ui# debido a )ue pro5ectan su propio comportamiento en nosotros; creen )ue pidi+ndolo m s pronto nos 9ar traba0ar m s duro para tenerlo a92 m s pronto. Esto en realidad sea probablemente cierto; pero el e-ecto es mu5 pe)ue!o; 5 el da!o mu5 grande. Por lo dem s; no tienen visibilidad de lo )ue realmente se re)uiere para producir so-t6are. 4o son capaces de verlo; 5 no

son capaces de crearlo ellos mismos; la Anica cosa )ue pueden 9acer es ver la presin de tiempo de mercadeo 5 molestar a los programadores por ello. $a clave para combatir la presin del calendario es simplemente convertirla en presin de tiempo de mercadeo. $a manera de 9acer esto es dar visibilidad dentro de la relacin entre el traba0o disponible 5 el producto. Producir un estimado 9onesto; detallado; 5 sobre todo; comprensi"le de todo el traba0o involucrado es la me0or -orma de 9acer esto. ,iene la venta0a agregada de permitir )ue las buenas decisiones de administracin sean tomadas sobre posibles negociaciones de -uncionalidades. El conocimiento clave )ue el estimado debe 9acer claro es )ue el traba0o es un -luido casi incomprensible. 4o puedes empa)uetar m s en una medida de tiempo m s de lo )ue podr2as empa)uetar m s agua en un contenedor por encima de la capacidad del volumen de ese contenedor. En un sentido; un programador nunca deber2a decir HnoH; sino m s bien decir HM*u+ ceder s para obtener lo )ue )uieresNH El e-ecto de producir estimados claros ser incrementar el respeto por los programadores. As2 es como otros pro-esionales se comportan. El traba0o duro de los programadores ser visible. Establecer un cronograma no realista ser tambi+n doloroso para todos. $os programadores no pueden ser burlados. Es irrespetuoso 5 desmorali#ador pedirles )ue 9agan algo poco realista. $a Programacin E(trema ampli-ica esto 5 constru5e un proceso alrededor de elloJ Espero )ue cada lector ser lo su-icientemente a-ortunado para usarlo. Cmo Comprender al Usuario Es tu deber comprender al usuario; 5 a5udar a tu 0e-e a comprender al usuario. Debido a )ue el usuario no est tan 2ntimamente involucrado en la creacin de tu producto como lo est s tA; se comportan de manera un poco di-erente@ El usuario generalmente 9ace pronunciamientos cortos. El usuario tiene su propio traba0oJ pensar n principalmente en pe)ue!as me0oras de tu producto; no en grandes me0oras. El usuario no puede tener una visin )ue represente a todo el cuerpo completo de los usuarios de tu producto.

Es tu deber darles lo )ue realmente )uieren 5 no lo )ue ellos dicen )ue )uieren. &in embargo; es me0or propon+rselo a ellos 5 lograr )ue concuerden en )ue tu propuesta es lo )ue realmente )uieren antes de )ue comiences; pero puede )ue ellos no tengan la visin para 9acer esto. ,u con-ian#a en tus propias ideas sobre esto deber2a variar. Debes cuidarte tanto de la arrogancia como de la -alsa modestia en t+rminos de saber lo )ue realmente )uiere el cliente. $os programadores est n entrenados para dise!ar 5 crear. $os investigadores de mercado est n entrenados para determinar lo )ue la gente )uiere. Esos dos tipos de personas; o dos modos de pensar en la misma persona; traba0ando armoniosamente 0untos dan la me0or oportunidad para -ormular la visin correcta. Entre m s tiempo pases con los usuarios estar s en me0or capacidad para comprender lo )ue en realidad ser e(itoso. Deber2as probar tus ideas -rente a ellos tanto como puedas. Deber2as comer 5 beber con ellos si puedes. .u5 Ua6asaGi B1ulesD 9a en-ati#ado la importancia de o"servar lo )ue tus usuarios 9acen adem s de escuc9arlos.

Creo )ue los contratistas 5 consultores a menudo tienen tremendos problemas para lograr )ue sus clientes clari-i)uen en sus propias mentes lo )ue realmente )uieren. &i intentas ser un consultor; te sugiero elegir a tus clientes basado en su claridad mental tanto como por sus billeteras. Cmo $btener una Promocin Para ser promovido a un rol; primero interpreta ese rol. Para ser promovido a un t2tulo; determina lo )ue se espera de ese t2tulo 5 9a# eso. Para obtener un aumento de sueldo; negocia armado de in-ormacin. &i sientes como )ue est s pasado para una promocin; 9abla con tu 0e-e acerca de ello. PregAntale e(pl2citamente )u+ necesitas 9acer para ser promovido; e intenta 9acerlo. Esto suena triste; pero mu5 a menudo tu percepcin de lo )ue necesitas 9acer di-erir considerablemente de la de tu 0e-e. Esto tambi+n prender a tu 0e-e a ti de alguna manera. $a ma5or2a de los programadores probablemente tienen de alguna -orma un e(agerado sentido de sus capacidades relativas IIIdespu+s de todo; Ono podemos estar todos en el top 1<QP &in embargo; 9e visto algunas personas )ue -ueron seriamente inapreciadas. Uno no puede esperar )ue la evaluacin de todos coincida per-ectamente con la realidad todas las veces; pero pienso )ue las personas son en general moderadamente 0ustas; con una advertencia@ no puedes ser apreciado sin visibilidad en tu traba0o. A veces; 9acer to 9appenstance o por 9 bitos personales; alguien no ser notado muc9o. ,raba0ar muc9o en casa o estando geogr -icamente separado de tu e)uipo 5 de tu 0e-e 9ace esto especialmente di-2cil. (irviendo a Tu E+uipo Cmo Desarrollar Talento 4ietsc9#e e(ager cuando di0o B&trongerD@ $o )ue no me destru5e; me 9ace m s -uerte. ,u m s grande responsabilidad es 9acia tu e)uipo. Deber2as conocer bien a cada uno de ellos. Deber2as es-or#ar a tu e)uipo; pero no sobrecargarlos. Usualmente deber2as 9ablar con ellos sobre la -orma en )ue est n siendo es-or#ados. &i ellos 9an comprado la idea; estar n bien motivados. En cada pro5ecto; o en cada otro pro5ecto; trata de es-or#arlos tanto de una -orma )ue ellos sugieran como de una )ue pienses )ue ser buena para ellos. Es-u+r#alos no d ndoles m s traba0o; sino d ndoles una nueva 9abilidad o me0or aAn un nuevo rol )ue 0ugar dentro del e)uipo. Deber2as permitir )ue la gente :inclu5+ndote a ti mismo= -alle ocasionalmente 5 deber2as planear alguna -alla en tu calendario. &i no 9a5 ninguna -alla; no puede 9aber sentido de la aventura. &i no 9a5 -allas ocasionales; no est s intent ndolo lo su-iciente. Cuando alguien -alla; deber2as ser tan gentil como puedas con ellos aun)ue cuida de no tratarlos como si 9ubieses tenido +(ito.

Intenta conseguir )ue cada miembro del e)uipo compre la idea 5 est+ bien motivado. PregAntale a cada uno de ellos e(pl2citamente lo )ue necesitan para estar bien motivados si no lo est n. Puede )ue tengas )ue de0arlos insatis-ec9os; pero deber2as saber )u+ desean todos. 4o puedes rendirte con alguien )ue no est llevando intencionalmente su parte de la carga debido a una ba0a moral o insatis-accin 5 slo de0arlos )ue sean negligentes o est+n inactivos o -lo0os. Debes intentar tenerlos a todos bien motivados 5 productivos. 'ientras tengas la paciencia; mant+n esto. Cuando tu paciencia se agote; desp2delos. 4o puedes permitir )ue alguien )ue est intencionalmente traba0ando por deba0o de su nivel permane#ca en el e)uipo; puesto )ue no es 0usto para el e)uipo. Ha# claro a los miembros -uertes de tu e)uipo )ue piensas )ue ellos son -uertes dici+ndolo en pAblico. $as alaban#as deber2an ser pAblicas 5 las cr2ticas en privado. $os miembros -uertes del e)uipo tendr n naturalmente tareas m s di-2ciles )ue los miembros d+biles del e)uipo. Esto es per-ectamente natural 5 nadie estar molesto por ello mientras todos traba0en duro. Es un 9ec9o real )ue no se re-le0a en los salarios )ue un buen programador es m s productivo )ue 1< malos programadores. Esto crea una e(tra!a situacin. A menudo ser cierto )ue podr2as moverte m s r pido si tus programadores d+biles se apartaran del camino. &i 9icieras eso 9ar2as de 9ec9o m s progreso a corto pla#o. &in embargo; tu tribu perder2a algunos bene-icios importantes; por e0emplo el entrenamiento de los miembros d+biles; la diseminacin del conocimiento tribal; 5 la capacidad para recuperarte de la p+rdida de miembros -uertes. El -uerte debe ser gentil en este aspecto 5 considerar el punto desde todos los ngulos. A menudo puedes dar a los miembros m s -uertes del e)uipo tareas desa-iantes; pero cuidadosamente delineadas. Cmo Ele#ir (obre ,u- Traba1ar ,A balanceas tus necesidades personales -rente a las necesidades del e)uipo al escoger sobre cu l aspecto de un pro5ecto traba0ar. Deber2as 9acerlo en lo )ue eres me0or; pero trata de encontrar una -orma de es-or#arte a ti mismo no por tomar m s traba0o sino mediante el e0ercicio de una nueva 9abilidad. $as 9abilidades de lidera#go 5 comunicacin son m s importantes )ue las 9abilidades t+cnicas. &i eres mu5 -uerte; toma las tareas m s di-2ciles o riesgosas; 5 9a#las tan pronto como sea posible en el pro5ecto para decrementar el riesgo. Cmo $btener lo )!*imo de Tus Compa"eros de E+uipo Para obtener lo me0or de tus compa!eros de e)uipo; desarrolla un buen esp2ritu de e)uipo 5 trata de mantener a cada individuo tanto personalmente desa-iado como personalmente comprometido. Para desarrollar esp2ritu de e)uipo; el dar a granel cosas como las ropas con logotipos 5 las -iestas son buenas; pero no tan buenas como el respeto personal. &i todos respetamos a todos los dem s; nadie )uerr de0ar a nadie ba0o de nimo. El esp2ritu de e)uipo se crea cuando la gente 9ace sacri-icios por el e)uipo 5 piensa en t+rminos

del bienestar del e)uipo antes del propio bienestar personal. Como un l2der; no puedes pedir m s de lo )ue tA mismo puedes dar al respecto. Una de las claves para el lidera#go de e)uipo es -acilitar el consenso de manera tal )ue todos 9an comprado la idea. Esto ocasionalmente signi-ica permitir a tus compa!eros de e)uipo estar e)uivocados. " sea; si ello no da!a demasiado al pro5ecto; debes permitir a parte de tu e)uipo 9acer cosas a su propio modo; basado en el consenso; incluso si crees con gran con-ian#a )ue es e)uivocado 9acerlo. Cuando esto suceda; no est+s en desacuerdo; simplemente disiente abiertamente 5 acepta el consenso. 4o suenes como si estuvieras 9erido; o como )ue est s siendo -or#ado a ello; simplemente establece )ue disientes pero )ue piensas )ue el consenso del e)uipo es m s importante. Esto 9ar )ue a menudo se ec9en atr s. 4o insistas en )ue sigan con su plan inicial si se ec9an atr s. &i 9a5 un individuo )ue no consienta despu+s de )ue 9as discutido los puntos desde todos los ngulos apropiados; simplemente a-irma )ue tienes )ue tomar una decisin 5 cu l es tu decisin. &i 9a5 una manera de 0u#gar si tu decisin estar e)uivocada o si luego demostrar estar e)uivocada; cambia tan r pidamente como puedas 5 reconoce a las personas )ue estuvieron en lo correcto. Pregunta a tu e)uipo; tanto como grupo como de -orma individual; )u+ piensan )ue crear2a un esp2ritu de e)uipo 5 en )u+ consiste un e)uipo e-ectivo. Elogia -recuentemente en lugar de 9acerlo pro-usamente. Especialmente elogia a esos )ue disienten contigo cuando se lo merecen. El elogio en pAblico 5 la cr2tica en privadoJ con una e(cepcin@ a veces la e(altacin o la correccin de una -alla no puede 9acerse sin dirigir la atencin a la embara#osa -alla original; as2 )ue la e(altacin deber2a ser elogiada en privado. Cmo Dividir Problemas Es divertido tomar un pro5ecto de so-t6are 5 dividirlo en tareas )ue ser n llevadas a cabo por individuos. Esto deber2a 9acerse en etapas tempranas. A los administradores a veces les gusta pensar )ue un estimado puede 9acerse sin consideracin 9acia los individuos )ue reali#ar n el traba0o. Esto es imposible puesto )ue la productividad de los individuos var2a mu5 ampliamente. El )ue tiene el conocimiento sobre un componente tambi+n cambia constantemente 5 puede tener un e-ecto de un orden de magnitud sobre el desempe!o. Al igual )ue un compositor considera el timbre del instrumento )ue tocar una nota musical o el coac9 de un e)uipo atl+tico considera la -ortale#a de cada 0ugador; el l2der de e)uipo e(perimentado usualmente no ser capa# de separar la divisin del pro5ecto en tareas de los miembros del e)uipo a las cuales ser n asignadas. Esta es parte de la ra#n por la )ue un e)uipo de alta e0ecucin no deber2a ser dividido. Ha5 un cierto peligro en ello dado )ue la gente se aburrir a medida )ue constru5en sus -ortale#as 5 nunca me0oran sus debilidades o aprenden otras nuevas. &in embargo; la especiali#acin es una mu5 Atil 9erramienta de productividad cuando no es sobreutili#ada. Cmo )ane1ar las Tareas Aburridas

A veces no es posible evitar las tareas aburridas )ue son cr2ticas para el +(ito de la compa!2a o el pro5ecto. Esas tareas pueden en realidad da!ar la moral de )uienes tienen )ue 9acerlas. $a me0or t+cnica para lidiar con esto es invocar o promover la virtud de la Pere#a del programador $arr5 [all. Intenta 9allar alguna -orma de 9acer )ue la computadora 9aga la tarea por ti o a5uda a tus compa!eros de e)uipo a 9acer esto. ,raba0ar una semana en un programa para 9acer una tarea )ue tomar una semana 9acerlo a mano tiene la gran venta0a de ser m s educacional 5 a veces m s repetible. &i todo lo dem s -alla; pide disculpas a )uienes tienen )ue 9acer la tarea aburrida; pero ba0o ninguna circunstancia les permitas 9acerla solos. Como m2nimo asigna un e)uipo de dos para 9acer el traba0o 5 promueve el traba0o en e)uipo saludable para lograr tener la tarea 9ec9a. Cmo Conse#uir Apo5o para un Pro5ecto Para conseguir apo5o para un pro5ecto; crea 5 comunica una visin )ue demuestre el valor real a la organi#acin como un todo. Intenta de0ar )ue otros compartan la creacin de tu visin. Esto les da una ra#n para apo5arte 5 te da el bene-icio de sus ideas. Individualmente recluta personal de apo5o clave para tu pro5ecto. &iempre )ue sea posible; muestra; no cuentes. &i es posible; constru5e un prototipo o una ma)ueta para demostrar tus ideas. Un prototipo es siempre poderoso pero en so-t6are es mu5 superior a cual)uier descripcin escrita. Cmo Hacer Crecer un (istema $a semilla de un rbol contiene la idea del adulto pero no comunica completamente la -orma 5 la potencia del adulto. El embrin crece. &e vuelve m s grande. &e parece m s al adulto 5 tiene la ma5or2a de las caracter2sticas. Eventualmente produce -rutos. ' s tarde; muere 5 su cuerpo alimenta a otros organismos. ,enemos la lu0uria de tratar igual al so-t6are. Un puente no es as2J nunca 9a5 un beb+ puente; sino meramente un puente no -inali#ado. $os puentes son muc9o m s simples )ue el so-t6are. Es bueno pensar en el so-t6are como algo en crecimiento; debido a )ue nos permite 9acer un progreso Atil antes de )ue tengamos una imagen mental per-ecta. Podemos obtener retroalimentacin de los usuarios 5 usar eso para corregir el crecimiento. Podar las 9o0as d+biles es saludable. El programador debe dise!ar un sistema -inali#ado )ue pueda ser entregado 5 usado. Pero el programador avan#ado debe 9acer m s. Debes dise!ar una ruta de crecimiento )ue conclu5a en el sistema -inali#ado. Es tu traba0o tomar el germen de una idea 5 construir una ruta )ue la convierta tan suavemente como sea posible en un arte-acto Atil. Para 9acer esto; debes visuali#ar el resultado -inal 5 comunicarlo de una -orma )ue el e)uipo de ingenieros pueda emocionarse. Pero tambi+n debes comunicarles una ruta )ue va5a de donde)uiera )ue est+n a9ora 9acia donde )uieren estar sin grandes saltos. El rbol debe permanecer vivo todo el tiempoJ no puede estar muerto en un punto 5 resucitar m s tarde.

Este acercamiento es capturado en un desarrollo en espiral. $os 9itos )ue nunca est n demasiado ale0ados son usados para marcar el progreso a lo largo del camino. En el ambiente ultracompetitivo de los negocios; es me0or si los 9itos pueden ser liberados 5 9acer dinero tan pronto como sea posible; incluso si est n demasiado le0os de un punto -inal bien dise!ado. Uno de los traba0os del programador es balancear el pago inmediato -rente al -uturo mediante la sabia eleccin de un camino de crecimiento e(presado en 9itos. El programador avan#ado tiene la triple responsabilidad de 9acer crecer el so-t6are; los e)uipos; 5 a las personas. Un lector; 1ob Ha-erniG; envi este comentario sobre esta seccin )ue no puedo menos )ue citarlo completo@ Pienso )ue suben-ati#as la importancia a)u2. 4o son slo sistemas; sino algoritmos; inter-aces de usuario; modelos de datos; 5 cosas as2. Es absolutamente vital a medida )ue traba0as en un gran sistema tener progreso medible 9acia metas intermedias. 4ada es tan malo como el 9orror especial de llegar al -inal 5 descubrir )ue toda la cosa simplemente no va a -uncionar :mira la reciente debacle del &istema ?oter 4e6s=. >o ir2a m s all 5 lo a-irmar2a como una le5 de la naturale#a@ ningAn sistema grande 5 comple0o puede ser implementado de la nada; puede solamente evolucionar de un sistema simple a uno comple0o en una serie de pasos intencionales. A lo cual uno puede solamente replicar /0iat l#x1 Cmo Comunicar ien

Para comunicarte bien; tienes )ue reconocer cu n di-2cil es. Es una 9abilidad en s2 misma. &e 9ace m s di-2cil por el 9ec9o de )ue las personas con )uien tienes )ue comunicarte son inper-ectas. Ellas no traba0an duro en comprenderte. Hablan 5 escriben pobremente. Est n a menudo sobretraba0adas o aburridas; 5; como m2nimo; algo en-ocadas en su propio traba0o m s )ue en los tpicos m s grandes )ue puedes estar comentando. Una de las venta0as de tomar clases 5 practicar la escritura; el 9ablar en pAblico; 5 escuc9ar es )ue si te vuelves bueno en ello puedes m s - cilmente ver donde 5acen los problemas 5 cmo corregirlos. El programador es un animal social cu5a sobrevivencia depende de la comunicacin con su e)uipo. El programador avan#ado es un animal social cu5a satis-accin depende de la comunicacin con gente -uera de su e)uipo. El programador trae orden al caos. Una -orma interesante de 9acer esto es iniciar una propuesta de algAn tipo -uera del e)uipo. Esto puede ser 9ec9o en un -ormato stra-man o en -ormato -hite(paper o slo verbalmente. Este lidera#go tiene la tremenda venta0a de -i0ar los t+rminos del debate. ,ambi+n te e(pone a cr2ticas; 5 peor; al rec9a#o 5 al descuido. El programador avan#ado debe estar preparado para aceptar esto; debido a )ue tiene un poder Anico 5 por lo tanto una responsabilidad Anica. $os emprendedores )ue no son programadores necesitan )ue los programadores aporten lidera#go de algunas maneras. $os programadores son la parte del puente entre las ideas 5 la realidad )ue descansa en la realidad. 4o 9e dominado bien la comunicacin; pero lo )ue esto5 intentando actualmente es un m+todo de cuatro pasos@ Despu+s de )ue tengo mis ideas en orden 5 esto5 completamente preparado; trato de 9ablar verbalmente; do5 a las personas un papel

en blanco :sobre papel real; al igual )ue electrnicamente=; les muestro un demo; 5 luego pacientemente repito este proceso. Pienso )ue muc9as veces no somos lo su-icientemente pacientes en este tipo de comunicacin di-2cil. 4o deber2as descora#onarte si tus ideas no son inmediatamente aceptadas. &i 9as invertido energ2a en su preparacin; nadie pensar pobremente de ti por ello. Cmo Decirle a la /ente Cosas +ue 4o Desean Escuc9ar A menudo tendr s )ue decirle a la gente cosas )ue los 9ar sentir incmodos. 1ecuerda )ue est s 9aciendo esto por una ra#n. AAn si no puede 9acerse nada por el problema; est s dici+ndoles tan pronto como es posible de tal manera )ue estar n bien in-ormados. $a me0or manera de decirle a alguien sobre un problema es o-recerles a la ve# una solucin. $a segunda me0or manera es apelar a ellos para )ue a5uden con el problema. &i e(iste el peligro de )ue no ser s cre2do; deber2as conseguir algAn soporte para tu a-irmacin. Una de las cosas m s comunes e implacenteras )ue tendr s )ue decir es; HEl calendario tendr )ue correrse.H El programador consciente odia decir eso; pero debe decirlo tan pronto como sea posible. 4o 9a5 nada peor )ue posponer la accin cuando se corre un 9ito; incluso si la Anica accin es in-ormar a todos. Al 9acer esto; es me0or 9acerlo como e)uipo; al menos en esp2ritu; si no puedes -2sicamente. Desear s la opinin de tu e)uipo tanto acerca de dnde est n como sobre )u+ puede 9acerse al respecto; 5 el e)uipo tendr )ue en-rentar las consecuencias contigo. Cmo &idiar con )itos Administrativos $a palabra mito algunas veces signi-ica -iccin. Pero tiene una connotacin m s pro-unda. ,ambi+n signi-ica una 9istoria de religiosa signi-icancia )ue e(plica el universo 5 la relacin de la 9umanidad con +l. $os administradores tienden a olvidar lo )ue ellos aprendieron como programadores 5 creen en ciertos mitos. &er2a tan rudo como e(itoso tratar de convencerlos de )ue esos mitos son -alsos como el tratar de desilusionar a una persona devotamente religiosa de sus creencias. Por esa ra#n; deber2as reconocer estas creencias como mitos@ ' s documentacin es siempre me0or. :Ellos la re)uieren; pero no )uieren )ue gastes tiempo en ella.= $os programadores pueden ser e)uiparados. :$os programadores var2an por un orden de magnitud.= $os recursos pueden ser agregados a un pro5ecto retrasado para acelerarlo. :El costo de la comunicacin con las nuevas personas es casi siempre m s penali#ador )ue Atil.= Es posible estimar la con-iabilidad del desarrollo del so-t6are. :4o es posible ni si)uiera tericamente.= $a productividad de los programadores puede ser medida en t+rminos de alguna m+trica simple; como las l2neas de cdigo. :&i la concisin es poder; las l2neas de cdigo son malas; no buenas.=

&i tienes oportunidad; puedes intentar e(plicar esas cosas; pero no te sientas mal si no tienes +(ito 5 no da!es tu reputacin con-rontando esos mitos beligerantemente. Cada

uno de esos mitos re-uer#a la idea del administrador de )ue tienen un control real sobre lo )ue est pasando. $a verdad es )ue los administradores lo -acilitan si son buenos; 5 lo impiden si son malos. Cmo &idiar con el Caos $r#ani%acional A menudo 9a5 breves periodos de gran caos organi#acional; tales como despidos; compras; IP"s; despidos; nuevas contrataciones; 5 cosas as2. &on trastornantes para todos; pero )ui# un poco menos para el programador cu5a autoestima personal est basada en la capacidad m s )ue en la posicin. El caos organi#acional es una gran oportunidad para )ue los programadores e0erciten su poder m gico. He guardado esto para el -inal por)ue es un pro-undo secreto tribal. &i no eres un programador; por -avor de0a de leer a9ora. $os ingenieros tienen el poder de crear 5 sostener. $os no ingenieros pueden ordenar a la gente a su alrededor pero; en una compa!2a t2pica de so-t6are; no pueden crear ni sostener nada sin los ingenieros; al igual )ue los ingenieros t2picamente no pueden vender un producto o administrar un negocio e-ectivamente. Este poder es a prueba de casi todos los problemas asociados con la mutilacin organi#acional temporal. Cuando lo tienes deber2as ignorar el caos completamente 5 continuar como si nada estuviera pasando. Puedes; por supuesto; ser despedido; pero si eso pasa probablemente puedes conseguir un nuevo traba0o debido al poder m gico. 'u5 comAnmente; alguna persona estresada )ue no tiene el poder m gico vendr a tu cub2culo 5 te dir algo estApido. &i est s realmente seguro de )ue es estApido; es me0or sonre2r 5 asentir 9asta )ue se va5a 5 luego continuar 9aciendo lo )ue sabes es lo me0or para la compa!2a. &i eres un l2der; dile a tu gente )ue 9aga lo mismo 5 diles )ue ignoren lo )ue los dem s les digan. Este curso de accin es lo me0or para ti en lo personal; 5 es lo me0or para tu compa!2a o pro5ecto. /losario Este es un glosario de t+rminos usados en este ensa5o. 4o tiene necesariamente un signi-icado estandari#ado para otras personas. Eric &. 1a5mond 9a compilado un glosario masivo e in-ormativo BHacGerDictD )ue m s )ue sorprendente puede ser placenteramente le2do de tapa a tapa una ve# )ue puedas apreciar una -raccin de +l. un:;un: Argot para unGno6nIunGno6n. $os problemas )ue en la actualidad no pueden ni si)uiera ser conceptuali#ados )ue robar n tiempo del pro5ecto 5 destro#ar n el calendario. 1e.e $a persona o entidad )ue te da tareas. En algunos casos este puede ser a la larga el pAblico. $a persona )ue establece tus tareas. En algunos casos; el usuario es el 0e-e.

printlinin# $a insercin de sentencias en un programa en una base estrictamente temporal )ue arro0e in-ormacin acerca de la e0ecucin del programa para el propsito de la depuracin. lo##in# $a pr ctica de escribir un programa de tal manera )ue pueda producir una bit cora de salida con-igurable describiendo su e0ecucin. divide 5 vencer!s Una t+cnica de dise!o topIdo6n 5; aAn m s importante; de depuracin )ue consiste en la subdivisin de un problema o un misterio en problemas o misterios progresivamente m s pe)ue!os. vapor6are Promesas de so-t6are ilusorias 5 a menudo decepcionantes )ue no est n todav2a a la venta 5; tan a menudo como no; nunca se materiali#ar n en algo slido. tribu $a gente con la )ue compartes tu lealtad 9acia una meta comAn. Un grupo de personas con la )ue compartes a-inidad cultural 5 lealtad. .rutas de cuel#ue ba1o .randes me0oras )ue cuestan poco. Emprendedor El iniciador de pro5ectos. basura "b0etos )ue no se necesitan m s )ue se mantienen en memoria. 'emoria asignada )ue 5a no tiene un signi-icado Atil. ne#ocio Un grupo de personas organi#adas para 9acer dinero. compa"a Un grupo de personas organi#adas para 9acer dinero. ce#uera de despla%amiento

El e-ecto de ser incapa# de encontrar la in-ormacin )ue necesitas debido a )ue est sepultada en muc92sima in-ormacin menos interesante. relo1 de pared El tiempo real como es medido por un relo0 de pared; opuesto al tiempo de CPU. cuello de botella $a m s importante limitacin en el desempe!o de un sistema. Una constriccin )ue limita el desempe!o. maestro Una pie#a Anica de in-ormacin desde la cual se derivan todas las copias cac9eadas )ue sirve como la de-inicin o-icial de esos datos. 9eap asi#nado 'emoria de la )ue puede decirse )ue est asignada en el 9eap cuando el mecanismo para liberarla es complicado. recolector de basura Un sistema para reciclar basura. .u#a de memoria $a indeseada coleccin de re-erencias a ob0etos )ue evita la recoleccin de basura :Oo un error en el recolector de basura o en el sistema de administracin de memoriaP= )ue causa )ue el programa incremente gradualmente sus demandas de memoria en el tiempo. Pro#ramacin E*trema Un estilo de programacin )ue en-ati#a la comunicacin con el cliente 5 las pruebas automati#adas. #olpear la pared *uedarse sin un recurso espec2-ico ocasionando )ue se degrade el desempe!o abruptamente en lugar de 9acerlo gradualmente. pro#ramacin especulativa Producir una -uncionalidad antes de )ue realmente se sepa si esa -uncionalidad ser Atil. ocultamiento de in.ormacin

Un principio de dise!o )ue busca mantener las cosas independientes 5 desacopladas mediante el uso de inter-aces )ue e(ponen tan poca in-ormacin como sea posible. pro#ramacin orientada a ob1etos Un estilo de programacin )ue en-ati#a la administracin del estado dentro de los ob0etos. len#ua1es de comunicacin Un lengua0e dise!ado primariamente para la estandari#acin m s )ue para la e0ecucin. ca1as 5 .lec9as Un estilo -lo0o e in-ormal de 9acer diagramas )ue consiste de ca0as 5 -lec9as dibu0adas entre esas ca0as para mostrar las relaciones. Esto contrasta con las metodolog2as -ormales de diagramacin; tales como la del U'$. lin#ua .ranca Un lengua0e tan popular como para el est ndar de -acto para su campo; tal como el -ranc+s lo -ue una ve# para la diplomacia internacional. comprar vs. construir Un ad0etivo )ue describe una eleccin entre gastar dinero al comprar so-t6are o escribirlo tA mismo. mero traba1o ,raba0o )ue re)uiere poca creatividad 5 vincula poco riesgo. El mero traba0o puede ser - cilmente estimado. notacin de pro#ramacin Un sinnimo para los lengua0es de programacin )ue en-ati#a la naturale#a matem tica del lengua0e de programacin 5 su relativa simplicidad comparada con los lengua0es naturales. stra6man Un documento destinado a ser el punto de inicio de una discusin t+cnica. Un stra6man puede conducir a un sticGman; a un tinman; a un 6oodman; a un ironman; etc. 69ite;paper

Un documento in-ormativo )ue a menudo es destinado para e(plicar o vender una idea o producto a una audiencia di-erente a la de los programadores de esos productos o ideas. Tabla de Contenido Bibliograp95%[ebsiteograp95 iblio#ra.a'<ebsiteo#ra.a oo:s B1ules<<D .u5 Ua6asaGi; 'ic9elle 'oreno; 5 .ar5 Ua6asaGi. 2<<<. HarperBusiness. R#les for Revol#tionaries2 The Capitalist 3anifesto for Creating $ 3ar'eting ,e- Prod#cts $ 4ervices. B1DevCED &teve 'cConnell. 1CCE. 'icroso-t Press. 1edmond; [as9. Rapid Development2Taming &ild 4oft-are 4ched#les. BCodeCC3D &teve 'cConnell. 1CC3. 'icroso-t Press. 1edmond; [as9. Code Complete. BFPCCD Uent BecG. 1CCC. <2<1E1E81E. AddisonI[esle5. Extreme Programming Explained2 Em"race Change. BPlanFP<<D Uent BecG 5 'artin /o6ler. 2<<<. <2<1^1<C1C. AddisonI[esle5. Planning Extreme Programming. BPragCCD Andre6 Hunt; David ,9omas; 5 [ard Cunning9am. 1CCC. <2<1E1E22F. AddisonI[esle5. The Pragmatic Programador2 0rom 5o#rne$man to 3aster. B&trongerD /riedric9 4iet#sc9e. 1LLC. T-ilight of the 6dols7 83axims $ 9rro-s87 seccin :.. <eb (ites BP.&iteD Paul .ra9am. 2<<2. 9rticles on his -e"site2 http2;;---.pa#lgraham.com;articles.html. 9ll of them7 "#t especialmente 8<eating the 9verages8. BHacGerD Eric &. 1a5mond. 2<<3. Cmo to <ecome a =ac'er. 9ttp@%%666.catb.org%_esr%-a)s%9acGerICmoto.9tml. BHacGDictD Eric &. 1a5mond. 2<<3. The ,e- =ac'er Dictionar$. 9ttp@%%catb.org%esr%0argon%0argon.9tml. BE(pC&D Edsger [. Di0Gstra. 1CLE. =o- Experimental is Comp#ting 4cience>.9ttp@%%666.cs.ute(as.edu%usuarios%E[D%e6d<C((%E[DCLLa.PD/.

BUni-eD Edsger [. Di0Gstra. 1CL8. ?n a C#lt#ral @ap.9ttp@%%666.cs.ute(as.edu%usuarios%E[D%e6d<C((%E[DC13.PD/ . Appendi* . Histor5 =As $. 0ebruar5> 2??3@

(olicitud de 2etroalimentacin o E*tensin Por -avor env2enme cuales)uier comentarios )ue puedas tener sobre este ensa5o. >o considero todas las sugerencias; muc9as de las cuales 5a 9an me0orado este ensa5o. He puesto este ensa5o ba0o la $icencia de Documentacin $ibre de la .4U. Esta licencia no est espec2-icamente dise!ada para ensa5os. $os ensa5os are usualmente intended para ser argumentos co9erentes 5 convincentes )ue son escritos desde un Anico punto de vista en una Anica vo#. Espero )ue este ensa5o sea una lectura corta 5 placentera. Espero tambi+n )ue sea instructivo. Aun)ue no es un libro de te(to; est dividido en muc9as secciones pe)ue!as a las cuales puedes ser libremente a!adidas nuevas secciones. &i est s inclinado a ello; 5ou are encouraged a e(pandir este ensa5o as 5ou see -it; su0eto a las provisiones de la $icencia. Puede ser arrogancia imaginar )ue vale la pena e(tender este documentoJ pero espero eternas primaveras. Estar2a go#oso si -uera e(tendido de las siguientes -ormas@ $a adicin de una lista de lecturas comprensivas a cada seccin; $a adicin de m s 5 me0ores secciones; $a traduccin a otros lengua0es; aAn si es solamente en una base de subsecctin por subseccin; 5%o Cr2ticas o comentarios incluidos dentro del te(to. $a capacidad de convertirlo a di-erentes -ormatos; tales como -ormatos palm 5 un me0or -ormato H,'$.

&i me in-ormas de tu traba0o; $o considerar+ 5 puedo incluirlo en versiones subsecuentes )ue produ#ca; su0eto a las provisiones de la $icencia. Puedes por supuesto producir tus propias versiones de este documento sin mi conocimiento; como se e(plica en la $icencia. .racias. 1obert $. 1ead Aersin $ri#inal $a versin original de este documento -ue comen#ada por 1obert $. 1ead en el a!o 2<<< 5 publicada primero electrnicamente en &ami#dat Press :9ttp@%%&ami#dat.mines.edu= en el 2<<2. Est dedicada a los programadores de Hire.com. Despu+s de )ue este art2culo -ue mencionado en &las9dot en el 2<<3; cerca de ^S personas me enviaron emails con sugerencias 5 erratas. $os aprecio a todos. Hubo muc9a duplicacin; pero las siguientes personas 9icieron sugerencias ma5ores o -ueron

las primeras en encontrar un error )ue 5a correg2@ 'organ 'c.uire; David 'ason; ,om 'oertel; 4in0a Programador :18S2S2= at &las9dot; Ben ?iercG; 1ob Ha-erniG; 'arG Cmoe; Pieter Pareit; Brian .ra5son; `ed A. &9a6; &teve Ben#; 'aGsim Io-e; Andre6 [u; David 7esc9Ge; 5 ,om Corcoran. /inalmente me gustar2a agradecer a C9ristina ?aller5; cu5a edicin 5 lectura pro-esional me0or grandemente el segundo borrador; 5 a [a5ne Allen; )uien me alent a iniciar esto. io#ra.a del Autor $ri#inal 1obert $. 1ead vive en Austin; ,e(as; con su esposa 5 sus dos 9i0os. Es actualmente un Ingeniero Principal en Hire.com; donde 9a traba0ado por cuatro a!os. Previo a eso -und 81 ,ec9nolog5; la cual 9i#o una 9erramienta de control de calidad para el an lisis de im genes basadas en esc ner para la industria periodiod2stica :o del papelN=. 1ob recibi un P9D de la Universidad de ,e(as en Austin en 1CCS en Ciencias de la Computacin relacionado a la teor2a de bases de datos. En 1CL^ recibi un BA en Ciencias de la Computacin de la Universidad 1ice. Ha sido un programador pagado desde la edad de 1E a!os. Ap-ndice C. &icencia de Documentacin &ibre de la /4U Versin 1.2, Noviembre del 2002 Tabla de Contenido P1EA'BU$" AP$ICABI$IDAD > DE/I4ICI"4E& C"PIA1 A$ PIE DE $A $E,1A C"PIA1 E4 CA4,IDAD '"DI/ICACI"4E& C"'BI4A4D" D"CU'E4,"& C"$ECCI"4E& DE D"CU'E4,"& A..1E.A,I"4 C"4 ,1ABA7"& I4DEPE4DIE4,E& ,1ADUCCI"4 ,E1'I4ACI"4 /U,U1A& 1E?I&I"4E& DE E&,A $ICE4CIA ADE4DU'@ cmo usar esta $icencia para tus documentos Cop5rig9t :C= 2<<<;2<<1;2<<2 /undacin del &o-t6are $ibre; Inc. SC ,emple Place; &uite 33<; Boston; 'A <2111I13<^ U&A &e permite a todos copiar 5 distribuir copias al pie de la letra de este documento de licencia; pero no est permitido cambiarla. P2EA) U&$ El propsito de esta $icencia es 9acer un manual; libro de te(to; u otro documento -uncional 5 Atil YlibreY en el sentido de libertad@ para asegurar a todos la e-ectiva libertad de copiarlo 5 redistribuirlo; con o sin modi-icaciones; 5a sea comercial o no comercialmente. En segundo lugar; esta $icencia preserva para el autor como para el editor una -orma de obtener cr+dito por su traba0o; aun)ue no sea considerado responsable por las modi-icaciones 9ec9a por otros.

Esta $icencia es un tipo de Ycop5le-tY; lo cual signi-ica )ue los traba0os derivados del documento deben ser ellos mismos ser libres en el mismo sentido. Complementa la $icencia de Documentacin $ibre de la .4U; la cual es una licencia cop5le-t dise!ada para so-t6are libre. Hemos dise!ado esta $icencia a -in de de usarla para manuales de so-t6are libre; debido a )ue el so-t6are libre necesita documentacin libre@ un programa libre deber2a venir con manuales )ue provean las mismas libertades )ue provee el so-t6are. Pero esta $icencia no est limitada a manuales de so-t6areJ puede ser usada para cual)uier traba0o te(tual; sin importar el tema de la materia o si es publis9ed como un libro impreso. 1ecomendamosesta $icencia principalmente para traba0os cu5o propsito es instruccin o re-erencia. AP&ICA I&IDAD B DE0I4ICI$4E( Esta $icencia se aplica a cual)uier manual u otro traba0o; en cual)uier medio; )ue contenga una nota colocada por el poseedor del cop5rig9t )ue diga )ue puede ser distribuida ba0o los t+rminos de esta $icencia. ,al nota concede una licencia mundial 5 libre de regal2as; ilimitada en duracin; para usar ese traba0o ba0o las condiciones establecidas a)u2. El YDocumentoY; en lo sucesivo; se re-iere a cual)uier manual o traba0o de ese tipo. Cual)uier miembro del pAblic es un licenciado; 5 es addressed como YtuY. Aceptas la licencia si copias; modi-icas o distribu5es el traba0o de una -orma )ue re)uiera permiso ba0o la le5 del cop5rig9t. A YUna ?ersin 'odi-icadaY del Documento signi-ica cual)uier traba0o )ue contenga el Documento o una porcin de +l; 5a sea copiado -ielmente; o con modi-icaciones 5%o traducido a otro lengua0e. A Y$a &eccin &ecundariaY es un ap +ndice nombrado o una seccin -rontImatter del Documento )ue trata e(clusivamente con la relacin de los editores o autores del Documento al tema general del Documento :o a los temas relacionados= 5 no contiene nada )ue pudiera caer directamente dentro de ese tema general. :As2; si el Documento es una parte de un libro de te(to de matem ticas; una &eccin &ecundaria puede no e(plicar ninguna matem tica.= $a relacin podr2a ser una cuestin de cone(in 9istrica con el tema o con temas relacionados; o de posiciones legales; comerciales; -ilos-icas; +ticas o pol2ticas relacionadas a ellos. $as Y&ecciones InvariantesY son ciertas &ecciones &ecundarias cu5os t2tulos est n designados; como para ser &ecciones Invariantes; en la nota )ue dice )ue el Documento es liberado ba0o esta $icencia. &i una seccin no llena la de-inicin anterior de &ecundaria entonces no est permitido )ue sea designada como Invariante. El Documento puede contener cero &ecciones Invariantes. &i el Documento no identi-ica ninguna &eccin Invariante entonces no 9a5 ninguna. El Y,e(to de la PortadaY son ciertos pasa0es cortos de te(to )ue son listados; como los ,e(tos de la Cubierta /rontal o los ,e(tos de la Cubierta Posterior; en la nota )ue dice )ue el Documento es liberado ba0o esta $icencia. Un ,e(to de Cubierta /rontal puede ser al menos de S palabras; 5 un ,e(to de Cubierta Posterior puede ser de al menos 2S palabras. Una copia Y,ransparenteY del Documento signi-ica una copia legible por una m )uina; representado en un -ormat cu5a especi-icacin est disponible al pAblico general; )ue

es suitable para revisar el documento straig9t-or6ardl5 con editores de te(to gen+ricos o :en el caso de im genes compuestas de pi(eles= programas de pintura gen+ricos o :en el caso de dibu0os= algunos editores de dibu0o ampliamente disponibles; 5 )ue es suitable como entrada para -ormateadores de te(to o para traduccin autom tica a una variedad de -ormatos suitable como entrada para -ormateadores de te(to. Una copia 9ec9a de otro -ormato de arc9ivo ,ransparente cu5a marGup; o ausencia de marGup; 9a sido arreglado para t96art o discourage las modi-icaciones subsecuentes por los lectores no es ,ransparente. Un -ormato de imagen no es ,ransparente si es usado para cual)uier cantidad sustancial de te(to. Una copia )ue no es Y,ransparenteY es llamada Y"pacaY. E0emplos de -ormatos suitable para copias ,ransparentes inclu5en A&CII plano sin marGup; -ormato de entrada ,e(in-o; -ormato de entrada $a,eF; &.'$ o F'$ )ue usen una D,D pAblicamente disponible; 5 los )ue con-ormen simples est ndares H,'$; Post&cript o PD/ dise!ados para modi-icacin 9umana. E0emplos de -ormatos de imagen transparente inclu5en P4.; FC/ 5 7P.. $os -ormatos opacos inclu5en -ormatos proprietarios )ue puedan ser le2dos 5 editados solamente por procesadores de palabras proprietarios; &.'$ o F'$ para los )ue las D,D 5%o las 9erramientas de proesamiento no est n generalmente dispnibles; 5 el H,'$; Post&cript o PD/ generado a m )uina producido por algunos procesadores de palabras para propsitos de salida solamente. $a YP gina de ,2tuloY signi-ica; para un libro impreso; la p gina de t2tulo misma; m s las p ginas siguientes )ue sean necesarias para mantener; legiblemente; el material )ue esta $icencia re)uiere para aparecer en la p gina de t2tulo. Para traba0os en -ormatos )ue no tengan ningAn p gina de t2tulo como tal; YP gina de ,2tuloY signi-ica el te(to cercano a la m s prominente aparici de del t2tulo del traba0o; precedeciendo el comien#o del cuerpo del te(to. Una seccin Y,itulada F>`Y signi-ica una subunidad denominada del Documento cu5o t2tulo es precisamente F>` o contiene F>` en par+ntesis siguiendo al te(to )ue traduce F>` en otro lengua0e. :A)u2 F>` stands -or un nombre de seccin espec2-ica mencionada en lo sucesivo; tal como Y1econocimientosY; YDedicatoriasY; Y1espaldosY; o YHistoriaY.= Para YPreservar el ,2tuloY de tal seccin cuando modi-i)ues el Documento signi-ica )ue se mantiene una seccin Y,itulada F>`Y de acuerdo a esta de-inicin. El Documento puede incluir Abstenciones de .arant2a pr(imas a la nota )ue establece )ue esta $icencia se aplica al Documento. Esas Abstenciones de .arant2a son consideradas para ser incluidas por re-erencia en la $icencia; pero solamente as regards de rec9a#o de garant2as@ cual)uier otra implicacin )ue esas Abstenciones de .arant2a puedan tener es evitada 5 no tiene e-ecto en el signi-icado de esta $icencia. C$PIA2 A& PIE DE &A &ET2A Puedes copiar 5 distribuir el Documento en cual)uier medio; comercial o no comercialmente; siempre )ue esta $icencia; las notas de cop5rig9t; 5 la nota de la licencia )ue dicen )ue esta $icencia se aplica al Documento sean reproducidas en todas las copias; 5 )ue no a!ades ninguna otra condicin 69atsoever a esas de la $icencia. Puedes no usar medidas t+cnicas para obstruir o controlar la lectura o copias subsiguientes de las copias )ue 9agas o distribu5as. &in embargo; puedes aceptar compensacin a cambio de las copias. &i distribu5es una gran cantidad de copias debes tambi+n seguir las condiciones de la seccin 3.

Puedes tambi+n lend copias; ba0o las mismas condiciones establecidas arriba; 5 puedes pAblicamente e(9ibir copias. C$PIA2 E4 CA4TIDAD &i publicas copias impresas :o copias en medios )ue comAnmente tienen cubiertas impresas= del Documento; en cantidades ma5ores a 1<<; 5 la nota de licencia del Documento re)uiere ,e(tos de Cubierta; debes enclose las copias en cubiertas )ue porten; clara 5 legiblemente; todos esos ,e(tos de Cubierta@ ,e(tos de Cubierta /rontal en la cubierta -rontal; 5 ,e(tos de la Cubierta Posterior en la cubierta posterior. Ambas cubiertas deben tambi+n identi-icarte clara 5 legiblemente como el editor de esas copias. $a cubierta -rontal debe presentar el te(to completo con todas las palabras del t2tulo igualmente prominente 5 visible. Puedes a!adir adicionalmente otro material en las cubiertas. Copiar con cambios limitados a las cubiertas; mientras preserven el t2tulo del Documento 5 satis-aga esas condiciones; puede ser tratado como copias al pie de la letra en otros respectos. &i los te(tos re)ueridos para cual)uier cubierta son mu5 voluminosos para caber legiblemente; deber2as poner las primeras listadas :tantas como )uepan ra#onablemente= sobre la cubierta actual; 5 continuar el resto en p ginas ad5acentes. &i publicas o distribu5es copias "pacas del Documento en cantidades ma5ores de 1<<; debes incluir una copia ,ransparente legible por m )uinas 0unto con cada copia "paca; o state in o con cada copia "paca en una ubicacin de red de computadora desde la cual el pAblico )ue usa la red general tenga acceso a descargarla usando protocolos de red pAblicos est ndares una copia completa ,ransparente del Documento; libre de material agregado. &i usas la Altima opcin; debes tomar pasos ra#onablemente prudentes cuando comiences la distribucin de copias "pacas en cantidad; para asegurar )ue esa copia ,ransparente permanecer as2 accesible en la ubicacin establecida 9asta al menos un a!o despu+s de la Altima ve# )ue distribu5as una copia "paca :directamente o a trav+s de tus agentes o retailers= de esa edicin al pAblico. It is re)uested; pero no re)uerido; )ue contactes a los autores del Documento con su-iciente antelacin antes de redistribuir cual)uier nAmero grande de copias; para darles la oportunidad de proporcionarte una versin actuali#ada del Documento. )$DI0ICACI$4E( Puedes copiar 5 distribuir una ?ersin 'odi-icada del Documento ba0o las condiciones de las secciones 2 5 3 anteriores; provided )ue tA liberas las ?ersin 'odi-icada precisamente ba0o esta $icencia; con la ?ersin 'odi-icada -illing el rol del Document; licenciando as2 la distribucin 5 modi-icacin de la ?ersin 'odi-icada a )uien posea una copia de ella. Adicionalmente; debes 9acer estas cosas en la ?ersin 'odi-icada@ A. Usar en la P gina de ,2tulo :5 en las cubiertas; si las tiene= un t2tulo distinto al del Documento; 5 a los de las versiones previas :los cuales deber2an; si 9ubiese alguna; estar listado en la seccin de Historia del Documento=. Puedes usar el mismo t2tulo de una versin previa si el editor original de esa versin da el permiso. B. $istar en la P gina del ,2tulo; como autores; una o m s personas o entidades responsables pr la autor2a de las modi-icaciones en la ?ersin 'odi-icada; 0unto con al menos cinco de los principales autores del Documento :todos sus

C. D. E.

F.
.. H. I.

7.

U. $. '. 4. ".

autores; si tiene menos de cinco=; a menos )ue ellos te libera de este re)uirimiento. Coloca en la p gina de ,2tulo el nombre del editor de la ?ersin 'odi-icada; al igual )ue el del editor. Preserva todos las notas de cop5rig9t del Documento. A!ade una nota de cop5rig9t apropriada para tus modi-icacions ad5acente a las otras notas de cop5rig9t. Inclu5e; inmediatamente despu +s de las notas de cop5rig9t; una nota de licencia dando al pAblico permiso para usar la ?ersin 'odi-icada ba0o los t+rminos de esta $icencia; en la -orma mostrada en el Addendum siguiente. Preserva en esa nota de licencia la lista completa de las &ecciones Invariantes 5 los ,e(tos de las Cubiertas dados en la nota de licencia del Documento. Inclu5e una copia inalterada de este $icencia. Preserva la seccin ,itulada YHistoriaY; Preserva su ,2tulo; 5 agrega a ella un 2tem estableciendo al menos el t2tulo; a!o; nuevos autores; 5 el editor de la ?ersin 'odi-icada como en la P gina de ,2tulo. &i no 9a5 una seccin ,itulada YHistoriaY en el Documento; crea una estableciendo el t2tilo; a!o; autores; 5 el editor del Documento igual )ue en su P gina de ,2tulo; luego a!ade un 2tem describiendo la ?ersin 'odi-icada como se estableci en la oracin previa. Preserva la ubicacin de red; si e(iste alguna; dada en el Documento para acceso pAblico a una copia ,ransparente del Documento; 5 liGe6ise las ubicaciones de red dadas en el Documento de versiones previas en las )ue estaba basada. Esas pueden ser colocadas en la seccin YHistor5Y. Puedes omitir una ubicacin de red para un traba0o )ue -ue publicado al menos cuatro a!os antes )ue el Documento mismo; o si el editor original de la versin a la )ue se re-iere da permiso. Para cual)uier seccin ,itulada Y1econocimientosY o YDedicatoriasY; Preserva el ,2tulo de la seccin; 5 preserva en la seccin toda la sustancia 5 tono de cada uno de los reconocimientos de contribu5entes 5%o dedicatorias dadas a92. Preserva todas las &ecciones Invariantes del Documento; inalteradas en su te(to 5 en sus t2tulos. $os nAmeros de &eccin o el e)uivalente no son considerados parte de los t2tulos de la seccin. Elimina cual)uier seccin ,itulada YEndorsementsY. ,ales secciones pueden no ser incluidas en la ?ersin 'odi-icada. 4o retitules ninguna seccin e(istente ,itulada YEndorsementsY o para con-lictuar en t2tulo con alguna &eccin Invariante. Preserva cuales)uiera Abstenciones de .arant2a.

&i la ?ersin 'odi-icada inclu5e nuevas secciones -rontImatter o ap+ndices )ue cali-i)uen como &ecciones &ecundarias 5 no contengan ningAn material copiado del Documento; puedes a tu criterio designar alguna o todas esas secciones como invariantes. Para 9acer esto; a!ade sus t2tulos a la lista de &ecciones Invariantes en la nota de licencia de la ?ersin 'odi-icada. Esos t2tulos deben ser distintos de los de cual)uier otra seccin. Puedes a!adir una seccin ,itulada YEndorsementsY; procurando )ue no contenga otra cosa e(cepto endorsements de tu ?ersin 'odi-icada b5 varias partesIIpor e0emplo; statements de revisiones personales o )ue el te(to 9a sido aprovado por una organi#acin como la de-inicin aut9oritative de un est ndar. Puedes a!adir un pasa0e de 9asta cinco palabras como un ,e(to de Cubierta /rontal; 5 un pasa0e de 9asta 2S palabras como un ,e(to de Cubierta Posterior; al -inal de la lista de ,e(tos de Cubiertas,en la ?ersin 'odi-icada. &olamente un pasa0e de ,e(to de

Cubierta /rontal 5 uno de ,e(to de Cubierta Posterior pueden ser a!adidos por :o por medio de arreglos= cual)uier entidad Anica. &i el Documento 5a inclu5e un te(to de cubierta para la misma cubierta; previamente a!adida pr ti o por medio de un arreglo 9ec9o por la misma entidad est s actuando on be9al- o-; puedes no agregar otraJ pero puedes reempla#ar la antigua; con el permiso e(pl2cito del editor previo )ue la 9a agregado. El :los= autor:es= 5 el :los= editor:es= del Documento no conceden mediante esta $icencia permiso para usar sus nombres para publicidad o to assert o implicar endorsement o- cual)uier ?ersin 'odi-icada. C$) I4A4D$ D$CU)E4T$( Puedes combinar el Documento con otros documentos liberados ba0o esta $icencia; ba0o los t+rminos de-inidos en la seccin 8 anterior para versiones modi-icadas; provided )ue inclu5es en la combinacin todas las &ecciones Invariantes de todos los documentos original; no modi-icados 5 listadas todas como &ecciones Invariantes de tu traba0o combinado en su nota de licencia; 5 )ue preservas todas sus Abstenciones de .arant2a. El traba0o combinado necesita solamente contener una copia de esta $icencia; 5 &ecciones Invariantes id+nticas mAltiples pueden ser reempla#adas con una Anica copia. &i 9a5 mAltiples &ecciones Invariantes con el mismo nombre pero di-erente contenido; 9a# el t2tulo de cada una de dic9as secciones Anico al a!adir al -inal de +l; entre par+ntesis; el nombre del autor original o editor de esa seccin si es conocido; o de otro modo un nAmero Anico. Ha# el mismo a0uste a los t2tulos de la seccin en la lista de &ecciones Invariantes &ections en la nota de licencia del traba0o combinado. En la combinacin; debes combinar cuales)uiera secciones ,ituladas YHistoriaY en los diversos documentos originales; -ormando una seccin ,itulada YHistoriaYJ de igual modo combina cuales)uiera secciones ,ituladas Y1econocimientosY; 5 cuales)uiera secciones ,ituladas YDedicatoriasY. Debes eliminar todas las secciones ,ituladas YEndorsementsY. C$&ECCI$4E( DE D$CU)E4T$( Puedes 9acer una coleccin consistente del Document 5 otros documentos liberados ba0o esta $icencia; 5 reepla#ar las copias individuales de esta $icencia en los documentos varios con una Anica copia )ue es incluida en la coleccin; procuranado seguir las reglas de esta $icencia para las copias al pie de la letra de cada uno de los documentos en todos los otros aspectos. Puedes e(traer un Anico documento de tal coleccin; 5 distribirlo individualmente ba0o esta $icencia; procurando )ue insertes una copia de esta $icencia en el documento e(tra2do; 5 siguiendo esta $icencia en todos los otros aspectos relacionados con copias al pie de la letra de ese documento. A//2E/ATI$4 C$4 T2A A7$( I4DEPE4DIE4TE( Una compilacin del Documento o sus derivados con otros documentos o traba0os separados e independentes; en o sobre un volumen de almacenamiento o medio de distribucin; es llamado un YagregadoY si el cop5rig9t )ue resulta de la compilacin no

es usado para limitar los derec9os legales de los usuarios de la compilacin m s all de los )ue los traba0os individuales permiten. Cuando el Document es incluido en un agregado; esta $icencia no se aplica a los otros traba0os en el agregado los cuales no son ellos mismos traba0os derivados del Documento. &i el re)uiremento del ,e(to de la Cubierta de la seccin 3 es aplicable a esas copias del Documento; entonces si el Documento es menos de la mitad del agregado completo; el ,e(to de la Cubierta del Document puede ser colocado en las cubiertas )ue bracGet el Documento con el agregado; o el e)uivalente electrnico de las cubiertas si el Documento es en -orma electrnica. De otro modo ellos deben aparecer en las cubiertas impresas )ue bracGet todo el agregado. T2ADUCCI$4 $a ,raduccin es considerada un tipo de modi-icacin; de tal manera )ue puedes distribuir traducciones del Documento ba0o los t+rminos de la seccin 8. El reempla#o de las &ecciones Invariantes con traducciones re)uiere permiso especial de sus poseedores del cop5rig9t; pero puedes incluir traducciones de alguna o todas las &ecciones Invariantes adicionalmente a las versiones originales de esas &ecciones Invariantes. Puedes incluir una traduccin de esta $icencia; 5 todas las notas de licencia en el Documento; 5 cuales)uieras Abstencipnes de .arant2a ; siempre )ue tambi+n inclu5as la versin Ingl+s original de esta $icencia 5 las versiones originales de esas notas 5 abstenciones. En caso de un desacuerdo entre la traduccin 5 la versin original de esta $icencia o una nota o abstencin; la versin original prevalecer . &i una seccin en el Documento es ,itulada Y1econocimientosY; YDedicatoriasY; o YHistoriaY; el re)uerimiento :seccin 8= para Preservar su ,2tulo :seccin 1= re)uerir t2picamente el cambio del t2tulo actual. TE2)I4ACI$4 Puedes no copiar; modi-icar; sublicenciar; o no distribuir el Document e(cepto como e(presamente se prove5 ba0o esta $icencia. Cual)uier otro intento de copiar; modi-icar; sublicenciar; o distribuir el Documento es evitada; 5 -inali#ar autom ticamente tus derec9os ba0o esta $icencia. &in embargo; las partes )ue 9an recibido copias; o derec9os; de ti ba0o esta $icencia no tendr n sus licencias terminadas mientras tales partes se mantengan en completo cumplimiento. 0UTU2A( 2EAI(I$4E( DE E(TA &ICE4CIA ,9e /undacin del &o-t6are $ibre puede publicar versiones nuevas o revisadas de la $icencia de Documentacin $ibre de la .4U de ve# en cuando. ,ales versiones nuevas ser n similares en esp2ritu a la presente versin; pero pueden di-erir en detalles para resolver nuevos problemas o preocupaciones. ?+ase 9ttp@%%666.gnu.org%cop5le-t%. A cada versin de la $icencia se le da un nAmero de versin )ue la distingue. &i el Documento especi-ica )ue una versin particular numerada de esta $icencia Yo cual)uier versin posteriorY se aplica a ella; tienes la opcin de seguir los t+rminos 5 condiciones de esa versin especi-icada o de cual)uier versin posterior )ue 9a5a sido publicada :no como un borrador= por la /undacin del &o-t6are $ibre. &i el Documento no especi-ica un nAmero de versin de esta $icencia; puedes elegir cual)uier versin )ue 9a5a sido publicada :no como un borrador= por la /undacin del &o-t6are $ibre.

ADE4DU)C cmo usar esta &icencia para tus documentos Para usar esta $icencia en un documento )ue 9as escrito; inclu5e una copia de la $icencia en el documento 5 pon el siguiente cop5rig9t 5 notas de licencia 0usto despu+s de la p gina de t2tulo@ Cop5rig9t :c= Aa" ,U 4"'B1E. &e concede permiso para copiar; distribuir 5%o modi-icar este documento ba0o los t+rminos de la $icencia de Documentacin $ibre de la .4U; ?ersin 1.2 o cual)uier versin posterior publicada por la /undacin del &o-t6are $ibreJ sin &ecciones Invariantes; sin ,e(tos de Cubierta /rontal; 5 sin ,e(tos de Cubierta Posterior. Una copia de la licencia se inclu5e en la seccin titulada Y$icencia de Documentacin $ibre de la .4UY. &i tienes &ecciones Invariantes; ,e(tos de Portada /rontal 5 ,e(tos de Cubieta Posterior; reempla#a la l2nea Ycon...,e(tos.Y con esto@ con las &ecciones Invariantes siendo $I&,A &U& ,I,U$"&; con los ,e(tos de la Cubierta /rontal siendo $I&,A; 5 con los ,e(tos de la Cubierta Posterior siendo $I&,A. &i tienes &ecciones Invariantes sin ,e(tos de Portada; o alguna otra combinacin de los tres; combina esas dos alternativas para acomodar la situacin. &i tu documento contiene e0emplo no triviales de cdigo de programa; recomendamos liberar esos e0emplos en paralelo ba0o tu eleccin de licencia de so-t6are libre; tal como la $icencia PAblica .eneral de la .4U; para permitir su uso en el so-t6are libre. Colo.n Este traba0o es licenciado ba0o la $icencia de Documentacin $ibre de la .4U. /ue originalmente escrito en $a,eF; luego portado a DocBooG. Est disponible en copia transparente en el -ormato DocBooG%F'$. Un sistema de construccin e instrucciones especiales sobre el procesamiento son parte del pa)uete de la copia transparente; aun)ue la contruccin desde la -uente es dependiente del sistema. $a -uente puede ser construida tanto en -ormato H,'$ como PD/; 5 la e(tensin a otros -ormatos debe ser posible 5 es alentada. $a versin original de este documento -ue escrita por 1obert $. 1ead sin renumeracin 5 dedicada a los programadores de Hire.com.I

También podría gustarte