As engineering, product, design, DS, etc. melt into a new kind of role, I was reflecting on what roles might look like in the future. For example, when I look at the Claude Code team I see what I think is five archetypes:
1. Prototyper: comes up with brand new ideas; churns out many ideas, most of which don't ship
2. Builder: quickly turns a prototype/idea into production-grade product/infra
3. Sweeper: cleans up the UI, simplifies the code and system, unships, optimizes performance
4. Grower: takes a product that has been built and iterates on it to improve Product-Market Fit
5. Maintainer: owns a mature system to make it secure, reliable, fast, and efficient as it scales
Many people span across 2 roles, and sometimes 3 roles. I also notice that these roles are not really tied to job function -- eg. across Anthropic, some designers match category 1, some 2, some 3; same for engineers, PM, DS.
A healthy team needs a mix of these, depending on the product:
- A product that is new and pre-PMF needs people that are strong at 1+2+3
- A product that is growing and has found PMF needs 2+3+4 and some 5
- A product that has strong PMF needs 3+4+5 and some 2
Maybe product roles of the future will look more like this, and less like the domain-specific roles of today?
๐ง๐ต๐ฒ ๐ ๐ผ๐๐ ๐๐ฒ๐บ๐ฎ๐ป๐ฑ๐ฒ๐ฑ ๐๐ฟ๐ผ๐ป๐๐ฒ๐ป๐ฑ ๐๐ฟ๐ฎ๐บ๐ฒ๐๐ผ๐ฟ๐ธ๐ ๐ถ๐ป ๐ฎ๐ฌ๐ฎ๐ฏ.
Recently, DevJobsScanner shared which frontend frameworks were in greater demand and which were best paid by analyzing actual job offers. They studied about ~500K jobs from 1 November 2022 to 31 December 2024 from different sources (LinkedIn, Glassdoor, Dice, etc.).
Here are the results:
1. ๐ฅ๐ฒ๐ฎ๐ฐ๐ is the most demanded frontend framework with 225k job offers
2. ๐๐ป๐ด๐๐น๐ฎ๐ฟ is in second place with 172k offers.
3. ๐ฉ๐๐ฒ is in the third place with 48k offers
All others had less than 7.2K (Svelte, Solid.js, Alpine, Backbone, ...).
Looking at the trends during this period, ๐๐ป๐ด๐๐น๐ฎ๐ฟ ๐ฎ๐ป๐ฑ ๐ฅ๐ฒ๐ฎ๐ฐ๐ ๐๐ฒ๐ฟ๐ฒ ๐พ๐๐ถ๐๐ฒ ๐ฐ๐น๐ผ๐๐ฒ ๐๐ผ ๐ฒ๐ฎ๐ฐ๐ต ๐ผ๐๐ต๐ฒ๐ฟ ๐บ๐ผ๐ป๐๐ต ๐ฏ๐ ๐บ๐ผ๐ป๐๐ต. Suppose we compare it to 2022, where Angular was less in demand than React in 2023. they come closer.
Regarding the ๐ท๐ผ๐ฏ ๐ฑ๐ฒ๐บ๐ฎ๐ป๐ฑ ๐ณ๐ผ๐ฟ ๐๐ต๐ฒ๐๐ฒ ๐ณ๐ฟ๐ฎ๐บ๐ฒ๐๐ผ๐ฟ๐ธ๐ ๐ฝ๐ฒ๐ฟ ๐ฐ๐ผ๐๐ป๐๐ฟ๐, React dominates most countries. Still, some European countries, such as Switzerland, France, Spain, and Italy, have more job opportunities for Angular than React. In Switzerland, Angular jobs represent 65% of the frontend jobs. While in Belgium, 59% of frontend job listings require Vue expertise.
Comparing ๐๐ฎ๐น๐ฎ๐ฟ๐ถ๐ฒ๐ for each one, the highest-paid frontend framework is React, with an average yearly pay of $116k. With annual earnings of $110k and $107k, respectively, Angular and Vue are ranked second and third.
Check the entire text in the comments.
Image: DevJobsScanner
#technology #softwareengineering #coding #techworldwithmilan #frontend
How SQL injections work, and how to protect your system from them.
SQL injection is a type of attack where the attacker runs damaging SQL commands by inserting malicious SQL code into an application input field or URL.
For example, imagine an app that returns all your information after logging in. That query may look like the following:
SELECT * FROM users
WHERE username = 'USER_INPUT';
If an attacker were to submit a malicious input, the query could change to the following:
SELECT * FROM users
WHERE username = '' OR '1'='1';
This query will return all users as '1'='1' will always return true.
๐ฌ๐ผ๐ ๐ฐ๐ฎ๐ป ๐ฝ๐ฟ๐ผ๐๐ฒ๐ฐ๐ ๐๐ผ๐๐ฟ ๐๐๐๐๐ฒ๐บ ๐ณ๐ฟ๐ผ๐บ ๐ฆ๐ค๐ ๐ถ๐ป๐ท๐ฒ๐ฐ๐๐ถ๐ผ๐ป ๐ฏ๐ ๐ฑ๐ผ๐ถ๐ป๐ด ๐๐ต๐ฒ ๐ณ๐ผ๐น๐น๐ผ๐๐ถ๐ป๐ด:
๐ญ. ๐จ๐๐ฒ ๐ฝ๐ฟ๐ฒ๐ฝ๐ฎ๐ฟ๐ฒ๐ฑ ๐๐๐ฎ๐๐ฒ๐บ๐ฒ๐ป๐๐ ๐ผ๐ฟ ๐ฝ๐ฎ๐ฟ๐ฎ๐บ๐ฒ๐๐ฒ๐ฟ๐ถ๐๐ฒ๐ฑ ๐พ๐๐ฒ๐ฟ๐ถ๐ฒ๐
User input cannot be executed because prepared statements and parameterized queries ensure a distinct separation between user input and SQL code.
๐ฎ. ๐ฉ๐ฎ๐น๐ถ๐ฑ๐ฎ๐๐ฒ ๐ฎ๐ป๐ฑ ๐ฐ๐น๐ฒ๐ฎ๐ป ๐ถ๐ป๐ฝ๐๐๐
Use expected formats and constraints to validate user input, and clean inputs to get rid of characters that may be interpreted as SQL code.
๐ฏ. ๐๐ผ๐น๐น๐ผ๐ ๐๐ต๐ฒ ๐น๐ฒ๐ฎ๐๐ ๐ฝ๐ฟ๐ถ๐๐ถ๐น๐ฒ๐ด๐ฒ ๐ฝ๐ฟ๐ถ๐ป๐ฐ๐ถ๐ฝ๐น๐ฒ
Limit the permissions for database accounts used by applications and services to only what is required for their functionality. This limits the system's vulnerability to SQL injection attacks.
๐ฐ)ย ๐ฆ๐ฒ๐ ๐ช๐ฒ๐ฏ ๐๐ฝ๐ฝ๐น๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป ๐๐ถ๐ฟ๐ฒ๐๐ฎ๐น๐น๐ (๐ช๐๐)
By setting up WAFs, common threats and attacks from HTTP/S traffic like SQL injections can be identified and blocked before they ever reach your application.
Learn more about API security here: https://t.co/nAmhUfSNvV
~~~
A big thank you to our partner Postman who keeps our content free to the community.
๐ฉย If you found this helpful, consider subscribing to our newsletter where we help you level up your engineering and system design skills: https://t.co/076cpzUaQo
๐ช๐ต๐ ๐ฑ๐ผ๐ฒ๐ ๐๐ผ๐ผ๐ด๐น๐ฒ ๐ฟ๐ฒ๐ฐ๐ผ๐บ๐บ๐ฒ๐ป๐ฑ ๐ ๐ผ๐ฑ๐๐น๐ฎ๐ฟ ๐ ๐ผ๐ป๐ผ๐น๐ถ๐๐ต๐ ๐ถ๐ป๐๐๐ฒ๐ฎ๐ฑ ๐ผ๐ณ ๐ ๐ถ๐ฐ๐ฟ๐ผ๐๐ฒ๐ฟ๐๐ถ๐ฐ๐ฒ๐?
In the last decade, we have seen a massive trend of using microservices everywhere. We were building systems for a few hundred or thousand users and wanted to know how to make a system for millions of users. This was over-engineering and needed to be corrected. Why it was wrong? Because the development lasted long and we created incredibly complex systems, hard to maintain. This is especially true for startups that must go fast and stay simple.
A recent paper by authors from Google found that most of their developers split binaries for one of the following reasons: it improves performance, fault tolerance, and abstraction boundaries and allows for flexible rollouts.
Yet, splitting applications into microservices has its challenges:
๐ธ ๐๐ ๐ต๐๐ฟ๐๐ ๐ฝ๐ฒ๐ฟ๐ณ๐ผ๐ฟ๐บ๐ฎ๐ป๐ฐ๐ฒ. The overhead of serializing data and sending it across the network is increasingly becoming a bottleneck
๐ธ ๐๐ ๐ต๐๐ฟ๐๐ ๐ฐ๐ผ๐ฟ๐ฟ๐ฒ๐ฐ๐๐ป๐ฒ๐๐. It is incredibly challenging to reason about the interactions between every deployed version of every microservice.
๐ธ ๐๐ ๐๐ฎ๐ธ๐ฒ๐ ๐๐ผ๐ฟ๐ธ ๐๐ผ ๐บ๐ฎ๐ป๐ฎ๐ด๐ฒ. Rather than having a single bi-nary to build, test, and deploy, developers must manage ๐ different binaries, each on their release schedule.
๐ธ ๐๐ ๐ณ๐ฟ๐ฒ๐ฒ๐๐ฒ๐ ๐๐ฃ๐๐. Once a microservice establishes an API, it becomes easier to change by breaking the other services that consume the API.
So, they proposed the following approach:
๐ญ. ๐ช๐ฟ๐ถ๐๐ฒ ๐บ๐ผ๐ป๐ผ๐น๐ถ๐๐ต๐ถ๐ฐ ๐ฎ๐ฝ๐ฝ๐น๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป๐ that are modularized into logically distinct components. A component is a long-lived agent, similar to an actor.
๐ฎ. ๐๐ฒ๐๐ฒ๐ฟ๐ฎ๐ด๐ฒ ๐ฎ ๐ฟ๐๐ป๐๐ถ๐บ๐ฒ ๐๐ผ ๐ฑ๐๐ป๐ฎ๐บ๐ถ๐ฐ๐ฎ๐น๐น๐ and automatically assign logistical components to physical processes based on execution characteristics. So, if both components are in the same OS process, they are called regular method calls, but if they are co-located, calls are executed as RPCs over the network. Runtime decides whether these modules should be collocated or moved to different machines (and scaled, etc.).
๐ฏ. ๐๐ฒ๐ฝ๐น๐ผ๐ ๐ฎ๐ฝ๐ฝ๐น๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป๐ ๐ฎ๐๐ผ๐บ๐ถ๐ฐ๐ฎ๐น๐น๐, preventing different versions of an application from interacting.
This approach consists of two main parts: a programming model with abstraction that allows developers to write modularized applications and a runtime for building, deploying, and optimizing these applications. They claim that it reduces application latency by up to 15x and costs by up to 9x by simplifying application management and deployment.
If you want to check the framework implementing the approach from the paper, check https:// serviceweaver. dev/.
What do you think about this approach? Does it look like EJBs or CORBA?
#microservices
Problem: Your code base probably contains a lot of copy/pasted code, but it's hard to find.
Solution: jscpd
jscpd is a command line tool that finds copy/pasted code and reports specific duplicated lines.
Works for over 150 languages.
Example report:
๐ค Wrote a .NET Aspire solution that exposes a Weather API to several client apps @angular, @reactjs, and @vuejs:
โก They're based on templates via "npm create x@latest" where 'x' is either, reactapp, vue or @angularโwith table UX.
#dotnet#dotnetaspire#javascript#nodejs
Load Balancer vs Reverse Proxy โ What's the Difference?
Modern applications and websites handle large amounts of traffic. Two of the main instruments to ensure the smooth operation of large-scale systems are load balancers and reverse proxies.
However, they approach traffic management in slightly different ways:
๐๐ผ๐ฎ๐ฑ ๐ฏ๐ฎ๐น๐ฎ๐ป๐ฐ๐ฒ๐ฟ๐ are concerned with routing client requests across multiple servers to ๐ฑ๐ถ๐๐๐ฟ๐ถ๐ฏ๐๐๐ฒ ๐น๐ผ๐ฎ๐ฑ and ๐ฝ๐ฟ๐ฒ๐๐ฒ๐ป๐ ๐ฏ๐ผ๐๐๐น๐ฒ๐ป๐ฒ๐ฐ๐ธ๐. This helps maximize throughput, reduce response time, and optimize resource use.
๐๐ผ๐ฎ๐ฑ ๐ฏ๐ฎ๐น๐ฎ๐ป๐ฐ๐ฒ๐ฟ ๐ถ๐ป ๐ฎ๐ฐ๐๐ถ๐ผ๐ป:
๐ญ) Client requests are sent to the load balancer instead of directly to the server(s) hosting the application.
๐ฎ) A server is chosen from the load balancer's list using a predetermined algorithm.
๐ฏ) The request is forwarded to the selected server.
๐ฐ) The server processes the requests and sends the response back to the load balancer.
๐ฑ) The load balancer forwards the response to the client.
A ๐ฟ๐ฒ๐๐ฒ๐ฟ๐๐ฒ ๐ฝ๐ฟ๐ผ๐ ๐ is a server that sits between external clients and internal applications. While reverse proxies can distribute load as a load balancer would, they provide advanced features like SSL termination, caching, and security. Reverse proxies are ๐บ๐ผ๐ฟ๐ฒ ๐ฐ๐ผ๐ป๐ฐ๐ฒ๐ฟ๐ป๐ฒ๐ฑ ๐๐ถ๐๐ต ๐น๐ถ๐บ๐ถ๐๐ถ๐ป๐ด ๐ฎ๐ป๐ฑ ๐๐ฎ๐ณ๐ฒ๐ด๐๐ฎ๐ฟ๐ฑ๐ถ๐ป๐ด ๐๐ฒ๐ฟ๐๐ฒ๐ฟ ๐ฎ๐ฐ๐ฐ๐ฒ๐๐.
Whilst load balancers and reverse proxies possess distinct functionalities, in practice the lines can blur, as many tools act as both a load balancer and reverse proxy. For example, tools like Nginx can perform both roles depending on their configuration.
The main components of Docker explained.
Building and deploying applications has its complexities. Software inconsistencies across different environments lead to significant issues including deployment failures, increased development and testing complexity, and more.
Docker solves the "it worked on my machine" problem, and streamlines application deployment by encapsulating applications and their dependencies into standardized, scalable, and isolated containers (containerization).
Docker has a handful of core components powering the technology. By understanding them you will have a strong fundamental understanding โ Let's dive in!
Images:
Read-only templates that are used to build containers. Images are created with Dockerfile instructions or can be downloaded from a Docker registry like Docker Hub.
Container
An instance of an image. It's a lightweight, standalone package that includes everything needed to run an application.
Dokcerfile
A script-like file that defines the steps to create a Docker image.
Docker engine:
The Docker engine is responsible for running and managing containers. It's composed of the Docker daemon and the Docker CLI that communicates through REST API.
Docker daemon:
The daemon is a persistent background service responsible for managing objects. It does so via listening for API requests. Docker objects include images, containers, networks, and storage volumes.
Docker registry:
Are repositories where Docker images are stored and can be distributed from. Docker registries can be public or private. Docker Hub is the default public registry that Docker is configured with.
Docker network:
Containers run on networks allowing them to communicate with each other and the outside world. The network provides the communication gateway between containers running on the same or different hosts.
Volumes:
Allow data to persist outside of a container and to be shared between container instances, even after a container is deleted. Volumes decouple data life from the container lifecycle.
The components listed above all tie together to produce a simple system for developers to automate the deployment, scaling, and management of applications. This has led Docker to become a powerful and integral tool in modern software development.
Clean Architecture explained.
โ What is Clean Architecture
โ The anatomy of Clean Architecture
โ Advantages & drawbacks
โ Use cases
Tomorrow thousands of subscribers will learn all about Clean Architecture.
Join us to get the issue: https://t.co/GnJOJZKqok
SOLID principles explained.
SOLID represents five principles of object-oriented programming. Whether or not you use OOP, knowing these principles gives you a lens into the foundations of clean code which can be applied to many areas of programming.
S โ Single Responsibility Principle
O โ Open/Closed Principle
L โ Liskov Substitution Principle
I โ Interface Segregation Principle
D โ Dependency Inversion Principle
Letโs break down each principle:
1. Single Responsibility Principle (SRP)
Each unit of code should only have one job or responsibility. A unit can be a class, module, function, or component. This keeps code modular and removes the risk of tight coupling.
2. Open-Closed Principle (OCP)
Units of code should be open for extension but closed for modification. You should be able to extend functionality with additional code rather than modifying existing ones. This principle can be applied to component-based systems such as a React frontend.
3. Liskov Substitution Principle (LSP)
You should be able to substitute objects of a base class with objects of its subclass without altering the โcorrectnessโ of the program.
An example of this is with a Bird base class. You might assume that it should have a โflyโ method. But what about the birds that canโt fly? Like a Penguin. In this example, having a โflyโ method in the Bird class would violate LSP.
4. Interface Segregation Principle (ISP)
Provide multiple interfaces with specific responsibilities rather than a small set of general-purpose interfaces. Clients shouldnโt need to know about the methods & properties that don't relate to their use case.
Complexity โ
Code flexibility โ
5. Dependency Inversion Principle (DIP)
You should depend on abstractions, not on concrete classes. Use abstractions to decouple dependencies between different parts of the systems. Direct calls between units of code shouldnโt be done, instead interfaces or abstractions should be used.
REST vs GraphQL.
โ How REST and GraphQL work
โ The benefits and drawbacks of each
โ A comparison between the two
โ Where each shines best
Tomorrow thousands of subscribers will learn about REST and GraphQL.
Join us to get the issue: https://t.co/GnJOJZKqok
GraphQL vs REST.
We just released an article in our weekly newsletter breaking down;
โ How GraphQL and REST work
โ The benefits and drawbacks of each
โ A comparison between the two
โ Where each shines best
Missed the issue? Check it out here: https://t.co/t93AqikFEf
Monolithic vs Microservices Architecture - Which is Best?
Before we start, why should you care? System design decisions are important because itโs hard to reverse. Careful consideration is needed to ensure youโre meeting your system's requirements.
Monolithic vs microservices is an instance of this.
Monolithic is a software design pattern where all application components are combined into a single, tightly-coupled, unified application.
Whereas in a microservices design, components of an application are structured as a collection of loosely coupled, independently deployable services. Each service corresponds to a specific business functionality.
E.g, say we have a social media platform with the following functions:
๐ธUser management
๐ธContent creation & management
๐ธInteractions
๐ธNotifications
๐ธMessaging
In a monolithic architecture, all of the business functions mentioned above exist & are deployed as a single unit. With all data housed in the same database.
In a microservices architecture, each of the business functionalities listed above is treated as a single unit with its own database. An API Gateway routes requests to services, aggregates responses, and more. A centralized management service handles load balancing, failure recovery, configuration, and more.
Monolithic pros:
โ Simplicity: easier to develop, test, & deploy an app as a single unit
โ Performance: Can be faster due to shared memory access & no network latency
โ Unified process: Everything happens in the same place & process โ easier data management.
Monolithic cons:
โ Scalability: Minimal flexibility as everything scales together even if just one component needs it.
โ Deployment risk: Every change requires an entire deployment. Because every component is interconnected, a bug in one area can bring the entire application down.
โ Technology lock-in: The application is often restricted to one tech stack
Microservices pros:
โ Independent deployment: Each service can be deployed, scaled, upgraded, & restarted independently
โ Resilience: The impact if one service fails is limited to that service & its consumers โ reduced blast radius
โ Flexibility: Choice of optimal tech stack for each service
Microservice cons:
โ Complexity: added complexities such as inter-service communication, data consistency, and more
โ Data management: keeping data consistent across services can be challenging
โ Operational overhead: Increased complexity of monitoring, deployment, logging, and more
So, which should you choose?
Monolithic is best for:
๐นSmaller scale applications
๐นApps that require simple deployment and development
๐นFast and reliable communication between components is required
๐นApps that need atomic transactions
Microservices are best for:
๐ธLarger scale systems
๐ธSimpler management of development & deployment between teams
๐ธFuture scalability is required
๐ธApps that need fault isolation
HTTP vs HTTPS โ Whatโs the Difference?
HTTP โ Hypertext Transfer Protocol.
HTTPS โ Hypertext Transfer Protocol Secure.
Here are the key differences between the two:
The primary difference between these two protocols is ๐๐ฒ๐ฐ๐๐ฟ๐ถ๐๐.
๐๐ง๐ง๐ฃ ๐ถ๐ ๐ป๐ผ๐ ๐๐ฒ๐ฐ๐๐ฟ๐ฒ. Data exchanged between your browser and the site you're visiting is in plain text (unencrypted). If someone intercepts this transmission, they can read and manipulate the data.
๐๐ง๐ง๐ฃ๐ฆ ๐ถ๐ ๐ฎ ๐๐ฒ๐ฐ๐๐ฟ๐ฒ ๐ฝ๐ฟ๐ผ๐๐ผ๐ฐ๐ผ๐น. Information transferred is encrypted using SSL (Secure Sockets Layer) or TLS (Transport Layer Security) protocols, providing privacy and integrity of information.
๐๐ฎ๐๐ฎ ๐๐ฟ๐ฎ๐ป๐๐ณ๐ฒ๐ฟ for HTTP occurs on port 80, whereas HTTPS utilizes port 443. The browser handles this automatically.
The protocols have different ๐จ๐ฅ๐ ๐๐๐ฟ๐๐ฐ๐๐๐ฟ๐ฒ. A website that uses HTTP starts with the 'http://' prefix, while a website that uses HTTPS starts with 'https://'.
For websites handling sensitive data such as credit card information, HTTPS is a must. Even if a site doesnโt handle sensitive data, the extra security with ๐๐ง๐ง๐ฃ๐ฆ ๐ฝ๐ฟ๐ผ๐๐ถ๐ฑ๐ฒ๐ ๐๐ฟ๐๐๐ ๐ฎ๐ป๐ฑ ๐ฐ๐ฟ๐ฒ๐ฑ๐ถ๐ฏ๐ถ๐น๐ถ๐๐ to users.
๐ฆ๐๐ข is often a very important area of business, for this, HTTPS is the way to go. Not using HTTPS will significantly hurt ranking as it is an important ranking factor.
In summary, the internet uses the HTTP and HTTPS protocols to move data around. However, HTTPS is a secure protocol that offers identification, privacy, and data integrity.
This week we will cover:
โ Understanding database types
โ A look into binary trees
โ What is Kafka, and how does it work
โ SSL vs TLS
Donโt want to miss out? Subscribe to our free newsletter for a weekly deep dive & content roundup: https://t.co/XkFxRiQI5Z
Caching is key for optimized performance. Caching layers include:
โ Hardware layer
โ System layer
โ Network and distributed layer
โ Application layer
Tomorrow, thousands of subscribers will learn where caching is used.
Join us to get the issue: https://t.co/cdQACkYrkn