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
R.
6.December 2024

I really enjoyed the session with Murat. It was very helpful and made everything feel much clearer! The mentor was so easy to talk to and really took the time to explain things in a way that made sense to me. I definitely learned a lot, especially with the personalized advice. After the session, I was really impressed that the mentor followed up with emails to help me restructure my resume. That extra support made a huge difference, and I feel much more confident about my job search now. Thanks so much for the fantastic session and all the follow-up help. I truly appreciate it!

I.
26.September 2024

It was a great session. We discussed the topics I was concerned about, and Murat helped me go through them in a practical way with a fresh perspective.

V.
13.October 2023

Murat was such a pleasure to speak with, he showed great understanding in industry trends and requirements, as well as proffered some suggestions for improvement...he was very engaging.

A.
29.August 2023

There's a lot to learn from Murat, starting from his experience at FAANG, interview prep and so much more. He understood my situation and suggested few actions to be taken to improve my career moving forward. Thank you very much Murat!

K.
15.May 2023

During our conversation, I learned something new and had many things I already knew confirmed. This showed me that I am on the right path. However, the most inspiring was the story of Murat, which also lifted my spirits. But I'll let you hear that for yourselves.

S.
26.April 2023

R.
3.March 2023

Murat's approach to software engineering team structure and work methodologies was impressive, and he shared the factors he considers when deciding on these topics. He also discussed the challenges of changing jobs this year due to recent layoffs. Finally, he provided helpful advice on advancing a career in software engineering, particularly regarding technical leadership and project management. Another important topic we explored was the culture and work environment differences between startups and big tech companies. Again, Murat's insights on this topic were invaluable and gave me a better understanding of both environments. Overall, I found my session with Murat extremely helpful, and I appreciate the time and effort he put into our conversation. I highly recommend him as a mentor to anyone seeking guidance and advice in the IT industry.

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

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

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

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

View
Cracking the Coding Interview - 189 Programming Questions and Solutions
Gayle Laakmann McDowell

Key Facts and Insights from "Cracking the Coding Interview" Data Structures: The book provides an in-depth understanding of basic and advanced data structures like arrays, linked lists, trees, graphs, stacks, and queues. Algorithms: It delves into algorithmic thinking and problem-solving, covering sorting, searching, dynamic programming, and recursion among others. Complexity Analysis: It offers a comprehensive guide to analyzing time and space complexity, and how to optimize code. System Design: The book introduces high-level system design principles and scalability issues. Object-Oriented Design: It discusses object-oriented design principles and patterns, a key skill in software development. Software Development Process: It takes readers through the software development life cycle, testing, and debugging. Interview Preparation: It extensively covers how to prepare for coding interviews, including soft skills, resume building, and behavioral questions. Problem-solving Strategies: It provides strategies and methodologies for problem-solving, which can be broadly applied in all programming scenarios. Mock Interviews: It includes mock interviews for several prominent tech companies, providing a real-world perspective. Practical Examples: The book is filled with 189 programming questions and solutions to help readers practice and cement their understanding. An In-Depth Analysis of "Cracking the Coding Interview" "Cracking the Coding Interview" by Gayle Laakmann McDowell is a comprehensive guide for anyone preparing for a coding interview, especially for roles at top tech companies. The book is divided into multiple sections, each focusing on a specific aspect of programming and software development. Data structures and algorithms are the backbone of any programming problem, and this book does a remarkable job of explaining these concepts. It starts with basic data structures like arrays and linked lists, gradually moving to more advanced ones like trees and graphs. For each data structure, the book explains its working, use-cases, and common operations. It also discusses several algorithms, from sorting and searching to dynamic programming and recursion. The author provides numerous examples and practice problems, allowing readers to apply their newly acquired knowledge. Complexity analysis is another crucial aspect of programming. Understanding how to analyze time and space complexity is key to writing efficient code. The book provides a detailed guide on how to calculate and optimize the complexity of code, helping readers develop code that scales well. The book also covers system design and object-oriented design principles. These sections discuss how to design scalable and maintainable systems, touching on topics like databases, networking, and APIs. It also delves into object-oriented design principles and patterns, which are essential for designing robust software. Understanding the software development process is critical for any software engineer. The book takes readers through the software development life cycle, explaining various stages from requirement gathering to deployment. It also discusses testing and debugging techniques, which are vital for ensuring the reliability of software. One of the most unique aspects of this book is its focus on interview preparation. The author provides practical advice on how to prepare for interviews, discussing everything from resume building to behavioral questions. She also includes mock interviews from several prominent tech companies, giving readers a real-world perspective of what to expect. Finally, the book provides several problem-solving strategies, which are applicable to any programming problem. These strategies include techniques like problem decomposition, pattern recognition, and iterative refinement. The 189 programming questions and solutions provided in the book serve as an excellent practice for these strategies. In conclusion, "Cracking the Coding Interview" is a comprehensive guide that covers every aspect of coding interviews. Whether you are a budding programmer or an experienced developer, this book will provide you with the knowledge and skills required to excel in any coding interview.

View
System Design Interview - An Insider's Guide
Alex Xu

Key Insights from the Book: Pragmatic Approach to System Design: The book emphasizes the importance of developing a pragmatic approach to system design, focusing on real-world applications rather than theoretical concepts. Understanding the Interview Process: It provides an inside look into the tech interview process, particularly focusing on system design interviews. Focus on Communication: The book highlights the significance of communication in conveying ideas effectively in a system design interview. Conceptual Understanding: It covers essential topics like scaling, databases, caching, data partitioning, and system security. Case Studies: The book includes numerous case studies that offer practical insights into handling various system design problems. Mock Interviews: There are mock interviews to provide a realistic perspective on how actual interviews are conducted. Resources for Further Learning: It provides a comprehensive list of resources for readers to delve deeper into system design topics. Hands-on Approach: The book encourages a hands-on approach to learning through exercises and quizzes. Interview Preparation: It offers practical tips and strategies for preparing for system design interviews. Understanding Expectations: The book helps readers understand what interviewers expect from candidates during system design interviews. Feedback and Improvement: It emphasizes the importance of feedback and continuous improvement in mastering system design. Detailed Analysis and Conclusions: "System Design Interview - An Insider's Guide" by Alex Xu is a comprehensive guide that provides readers with deep insights into the system design interview process. It uses a pragmatic approach, focusing on real-world applications of system design concepts rather than just the theoretical understanding. This approach is particularly beneficial for those preparing for tech interviews as it mirrors the scenario they will encounter. The book does a commendable job demystifying the interview process. It provides a realistic portrayal of system design interviews, making it easier for the readers to understand what to expect and how to excel. The importance of communication is reiterated throughout the book, emphasizing that effective communication is just as crucial as technical competence in a successful interview. The book covers a broad range of essential system design topics including scaling, databases, caching, data partitioning, and system security. The author’s conceptual understanding of these topics is evident and the manner in which these topics are explained makes it easier for readers to grasp the fundamentals. One of the book’s major strengths is its inclusion of numerous case studies. These case studies allow readers to apply the concepts learned and gain practical insights into tackling various system design problems. This aligns with the book's hands-on approach to learning, further supplemented by exercises and quizzes. Mock interviews are another valuable component of the book. They provide a realistic perspective on how actual interviews are conducted, allowing readers to prepare effectively. The book goes a step further and offers practical tips and strategies for interview preparation, making it a comprehensive resource for anyone aspiring to crack system design interviews. Understanding interviewer expectations is a critical aspect of any interview process. The book does an excellent job in this regard by helping readers comprehend what interviewers look for in candidates during system design interviews. Lastly, the book stresses the importance of feedback and continuous improvement in the journey to master system design. It encourages readers to learn from their mistakes and continuously work on improving their understanding and application of system design concepts. Overall, "System Design Interview - An Insider's Guide" is not just a book; it is a complete package that equips readers with the knowledge and skills required to excel in system design interviews. The book's pragmatic approach, coupled with its focus on real-world applications, makes it a valuable resource for anyone looking to make a mark in the tech industry.

View