7 RECURSOS para programadores. ¡Sin coste!
① Mejora tu lógica de programación en cualquier lenguaje
→ exercism․org
② +1500 APIs para tu próximo proyecto
→ publicapis․dev
③ Iconos de empresas y productos en SVG
→ svgl․app
④ Transforma JSON a C, C++, PHP, TypeScript y Python
→ quicktype․io
⑤ Colección de chuletas para desarrolladores
→ overapi․com
⑥ Gradientes bonitos para tu página web o app
→ uigradients․com
⑦ Mejores combinaciones de fuentes del sistema
→ modernfontstacks․com
¡Añade tu recurso favorito en los comentarios!
Bolívar Escobar San Lucas,miembro del Directorio de Fedeguayas en marzo/24 es ahora Subsecretario/Viceministro de Deportes. Como coordinador zonal,aprobó ese directorio del cual era parte? Y hay más…sigan nomás desalojando niñas patinadoras. Valientes.
𝗪𝗵𝗮𝘁 𝗶𝘀 𝗦𝗲𝗺𝗮𝗻𝘁𝗶𝗰 𝗩𝗲𝗿𝘀𝗶𝗼𝗻𝗶𝗻𝗴?
Semantic versioning, often abbreviated as SemVer, is a scheme for using meaningful version numbers for software releases. Various software systems and libraries adopt it to convey meaning about the underlying changes with each new release.
Semantic versioning is expressed as three numbers separated by dots: X.Y.Z. (e.g. 5.1.2)
Each of these numbers has a specific meaning:
𝟭. 𝗠𝗮𝗷𝗼𝗿 𝘃𝗲𝗿𝘀𝗶𝗼𝗻 (𝗫): This number is incremented for major changes that are not backward compatible. It often involves API changes or features that transform the software and must users to change something about their setup.
𝟮. 𝗠𝗶𝗻𝗼𝗿 𝘃𝗲𝗿𝘀𝗶𝗼𝗻 (𝗬): This number is incremented for minor changes that are backward compatible. For instance, adding new features in a backward-compatible manner would warrant a bump in the minor version.
𝟯. 𝗣𝗮𝘁𝗰𝗵 𝘃𝗲𝗿𝘀𝗶𝗼𝗻 (𝗭): This number is incremented for backward-compatible bug fixes that resolve issues that do not affect the software's functionality or features.
Also to the major, minor, and patch levels, pre-release versions and build metadata are available for use.
We use it together with Git, so before every release, we use Git tag to mark our version (e.g., v1.5.2). Also, we use tools in our build process that enable the auto-bump of versions based on commit messages.
Semantic versioning helps software developers, and users understand the nature and impact of the updates by looking at the version number. It also helps in version control and ensuring compatibility between different components of a software ecosystem.
#programming
Quite a lot of the tasks modern-day systems are required to do are in response to changes in state.
Adding an item to a shopping cart, liking a post, and paying a bill are all state changes that trigger a set of tasks in their respective systems.
This requirement has paved the way for a popular approach to system architecture known as event-driven architecture (EDA).
Event-driven architecture has four main components:
𝟭) 𝗘𝘃𝗲𝗻𝘁𝘀
These are significant changes in state. For example, a user signing up to a trial might be an event in a SaaS product. They're generally immutable, typically lightweight and can carry a payload containing information about the change in state.
𝟮) 𝗣𝗿𝗼𝗱𝘂𝗰𝗲𝗿𝘀
The role of a producer is to detect or cause a change in state, and then generate an event that represents this change. The change can be initiated by a variety of sources such as system processes, user interactions, and external triggers.
𝟯) 𝗖𝗼𝗻𝘀𝘂𝗺𝗲𝗿𝘀
Consumers are the entities that are interested in and react to events. They subscribe to specific types of events and execute when those events occur.
𝟰) 𝗖𝗵𝗮𝗻𝗻𝗲𝗹𝘀
Meanwhile, channels facilitate sending events between producers and consumers.
Advantages of EDA:
🟢 Decoupling: Producers and consumers operate independently, enhancing system flexibility and maintainability.
🟢 Scalability: EDA can efficiently handle a surge in events, making it suitable for systems with varying loads.
🟢 Real-time responsiveness: Systems can react immediately to state changes, enhancing user experience and system reliability.
🟢 Resilience: Failures in one component don't necessarily cascade through the system, thanks to the buffering capabilities of many channels.
Use cases:
🔸 IoT systems: Devices and sensors in IoT setups generate a plethora of events that EDA can efficiently manage.
🔸 Microservices: EDA facilitates communication between decoupled microservices, ensuring smooth system operations.
🔸 Real-time analytics: Immediate processing and analysis of data as it's generated is a forte of EDA.
Disadvantages:
🔴 Complexity: Tracing and debugging issues in an event-driven system can be more challenging than in traditional architectures.
🔴 Event order: Ensuring events are processed in the correct sequence, especially in distributed setups, can be tricky.
🔴 Potential overhead: Introducing a message broker or channel can add latency, especially if not optimized.
While EDA offers a robust framework for building dynamic, responsive systems, it's essential to consider its potential pitfalls. Like any architecture, it works best when applied thoughtfully to the right scenarios.
~~
A big thank you to our partner Postman who keeps our content free to the community.
Postman v11 just got released, and with it a bunch of awesome new features. Check it out: https://t.co/zejco4efMz
How do we design effective and safe APIs?
APIs have increasingly become the backbone of modern software.
𝗧𝗼 𝘂𝗻𝗱𝗲𝗿𝘀𝘁𝗮𝗻𝗱 some of the 𝗸𝗲𝘆 𝗽𝗿𝗶𝗻𝗰𝗶𝗽𝗹𝗲𝘀 and 𝗯𝗲𝘀𝘁 𝗽𝗿𝗮𝗰𝘁𝗶𝗰𝗲𝘀 𝗼𝗳 𝗔𝗣𝗜 𝗱𝗲𝘀𝗶𝗴𝗻, Let's 𝗮𝗻𝗮𝗹𝘆𝘇𝗲 𝗮 𝘀𝗼𝗰𝗶𝗮𝗹 𝗺𝗲𝗱𝗶𝗮 𝗽𝗹𝗮𝘁𝗳𝗼𝗿𝗺 𝗲𝘅𝗮𝗺𝗽𝗹𝗲:
🔹 𝗥𝗲𝘀𝗼𝘂𝗿𝗰𝗲 𝗻𝗮𝗺𝗶𝗻𝗴
Clarity is key when creating APIs.
Adopting simple resource names, like /users for accessing user profiles and /posts for retrieving user posts, streamlines the development process and reduces mental strain.
🔹 𝗨𝘀𝗲 𝗼𝗳 𝗽𝗹𝘂𝗿𝗮𝗹𝘀
It's important to maintain a standard of consistency in API design.
For consistency and readability, use plural resource names, such as GET /users/{userId}/friends vs. /friend), to avoid ambiguity in API requests.
🔹 𝗖𝗿𝗼𝘀𝘀-𝗿𝗲𝗳𝗲𝗿𝗲𝗻𝗰𝗶𝗻𝗴 𝗿𝗲𝘀𝗼𝘂𝗿𝗰𝗲𝘀
Interlinking resources, like taking comments on a post using GET /posts/{postId}/comments, simplifies the retrieval of related data.
It provides a more streamlined and well-organized user experience.
🔹 𝗦𝗲𝗰𝘂𝗿𝗶𝘁𝘆
It goes without saying, security is a must-have.
To secure the API endpoints, employ authentication methods like X-AUTH-TOKEN and X-SIGNATURE, and use authorization headers for verifying user permissions.
Learn more about API security here: https://t.co/iAVl6VRmoI
🔹 𝗩𝗲𝗿𝘀𝗶𝗼𝗻𝗶𝗻𝗴
Using versioning and communicating version updates is another important practice.
Endpoints like GET /v2/users/{userId}/posts allow API versioning to maintain functionality regardless of updates.
This approach ensures backward compatibility and a smooth transition for users and us.
Learn more about API versioning here: https://t.co/JwVRzZArr2
🔹 𝗣𝗮𝗴𝗶𝗻𝗮𝘁𝗶𝗼𝗻
This technique is important for performance.
Paginate large datasets, like feeds or comment lists, with GET /posts?page=5&pageSize=20 to enhance data delivery and UX.
🔹 𝗜𝗱𝗲𝗺𝗽𝗼𝘁𝗲𝗻𝗰𝘆
Maintaining API reliability is necessary.
Idempotency ensures that operations like profile updates (PUT /users/{userId}/profile) achieve their intended result, regardless of how often they are executed.
These practices are very important, but there’s still much more to API design.
Learn more about API design here: https://t.co/Z9FLjyzV53
Thorough documentation, powerful monitoring and logging, and consistent error handling are just a few more of the many essential habits required for designing effective and safe APIs.
Adopting these principles and practices enables us to develop secure and performant APIs that deliver good user experiences.
~~~
📩 If you found this helpful, I write an email every Thursday to help you level up your engineering and system design skills. Sign up here: https://t.co/T4o0O5mWsA
A big thank you to our partner Postman who keeps our content free to the community.
LA EVOLUCIÓN DEL ALFABETO:
El alfabeto tiene sus raíces en el protosinaítico, el primer sistema de escritura semítica derivado de jeroglíficos egipcios alrededor de 1800 a.C. Influyó en lenguas semíticas y dio paso al alfabeto fenicio, precursor del árabe, cirílico, hebreo y griego.
La escritura griega arcaica surgió en 750 a.C., influyendo en el latín, que evolucionó hacia el alfabeto romano en el 1 d.C. Muchas letras del inglés moderno provienen de este viaje complejo.
La evolución incluyó formas múltiples y algunas letras abandonadas. Las minúsculas derivan de la cursiva romana, pasando por insular y carolingia antes de llegar al actual.
¡GitHub ha lanzado CERTIFICADOS oficiales!
Hay 4 disponibles en distintas especialidades:
https://t.co/CkVEMKy9Yg
Tienen rutas de estudio gratuitas de cada una.
Te dejo el enlace en el siguiente post ↓
How do companies ship code to production?
The diagram below illustrates the typical workflow.
Step 1: The process starts with a product owner creating user stories based on requirements.
Step 2: The dev team picks up the user stories from the backlog and puts them into a sprint for a two-week dev cycle.
Step 3: The developers commit source code into the code repository Git.
Step 4: A build is triggered in Jenkins. The source code must pass unit tests, code coverage threshold, and gates in SonarQube.
Step 5: Once the build is successful, the build is stored in artifactory. Then the build is deployed into the dev environment.
Step 6: There might be multiple dev teams working on different features. The features need to be tested independently, so they are deployed to QA1 and QA2.
Step 7: The QA team picks up the new QA environments and performs QA testing, regression testing, and performance testing.
Steps 8: Once the QA builds pass the QA team’s verification, they are deployed to the UAT environment.
Step 9: If the UAT testing is successful, the builds become release candidates and will be deployed to the production environment on schedule.
Step 10: SRE (Site Reliability Engineering) team is responsible for prod monitoring.
--
Subscribe to our weekly newsletter to get a Free System Design PDF (158 pages): https://t.co/uc5M7CdXXC
Best ways to test system functionality
Testing system functionality is a crucial step in software development and engineering processes.
It ensures that a system or software application performs as expected, meets user requirements, and operates reliably.
Here we delve into the best ways:
1. Unit Testing: Ensures individual code components work correctly in isolation.
2. Integration Testing: Verifies that different system parts function seamlessly together.
3. System Testing: Assesses the entire system's compliance with user requirements and performance.
4. Load Testing: Tests a system's ability to handle high workloads and identifies performance issues.
5. Error Testing: Evaluates how the software handles invalid inputs and error conditions.
6. Test Automation: Automates test case execution for efficiency, repeatability, and error reduction.
Over to you: How do you approach testing system functionality in your software development or engineering projects?
–
Subscribe to our weekly newsletter to get a Free System Design PDF (158 pages): https://t.co/uc5M7CdXXC