El Programador Pragmático

El Programador Pragmático

@ProfGastonPerez
@ProfGastonPerez
1 Follower
1 week ago 30
AI Summary
Bulleted
Text
Key Insights
  • This book offers insights into building resilient, adaptable, and maintainable software.
  • It emphasizes practical application over theoretical knowledge, focusing on real-world software development challenges.
  • It promotes a proactive approach to problem-solving and continuous learning in software engineering.
  • It emphasizes collaboration, effective communication, and the importance of understanding the domain of the application being developed.

El Programador Pragmático

@ProfGastonPerez1 week ago

1/402
2/402
Para Juliet y Ellie,
Zachary y Elizabeth,
Henry y Stuart
3/402
Agradecimientos de la segunda edición
Hemos disfrutado de literalmente miles de conversaciones sob…
4/402
Dave actualmente enseña en la universidad, tornea madera y juega con
nuevas tecnologías y paradigm…
5/402
Índice
Agradecimientos de la segunda edición
Sobre los autores
Prólogo
Prefacio de la segunda e…
6/402
Las secciones relacionadas incluyen
Retos
5 Software lo bastante bueno
Implique a sus usuarios e…
7/402
DRY es más que código
Duplicación en el código
Duplicación en la documentación
Duplicación relat…
8/402
Características de los lenguajes de dominio
Compensaciones entre lenguajes internos y externos
Un…
9/402
Las secciones relacionadas incluyen
Retos
20 Depuración
Psicología de la depuración
Mentalidad …
10/402
Deje las aserciones activadas
Las secciones relacionadas incluyen
26 Cómo equilibrar los recursos…
11/402
Las transformaciones transforman la programación
Las secciones relacionadas incluyen
Ejercicio
3…
12/402
Sin concurrencia explícita
Erlang prepara el escenario
Las secciones relacionadas incluyen
Retos…
13/402
40 Refactorización
¿Cuándo deberíamos refactorizar?
¿Cómo refactorizamos?
Las secciones relacion…
14/402
8. Antes del proyecto
45 El pozo de los requisitos
El mito de los requisitos
Programar como tera…
15/402
Ranas hervidas
Planifique su cartera de conocimientos
Comunique la presencia del equipo
No se re…
16/402
Prólogo
Recuerdo cuando Dave y Andy tuitearon por primera vez acerca de la
nueva edición de este …
17/402
las lecciones todavía se entienden, sin las distracciones de los ejemplos
antiguos. Desempolvan vi…
18/402
cuándo era probable que hubiese atascos. El clima era diferente, necesitaba
un fondo de armario nu…
19/402
Prefacio de la segunda edición
En los años noventa, trabajábamos con empresas cuyos proyectos
est…
20/402
Nuestra intención era hacer que las cosas fuesen más claras, más relevantes
y, de alguna manera, a…
21/402
base para debates o para un ensayo acerca de los cursos de programación
avanzados. También hay una…
22/402
término original. Cuando ha ocurrido eso, hemos contribuido al declive de
la lengua inventando nue…
23/402
Del prefacio de la primera edición
Este libro le ayudará a convertirse en un desarrollador mejor.
…
24/402
operativo. Solo puede haber sistemas que son más apropiados en un
conjunto de circunstancias deter…
25/402
claridad como sus aficiones, su ropa o su corte de pelo. Sin embargo, si es
un programador pragmát…
26/402
expresarse como trucos:
Truco 1. Preocúpese por su oficio.
Nos parece que no tiene sentido desarr…
27/402
Debería haber ingeniería en la creación del software. Sin embargo, eso
no excluye la artesanía ind…
28/402
y para añadir nuevas herramientas a su repertorio. A diferencia del césped
de Eton, empezará a ver…
29/402
1
Una losofía pragmática
Este libro es sobre usted.
No se confunda, es su carrera y, lo que es m…
30/402
continuo y en desarrollo. En “Su cartera de conocimientos”, vemos algunas
estrategias para mantene…
31/402
Truco 3. Tiene capacidad de acción.
¿Su entorno laboral es un asco? ¿Le aburre su trabajo? Intente…
32/402
Estas cosas pasan e intentamos lidiar con ellas de la forma más
profesional posible. Eso significa…
33/402
hacemos todos) o un error de juicio, admítalo con honestidad e intente
proponer opciones.
No culp…
34/402
profundidad? ¿Le ayudaría algún libro o curso? No tenga miedo de pedir o
de admitir que necesita a…
35/402
Existen muchos factores que pueden contribuir a la pudrición del
software. El más importante parec…
36/402
No deje “ventanas rotas” (malos diseños, decisiones equivocadas o
código pobre) sin reparar. Arreg…
37/402
Una ventana rota (una porción de código mal diseñada, una mala
decisión de la dirección con la que…
38/402
4 Sopa de piedras y ranas hervidas
Tres soldados volvían a casa hambrientos tras la guerra. Cuando…
39/402
desde el principio. A la gente le resulta más fácil unirse a un éxito en curso.
Enséñeles una mues…
40/402
No sea como la rana imaginaria. No pierda de vista el panorama general.
Revise constantemente lo q…
41/402
solo diez. Pegada en la caja pequeña hay una etiqueta que dice: “Estos son
los diez defectuosos”.
…
42/402
pulir el código una vez más. No estamos abogando por el pánico: sería igual
de poco profesional pr…
43/402
podría ser perfecto. (En el capítulo 7, “Mientras escribe código”, veremos
filosofías para desarro…
44/402
—Benjamin Franklin.
Ah, el viejo Ben Franklin, siempre con una homilía concisa a mano.
Bueno, si …
45/402
5. Las carteras deberían revisarse y volver a equilibrarse de forma
periódica.
Para tener éxito e…
46/402
oportunidades. No ponga todos los huevos técnicos en la misma
cesta.
■ Compre barato, venda caro
…
47/402
profundo necesita libros largos. Explore las librerías en busca de
libros técnicos sobre temas int…
48/402
cosas. La polinización cruzada de ideas es importante; intente aplicar las
lecciones que ha aprend…
49/402
que su dogma proporciona la única respuesta; puede ser o no ser aplicable a
usted y a su proyecto.…
50/402
continuación), utilice pensamiento de segundo orden: ¿qué pasará
después de eso?
■ ¿Por qué es es…
51/402
Quizá podamos aprender una lección de la señorita West. No es solo lo
que tenemos, sino también co…
52/402
estado. Puede presentar esta actualización de muchas maneras distintas,
dependiendo de su público.…
53/402
Ahora que sabe lo que quiere su público, entréguelo.
Elija el momento
Son las seis de la tarde de…
54/402
Demasiados desarrolladores (y sus directores) se concentran solo en el
contenido cuando producen d…
55/402
en un diálogo y transmitirá su propósito de manera más efectiva. Quién
sabe, a lo mejor incluso ap…
56/402
Es fácil producir documentación con buen aspecto a partir de los
comentarios en el código fuente y…
57/402
Retos
■ Hay muchos libros estupendos que contienen secciones sobre la
comunicación dentro de los …
58/402
■ Compruebe la lista de destinatarios antes de enviar. Se ha convertido en un
cliché criticar al j…
59/402
2
Un enfoque pragmático
Existen algunos consejos y trucos que se aplican a todos los niveles del
…
60/402
presentamos algunas sugerencias más modestas que puede implementar
usted mismo.
Por último, todos…
61/402
¿Por qué es importante el momento de poner nombres? Porque los
buenos nombres hacen que el código …
62/402
que le ayude la próxima vez que se encuentre con una bifurcación similar
en el camino.
El resto d…
63/402
Dar a un ordenador dos informaciones contradictorias era la manera
preferida del capitán James T. …
64/402
Truco 15. DRY: Don’t Repeat Yourself. No se repita.
La alternativa es tener la misma cosa expresad…
65/402
Puede que sea trivial, pero la duplicación es muy común. Veamos un
ejemplo:
def print_balance(acc…
66/402
Otra duplicación es la repetición de la anchura de campo en todas las
llamadas printf. Podríamos a…
67/402
report_line(“Fees”, account.fees)
print_line(“”, “———-”)
report_line(“Balance”, account.balance)
…
68/402
De algún modo, se ha creado el mito de que deberíamos comentar todas
las funciones. Quienes creen …
69/402
Nuestras estructuras de datos representan información y pueden tener
problemas con el principio DR…
70/402
Point getStart() { return start; }
Point getEnd() { return end; }
double getLength() { return len…
71/402
Para las API internas, busque herramientas que le permitan especificar la
API en algún tipo de for…
72/402
Duplicación entre varios desarrolladores
Quizá el tipo de duplicación más difícil de detectar y ge…
73/402
Lo que está intentando hacer es fomentar un entorno en el que sea más
fácil encontrar y reutilizar…
74/402
Figura 2.1.
En informática, el término ha acabado significando una especie de
independencia o des…
75/402
dos pedales, que varían la cantidad de impulso del rotor de cola y ayudan al
helicóptero a girar.
…
76/402
Si escribe sistemas ortogonales, conseguirá dos beneficios importantes:
un aumento de la productiv…
77/402
■ El sistema resultante es menos frágil. Si hace cualquier cambio o
arreglo en un área concreta, c…
78/402
Figura 2.2.
Hay una prueba sencilla para el diseño ortogonal. Una vez que tenga sus
componentes p…
79/402
podrían cambiar en cualquier momento por cualquier razón. No dependa de
las propiedades de cosas q…
80/402
Hay muchas técnicas que puede utilizar para mantener la ortogonalidad:
■ Mantenga el código desaco…
81/402
que hemos dedicado una sección a hablar de él (consulte el tema 40,
“Refactorización”).
Pruebas
…
82/402
documentación ortogonal de verdad, debería ser capaz de cambiar la
apariencia de forma radical sin…
83/402
■ Piense en la diferencia entre herramientas que tienen una interfaz
gráfica de usuario y servicio…
84/402
11 Reversibilidad
Nada es más peligroso que una idea si es la única que tienes.
—Émile-Auguste Ch…
85/402
El problema es que las decisiones críticas no pueden revertirse con
facilidad.
Una vez que decidi…
86/402
El error está en asumir que toda decisión es inamovible y en no
prepararse para las contingencias …
87/402
Y, aunque esto no es específicamente un problema de reversibilidad, le
daremos un último consejo.
…
88/402
versión diferente del futuro. ¿Cuántos futuros posibles puede soportar
su código? ¿Cuáles son más …
89/402
sus requisitos pueden ser vagos. Como es posible que estemos usando
algoritmos, técnicas, lenguaje…
90/402
incertidumbre en la aplicación general y añadimos el esqueleto necesario
para hacerla funcionar.
…
91/402
Figura 2.3.
Era una gran oportunidad para utilizar código trazador. Desarrollamos el
framework pa…
92/402
que aún no está maduro. No se sentirán decepcionados por la falta de
funcionalidad; estarán conten…
93/402
Las balas trazadoras muestran dónde estamos dando, pero puede que eso
no siempre sea la diana. Lo …
94/402
podría querer crear un prototipo de un número de algoritmos que realicen la
colocación real. Podrí…
95/402
13 Prototipos y notas en post-its
Muchas industrias utilizan prototipos para probar ideas específi…
96/402
tener una interfaz de usuario muy pobre o incluso por no tener interfaz de
usuario.
Pero, si se e…
97/402
entrada y un elemento del menú.
■ Robustez: Es probable que la comprobación de errores no se
comp…
98/402
■ ¿Están bien definidas y son apropiadas las responsabilidades de las
áreas principales?
■ ¿Están…
99/402
Las secciones relacionadas incluyen
■ Tema 12, “Balas trazadoras”.
■ Tema 14, “Lenguajes de domin…
100/402
parece más importante, el lenguaje del dominio del problema también
puede sugerir una solución de …
101/402
Feature: Scoring
Background:
Given an empty scorecard
Scenario: bowling a lot of 3s
Given I thr…
102/402
get “/”, PageController, :index
resources “/users”, UserController
end
Esto indica que las petic…
103/402
metaprogramación y macros, pero al final se compilan y ejecutan como
código normal. Las pruebas de…
104/402
El inconveniente de los lenguajes de dominio internos es que estamos
limitados por la sintaxis y l…
105/402
it “totals 12 if you score 3 four times” do
score = BowlingScore.new
4.times { score.add_pins(3) …
106/402
P 2 # selecciona el bolígrafo 2
D # baja el bolígrafo
W 2 # dibuja hacia el oeste 2cm
N 1 # desp…
107/402
La Biblioteca del Congreso en Washington, DC, tiene en la actualidad
unos 75 terabytes de informac…
108/402
meses, entonces saben que tienen que esperar entre cinco y siete meses a
partir de ahora. Ambos nú…
109/402
La primera parte de cualquier ejercicio de estimación es desarrollar la
comprensión de lo que se l…
110/402
(como aquellos que simulan la llegada de tráfico a un nodo). Verá que cada
componente suele tener …
111/402
Durante la fase de los cálculos, recibirá respuestas que parecerán
extrañas. No tenga prisa por de…
112/402
que denominaban PERT (Program Evaluation Review Technique, técnica de
revisión y evaluación de pro…
113/402
Así pues, complete la creación del código y las pruebas y marque eso
como el final de la primera i…
114/402
■ Empiece a llevar un registro de sus estimaciones. Para cada una,
anote lo exacta que resultó ser…
115/402
8 https://cucumber.io/.
9 https://phoenixframework.org/.
10 https://www.ansible.com/.
11 https:/…
116/402
3
Las herramientas básicas
Todo creador comienza su viaje con un conjunto básico de herramientas
…
117/402
nota de buscar algo diferente o más potente que le hubiese ayudado. Deje
que la necesidad impulse …
118/402
Como programadores pragmáticos, nuestro material básico no es madera
o hierro, es conocimiento. Re…
119/402
Truco 25. Mantenga el conocimiento en texto simple.
El poder del texto
El texto simple no signifi…
120/402
Pero imagine que el archivo hubiese tenido este formato en vez del
anterior:
AC27123456789B11P
.…
121/402
archivo de texto simple orientado a líneas. Las bases de datos usadas para la
administración de si…
122/402
Retos
■ Diseñe una pequeña base de datos para una agenda (nombre,
teléfono, etc.) utilizando una …
123/402
proyecto son cosas que podría interesarle hacer en un entorno gráfico, pero,
si hace todo su traba…
124/402
con el intérprete de comandos y le sorprenderá cuánto le ayuda a ser más
productivo.
Su propio in…
125/402
intérprete para que reconozca el comando que está introduciendo y
ofrezca completitudes específica…
126/402
menor esfuerzo posible, porque el texto es la materia prima básica de la
programación.
En la prim…
127/402
■ Vaya a un número de línea en particular.
■ Ordene líneas seleccionadas.
■ Busque tanto cadenas …
128/402
Cuando se tope con una aparente limitación del editor que está
utilizando, busque una extensión qu…
129/402
verá que su edición es cada vez más rápida y fluida de lo que jamás
había sido antes.
■ Busque in…
130/402
encuentro central para su equipo y su código.
Los directorios compartidos NO son control de versio…
131/402
Los sistemas de control de versiones pueden guardar los archivos que
mantienen en un repositorio c…
132/402
Un beneficio de las ramas es el aislamiento que proporcionan. Si
desarrolla una funcionalidad A en…
133/402
Ahora, muchos sistemas de control de versiones no necesitan
alojamiento. Están descentralizados po…
134/402
■ Tema 51, “Kit pragmático básico”.
Retos
■ Saber que puede volver a cualquier estado anterior ut…
135/402
mirar tus propios problemas y saber
que tú mismo, y nadie más, los has provocado.
—Sófocles, Áyax…
136/402
escenario técnico, le conviene concentrarse en arreglar el problema, no en
echar la culpa.
Truco …
137/402
Por dónde empezar
Antes de empezar a fijarse en el fallo, asegúrese de que está trabajando
en un …
138/402
hacerlo de manera sistemática (consulte “Pruebas despiadadas y
continuas” en el tema 51).
Estrate…
139/402
Truco 32. Lea el puñetero mensaje de error.
Nada más que decir.
Malos resultados
¿Qué pasa si no…
140/402
conjunto de datos e introdúzcalo a través de una copia de la aplicación que
se ejecute de manera l…
141/402
hay que concentrarse en los marcos anteriores; si no, será en los siguientes.
Vuelva a buscar. Inc…
142/402
Puede utilizar sentencias de rastreo para examinar a fondo el código. Es
decir, puede añadir sente…
143/402
entorno de la plataforma (sistema operativo, bibliotecas del sistema,
compiladores).
Es posible q…
144/402
resumen, es una partida totalmente nueva, y debe volver a probar el sistema
bajo esas condiciones …
145/402
arreglarlas. Asegúrese de que, haya pasado lo que haya pasado, lo sabrá si
vuelve a ocurrir.
Si h…
146/402
21 Manipulación de texto
Los programadores pragmáticos manipulan texto de la misma manera
que los…
147/402
La versión en Perl era la más corta (17 líneas, comparadas con las 150 de
C). Con Perl podemos man…
148/402
■ Incluir ecuaciones: Hay un script en Python que convierte marcado
matemático LaTeX en texto con …
149/402
Como continuación del ejercicio anterior, añada la capacidad para
cambiar esos nombres de variable…
150/402
■ Actúa como una especie de patito de goma (que ya hemos descrito).
Cuando nos detenemos para apun…
151/402
4
Paranoia pragmática
Truco 36. No puede escribir software perfecto.
¿Le ha dolido? No debería. …
152/402
incluidos ellos, los programadores pragmáticos construyen defensas contra
sus propios errores. Des…
153/402
Puede que tenga un contrato laboral que especifique las horas que
trabajará y las normas de conduc…
154/402
procesamiento interno de una rutina, la invariante puede no
cumplirse, pero, para cuando la rutina…
155/402
Si llama a accept-deposit con una cantidad positiva para el
depósito y una cuenta válida, proceder…
156/402
Este enfoque es mejor que comprobar las entradas sin más; en este caso,
no puede simplemente llama…
157/402
■ El DBC define los parámetros para el éxito o el fracaso en todos los casos,
mientras que las pru…
158/402
“Programación asertiva”). ¿Por qué solo de manera parcial? ¿No podemos
usar aserciones para hacer …
159/402
sqrt un parámetro negativo, recibiremos un error informativo, como
sqrt_arg_must_be_positive, junt…
160/402
que al usuario de la tarjeta de débito nunca se le debería aplicar la misma
transacción a su cuent…
161/402
Está claro que cualquier sistema que dependa de tecnología de agentes
tiene una dependencia crític…
162/402
puede cambiar la velocidad de unidad en unidad (es decir, de 0 a 1 y de 1 a
2, no de 0 a 2).
Esto…
163/402
pensamos que son, que el código en producción es el código que pensamos
que es. Estamos comproband…
164/402
segunda versión, más pragmática, la nueva excepción se propaga de forma
automática.
Truco 38. Que…
165/402
■ Tema 20, “Depuración”.
■ Tema 23, “Diseño por contrato”.
■ Tema 25, “Programación asertiva”.
■…
166/402
En la implementación de Java, puede (y debería) añadir una cadena
descriptiva:
assert result != n…
167/402
La llamada a .nextElement() en la aserción tiene el efecto
secundario de hacer que el iterador pas…
168/402
Desactivar las aserciones cuando se entrega el programa a producción es
como cruzar un alambre a g…
169/402
■ (a + 1) <= a.
Las secciones relacionadas incluyen
■ Tema 23, “Diseño por contrato”.
■ Tema 24,…
170/402
end
def write_customer
@customer_file.rewind
@customer_file.puts @balance.to_s
@customer_file.c…
171/402
write_customer en algunas circunstancias. Cuando eso ocurre, el
archivo no está cerrándose.
Una s…
172/402
En vez de aferrarnos a la referencia del archivo, hemos cambiado el
código para pasarla como un pa…
173/402
■ Cuando asigne el mismo conjunto de recursos en diferentes puntos
de su código, asígnelos siempre…
174/402
salga del ámbito o lo reclame el recolector de basura, el destructor del
objeto desasignará el rec…
175/402
catch
// se lanzó una excepción
finally
// limpiar en cualquier caso
Sin embargo, hay trampa.
…
176/402
en una estructura de datos agregada. ¿Qué pasa cuando se desasigna la
estructura del nivel superio…
177/402
bucle de procesamiento principal donde espera a que llegue la siguiente
solicitud. Este es un buen…
178/402
27 No vaya más rápido que sus faros
Es difícil hacer predicciones, sobre todo acerca del futuro.
…
179/402
¿A qué nos referimos exactamente con feedback? Cualquier cosa que
confirme o desmienta de forma in…
180/402
En su libro El cisne negro: El impacto de lo altamente improbable
[Tal10], Nassim Nicholas Taleb s…
181/402
habilitarlas y déjelas habilitadas.
3 Para ver una explicación sobre los peligros del código acopl…
182/402
5
O se adapta o se rompe
La vida no se queda quieta, y tampoco puede hacerlo el código que
escri…
183/402
fallos nuevos. “Configuración” explicará cómo extraer detalles del código
por completo, donde pued…
184/402
Figura 5.2.
Aquí no hay rigidez estructural: las piezas individuales pueden cambiar
y otras solo …
185/402
■ Dependencias absurdas entre módulos o bibliotecas no relacionados.
■ Cambios “simples” en un mód…
186/402
Supongamos que la empresa decide que ningún pedido puede tener un
descuento de más del 40 %. ¿Dónd…
187/402
public void applyDiscount(customer, order_id, discount) {
customer
.findOrder(order_id)
.getTota…
188/402
La LoD dice que un método definido en una clase C solo debería llamar
a:
■ Otros métodos de la in…
189/402
biblioteca de terceros debería considerarse volátil, sobre todo si se sabe que
los mantenedores de…
190/402
práctica, por supuesto, el impacto es bastante limitado; en realidad, el
problema se reduce a sabe…
191/402
Los datos globales incluyen recursos externos
Cualquier recurso externo mutable son datos globales…
192/402
■ Tema 32, “Configuración”.
■ Tema 33, “Romper el acoplamiento temporal”.
■ Tema 34, “Estado comp…
193/402
Pero ¿cómo podemos escribir estos tipos de aplicaciones? Sin algún tipo
de estrategia, enseguida a…
194/402
Figura 5.3.
Mientras estamos en el estado “Leyendo mensaje”, podemos aceptar
mensajes de datos, e…
195/402
reading: {data: :reading, trailer: :done},
}
5
state = :initial
while state != :done && state !…
196/402
Figura 5.5.
Esta vez, cada transición tiene dos etiquetas. La superior es el evento que
la desenc…
197/402
case action
when :ignore
when :start_new_string
result = []
when :add_current_to_string
result…
198/402
El patrón Observer
En el patrón Observer tenemos una fuente de eventos, denominada
“observable” y…
199/402
funciones cuando se produce el evento. Este es un buen ejemplo de cuándo
no utilizar una bibliotec…
200/402
que utiliza pubsub de forma considerable: no puede mirar un editor y ver de
inmediato qué suscript…
201/402
independientes del lenguaje y documenta algunas implementaciones
comunes. Aquí vamos a usar la bib…
202/402
Figura 5.6.
Fíjese en los sellos de tiempo: recibimos un evento desde el stream cada
500 ms. Cada…
203/402
let users = Observable.of(3, 2, 1)
let result = users.pipe(
mergeMap((user) =>
ajax.getJSON(`htt…
204/402
medida que recibiésemos esos ID y, presumiblemente, almacenándolos en
otra parte.
Se trata de una…
205/402
■ Si es después del atardecer, y se detecta movimiento en la parte
inferior de las escaleras, segu…
206/402
Se trata de una serie de transformaciones:
■ find . -type f
Escribe una lista de todos los archiv…
207/402
Vamos a ver esto en lo que respecta a los datos que fluyen entre los
pasos individuales. Nuestro r…
208/402
A veces, la manera más sencilla de encontrar las transformaciones es
empezar por los requisitos y …
209/402
Transformaciones hasta abajo
Vamos a empezar por fijarnos en el paso 1, que toma una palabra y cre…
210/402
es lo mismo que escribir:
Comb.subsets(String.codepoints(“vinyl”))
(Otros lenguajes podrían intro…
211/402
|> Stream.map(&Dictionary.signature_of/1)
end
Ahora transformamos esa lista de firmas: cada firma…
212/402
|> find_in_dictionary()
|> group_by_length()
end
¿Funciona? Vamos a probar:
iex(1)> Anagrams.an…
213/402
Pero también hay algo más profundo. Si su formación está relacionada
con la programación orientada…
214/402
valor contenido es válido. En Haskell, por ejemplo, este envoltorio se llama
Maybe. En F# y Scala …
215/402
def find_all(file_name, pattern) do
File.read(file_name)
|> find_matching_lines(pattern)
|> trun…
216/402
hacia abajo en la pipeline. Lo mismo se aplica a truncate_lines.
Podemos jugar con esto en la cons…
217/402
def find_all(file_name, pattern) do
File.read(file_name)
|> and_then(&find_matching_lines(&1, pat…
218/402
código se vuelve más limpio, sus funciones más cortas y sus diseños más
planos. Pruébelo.
Las sec…
219/402
const content = File.read(file_name);
const lines = find_matching_lines(content, pattern)
const r…
220/402
semáforo. En la terminología actual, link sería una clase principal o
padre.
El modelo mental uti…
221/402
Problema de usar la herencia al compartir código
La herencia es acoplamiento. No solo está la clas…
222/402
también rompe (de forma silenciosa) Car.
Demasiado acoplamiento.
Problemas de usar la herencia pa…
223/402
Figura 5.10.
Lo que es incluso peor, sin embargo, es el problema de la herencia
múltiple. Car pue…
224/402
■ Delegación.
■ Mixins y traits.
Interfaces y protocolos
La mayoría de los lenguajes orientados …
225/402
Lo que hace que las interfaces y los protocolos sean tan potentes es que
podemos utilizarlos como …
226/402
end
Ahora, la clase Account lleva de un lado a otro toda la API de la clase
de persistencia. En v…
227/402
repetitivo: es probable que todas nuestras clases de registro necesiten un
método find por ejemplo…
228/402
def find(id) { ... }
def findAll() { ... }
end
class AccountRecord extends BasicRecord with Comm…
229/402
administrador contiene las validaciones del administrador (seguramente
menos restrictivas). Ahora,…
230/402
32 Conguración
Deja que todas tus cosas tengan su sitio; deja que todos tus asuntos tengan su mome…
231/402
información está en archivos planos, la tendencia es utilizar algún formato
de texto simple listo …
232/402
La idea de que deberíamos detener y reiniciar una aplicación para cambiar
un solo parámetro no est…
233/402
Las secciones relacionadas incluyen
■ Tema 9, “DRY: los males de la duplicación”.
■ Tema 14, “Len…
234/402
7 De hecho, podría añadir un operador así a Elixir utilizando su servicio de macros; un ejemplo de
…
235/402
6
Concurrencia
Para que estemos todos de acuerdo, vamos a empezar por algunas
definiciones:
■ L…
236/402
A menudo, los desarrolladores hablan de acoplamiento entre porciones
de código. Se refieren a las …
237/402
33 Romper el acoplamiento temporal
Puede que esté preguntándose: “¿De qué va el desacoplamiento
t…
238/402
Truco 56. Analice el flujo de trabajo para mejorar la concurrencia.
Un diagrama de actividad consi…
239/402
3, 5 y 6 pueden ocurrir en paralelo más tarde. Si está en un concurso de
preparación de piñas cola…
240/402
Figura 6.1.
Aplicar formato con mayor rapidez
Este libro está escrito en texto simple. Para crear…
241/402
Las cosas ideales para dividir de este modo son las partes del trabajo que
son relativamente indep…
242/402
34 Estado compartido es estado incorrecto
Está en su restaurante favorito. Ha terminado los platos…
243/402
Figura 6.2.
Los dos camareros operan de manera concurrente (y, en la vida real, en
paralelo). Vam…
244/402
Semáforos y otras formas de exclusión mutua
Un semáforo es simplemente una cosa que solo una perso…
245/402
expositor de la tarta están de acuerdo en la convención de usar el semáforo.
Si a alguien se le ol…
246/402
@case_semaphore.unlock()
end
Incluso este código podría no ser correcto. Si update_sales_data
la…
247/402
slice = display_case.get_pie_if_available()
scoop = freezer.get_ice_cream_if_available()
if slice…
248/402
Creemos que la respuesta es “no” para ambas opciones. El enfoque
pragmático sería decir que “tarta…
249/402
Truco 58. Los fallos aleatorios son a menudo problemas de concurrencia.
Otros tipos de accesos exc…
250/402
35 Actores y procesos
Sin escritores, la historias no se escribirían; sin actores, las historias n…
251/402
más que mediante su lectura por parte de su destinatario y el estado
local es inaccesible fuera de…
252/402
escribir actores como objetos simples, donde las claves son los tipos de
mensaje que recibe y los …
253/402
}
else {
console.dir(`Don’t know how to order ${msg.wants}`);
}
},
“add to order”: (msg, ctx) …
254/402
return state;
}
}
}
Aunque a menudo descubrirá que los actores se inician de forma
dinámica po…
255/402
dispatch(c2, { type: ‘hungry for pie’, waiter: waiter });
dispatch(c1, { type: ‘hungry for pie’, w…
256/402
“procesos”, pero no son los procesos del sistema operativo corrientes, sino
que, como los actores …
257/402
La escritura en la pared...
—Daniel 5 (referencia)
Piense en cómo los detectives utilizarían una …
258/402
añaden sus hallazgos.
■ Los detectives pueden tener formación en distintas disciplinas,
pueden te…
259/402
Una pizarra en acción
Supongamos que estamos escribiendo un programa para aceptar y
procesar soli…
260/402
Una pizarra, en combinación con un motor de reglas que encapsule los
requisitos legales, es una so…
261/402
a todos los actores involucrados. Entonces, será capaz de reconstruir lo que
sucede desde los arch…
262/402
trabajo? ¿Qué hace que sean efectivos? ¿Se publican los mensajes
con formatos consistentes? ¿Impor…
263/402
7
Mientras escribe código
La sabiduría popular dice que, una vez que un proyecto está en la fase …
264/402
Los programadores pragmáticos miramos con una visión crítica todo el
código, incluido el nuestro. …
265/402
37 Escuche a su cerebro reptiliano
Solo los seres humanos pueden mirar directamente algo, tener to…
266/402
Miedo a la página en blanco
Todo el mundo teme a la pantalla vacía, al solitario cursor parpadeant…
267/402
Su código está intentando decirle algo. Le está diciendo que esto es más
difícil de lo que debería…
268/402
Andy y Dave han pasado horas mirando búferes vacíos del editor.
Escribimos algo de código, miramos…
269/402
En esta etapa, sabe lo que tiene que hacer. Elimine todo el código del
prototipo, tire la nota adh…
270/402
Retos
■ ¿Hay algo que sepa que debería hacer, pero que haya estado
posponiendo porque le parece d…
271/402
de varias horas intentando arreglarlo, Fred todavía no sabe por qué. Puede
pasar una cantidad impo…
272/402
Pero estas rutinas no se diseñaron para que se las llamase de esta
manera; aunque parecen funciona…
273/402
resultado de las interpretaciones de las zonas horarias en conflictos y las
inconsistencias en las…
274/402
Accidentes de contexto
También puede haber “accidentes de contexto”. Supongamos que
estamos escri…
275/402
Queremos pasar menos tiempo haciendo código como churros, encontrar
y arreglar errores lo antes po…
276/402
Así pues, la próxima vez que parezca que algo funciona, pero no sepa
por qué, asegúrese de que no …
277/402
exhaustiva por toda Norteamérica y todo parece ir bien, pero, de repente,
recibe una serie de quej…
278/402
que muchos son sublineales. Una búsqueda binaria, por ejemplo, no
requiere mirar cada candidato cu…
279/402
no lo sabrá por la notación. Big O nunca va a proporcionarle cifras reales
para el tiempo, la memo…
280/402
menudo resulta útil para poder modelar el consumo de memoria (consulte
los ejercicios para ver un …
281/402
sea logarítmico, O(lg n). Una búsqueda binaria de una lista
ordenada, atravesar un árbol binario y…
282/402
a ser esos valores. Si los números están limitados, entonces sabrá cuánto
tardará el código en eje…
283/402
Truco 64. Pruebe sus estimaciones.
Si es difícil conseguir tiempos precisos, utilice perfiladores …
284/402
■ En el primer ejercicio que sigue nos fijamos en matrices de
ordenamiento de enteros largos. ¿Cuá…
285/402
Por desgracia, la metáfora más común para el desarrollo de software es
la construcción de un edifi…
286/402
grande, o está intentando abarcar demasiado: es necesario dividirla en dos.
Las cosas que no funci…
287/402
hoy. Hay varias cosas que pueden hacer que un código sea un buen
candidato a la refactorización:
…
288/402
que invertir mucho más tiempo para arreglar el problema más adelante,
cuando haya más dependencias…
289/402
orden ni concierto, puede que acabe en una situación peor que en la que
estaba cuando empezó.
Es …
290/402
código deberían fallar en la compilación. De ese modo, sabrá qué necesita
actualizarse. La próxima…
291/402
Truco 66. Las pruebas no van de encontrar fallos.
Consideramos que los principales beneficios de l…
292/402
no está. Vamos a hacer trampas y a pasar el nombre del campo (lo que nos
permitirá probar lo que t…
293/402
condiciones de contorno y en cómo funcionarán antes de empezar a escribir
el código, puede que enc…
294/402
hemos visto a personas que se han convertido en esclavas del TDD. Esto se
manifiesta de diversas f…
295/402
varias veces hasta que estuvo satisfecho con el modelo de objeto. Pero
después abandonó el proyect…
296/402
tradicionalmente este tipo de problemas (usando la propagación de
restricciones), y después se con…
297/402
mundo una vez que lo hayamos probado en condiciones controladas
(incluso artificiosas). Una prueba…
298/402
■ Pasar un argumento negativo y asegurarse de que se rechaza.
■ Pasar un argumento de cero y asegu…
299/402
en A, o en el uso que hace A de uno de esos subcomponentes. Esta técnica
es una manera genial de r…
300/402
Los archivos de registro que contienen mensajes de seguimiento son uno
de esos mecanismos. Los men…
301/402
denomina “Probar más tarde”, pero ¿a quién queremos engañar? “Probar
más tarde” en realidad signif…
302/402
Truco 70. Pruebe su software, o lo harán sus usuarios.
No se equivoque, la creación de pruebas es …
303/402
En el tema 23, “Diseño por contrato”, hablábamos de la idea de que el
código tiene contratos que c…
304/402
a_list.sort()
for i in range(len(a_list)–1):
assert a_list[i] <= a_list[i + 1]
Esto es lo que pa…
305/402
serán listas de números naturales que tienen una longitud de 100
elementos como máximo.
Esto no e…
306/402
assert wh.in_stock(“hats”)
assert not wh.in_stock(“umbrellas”)
wh.take_from_stock(“shoes”, 2)
as…
307/402
assert item == “bagel”
assert quantity == 1
En la superficie, todo parece estar bien, pero, antes…
308/402
if quantity <= self.stock[item_name]:
self.stock[item_name] -= quantity
else:
raise Exception(“O…
309/402
En el ejemplo anterior, hemos utilizado una prueba basada en
propiedades para comprobar que los ni…
310/402
código, eliminando casos límite y resaltando funciones que dejan los datos
en un estado inconsiste…
311/402
Las buenas vallas hacen buenos vecinos.
—Robert Frost, Mending Wall
En la explicación sobre el ac…
312/402
criminales, espionaje industrial o incluso una expareja vengativa, todos
están ahí fuera y van a p…
313/402
seguridad. El código más simple, más ajustado y menos complejo es
más fácil de razonar y es más fá…
314/402
■ Los servicios no autenticados son un vector de ataque: Por su
propia naturaleza, cualquier usuar…
315/402
Principio de mínimo privilegio
Otro principio clave es utilizar la menor cantidad de privilegios d…
316/402
ante muchas personas, es una opción predeterminada sensata, pero puede
que algunos usuarios prefie…
317/402
que las mayores filtraciones de datos de la historia (hasta ahora) estuvieron
causadas por sistema…
318/402
Sentido común vs. criptografía
Es importante tener en cuenta que el sentido común puede fallar cua…
319/402
Las secciones relacionadas incluyen
■ Tema 23, “Diseño por contrato”.
■ Tema 24, “Los programas m…
320/402
Eche un vistazo al siguiente panel (figura 7.2). Tiene una lista de
nombres de colores o tonos y c…
321/402
public void deductPercent(double amount)
// ...
Aquí hay dos cosas. Primero, deductPercent es lo …
322/402
Existe una tradición arraigada que señala que los proyectos y los equipos de
proyecto deberían ten…
323/402
Emerson es famoso por escribir: “Una consistencia tonta es el duende de
las mentes pequeñas...”, p…
324/402
no expresa el propósito o que es engañoso o confuso, arréglelo. Tiene
pruebas de regresión complet…
325/402
■ ¿Hay nombres en su sistema difíciles de cambiar? ¿Qué puede hacer
para arreglar esa ventana rota…
326/402
15 Esta técnica ha demostrado tener éxito a nivel del chip de la CPU, donde los conocidos exploits …
327/402
8
Antes del proyecto
Al principio de un proyecto, usted y su equipo necesitan conocer los
requis…
328/402
La perfección se consigue, no cuando no hay más que añadir, sino cuando no queda nada más
por quit…
329/402
Ahí es donde entramos los programadores. Nuestro trabajo es ayudar a la
gente a entender lo que qu…
330/402
Eso es lo que hacemos. Cuando se nos da algo que parece simple,
molestamos a la gente buscando cas…
331/402
Su trabajo es ayudar al cliente a entender las consecuencias de sus
requisitos solicitados. Para h…
332/402
Además de conseguir una perspectiva más profunda de cómo va a
utilizarse de verdad el sistema, le …
333/402
Implemente el caso general, con la información de la política como un
ejemplo del tipo de cosas qu…
334/402
le dé el visto bueno, sino que son solo hitos para ayudar a guiar el proceso
de implementación.
L…
335/402
de la Ilíada en griego homérico y pedirle que escriba código para un
videojuego a partir de ella.
…
336/402
Los fracasos de muchos proyectos se achacan a una expansión del
alcance, también conocida como fea…
337/402
■ Tema 11, “Reversibilidad”.
■ Tema 13, “Prototipos y notas en post-its”.
■ Tema 23, “Diseño por …
338/402
46 Resolver rompecabezas imposibles
Gordias, el rey de Frigia, ató una vez un nudo que nadie podía…
339/402
podrían no ser aplicables e ignorarlas. Pero esta expresión no es del todo
exacta. Si “la caja” es…
340/402
sin ser descubiertos? Seguro que “por la puerta principal” se descartó al
principio por ser un sui…
341/402
Haga que le planteen preguntas como:
■ ¿Por qué está resolviendo este problema?
■ ¿Cuál es el ben…
342/402
Retos
■ Fíjese en cualquier problema difícil con el que tenga que lidiar hoy.
¿Puede cortar el nu…
343/402
Y eso es a lo que nos referimos en realidad cuando decimos “trabajar
juntos”: no solo hacer pregun…
344/402
otro desarrollador es libre de considerar el alcance y los problemas de alto
nivel. Aunque parezca…
345/402
ideas nuevas o diagnosticar problemas peliagudos, tal vez pueda probar una
sesión de programación …
346/402
48 La esencia de la agilidad
Siempre usas esa palabra, y no creo que signifique lo que tú crees.
…
347/402
Está claro que cualquiera que le venda algo que aumente la importancia
de las cosas de la derecha …
348/402
feedback y actuando en consecuencia, así que esta es nuestra receta para
trabajar de una manera ág…
349/402
Y esto dirige el diseño
En el tema 8, “La esencia del buen diseño”, afirmábamos que la medida
del…
350/402
ofrecerá una visión de cómo funcionan las cosas, pero, cuando baje a la planta, se encontrará con u…
351/402
9
Proyectos pragmáticos
Cuando el proyecto se pone en marcha, necesitamos alejarnos de las
cuest…
352/402
En Group L, Stoffel supervisa a seis programadores de primera categoría, un reto de gestión casi
c…
353/402
Sin ventanas rotas
La calidad es una cuestión de equipo. Incluso el desarrollador más
diligente p…
354/402
comprensión original. Tenga métricas sobre los nuevos requisitos.2 El
equipo no tiene por qué rech…
355/402
con prototipos. Apunte en la agenda tareas para probar cosas nuevas
y analizar resultados.
■ Apre…
356/402
pero eso da a su equipo una identidad sobre la que construir y al mundo
algo memorable para asocia…
357/402
Algunas metodologías abogan por utilizar todo tipo de roles y títulos
diferentes dentro del equipo…
358/402
usted de forma automática? ¿Por qué realizar pruebas manuales cuando la
construcción continua pued…
359/402
para ver qué diferencia ha marcado, tanto dentro del equipo como a
nivel externo.
■ Es probable q…
360/402
iteraciones de cuatro semanas que a menudo se convertían en iteraciones de
seis u ocho semanas. Le…
361/402
creciendo. Y dentro de unos años, cuando esas empresas maduren, pivoten
y sigan desarrollándose, e…
362/402
Por supuesto, el objetivo no es “hacer Scrum”, “hacer desarrollo ágil”,
“hacer Lean” o lo que sea.…
363/402
tema, “Kit pragmático básico”. El desarrollo se hace en el tronco principal
del sistema de control…
364/402
a prueba de tontos. Una persona siguiendo una lista de instrucciones podría
inundar el motor, pero…
365/402
despliegue también está en el control de versiones, así que el paso a
producción puede gestionarse…
366/402
gigantes devoradores de hombres con rapidez y pescar un tiburón es
bastante más difícil. Así pues,…
367/402
Pruebas de integración
Las pruebas de integración muestran que los subsistemas principales que
co…
368/402
Como no podemos escribir software perfecto, tampoco podemos escribir
software de pruebas perfecto.…
369/402
supongamos que tiene una función que toma dos enteros, cada uno de los
cuales puede ser un número …
370/402
Una vez que un probador humano encuentra un fallo, debería ser la
última vez que un probador human…
371/402
Está en el propio control de versiones, así que también podemos examinar
cambios en los procedimie…
372/402
52 Deleite a sus usuarios
Cuando cautivamos a las personas, el objetivo no es sacar dinero de ella…
373/402
■ Cuando tome decisiones, piense en qué ruta hacia delante se acerca
más a esas expectativas.
■ A…
374/402
53 Orgullo y prejuicio
Nos has deleitado ya bastante.
—Jane Austen, Orgullo y prejuicio
Los prog…
375/402
requiere prácticas adicionales, como la programación en pareja, para
proteger frente a los peligro…
376/402
9
 Recuerde siempre la "Entropía del software". Siempre.
10 http://www.extremeprogramming.org.
377/402
Posfacio
A la larga, damos forma a nuestras vidas y nos damos forma a nosotros mismos. El proceso …
378/402
sistemas vitales, desde centrales eléctricas a coches y equipos médicos.
Incluso un simple sistema…
379/402
termostato de la calefacción central automático el cliente seguirá teniendo
control manual? ¿Estoy…
380/402
Tenemos una vida asombrosa.
Truco 100. Es su vida.
Compártala. Celébrela. Constrúyala.
¡Y DIVIÉR…
381/402
Bibliografía
[ADSS18] Vard Antinyan, Jesper Derehag, Anna Sandberg, y Miroslaw Staron. “Mythical
…
382/402
symptoms, and the role of reassurance seeking”. Journal of Personality and
Social Psychology. 67(2…
383/402
Posibles respuestas a los ejercicios
Respuesta ejercicio 1
A nuestro entender, la clase Split2 es…
384/402
fallo en alguna otra parte más adelante en el flujo de transformaciones. Los
lenguajes con buenos …
385/402
manejadora.
lang/turtle.c
while (fgets(buff, sizeof(buff), stdin)) {
Command *cmd = findCommand(…
386/402
Respuesta ejercicio 5
En realidad, ya ha resuelto este problema en el ejercicio anterior, donde
h…
387/402
= “am” { return 0 }
/ “pm” { return 12*60 }
hour
= h:two_hour_digits { return h*60 }
/ h:digit …
388/402
“2:30pm”: pm(h(2)) + m(30),
}
test(‘time parsing’, function (t) {
for (const string in tests) {
…
389/402
Respuesta ejercicio 9
Nuestra respuesta debe formularse en varias asunciones:
■ El dispositivo de…
390/402
/**
* @invariant getSpeed() > 0
* implies isFull() // No poner en marcha vacía
*
* @invariant g…
391/402
■ No hemos especificado los tipos de a y b de manera intencionada.
La sobrecarga de operadores pod…
392/402
Una implementación simple podría ser:
event/strings_ex_1.rb
class FSM
def initialize(transitions…
393/402
requeriría que los sistemas a los que se va a notificar estuviesen
también basados en streams.
■ …
394/402
Esto da por hecho que tiene una pipeline para el manejo de errores.
Respuesta ejercicio 23
Vamos …
395/402
como en aplicaciones de visión artificial o transformaciones
complejas de distorsión de imágenes 3…
396/402
escribamos un código que le diga de forma específica que no lo haga. Así
pues, en este caso, la pr…
397/402
Respuesta ejercicio 28
Está claro que no podemos dar respuestas absolutas a este ejercicio. Sin
e…
398/402
Figura 1.
Respuesta ejercicio 30
Es probable que esto recuerde demasiado a una clase de matemátic…
399/402
Este es un buen uso de las pruebas basadas en propiedades. Las pruebas
unitarias pueden centrarse …
400/402
3. Esta afirmación no es un requisito, es arquitectura. Cuando se
enfrente a algo como esto, tiene…
401/402
Título de la obra original:
The Pragmatic Programmer: Your Journey to Mastery,
20th Anniversary E…
402/402


  • Previous
  • Next
  • f Fullscreen
  • esc Exit Fullscreen
@ProfGastonPerez

Share

El Programador Pragmático

Embed code

Report Inappropriate Content on Jaunt

Choose the reason you are reporting: El Programador Pragmático as inappropriate to Jaunt's content team.


Swipe LEFT
to view Related

Scroll DOWN
to read doc

We, and our third-party partners, use cookies, pixels, and other technologies (“cookies”) to collect, record, and share information you provide, as well as information about your interactions with, our site for ad targeting, analytics, personalization, and site functionality purposes. By clicking Allow All, you agree to the use of tracking technologies and acknowledge our privacy practices as described in our Privacy Notice.

Cookies to automatically collect, record, and share information about your interactions with our site for analytics purposes.
Cookies used to enable advertising on our site.

Login

OR

Forgot password?

Don't have an account? Sign Up