Saturday, February 19, 2022

Cathie Wood buys stocks like someone who just started yesterday, says Jim Cramer

Feb. 19, 2022

Here is the link. 

CNBC's Jim Cramer joins 'Closing Bell' to discuss today's market activity, as well as Cathie Wood's interview on the 'Halftime Report' today.

Arguments:

  1. Terminal value investor?
  2. Blackjack - 51% vs 49%
  3. Judge her now ARKK stock
  4. Bet on innovations - traditional fund - all money pullout
  5. Technology - SEcurity analysis - Trader - Correct price, Kathy skipped 2 and 3
  6. 2000 - true believer - No bets on this
  7. No one can create market by herself
  8. Dislike the way it is bought
Arguments:
  1. near-term price doesn't matter 
  2. bet on innovation    
  3. The market is getting completely wrong
Open transcript

00:00
joining us now for more on all the
00:01
market action jim cramer jim it's always
00:03
great to get your thoughts what did you
00:04
make of a day like today
00:06
well melissa today obviously just a
00:08
terrible day the juxtaposition of of
00:10
kathy wood on scott show with what
00:12
happened today and what will happen with
00:14
roku uh the ceo all very painful i think
00:17
it's painful because there's a lot of
00:18
new people have come in and you and i
00:20
have been around this and we know that
00:22
people tend to buy these very exciting
00:24
stories they bought excitement they
00:26
brought price to sales they bought
00:28
stories that sounded like you couldn't
00:30
uh you had the future and there you had
00:32
kathy wood and you you heard this sarah
00:34
she is giving you a view which just
00:36
basically says
00:37
near-term price doesn't matter but we
00:39
have people who are terminal by value
00:43
buyers who can't have that staying power
00:46
yes when you go to play blackjack at the
00:48
casino you're gonna it's 51.49 if you
00:50
hang on long enough but most people
00:52
can't and what we're seeing are people
00:54
who
00:55
are being blown out even if she's
00:57
soothing and i found it very disturbing
01:00
should we judge jim should we judge her
01:03
now i mean her highs and our etf was
01:06
february is it is the time frame too
01:07
short i understand your point i
01:09
understand that a lot of people have
01:10
lost a lot of hard-earned money but is
01:13
our time frame just too short to judge
01:16
you know a bet on innovation
01:18
i've been talking in many manners about
01:21
that and all of them said the same thing
01:24
which is that if it were a traditional
01:26
fund all the money would have been
01:28
pulled out because people can't afford
01:30
to lose that amount uh look i think that
01:33
innovation is a terrific thing but i
01:35
think that the way it should work is you
01:36
should have researched people and
01:38
and by the way i thought it was great
01:39
question my scottish and went fired you
01:41
said reachers people who are doing
01:43
technology and then it is given to
01:45
people who do securities analysis and
01:47
then it's given to a trader who tries to
01:49
figure out what's the correct price this
01:51
font this her she is just clearly
01:54
skipped step two and three and i don't
01:56
mean to i like what josh brown said i
01:58
have great respect for her but the fact
02:00
that i would never do this sarc this
02:02
short but but the fact is she's more
02:04
emblematic at the moment and we had
02:05
people were emblematic at the moment in
02:06
2000 and they are what i was just
02:08
telling the sarah green right true
02:10
believers and true believers are
02:11
terrific but melissa the problem is is
02:14
that as one of our guests said earlier
02:15
there are no bids for the true believers
02:17
the only real buyer of some of this
02:19
merchandise is kathy wood you cannot
02:22
create a market yourself nobody's that
02:24
big i do when i see her buying things i
02:27
am shocked at what she buys and how she
02:30
buys she buys like someone who just
02:32
started yesterday well but also i think
02:35
the structure of it she's an etf she has
02:37
to stay fully invested she has to keep
02:38
buying
02:39
i mean the conviction i think is what
02:41
you're talking about so would you touch
02:42
any of these arc names i actually like
02:44
actually well okay so let's distinguish
02:46
i actually like some of these companies
02:48
i dislike the way they were bought and i
02:50
really hate something called ubers
02:54
hubris is horrendous okay
02:56
humility is important when i screw up on
02:59
something like when i screwed up on
03:01
paypal you always i own it i wear it i'm
03:03
furious of myself but i screwed up i
03:06
would never in a million years tell you
03:08
but you just wait you just wait sarah
03:10
because when that thing comes back who
03:12
the hell has the right to say that well
03:14
and she also says the market is getting
03:16
it completely wrong there is no such
03:18
thing as the market being completely
03:19
wrong the market is an assemblage of
03:22
tremendous minds getting together and
03:24
they you may think they're your weighing
03:26
machine voting machine that's all
03:28
nonsense the market is about trying to
03:31
minimize losses and make as much money
03:33
as possible that's what the market is
03:35
and if you don't think that minimized
03:37
losses means anything then you should
03:39
just be running your own money and
03:40
nobody else's

Friday, February 18, 2022

Leetcode algorithm: Decode ways

Feb. 18, 2022

Introduction

I like to evaluate myself how good I am as a software programmer. I did look into the problems I solved, and then I like to write a small research topic called how good I am as a software programmer. 

How good am I? 

It is hard for me to evaluate how good I am. I did look into dynamic programming algorithm called decode ways. 

Here is my discussion post. 

I did my best and it took me over one hour to fix so many failed test cases. But I reviewed one of C# solutions, which is simple and easy, less error-prone. 

Here is the discussion post I reviewed with an elegant solution. 

I need to think more carefully, and learn how to get smart by reading other people good work as well. 



DP problems

 Dynamic Programming :

  1. DP for Beginners [Problems | Patterns | Sample Solutions] by @wh0ami
  2. DP Patterns by @aatalyk
  3. How to solve DP - String? Template and 4 Steps to be followed by @igooglethings
  4. Dynamic Programming Questions thread by @karansingh1559
  5. DP Classification helpful notes by @adityakrverma
  6. How to approach DP problems by @heroes3001
  7. Iterative DP for subset sum problems by @yuxiangmusic
  8. DP problems summary (problem categorization) by @richenyunqi
  9. Categorization of Leetcode DP problems by @chuka231
  10. Must do Dynamic Programming Category wise by @mahesh_nagarwal
  11. Dynamic programming is simple by @omgitspavel

Interviewing.io free peer mock interviews | Practice schedule

 


Thursday, February 17, 2022

BASE vs ACID -> system design -> Event-driven architecture

 From Wikipedia, the free encyclopedia

Jump to navigationJump to search

Event-driven architecture (EDA) is a software architecture paradigm promoting the production, detection, consumption of, and reaction to events.

An event can be defined as "a significant change in state".[1] For example, when a consumer purchases a car, the car's state changes from "for sale" to "sold". A car dealer's system architecture may treat this state change as an event whose occurrence can be made known to other applications within the architecture. From a formal perspective, what is produced, published, propagated, detected or consumed is a (typically asynchronous) message called the event notification, and not the event itself, which is the state change that triggered the message emission. Events do not travel, they just occur. However, the term event is often used metonymically to denote the notification message itself, which may lead to some confusion. This is due to Event-Driven architectures often being designed atop message-driven architectures, where such communication pattern requires one of the inputs to be text-only, the message, to differentiate how each communication should be handled.

This architectural pattern may be applied by the design and implementation of applications and systems that transmit events among loosely coupled software components and services. An event-driven system typically consists of event emitters (or agents), event consumers (or sinks), and event channels. Emitters have the responsibility to detect, gather, and transfer events. An Event Emitter does not know the consumers of the event, it does not even know if a consumer exists, and in case it exists, it does not know how the event is used or further processed. Sinks have the responsibility of applying a reaction as soon as an event is presented. The reaction might or might not be completely provided by the sink itself. For instance, the sink might just have the responsibility to filter, transform and forward the event to another component or it might provide a self-contained reaction to such event. Event channels are conduits in which events are transmitted from event emitters to event consumers. The knowledge of the correct distribution of events is exclusively present within the event channel.[citation needed] The physical implementation of event channels can be based on traditional components such as message-oriented middleware or point-to-point communication which might require a more appropriate transactional executive framework[clarify].

Building systems around an event-driven architecture simplifies horizontal scalability in distributed computing models and makes them more resilient to failure. This is because application state can be copied across multiple parallel snapshots for high-availability.[2] New events can be initiated anywhere, but more importantly propagate across the network of data stores updating each as they arrive. Adding extra nodes becomes trivial as well: you can simply take a copy of the application state, feed it a stream of events and run with it. [3]

Event-driven architecture can complement service-oriented architecture (SOA) because services can be activated by triggers fired on incoming events.[4][5] This paradigm is particularly useful whenever the sink does not provide any self-contained executive[clarify].

SOA 2.0 evolves the implications SOA and EDA architectures provide to a richer, more robust level by leveraging previously unknown causal relationships to form a new event pattern.[vague] This new business intelligence pattern triggers further autonomous human or automated processing that adds exponential value to the enterprise by injecting value-added information into the recognized pattern which could not have been achieved previously.[vague]

BASE vs ACID principle | System design preparation 2022

 April 25, 2021

I like to go over the article about BASE, and learn better about nosql database.  

I think that I understand better now about BASE through the example: 

  1. persistent message - how to ensure persistentency? Message queue
  2. Decouple transaction and user two tables 
  3. Transaction will evoke the message queue to add user table with update
  4. I need to read more than once in order to understand the concept: BASE
  5. Add one more table called updated_applied, and use the table to track if it is updated or not. 
  6. BASE (basically available, soft state, eventually consistent) - memorize the explanation, please!
  7. BASE is optimistic and accepts that the database consistency will be in a state of flux. Although this sounds impossible to cope with, in reality it is quite manageable and leads to levels of scalability that cannot be obtained with ACID.

It is the first time I came cross this well-written article to explain how to design based on BASE principles. 

If I can explain the following code, then I can tell myself that I understand BASE principle. 




Base: An Acid Alternative

In partitioned databases, trading some consistency for availability can lead to dramatic improvements in scalability.

Dan Pritchett, Ebay

Web applications have grown in popularity over the past decade. Whether you are building an application for end users or application developers (i.e., services), your hope is most likely that your application will find broad adoption—and with broad adoption will come transactional growth. If your application relies upon persistence, then data storage will probably become your bottleneck.

There are two strategies for scaling any application. The first, and by far the easiest, is vertical scaling: moving the application to larger computers. Vertical scaling works reasonably well for data but has several limitations. The most obvious limitation is outgrowing the capacity of the largest system available. Vertical scaling is also expensive, as adding transactional capacity usually requires purchasing the next larger system. Vertical scaling often creates vendor lock, further adding to costs.

Horizontal scaling offers more flexibility but is also considerably more complex. Horizontal data scaling can be performed along two vectors. Functional scaling involves grouping data by function and spreading functional groups across databases. Splitting data within functional areas across multiple databases, or sharding,1 adds the second dimension to horizontal scaling. The diagram in figure 1 illustrates horizontal data-scaling strategies.

As figure 1 illustrates, both approaches to horizontal scaling can be applied at once. Users, products, and transactions can be in separate databases. Additionally, each functional area can be split across multiple databases for transactional capacity. As shown in the diagram, functional areas can be scaled independently of one another.

Functional Partitioning

Functional partitioning is important for achieving high degrees of scalability. Any good database architecture will decompose the schema into tables grouped by functionality. Users, products, transactions, and communication are examples of functional areas. Leveraging database concepts such as foreign keys is a common approach for maintaining consistency across these functional areas.

Relying on database constraints to ensure consistency across functional groups creates a coupling of the schema to a database deployment strategy. For constraints to be applied, the tables must reside on a single database server, precluding horizontal scaling as transaction rates grow. In many cases, the easiest scale-out opportunity is moving functional groups of data onto discrete database servers.

Schemas that can scale to very high transaction volumes will place functionally distinct data on different database servers. This requires moving data constraints out of the database and into the application. This also introduces several challenges that are addressed later in this article.

CAP Theorem

Eric Brewer, a professor at the University of California, Berkeley, and cofounder and chief scientist at Inktomi, made the conjecture that Web services cannot ensure all three of the following properties at once (signified by the acronym CAP):2

Consistency. The client perceives that a set of operations has occurred all at once.

Availability. Every operation must terminate in an intended response.

Partition tolerance. Operations will complete, even if individual components are unavailable.

Specifically, a Web application can support, at most, only two of these properties with any database design. Obviously, any horizontal scaling strategy is based on data partitioning; therefore, designers are forced to decide between consistency and availability.

ACID Solutions

ACID database transactions greatly simplify the job of the application developer. As signified by the acronym, ACID transactions provide the following guarantees:

Atomicity. All of the operations in the transaction will complete, or none will.

Consistency. The database will be in a consistent state when the transaction begins and ends.

Isolation. The transaction will behave as if it is the only operation being performed upon the database.

Durability. Upon completion of the transaction, the operation will not be reversed.

Database vendors long ago recognized the need for partitioning databases and introduced a technique known as 2PC (two-phase commit) for providing ACID guarantees across multiple database instances. The protocol is broken into two phases:

  • First, the transaction coordinator asks each database involved to precommit the operation and indicate whether commit is possible. If all databases agree the commit can proceed, then phase 2 begins.
  • The transaction coordinator asks each database to commit the data.

If any database vetoes the commit, then all databases are asked to roll back their portions of the transaction. What is the shortcoming? We are getting consistency across partitions. If Brewer is correct, then we must be impacting availability, but how can that be?

The availability of any system is the product of the availability of the components required for operation. The last part of that statement is the most important. Components that may be used by the system but are not required do not reduce system availability. A transaction involving two databases in a 2PC commit will have the availability of the product of the availability of each database. For example, if we assume each database has 99.9 percent availability, then the availability of the transaction becomes 99.8 percent, or an additional downtime of 43 minutes per month.

An ACID Alternative

If ACID provides the consistency choice for partitioned databases, then how do you achieve availability instead? One answer is BASE (basically available, soft state, eventually consistent).

BASE is diametrically opposed to ACID. Where ACID is pessimistic and forces consistency at the end of every operation, BASE is optimistic and accepts that the database consistency will be in a state of flux. Although this sounds impossible to cope with, in reality it is quite manageable and leads to levels of scalability that cannot be obtained with ACID.

The availability of BASE is achieved through supporting partial failures without total system failure. Here is a simple example: if users are partitioned across five database servers, BASE design encourages crafting operations in such a way that a user database failure impacts only the 20 percent of the users on that particular host. There is no magic involved, but this does lead to higher perceived availability of the system.

So, now that you have decomposed your data into functional groups and partitioned the busiest groups across multiple databases, how do you incorporate BASE into your application? BASE requires a more in-depth analysis of the operations within a logical transaction than is typically applied to ACID. What should you be looking for? The following sections provide some direction.

Consistency Patterns

Following Brewer's conjecture, if BASE allows for availability in a partitioned database, then opportunities to relax consistency have to be identified. This is often difficult because the tendency of both business stakeholders and developers is to assert that consistency is paramount to the success of the application. Temporal inconsistency cannot be hidden from the end user, so both engineering and product owners must be involved in picking the opportunities for relaxing consistency.

Figure 2 is a simple schema that illustrates consistency considerations for BASE. The user table holds user information including the total amount sold and bought. These are running totals. The transaction table holds each transaction, relating the seller and buyer and the amount of the transaction. These are gross oversimplifications of real tables but contain the necessary elements for illustrating several aspects of consistency.

In general, consistency across functional groups is easier to relax than within functional groups. The example schema has two functional groups: users and transactions. Each time an item is sold, a row is added to the transaction table and the counters for the buyer and seller are updated. Using an ACID-style transaction, the SQL would be as shown in figure 3.

The total bought and sold columns in the user table can be considered a cache of the transaction table. It is present for efficiency of the system. Given this, the constraint on consistency could be relaxed. The buyer and seller expectations can be set so their running balances do not reflect the result of a transaction immediately. This is not uncommon, and in fact people encounter this delay between a transaction and their running balance regularly (e.g., ATM withdrawals and cellphone calls).

How the SQL statements are modified to relax consistency depends upon how the running balances are defined. If they are simply estimates, meaning that some transactions can be missed, the changes are quite simple, as shown in figure 4.

We've now decoupled the updates to the user and transaction tables. Consistency between the tables is not guaranteed. In fact, a failure between the first and second transaction will result in the user table being permanently inconsistent, but if the contract stipulates that the running totals are estimates, this may be adequate.

What if estimates are not acceptable, though? How can you still decouple the user and transaction updates? Introducing a persistent message queue solves the problem. There are several choices for implementing persistent messages. The most critical factor in implementing the queue, however, is ensuring that the backing persistence is on the same resource as the database. This is necessary to allow the queue to be transactionally committed without involving a 2PC. Now the SQL operations look a bit different, as shown in figure 5.

This example takes some liberties with syntax and oversimplifying the logic to illustrate the concept. By queuing a persistent message within the same transaction as the insert, the information needed to update the running balances on the user has been captured. The transaction is contained on a single database instance and therefore will not impact system availability.

A separate message-processing component will dequeue each message and apply the information to the user table. The example appears to solve all of the issues, but there is a problem. The message persistence is on the transaction host to avoid a 2PC during queuing. If the message is dequeued inside a transaction involving the user host, we still have a 2PC situation.

One solution to the 2PC in the message-processing component is to do nothing. By decoupling the update into a separate back-end component, you preserve the availability of your customer-facing component. The lower availability of the message processor may be acceptable for business requirements.

Suppose, however, that 2PC is simply never acceptable in your system. How can this problem be solved? First, you need to understand the concept of idempotence. An operation is considered idempotent if it can be applied one time or multiple times with the same result. Idempotent operations are useful in that they permit partial failures, as applying them repeatedly does not change the final state of the system.

The selected example is problematic when looking for idempotence. Update operations are rarely idempotent. The example increments balance columns in place. Applying this operation more than once obviously will result in an incorrect balance. Even update operations that simply set a value, however, are not idempotent with regard to order of operations. If the system cannot guarantee that updates will be applied in the order they are received, the final state of the system will be incorrect. More on this later.

In the case of balance updates, you need a way to track which updates have been applied successfully and which are still outstanding. One technique is to use a table that records the transaction identifiers that have been applied.

The table shown in figure 6 tracks the transaction ID, which balance has been updated, and the user ID where the balance was applied. Now our sample pseudocode is as shown in figure 7.

This example depends upon being able to peek a message in the queue and remove it once successfully processed. This can be done with two independent transactions if necessary: one on the message queue and one on the user database. Queue operations are not committed unless database operations successfully commit. The algorithm now supports partial failures and still provides transactional guarantees without resorting to 2PC.

There is a simpler technique for assuring idempotent updates if the only concern is ordering. Let's change our sample schema just a bit to illustrate the challenge and the solution (see figure 8). Suppose you also want to track the last date of sale and purchase for the user. You can rely on a similar scheme of updating the date with a message, but there is one problem.

Suppose two purchases occur within a short time window, and our message system doesn't ensure ordered operations. You now have a situation where, depending upon which order the messages are processed in, you will have an incorrect value for last_purchase. Fortunately, this kind of update can be handled with a minor modification to the SQL, as illustrated in figure 9.

By simply not allowing the last_purchase time to go backward in time, you have made the update operations order independent. You can also use this approach to protect any update from out-of-order updates. As an alternative to using time, you can also try a monotonically increasing transaction ID.

Ordering of Message Queues

A short side note on ordered message delivery is relevant. Message systems offer the ability to ensure that messages are delivered in the order they are received. This can be expensive to support and is often unnecessary, and, in fact, at times gives a false sense of security.

The examples provided here illustrate how message ordering can be relaxed and still provide a consistent view of the database, eventually. The overhead required to relax the ordering is nominal and in most cases is significantly less than enforcing ordering in the message system.

Further, a Web application is semantically an event-driven system regardless of the style of interaction. The client requests arrive to the system in arbitrary order. Processing time required per request varies. Request scheduling throughout the components of the systems is nondeterministic, resulting in nondeterministic queuing of messages. Requiring the order to be preserved gives a false sense of security. The simple reality is that nondeterministic inputs will lead to nondeterministic outputs.

Soft State/Eventually Consistent

Up to this point, the focus has been on trading consistency for availability. The other side of the coin is understanding the influence that soft state and eventual consistency has on application design.

As software engineers we tend to look at our systems as closed loops. We think about the predictability of their behavior in terms of predictable inputs producing predictable outputs. This is a necessity for creating correct software systems. The good news in many cases is that using BASE doesn't change the predictability of a system as a closed loop, but it does require looking at the behavior in total.

A simple example can help illustrate the point. Consider a system where users can transfer assets to other users. The type of asset is irrelevant—it could be money or objects in a game. For this example, we will assume that we have decoupled the two operations of taking the asset from one user and giving it to the other with a message queue used to provide the decoupling.

Immediately, this system feels nondeterministic and problematic. There is a period of time where the asset has left one user and has not arrived at the other. The size of this time window can be determined by the messaging system design. Regardless, there is a lag between the begin and end states where neither user appears to have the asset.

If we consider this from the user's perspective, however, this lag may not be relevant or even known. Neither the receiving user nor the sending user may know when the asset arrived. If the lag between sending and receiving is a few seconds, it will be invisible or certainly tolerable to users who are directly communicating about the asset transfer. In this situation the system behavior is considered consistent and acceptable to the users, even though we are relying upon soft state and eventual consistency in the implementation.

Event-Driven Architecture

What if you do need to know when state has become consistent? You may have algorithms that need to be applied to the state but only when it has reached a consistent state relevant to an incoming request. The simple approach is to rely on events that are generated as state becomes consistent.

Continuing with the previous example, what if you need to notify the user that the asset has arrived? Creating an event within the transaction that commits the asset to the receiving user provides a mechanism for performing further processing once a known state has been reached. EDA (event-driven architecture) can provide dramatic improvements in scalability and architectural decoupling. Further discussion about the application of EDA is beyond the scope of this article.

Conclusion

Scaling systems to dramatic transaction rates requires a new way of thinking about managing resources. The traditional transactional models are problematic when loads need to be spread across a large number of components. Decoupling the operations and performing them in turn provides for improved availability and scale at the cost of consistency. BASE provides a model for thinking about this decoupling.
Q

References

  1. http://highscalability.com/unorthodox-approach-database-design-coming-shard.
  2. http://citeseer.ist.psu.edu/544596.html.

DAN PRITCHETT is a Technical Fellow at eBay where he has been a member of the architecture team for the past four years. In this role, he interfaces with the strategy, business, product, and technology teams across eBay marketplaces, PayPal, and Skype. With more than 20 years of experience at technology companies such as Sun Microsystems, Hewlett-Packard, and Silicon Graphics, Pritchett has a depth of technical experience, ranging from network-level protocols and operating systems to systems design and software patterns. He has a B.S. in computer science from the University of Missouri, Rolla.

Actionable Items


  1. Google DAN PRITCHETT. The article is well-written with easy-to-understand example. 
  2. I just could not believe that I need to budget at least 1000 hours to learn system design. 
  3. It is better for me to learn very well before I can join any FANNG company or change a job. 
  4. I just could not believe that I need to take my technology job seriously. There are so many rich content on youtube.com. 
  5. It takes me over 11 years for me to understand the need to update my knowledge about distributed system. 

Follow up 

Sept. 9, 2021
I read the article again, since I came cross this video published by cloud girl. Here is the blog. 

Feb. 17, 2022
I am preparing for Microsoft Vancouver onsite second time on March 2022. I delayed the interview from Jan. 28 to March. I need to review all things about system design, BASE principle, CAP theorem is one of most important factors to learn again. 


System Design Meetup 2021-Jan-14: Messenger

Feb. 17, 2022

Here is the link. 

We are designing WhatsApp / Telegram / FB Messenger, and this also is the first meetup where we use online whiteboarding.

1:13:40 / 2:09:32




Tuesday, February 15, 2022

That's how life rolls with Diego Rejtman and Chuck Edward (AMAZING Microsoft Leaders)

Feb. 15, 2022

Here is the link. 


System design: Important books

 Important Books :

  1. Amazon.com: System Design Interview – An Insider's Guide eBook: Xu, Alex: Kindle Store
  2. Amazon.com: Operating Systems: Three Easy Pieces eBook: Arpaci-Dusseau, Remzi, Arpaci-Dusseau, Andrea: Kindle Store
  3. Web Scalability for Startup Engineers: Ejsmont, Artur: 9780071843652: Amazon.com: Books
  4. Understanding Distributed Systems: What every developer should know about large distributed applications: Vitillo, Roberto: 9781838430207: Amazon.com: Books
  5. Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems: Kleppmann, Martin: 9781449373320: Amazon.com: Books
  6. Kafka: The Definitive Guide: Real-Time Data and Stream Processing at Scale: 9781491936160: Computer Science Books @ Amazon.com
  7. Buy Distributed Algorithms – An Intuitive Approach 2e (The MIT Press) Book Online at Low Prices in India | Distributed Algorithms – An Intuitive Approach 2e (The MIT Press) Reviews & Ratings - Amazon.in
  8. Elasticsearch: The Definitive Guide: A Distributed Real-Time Search and Analytics Engine eBook: Gormley, Clinton, Tong, Zachary: Amazon.in: Kindle Store
  9. Buy Cassandra – The Definitive Guide, 3e: Distributed Data at Web Scale Book Online at Low Prices in India | Cassandra – The Definitive Guide, 3e: Distributed Data at Web Scale Reviews & Ratings - Amazon.in

Youtube.com | System design channels

Compiled by - Pooja Biswas

pooja biswas | LinkedIn

All system design youtube channels

  1. https://www.youtube.com/user/dimakorolev/videos

2.       https://www.youtube.com/c/ByteByByte/videos

3.       https://www.youtube.com/channel/UC_n-A84J0UcU5uq4sEh2CnQ

4.       https://www.youtube.com/c/DefogTech/videos

5.       https://www.youtube.com/c/HusseinNasser-software-engineering/videos

6.       https://www.youtube.com/c/SystemDesignInterview/videos

7.       https://www.youtube.com/c/sudoCODE/videos

8.       https://www.youtube.com/c/codeKarle/videos

9.       https://www.youtube.com/c/CMUDatabaseGroup/videos

10.   https://www.youtube.com/c/interviewingio/videos

11.   https://www.youtube.com/c/GauravSensei/videos

12.   https://www.youtube.com/c/EngineeringwithUtsav/videos

13.   https://www.youtube.com/channel/UClB4KPy5LkJj1t3SgYVtMOQ/videos

14.   https://www.youtube.com/c/ExponentTV/videos

15.   https://www.youtube.com/watch?v=cQP8WApzIQQ&list=PLrw6a1wE39_tb2fErI4-WkMbsvGQk9_UB

16.   https://www.youtube.com/c/TheInterviewSage/videos

17.   https://www.youtube.com/c/ThinkSoftware/videos

18.   https://www.youtube.com/c/SuccessinTech/videos

19.   https://www.youtube.com/c/TechDummiesNarendraL/videos

             20. https://www.youtube.com/c/OktaDev/videos