Pages

20210515

THE KILL CHAIN by Christian Brose

  • it is impossible to solve a problem that no one knows exists.
  • Over the past decade, in US war games against China, the United States has a nearly perfect record: we have lost almost every single time.
  • The goal is to buy deterrence, the prevention of war. And the only way to deter wars is to be so clearly capable of winning them that no rival power ever seeks to get its way through violence.
  • Rather, the ability to prevail in war, and thereby prevent it, comes down to one thing: the kill chain.
  • The kill chain is a process that occurs on the battlefield or wherever militaries compete. It involves three steps: The first is gaining understanding about what is happening. The second is making a decision about what to do. And the third is taking action that creates an effect to achieve an objective.
  • We remained focused on building and buying platforms rather than kill chains.
  • From 1990 to 2017, the Chinese military budget increased by 900 percent.
  • The Chinese Communist Party aims to become the dominant power in Asia and in the world, and it believes that for China to win, America must lose.
  • A core pillar of the Chinese Communist Party’s plan is harnessing emerging technologies to “leapfrog” the United States and become the world’s preeminent power.
  • New technologies are important, but not as important as new thinking.
  • the real problem is a lack of imagination.
  • The result is that we have run our military into the ground through repeated deployments of limited strategic value, and US adversaries have factored this into their plans to counter us.
  • The bigger issue is that most of these allegedly information age military systems struggle to share information and communicate directly with one another to a degree that would shock most Americans.
  • Such information-sharing problems are more the rule than the exception, not just with Air Force programs but also in the Army, Navy, and Marine Corps, and certainly between them.
  • The Pentagon kept planning to fight in the same ways: technologically inferior enemies, uncontested battlefields, iron mountains, slow kill chains, and little attrition in combat.
  • The connections between our military systems tend to be highly rigid, excessively manual, rather brittle, and thus slow.
  • The reason that Washington got Russia so wrong for so long can be traced back to high hopes—perhaps even wishful thinking—after the Cold War.
  • What each president was slow to learn was that Russia was more interested in restoring the great-power status it lost in 1991 than in becoming the partner the United States hoped it would be.
  • Under what it called its 995 Plan (named for the Belgrade embassy attack in May 1999), China accelerated work to build a different kind of military. It continued to spend money on traditional military systems, such as ships and tanks, but its priority was to develop what it called “Assassin’s Mace” weapons. The name refers to special weapons that were used in Chinese history to defeat more powerful adversaries.
  • The simple idea was that the US giant could not move or fight if it were deaf, dumb, and blind.
  • US companies that entered joint ventures in China did so knowing that they were essentially putting their intellectual property in the hands of the Chinese state, which would use it to develop its domestic industries and its military.
  • Americans are inclined to scoff at China’s centralized and authoritarian approach to technological innovation. However, it must be acknowledged that China has consistently beaten US projections of both the quality and the quantity of advanced military technology that it could develop and how quickly it could do so.
  • Ultimately, the strategic challenge that China poses dwarfs that of Russia. Despite all of its hostile rhetoric and saber rattling, Russia possesses orders of magnitude less conventional economic and military power than China, and that disparity grows wider every day.
  • In reality, however, China has been systematically transforming its military since 1993.
  • As early as 1993, China declared that its military’s goal would be “fighting local wars under high technology conditions.”
  • Although some traditional defense companies were developing some of these technologies, such as advanced missiles and directed energy weapons, many of the most consequential technologies were being developed by commercial enterprises that were not interested in providing them to the US military.
  • It is difficult to overstate the all-encompassing sense of urgency that Washington felt in the early years of the Cold War.
  • The paramount concern was picking winners: the priorities that were more important than anything else, the people who could succeed where others could not, and the industrialists who could quickly build amazing technology that worked. Other concerns, such as fairness and efficiency, were of secondary importance.
  • Everyone knew what the priorities were. Everyone knew that a ton of money was being spent on them.
  • This is how Silicon Valley originated: as a start-up incubated by the Department of Defense.
  • A sprawling bureaucracy materialized in the 1960s to administer and discipline the military-industrial complex.
  • Under his tenure, in the spirit of improving efficiency, new layers of oversight, analysis, and management were added, and these grew and began choking off the ability to develop breakthrough technologies quickly.
  • For its part, Congress tied the military’s hands through the budget process, making it harder to spend money in new ways or on new ideas that were not exactly what the Pentagon had “programmed” and Congress had decreed.
  • The result was that the process of developing military technology became harder, slower, and less creative.
  • Military procurement had become “politicized by a blizzard of legislation” and stifled by a “maze of top-down micro-management.”
  • When the Soviet threat disappeared, any sense of urgency in military acquisition went with it.
  • A large and sustained reduction in federal funding for defense research and development began in the 1990s.
  • Members of Congress earmarked much of what money remained for research activities in their states and districts, and these often had more political than military value.
  • An arguably bigger problem was that the United States radically slowed its iterative development of new military systems.
  • More and more of America’s defense spending shifted from developing new things to operating and maintaining old things.
  • The slowing of innovation increased the temptation in government and industry to begin programs that depended on future technological miracles.
  • Defense companies spent less money on research and development and more on armies of lawyers, lobbyists, accountants, and consultants to help them comply with the Pentagon’s growing acquisition bureaucracy and win more of the shrinking number of large contracts.
  • Put simply, the US government created incentives for defense companies to do the wrong things, and that is often what happened.
  • It is estimated that seventeen thousand companies dropped out of the defense business between 2011 and 2015.
  • As defense companies grew larger, their creative engineers and technologists struggled to move fast and solve problems in the face of ever-expanding corporate bureaucracies.
  • The defense establishment primarily thought (and still thinks) in terms of
  • The Pentagon and Congress did not know how to buy synergy between platforms, and building connectivity is not the expertise of traditional defense companies.
  • Nvidia’s core technology is called a graphics processing unit, which its founders created not with militaries in mind but video games.
  • most US military systems are many years behind the state-of-the-art technology that commercial companies such as Nvidia are developing.
  • The information that most US military machines collect is not actually processed onboard the machine itself. It is either stored on the system and then processed hours or even days later when the machine returns from its mission. Or it is streamed back to an operations center in real time, terabyte by terabyte, which places a huge burden on military communications networks.
  • Either way, it is the job of humans, not machines, to comb through most of that data and find the relevant bits of information.
  • At its core, the information revolution still comprises the same basic building blocks as when that term became a buzzword in the 1990s. It is the mutually reinforcing development of sensors (which collect information), computers (which process and store information), and networks (which move information). Because improvements in one of these technologies enable, and indeed require, progress in the other two, the resulting pace of change has been exponential.
  • military networks are like a medieval world of unpaved roads, handmade bridges, and checkpoints that inhibit more than facilitate the flow of information. The result is that most platforms and systems in the Department of Defense do not—indeed, cannot—connect to other platforms and systems, and certainly not easily, quickly, or reliably.
  • The world is now awash in low-cost, high-quality, and increasingly miniaturized sensors—electro-optical, infrared, radar, lidar, and radio-frequency sensors that enable machines to see, as well as acoustic sensors that enable machines like Alexa or Siri to hear everything.
  • As sensors are proliferating on Earth, they are also blanketing it in outer space.
  • Computer processing has been decentralized and pushed out to the edge of the network, creating an ever-expanding network of smart systems such as vehicles, appliances, and even entire homes that collect, process, and communicate information by virtue of being connected to everything else—the so-called Internet of Things.
  • For most military systems, the schedule for hardware updates determines the schedule for software updates. After all, most of the companies building these systems are hardware companies, not software companies.
  • This has created multiyear software development cycles that are doomed to failure.
  • Most of the Department of Defense is ill equipped to take advantage of machine learning in part because of how it deals with its own data.
  • Low-cost space launch has spawned a whole new industry in microsatellites.
  • In short, in just one decade commercial technology companies in California and elsewhere overturned many core assumptions about access to space, and they are now expanding the frontiers of the information revolution beyond Earth’s atmosphere.
  • A development with extraordinary military significance is additive manufacturing, which enables complex parts and even finished products to be printed in three dimensions using different kinds of materials, from low-cost plastics to carbon fiber to molten metals.
  • Quantum science runs contrary to the basic laws of physics, which is why Albert Einstein once called it “spooky.” But it has been demonstrably proven, and there is now a big commercial push to build new kinds of quantum-based information technologies.
  • When people in Washington and elsewhere wonder why more engineering talent and private capital are not flowing into defense technology, the reason is not more complicated than this: three decades of data suggest that if you want to start a successful and profitable new business, defense is not the place to do it (unless you are already a billionaire).
  • The companies that are most able to help are not always willing to do so, whereas the companies that are willing to help are not always able to do so.
  • Washington sacrificed speed and effectiveness in the military-industrial complex for the hope of cost savings and efficiency, and it ended up with neither.
  • Many of the “transformational” procurement programs of the 1990s and 2000s are arriving so late (if at all) that the old systems they were supposed to replace are simply aging out of the force with nothing to take their place.
  • The means to build a different and better US military have been consistently available and never more abundant than now, but too much money has been spent on old or unproven technologies in the pursuit of outdated or misguided conceptions of military power.
  • To a large extent, the reason the United States has been so badly ambushed by the future is because the main problem we are struggling to address is incredibly difficult. Can militaries innovate and change in the absence of war? Indeed, this is the core question as the United States looks to the future of warfare.
  • Militaries are unlike civilian institutions in many ways, but a primary difference is that they lack routine sources of real-world feedback on their performance.
  • Military innovation and adaptation are made more difficult because the nature of any bureaucracy is to resist change, not promote it.
  • For starters, real change requires the definition of clear threats. Militaries need to know with as much specificity as possible what operational problems they must solve through the development of new capabilities and new ways of fighting.
  • It is only when civilian leaders and military mavericks are aligned in favor of disrupting the status quo that real innovation becomes possible in the absence of war.
  • In reality, true military innovation is less about technology than about operational and organizational transformation.
  • China is becoming America’s peer, and it could become more than that.
  • What makes the Chinese Communist Party’s technological ambitions even more threatening to the United States is a major way that Beijing enacts them—through a systematic global campaign to capture the world’s best technology by whatever means necessary, which includes a massive foreign intelligence operation to steal trade secrets and intellectual property through cyber espionage and human spying.
  • when US technology companies refuse to work with the Department of Defense but then do business in China, the practical effect is denying technology to their own military while providing it, knowingly or otherwise, to China’s military.
  • The centerpiece of the Chinese Communist Party’s military buildup is the Chinese Navy.
  • China’s government exports advanced weapons and the tools of high-tech authoritarianism to aspiring police states that want to surveil their citizens, regulate their thoughts, and crush dissent.
  • The problem for the United States is that we have been building our military to project power and fight offensively for decades, while China has invested considerably in precision kill chains to counter the ability of the United States to project military power.
  • The main goal will be accelerating the ability to close the kill chain and break rivals’ ability to do so.
  • Hypersonic weapons are different because they can travel both fast and unpredictably.
  • Commercial technology companies likely will not be the source of hypersonic technologies for the US military.
  • New fiber lasers are much improved over older chemical lasers. Their beams are more concentrated and powerful.
  • Low-kilowatt lasers can now burn holes through drones or vehicle engines. And higher-kilowatt lasers are being developed for defense against aircraft and missiles.
  • The big hurdle that remains is power capacity. It takes a lot of power to fire directed energy weapons of any strength.
  • A shadow cyber war has raged for years, especially between America and its great-power rivals.
  • The broader significance is that the cyber domain and the electromagnetic spectrum will be central battlegrounds of future war.
  • A major threat to the F-35 is not just enemy missiles but also the possibility that it could be cyberattacked before it ever gets off the ground.
  • The application of artificial intelligence will open a whole new front in the cyber arms race that focuses on the corruption or poisoning of data. Artificial intelligence is only as good as the data that trains its algorithms.
  • As classical computers reach the physical limits of their power, quantum computers could become vital to processing all of the data that intelligentized militaries create and collect.
  • the moment of quantum supremacy is drawing near.
  • An enabling capability that may have more immediate military impacts is biotechnology, which is already unlocking better understanding of human genetics and enabling the creation of customized treatments and technologies to augment human capabilities.
  • Developments in biotechnology will mostly be extensions of current practices, albeit significant extensions.
  • In the competition over biotechnology, it is hard to believe that the United States would cross certain ethical lines, but it is less clear whether the same can be said of the Chinese Communist Party.
  • New space-based capabilities will be central to how militaries command and control their forces.
  • Spacecraft have always been limited by the impracticality of refueling them.
  • In the coming years, it will be possible to service, assemble, and manufacture complex orbital infrastructure in space that would be impractical to launch from Earth.
  • In time, space will be transformed into a unique domain of human activity, and this will inevitably have military implications.
  • Of all the new enabling technologies, perhaps the most consequential from a military standpoint is artificial intelligence and machine learning.
  • The US military is drowning in data.
  • Humans will eventually be able to delegate much of the cognitive burden of closing the kill chain to well-trained intelligent machines, thereby enabling people to focus on making better and faster decisions in warfare.
  • Though 5G networks will be critical for broader economic and geopolitical purposes, communications networks are really just pipes for information.
  • The greater danger for the United States is failing to recognize the true gravity of the kind of military technology race with the Chinese Communist Party that we are facing and falling behind because of our lack of urgency to run it.
  • The real issue now and for the foreseeable future is the military use of narrow artificial intelligence.
  • If we choose not to weaponize technologies such as artificial intelligence, that does not mean that our competitors will follow suit and be bound by the same choices.
  • In time, intelligent machines should not just enhance manned platforms; they should replace them.
  • A battle network is the means by which militaries close the kill chain. It is what enables them to understand, decide, and act.
  • The problem is not that the US military is on the verge of taking humans “out of the loop” of the kill chain but that the US military today has way too many loops and way too many humans in the middle of all of them.
  • The US military today is simply much slower and less effective than it could or should be at doing the one thing that will determine its success or failure—closing the kill chain.
  • The most important objective is for the battle network to facilitate human understanding, decisions, and actions.
  • The critical source of future military advantage will be the ability to impose so many complex dilemmas on our opponents at once that we shatter their kill chains, disrupt their ability to command and control their own forces, and leave them incapable of understanding what is happening, making sound decisions, and taking relevant actions.
  • Putting people in machines makes them significantly more complex and expensive.
  • Hiding from overhead surveillance will become infinitely harder as the heavens are filled with thousands of small satellites in the coming years.
  • Militaries in the future will have little hope of hiding large traditional ships, aircraft, or ground force movements.
  • hiding is becoming significantly harder, and militaries will need to search for new ways to conceal themselves beyond their traditional capabilities such as stealth.
  • The speed of future military movement will accelerate further as more and more military things travel at hypersonic speeds, which is more than five times the speed of sound. Movement at these speeds will transform the timing and tempo of warfare.
  • Logistics has been the greatest limiting factor in the history of warfare. Hence the old saying: “Amateurs talk tactics; professionals talk logistics.”
  • Moving to and from space will become cheaper, easier, and more common, which means that militaries could eventually come to view space travel as little different from flying or sailing around the planet.
  • Shooting has consistently and considerably improved over time. But success is always a function of three factors that do not change: the range of fire (how far militaries can shoot), the accuracy of fire (how well they can hit what they are shooting at), and the effect of fire (how much damage they can do).
  • The improved range, accuracy, and effects of fire have already created considerable advantages for defenders over attackers, and emerging technologies will likely further this trend.
  • The laws of physics, geography, and economics apply little or not at all to cyber and other non-kinetic weapons.
  • Safe areas and sanctuaries will disappear. Everywhere will be contested and within range of enemy fires—even the US homeland.
  • The goal of a Military Internet of Things is ubiquity—the ability of any sensor to enable any weapon to strike any kind of target at any time.
  • As 3-D printing improves, however, military forces will be able to print more of their own ammunition near the battlefield.
  • Communications are the links in any military’s kill chain.
  • The new model of military communications will not be built around small numbers of centralized hubs but rather will push critical communications functions out to the edges of vast networks that are physically distributed, more secure, less vulnerable, and more resilient.
  • Ubiquitous space-based communications networks will provide persistent access to information even in the most remote parts of the world.
  • Machine behavior depends on the integrity of the data that trains the machines’ algorithms.
  • The United States should assume that China, in particular, is racing to gain advantage in the same competitions, with the same—and, at times, better—technologies, and that the result could be a future Chinese military that shares most if not all of the same core capabilities and characteristics as our military could have.
  • In short, a lot of people are saying a lot of the right things. But the main problem in recent decades has not been a failure to say the right things. It has been a failure to do enough of those right things.
  • America’s strategic margin for error has disappeared.
  • It is difficult to overstate what a complete anomaly the past three decades have been in the broad sweep of world history. This era of unrivaled American dominance stands in marked contrast to the rest of history, which has always been characterized instead by great-power competitions.
  • What we have not considered, however, is that a foreign competitor would be willing or able to target the continental United States with large numbers of conventional weapons.
  • We optimized the US military to project power overseas.
  • The United States cannot and should not contest every difference that it has with China militarily. To the contrary, US leaders will have to determine what our nation’s core interests really are.
  • US thinking about warfare must shift from an offensive to a defensive mind-set. In short, America needs to put the “defense” back in our defense strategy.
  • If the United States develops a new, defensive way of war that is focused less on projecting military power than on countering the ability of others to do so, we could create the same dilemmas for our competitors that we are facing.
  • The United States needs to build a different kind of military.
  • Our focus must be on building and buying integrated networks of kill chains, not individual platforms and systems.
  • Similarly, rather than expensive systems that are effectively irreplaceable, the future force should be built around lower-cost systems that are effectively expendable. If US systems are cheap to build, operate, and replenish, we would be more willing and able to lose them.
  • People are expensive. Putting people in machines is even more expensive. And no one ever wants to pay the ultimate price of losing a human life.
  • Manned systems will not fare well on future battlefields, which will be extremely violent with heavy losses on all sides.
  • Finally, the future force must be defined more by its software than its hardware. It must be, in every way, a digital force. This is a total inversion of how military power has forever been conceived.
  • What traditionally wins wars is hardware. It is iron and steel.
  • The goal is to acquire whatever combination of smart systems adds up to a superior capability that enables humans to understand, decide, and act.
  • What Trump gets wrong is that the United States does not have allies because we are suckers. We have allies because it benefits America. We want allies because it is better than being alone. We need allies because maintaining a favorable balance of power is not possible without them.
  • The main question is not whether the US military should change but whether we can change—and change fast enough.
  • Think of the budget process as the opposite of the kill chain. Whereas the kill chain is supposed to be fast, meticulous, and uncompromising in its precision, the budget process is slow, tedious, unruly, and defined by messy, imperfect compromises. And yet both are essential.
  • If you want to know what leaders in Washington really value, what they say matters a lot less than what they spend money on. Spending is what reveals their true priorities—what matters most.
  • What precedes the budget process is “the requirements process,” and what follows it is “the acquisition process.”
  • The requirements process is how the Department of Defense determines what constitutes a “validated” military capability to develop or buy.
  • Those who have the authority to do things differently rarely use it, and those who do make decisions often lack the authority and incentives to make riskier decisions to get better outcomes.
  • The requirements process and the acquisition process often impede good outcomes. But the bigger problem is that we spend too much money on the wrong things and not enough on the right things. And that has more to do with the budget process.
  • Most of the incentives that govern the Pentagon’s bureaucracy favor the past over the future.
  • Defense lobbyists are a convenient scapegoat. But the real problem is not that a handful of big defense contractors have a loud voice in the budget process. The real problem is that so few defense companies are left in America after decades of defense industry consolidation, that so few of the remaining companies are leaders in emerging technologies, and that those which are doing this futuristic work for the US military have little to no voice in the budget process.
  • In Congress, less than 1 percent of members have studied computer science, and few have meaningful experience working in the technology industry.
  • The shift to emerging technologies in place of existing systems could happen much faster than most people in the defense establishment realize, and the backlash could be severe.
  • A good idea rarely wins on its merits alone. Its success too often comes down, instead, to the trading of favors and the political dark arts.
  • There are no technological miracles or deus ex machina to save us.
  • Translating vague, buzzwordy goals into clear operational problems is necessary for US leaders to create the incentives that can generate better, more relevant capabilities for the US military much faster.
  • The Department of Defense rarely uses mission-focused competitions to identify the best solutions in the way that has proven so effective in the commercial world.
  • companies that want to build a different kind of military cannot expect to win strictly by the quality of their new solutions alone.
  • There is a reason why parts of the F-35 are built in every state in America, and it is not business efficiency. It is political expediency.
  • If we want different and better outcomes, we have to create different and better incentives to get them.
  • We have so many decent, hardworking, dedicated people. We have such amazing technology in our country. We have all the money we need. The bigger problem, however, remains: we just cannot get out of our own way.
  • Our failure to adapt will not stop others from doing so. If America does not change itself, change will still happen.

                                                                                                                                                                                                                                                                                                                                        20210411

                                                                                                                                                                                                                                                                                                                                        Designing Data-Intensive Applications by Martin Kleppmann

                                                                                                                                                                                                                                                                                                                                        • 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.

                                                                                                                                                                                                                                                                                                                                        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.