I've been a software engineer for over two decades, in six countries, using a dozen different languages, and in all sorts of organizations ranging from startups to big tech, airline to government, telco to gambling and whatnot. I've been fortunate enough to get some exposure to big data and distributed systems early on in my career, and I continued riding that wave to Google where I worked as a senior reliability engineer on cloud databases. In addition to technical work I helped grow multiple engineers and teams throughout my career. Due to time constraints I cannot accept all requests. Please don't take it personally.

My Mentoring Topics

  • Software engineering
  • Software development
  • Software design
  • Software project management
  • Big data
  • Distributed systems
  • Functional programming
  • Cloud computing
  • Site Reliability Engineering
  • Devops
  • Scala
  • Java
  • Python
  • Career growth
  • Technical leadership
  • Burnout
  • Contracting
  • Freelancing
11.January 2023

You need to be logged in to schedule a session with this mentor. Please sign in here or create an account.

Peopleware - Productive Projects and Teams
Tom DeMarco, Tim Lister

Key Facts and Insights: The success of a project or team is more about the people than the technology. This central theme of "Peopleware" emphasizes that human factors like communication, environment, morale, and team dynamics significantly impact productivity more than any technical tool or software. Productivity is maximized in an interruption-free environment. The book highlights the concept of flow, a state of deep concentration, and how frequent interruptions can disrupt this state, causing productivity to plummet. Quality workers matter more than the quantity. DeMarco and Lister argue that the best programmers are vastly more productive than average ones, suggesting that companies should focus on hiring and retaining the best. Turnover is productivity's biggest enemy. The authors maintain that employee turnover interrupts the team's rhythm and flow, costing companies significant time and money. Office space impacts productivity. The book emphasizes the importance of an ideal working environment - quiet, private, and comfortable - for maximizing productivity. Building a healthy team culture is crucial. DeMarco and Lister advocate for growing jelled teams, groups that have matured to the point where they function as a unit, leading to improved productivity. People are more important than processes. While processes and methodologies are necessary, they're not as crucial as having a dedicated and motivated team. Avoiding overtime and burnout. The authors argue against extended overtime, which can lead to burnout and diminished productivity in the long run. Leadership is about serving the team. The book promotes the idea of servant leadership, where leaders focus on the growth and well-being of their team members. Detailed Analysis: "Peopleware" is a groundbreaking exploration of the human side of software development, focusing on the people who create and deliver technology. Authors Tom DeMarco and Tim Lister argue that the key to successful software projects lies not in the latest tools or methodologies, but in the interactions, motivations, and general well-being of the team members. A major concept they discuss is flow, a state of deep, uninterrupted concentration in which developers produce their best work. The authors lament the trend towards open-plan offices and frequent meetings, both of which disrupt flow and significantly reduce productivity. They advocate for quiet, private workspaces that allow developers to enter and maintain their state of flow. The book also emphasizes the importance of quality over quantity. DeMarco and Lister argue that a small team of excellent programmers will outperform a larger team of average programmers. This serves as a reminder for companies to invest in hiring and retaining top talent. The detrimental impact of high turnover rates is another key insight. When team members leave, their knowledge and experience leave with them, disrupting the team's rhythm and flow. The authors contend that preventing turnover should be a high priority for management. The idea of jelled teams is also introduced. These are teams that have matured to the point of functioning as a single unit, leading to increased productivity and job satisfaction. The authors provide practical advice on how to nurture such teams and avoid actions that could "de-jell" them. "Peopleware" also challenges traditional views on overtime. While it may seem like a quick solution to meet deadlines, the authors argue that extended overtime can cause burnout and lower productivity in the long run. Finally, the authors advocate for a leadership style that puts people first. They promote the idea of servant leadership, where the leader's primary role is to serve the team, focusing on their growth and well-being. In conclusion, "Peopleware" provides a profound understanding of the human factors that contribute to successful software development. The authors remind us that, at its core, software development is a human activity, and it is the people, their interactions, and their satisfaction that ultimately determine the success of any project. Their insights are relevant not just for software development, but for any field that involves collaborative work. "Peopleware" is a must-read for anyone looking to build and manage highly productive teams.

The Psychology of Computer Programming
Gerald M. Weinberg

Key Facts or Insights from "The Psychology of Computer Programming" Egoless Programming: This interesting concept suggests that programmers should not attach their ego to their code, which can lead to more productive programming and better error detection. The Psychology of Programming Teams: Weinberg delves into the group dynamics of programming teams, emphasizing the importance of communication and cooperation. Programming Errors: Contrary to popular belief, programming errors or "bugs" are not random but are a product of the programmer's psychological state and knowledge at the time of coding. Programming as Human Activity: Weinberg argues that programming is more than just a technical activity; it involves a great deal of human behavior and psychology. Programming Languages and Their Influence: The book explores how different programming languages can influence the way programmers think and solve problems. Programming Tools and Environments: The choice of tools and environments can greatly affect the productivity and satisfaction of programmers. Role of Management in Programming: Weinberg emphasizes that the role of management is critical in fostering a productive and healthy programming environment. The Joys and Pains of Programming: The book discusses both the satisfying and frustrating aspects of programming, which are deeply interwoven with the programmer's psychology. Anthropological Approach to Programming: Weinberg suggests an anthropological approach to study programming culture and behavior. Program Testing: The book discusses the psychological aspects of program testing, arguing that it is not just a technical process but also a psychological one. Programming and Learning: Weinberg posits that programming is a continuous learning process, and the ability to learn and adapt is crucial for a successful programmer. In-Depth Summary and Analysis of "The Psychology of Computer Programming" Published in 1971, "The Psychology of Computer Programming" by Gerald M. Weinberg was a groundbreaking work that shifted the focus of software development from a purely technical process to one that involves a deep understanding of human cognition and behavior. The concept of Egoless Programming is one of the most enlightening insights from the book. Weinberg suggests that programmers should not attach their ego to their code. This detachment allows programmers to accept criticism and feedback more openly, leading to more efficient debugging and code improvement. This concept has profound implications on the culture of programming and reinforces the idea of collaborative coding, a practice common in today's Agile and DevOps environments. In his discussion on The Psychology of Programming Teams, Weinberg delves into group dynamics, communication, and collaboration among team members. He emphasizes that successful programming is rarely a solitary endeavor and that effective communication is key to resolving technical issues and fostering creativity. Programming Errors, according to Weinberg, are not random occurrences but are directly linked to the programmer's psychological state and knowledge at the time of coding. This perspective encourages a more empathetic and productive approach to debugging and problem-solving. Weinberg’s assertion that Programming is a Human Activity underscores the significance of psychology in software development. He argues that understanding the psychological factors that influence programmers can lead to better software design and development processes. The author also explores the influence of Programming Languages on the way programmers think and solve problems. He proposes that different languages can shape a programmer's cognitive processes, a concept reminiscent of the linguistic relativity hypothesis in cognitive science. The impact of Programming Tools and Environments on the productivity and satisfaction of developers is another key aspect that Weinberg discusses. He argues that the choice of tools and environments can greatly affect the effectiveness and efficiency of programmers. Weinberg also underscores the Role of Management in Programming. He suggests that enlightened management can foster a productive programming environment, emphasizing the importance of understanding programmers' needs and providing them with the necessary tools and conditions for effective work. The book also discusses the Joys and Pains of Programming. Weinberg delves into both the satisfying and frustrating aspects of programming, which are deeply interwoven with the programmer's psychology. He suggests that understanding these psychological aspects can lead to better job satisfaction and productivity. Weinberg's Anthropological Approach to Programming suggests studying the culture and behavior of programmers to gain deeper insights into programming practices. This perspective provides a fresh lens to view and understand the world of programming. In the section on Program Testing, Weinberg discusses the psychological aspects of testing. He argues that testing is not just a technical process but also a psychological one, involving problem-solving, creativity, and intuition. Finally, Weinberg emphasizes that Programming is a Continuous Learning Process. He suggests that the ability to learn and adapt is crucial in the ever-evolving field of programming. In conclusion, "The Psychology of Computer Programming" by Gerald M. Weinberg is a seminal work that bridges the gap between psychology and computer programming. It provides deep insights into the psychological aspects of programming, offering a unique perspective on software development. The book remains as relevant today as it was when it was first published, and it is a must-read for anyone interested in the human aspects of programming.

Designing Data-Intensive Applications - The Big Ideas Behind Reliable, Scalable, and Maintainable Systems
Martin Kleppmann

Key Facts and Insights The book explores the underlying principles of data systems and how they are used to build reliable, scalable, and maintainable applications. It outlines the importance of distributed systems in handling data-intensive applications and how to deal with the challenges associated with them. The book emphasizes on the trade-offs involved in choosing particular data structures, algorithms, and architectures for data-intensive applications. It provides a detailed explanation of the three main components of data systems: storage, retrieval, and processing. It presents an in-depth understanding of consistency and consensus in the context of distributed systems. The book discusses various data models, including relational, document, graph, and many more, along with their suitable use cases. It also examines the concept of stream processing and batch processing, their differences, and when to use each. It underlines the significance of maintaining data integrity and the techniques to ensure it. It offers comprehensive coverage of the replication and partitioning strategies in distributed systems. The book provides a balanced view of various system design approaches, explaining their strengths and weaknesses. Lastly, the book does not recommend one-size-fits-all solutions. Instead, it equips the reader with principles and tools to make informed decisions depending on the requirements of their projects. In-Depth Analysis of the Book "Designing Data-Intensive Applications" by Martin Kleppmann is a comprehensive guide to understanding the fundamental principles of data systems and their effective application in designing reliable, scalable, and maintainable systems. It provides an exhaustive account of the paradigms and strategies used in data management and their practical implications. Understanding Data Systems The book begins by introducing the basics of data systems, explaining their role in managing and processing large volumes of data. It delves into the three main components of data systems: storage, retrieval, and processing. Each component is explored in detail, providing the reader with a clear understanding of its functionality and importance in a data system. Data Models and Query Languages The book delves into the various data models used in data-intensive applications, such as relational, document, and graph models. It provides a comparative analysis of these models, highlighting their strengths and weaknesses, and the specific use cases they are best suited for. Additionally, it discusses the role of query languages in data interaction, explaining how they facilitate communication between the user and the data system. Storage and Retrieval The book explains the techniques and data structures used for efficiently storing and retrieving data. It underlines the trade-offs involved in choosing a particular approach, emphasizing the importance of taking into account the specific requirements of the application. Distributed Data The book delves into the complexities of distributed data. It outlines the significance of distributed systems in handling data-intensive applications and discusses the challenges associated with them, such as data replication, consistency, and consensus. It also provides solutions to these challenges, equipping the reader with strategies to effectively manage distributed data. Data Integrity The book underscores the significance of maintaining data integrity. It provides an in-depth understanding of the concept and discusses techniques to ensure it, such as atomicity, consistency, isolation, and durability (ACID) and base properties. Stream Processing and Batch Processing The book examines the concept of stream processing and batch processing. It discusses their differences, the challenges associated with each, and the scenarios where one would be preferred over the other. Conclusion In conclusion, "Designing Data-Intensive Applications" is a comprehensive guide that provides readers with a deep understanding of data systems. It equips them with the knowledge to make informed decisions when designing data-intensive applications, based on the specific requirements of their projects. The book's strength lies in its balanced view of various system design approaches, offering a holistic understanding of the dynamics involved in managing data. It is an essential read for anyone seeking to delve into the world of data systems.

Code Complete, 2nd Edition
Steve Mcconnell

Key Facts and Insights: Construction: The book emphasizes the importance of the 'construction' phase of software, which includes coding, debugging, and integration. It asserts that this phase consumes the largest portion of the software development lifecycle. Pragmatism over Idealism: McConnell argues that a pragmatic approach to coding is more effective than dogmatic adherence to ideals. He focuses on practical, real-world coding techniques that have been proven to work over theory. Code Quality: The book details how to achieve high-quality code, including the use of good coding practices, code reviews, and comprehensive testing. Software Design: It also delves into software design principles, advocating for a simple and straightforward design that enhances understandability and maintainability. Programmer's Mindset: McConnell stresses the importance of having the right mindset and attitudes as a programmer, such as curiosity, creativity, critical thinking, and a continual desire for improvement. Tools and Techniques: The book provides a comprehensive overview of various tools and techniques that can enhance the coding process, including version control, debugging tools, and automated testing. Collaboration: It highlights the value of effective collaboration within a team, including good communication, respect, and shared responsibility. Continuous Learning: McConnell emphasizes the importance of continuous learning and skill development in the rapidly evolving field of software development. Code Tuning: The book offers strategies for code tuning and optimization, cautioning against premature optimization and advocating for a systematic and data-driven approach. In-Depth Analysis and Conclusions: "Code Complete, 2nd Edition" by Steve McConnell is a comprehensive guide to software construction that is as relevant today as when it was first published. The book's central theme is the primacy of the 'construction' phase in software development. McConnell argues that the coding, debugging, and integration stages of a project consume the majority of a project's time and resources. This emphasis on 'construction' is noteworthy because it challenges the traditional waterfall model of software development, which often prioritizes design and requirements gathering over coding. One of the key insights of the book is its focus on pragmatism over idealism. McConnell recognizes that in the real world, coding often involves making trade-offs and dealing with constraints such as time, budget, and existing systems. He advocates for a practical approach to coding, focusing on techniques that have been proven to work in the field. This pragmatism extends to his discussions of code quality and software design. He argues for simplicity and clarity in code and design, emphasizing that understandable and maintainable code is more valuable than clever or intricate code. The book also addresses the importance of the programmer's mindset. McConnell emphasizes qualities such as curiosity, creativity, critical thinking, and a continual desire for improvement. He encourages programmers to view themselves as craftspeople, taking pride in their work and always striving to improve their skills and knowledge. This mindset, together with a commitment to continuous learning, is essential in the rapidly evolving field of software development. A significant portion of the book is dedicated to tools and techniques for effective coding. McConnell provides an overview of various tools, such as version control systems and debugging tools, and techniques like automated testing. He emphasizes the importance of using these tools effectively, not just for their own sake, but to enhance the quality of the code and the efficiency of the development process. Finally, the book highlights the value of effective collaboration and communication within a team. McConnell stresses the importance of respect, shared responsibility, and good communication in a collaborative environment. He also discusses strategies for code reviews and pair programming, which can improve code quality and foster a culture of collective ownership and responsibility. In conclusion, "Code Complete, 2nd Edition" is a comprehensive guide to software construction that offers practical, real-world advice for improving code quality and the software development process. Whether you are a novice programmer or an experienced developer, the insights and techniques presented in this book can help you become a more effective and proficient software craftsman. The book's emphasis on the 'construction' phase of software, its focus on pragmatism and quality, and its discussions of the programmer's mindset and collaboration make it an essential read for anyone involved in software development.