- Many applications today are data intensive, as opposed to compute-intensive. Raw CPU power is rarely a limiting factor for these applications--bigger problems are usually the amount of data, the complexity of data, and the speed at which it is changing.
- A data-intensive application is typically built from standard building blocks that provide commonly needed functionality.
- A fault is usually defined as one component of the system deviating from its spec, whereas a failure is when the system as a whole stops providing the required service to the user.
- It is impossible to reduce the probability of a fault to zero; therefore it is usually best to design fault-tolerance mechanisms that prevent faults from causing failures.
- Many critical bugs are actually due to poor error handling; by deliberately inducing faults, you ensure that the fault tolerance machinery is continually exercised and tested, which can increase your confidence that faults will be handled correctly when they occur naturally.
- Design systems in a way that minimize opportunities for error.
- Some systems are elastic, meaning that they can automatically add computing resources when they detect a load increase, whereas other systems are scaled manually.
- An elastic system can be useful if load is highly unpredictable, but manually scaled systems are similar and may have fear operation surprises.
- One of the best tools we have for removing accidental complexity is abstraction. A good abstraction can hide a great deal of implementation detail behind a clean, simple-to-understand facade.
- Data models are perhaps the most important part of developing software, because they have such a profound effect: not only on how the software is written, but also on how we think about the problem that we are solving.
- Most applications are built by layering one data model on top of another. For each layer, the key question is: how is it represented in terms of the next-lower layer?
- MapReduce is a programming model for processing large amounts of data in bulk across many machines.
- The Datalog approach requires a different kind of thinking to the other query languages discussed in this chapter, but it’s a very powerful approach, because rules can be combined and reused in different queries. It’s less convenient for simple one-off queries, but it can cope better if your data is complex.
- Document databases target use cases where data comes in self-contained documents and relationships between one document and another are rare.
- Graph databases go in the opposite direction, targeting use cases where anything is potentially related to everything.
- On the most fundamental level, a database needs to do two things: when you give it some data, it should store the data, and when you ask it again later, it should give the data back to you.
- In order to efficiently find the value for a particular key in the database, we need a different data structure: an index.
- An index is an additional structure that is derived from the primary data. Many databases allow you to add and remove indexes, and this doesn’t affect the contents of the database; it only affects the performance of queries.
- Key-value stores are quite similar to the dictionary type that you can find in most programming languages, and which is usually implemented as a hash map.
- The simplest possible indexing strategy is this: keep an in-memory hash map where every key is mapped to a byte offset in the data file--the location at which the value can be found. Whenever you append a new key-value pair to the file, you also update the hash map to reflect the offset of the data you just wrote. When you want to look up a value, use the hash map to find the offset in the data file, seek to that location, and read the value.
- An append-only log seems wasteful at first glance: why don’t you update the file in place, overwriting the old value with the new value? But an append-only design turns out to be good for several reasons.
- Appending and segment merging are sequential write operations, which are generally much faster than random writes, especially on magnetic spinning-disk hard drives.
- Concurrency and crash recovery are much simpler if segment files are append-only or immutable.
- Merging old segments avoids the problem of data files getting fragmented over time.
- A full-text index is much more complex than a key-value index but is based on a similar idea: given a word in a search query, find all the documents that mention the word. This is implemented with a key-value structure where the key is a word and the value is the list of IDs of all the documents that contain the word.
- A Bloom filter is a memory-efficient data structure for approximating the contents of a set. It can tell you if a key does not appear in the database, and thus saves many unnecessary disk reads for nonexistent keys.
- The basic idea of LSM-trees--keeping a cascade of SSTables that are merged in the background--is simple and effective.
- B-trees have stood the test of time very well. They remain the standard index implementation in almost all relational databases, and many non relational databases use them too.
- Like SSTables, B-trees keep key-value pairs sorted by key, which allows efficient key-value lookups and range queries.
- In write-heavy applications, the performance bottleneck might be the rate at which the database can write to disk.
- A primary key uniquely identifies one row in a relational table, or one document in a document database, or one vertex in a graph database.
- It is also very common to have secondary indexes. In relational databases, you can create several secondary indexes on the same table [...] and they are often crucial for performing joins efficiently.
- The key in an index is the thing that queries search for, but value can be one of two things: it could be the actual row (document, vertex) in question, or it could be a reference to the row stored elsewhere.
- The heap file approach is common because it avoids duplicating data when multiple secondary indexes are present: each index just references a location in the heap file, and the actual data is kept in one place.
- As RAM becomes cheaper, the cost-per-gigabyte argument is eroded. Many datasets are simply not that big, so it’s quite feasible to keep them entirely in memory, potentially distributed across several machines. This has led to the development of in-memory databases.
- When an in-memory database is restarted, it needs to reload its state, either from disk or over the network from a replica.
- A data warehouse is a separate database that analysts can query to their hearts’ content, without affecting OLTP operations. The data warehouse contains a read-only copy of the data in all the various OLTP systems in the company.
- The big advantage of using a separate data warehouse, rather than querying OLTP systems directly for analytics, is that the data where can be optimized for analytic access patterns.
- The name “star schema” comes from the fact that when the table relationships are visualized, the fact table is in the middle, surrounded by its dimension tables; the connections to these tables are like the rays of a star.
- The idea behind column-oriented storage is simple: don’t store all the values from one row together, but store all the values from each column together instead. If each column is stored in a separate file, a query only needs to read and parse those columns that are used in that query, which can save a lot of work.
- Log-structured storage engines are a comparatively recent development. Their key idea is that they systematically turn random-access writes into sequential writes on disk, which enables higher write throughput due to the performance characteristics of hard drives and SSDs.
- In most cases, a change to an application’s features also requires a change to data that it stores: perhaps a new field or record type needs to be captured, or perhaps existing data needs to be presented in a new way.
- Many programming languages come with built-in support for encoding in-memory objects into byte sequences.
- CSV does not have any schema, so it is up to the application to define the meaning of each row and column. If an application change adds a new row or column, you have to handle that change manually.
- The difficulty of getting different organizations to agree on anything outweighs most other concerns.
- Apache Thirst and Protocol Buffers are binary encoding libraries that are based on the same principle. Protocol Buffers was originally developed at Google, Thrift was originally developed at Facebook, and both were made open source in 07-08. Both Thrift and Protocol Buffers require a scheme for any data that is encoded.
- A key design goal of a service-oriented/microservices architecture is to make the application easier to change and maintain by making services independently deployable and evolvable.
- REST is not a protocol, but rather a design philosophy that builds upon the principles of HTTP. It emphasizes simple data formats, using URLs for identifying resources and using HTTP features for cache control ,authentication, and content type negotiation.
- The detailed delivery semantics vary by implementation and configuration, but in general, message brokers are used as follows: one process sends a message to a named queue or topic, and the broker ensures that the message is delivered to one or more consumers of or subscribers to that queue or topic. There can be many producers and many consumers on the same topic.
- If all you need is to scale to higher load, the simplest approach is to buy a more powerful machine (sometimes called vertical scaling or scaling up). Many CPUs, many RAM chips, and many disks can be joined together under one operating system, and a fast interconnect allows any CPU to access any part of the memory or disk. In this kind of shared-memory architecture, all the components can be treated as a single machine.
- Being able to reboot individual nodes without downtime is a big advantage for operations and maintenance. Thus, our goal is to keep the system as a whole running despite individual node failures, and to keep the impact of a node outage as small as possible.
- Despite being a simple goal--keeping a copy of the same data on several machines--replication turns out to be a remarkably tricky problem. It requires carefully thinking about concurrency and about all the things that can go wrong, and dealing with the consequences of those faults.
- The main reason for wanting to partition data is scalability. Different partitions can be placed on different nodes in s shared-nothing cluster. Thus, a large dataset can be distributed across many disks, and the query load can be distributed across many processors.
- The simplest approach for avoiding hot spots would be to assign records to nodes randomly. That would distribute the data quite evenly across the nodes, but it has a big disadvantage: when you’re trying to read a particular item, you have no way of knowing which node it is on, so you have to query all nodes in parallel.
- A good hash function takes skewed data and makes it uniformly distributed.
- For partitioning purposes, the hash function need not be cryptographically strong.
- Partitioning is necessary when you have so much data that storing and processing it on a single machine is no longer feasible.
- In general, atomic reference to something that cannot be broken down into smaller parts.
- A transaction is usually understood as a mechanism for grouping multiple operations on multiple objects into one unit of execution.
- A key feature of a transaction is that it can be aborted and safely retried if an error occurred. ACID databases are based on this philosophy: if the database is in danger of violating its guarantee of atomicity, isolation, or durability, it would rather abandon the transaction entirely than allow it to remain half-finished.
- If two transactions don’t touch the same data, they can safely be run in parallel, because neither depends on the other.
- The simplest way of avoiding concurrency problems is to remove the concurrency entirely: to execute only one transaction at a time, in serial order, on a single threat. By doing so, we completely sidestep the problem of detecting and preventing conflicts between transactions: the resulting isolation is by definition serializable.
- Transactions are an abstraction layer that allows an application to pretend that certain concurrency problems and certain kinds of hardware and software faults don’t exist.
- A large class of errors is reduced down to a simple transaction abort, and the application just needs to try again.
- This nondeterminism and possibility of partial failures is what makes distributed systems hard to work with.
- With these philosophies come very different approaches to handling faults.
- The bigger a system nuggets, the more likely it is that one of its components is broken. Over time, broken things get fixed and new things break, but in a system with thousands of nodes, it is reasonable to assume that something is always broken.
- When the error handling strategy consists of simply giving up, a large system can end up spending a lot of its time recovering from faults rather than doing useful work.
- If we want to make distributed systems work, we must accept the possibility of partial failure and build fault-tolerance mechanisms into the software. In other words, we need to build a reliable system from unreliable components.
- When one part of the network is cut off from the rest due to a network fault, that is sometimes called a network partition or net-split.
- Rapid feedback about a remote node being down is useful, but you can’t count on it. [...] If you want to be sure that a request was successful, you need a positive response from the application itself.
- UDP is a good choice in situations where delayed data is worthless.
- In a distributed system, time is a tricky business, because communication is not instantaneous: it takes time for a message to travel across the network from one machine to another.
- A time-of-day clock does what you intuitively expect of a clock: it returns the current date and time according to some calendar.
- A monotonic clock is suitable for measuring a duration (time interval), such as timeout or a service’s response time.
- Monotonic clocks don’t need synchronization, but time-of-day clocks need to be set according to an NTP server or other external time source in order to be useful.
- Thus, if you use software that requires synchronized clocks, it is essential that you also carefully monitor the clock offsets between all the machines. Any node whose clock drifts too far from the others should be declared dead and removed from the cluster. Such monitoring ensures that you notice the broken clock before they can cause too much damage.
- A node in a distributed system must assume that its execution can be paused for a significant length of time at any point, even in the middle of a function. During the pause, the rest of the world keeps moving and may even declare the paused node dead because it’s not responding. Eventually, the paused node may continue running, without even noticing that it was asleep until it checks its clock sometime later.
- In embedded systems, real-time means that a system is carefully designed and tested to meet specified timing guarantees in all circumstances.
- Providing real-time guarantees in a system requires support from all levels of the software stack.
- For most server-side data processing systems, real-time guarantees are simply not economical or appropriate. Consequently, these systems must suffer the pauses and clock instability that come from operating in a non-real-time environment.
- The moral of these stories is that a node cannot necessarily trust its own judgement of a situation. A distributed system cannot exclusively rely on a single node, because a node may fail at any time ,potentially leaving the system stuck and unable to recover.
- If a quorum of nodes declares another node dead, then it must be considered dead, even if that node still very much feels alive. The individual node must abide by the quorum decision and step down.
- To tolerate faults, the first step is to detect them, but even that is hard. Most systems don’t have an accurate mechanism of detecting whether a node has failed, so most distributed algorithms rely on timeouts to determine whether a remote node is still available.
- If you can avoid opening Pandora’s box and simply keep things on a single machine, it is generally worth doing so.
- The best way of building fault-tolerant systems is to find some general-purpose abstractions with useful guarantees, implement them once, and then let applications rely on those guarantees.
- One of the most important abstractions for distributed systems is consensus: that is, getting all of the nodes to agree on something.
- Most replicated databases provide at least eventual consistency, which means that if you stop writing to the database and wait for some unspecified length of time, then eventually all read requests will return the same value.
- A better name for eventual consistency may be convergence, as we expect all replicas to eventually converge to the same value.
- The basic idea behind linearizability is simple: to make a system appear as if there is only a single copy of the data.
- Consensus is one of the most important and fundamental problems in distributed computing.
- Surprisingly many data analyses can be done in a few minutes using some combination of awk, sed, grep, sort, uniq, and xargs, and they perform surprisingly well.
- The main difference from pipelines of Unix commands is that MapReduce can parallelize a computation across many machines, without you having to write code to explicitly handle the parallelism.
- In the Unix world, the uniform interface that allows one program to be composed with another is files and pipes; in MapReduce, that interface is a distributed file system.
- In general, a “stream” refers to data that is incrementally made available over time.
- There is no single system that can satisfy all data storage, querying, and processing needs. In practice, most nontrivial applications need to combine several different technologies in order to satisfy their requirements.
- Conventional search engines first index the documents and then run queries over the index. By contrast, searching a stream turns the processing on its head: the queries are stored, and the documents run past the queries, like in CEP.
- Actor frameworks are primarily a mechanism for managing concurrency and distributed execution of communication modules, whereas stream processing is primarily a data management technique.
- One solution is to break the stream into small blocks, and treat each block like a miniature batch process. This approach is called micro batching, and it is used in Spark Streaming.
- An idempotent operation is one that you can perform multiple times, and it has the same effect as if you performed it only once.
- Even if an operation is not naturally idempotent, it can often be made idempotent with a bit of extra metadata.
- A recurring theme in this book has been that for any given problem, there are several solutions, all of which have different pros, cons, and trade-offs.
- Thus, the most appropriate choice of software tool also depends on the circumstances. Every piece of software, even a so-called “general-purpose” database, is designed for a particular usage pattern.
20210411
Designing Data-Intensive Applications by Martin Kleppmann
20210410
Overcoming Gravity by Steven Low
- In the body, the SAID principle rules all. The SAID principle is simple: Specific Adaptation to Imposed Demands.
- Generally speaking, you must progressively add more weight to the barbell in order to increase strength and hypertrophy.
- Likewise, with bodyweight exercises you must find a way to make the exercises more difficult in order to progressively overload the body and gain strength and hypertrophy.
- In bodyweight exercises this is executed through manipulating leverage.
- Decreasing leverage in progressive bodyweight exercises is primarily employed through two different methods: changing the body position and changing the muscle length.
- The repetition continuum has strength at one end and endurance at the other. The strength side is attained through low repetitions and heavier weight or higher intensity where a 1 reputation maximum elicits the most strength. Endurance occurs with less weight or less intensity and more repetitions.
- Strength and endurance cannot be optimally developed at the same time, since they are at opposite ends of the spectrum.
- In general, if you are going to cross-train strength and endurance, but have a focus on one portion over another, an 80/20 split tends to work very well. This means that 80% of your training should be dedicated toward the particular area that you want to develop the most, and 20% of your training can be devoted to the other parts
- The SAID principle--specific adaptation to imposed demands--governs all of the changes that occur within the body in training.
- Progressive overload is the way to apply the SAID principle to training in order to constantly progress.
- Overall, strength is predicated on a simple equation: strength = neural adaptations * muscle cross sectional area.
- The force output of a muscle is based on the cross-sectional area of the muscle, angle of attack on the joint, individual limb length, and, most importantly, neural factors.
- Neural adaptations are what the majority of strength training is about.
- Excessive muscle mass tends to have a net negative effect only when you start to become extremely large; bodybuilder size.
- When training for strength and hypertrophy, you generally want to use weights that are heavy or bodyweight exercises that are intense and difficult.
- There is some new evidence coming out that training with high repetition may also confer solid strength gains as long as you train with high intensity every other week.
- The nervous system has limiters on the amount of force we can produce. Specific structures called Golgi tendon organs in our musculotendinous junctions provide feedback to the brain, which decreases muscle forces to prevent injury in untrained people.
- Ultimately, if your goal is massive amounts of hypertrophy you may need to alternate your repetition range, rest times, and other factors if one style of training does not seem to be working effectively.
- Simply put, if we want to get really good at something we have to do it a lot. This will be an important thing to remember when we start to construct routines.
- Motor learning occurs automatically in the brain and is mostly active for movements that are practiced repeatedly. [...] This is a primary adaption of skill work, but it is arguably impossible for one to consciously train it, ,as the body automatically performs in adaption to your conscious training.
- What is important to know, to obtain the benefits of this process, is that you should concentrate 100 while practicing your movements. This will ensure that you are performing them correctly, thus teaching your body the correct movement patterns.
- Generally, as you become more experienced, your exercises become more intense.
- Isometrics are particularly interesting because they branch over multiple pathways toward hypertrophy.
- While it is important to know that certain adaptations and differences in hypertrophy mechanisms may occur, there is really no such thing as unwanted hypertrophy--unless it makes one too heavy for their sport or weight class.
- Overall volume in the context of frequency means the most in regard to hypertrophy.
- The volume of the exercise on particular muscles must exceed a certain threshold for hypertrophy, which in effect will increase as your muscles get bigger.
- If your ultimate goal is purely hypertrophy, it is generally a good idea to perform primarily barbell-type exercise. This is not to say you cannot gain an impressive physique with bodyweight exercises, it will just take longer.
- Practice does not make perfect; perfect practice makes perfect.
- Work capacity is naturally increased as you train.
- Hypertrophy tends to occur through three mechanisms: mechanical tension, eccentric damage and microtrauma, and local metabolic and hypoxic factors.
- There is no such thing as myofibrillar or sarcoplasmic hypertrophy, just hypertrophy.
- It is more beneficial to focus on weaknesses and bringing deficient skills and strength progressions up to the level of your more advanced abilities.
- Shoring up your weaknesses will keep you healthier than if you solely pursue one set of strength or skill progressions.
- The programming needs for the beginner are different than those with intermediate, advanced, or elite strength. The level of programming will vary between the levels of strength, because you cannot expect to train similarly to someone who is stronger or weaker than you.
- The vast majority of beginner programs focus on full-body workouts performed three times per week.
- As you move into the intermediate range, your training needs will begin to diversify based on your goals. Because your needs will become more specific, a full-body routine will be less effective. Training will need to become more specific in nearly every area, including skill work, sport-specific skills, flexibility, mobility, prehabilitation, and rehabilitation.
- When training, it is easy to get sidetracked into minutia, and the experience of a veteran coach can help cut through the things that matter less in the big picture of training.
- Your emphasis should be on the things that will maximize your improvement, while staying injury-free and on track to reach your goals.
- It is not recommended that you train for both strength and endurance simultaneously.
- A lack of strength will always limit you in other domains--technique, endurance, skill, balance, flexibility--both active and passive--agility, coordination, etc. You must be strong in order to excel in all of these other domains. The converse is typically not true. It is important to keep this in mind as you set your goals.
- While it is better to have goals than not have any at all, you will be infinitely more successful if you write these goals down. Once written down, look at them regularly and work toward them. Checking things off of a physical list is a powerful positive reinforcement that will give your training drive.
- It cannot be emphasized enough: keep your goals written in a training journal.
- Goals should follow a progression. You want your goals to be both quantitative and qualitative. They should focus on your overarching aim: development of strength.
- Keeping the shoulders and shoulder blades operating optimally is the key to bodyweight strength success.
- The shoulder is the lynchpin of the upper body, just as the hip is for the lower body.
- The simplest method to maintain shoulder structural balance involves utilizing pull and push exercises, which will offset one another. This will allow you to maintain a healthy balance of strength and hypertrophy at the shoulder.
- Fundamentally, dips are one of the best upper-body pushing exercises for brute strength, and an excellent comparison would be that they are similar to an upper-body squat.
- Dips will help to build primary pushing strength and overall muscle volume, which ensures a good base for further exercises.
- In bodyweight and barbell training, most routines lack a proper amount of pulling exercises.
- Development of strength in active flexibility positions is the key to dominating bodyweight movements. These will drastically increase your body awareness and ability to control your muscles through all ranges of motion.
- It is important to keep structural balance consideration in mind, in order to keep your shoulders healthy. The shoulders are the lynchpin for the upper body in terms of strength development. Therefore, it is of utmost important to construct your entire routine around maintaining healthy shoulders.
- I prefer the push pull system for classifying different types of body weight exercises, as it is simple and effective.
- The key of any single workout is to have a high enough intensity and enough volume to stress the body so it will adapt to increase strength and hypertrophy. This is especially true if you are a beginner.
- Linear progression increases the intensity of the exercises relative to the number of repetitions by adding weight. This process of adding weight to the lifts with each new workout forces constant adaptations with every workout, so that both strength and muscle mass can be drastically increased.
- Once you stop progressing from workout to workout, consider more advanced concepts if you want to increase your capacity to grow stronger.
- Supercompensation is the concept that the combination of a few workouts that depress abilities more than normal will result in a rebound effect, which results in implements that might not be seen from a single workout.
- The training stimulus must pass a certain threshold to force good adaptations. This means you do enough to avoid undertraining, but not too much, which can actually cause so much damage that you do not gain any super compensatory effect at all. Again, less is often more.
- At the highest levels, the frequency of workouts will matter the most in gaining strength.
- You may have heard it said that strength is a skill.
- Repeating a certain movement over and over with progressive overload will lead to strength gains, which is why doing too many different exercises should be avoided if you want to gain strength.
- Programming is the concept of changing workout routines via intensity, volume, and frequency, which results in progressive overload.
- The previously athletic sedentary population is the most at-risk for tendonitis and other connective tissue injuries because their strength and muscle mass will come back rapidly. This will lead to quick progress, but connective tissue strength and integrity will lag.
- For those who are rehabilitated from an injury, a generally good rule of thumb is to continue to do rehabilitation exercises at the end of a routine. This ensures continued activity to the body part in question, which will help build resilience against further or additional injury.
- It is important to realize where you are and adapt your workouts accordingly, in order to prevent potential overuse injuries.
- There are three general types of routine structures used when training: full-body routines, splits, and body part splits.
- If your goal is hypertrophy, then full-body and split routines provide essentially the same result if the overall volume of muscle groups is similar.
- It is a simple truth that the more often you work the movements you want to master, the faster you will improve.
- Full-body routines add up over the course of a year and are therefore more effective compared to splits for beginner and intermediate level athletes.
- It is beneficial to give the muscles a rest between workouts.
- Isolation work is best utilized at opposite ends of the fitness spectrum: for injured or for elite athletes.
- If you are a beginner or intermediate athlete--as indicated by the strength progression charts--you should utilize a full-body routine with few exceptions.
- Since frequency is the key to making the faster progress toward your chosen goals, it is best to select a routine template that allows for the most frequency in the shortest time, as long as there are no injury concerns.
- The goal of a warm-up is to prime the body into an optimal state for your workout and address any deficiencies in movement.
- Burpees are an excellent choice [of warmup] because they are a full-body exercise that rapidly increases your heart rate. Additionally, they are easy to perform and carry a low risk of injury.
- The second critical component of a warmup is mobility work. A quick, short circuit of movements that focus on full range of movement to warm up the joints and surrounding tissues is the most useful.
- The main thing is that not just the muscles are prepared for exercise but also that the tendons, ligaments, cartilage, and joints are as well. This may require more repetitions and/or sets for some people than others.
- Never stretch statically for more than fifteen seconds. Stretching for longer than this may decrease your strength output during your workout. Three to four short stretches should take you about a minute.
- Skill and technique work should always take place after your warm-up. This is the optimal time for your body to learn new skills or new movement patterns.
- Good skill and technique practice should always be emphasized.
- With skill work, err on the side of caution: start with what feels like “too little” and add more if you need it.
- Those who start with too much skill work will have a difficult time identifying what is wrong if they are not progressing.
- Put in quality work, but don’t be afraid to quit if you are feeling fatigued or having an off day.
- A proper warm-up should cover three areas: blood flow, mobility, positional drills.
- The general template for an effective full-body strength routine includes two pushing exercises, two pulling exercises, and two legs.
- When aiming to build strength, there are two basic rules of thumb to follow when determining the number of repetitions per set for concentric exercises, with an additional rule for those seeking hypertrophy.
- The first is: perform your maximum repetitions, minus one. Three sets minimum.
- Studies suggest that if your primary goal is hypertrophy rather than strength you can perform your sets to failure.
- The second rule of thumb is called the rule of fifteen: Aim for a minimum of fifteen total repetitions per exercise.
- The optional rule of thumb (for hypertrophy); Beginners should aim for tens sets of exercise per muscle group.
- You should prioritize the exercises you perform to align with your goals.
- One last note is that paired sets should not be confused with supersets or drop sets.
- Hypertrophy is relatively similar for all tempos if the total time under tension or volume is the same. Whether you go slowly or fast with a weight, your muscles fibers are going to be fatigued at the end of the set if you perform it to failure.
- Be sure to work your core on both sides.
- Last set to failure is an interesting method of progression because it stays short of failure on all of the sets except the last one. This may be one of the more effective ways to progress with strength, as strength can be built effectively by staying short of failure.
- Periodization refers to any method used to vary the volume, intensity, and frequency of a workout to produce constant gains and avoid plateaus.
- It is vital to keep your joints, tendons, and muscles moving well. Good quality body tissues should not hurt or feel sore or painful when you apply pressure or message them.
- Your joints should feel good when you use them.
- Prehabilitation work refers to the part of your workout that is focused on injury prevention. Prehabilitation exercises are focused on correcting imbalances and preventing injuries from occurring by performing specific exercise on your weak links.
- The shoulder is a common joint where prehabilitation work may be needed.
- If your shoulders need additional stabilization exercise, perform exercises for your rotator cuffs or stability exercises such as Turkish get-ups for the glenohumeral joint.
- The main reason to place specific rehabilitation work at the end of the workouts is that performing these exercises before a workout will fatigue you.
- Connective tissues such as tendons, ligaments, and cartilage tend to respond better to higher repetition because of the increase in blood flow that assists with healing.
- For extremity joints such as the wrists, elbows, and knees, it is likely that wherever your discomfort or soreness is present, that is where the prehabilitation and isolation work need to be focused.
- The three most common causes of tightness in the back are pain, instability, or weakness.
- High-repetition kettlebell swings are known to help significantly with back tightness and pain. Why? Because kettlebell swings with light weights force your core muscles to stabilize your spine while simultaneously providing a stimulus for the back to become stronger under load. This corrects both instability and weaknesses at the same time.
- Stretching too much is akin to programming too many exercises or putting too much volume in a work out. You become sore and may potentially lose any gains you have made. More is not always better. Focus on making small, incremental amounts of progress and maintaining the gains you have made.
- Higher repetitions are initially good for untrained beginners.
- You should focus your mobility and strength work on a few key areas: your shoulders, elbows, wrists, and thoracic spine.
- As a beginner, the most important key is consistency. A lack of consistency would be defined as performance workouts only once or twice a week, or skipping weeks entirely. If you are sporadic in your training, you will likely not progress.
- Deloading is an art. The goal is to supercompensation without losing the adaptations you have gained from the previous mesocycle by increasing the amount of rest you are allowing yourself.
- Keep whatever you do as simple as possible. Follow the KISS model--keep it simple, stupid. Make very few changes to your overall programming from cycle to cycle so you can see what affects your progress. This allows you to become a better programmer much faster, and it will also help you fall in making faster progress.
- Both ladders and pyramids are ways to drastically increase the volume of the number of repetitions of an exercise in a single session.
- High-intensity interval training (HITT) and similar techniques, like fartlek, are good ways to work all of the energy systems in your body because it depletes them very fast.
- Despite the fact that low-intensity steady state (LISS) endurance training is demonized by many, it remains the most effective way to increase aerobic capacity. There is a reason why every intermediate and long distance runner uses LISS training.
- The Pareto Principle (or 80/20 rule) tends to be a good rule of thumb for maintaining a balance between power, strength, and endurance in your workouts.
- If you are a strength and power athlete, 80% of your training should be devoted toward that, with 20% of your training devoted to walking or LISS cardio to promote recovery--and vice versa for endurance athletes.
- Be smart. You cannot do too many things at once. You have to prioritize what you want most out of life; otherwise, you will not be good at anything.
- When in doubt, seek advice from those more experienced than you. Do not be afraid to be humble. Accept that you do not know everything and can always learn more.
- Strength work is the foundation of athletic development. If you develop strength first, many other attributes and sport-specific skills will develop optimally [...]. Because everything builds on strength, it is the most important attribute for beginner and intermediate athletes to develop.
- Here is the “beginner routine” used as a standard by Gymkana, an exhibitional gymnastics group, for decades:
- Begin from hang
- Muscle-up to support
- L-sit
- Shoulder stand
- Come down to support
- Immediately roll back into inverted hang
- Back lever
- German hang pullout
- Swing to flyaway dismount
- Strength and conditioning are a fundamental aspect of various sports. Specifically, strength and conditioning are important for improving effectively and to prevent injury.
- The biggest gains that beginners should be concerned about is not overtraining, but performing too much volume in a single workout. This high volume is not necessarily more than a beginner can handle, but it can cause overuse injuries or inhibit optimal progression. Remember, more is not always better.
- The two most obvious symptoms of overtraining are a decrease in appetite and sleep quality.
- Removing aggravating exercises is more important than trying to use pain as a guide.
- Your body is trained by the things you do continually. If you teach your body to do negative things, it will learn these things and adjust accordingly--leading to injuries, poor posture, and poor movements.
- Movement is a critical factor right after an injury has occurred, even over rest.
- The RICE approach is the traditional model for injury treatment. The MEAT approach is an alternative model that is basically physical therapy rehabilitation in disguise. It is important to note that in the MEAT approach, physical therapy is indicated from day one or even day zero.
- You want as much early movement as you can get within your pain tolerance level.
- Mobilizing the area leads to much longer recovery times because your muscles begin to stiffen up and motor control quality decreases.
- MEAT: movement, exercise, analgesia, treatment
- The number one reason your muscles begin to atrophy (the opposite of hypertrophy) is immobility and disuse. Atrophy caused by immobility occurs very rapidly, often as soon as a week or two after restricting a joint due to injury.
- Always perform rehabilitation work for your injuries instead of avoiding them by programming other types of exercise to compensate.
- Skimping on sleep is a surefire way to decrease progress with both strength and hypertrophy. Sleep is vital for recovery.
- Sleep is the most anabolic time during the day.
- Tracking calories solves many weight loss issues, as most people routinely underestimate how many calories they actually consume each day, especially through liquids [...].
- Supplements should be just that--supplements to a good diet.
- The primary supplements that have been proven to work effectively are whey, creatine, casein, and BCAAs.
- Sleep quality and nutrition have a big influence on the body, so you should do everything you can to ensure you get enough sleep and sufficient nutrients from your food.
- In general, diet modulates weigh. Exercise modulates body composition. Nutrition quality is related to health and partly to weight. Exercise intensity improves speed of body composition changes.
- Weight gain and loss is a product of calories in and out.
- Get moving now and make adjustments as you go.
- Part of learning how to properly construct a solid routine is figuring out how your body responds to different exercises, and you cannot learn this from the advice of others.
- The number one predictor of an injury is a previous injury.
- Eliminating, reducing volume, and substituting exercises is a standard way to protect yourself from injury.
- Tendinitis is an overuse injury where the ability of the tendon to sustain a workload is insufficient.
- Tendinitis typically develops because connective tissues adapt slower than muscles.
- Avoiding injury-aggravating exercises will solve 95% of potential overuse injuries with no further steps needed.
- Reverse hyperextensions are particularly good for rebuilding strength, stability, and hypertrophy in the lower back. These can be used for prehabilitation prior to returning to classic compound exercises like squats and deadlifts. This exercise has a very high success rate. Light kettlebell swings can also be used effectively.
- Most exercises for improving posture/alignment focus on pulling the shoulders back and the neck in. These exercises are good, but they will not do much to improve alignment unless everything else in your body is also positioned properly.
- Hip mobility and flexibility is critical for bodyweight training.
- Hanging out in the bottom of the squat position can be effective for increasing bent leg flexibility in your hips and thighs, as well as your legs.
- Side-to-side squats can be particularly effective. Going back and forth between each leg works multiple muscles and can help stretch them if you steal into the squat.
- The spiderman stretch is another useful exercise for overall hip mobility.
- The movement that hits all of your thoracic and lumbar vertebrae is called the bridge. This is a staple in gymnastics.
- Performing thoracic extension mobility work should restore your ability to obtain full overhead flexion in your shoulder girdle.
- Mobilizing your lats with a foam roller is particularly good for opening up your shoulders and releasing tensions.
- The shoulder is the lynchpin of the upper body and its most mobile area. This means that there is a greater intentional injury at your shoulder joints than any other place in your upper body.
- Scapular wall slides are an excellent tool for mobilizing your tissues in retraction combined with elevation and depression.
- Band dislocates are another good choice for shoulder mobility. This exercise stretches all of your anterior shoulder muscles and your shoulder capsule.
- The chin-up position provides good conditioning for the elbows, a necessity for many straight-arm isometric exercises.
- Another good exercise to loosen up your shoulders is to change from the bar.
- Your elbows are relatively simple joints that do not need much as far as mobility and flexibility are concerned. However, it is important to perform proper rehabilitation work, as your elbows are particularly vulnerable to injuries.
- Wrist push ups are certainly a good exercise in terms of mobility and prehabilitation; however, they are not an “end-all, be-all” for wrist mobility.
- Any type of mobility/flexibility work that stretches your wrists is good, as is any work that strengthens your wrists.
- Five key areas: the hips, back, shoulders, elbows, and wrists.
- Proper handstand technique stacks all of your joints in alignment and reduces the mount of muscular effort required to perform the movement. This makes the handstand significantly easier, and also improves body awareness and positioning for other skills you will learn in bodyweight training.
- In the same way that the squat is foundational to human movement, handstands are one of the fundamental positions in body weight training.
- The handstand is the one skill that should be trained almost every day if you desire to become proficient in bodyweight training.
- Constant practice and refinement of handstand technique will yield consistent rewards in the future.
- Handstands are one of the most fundamental movements in gymnastics and bodyweight training as well.
- The most important factor in how skilled you can become at an exercise is how much you practice it. In this respect, you will be better at what you do more often.
- In gymnastics-based strength training, the back level is one of the first static strength-based movements you will learn. Working toward a solid back lever will prepare your body for many of the higher-level strength progressions, such as the iron cross.
- The German hang is one of the fundamental positions in gymnastics. It is primarily used to extensively stretch out your shoulders for more advanced skills like the manna. It is one of the primary starting positions used to condition elbow and shoulder connective tissues for more advanced rings and bar skills.
- [The German hang] is also a good stretch if your shoulders are inflexible.
- Skin the Cat is a colloquial term used in gymnastics for moving in and out of the German hang. It builds flexibility and strength in your shoulders for the back lever and other upper-level movements.
- [Skin the Cat] will enable you to build flexibility and strength in your shoulders and elbows and will condition your connective tissues as you build up to the back lever and more advanced movements.
- Rope climbs are a very good exercise for building grip strength and facilitating the development of overall pulling strength.
- Eccentrics are extremely effective with bodyweight exercises, especially pulling movements.
- The muscle-up is a fundamental movement that is very important for beginners to learn. Not only does the muscle-up get you above the rings, it also develops strength in your full range of motion through the pullup and dip positions.
- The ab wheel is not a lower back exercise. You should not be feeling it in your back. If you do, it is an indicator that your hip flexors-particularly your psoas major--are firing too much.
- Barbell exercises are superior to bodyweight exercises for both strength and hypertrophy for the legs.
- The two primary leg exercises recommended for bodyweight exercises are the pistol progression as well as the plunge into deep step up progression.
- The asian squat trains your body to get used to the bottom position of a squat again. [...] This position can be used to assess mobility and overall flexibility. Learning to move into and out of this position comfortably is not just good for maintaining flexibility and mobility but also for re-learning the foundations of human movement, which is helpful if you have been inactive for some time.
- [Cossack squats] are useful for lunges, deep step-ups, and pistols as it biases your weight onto either leg as you move from side to side. The goal is to eventually go down to the thigh-to-calf or butt-to-calf range for this exercise.
- Pistols or single-leg squats are the single-leg movement that many bodyweight practitioners use to improve their strength and hypertrophy.
- Once you have mastered bodyweight pistols, you can add weight to this progression to increase the difficulty level.
Deskbound by Kelly Starrett
- Sitting is more dangerous than smoking, kills more people than HIV, and is more treacherous than parachuting. We are sitting ourselves to death.
- Unless we are asleep, we human beings are designed to move. Our normal physiology depends on this important fact.
- Our bodies are built for movement, and in turn movement keeps our bodies healthy. It is a symbiotic relationship that has allowed our species to survive.
- When we sit for long periods, the muscles in our lower bodies literally turn off and become inactive. Simultaneously, we automatically adopt positions that don’t utilize critical muscles and connective tissues that stabilize and support our trunk and spine. The result is compromised body function, and it causes a multitude of common and pernicious orthopedic problems, like back and neck dysfunction, carpal tunnel syndrome, and pelvic floor dysfunction.
- Here is a wonderful fact: your body adapts to the position that you assume for most of the day.
- What most people fail to realize is that the positions we assume for most of the day also impact the ways we move the rest of the day.
- Heel-striking is a problem, and it shouldn't exist in the running human.
- The problem can be distilled to three simple points:
- We are not moving enough.
- We are not moving well.
- We are not performing basic maintenance on our bodies.
- All you have to do is follow four simple guidelines:
- Reduce optional sitting in your life.
- For every 30 minutes that you are deskbound, move for at least 2 minutes.
- Prioritize position and mechanics whenever you can.
- Perform 10 to 15 minutes of daily maintenance on your body.
- Sitting only when necessary is one of the best things you can do for your health.
- Work is the biggest opportunity for change. Switch to a standing desk if you can.
- Sitting is an orthopedic disaster and can cause a myriad of body dysfunctions.
- Sitting means that you are not moving, and being sedentary can have significant negative long-term health impacts.
- Whether or not you consider yourself an athlete, you need to understand how to squat and pick something up off the ground without unduly challenging the structural integrity of your body. You still need full range of motion in your joints and tissues. And you still need to perform basic maintenance on your body.
- Our bodies are designed to be on the move constantly walking, running, squatting, gathering. But in this day and age, it is virtually impossible to remove all sitting from our lives.
- If you fail to provide stability for your spine by actively using your musculature and tissue systems, your body will attempt to create a sort of second-tier, or reactionary, stability on its own.
- In other words, if you don’t stabilize your body the right way, it will default to lesser-quality stability by rounding forward flexion) or arching back (overextension).
- When you sit down, the musculature of your lower body basically turns off.
- The moment you round your upper back, your shoulders internally rotated into a forward, collapsed position.
- When we treat someone in our physical therapy practice for low back pain, or when we see an athlete who is constantly tweaking his back during training, the first thing we address is spinal mechanics.
- Good movement always begins with the spine.
- When standing correctly proves difficult, all movement becomes more difficult.
- Belly-based breathing is the way you want to breathe when at rest and while performing normal day-to-day activities. Breathing diaphragmatically grants you access to your parasympathetic nervous system, which does the opposite of your sympathetic, fight-or-flight nervous system.
- Walking is one of the safest and easiest ways to add movement and increase your non-exercise activity throughout the day.
- Going barefoot as often as possible will not only help you walk as nature intended, but also increase your proprioception, improve your balance and posture, and strengthen your feet and legs.
- Bending and squatting are natural movements that all of use should be able to perform efficiently.
- If you’re unable to achieve a full-depth square due to range of motion restriction, spend 10 minutes hanging out the supported square positions [...].
- When you are able to sit in the bottom position without holding onto anything or complaining about your burning shins, you’ve passed the 10-minute squat test!
- Spending 10 minutes a day in a deep square is a great life goal.
- Standing at work is a far better option than sitting because standing is a gateway to movement.
- Simply put, a foot rail makes it easier to stand comfortably for longer periods. In fact, having some kind of foot support is so critical that we don’t consider a standing workstation complete or acceptable if it doesn't give you a place to rest your foot.
- The primary consideration with your keyboard and mouse is to have your forearms parallel to the floor while you're at work.
- The fact that standing is strenuous is a sign that your body is out of whack, because the human body is designed to be upright and moving.
- The three golden rules of sitting:
- Sit with a neutral spine.
- Get up and move every 20 to 30 minutes.
- Perform 10 to 15 minutes of daily body maintenance work.
- Sitting on the ground is the best option, but not all seated-on-the-ground positions are created equal. The one that trumps them all is lotus, a cross-legged sitting position in which you place each foot on top of the opposite thigh.
- We consider sitting cross-legged to be the second best seated-on-the-ground position.
- Try this test: it cross-legged on the floor. If you are unable to adopt this position comfortably, it means that you have lost your normal hip range of motion.
- Your body has a simple rule: use it or lose it.
- Standing is your best option because it enables you to comply with the greatest number of means to support spinal organization and stability. Standing also promotes more movement throughout the day.
- When standing is not an option, sitting on the ground or in a supported passive position is better than sitting upright in a chair.
- When you have to sit upright in a chair, prioritize your stiff trunk/neutral spine and add a second pillar of support by sitting cross-legged or manspreading.
- We recommend ignoring the backrest and armrests entirely and sitting at the edge of your seat, essentially turning the chair into a stool. Sit with your feet planted firmly on the ground, and be mindful of creating a stuff trunk.
- The ideal office chair is one that mimics a stool.
- It’s useful to have some basic guidelines about restoring your body’s mechanics.
- If something is not in their fight place, get it in the right place.
- If something is not moving, get it moving.
- Mobilize the area of localized pain.
- Work upstream (above) and downstream (below) of the problem to address contributing mechanical issues.
- One of the easiest ways to eliminate mechanics-based pain is to restore normal range of motion to the problem area.
- We can’t begin to tell you that much pain and dysfunction would be eliminated if our joints could just move through the ranges of motion that they are supposed to.
- The deep (or full) square is a fundamental human shape that everyone should be able to adopt.
- Take the 10-minute squat test: try to hang out in a deep squat or supported squat for 10-minutes. If that seems like too much, break it up and do five 2-minute squatting sessions throughout the day.
- In other words, to improve your range of motion, you need to spend time mobilizing in the shape that you’re trying to change.
- It’s simple: if you apply pressure or compress any soft tissue of your body it shouldn’t hurt.
- Pain is an indication that your tissues are tight, restricted, stiff, or knotted up. Put simply, if you feel pain while you mobiles, your tissues are not normal.
- When it comes to mobilizing in a certain position--say, the bottom of the squat--or smashing a tissue such as your quads, the general rule is to stay in that position in those areas for at least two minutes.
- There is a simple yet efficient way to mobile the issues that are limiting your overhead position.
- Remember, you always want to mobilize in a position that is similar in shape to the movement and position you’re trying to change.
- If there’s one mobilization that deskbound people should commit to doing daily, this [couch stretch] is probably it. Most people are missing the critical ability to extend their hips efficiently.
20210316
Cracking the Coding Interview by Gayle McDowell
- Big-O time is the language and metric we use to describe the efficiency of algorithms. Not understanding it thoroughly can really hurt you in developing an algorithm.
- In academia, Big-O describes an upper bound on the time.
- Big-omega is the equivalent concept but for lower bounds.
- Big-theta means both big-o and big-omega. That is, an algorithm is big-theta if it is both big-o and big-omega. Big-theta gives a tight bound on runtime.
- We rarely ever discuss best case time complexity, because it’s not a very useful concept. After all, we could take essentially any algorithm, special case some input, and then get an O(1) time in the best case.
- For many--probably most-algorithms, the worst and the expected case are the same.
- Big O, big omega, and big theta describe the upper, lower, and tight bounds for the runtime.
- Space complexity is a parallel concept to time complexity. If we need to create an array of size n, this will require O(n) space. If we need a two-dimensional array of size NxN, this will require O(n^2) space.
- When you have a recursive function that makes multiple calls, the runtime will often (but not always) look like O(branches^depth), where branches is the number of times each recursive call branches.
- Generally speaking, when you see an algorithm with multiple recursive calls, you’re looking at exponential runtime.
- Here’s a list of the absolute, must-have knowledge:
- Data Structures
- Linked lists
- Trees, tries, and graphs
- Stacks & queues
- Heaps
- vectors/ArrayLists
- Hash tables
- Algorithms
- Breadth-first search
- Depth-first search
- Binary search
- Merge sort
- Quick sort
- Concepts
- Bit manipulation
- Memory (stack vs heap)
- Recursion
- Dynamic programming
- big-O time & space
- In particular, hash tables are an extremely important topic. Make sure you are very comfortable with this data structure.
- Despite being possibly slow, a brute force algorithm is valuable to discuss. It’s a starting point for optimizations, and it helps you wrap your head around the problem.
- Once you have a brute force algorithm, you should work on optimizing it.
- Perhaps the most useful approach I’ve found for optimizing problems. “BUD” is a silly acronym for: bottlenecks, unnecessary work, duplicated work.
- A bottleneck is a part of your algorithm that slows down the overall runtime.
- Optimizing a bottleneck can make a big difference in your overall runtime.
- Be particularly aware of any “optimizations” you intuitively or automatically made.
- The best conceivable runtime is, literally, the best runtime you could conceive of a solution to a problem having. You can easily prove that there is no way you could be the BCR.
- Best Conceivable Runtime is not a “real” algorithm concept, in that you won’t find it in algorithm textbooks. But I have found it personally very useful, when solving problems myself, as well as while coaching people through problem.s
- One sign of a careful coder is that she doesn't make assumptions about the input. Instead, she validates that the input is what it should be, either through ASSERT statements or if-statements.
- All else being equal, of course stability is a good thing. No one wants to be fired or laid off. However, all else isn’t actually equal. The more stable companies are also often growing more slowly.
- A hash table is a data structure that maps keys to values for highly efficient lookup. There are a number of ways of implementing this.
- In some languages, arrays (often called lists in this case) are automatically resizable. The array or list will grow as you append items. In other languages, like Java, arrays are fixed length. The size is defined when you create the array.
- When you need an array-like data structure that offers dynamic resizing, you would usually use an ArrayList. An ArrayList is an array that resizes itself as needed while still providing O(1) access. A typical implementation is that when the array is full, the array doubles in size.
- A linked list is a data structure that represent a sequence nodes. In a singly linked list, each node points to the next node in linked list. A doubly linked list gives each node pointers to both the next node and the previous node.
- Unlike an array, a linked list does not provide constant time access to a particular index within the list. This means that if you'd like to find the K-th element in the list, you will need to iterate through K elements.
- The benefit of a linked list is that you can add and remove items from the beginning of the list in constant time.
- The “runner” technique means that you iterate through the linked list with two pointers simultaneously, with one ahead of the other. The “fast” node might be ahead by a fixed amount, or it might be hopping multiple nodes for each one node that the “slow” node iterates through.
- A stack can also be used to implement a recursive algorithm iteratively.
- A binary search tree is a binary tree in which every node fits a specific order property: all left descendants <= n < all right descendants. This must be true for each node n.
- A trie (sometimes called a prefix tree) is a funny data structure. It comes up a lot in interview questions, but algorithm textbooks don’t speed much time on this data structure.
- Bidirectional search is used to find the shortest path between a source and destination node. It operates by essentially running two simultaneous breadth-first searches, one from each node. When they search Coolidge, we have found a path.
- The Sieve of Eratosthenes is a highly efficient way to generate a list of primes. It works by recognizing that all non-prime numbers are divisible by a prime number.
- Be careful you don’t fall into a trap of constantly trying to find the “right” design pattern for a particular problem. You should create the design that works for that problem. In some cases it might be an established pattern, but in many other cases it is not.
- The Singleton pattern ensures that a class has only one instance and ensures access to the instance through the application. It can be useful in cases where you have a “global” object with exactly one instance.
- It should be noted that many people dislike the Singleton design pattern, even calling it an “anti-pattern”. One reason for this is that it can interfere with unit testing.
- The Factory Method offers an interface for creating an instance of a class, with its subclasses deciding which class to instantiate. You might want to implement this with the creator class being abstract and not providing an implementation for the Factory method. Or, you could have the Creator class be a concrete class that provides an implementation for the Factory method.
- While there are a large number of recursive problems, many follow similar patterns. A good hint that a problem is recursive is that it can be built off of subproblems.
- Recursive algorithm can be very space inefficient. Each recursive call adds a new layer to the stack, which means that if your algorithm resources to a depth of n, it uses at least O(n) memory.
- Dynamic programming is mostly just a matter of taking a recursive algorithm and finding the overlapping subproblems (that is, the repeated calls). You then cache those results for future recursive calls.
- One of the simplest examples of dynamic programming is computing the nth Fibonacci number. A good way to approach such a problem is often to implement it as a normal recursive solution, and then add the caching part.
- Drawing the recursive calls as a tree is a great way to figure out the runtime of a recursive algorithm.
- A system can be scaled one of two ways:
- Vertical scaling means increasing the resources of a specific node. For example, you might add additional memory to a server to improve its ability to handle load changes.
- Horizontal scaling means increasing the number of nodes. For example, you might add additional servers, thus decreasing the load on any one server.
- Typically, some frontend parts of a scalable website will be thrown behind a load balancer. This allows a system to distribute the load evenly so that one server doesn’t crash and take down the whole system. To do so, of course, you have to build out a network of cloned servers that all have essentially the same code and access to the same data.
- Sharding means splitting the data across multiple machines while ensuring you have a way of figuring out which data is one which machine.
- An in-memory cache can deliver very rapid results. It is a simply key-vale pairing and typically sits between your application layer and your data store.
- Slow operations should ideally be done asynchronously. Otherwise, a user might get stuck waiting and waiting for a process to complete.
- Some of the most important metrics around networking include:
- Bandwidth: This is the maximum amount of data that can be transferred in a unit of time. It is typically expressed in bits per second.
- Throughput: Whereas bandwidth is the maximum data that can be transferred in a unit of time, throughput is the actual amount of data that is transferred.
- Latency: This is how long it takes data to go from one end to the other. That is, it is the delay between the sander sending information and the receiver receiving it.
- MapReduce allows us to do a lot of processing in parallel, which makes processing huge amounts of data more scalable.
- MapReduce is often associated with Google, but it’s used much more broadly than that. A MapReduce program is typically used to process large amounts of data.
- Understanding the common sorting and searching algorithms is incredibly valuable, as many sorting and searching problems are tweaks of the well-known algorithms. A good approach is therefore to run through the different sorting algorithms and see if one applies particularly well.
- Learning the common sorting algorithms is a great way to boost your performance. Of the five algorithms explained below, merge sort, quick sort, and bucket sort are the most commonly used in interviews.
- No product is fail-proof, so analyzing failure conditions needs to be a part of your testing. A good discussion to have with your interviewer is about when it’s acceptable (or even necessary) for the product to fail, and what failure should mean.
- All data members and methods are private by default in C++. One can modify this by introducing the keyword public.
- The constructor of a class is automatically called upon an object’s creation. If no constructor is defined, the compiler automatically generates one called the Default Constructor. Alternatively, we can define our own constructor.
- The destructor cleans up upon object deletion and is automatically called when an object is destroyed. It cannot take an argument as we don’t explicitly call a destructor.
- Unlike pointers, references cannot be null and cannot be reassigned to another piece of memory.
- Templates are a way of reusing code to apply the same class to different data types.
- Normalized databases are designed to minimize redundancy, while denormalized databases are designed to optimize read time.
- Threads within a given process share the same memory space, which is both a positive and negative. It enables threads to share data, which can be valuable. However, it also creates the opportunity for issues when two threads modify a resource at the same time.
- For more granular control, we can utilize a lock. A lock (or monitor) issued to synchronize access to a shared resource by associating the resource with the lock. A thread gets to a shared resource by first acquiring the lock associated with the resource. At any given time, at most one thread can hold the lock and, therefore, only one thread can access the shared resource.
20210306
Cracking the PM Interview by Gayle McDowell & Jackie Bavaro
- A PM is responsible for making sure that a team ships a great product.
- The PM needs to set vision and strategy.
- The PM defines success and makes decisions.
- The day-to-day work of a product manager varies over the course of the product life cycle, you’ll be figuring out what to build; in the middle you’ll help the team make progress; at the end you’ll be preparing for launch.
- During implementation, one of the most important parts of the job is helping the engineers work efficiently. The product manager will check in regularly with his team and learn how things are going.
- For mature products, such as market leaders, most of the work will be iterating on the product and trying to improve it. PMs often have feedback from previous versions as to which areas need the most improvement and can focus on them.
- As a PM on a mature product, it can be very important to make sure you don’t get stuck making small incremental improvements.
- Often, a mature product’s biggest competitor is the last version of that same product. At the same time, mature products often have the luxury of time to make big bets on new ideas.
- PMs are responsible for seeing the entire project through to a successful completion.
- Product managers are able to reduce the number of meetings their teammates need to attend because they’re able to represent the team to other groups and find productive ways of communicating that don’t require meetings.
- Not trusting the engineers’ estimates and promising other teams that the work will be done sooner than the engineers agree to it is one of the fastest ways to ruin your relationship with the team.
- While most roles on the team are crisply defined, product managers have a more fluid role. When you’re a product manager, your job is anything that isn’t being covered by other people.
- As a PM, you’re responsible for the success of failure of your product, and no job is beneath you.
- One of the best ways to get a signal on the culture at a startup is to look at where the founders, PMs, and early employees came from.Since product management doesn’t have a single, well-known definition, teams generally bring along the definition that they learned from their past companies.
- The big difference in being a PM at a startup comes from the scale.
- Since startups don’t have large management structures, the PMs naturally become important leaders for the company. Additionally, startups have fewer resources, so there’s more “white space” for the PMs to fill in and more of a need to be really scrappy.
- Engineers at startups love shipping code quickly and are very wary of overhead, so it’s important to be careful when adding processes like Agile.
- If you ask interviewers what they're looking for in PM candidates, they’ll unusually say that they are looking for smart people who get stuff done.
- One of the best ways to rise above the crowd is to have a side project like a mobile app. This gives you a chance to show your customer focus and product design skills.
- LinkedIn is one of the most valuable sites to focus on for recruiting.
- The most important way a product manager is judged is by the products she’s launched.
- Many people without a background in computer science struggle to form strong working relationships with engineers.
- Great product managers are action-oriented and passionate about delivering results. They will try to take care of what they can themselves, whether that’s gathering data or fixing typos in the product. This frees up development from the more tedious tasks so they’ll be able to do more valuable work.
- Customer Focus is the most important thing to develop when moving from engineering to product management. Engineers and developers can usually pick up most of the other important skills on the job, but a customer focus is one of the defining characteristics of good PMs.
- Many engineers are comfortable in the world of analytical thinking. As an engineer, it’s better to prove things through data than charisma. As a product manager, you need to master both.
- It will be hard to be successful as a PM if you’re still handling a lot of engineering responsibilities; you need to pick up some escape velocity. Consider taking time off between the role switch or having some kind of hand off or party to mark the transition. Then you can dive into your new PM role fully.
- One of the best ways to improve your candidacy for a product management position is to start a side project. This side project gives you a chance to gain experience shipping a product, builds up your resume, shows off your technical skills, shows off your product design skills, and gives you a lot to talk about during your interview. If you hired people to help you, it might also give you a chance to show leadership skills.
- As a PM, the biggest measure of your success will be the products you launch.
- At a growing company, new opportunities are always opening up, and you quickly become one of the more senior employees. This means that even if you had to join a different team or take on a different title from what you wanted, you’d likely get a chance to transition soon.
- Infrastructure teams often don’t sound like a fun place to be a PM, but they’re critically important to the company. The improvements you make as an infrastructure PM can be magnified throughout the company, so they can be a great place for career advancement.
- At some point in your career, your visibility across the company is going to matter if you want to be promoted to higher positions.
- The most straightforward way to build credibility is delivering results. Your teammates all want a good outcome, so they'll naturally start out second guessing your opinions, asking lots of questions, and suggesting different ways of doing things. However, over time they’ll start to see that you’re showing good judgement and getting things done, and they’ll feel comfortable trusting you.
- Another way to build credibility is paying attention to people’s perceptions of you and ensuring that you’re creating the perception you want.
- Make sure you’re building a reputation as a smart, skillful, competent, and dependable person with good judgement.
- Getting an MBA just for the sake of getting an MBA is not worthwhile in tech, at least not in silicon Valley.
- It’s not your experience that lands you an interview; it’s how your resume presents that experience. Even the best candidate in the world won’t get an interview with a lousy resume. After all, a company wouldn’t know that she’s the best candidate in the world.
- A resume isn’t read; it’s skimmed. A resume screen will glance at your resume for about 15 seconds (or maybe less) to make a decision about whether or not to interview you.
- A good rule of thumb is to limit your resume to one page if you have less than 10 years of experience. In more than 10 years, you might be able to justify 1.5 or 2 pages, particularly if you’ve held many different jobs.
- Focus on what is important, and leave out the rest.
- Read through your resume. Anything that’s three lines of text or more should be condensed. Additionally, you should aim to have no more than 50 percent of your bullets expand to two lines. That is, at least half of your bullets should be just one line, with the remainder being two lines.
- People don’t care what you were told to do; they care what you did.
- You want to focus on your accomplishments. Prove to the resume screener you had an impact.
- As much as possible, quantify your accomplishments.
- A good resume is reasonably compact and quickly showcases your highlights.
- Employers want PMs who have technical skills, love technology, possess initiative, are leaders, and will have an impact. A resume is a chance to showcase these parts of your background.
- Don’t list something from a long time ago unless it really makes you stand out.
- You should understand what the company is doing at a deep level.
- You should know not only what the company is doing, but why it is doing it. Knowing the “why” will help your answers fit the company’s view of the world.
- Successful people tend to know where they’re going in life. If you don’t have a plan, an interviewer might worry you’re not very serious about your career.
- Understanding other people is a fundamental part of teamwork, leadership , and persuasion, and therefore a fundamental part of a product management role.
- Failure is okay; helplessness is not.
- Here’s a fun and useful tip: if you need to calculate how long until something doubles, divide 72 by the percent increase.
- Interviewers are looking for structured thinking. The easiest way to show this is to give a structured answer and call out which part of the structure you’re on.
- Strengths are the internal factors that benefit a product. This can include anything about the costs, product features, company culture, reputation, infrastructure, or other aspects.
- SWOT Analysis: strengths, weaknesses, opportunities, threats.
- The two most common good ways to sort an array are quicksort and merge sort. The others are less efficient in general or only work with specific assumptions.
- Big O notation is a way to express the efficiency of an algorithm. If you’re going to be working with code, it is important that you understand big O. It is, quite literally, the language we use to express efficiency.
- Recursion can be a useful strategy to solve a large number of problems. It works well when the solution to a problem can be defined in terms of the solutions to subproblems.
- Any problem that can be solved recursively can also be solved iteratively, although sometimes doing so is much more complicated. However, recursion comes with a drawback, which is memory usage.
- The top 10% of product managers excel at a few of these things. The top 1% excel at most or all of them.
- Think big - A 1% PM’s thinking won’t be constrained by the resource available to them today or today’s market environment. They’ll describe large disruptive opportunities, and develop concrete plans for how to take advantage of them.
- Communicate - A 1% PM can make a case that is impossible to refute or ignore. They’ll use data appropriately, when available, but they’ll also tap into other biases, beliefs, and triggers that can convince the powers that be to part with headcount, money, or other resources and then get out of the way.
- Simplify - A 1% PM knows how to get 80% of the value out of any feature or project with 20% of the effort. They do so repeatedly, launching more and achieving compounding effects for the product or business.
- Prioritize - A 1% PM knows how to sequence projects. They balance quick wins vs platform investments appropriately. They balance offense and defense projects appropriately. Offense projects are ones that grow the business. Defense projects are ones that protect and remove drag on the business.
- Forecast and measure - A 1% PM is able to forecast the approximate benefit of a project, and can do so efficiently by applying past experience and leverage comparable benchmarks. They also measure benefit once projects are launched, and factor those learning into their future prioritization and forecasts.
- Execute - A 1% PM grinds it out. They do whatever is necessary to ship. They recognize no specific bounds to the scope of their role. As necessary, they recruit, they produce buttons, they do biz dev, they escalate, they tussle with internal counsel, they…
- Understand technical trade-offs - A 1% PM does not need to have a CS degree. They do need to be able to roughly understand the technical complexity of the features they put on the backlog, without any costing inputs from devs. They should partner with devs to make the right technical trade-offs.
- Understand good design - A 1% PM doesn’t have to be a designer, but they should appreciate great design and be able to distinguish it from good design. They should also be able to articulate the difference to their design counterparts, or at least articulate directions to pursue to go from good to great.
- Write effective copy - A 1% PM should be able to write a concise copy that gets the job done. They should understand that each additional word they write dilutes the value of the previous ones. They should spend time and energy trying to find the perfect words for key copy, not just words that will suffice.
20210216
Smart Choices by Hamond, Keeney, Raiffa
- The essence of our approach is divide and conquer: break your decision into its key elements; identify those most relevant to your decision; apply some hard, systematic thinking; and make your decisions.
- Our approach is practice, encouraging you to seek out decision-making opportunities rather than wait for problems to present themselves.
- In short, the ability to make smart choices is a fundamental life skill.
- Despite the importance of decision making to our lives, few of us ever receive any training in it. So we are left to learn from experience. But experience is a costly, inefficient teacher that teaches us bad habits along with good ones.
- An effective decision-making process will fulfill these six criteria:
- It focuses on what’s important.
- It is logical and consistent.
- It acknowledges both subjective and objective factors and blends analytical with intuitive thinking.
- It requires only as much information and analysis as is necessary to resolve a particular dilemma.
- It encourages and guides the gathering of relevant information and informed opinion.
- It is straightforward, reliable, easy to use, and flexible.
- Hard decisions are hard because they’re complex, andnoone can make that complexity disappear. But you can manage complexity sensibly.
- The acronym for these--PrOAT--serves as a reminder that the best approach to a decision situation is a proactive one.
- Problem
- Objectives
- Alternatives
- Consequences
- Trade Offs
- The worst thing you can do is wait until a decision is forced on you--or made for you.
- The essence of the PrOACT approach is to divide and conquer. To resolve a complex decision situation, you break it into these elements and think systematically about each one, focusing on those that are key to your particular situation. Then you reassemble your thoughts and analysis into a smart choice.
- Your alternatives represent the different courses of action you have to choose from.
- Assessing frankly the consequences of each alternative will help you to identify those that best meet your objectives--all your objectives.
- What you decide today could influence your choices tomorrow, and your goals for tomorrow should influence your choices today. Thus many important decisions are linked over time.
- The key to dealing effectively with linked decisions is to isolate and resolve near-term issues while gathering the information needed to resolve those that will arise later.
- By sequencing your actions to fully exploit what you learn along the way, you will be doing your best, despite an uncertain world, to make smarter choices.
- First and foremost, always focus your thinking on why it matters most.
- Typically, for all but the most complex decisions, you will not need to consider all the elements in depth. Usually, only one or two elements will emerge as the most critical for the decision at hand.
- Be proactive in your decision making. Look for new ways to formulate your decision problem. Search actively for hidden objectives, new alternatives, unacknowledged consequences, and appropriate tradeoffs.
- Most importantly, be proactive in seeking decision opportunities that advance your long-range goals; your corevaleus and beliefs; and the needs of your family, community, and employer.
- Take charge of your life by determining which decision you’ll face and when you’ll face them.
- The way you state your problem frames your decision. It determines the alternatives you consider and the way you evaluate them. Posing the right problem drives everything else.
- A good solution to a well-posed decision problem is almost always a smarter choice than an excellent solution toa poorly posed one.
- The greatest danger in formulating a decision problem is laziness.
- Every decision problem has a trigger--the initiating force behind it. Triggers take many forms.
- Be proactive. Seek decision opportunities everywhere.
- As you explore the trigger, beware! Triggers can bias your thinking. They can trap you into viewing the problem only in the way it first occurred to you.
- Question the constraints in your problem statement.
- Problem definitions usually include constraints that narrow the range of alternatives you consider.
- Questioning the problem is particularly important when circumstances are changing rapidly or when new information becomes available. A poorly formulated decision problem is a trap. Don’t fall for it.
- By making sure you’ve identified all your objectives, you will avoid making an unbalanced decision--one that, for example, considers financial implications but ignores personal fulfillment.
- Sometimes, the process of thinking through and writing out your objectives can guide you straight to the smart choice--without your having to do a lot of additional analysis.
- For important decisions, only deep soul-searching will reveal what really matters--to you. This kind of self-reflective effort perplexes many people and makes them uncomfortable.
- The cleanest and most easily communicated form for objectives is a short phrase consisting of a verb and an object.
- Many people mistakenly focus on immediate, tangible, measurable qualities when listing objectives, but these may not reflect the essence of the problem.
- Alternatives are the raw material of decision making. They represent the range of potential choices you'll have for pursuing your objectives. Because of their central importance, you need to establish and maintain a high standard for generating alternatives.
- You can never choose an alternative you haven’t considered.
- No matter how many alternatives you have, your chosen alternative can be no better than the best of the lot.
- One of the most common pitfalls is business as usual.
- Business as usual results from laziness and an overreliance on habit. With only a modest amount of effort, attractive new alternatives can usually be found.
- Many poor choices result from falling back on a default alternative.
- Choosing the first possible solution is another pitfall.
- People who wait too long to make a decision risk being stuck with what’s left when they finally do choose. The best alternatives may no longer be available.
- Remember, get an early start on major decisions. Take charge.
- Many decision problems have constraints that limit your alternatives. Some constraints are real, others are assumed.
- An assumed constraint represents a mental rather than a real barrier.
- One way to increase the chance of finding good, unconventional alternatives is to set targets that seem beyond reach.
- High aspirations force you to think in entirely new ways, rather than sliding by with modest changes to the status quo.
- Setting high aspirations stretches your thinking.
- Start thinking about your decision problem as soon as possible; don’t put it off until the last minute. Once you’ve begun, make a point of thinking about the problem from time to time to give your subconscious a nudge.
- Create alternatives first, evaluate them late.
- Creating a good alternative requires receptivity--a mind expansive, unrestrained, and open to ideas. One idea leads to another, and the more ideas you entertain, the more likely you are to find a good one.
- Bad ideas will almost certainly emerge along with good ones. That’s a necessary part of the process and something you shouldn’t be concerned about at this point.
- Don’t evaluate alternatives while you’re generating them. That will slow the process down and dampe creativity.
- Never stop looking for alternatives. As the decision process moves on to the consideration of consequences and tradeoffs, the evaluation stages, your decision problem will become increasingly clear and more precisely defined.
- Information helps dispel the clouds of uncertainty hovering over some decisions.
- When there are uncertainties affecting a decision, it is useful to generate alternatives for gathering the information necessary to reduce each uncertainty.
- First list the areas of uncertainty. Then, for each one, list the possible ways to collect the needed information. Each of these ways is an information-gathering alternative.
- Whenever you’re uncomfortable about deciding now, questions the deadline. Is it a real deadline, or is it just an assumed constraint?
- It’s an unfortunate truth: the perfect solution seldom exists. But that doesn’t stop a lot of people from endlessly (and unrealistically) pursuing one.
- Be sure you really understand the consequences of your alternatives before you make a choice. If you don’t you surely will afterwards, and you may not be very happy with them.
- The main benefit to be derived from describing consequences is understanding.
- The trick is to describe the consequences with enough precision to make a smart choice, but not to go into unnecessary and exhausting detail.
- Eliminate any clearly inferior alternatives. This step is a terrific time saver for many decisions because it can quickly eliminate alternatives and may lead to a resolution of your decision.
- Important decisions usually have conflicting objectives--you can’t have your cake and eat it too--and therefore you have to make tradeoffs. You need to give up something on one objective to achieve more in terms of another.
- Decisions with multiple objectives cannot be resolved by focusing on any one objective.
- Ben Franklin proposed a wonderful way to simplify a complex problem. Each time he eliminated an item from his list of pros and cons, he replaced his original problem with an equivalent but simpler one. Ultimately, by honing his list, he revealed a clear choice.
- Whenever uncertainty exists, there can be no guarantee that a smart choice will lead to good consequences.
- A risk profile captures the essential information about the way uncertainty affects an alternative.
- For most uncertainties, there will probably be someone out there who knows more about it than you do. Seek out an expert and elicit his or her judgement.
- Pinpoint precision usually isn’t required in assigning chances. Frequently, knowing that a chance falls within a certain range is sufficient for guiding a decision.
- Decision trees are especially useful for explaining decision processes to others.
- Getting into the habit of skethin decision trees, even for relatively simple decisions involving uncertainty, can enhance your decision-making skills.
- Your risk tolerance expresses your willingness to take risk in your quest for better consequences. It depends primarily on how significant you consider the downside--the poorer consequences of any decision--compared to the up side.
- The more likely the outcomes with better consequences and the less likely the outcomes with poorer consequences, the more desirable the risk profile to you.
- Weight desirabilities by chances. More fully stated: weight the desirabilities of the consequences by the chances of their associated outcomes.
- Outcomes with a low chance of occurring should have less influence on an alternatives overall desirability than outcomes with a high chance of occurring.
- When uncertainty is significant, develop a risk profile for each alternative which captures the essence of the uncertainty.
- Think hard and realistically about what can go wrong as well as what can go right.
- An organization’s leaders should take three simple steps to guide subordinates in dealing successfully with risk. First, sketch desirability curves that reflect the risk-taking attitude of the organization. Second, communicate the appropriate risk tolerance by issuing guidelines that include examples of how a typical risky decision should be handled.
- Third, examine the organization’s incentives to ensure they are consistent with the desired risk-taking behavior.
- When a good opportunity feels too risky, share the risk with others.
- Seek risk-reducing information.
- Try to temper risk by seeking information that can reduce uncertainty.
- Diversify the risk.
- Avoid placing all your eggs in just a few baskets. Look for ways to diversify.
- Wherever a risk consists of a significant but rare downside, with no upside, try to insure against it. But don’t overinsure.
- All decisions affect the future, of course.
- Making smart choices about linked decisions requires understanding the relationships among them.
- The essence of making smart linked decisions is planning ahead.
- Makers of effective linked decisions, like successful chess players, plan a few decisions ahead before making their current decision.
- A good quick test to weed out information-gathering alternatives is to ask what you’d pay to completely resolve the uncertainty. If an information alternative costs more, it’s an obvious non contender.
- Flexible plans keep your options open.
- In highly volatile situations, where the risk of outright failure is great, an all-purpose plan is often the safest plan.
- Sometimes the best plan is to act in a way that expands your set of future alternatives.
- Just knowing how sets of decision are linked and using a modest amount of foresight can help considerably in making a smart choice and can practically guarantee avoiding many, if not all, of the dumb ones.
- Over time, making smart choices on linked decisions will affect your life and career more positively and profoundly than making perfect choices on all your simpler decisions put together.
- By now you’re much better prepared to identify and avoid the eight most common and most serious errors in decision making:
- Working on the wrong problem.
- Failing to identify your key objectives.
- Failing to develop a range of good, creative alternatives.
- Overlooking crucial consequences of your alternative.
- Giving inadequate thought to tradeoffs.
- Disregarding uncertainty.
- Failing to account for your risk tolerance.
- Failing to plan ahead when decisions are linked over time.
- Researchers have identified a whole series of such flas in the way we think.
- The best protection against these traps is awareness.
- In considering a decision, the mind gives disproportionate weight to the first information it receives. Initial impressions, ideas, estimates, or data “anchor” subsequent thoughts.
- You’ll be less susceptible to anchoring tactics.
- Never think of the status quo as your only alternative. Identify other options and use them as counterbalances, carefully evaluating al theri pluses and minuses.
- The past is past; what you spent then is irrelevant to your decision today.
- Remember, your decision influences only the future, not the past.
- Expose yourself to conflicting information. Always make sure that you examine all the evidence with equal rigor and understand its implications. And don't be soft on the disconfirming evidence.
- In seeking the advice of others, don’t ask leading questions that invite confirming evidence.
- The same problem can also elicit very different reponsinse when frames use different reference points.
- A poorly framed problem can undermine even the ebay-considered decision. But the effect of improper framing can be limited by imposing discipline on the decision making process.
- Don’t automatically accept the initial frame, whether it was formulated by you or by someone else.
- Always try to reframe the problem in different ways. Look for distortions caused by the frames.
- A major cause of overconfidence is anchoring. When you make an initial estimate about a variable, you naturally focus on midrange possibilities. This thinking then anchors your subsequent thinking about the variable, leading you to estimate an overly narrow range of possible values.
- In fact, anything that distorts your ability to recall events in a balanced dway will distort your probability assessment for estimates.
- Where possible, try to get statistics. Don’t rely on your memory if you don’t have to.
- When you don’t have direct statistics, take apart the event you’re trying to assess and build up an assessment piece by piece.
- Analyze your thinking about decision problems carefully to identify any hidden or unacknowledged assumptions you mahe have made.
- Don’t ignore relevant data; make a point of considering base rates explicitly in your assessment.
- Consider the methodology of “worst-case analysis”, which was once popular in the design of weapons systems and is still used in certain engineering and regulatory settings.
- Documents the information and reasoning used in arriving at your estimates, so others can understand them better.
- To avoid distortions in your thinking, you must curb your natural tendency to see patterns in random events. Be disciplined in your assessments of probability.
- Highly complex and highly important decisions are the most prone to distortion because they tend to involve the most assumptions and the most estimates. The higher the stakes, the higher the risks.
- The best protection against all psychological traps is awareness. Forewarned is forearmed. Even if you can’t eradicate the distortions ingrained in the way your mind works, you can build tests and disciplines into your decision-making process that can uncover and counter errors in thinking before they become errors in judgement.
- Procrastination is the bane of good decision making.
- Deciding By default, by not deciding, almost always yields unsatisfactory results, if only because you spend time wondering if you could have done better. So get started. The sooner you start, the more likely it is that you’ll give your decision adequate thought and find adequate information, rather than being forced to decide in partial ignorance under pressure from the clock.
- Large corporations and the military use this technique, making strategic decisions first, tactical decisions second, and operational decisions last.
- Obsessing over your decision takes a tool in time and psychological energy, but a hasty decision, rushed to avoid emotional stress or hard mental work, is usually a poor decision.
- Seldom does a perfect solution exist, yet too many people endlessly (and unrealistically) pursue one.
- Often, the imagined need for more analysis becomes an excuse for procrastination, for avoiding a decision, because deciding will require accepting some bad along with the good.
- To make a decision beyond your sphere of expertise, you’ll often need to seek advice from others.
- Many of your toughest decisions aren’t as hard as they look. By being systematic and focusing on the hard parts, you can resolve them comfortably.
- Over time luck favors people who follow good decision making procedures.
- Most important, always remember: the only way to exert control over your life is through your decision making. The rest just happens to you.
- Be proactive, take charge of your decision making, strive to make good decisions and to develop good decision-making habits.
Subscribe to:
Posts (Atom)