@javisan81 Me encantó el hilo! Pregunta, el contrato externo implica tbn el comportamiento externo? Si mi app depende en gran medida de un API de terceros, cuando/como me doy cuenta de un cambio de comportamiento inesperado?
Cuando digo que es más importante el refactor que el diseño inicial que has pensado, la gente no termina de creerme.
Así que hilo sobre diseño y refactoring. 🧵
Architecture testing can help you control technical debt.
Technical debt is the consequence of prioritizing development speed over well-designed code.
With architecture testing, you can control:
- Direction of dependencies
- Naming conventions
- Various design rules
Curious to learn more?
I wrote this in-depth guide that I think you'll enjoy: https://t.co/X6x7yXY3RO
Exceptions vs errors - What's the difference?
This has a major impact on how you design your application.
I have this firm belief: exceptions are for exceptional situations.
What does exceptional mean, then?
Exceptional: you reach a state in your application where you can't recover.
This is different from encountering an error.
Error: an expected failure state or precondition.
It makes no sense to use exceptions in place of errors.
Yet, many developers do this - proliferating exceptions everywhere.
This is how you end up using exceptions for flow control - an antipattern.
What's the solution?
Represent errors explicitly in your code and handle them.
Bonus: making errors explicit makes the intent of your code clear.
And there's a range of other benefits...
Learn more: https://t.co/3FrTmQeP7X
What advice would you give your younger software engineering self?
Some things that worked well for me or opportunities I'd wish I had:
- Keep building things. It doesn't matter if they're not million dollar product ideas. Build things to learn about how they work.
- Reinventing the wheel is one of the best ways to understand how something works and the complexity behind it. It might not be the best thing to chase in a production environment with paying customers, but great for learning.
- Learn in public. Document your journey so others can learn alongside you. Don't masquerade as an expert. Be humble and acknowledge that you're new and learning. Others will be more willing to help. Everyone has different opinions. Some people are more loud but it doesn't make them more correct. In fact, the louder people unwilling to listen to other perspectives are more often than not going to be less helpful.
- Software is built in teams, professionally. Prioritize collaboration opportunities.
- Inheritance gets pushed a LOT when teaching programming but if you gravitate towards using composition early then you'll "shortcut" a few years of really crappy code.
- Don't be afraid to learn new things. Building expertise can feel great, but don't let it make you feel so safe that new things feel scary. You're going to suck at new things but it's very temporary. You'll prove to yourself repeatedly that you eventually get working knowledge and feel very comfortable.
- You need to own your own career development.
- If you're at a job where you feel like you'd rather be slacking off and playing games or surfing the net, then you're at the wrong job. If you find something that excites you then you'll spend most of your working time feeling energized... Even if you're busy. Work sucks when you're bored, unchallenged, or disengaged.
- Managers are supposed to help you with your career growth. If your manager isn't doing that, ask them. If they don't change, don't expect much. But remember: you own your career.
- The video game that you wanted to build when you first started will probably never get finished. But you'll have more fun and learn more from trying than anything else. And that's because you were excited and passionate about it. Try and replicate that through your career.
- Helping teach others is one of the best ways to learn. You don't realize how well you (don't) know something until you try to explain it to someone with very little understanding.
Have fun, keep learning, and build awesome things to help make the world a better place.
What would you add or change?
"Rather than judging ideas through abstract theories, we should evaluate them by their real-world impact." Leído en el blog de @evrtrabajo. Echadle un vistazo si queréis conocer porque el pragmatismo forma parte implícitamente de XP
https://t.co/B6Ux1yYd0Z
Justo hoy, he pedido borrar la frase "somos un equipo agile" en una oferta porque creo que no aporta nada bueno.
En su lugar, he añadido "no usamos Scrum, Sprints ni Story points" y "valoramos a las personas sobre los procesos"
Business is not about planning. It's about delivering. There's a difference. And no, you don't need a detailed plan to build and deliver. You need goals.
@codurance_ES En mi organización estamos tratando de extender la colaboración (+6 equipos de +10 personas muy aislados). Estamos arrancando comunidades de prácticas, ¿debería tener una comunidad objetivos o solo buscar un espacio de colaboración? (gestión nos pide "measurable outputs")
@Sageniuz@unclebobmartin Love the resource!! A little bit difficult to indentify all the abbreviations, it looks clean but I wish I could read the full principle's title at a glance
𝗗𝗼 𝗬𝗼𝘂 𝗡𝗲𝗲𝗱 𝗧𝗼 𝗞𝗻𝗼𝘄 𝗔𝗹𝗹 𝗗𝗲𝘀𝗶𝗴𝗻 𝗣𝗮𝘁𝘁𝗲𝗿𝗻𝘀?
The answer is no. Even though we have 23 design patterns, around ten are mostly used in everyday development. Knowing which patterns exist overall is good, but you need to know these very well.
Design patterns can be divided into three main types:
𝟭. 𝗖𝗿𝗲𝗮𝘁𝗶𝗼𝗻𝗮𝗹 𝗣𝗮𝘁𝘁𝗲𝗿𝗻𝘀
These design patterns deal with object creation mechanisms, trying to create objects in a manner suitable to the situation.
Important patterns in this group are:
🔹𝗙𝗮𝗰𝘁𝗼𝗿𝘆: This pattern allows delegating the instantiation logic to factory classes. The Factory Method creates objects without exposing the instantiation logic to the client.
🔹𝗦𝗶𝗻𝗴𝗹𝗲𝘁𝗼𝗻: The Singleton pattern ensures that a class has only one instance and provides a global point of access to it. It's useful when exactly one object is needed to coordinate actions across the system.
𝟮. 𝗦𝘁𝗿𝘂𝗰𝘁𝘂𝗿𝗮𝗹 𝗣𝗮𝘁𝘁𝗲𝗿𝗻𝘀
These patterns deal with the composition of classes and objects which form larger structures.
Important patterns in this group are:
🔹𝗔𝗱𝗮𝗽𝘁𝗲𝗿: This pattern works as a bridge between two incompatible interfaces. It wraps an existing class with a new interface to become compatible with the client's interface.
🔹𝗙𝗮𝗰𝗮𝗱𝗲: The Façade pattern provides a unified interface to a set of interfaces in a subsystem. Façade defines a higher-level interface that makes the subsystem easier to use.
🔹𝗗𝗲𝗰𝗼𝗿𝗮𝘁𝗼𝗿: This pattern dynamically adds/overrides behavior in an existing method of an object. This pattern provides a flexible alternative to subclassing for extending functionality.
🔹𝗣𝗿𝗼𝘅𝘆: The Proxy pattern provides a surrogate or placeholder for another object to control access to it. In its most general form, a proxy is a class functioning as an interface to something else.
𝟯. 𝗕𝗲𝗵𝗮𝘃𝗶𝗼𝗿𝗮𝗹 𝗣𝗮𝘁𝘁𝗲𝗿𝗻𝘀
These patterns are specifically concerned with communication between objects and how they interact and distribute work.
Important patterns in this group are:
🔹𝗖𝗼𝗺𝗺𝗮𝗻𝗱: The Command pattern encapsulates a request as an object, thus allowing users to parameterize clients with queues, requests, and operations.
🔹𝗧𝗲𝗺𝗽𝗹𝗮𝘁𝗲 𝗠𝗲𝘁𝗵𝗼𝗱: This pattern defines the program skeleton of an algorithm in a method called template method, which defers some steps to subclasses.
🔹𝗦𝘁𝗿𝗮𝘁𝗲𝗴𝘆: The Strategy pattern defines a family of algorithms, encapsulates each one, and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
🔹𝗢𝗯𝘀𝗲𝗿𝘃𝗲𝗿: This pattern defines a one-to-many dependency between objects so that all its dependents are notified and updated automatically when one object changes state.
#technology #softwareengineering #programming #techworldwithmilan #developers
A few quotes on metrics:
"Tell me how you measure me, and I will tell you how I will behave." -Goldratt
"It is wrong to suppose that if you can’t measure it, you can’t manage it – a costly myth.” (Deming [The New Economics])`
“You can only measure three percent of what matters” (Deming, quoted by Peter Senge)
"Eliminate management by objective. Eliminate management by numbers, numerical goals. Substitute leadership." (Deming's "Fourteen Points for Management" from 'Out of the Crisis', 1982)
"What gets measured gets managed - even when it’s pointless to measure and manage it, and even if it harms the purpose of the organization to do so." (attributed to Drucker)
“Managers who don’t know how to measure what they want settle for wanting what they can measure.” - Russell Ackoff
Goodhart's law: "When a measure becomes a target, it ceases to be a good measure".
I don't post on Reddit, but I wanted to say something about this topic.
I've been exactly where you are, and feeling this way is normal.
It's the main reason why I started making YouTube videos. My idea was to make videos about topics I enjoy (.NET, software architecture, etc.) but that I struggled to grasp a few years prior. So, I was speaking to the younger me in every video.
Try this:
1) Pick one new concept (e.g., clean architecture) and implement it in a small project.
2) Try refactoring a small part of your legacy code using the concept you just learned.
3) Rinse and repeat until you figure it out (you will).
Also, I always considered "feeling dumb" a good sign. It means I have something to learn. It's when I get too comfortable that I become worried because it means I probably stopped growing. What I'd do in situations like this is find a new challenge: a new project, additional responsibility, even changing companies.
Keep at it. You're on the right track.