Previous Next

Leading Effective Engineering Teams Lessons for Individual Contributors and Managers from 10 Years at Google (Addy Osmani) (z-library.sk, 1lib.sk, z-lib.sk)

Author: Addy Osmani

其他

In this insightful and comprehensive guide, Addy Osmani shares more than a decade of experience working on the Chrome team at Google, uncovering secrets to engineering effectiveness, efficiency, and team success. Engineers and engineering leaders looking to scale their effectiveness and drive transformative results within their teams and organizations will learn the essential principles, tips, and frameworks for building highly effective engineering teams. Osmani presents best practices and proven strategies that foster engineering excellence in organizations of all sizes. Through practical advice and real-world examples, Leading Effective Engineering Teams empowers you to create a thriving engineering culture where individuals and teams can excel. Unlock the full potential of your engineering team and achieve unparalleled success by harnessing the power of trust, commitment, and accountability. With this book, you'll discover: The essential traits for engineering effectiveness and the pitfalls to avoid How to cultivate trust, commitment, and accountability within your team Strategies to minimize friction, optimize career growth, and deliver maximum value The dynamics of highly successful engineering teams and how to replicate their achievements How to implement a systems thinking approach for everyday problem-solving and decision-making Self-advocacy techniques to enhance your team's visibility and recognition within the organization

📄 File Format: PDF
💾 File Size: 942.1 KB
7
Views
0
Downloads
0.00
Total Donations

📄 Text Preview (First 20 pages)

ℹ️

Registered users can read the full content for free

Register as a Gaohf Library member to read the complete e-book online for free and enjoy a better reading experience.

📄 Page 1
Leading Effective Engineering Teams LESSONS FOR INDIVIDUAL CONTRIBUTORS & MANAGERS FROM 10 YEARS AT GOOGLE ADDY OSMANI foreword by GERGELY OROSZ
📄 Page 2
US $39.99 CAN $49.99 ISBN: 978-1-098-14824-9 In this insightful and comprehensive guide, Addy Osmani shares over a decade of experience working at Google, uncovering secrets to engineering effectiveness, efficiency, and team success. Engineers and engineering leaders looking to drive transformative results within their teams and organizations will learn the essential principles, tips, and frameworks for building highly effective engineering teams. Osmani presents best practices and proven strategies that foster engineering excellence in organizations of all sizes. Through practical advice and real-world examples, Leading Effective Engineering Teams empowers you to create a thriving engineering culture where individuals and teams can excel. Unlock your team’s full potential and achieve unparalleled success by harnessing the power of trust, commitment, and accountability. With this book, you’ll discover: • Essential traits for engineering effectiveness and pitfalls to avoid • Strategies to minimize friction, optimize career growth, and deliver maximum value • The dynamics of highly successful engineering teams and how to replicate their achievements • Self-advocacy techniques to enhance your team’s visibility and recognition within the organization With over 25 years of industry experience, Addy Osmani is currently an engineering leader at Google where he leads teams focused on developer experience. Over the past 12 years, he’s held a variety of roles at the company, from individual contributor to a leader of leaders. BUSINESS “Leading Effective Engineering Teams is a great book for new and experienced leaders alike. This book breaks down jargon with understandable explanations and helps decode some of the common advice in the industry. Addy absolutely excels at reasonable and concise explanations.” — Sarah Drasner, Senior Director of Engineering, Google Core Infrastructure linkedin.com/company/oreilly-media youtube.com/oreillymedia Leading Effective Engineering Teams LESSONS FOR INDIVIDUAL CONTRIBUTORS & MANAGERS FROM 10 YEARS AT GOOGLE Lea d ing Effective Eng ineering Tea m s
📄 Page 3
Leading Effective Engineering Teams Lessons for Individual Contributors and Managers from 10 Years at Google Addy Osmani
📄 Page 4
978-1-098-14824-9 [LSI] Leading Effective Engineering Teams by Addy Osmani Copyright © 2024 Adnan Osmani. All rights reserved. Printed in the United States of America. Published by O’Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472. O’Reilly books may be purchased for educational, business, or sales promotional use. Online editions are also available for most titles (https://oreilly.com). For more information, contact our corporate/institutional sales department: 800-998-9938 or corporate@oreilly.com. Acquisitions Editor: David Michelson Development Editor: Rita Fernando Production Editor: Kristen Brown Copyeditor: nSight, Inc. Proofreader: Doug McNair Indexer: WordCo Indexing Services, Inc. Interior Designer: Monica Kamsvaag Cover Designer: Susan Thompson Illustrator: Kate Dullea June 2024: First Edition Revision History for the First Edition 2024-06-11: First Release See http://oreilly.com/catalog/errata.csp?isbn=9781098148249 for release details. The O’Reilly logo is a registered trademark of O’Reilly Media, Inc. Leading Effective Engineering Teams, the cover image, and related trade dress are trademarks of O’Reilly Media, Inc. The views expressed in this work are those of the author and do not represent the publisher’s views. While the publisher and the author have used good faith efforts to ensure that the information and instructions contained in this work are accurate, the publisher and the author disclaim all responsibility for errors or omissions, including without limitation responsibility for damages resulting from the use of or reliance on this work. Use of the information and instructions contained in this work is at your own risk. If any code samples or other technology this work contains or describes is subject to open source licenses or the intellectual property rights of others, it is your responsibility to ensure that your use thereof complies with such licenses and/or rights.
📄 Page 5
Contents | Foreword v | Preface vii 1 | What Makes a Software Engineering Team Effective? 1 2 | Efficiency Versus Effectiveness Versus Productivity 33 3 | The 3 E’s Model of Effective Engineering 61 4 | Effective Management Behaviors: Research from Google 97 5 | Common Effectiveness Antipatterns 131 6 | Effective Managers 171 7 | Becoming an Effective Leader 203 | Index 255 iii
📄 Page 6
(This page has no text content)
📄 Page 7
Foreword When I transitioned from a software engineer to an engineering manager some time ago, I was surprisingly unprepared on what to do. I looked to my manager and peer engineering managers for advice and guidance, and I followed a trial- and-error approach to figure out what works. I had hoped that I’d do more “good” than “bad,” correct the “bad” quickly enough, and not make too many hard-to-fix mistakes. I wish I could say that times have changed and engineering managers these days can rely on more training or have access to better resources as they seek to become great leaders. However, most managers still do what I did: try various approaches and stick with ones that seem to be working. It’s little wonder that the manager job feels as difficult as it does—or that burnout is still high among managers. One company that decided to try to change how it supported engineering managers in their growth path was Google. Instead of relying on anecdotes and gut feelings, Google decided to quantify and verbalize the qualities that made great engineering managers. To this end, it ran two large-scale research projects, both of them the first of such scale. In 2008, Google ran Project Oxygen and identified eight attributes of good managers. In 2012, the company ran Project Aristotle and identified five factors that contribute to the success of software engineering teams. Addy Osmani joined Google in the same year that Project Aristotle was kicked off. Working inside a company that is obsessed with understanding what makes great engineering leaders—and then applying these lessons to make them better managers—is a helpful place to transition into management. Addy made this switch more than a decade ago. Since then, Addy has been taking notes on what kept him effective as a leader, and he is finally sharing these in this book. v
📄 Page 8
The challenge of being a great engineering leader is that there’s so much advice out there, not to mention the dozens of frameworks and mental models. How do you reconcile all these? In the first part of this book, Addy walks through the “modern theory” of engineering management: research and mental models on this space that have stood the test of time for useful management practices— ones that work well for tech teams. Many of these models are complementary, and some slightly contradict one another. In your own journey, you’ll need to pick and choose the ones that are most helpful in your specific context—and you will likely find yourself changing philosophies as you change teams or companies. The craft of leadership is far more practical than theoretical, though. The second part of this book is where Addy shares his practical approach to leading engineering teams, and this is the part where Addy shares a condensed history of a decade of leading tech teams. How should we deal with a team that addresses most issues heroically—and hastily—just before the release? What about a team where most members “rubber-stamp” PRs (pull requests) or have unusually long-running ones? And should you take action if your team neglects to do any form of retrospective—or is this something that can safely be ignored? In addition to sharing his own, distilled experience, Addy allows us to peek at how effective managers at Google operate, as well as what effective leadership looks like in other environments like startups or large enterprises. In the end, don’t lose sight of what makes a good leader: they achieve organizational goals. But what makes a great leader? They do it in a way that inspires and motivates the team. And how do they do all of this? Before I read this book, my answer would have been that they learn how to do it by shadowing a standout engineering leader. Now, you can get distilled insights from such a leader by carrying on reading this book—and I hope you will enjoy it as much as I did. —Gergely Orosz Former engineering manager at Uber, author of The Pragmatic Engineer Amsterdam, March 2024 VI |
📄 Page 9
Preface Today, the demands placed on engineering teams are more complex and multi- faceted than ever before, and the ability to scale your effectiveness as a leader has emerged as a critical skill. Regardless of whether you are at the helm of a small, nimble startup team or spearheading large-scale initiatives within a global corporation, the core principles of fostering trust, cultivating a growth mindset, and driving accountability remain universal and essential to achieving success. Throughout my long tenure at Google, I have been humbled to have the extraordinary privilege of leading engineering teams in a wide range of capaci- ties. From my early days as an individual contributor, when I focused on men- toring and nurturing the growth of my fellow engineers, to my roles as a tech lead manager and org leader at various levels, I have accumulated a wealth of knowledge and insights that have fundamentally shaped my understanding of what it takes to build and lead truly exceptional engineering teams. This book represents a distillation of those invaluable lessons. This book is for engineers wanting to move into leadership roles or engineer- ing leaders who want evidence-based guidance to improve their effectiveness and that of their teams. It is a comprehensive guide to the strategies, frameworks, and best practices that I have found to be most effective in unlocking the full potential of engineering teams and driving transformative results. By sharing real-world examples, practical insights, and actionable advice, I aim to empower you with the tools and knowledge you need to become an exceptional engineer- ing leader in your own right. At the heart of this book lies a deep exploration of the key traits and behaviors that distinguish highly effective engineers and engineering leaders from their peers. These are the individuals who consistently deliver outstanding results, inspire their teams to reach new heights, and make a lasting impact on the projects and initiatives they lead. By understanding and embodying these vii
📄 Page 10
characteristics, you, too, can set yourself apart and make a meaningful difference in your role. One of the central themes that permeates every chapter of this book is the paramount importance of creating a culture of psychological safety within your engineering team. In a psychologically safe environment, team members feel empowered to take risks, voice their ideas and opinions openly, and view failures as valuable opportunities for growth and learning. As a leader, it is your responsi- bility to actively foster and maintain this type of culture, where experimentation, innovation, and continuous improvement are not only encouraged but celebrated as essential components of success. Throughout the book, you will dive deep into the dynamics of high- performing engineering teams, examining the strategies and practices that enable them to consistently deliver exceptional results. From the learning about the art of effective communication and collaboration to exploring the implemen- tation of robust processes for decision making and problem-solving, you will gain a comprehensive understanding of the key ingredients that go into building and sustaining a team that operates at the highest level. But the path to becoming an outstanding engineering leader extends far beyond gaining technical expertise and project management skills. It requires a multifaceted approach that encompasses gaining self-awareness, cultivating emotional intelligence, and developing the ability to deftly navigate complex interpersonal dynamics. In the chapters that follow, you will explore powerful techniques for self-advocacy and personal growth, helping you to amplify your impact and that of your team within the broader organizational landscape. Drawing upon the wealth of knowledge shared within these pages, you will learn how to cultivate a deep sense of trust, commitment, and accountability among your team members. You will delve into the intricacies of providing constructive feedback, setting clear goals and expectations, and empowering your team to take ownership of their work and their professional development. By mastering these skills, you will be well equipped to create a team culture that fosters high levels of productivity and is deeply fulfilling for all involved. Whether you are an aspiring engineering leader just embarking on your journey or a seasoned veteran looking to take your team’s performance to new heights, this book will serve as an indispensable resource, providing you with the insights, tools, and frameworks needed to achieve your goals. By leveraging the collective wisdom and experiences shared within these pages, you will be able to drive meaningful change, overcome obstacles, and attain extraordinary results. viii | PREFACE
📄 Page 11
In the following chapters, you will find practical exercises, thought-provoking questions, and actionable strategies that you can begin implementing immedi- ately within your own team and organization. I invite you to fully engage with these materials, reflect deeply on your own experiences and challenges, and use the insights gained to chart a course toward greater effectiveness, efficiency, and impact. As we delve into the art and science of leading extraordinary engineering teams, it is important to remember that this is not a journey that you have to undertake alone. I will be sharing my personal experiences and insights as well as the wisdom and advice of other accomplished engineering leaders who have graciously contributed their knowledge to this project. In addition to the wealth of practical advice and real-world examples con- tained within these pages, I have included a series of in-depth case studies that showcase the transformative power of effective engineering leadership in action. These case studies feature some of the most innovative and successful engineer- ing teams from across the industry, offering valuable insights into how they have overcome challenges, driven innovation, and achieved remarkable results. By studying these real-world examples and learning from the experiences of other exceptional engineering leaders, you will gain a deeper understanding of what it takes to build and lead high-performing teams in today’s complex technological landscape. Whether you are looking to improve your team’s pro- ductivity, enhance collaboration and communication, or drive innovation and growth, these case studies will provide you with the inspiration and practical guidance you need to achieve your goals. By tapping into this collective well of expertise and experience, you will be able to learn from the successes and challenges of others and apply those lessons to your own unique context and circumstances. Whether you are seeking to build stronger relationships with your team members, improve your communication and collaboration skills, or develop a more strategic and visionary approach to leadership, this book will serve as a valuable companion and guide on your journey. As we set out on this journey together, I encourage you to approach each chapter with an open mind and a willingness to challenge your preconceptions. The path to becoming an exceptional engineering leader is one of continuous learning, adaptation, and growth. It requires a steadfast commitment to your own development as well as to the growth and success of those around you. Let’s begin. PREFACE | ix
📄 Page 12
O’Reilly Online Learning For more than 40 years, O’Reilly Media has provided tech- nology and business training, knowledge, and insight to help companies succeed. Our unique network of experts and innovators share their knowledge and expertise through books, articles, and our online learning platform. O’Reilly’s online learning platform gives you on-demand access to live training courses, in-depth learning paths, interactive coding environments, and a vast collection of text and video from O’Reilly and 200+ other publishers. For more information, visit https://oreilly.com. How to Contact Us Please address comments and questions concerning this book to the publisher: O’Reilly Media, Inc. 1005 Gravenstein Highway North Sebastopol, CA 95472 800-889-8969 (in the United States or Canada) 707-827-7019 (international or local) 707-829-0104 (fax) support@oreilly.com https://www.oreilly.com/about/contact.html We have a web page for this book, where we list errata, examples, and any additional information. You can access this page at https://oreil.ly/leadEffEng- Teams. For news and information about our books and courses, visit https:// oreilly.com. Find us on LinkedIn: https://linkedin.com/company/oreilly-media. Watch us on YouTube: https://youtube.com/oreillymedia. x | PREFACE
📄 Page 13
Acknowledgments Writing this book has been an incredible journey, one that would not have been possible without the unwavering support, guidance, and contributions of numerous folks who have generously shared their time, expertise, and insights throughout the process. First and foremost, I would like to extend my deepest gratitude to the exceptional tech reviewers who have played an instrumental role in shaping the content and ensuring the accuracy and relevance of the material presented within these pages. Kate Wardin, Francisco Trindade, Maxi Ferreira, and Sriram Krishnan, your invaluable feedback, keen observations, and wealth of experience have been essential in helping me refine the ideas and strategies outlined in this book. Your dedication to providing thoughtful and constructive critiques has elevated the quality of this work immeasurably, and for that, I am truly grateful. I would also like to express my heartfelt appreciation to the outstanding editors who have been by my side every step of the way. Rita Fernando and Leena Sohoni-Kasture, your tireless efforts, meticulous attention to detail, and unwav- ering commitment to excellence have been nothing short of remarkable. Your guidance, patience, and editorial expertise have been instrumental in bringing this book to life, and I am deeply indebted to you for your unwavering support and dedication. Finally, I would like to express my profound gratitude to my family, friends, and fellow Googlers, whose support and understanding have been the bedrock upon which this entire endeavor has been built. Your unwavering belief in the project and your constant encouragement have been the driving force behind this book’s completion. To all those who have contributed to the creation of this book, whether directly or indirectly, I extend my deepest appreciation and gratitude. Your col- lective efforts and support have made this project a reality, and I am honored to have had the opportunity to collaborate with such an exceptional group of individuals. PREFACE | xi
📄 Page 14
(This page has no text content)
📄 Page 15
What Makes a Software Engineering Team Effective? Some teams seem to operate like well-oiled machines, churning out successes. Communication flows seamlessly, they meet deadlines with a smile, and they tackle challenges head-on. Conversely, other teams struggle to reach every mile- stone. Communication is chaotic, and meeting deadlines is a challenge. What makes the successful teams effective? It’s usually a mix of things: clear plans, honest talk, a healthy dose of trust, and a shared belief in what they’re doing. Some teams already have the rhythm and the steps down pat, while others are still figuring things out. But the good news is that everyone can learn the steps. Even the most stumbling crew can find its rhythm with a little practice. This rhythm manifests itself in software engineering teams as their ability to produce useful products or product features by writing code, testing it, and releasing it to the world. Teams that do this regularly are said to be effective. So, to build great software, we must first build effective engineering teams. Throughout my 25+ years of experience leading engineering teams at Google and other tech companies, I’ve seen firsthand how team dynamics can make or break a project. Building effective teams is not just about assembling the right technical skills; it’s about fostering a culture of collaboration, trust, and shared purpose. In this chapter, I’ll share some of the key lessons I’ve learned about what makes engineering teams successful, drawing on both research and my own experience in the trenches. 1 | 1
📄 Page 16
What makes an engineering team effective hinges on the key thing that distinguishes teams from groups. On the one hand, a group is a collection of individuals who coordinate their efforts. On the other hand, a team is a group that is bound by shared responsibilities and goals. Their members work together and share mutual accountability to solve problems and achieve common goals. When teams plan their work, review progress, or make decisions, they consider the skills and availability of all the members and not just those of one individual. This shared goal is what drives an effective team. I have had the opportunity to observe or be a part of such teams at Google. These teams are passionate about achieving their goals. They find brainstorming sessions fun rather than stressful. Team members may write and test code on their respective machines, but they are collectively tuned in to a unified vision of what the code should achieve. There have been times when they had to resolve some difficult issues, but a culture of collaboration, innovation, and mutual respect helped to see them through such times. Leaders are an important part of this picture. As a software engineering leader who wishes to make your team effective, you serve as an anchor that connects individual team members to the shared responsibilities and goals of the team. You provide the vision, direction, guidance, and environmental framework necessary to form this connection. Although it’s possible to have a team without a leader, the team will go much further with the support of a good leader—and that’s where you come in! Building an effective software engineering team takes work. Many factors can influence the success of a software engineering team, such as team composi- tion, communication, leadership, and work processes. This chapter will explore what traits make teams effective and how to build them into your team. These traits will be things you can look for when hiring, but they’re also traits you can nurture in your existing team. 2 | LEADING EFFECTIVE ENGINEERING TEAMS
📄 Page 17
1 They called it Project Aristotle as a tribute to the Greek philosopher, Aristotle, who is often quoted as saying, “The whole is greater than the sum of its parts.” Research on What Makes Teams Effective First, let’s examine what makes teams effective. To do so, let us look at some of the extensive research that has already been done on this topic. PROJECT ARISTOTLE Google conducted one of the best-known studies on effective software engineer- ing teams, known as Project Aristotle.1 The project aimed to identify the factors that make some teams more successful than others. The study was based on the premise that the composition of a team was not the most critical factor in determining success but rather how team members interacted with each other. Note Before Project Aristotle, there was Project Oxygen, which looked into what traits make for a good manager. Some of the insights in this chapter were informed by the results of Project Oxygen, which I’ll talk about in detail in Chapter 4. To determine what makes teams effective, the researchers first had to define what effectiveness means and how to measure it. They noticed that different roles had different perspectives on effectiveness. In general, whereas executives were interested in results such as sales numbers or product launches, team members thought that team culture was the key to team effectiveness. The team leaders indicated that ownership, vision, and goals were the most important measures. Eventually, the researchers decided to study certain qualitative and quantita- tive factors that might impact team effectiveness, such as the following: Team dynamics Demographics, conflict resolution, goal setting, psychological safety Personality traits Extraversion, conscientiousness Skill sets Programming skills, client management WHAT MAKES A SOFTWARE ENGINEERING TEAM EFFECTIVE? | 3
📄 Page 18
Researchers conducted interviews and reviewed existing survey data for 180 Google teams. They used this data to run 35 different statistical models and understand which of the many inputs collected impacted team effectiveness. Project Aristotle identified five key dynamics that contribute to the success of software engineering teams (see Figure 1-1). These are listed next in the order of their importance: Psychological safety This was the most important factor identified by the researchers. It refers to the extent to which team members feel comfortable expressing their opinions and ideas without fear of retribution or criticism. Teams that have high levels of psychological safety tend to be more innovative and take more risks, which can lead to better outcomes. The researchers found that when teams feel safe, they: • Are less likely to leave the company • Are more likely to utilize the diverse ideas discussed by the team • Bring in more revenue and beat their sales targets • Tend to be rated highly on effectiveness by their leadership Dependability This refers to the extent to which team members can rely on each other to complete their work and meet deadlines. Teams in which individuals trust each other to be dependable are more likely to be efficient and effective in their work. Structure and clarity These are conditions under which team members clearly understand the project’s goals and their own individual roles and responsibilities. Team members who clearly understand what is expected of them tend to be more productive and focused. Meaning This refers to the extent to which team members feel that their work is meaningful and has a purpose. Teams with a strong sense of purpose tend to be more motivated and engaged. 4 | LEADING EFFECTIVE ENGINEERING TEAMS
📄 Page 19
Impact This refers to how team members believe their work is making a difference and impacting the organization or society. Teams with a strong sense of impact are more committed to their work and the project’s success. Figure 1-1. Google’s Project Aristotle: The five dynamics of effective teams While Project Aristotle’s research was conducted within Google, the identi- fied factors influencing team effectiveness could hold some relevance for teams in other contexts. By focusing on these five factors, software engineering teams can create an environment conducive to collaboration, innovation, and success. As I’ll discuss in Chapter 4, a good manager can foster these dynamics in their teams. The researchers also discovered that variables such as team composition (size and colocation) or individual attributes (extroverted nature, seniority, ten- ure, etc.) did not contribute significantly to team effectiveness at Google. While these variables did not significantly impact team effectiveness measurements at Google, that doesn’t mean they’re unimportant, as indicated in the following section. OTHER RESEARCH While Project Aristotle is perhaps the best-known study on effective software engineering teams, many other studies have explored factors such as team com- position, communication, leadership, and work processes. Here are a few key findings from some of these studies: WHAT MAKES A SOFTWARE ENGINEERING TEAM EFFECTIVE? | 5
📄 Page 20
Smaller teams are better. Although Project Aristotle did not recognize team size as relevant to team effectiveness, other studies have shown that smaller teams work better. As a team gets bigger, the number of links that need to be managed among members increases exponentially. Managing these multiple com- munication channels can be complicated. Many researchers have identified smaller teams containing less than 10 members as more likely to achieve success than larger teams. Diversity can be beneficial. It is sometimes suggested that team diversity may lead to communication and coordination problems. For example, a diverse team would usually consist of people from different family backgrounds. Those with young children are more likely to seek flexible work hours, leading to coordination challenges. However, others have found that diverse teams can be more innovative and effective. A study by Lu Hong and Scott Page of the Univer- sity of Michigan found that groups of randomly selected (likely diverse) high-ability problem solvers can outperform groups comprising the best problem solvers. However, it’s important to note that diversity alone is not enough. Teams must also create an inclusive and respectful environment for all team members. For example, a team that is supportive of team members who need flexible work arrangements will be able to coordinate better than a team that is intolerant of members with such needs. Clear communication is vital. Effective communication is essential for effective teamwork. Studies have found that teams that communicate frequently and openly are more suc- cessful than those that do not. The idea of psychological safety is a shared belief among team members that they can freely express their thoughts, ideas, concerns, or even mistakes without fear of negative consequences or judgment. Its importance is backed up by the research from Project Aristotle. Clear communication also provides the glue to connect team members and establish structure and clarity within the team. Leadership matters. The leadership of a software engineering team can have a significant impact on its success. Google’s Project Oxygen showed that although teams could function without a leader, there is still a need for managers. It identified the essential traits that make for good managers and effective 6 | LEADING EFFECTIVE ENGINEERING TEAMS
The above is a preview of the first 20 pages. Register to read the complete e-book.

💝 Support Author

0.00
Total Amount (¥)
0
Donation Count

Login to support the author

Login Now

Recommended for You

Loading recommended books...
Failed to load, please try again later
Back to List