Claim 35 Post Templates from the 7 best LinkedIn Influencers

Get Free Post Templates
Nikki Siapno

Nikki Siapno

These are the best posts from Nikki Siapno.

10 viral posts with 17,650 likes, 343 comments, and 2,432 shares.
10 image posts, 0 carousel posts, 0 video posts, 0 text posts.

๐Ÿ‘‰ Go deeper on Nikki Siapno's LinkedIn with the ContentIn Chrome extension ๐Ÿ‘ˆ

Best Posts by Nikki Siapno on LinkedIn

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.

๐Ÿ”น ๐—ฉ๐—ฒ๐—ฟ๐˜€๐—ถ๐—ผ๐—ป๐—ถ๐—ป๐—ด
โ†ณ 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.

๐Ÿ”น ๐—ฃ๐—ฎ๐—ด๐—ถ๐—ป๐—ฎ๐˜๐—ถ๐—ผ๐—ป
โ†ณ 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.

Thorough documentation, robust 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.

๐Ÿ’ญ Over to you. What would you add? ๐Ÿ’ฌ

~~
Thanks to our partner CodeRabbit who keeps our content free to the community.

VS Code, Cursor, Windsurf. CodeRabbit now runs natively across them all. They're providing ๐˜‚๐—ป๐—น๐—ถ๐—บ๐—ถ๐˜๐—ฒ๐—ฑ ๐—ณ๐—ฟ๐—ฒ๐—ฒ ๐—”๐—œ ๐—ฐ๐—ผ๐—ฑ๐—ฒ ๐—ฟ๐—ฒ๐˜ƒ๐—ถ๐—ฒ๐˜„๐˜€ ๐—ฑ๐—ถ๐—ฟ๐—ฒ๐—ฐ๐˜๐—น๐˜† ๐—ถ๐—ป ๐˜๐—ต๐—ฒ ๐—œ๐——๐—˜. (rate limits apply).

Check it out (it's free): https://lnkd.in/gwSBkvRc
Post image by Nikki Siapno
8 Popular Network Protocols Explained.

Network protocols operate at different layers of the OSI model. The protocols below operate at different layers, this is important to note.

The OSI model is a conceptual framework that defines a networking system as a series of layers, each with specific functions, to facilitate the transfer, management, and processing of data in a network.

This layered architecture ensures standardized interactions between various software and hardware components in a network.

๐—ง๐—–๐—ฃ/๐—œ๐—ฃ (๐—ง๐—ฟ๐—ฎ๐—ป๐˜€๐—บ๐—ถ๐˜€๐˜€๐—ถ๐—ผ๐—ป ๐—–๐—ผ๐—ป๐˜๐—ฟ๐—ผ๐—น ๐—ฃ๐—ฟ๐—ผ๐˜๐—ผ๐—ฐ๐—ผ๐—น/๐—œ๐—ป๐˜๐—ฒ๐—ฟ๐—ป๐—ฒ๐˜ ๐—ฃ๐—ฟ๐—ผ๐˜๐—ผ๐—ฐ๐—ผ๐—น)

This protocol is the underlying method of how information is passed between devices on the internet. While IP is responsible for addressing and routing data packets, TCP takes care of assembling the data into packets, as well as reliable delivery.

๐—›๐—ง๐—ง๐—ฃ (๐—›๐˜†๐—ฝ๐—ฒ๐—ฟ๐˜๐—ฒ๐˜…๐˜ ๐—ง๐—ฟ๐—ฎ๐—ป๐˜€๐—ณ๐—ฒ๐—ฟ ๐—ฃ๐—ฟ๐—ผ๐˜๐—ผ๐—ฐ๐—ผ๐—น)

When accessing websites, HTTP plays a crucial role. It's responsible for fetching and delivering web content from servers to end-users.

๐—›๐—ง๐—ง๐—ฃ๐—ฆ (๐—›๐˜†๐—ฝ๐—ฒ๐—ฟ๐˜๐—ฒ๐˜…๐˜ ๐—ง๐—ฟ๐—ฎ๐—ป๐˜€๐—ณ๐—ฒ๐—ฟ ๐—ฃ๐—ฟ๐—ผ๐˜๐—ผ๐—ฐ๐—ผ๐—น ๐—ฆ๐—ฒ๐—ฐ๐˜‚๐—ฟ๐—ฒ)

An enhanced version of HTTP, HTTPS integrates security protocols (namely TLS) to encrypt data, ensuring a secure and confidential exchange between browsers and websites.

๐—™๐—ง๐—ฃ (๐—™๐—ถ๐—น๐—ฒ ๐—ง๐—ฟ๐—ฎ๐—ป๐˜€๐—ณ๐—ฒ๐—ฟ ๐—ฃ๐—ฟ๐—ผ๐˜๐—ผ๐—ฐ๐—ผ๐—น)

As the name suggests, FTP is used for transferring files (uploading and downloading) between computers on a network.

๐—จ๐——๐—ฃ (๐—จ๐˜€๐—ฒ๐—ฟ ๐——๐—ฎ๐˜๐—ฎ๐—ด๐—ฟ๐—ฎ๐—บ ๐—ฃ๐—ฟ๐—ผ๐˜๐—ผ๐—ฐ๐—ผ๐—น)

A more streamlined counterpart to TCP, UDP transmits data without the overhead of establishing a connection, leading to faster transmission but without the guarantee that the data will be delivered or in order.

๐—ฆ๐— ๐—ง๐—ฃ (๐—ฆ๐—ถ๐—บ๐—ฝ๐—น๐—ฒ ๐— ๐—ฎ๐—ถ๐—น ๐—ง๐—ฟ๐—ฎ๐—ป๐˜€๐—ณ๐—ฒ๐—ฟ ๐—ฃ๐—ฟ๐—ผ๐˜๐—ผ๐—ฐ๐—ผ๐—น)

The driving force behind email communication, SMTP manages the formatting, routing, and delivery of emails between mail servers.

๐—ฆ๐—ฆ๐—› (๐—ฆ๐—ฒ๐—ฐ๐˜‚๐—ฟ๐—ฒ ๐—ฆ๐—ต๐—ฒ๐—น๐—น)

Secure Shell is a cryptographic network protocol that ensures safe data transmission over an unsecured network. It provides a safe channel, making sure that hackers can't interpret the information by eavesdropping.

๐Ÿ’ฌ I'd love to hear your thoughts, are there any other protocols or concepts you'd like to add?

~~
Thank you to our partner Kickresume who keeps our content free to the community.

Seeing other successful software engineering resumes is big help in ensuring your own is crafted well.

Kickresume has a library of high-quality SWE resumes that got people hired.

Check them out: https://lnkd.in/gba7FQhr
Post image by Nikki Siapno
CSS em vs rem explained ๐ŸŽจ๐Ÿ‘‡

Both em and rem are relative units of measurement used in frontend development.

em is relative to the font size of the parent element.

rem is relative to the font size of the root element.

โ€”โ€”

Want more programming concepts visually explained like this?

Subscribe to our ๐Ÿ๐ซ๐ž๐ž ๐ง๐ž๐ฐ๐ฌ๐ฅ๐ž๐ญ๐ญ๐ž๐ซ for a weekly deep-dive and roundup of all our best content โ†’ย blog.levelupcoding.co

#webdevelopmentย #programmingย #css
Post image by Nikki Siapno
CI/CD Pipelines โ€” How Do You Optimize Their Performance?

CI/CD pipelines allow development teams to ๐—ฑ๐—ฒ๐—น๐—ถ๐˜ƒ๐—ฒ๐—ฟ ๐—ฐ๐—ต๐—ฎ๐—ป๐—ด๐—ฒ๐˜€ ๐—พ๐˜‚๐—ถ๐—ฐ๐—ธ๐—น๐˜† ๐—ฎ๐—ป๐—ฑ ๐—ฐ๐—ผ๐—ป๐—ณ๐—ถ๐—ฑ๐—ฒ๐—ป๐˜๐—น๐˜†.

Poorly performing pipelines lead to an increase in deployment times, opens up the risk of errors, and lowers developer productivity.

Before we explore the effective solutions to boost the performance of CI/CD pipelines, take a moment to revise the many components involved with the attached visual; this knowledge will help identify improvements.

Once you've reviewed that, letโ€™s dive in:

The first step in optimizing any system is to analyze its processes and ๐—ถ๐—ฑ๐—ฒ๐—ป๐˜๐—ถ๐—ณ๐˜† ๐˜๐—ต๐—ฒ ๐—ฏ๐—ผ๐˜๐˜๐—น๐—ฒ๐—ป๐—ฒ๐—ฐ๐—ธ๐˜€ ๐—ฎ๐—ป๐—ฑ ๐—ถ๐—ป๐—ฒ๐—ณ๐—ณ๐—ถ๐—ฐ๐—ถ๐—ฒ๐—ป๐—ฐ๐—ถ๐—ฒ๐˜€.

A common culprit to poor performance is the ๐—น๐—ฎ๐—ฐ๐—ธ ๐—ผ๐—ณ ๐—ฝ๐—ฎ๐—ฟ๐—ฎ๐—น๐—น๐—ฒ๐—น๐—ถ๐˜€๐—บ. Take a look at the processes that run in sequence and consider if they could instead run in parallel. This simple change could mean a drastic reduction in deployment times.

The order in which tests are executed is often an overlooked factor but something that can impact performance. While there are best practices to follow, the best approach will vary per project. It's important to find a balance between ๐—ฒ๐—ฎ๐—ฟ๐—น๐˜† ๐—ณ๐—ฒ๐—ฒ๐—ฑ๐—ฏ๐—ฎ๐—ฐ๐—ธ ๐—ฎ๐—ป๐—ฑ ๐—ฒ๐—ณ๐—ณ๐—ถ๐—ฐ๐—ถ๐—ฒ๐—ป๐—ฐ๐˜†. If possible, ๐—ผ๐—ป๐—น๐˜† ๐—ฟ๐˜‚๐—ป ๐˜๐—ฒ๐˜€๐˜๐˜€ ๐˜๐—ต๐—ฎ๐˜ ๐—ฟ๐—ฒ๐—น๐—ฎ๐˜๐—ฒ ๐˜๐—ผ ๐˜๐—ต๐—ฒ ๐˜€๐—ฒ๐˜ ๐—ผ๐—ณ ๐—ฐ๐—ต๐—ฎ๐—ป๐—ด๐—ฒ๐˜€; but be careful โ€” don't overly complicate your test suite.

Another common culprit is the build process. Check the efficiency of your ๐—ฏ๐˜‚๐—ถ๐—น๐—ฑ ๐˜€๐—ฐ๐—ฟ๐—ถ๐—ฝ๐˜๐˜€, ๐—ฟ๐—ฒ๐—บ๐—ผ๐˜ƒ๐—ฒ ๐˜‚๐—ป๐—ป๐—ฒ๐—ฐ๐—ฒ๐˜€๐˜€๐—ฎ๐—ฟ๐˜† ๐—ฑ๐—ฒ๐—ฝ๐—ฒ๐—ป๐—ฑ๐—ฒ๐—ป๐—ฐ๐—ถ๐—ฒ๐˜€, ๐—ฎ๐—ป๐—ฑ ๐—ฐ๐—ฎ๐—ฐ๐—ต๐—ฒ ๐—ฎ๐—ฟ๐˜๐—ถ๐—ณ๐—ฎ๐—ฐ๐˜๐˜€. Try to avoid any unnecessary processes, especially if the assets needed can be pulled from the previous build.

Finally, analyze and ensure the ๐—ถ๐—ป๐—ณ๐—ฟ๐—ฎ๐˜€๐˜๐—ฟ๐˜‚๐—ฐ๐˜๐˜‚๐—ฟ๐—ฒ can support your pipeline. Ensure that it has adequate resources and can scale as needed.

A CI/CD pipeline is integral to any development process and one that impacts the development teamโ€™s day-to-day operations. It's important to invest time and effort to ensure your pipeline stays optimal as it can have an ongoing impact on the teamโ€™s productivity.

โ€”โ€”

๐—” ๐—ฏ๐—ถ๐—ด ๐˜๐—ต๐—ฎ๐—ป๐—ธ ๐˜†๐—ผ๐˜‚ ๐˜๐—ผ ๐—ผ๐˜‚๐—ฟ ๐—ฝ๐—ฎ๐—ฟ๐˜๐—ป๐—ฒ๐—ฟ ๐—ฃ๐—ผ๐˜€๐˜๐—บ๐—ฎ๐—ป ๐˜„๐—ต๐—ผ ๐—ธ๐—ฒ๐—ฒ๐—ฝ๐˜€ ๐—ผ๐˜‚๐—ฟ ๐—ฐ๐—ผ๐—ป๐˜๐—ฒ๐—ป๐˜ ๐—ณ๐—ฟ๐—ฒ๐—ฒ ๐˜๐—ผ ๐˜๐—ต๐—ฒ ๐—ฐ๐—ผ๐—บ๐—บ๐˜‚๐—ป๐—ถ๐˜๐˜†.

Postman provides full support for GraphQL. They even have an examples feature to store request/response pairs and illustrate how your GraphQL requests work.

Check it out: https://lnkd.in/dCa-kAZd
Post image by Nikki Siapno
What is Kafka?

Apache Kafka is an open source distributed streaming platform designed for building real-time data pipelines and streaming applications.

Kafka operates as a ๐—ฑ๐—ถ๐˜€๐˜๐—ฟ๐—ถ๐—ฏ๐˜‚๐˜๐—ฒ๐—ฑ ๐—ฝ๐˜‚๐—ฏ-๐˜€๐˜‚๐—ฏ ๐—บ๐—ฒ๐˜€๐˜€๐—ฎ๐—ด๐—ถ๐—ป๐—ด ๐˜€๐˜†๐˜€๐˜๐—ฒ๐—บ. Allowing applications to publish and subscribe to real-time or near-real-time data feeds. The ๐—ต๐—ถ๐—ด๐—ต ๐˜๐—ต๐—ฟ๐—ผ๐˜‚๐—ด๐—ต๐—ฝ๐˜‚๐˜, ๐˜€๐—ฐ๐—ฎ๐—น๐—ฎ๐—ฏ๐—ถ๐—น๐—ถ๐˜๐˜†, ๐—ณ๐—ฎ๐˜‚๐—น๐˜-๐˜๐—ผ๐—น๐—ฒ๐—ฟ๐—ฎ๐—ป๐—ฐ๐—ฒ, ๐—ฑ๐˜‚๐—ฟ๐—ฎ๐—ฏ๐—ถ๐—น๐—ถ๐˜๐˜†, and ๐—ฒ๐—ฐ๐—ผ๐˜€๐˜†๐˜€๐˜๐—ฒ๐—บ ๐—ž๐—ฎ๐—ณ๐—ธ๐—ฎ ๐—ฝ๐—ฟ๐—ผ๐˜ƒ๐—ถ๐—ฑ๐—ฒ๐˜€ have made it a very ๐—ฝ๐—ผ๐—ฝ๐˜‚๐—น๐—ฎ๐—ฟ ๐—ฐ๐—ต๐—ผ๐—ถ๐—ฐ๐—ฒ ๐—ณ๐—ผ๐—ฟ use cases where ๐—ฟ๐—ฒ๐—ฎ๐—น-๐˜๐—ถ๐—บ๐—ฒ ๐—ฑ๐—ฎ๐˜๐—ฎ ๐—ณ๐—ฒ๐—ฒ๐—ฑ๐˜€ are required.

๐—ง๐—ต๐—ฒ ๐—ธ๐—ฒ๐˜† ๐—ฐ๐—ผ๐—บ๐—ฝ๐—ผ๐—ป๐—ฒ๐—ป๐˜๐˜€ ๐—ผ๐—ณ ๐—ž๐—ฎ๐—ณ๐—ธ๐—ฎ ๐—ถ๐—ป๐—ฐ๐—น๐˜‚๐—ฑ๐—ฒ:

๐Ÿ”ธ ๐—ฃ๐—ฟ๐—ผ๐—ฑ๐˜‚๐—ฐ๐—ฒ๐—ฟ
Producers publish (write) messages to a Kafka topic.
๐Ÿ”ธ ๐—–๐—ผ๐—ป๐˜€๐˜‚๐—บ๐—ฒ๐—ฟ
Consumers/subscribers subscribe to topics and process (read) the feed of published messages.
๐Ÿ”ธ ๐—•๐—ฟ๐—ผ๐—ธ๐—ฒ๐—ฟ
Brokers are Kafka servers that store data and serve clients. Multiple brokers form a cluster.
๐Ÿ”ธ ๐—ง๐—ผ๐—ฝ๐—ถ๐—ฐ
Topics are a feed name or message category to which messages are published by producers.
๐Ÿ”ธ ๐—ฃ๐—ฎ๐—ฟ๐˜๐—ถ๐˜๐—ถ๐—ผ๐—ป
Messages are organized into topics, which can then be further divided into partitions. This increases parallelism and scalability allowing consumers to read different partitions at the same time.

๐—ž๐—ฎ๐—ณ๐—ธ๐—ฎ ๐—ฐ๐—ฎ๐—ป ๐—ฏ๐—ฒ ๐˜‚๐˜€๐—ฒ๐—ฑ ๐—ณ๐—ผ๐—ฟ ๐—บ๐—ฎ๐—ป๐˜† ๐˜‚๐˜€๐—ฒ ๐—ฐ๐—ฎ๐˜€๐—ฒ๐˜€. A few of the more common ๐˜‚๐˜€๐—ฒ ๐—ฐ๐—ฎ๐˜€๐—ฒ๐˜€ ๐—ถ๐—ป๐—ฐ๐—น๐˜‚๐—ฑ๐—ฒ:

๐Ÿ”น ๐—”๐—ด๐—ด๐—ฟ๐—ฒ๐—ด๐—ฎ๐˜๐—ถ๐—ป๐—ด ๐—ฑ๐—ฎ๐˜๐—ฎ ๐—ณ๐—ฟ๐—ผ๐—บ ๐—ฑ๐—ถ๐—ณ๐—ณ๐—ฒ๐—ฟ๐—ฒ๐—ป๐˜ ๐˜€๐—ผ๐˜‚๐—ฟ๐—ฐ๐—ฒ๐˜€: Whether it's ETL pipelines, data lakes, or log aggregation; ingesting, organizing, transforming, and distributing data are core functions of Kafka.
๐Ÿ”น ๐—ฆ๐˜๐—ฟ๐—ฒ๐—ฎ๐—บ ๐—ฝ๐—ฟ๐—ผ๐—ฐ๐—ฒ๐˜€๐˜€๐—ถ๐—ป๐—ด: Kafka can be used to build real-time analytics applications.
๐Ÿ”น ๐—˜๐˜ƒ๐—ฒ๐—ป๐˜ ๐—ฝ๐—ฟ๐—ผ๐—ฐ๐—ฒ๐˜€๐˜€๐—ถ๐—ป๐—ด: systems or applications that rely on processing events in real-time such as IoT devices.
๐Ÿ”น ๐— ๐—ผ๐—ป๐—ถ๐˜๐—ผ๐—ฟ๐—ถ๐—ป๐—ด: Kafka is well suited for storing logs and metrics, allowing for real-time monitoring and alerts.

Designed for fault tolerance, high throughput, durability, and scalability, Kafka serves as an intermediary service for handling large data. While Kafka provides many advantages for building real-time data pipelines and streaming applications, it's not without its drawbacks. The most noteworthy being the layers of complexity it adds to the system architecture. In saying that, if real-time data feed is required, Kafka is a popular choice.

โ€”โ€”

A big thank you to our partner Postman who keeps this content free to our readers.

Wish you could test your API without leaving your code editor? Postmanโ€™s new VS Code extension lets you do exactly that!

Check it out:ย https://lnkd.in/gdFSHMu4

#softwareengineeringย #programmingย #systemdesign
Post image by Nikki Siapno
How to Use Big O to Ace Your Technical Interviews:

Firstly, what is Big O Notation?

Big O describes an algorithm's runtime or memory consumption without the interference of contextual variables like RAM and CPU. It gives programmers a way to compare algorithms and identify the most efficient solution.

๐—•๐—ถ๐—ด ๐—ข ๐—ฎ๐—ป๐˜€๐˜„๐—ฒ๐—ฟ๐˜€ ๐—ผ๐—ป๐—ฒ ๐˜€๐˜๐—ฟ๐—ฎ๐—ถ๐—ด๐—ต๐˜๐—ณ๐—ผ๐—ฟ๐˜„๐—ฎ๐—ฟ๐—ฑ ๐—พ๐˜‚๐—ฒ๐˜€๐˜๐—ถ๐—ผ๐—ป:

โ€œHow much does runtime or memory consumption grow as the size of the input increases, in the worst-case scenario?โ€œ.

๐—ง๐—ผ ๐˜‚๐˜๐—ถ๐—น๐—ถ๐˜‡๐—ฒ ๐—•๐—ถ๐—ด ๐—ข, you'll need to know the possible values and how they compare with each other. Use the attached photo for a quick reference.

๐—ฆ๐—ผ, ๐—ต๐—ผ๐˜„ ๐—ฑ๐—ผ ๐˜†๐—ผ๐˜‚ ๐—ฎ๐—ฝ๐—ฝ๐—น๐˜† ๐—•๐—ถ๐—ด ๐—ข ๐—ถ๐—ป ๐˜†๐—ผ๐˜‚๐—ฟ ๐˜๐—ฒ๐—ฐ๐—ต๐—ป๐—ถ๐—ฐ๐—ฎ๐—น ๐—ถ๐—ป๐˜๐—ฒ๐—ฟ๐˜ƒ๐—ถ๐—ฒ๐˜„๐˜€?

Here are a few scenarios where Big O can be used:

๐Ÿ”ธ Live coding challenges
๐Ÿ”ธ Code walk-throughs
๐Ÿ”ธ Discussions about projects/solutions you've built
๐Ÿ”ธ Discussions about your approach to programming & problem-solving

When any of these scenarios come up, be sure to mention the Big O of your solution and how it compares to alternative approaches. This is especially useful in live coding challenges where you have to compare solutions on the spot โ€” remember to think out loud!

๐—ง๐—ถ๐—ฝ: ๐—ช๐—ต๐—ฒ๐—ป ๐—ฐ๐—ผ๐—บ๐—ฝ๐—ฎ๐—ฟ๐—ถ๐—ป๐—ด ๐˜€๐—ผ๐—น๐˜‚๐˜๐—ถ๐—ผ๐—ป๐˜€, ๐—ฝ๐—ฎ๐˜† ๐—ฎ๐˜๐˜๐—ฒ๐—ป๐˜๐—ถ๐—ผ๐—ป ๐˜๐—ผ ๐˜๐—ต๐—ฒ ๐—ฝ๐—ฟ๐—ผ๐—ฏ๐—น๐—ฒ๐—บ'๐˜€ ๐—ฟ๐—ฒ๐—พ๐˜‚๐—ถ๐—ฟ๐—ฒ๐—บ๐—ฒ๐—ป๐˜๐˜€.

For example, linear time complexity may be completely fine when the input can never be too large. But if youโ€™re dealing with big data, youโ€™ll want to opt for something more efficient.

Of course, the goal is to get the correct Big O notation that applies to your solution. But don't worry about getting it wrong! Your interviewer will probably correct you when you do. The point is to show that you are thinking about the efficiency and performance of your solution.

๐——๐—ผ ๐˜๐—ต๐—ถ๐˜€ ๐—ฎ๐—ป๐—ฑ ๐˜†๐—ผ๐˜‚'๐—น๐—น ๐—ฏ๐—ฒ ๐—ฎ๐—ฏ๐—น๐—ฒ ๐˜๐—ผ ๐˜€๐—ต๐—ผ๐˜„๐—ฐ๐—ฎ๐˜€๐—ฒ ๐—ฎ๐—ป ๐—ถ๐—บ๐—ฝ๐—ผ๐—ฟ๐˜๐—ฎ๐—ป๐˜ ๐˜๐—ฟ๐—ฎ๐—ถ๐˜ ๐˜๐—ต๐—ฎ๐˜ ๐˜๐—ฒ๐—ฐ๐—ต๐—ป๐—ถ๐—ฐ๐—ฎ๐—น ๐—ต๐—ถ๐—ฟ๐—ถ๐—ป๐—ด ๐—บ๐—ฎ๐—ป๐—ฎ๐—ด๐—ฒ๐—ฟ๐˜€ ๐—น๐—ผ๐—ผ๐—ธ ๐—ณ๐—ผ๐—ฟ:

The ability to consider a solution's viability beyond whether it works or not. This shows maturity in your decision-making and approach to programming.

โ€”โ€”

๐—” ๐—ฏ๐—ถ๐—ด ๐˜๐—ต๐—ฎ๐—ป๐—ธ ๐˜†๐—ผ๐˜‚ ๐˜๐—ผ ๐—ผ๐˜‚๐—ฟ ๐—ฝ๐—ฎ๐—ฟ๐˜๐—ป๐—ฒ๐—ฟ ๐—ฃ๐—ผ๐˜€๐˜๐—บ๐—ฎ๐—ป ๐˜„๐—ต๐—ผ ๐—ธ๐—ฒ๐—ฒ๐—ฝ๐˜€ ๐—ผ๐˜‚๐—ฟ ๐—ฐ๐—ผ๐—ป๐˜๐—ฒ๐—ป๐˜ ๐—ณ๐—ฟ๐—ฒ๐—ฒ ๐˜๐—ผ ๐˜๐—ต๐—ฒ ๐—ฐ๐—ผ๐—บ๐—บ๐˜‚๐—ป๐—ถ๐˜๐˜†.

If youโ€™re building or working with REST APIs, Postmanโ€™s REST client makes the process much easier. Itโ€™s free to use as well.

You can read more about it here: https://lnkd.in/g2QQ-sxS
Post image by Nikki Siapno
The most popular database caching strategies explained.

Database caching plays a crucial role in enhancing application performance by optimizing data retrieval.

By caching frequently requested data, this technique reduces latency and accelerates queries, leading to more responsive and efficient systems.

๐—Ÿ๐—ฒ๐˜'๐˜€ ๐—น๐—ผ๐—ผ๐—ธ ๐—ฎ๐˜ ๐—ณ๐—ถ๐˜ƒ๐—ฒ ๐—ผ๐—ณ ๐˜๐—ต๐—ฒ ๐—บ๐—ผ๐˜€๐˜ ๐—ฐ๐—ผ๐—บ๐—บ๐—ผ๐—ป ๐—บ๐—ฒ๐˜๐—ต๐—ผ๐—ฑ๐˜€:

๐Ÿ”น ๐—–๐—ฎ๐—ฐ๐—ต๐—ฒ-๐—ฎ๐˜€๐—ถ๐—ฑ๐—ฒ ๐˜€๐˜๐—ฟ๐—ฎ๐˜๐—ฒ๐—ด๐˜†

This strategy grants applications explicit control over the caching process.

Applications check the cache before the database, enabling precise control suited to dynamic data or irregular access patterns.

However, this approach requires manual cache management, which can increase complexity.

๐Ÿ”น ๐—ช๐—ฟ๐—ถ๐˜๐—ฒ-๐˜๐—ต๐—ฟ๐—ผ๐˜‚๐—ด๐—ต ๐˜€๐˜๐—ฟ๐—ฎ๐˜๐—ฒ๐—ด๐˜†

By simultaneously writing to the cache and the database, this technique guarantees data consistency.

For applications requiring high data reliability, it eliminates inconsistencies and ensures immediate cache availability, despite increased write latency.

๐Ÿ”น ๐—ช๐—ฟ๐—ถ๐˜๐—ฒ-๐—ฏ๐—ฒ๐—ต๐—ถ๐—ป๐—ฑ ๐˜€๐˜๐—ฟ๐—ฎ๐˜๐—ฒ๐—ด๐˜†

Write performance is improved by caching data first and updating the database asynchronouslyโ€”a strategy that prioritizes speed over immediate consistency.

This approach boosts responsiveness and reduces database load but risks data loss if the cache expires before syncing.

Applications that can handle delayed data consistency and demand fast write speeds are best suited for it.

๐Ÿ”น ๐—ฅ๐—ฒ๐—ฎ๐—ฑ-๐˜๐—ต๐—ฟ๐—ผ๐˜‚๐—ด๐—ต ๐˜€๐˜๐—ฟ๐—ฎ๐˜๐—ฒ๐—ด๐˜†

When a cache misses, this strategy stores data in the cache by automatically retrieving it from the database.

While this method simplifies application code by abstracting caching procedures, initial cache misses can delay data retrieval.

It supports applications with stable data sets and high read demands by efficiently reducing database load.

๐Ÿ”น ๐—ช๐—ฟ๐—ถ๐˜๐—ฒ-๐—ฎ๐—ฟ๐—ผ๐˜‚๐—ป๐—ฑ ๐˜€๐˜๐—ฟ๐—ฎ๐˜๐—ฒ๐—ด๐˜†

This method bypasses the cache, which is only refreshed upon further read requests, and writes data straight to the database.

It keeps space for frequently accessed data by postponing cache updates, preventing premature cache saturation.

Cache efficiency is maximized in write-intensive applications where instantaneous read access to fresh data is not essential.

Database caching greatly improves application performance by reducing latency, increasing scalability, and enhancing user experiences.

By selecting and implementing the optimal database caching solutions, we can meet unique application demands efficiently while maintaining high speed and resource efficiency.
Post image by Nikki Siapno
How Do Services Communicate With Each Other?

This is an important decision when designing the implementation of any multi-service architecture.

Here's a quick guide to the most commonly used techniques, use it as a starting point for your decision:

๐—ด๐—ฅ๐—ฃ๐—– is an open-source remote procedure call framework developed by Google. It uses Protocol Buffers to define service and message types which make data compact and efficient to transmit and store. It supports bi-directional streaming and offers flow control features.

๐—ช๐—ฒ๐—ฏ๐—ฆ๐—ผ๐—ฐ๐—ธ๐—ฒ๐˜๐˜€ provide a full-duplex channel over a TCP connection. They allow both the client and server to send messages to each other at the same time. WebSockets require an open connection which is more resource-intensive than stateless options.

๐—ฅ๐—˜๐—ฆ๐—ง๐—ณ๐˜‚๐—น ๐—”๐—ฃ๐—œ๐˜€ provide an interface for services to communicate with each other. It uses the standard HTTP methods GET, POST, PATCH, and DELETE. It is stateless in nature which means requests must contain all the information required to process it.

๐—š๐—ฟ๐—ฎ๐—ฝ๐—ต๐—ค๐—Ÿ is another API-based approach. It is a data query and manipulation language that provides a way to consolidate APIs so that services can communicate via a single API endpoint. This simplifies communication with a consistent and unified interface.

In an ๐—ฒ๐˜ƒ๐—ฒ๐—ป๐˜-๐—ฑ๐—ฟ๐—ถ๐˜ƒ๐—ฒ๐—ป approach, services respond to changes in state (referred to as an event). Services send events to a message broker or an event bus which forwards the event to relevant services. This promotes loose coupling, allows services to scale independently, and improves resilience.

A ๐˜€๐—ฒ๐—ฟ๐˜ƒ๐—ถ๐—ฐ๐—ฒ ๐—บ๐—ฒ๐˜€๐—ต adds an infrastructure layer to each service. It adds a network proxy (called a sidecar) where network traffic is routed through. Because it does this to each individual service, features such as authentication and load balancing can be done on a very granular level.

Choosing the right approach for a system can be challenging, given the many options available and their varying use cases. Understanding your systemโ€™s requirements is essential, and often the best approach requires a mix of the options above to accommodate for different components in your system.

โ€”โ€”

A big thank you to our partner Postman who keeps this content free to our readers.

VS Code and Postman are no longer adjacent tools, theyโ€™re now fully integrated! The long-awaited VS Code extension from Postman has been released.

Check it out:ย https://lnkd.in/gdFSHMu4
Post image by Nikki Siapno
HTTP status codes explained:

When a server receives a request from a client, it provides a response that includes both the requested data and a 3-digit ๐˜€๐˜๐—ฎ๐˜๐˜‚๐˜€ ๐—ฐ๐—ผ๐—ฑ๐—ฒ that succinctly ๐—ฐ๐—ผ๐—บ๐—บ๐˜‚๐—ป๐—ถ๐—ฐ๐—ฎ๐˜๐—ฒ๐˜€ ๐˜๐—ต๐—ฒ ๐—ฟ๐—ฒ๐—พ๐˜‚๐—ฒ๐˜€๐˜'๐˜€ ๐—ผ๐˜‚๐˜๐—ฐ๐—ผ๐—บ๐—ฒ ๐—ผ๐—ฟ ๐˜€๐˜๐—ฎ๐˜๐˜‚๐˜€.

Clients use these standardized sets of codes to determine if a request has been properly handled, whether more action is required, or whether an error has occurred.

HTTP status codes are ๐—ฑ๐—ถ๐˜ƒ๐—ถ๐—ฑ๐—ฒ๐—ฑ ๐—ถ๐—ป๐˜๐—ผ ๐—ณ๐—ถ๐˜ƒ๐—ฒ ๐—ฐ๐—ฎ๐˜๐—ฒ๐—ด๐—ผ๐—ฟ๐—ถ๐—ฒ๐˜€, each ๐—ถ๐—ฑ๐—ฒ๐—ป๐˜๐—ถ๐—ณ๐—ถ๐—ฒ๐—ฑ ๐—ฏ๐˜† ๐˜๐—ต๐—ฒ ๐—ณ๐—ถ๐—ฟ๐˜€๐˜ ๐—ฑ๐—ถ๐—ด๐—ถ๐˜ ๐—ผ๐—ณ ๐˜๐—ต๐—ฒ ๐—ฐ๐—ผ๐—ฑ๐—ฒ:

๐ŸŸฃ ๐—œ๐—ป๐—ณ๐—ผ๐—ฟ๐—บ๐—ฎ๐˜๐—ถ๐—ผ๐—ป๐—ฎ๐—น (๐Ÿญ๐˜…๐˜…): The request was received, and the process is continuing.
๐ŸŸข ๐—ฆ๐˜‚๐—ฐ๐—ฐ๐—ฒ๐˜€๐˜€ (๐Ÿฎ๐˜…๐˜…): The request was successfully received, understood, and accepted.
๐Ÿ”ต ๐—ฅ๐—ฒ๐—ฑ๐—ถ๐—ฟ๐—ฒ๐—ฐ๐˜๐—ถ๐—ผ๐—ป (๐Ÿฏ๐˜…๐˜…): The request needs further action to be completed.
๐ŸŸ  ๐—–๐—น๐—ถ๐—ฒ๐—ป๐˜ ๐—˜๐—ฟ๐—ฟ๐—ผ๐—ฟ (๐Ÿฐ๐˜…๐˜…): The request contains incorrect syntax or cannot be fulfilled by the server.
๐Ÿ”ด ๐—ฆ๐—ฒ๐—ฟ๐˜ƒ๐—ฒ๐—ฟ ๐—˜๐—ฟ๐—ฟ๐—ผ๐—ฟ (๐Ÿฑ๐˜…๐˜…): The server failed to fulfill a valid request.

๐—ง๐—ต๐—ฒ ๐—บ๐—ผ๐˜€๐˜ ๐—ถ๐—บ๐—ฝ๐—ผ๐—ฟ๐˜๐—ฎ๐—ป๐˜/๐—ฐ๐—ผ๐—บ๐—บ๐—ผ๐—ป ๐—ณ๐—ผ๐—ฟ ๐—ฒ๐—ฎ๐—ฐ๐—ต ๐—ฐ๐—ฎ๐˜๐—ฒ๐—ด๐—ผ๐—ฟ๐˜† ๐—ฎ๐—ฟ๐—ฒ ๐—น๐—ถ๐˜€๐˜๐—ฒ๐—ฑ ๐—ถ๐—ป ๐˜๐—ต๐—ฒ ๐˜ƒ๐—ถ๐˜€๐˜‚๐—ฎ๐—น ๐—ฏ๐—ฒ๐—น๐—ผ๐˜„.

Server ๐˜€๐˜๐—ฎ๐˜๐˜‚๐˜€ ๐—ฐ๐—ผ๐—ฑ๐—ฒ๐˜€ for HTTP ๐˜€๐—ฒ๐—ฟ๐˜ƒ๐—ฒ ๐˜€๐—ฒ๐˜ƒ๐—ฒ๐—ฟ๐—ฎ๐—น ๐—ธ๐—ฒ๐˜† ๐—ณ๐˜‚๐—ป๐—ฐ๐˜๐—ถ๐—ผ๐—ป๐˜€ in web development including:

๐Ÿ”ธ Efficient communication
๐Ÿ”ธ Reliability and troubleshooting
๐Ÿ”ธ Error identification
๐Ÿ”ธ Facilitating automation
๐Ÿ”ธ Providing user feedback
๐Ÿ”ธ And much moreโ€ฆ

Below are some ๐—ฏ๐—ฒ๐˜€๐˜ ๐—ฝ๐—ฟ๐—ฎ๐—ฐ๐˜๐—ถ๐—ฐ๐—ฒ๐˜€ ๐—ณ๐—ผ๐—ฟ ๐˜„๐—ผ๐—ฟ๐—ธ๐—ถ๐—ป๐—ด ๐˜„๐—ถ๐˜๐—ต ๐˜€๐˜๐—ฎ๐˜๐˜‚๐˜€ ๐—ฐ๐—ผ๐—ฑ๐—ฒ๐˜€:

๐Ÿ”น ๐—จ๐˜€๐—ฒ ๐˜€๐—ฝ๐—ฒ๐—ฐ๐—ถ๐—ณ๐—ถ๐—ฐ ๐˜€๐˜๐—ฎ๐˜๐˜‚๐˜€ ๐—ฐ๐—ผ๐—ฑ๐—ฒ๐˜€: Use the most specific status code that accurately describes the outcome of an operation.
๐Ÿ”น ๐—•๐—ฒ ๐—ฐ๐—ผ๐—ป๐˜€๐—ถ๐˜€๐˜๐—ฒ๐—ป๐˜: Maintain consistency in how you use status codes across your application.
๐Ÿ”น ๐—œ๐—บ๐—ฝ๐—น๐—ฒ๐—บ๐—ฒ๐—ป๐˜ ๐—ฐ๐˜‚๐˜€๐˜๐—ผ๐—บ ๐—ฒ๐—ฟ๐—ฟ๐—ผ๐—ฟ ๐—บ๐—ฒ๐˜€๐˜€๐—ฎ๐—ด๐—ฒ๐˜€: Send additional info in the response body or headers to provide more context.
๐Ÿ”น ๐—Ÿ๐—ผ๐—ด ๐—ฎ๐—ป๐—ฑ ๐—บ๐—ผ๐—ป๐—ถ๐˜๐—ผ๐—ฟ: Logging and monitoring of the status codes your app is sending and receiving can help in performance tuning, detecting anomalies, and debugging.

Although HTTP status codes may seem like a small and simple aspect of web development, they play an indispensable role in client, server communication. Understanding and utilizing the status codes effectively is a fundamental part of developing sound applications.

โ€”โ€”

๐—” ๐—ฏ๐—ถ๐—ด ๐˜๐—ต๐—ฎ๐—ป๐—ธ ๐˜†๐—ผ๐˜‚ ๐˜๐—ผ ๐—ผ๐˜‚๐—ฟ ๐—ฝ๐—ฎ๐—ฟ๐˜๐—ป๐—ฒ๐—ฟ ๐—ฃ๐—ผ๐˜€๐˜๐—บ๐—ฎ๐—ป ๐˜„๐—ต๐—ผ ๐—ธ๐—ฒ๐—ฒ๐—ฝ๐˜€ ๐—ผ๐˜‚๐—ฟ ๐—ฐ๐—ผ๐—ป๐˜๐—ฒ๐—ป๐˜ ๐—ณ๐—ฟ๐—ฒ๐—ฒ ๐˜๐—ผ ๐˜๐—ต๐—ฒ ๐—ฐ๐—ผ๐—บ๐—บ๐˜‚๐—ป๐—ถ๐˜๐˜†.

Whether youโ€™re working with HTTP, gRPC, GraphQL, WebSockets or even MQTT, Postman has you covered. Check it out: https://lnkd.in/gswETBCH
Post image by Nikki Siapno
Principles of OOP explained.

Object-oriented programming (OOP) is a programming paradigm in which programs are designed using ๐—ฐ๐—น๐—ฎ๐˜€๐˜€๐—ฒ๐˜€ ๐—ฎ๐—ป๐—ฑ ๐—ผ๐—ฏ๐—ท๐—ฒ๐—ฐ๐˜๐˜€. This design allows related functions and data to be grouped together in ๐˜€๐—ฒ๐—น๐—ณ-๐—ฐ๐—ผ๐—ป๐˜๐—ฎ๐—ถ๐—ป๐—ฒ๐—ฑ ๐—ฎ๐—ป๐—ฑ ๐—ฟ๐—ฒ๐˜‚๐˜€๐—ฎ๐—ฏ๐—น๐—ฒ ๐˜‚๐—ป๐—ถ๐˜๐˜€.

A class is a template or blueprint from which objects are made from. Classes define the properties and methods that an object can have, and objects are unique instances of a class.

For example, let's say you want to create a life simulation game where players can adopt and raise pets. You would have a โ€œPetโ€œ class that defines the properties of each pet (like โ€œnameโ€œ and โ€œageโ€œ), as well as behaviors they can do (like โ€œspeakโ€œ and โ€œeatโ€œ).

You could then create objects, or instances, of this class for each specific pet. Each object could have its own values for each property. For example, you could have a 2-year-old pet named โ€œWinstonโ€œ, & a 1-year-old pet named โ€œWesleyโ€œ; both initialized from the โ€œPetโ€œ class.

๐—ข๐—ฏ๐—ท๐—ฒ๐—ฐ๐˜-๐—ผ๐—ฟ๐—ถ๐—ฒ๐—ป๐˜๐—ฒ๐—ฑ ๐—ฝ๐—ฟ๐—ผ๐—ด๐—ฟ๐—ฎ๐—บ๐—บ๐—ถ๐—ป๐—ด ๐—ต๐—ฎ๐˜€ ๐Ÿฐ ๐—บ๐—ฎ๐—ถ๐—ป ๐—ฝ๐—ฟ๐—ถ๐—ป๐—ฐ๐—ถ๐—ฝ๐—น๐—ฒ๐˜€; ๐—ฒ๐—ป๐—ฐ๐—ฎ๐—ฝ๐˜€๐˜‚๐—น๐—ฎ๐˜๐—ถ๐—ผ๐—ป, ๐—ถ๐—ป๐—ต๐—ฒ๐—ฟ๐—ถ๐˜๐—ฎ๐—ป๐—ฐ๐—ฒ, ๐—ฎ๐—ฏ๐˜€๐˜๐—ฟ๐—ฎ๐—ฐ๐˜๐—ถ๐—ผ๐—ป, ๐—ฎ๐—ป๐—ฑ ๐—ฝ๐—ผ๐—น๐˜†๐—บ๐—ผ๐—ฟ๐—ฝ๐—ต๐—ถ๐˜€๐—บ.

๐—˜๐—ป๐—ฐ๐—ฎ๐—ฝ๐˜€๐˜‚๐—น๐—ฎ๐˜๐—ถ๐—ผ๐—ป hides internal details but exposes data & methods via a public interface, preventing unintentional changes. E.g. โ€” a player can view a pet's age but can't accidentally change it. But they can run methods avail on the public interface like changing a pet's name.

๐—œ๐—ป๐—ต๐—ฒ๐—ฟ๐—ถ๐˜๐—ฎ๐—ป๐—ฐ๐—ฒ allows classes to inherit properties and methods from other classes, making code reusable and organized. E.g. โ€” A โ€œSuperPetโ€œ class that extends from โ€œPet โ€œand would inherit โ€œageโ€œ, โ€œnameโ€œ, โ€œeatโ€œ, and โ€œspeakโ€œ; while defining new behaviors like โ€œflyโ€œ

๐—ฃ๐—ผ๐—น๐˜†๐—บ๐—ผ๐—ฟ๐—ฝ๐—ต๐—ถ๐˜€๐—บ is a principle that enables objects to change their form by extending or overriding existing methods. E.g. A โ€œDogโ€œ & โ€œCatโ€œ class that extended from the โ€œPetโ€œ, shouldn't share the same โ€œspeakโ€œ method. You'd override it to have its own logic like โ€œwoofโ€œ or โ€œmeowโ€œ

๐—”๐—ฏ๐˜€๐˜๐—ฟ๐—ฎ๐—ฐ๐˜๐—ถ๐—ผ๐—ป reduces complexity by only surfacing the information needed for a given context or use case. E.g. A โ€œPlayerโ€ class doesnโ€™t need to know how the โ€œeatโ€ method works in the โ€œPetโ€ class, it just needs to know how to interact with it โ€” i.e. its input and output.

OOP provides a way to design your program that makes it ๐—ฟ๐—ฒ๐˜‚๐˜€๐—ฎ๐—ฏ๐—น๐—ฒ, ๐˜€๐—ฒ๐—ฐ๐˜‚๐—ฟ๐—ฒ, ๐˜€๐˜๐—ฎ๐—ฏ๐—น๐—ฒ, ๐—ฎ๐—ป๐—ฑ ๐—ฒ๐—ฎ๐˜€๐˜† ๐˜๐—ผ ๐˜‚๐—ป๐—ฑ๐—ฒ๐—ฟ๐˜€๐˜๐—ฎ๐—ป๐—ฑ. But it isn't without disadvantages. A couple of arguments against it are that it can lead to over-engineering and complexity on a large scale.

~~

Thank you to our partner Kickresume who keeps our content free to the community.

Did you know you can turn your ๐—Ÿ๐—ถ๐—ป๐—ธ๐—ฒ๐—ฑ๐—œ๐—ป ๐—ถ๐—ป๐˜๐—ผ ๐—ฎ ๐—ฟ๐—ฒ๐˜€๐˜‚๐—บ๐—ฒ ๐˜„๐—ถ๐˜๐—ต ๐—ผ๐—ป๐—ฒ ๐—ฐ๐—น๐—ถ๐—ฐ๐—ธ?

Check it out: https://lnkd.in/g9ZnviCy
Post image by Nikki Siapno

Related Influencers