As a highly experienced software engineer with over 12 years of industry experience, I specialize in building visually stunning and user-centric mobile apps, games, and web applications. My expertise in design-focused programming and my ability to lead teams of programmers to successful project completion has been honed through my years of experience in the field. With a strong background in software development, I have been writing code since 2003 and have a diverse set of skills, including expertise in React.js, Node.js, Go (Golang), GRPC, Guice, Java, Kubernetes, Google Cloud Platform, Tekton, Jenkins, and CI systems. I am a seasoned professional with a wealth of experience in the tech industry, having previously founded my own tech startup and served as a programming teacher. My passion for teaching programming concepts has helped me to become an effective communicator, making complex technical ideas easy to understand. Currently, I am focused on utilizing my skills and expertise to drive results and make an impact in the field of software engineering. I am available for mentoring beginners in the Software Engineering career, however, if you are looking for a long term mentoring or more frequent time-slots from me, I am also available for paid mentoring at https://www.codementor.io/@abhi347

My Mentoring Topics

  • Growing as a Software Engineer
  • Entering in the Software Engineering career
W.
24.February 2023

I had an amazing session with Abhishek! The 45 minutes flew by quickly. Abhishek was patient, listened carefully to my questions, and provided me with excellent guidance and tailored tips based on my experience. He answered all my questions with professionalism and care, and I truly enjoyed speaking with him.

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

Software Engineering at Google - Lessons Learned from Programming Over Time
Titus Winters, Tom Manshreck, Hyrum Wright

Key Insights from the book Culture and Values: Google's unique culture and values have a significant impact on its approach to software engineering. The company's focus on collaboration, long-term thinking, and a data-driven approach significantly influence its software development process. Codebase: Google has a single, unified codebase that allows for increased collaboration and code reuse. This requires a strong emphasis on code quality and consistency. Testing: Google places a high value on automated testing to ensure code quality. Testing is considered an essential part of the development process, not an afterthought. Code Review: Every line of code at Google is reviewed by another engineer before it is committed. This helps to maintain code quality and consistency, and promotes knowledge sharing. Scale: Google operates at an incredible scale, which presents unique challenges and requires innovative solutions. The book provides valuable insights into how Google manages this scale. Tooling: The importance of powerful, flexible tooling in software development is emphasized. Google has developed a range of tools to support its engineers and the software development process. Continuous Integration: Google follows a continuous integration model, where changes are integrated, tested, and deployed frequently. This promotes rapid feedback and allows for quick detection and fixing of issues. Technical Debt: The concept of technical debt and how Google manages it is discussed. Google aims to minimize technical debt by prioritizing clean, maintainable code and refactoring as necessary. Software Life Cycle: The book provides an in-depth look at Google's approach to the software life cycle, from initial design and development, through testing, deployment, maintenance, and eventual decommissioning. Teamwork: The importance of effective teamwork in software engineering is highlighted. Google promotes a collaborative environment where engineers work together to solve problems. An In-Depth Look at "Software Engineering at Google" The book "Software Engineering at Google" provides a comprehensive look at the unique approach to software engineering at one of the world's largest and most innovative technology companies. The book begins by discussing the culture and values at Google, which are a key driving force behind its approach to software engineering. The authors emphasize the culture of collaboration, data-driven decision making, and long-term thinking, which are all crucial in shaping their software development process. One of the most distinguishing aspects of Google's approach is its unified codebase. Unlike many other companies that have separate codebases for different projects or departments, Google has a single codebase that all engineers can access. This allows for increased collaboration, code reuse, and consistency. However, maintaining such a large and unified codebase requires strict adherence to code quality and consistency, which is enforced through rigorous code reviews and automated testing. Testing is an integral part of Google's development process, and the book provides a comprehensive overview of Google's approach to testing. The authors emphasize that testing is not an afterthought, but a fundamental part of the development process that ensures the quality of the code and prevents future issues. Code review is another important aspect of Google's approach. Every line of code that is committed to the codebase is reviewed by another engineer. This not only helps to maintain code quality and consistency, but also promotes knowledge sharing and helps to build a collective understanding of the codebase. The scale at which Google operates also presents unique challenges and requires innovative solutions. The book provides valuable insights into how Google manages the complexities and challenges of operating at such a large scale. From managing technical debt to ensuring code maintainability, the authors discuss the strategies and practices that Google employs to maintain its vast codebase and deliver high-quality software. Tooling is another key aspect highlighted in the book. The authors discuss the importance of powerful, flexible tools in supporting software development. Google has developed a range of tools to support its engineers, from code editors and compilers to continuous integration systems and code review tools. The book also covers Google's approach to continuous integration. Google follows a model where changes are integrated, tested, and deployed frequently. This promotes rapid feedback and allows for quick detection and fixing of issues. In terms of technical debt, the authors shed light on how Google manages it. The company realizes that technical debt can slow down development and make the codebase harder to understand and maintain. As such, Google prioritizes writing clean, maintainable code and frequently refactors its code to minimize technical debt. The software life cycle at Google, as described in the book, covers everything from initial design and development to testing, deployment, maintenance, and eventual decommissioning. The authors share valuable insights and lessons learned from Google's approach to managing the software life cycle. Lastly, the book emphasizes the importance of teamwork in software engineering. Google promotes a collaborative environment where engineers work together to solve problems and learn from each other. This culture of collaboration is integral to Google's success in delivering high-quality software. In conclusion, "Software Engineering at Google" provides a comprehensive, in-depth look at Google's unique approach to software engineering. It offers valuable insights and lessons that can be applied to any software development organization, regardless of size or complexity.

View
Effective Java
Joshua Bloch

Key Insights from Effective Java by Joshua Bloch Preference for static factory methods over constructors: The book asserts the superiority of static factory methods over constructors in class instantiation. Necessity of considering the use of Builder when dealing with many constructors: Bloch highlights the importance of using the Builder pattern when a class has many constructors, for code readability and maintainability. Usage of Singleton pattern: The book discusses the Singleton design pattern and provides guidance on its effective usage. Emphasizes on making classes and members as inaccessible as possible: The author advocates for encapsulation and making class members as private as possible to prevent unwanted side effects. Importance of overriding equals when necessary: The book explains the importance of correctly overriding the equals method and the consequences of not doing so. Avoiding the use of finalizers: The author advises against relying on finalizers for cleanup and suggests alternatives. Prefer interfaces over abstract classes: The book recommends the use of interfaces over abstract classes to facilitate effective decoupling. Usage of Enums instead of int constants: The author suggests the use of Enums instead of integer constants to improve code readability and maintainability. Effective use of Generics: Bloch provides a comprehensive guide on how to effectively use Generics in Java. Concurrent programming: The book provides valuable insights into the challenges of concurrent programming and offers solutions to overcome these challenges. Serialization considerations: The author discusses the pitfalls of serialization and provides guidelines on how to use it correctly. Analysis of Contents and Conclusions "Effective Java" by Joshua Bloch is a comprehensive guide to mastering the Java programming language. The author uses his vast experience to provide insights and best practices that are highly beneficial for both beginners and experienced developers alike. The book starts by emphasizing the preference of static factory methods over constructors. Bloch explains that static factory methods have names, unlike constructors, which can make code more readable. They also don't require creating a new object each time they're invoked, which can improve performance. The Builder pattern is another key concept in the book. When a class has many constructors, it can become confusing and difficult to manage. The Builder pattern solves this problem by allowing the programmer to construct an object in a step-by-step manner, making the code more readable and maintainable. One of the fundamental principles that Bloch stresses upon is making classes and members as inaccessible as possible. In other words, encapsulation is key. This is to ensure that the internal representation of the class is not exposed, preventing unwanted side effects. The book explains the importance of correctly overriding the equals method and the consequences of not doing so. Bloch provides a detailed explanation of how to properly override equals, along with hashCode, to ensure that two logically equivalent objects are indeed considered equal. The author also provides guidance on the effective usage of the Singleton design pattern. Despite its known limitations and criticisms, Bloch demonstrates situations where the Singleton pattern can be beneficial, and how to use it correctly. The book warns against relying on finalizers for cleanup. The author explains that the timing of finalizer execution is uncertain, and they can even lead to performance issues. Instead, Bloch recommends using the try-with-resources statement for reliable and efficient cleanup. Bloch's recommendation of using interfaces over abstract classes is another important insight. By doing so, the code becomes more flexible and classes aren't forced into a rigid hierarchy, thus effectively decoupling the code. The author also suggests the use of Enums instead of integer constants, providing several examples to illustrate the benefits of this approach. Enums improve code readability, provide type safety, and can also be used in switch statements. The book also provides a comprehensive guide on how to effectively use Generics in Java. Bloch explains how Generics provide type safety, eliminate the need for casting, and can improve program clarity and maintainability. The author delves into the challenges of concurrent programming and offers solutions to overcome these challenges. The book provides a detailed discussion on threads, synchronization, and thread safety, which are crucial for writing effective concurrent programs. Finally, the book discusses the pitfalls of serialization and provides guidelines on how to use it correctly. Bloch warns of the many problems associated with serialization, such as security risks and maintenance issues, and gives advice on how to mitigate these risks. In conclusion, "Effective Java" by Joshua Bloch is an essential resource for anyone who wants to master Java. It provides invaluable insights and best practices that can help a programmer write cleaner, more efficient, and more maintainable code.

View
Cosmos
Carl Sagan

Key Facts and Insights The universe is not only vast but also incredibly old, with a history that spans over 13.8 billion years. The cosmos is structured with galaxies, stars, and planets and it is constantly evolving. Life, as we know it, is a product of cosmic evolution and is likely to exist elsewhere in the universe. Human beings, through their intellectual and technological prowess, have the ability to understand and explore the cosmos. Science, particularly astronomy and astrophysics, is the tool that allows us to comprehend the cosmos and our place within it. Historically, human understanding of the cosmos has been shaped by cultural, religious, and philosophical perspectives. Human exploration of the cosmos, through space travel and probes, provides key insights into the nature of the universe. The cosmos is governed by fundamental laws of physics that are universal in nature. Understanding the cosmos has profound implications for our perspective of life, existence, and the future. The future of humanity and the planet is critically linked to our understanding of the cosmos and our ability to harness its resources. An Analysis of Cosmos "Cosmos", written by the renowned astrophysicist Carl Sagan, is a landmark book that explores the vastness and intricacies of the universe. The book, replete with facts and insights, unravels the mysteries of the cosmos and our place within it. The first key insight is the immense age and size of the universe. Our universe, as Sagan explains, spans over 13.8 billion years, a timescale that is almost impossible to comprehend in human terms. The cosmos is also incredibly vast, with galaxies, stars, and planets scattered across its expanse. This vastness and age suggest a cosmos that is constantly evolving, with new stars and galaxies forming and old ones dying out. The second insight is the existence of life in the cosmos. Sagan posits that life, as we know it, is a product of cosmic evolution. The same processes that led to the formation of stars, planets, and galaxies also led to the emergence of life on Earth. This suggests that life is likely to exist elsewhere in the cosmos, a possibility that has profound implications for our understanding of existence. The third insight is the role of human beings in the cosmos. Human beings, through their intellectual and technological prowess, have the ability to understand and explore the cosmos. This ability is manifested in the scientific disciplines of astronomy and astrophysics, which provide us with the tools to comprehend the cosmos. Historically, our understanding of the cosmos has been shaped by cultural, religious, and philosophical perspectives. Sagan delves into this history, highlighting how different societies have interpreted the cosmos and our place within it. This historical perspective underscores the evolution of human thought and the role of science in advancing our understanding of the cosmos. The book also underscores the importance of space exploration. Probes and spacecrafts, sent to the farthest corners of the solar system, provide us with valuable data about the nature of the universe. These missions represent the pinnacle of human technological achievement and are a testament to our thirst for knowledge. A key point that Sagan emphasizes is the universality of the laws of physics. These laws govern the cosmos, from the minutest particles to the largest galaxies. Understanding these laws provides us with a framework to decipher the cosmos and its workings. Finally, Sagan underscores the implications of our understanding of the cosmos. An understanding of the cosmos changes our perspective of life, existence, and the future. It also underscores the critical link between the future of humanity, the planet, and our understanding of the cosmos. In Sagan's view, harnessing the resources of the cosmos could be the key to ensuring the survival of our species. In conclusion, "Cosmos" is a profound exploration of the universe and our place within it. Sagan, through his lucid prose and deep insights, provides us with a comprehensive understanding of the cosmos. The book is not just a scientific treatise but also a philosophical meditation on life, existence, and the future. It is a testament to the power of human curiosity and our relentless pursuit of knowledge. As such, it is a must-read for anyone interested in understanding the universe and our place within it.

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
Architecting for Scale - How to Maintain High Availability and Manage Risk in the Cloud
Lee Atchison

Key Facts and Insights from the Book Understanding the Scale Cube: The book introduces the concept of a scale cube. It's a three-dimensional model that explains the different ways an application can be scaled: X, Y, and Z axis scaling. Importance of Microservices: The book emphasizes the importance of breaking down a monolithic application into microservices to ensure high availability and scalability. Dealing with Failure: The author stresses that failure is inevitable in any system, and the key is designing systems that can handle failure gracefully. Application Monitoring: Monitoring is critical for understanding the behaviour of an application and diagnosing problems. The book explores various tools and techniques for effective monitoring. Managing Risk: The book provides guidance on how to manage risks in a distributed system, including recommendations on how to deal with common risks and threats. Data Management: The author discusses the challenges of managing data in a distributed system, including data consistency and data partitioning. Availability vs Consistency: The book discusses the CAP theorem and the trade-off between availability and consistency in a distributed system. Scalability Patterns: The book explores various patterns for scaling applications, including caching, database sharding, and queueing. DevOps Culture: The author emphasizes the importance of a DevOps culture in managing and scaling applications effectively. SLA and SLOs: The book discusses the importance of defining clear Service Level Agreements (SLA) and Service Level Objectives (SLO) to ensure high availability. An In-depth Analysis of the Book The book "Architecting for Scale" by Lee Atchison provides a comprehensive guide on how to architect applications for high availability and manage risk in the cloud. It provides detailed insights and practical advice based on the author's vast experience working in the field. The scale cube introduced in the book is a handy model for understanding and planning scalability. On the X-axis, it involves duplicating the entire application, which is a simple but limited approach. The Y-axis involves splitting the application based on services or functions, also known as microservices. The Z-axis involves splitting the data, often referred to as sharding. The book lays significant emphasis on the role of microservices in achieving scale. The author argues that breaking down a monolithic application into microservices not only improves scalability but also increases the resilience of the system. This is because failures can be isolated to individual services, preventing them from bringing down the entire system. However, the author also warns that failing to handle failures gracefully can lead to cascading failures that can bring down the entire system. Therefore, it's essential to design systems that can tolerate and recover from failures. The author provides various techniques for achieving this, including circuit breakers and bulkheads. Application monitoring is another theme that runs throughout the book. The author argues that without proper monitoring, it's impossible to understand the behaviour of an application or diagnose problems. The book explores various tools and techniques for effective monitoring, including distributed tracing and log aggregation. The book also provides guidance on how to manage risk in a distributed system. It discusses common risks and threats and provides recommendations on how to deal with them. The author also stresses the importance of a DevOps culture in managing and scaling applications effectively. This involves fostering a culture of collaboration between developers and operations, encouraging automation, and promoting a mindset of continuous improvement. The book also delves into the challenges of managing data in a distributed system, including data consistency and data partitioning. Furthermore, it discusses the CAP theorem and the trade-off between availability and consistency in a distributed system. The book also explores various patterns for scaling applications, including caching, database sharding, and queueing. It also discusses the importance of defining clear Service Level Agreements (SLA) and Service Level Objectives (SLO) to ensure high availability. In conclusion, "Architecting for Scale" is a treasure trove of knowledge for anyone involved in designing, developing, or managing distributed systems. It provides a comprehensive guide on how to architect applications for high availability and manage risk in the cloud. The insights and advice provided in the book are invaluable and can be applied to a wide range of scenarios.

View