{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Bookshelf",
    "_rss_description": "A blog by George Mishurovsky — a senior software engineer with a medical degree. Drawing from both engineering and scientific thinking, he explores software, architecture, design, psychology, and product thinking.",
    "_rss_language": "en",
    "_itunes_email": "george@mishurovsky.com",
    "_itunes_categories_xml": "",
    "_itunes_image": "https:\/\/mishurovsky.com\/blog\/pictures\/userpic\/userpic-square@2x.jpg?1753619610",
    "_itunes_explicit": "no",
    "home_page_url": "https:\/\/mishurovsky.com\/blog\/?go=tags\/bookshelf\/",
    "feed_url": "https:\/\/mishurovsky.com\/blog\/?go=tags%2Fbookshelf%2Fjson%2F",
    "icon": "https:\/\/mishurovsky.com\/blog\/pictures\/userpic\/userpic@2x.jpg?1753619610",
    "authors": [
        {
            "name": "George Mishurovsky",
            "url": "https:\/\/mishurovsky.com\/blog\/",
            "avatar": "https:\/\/mishurovsky.com\/blog\/pictures\/userpic\/userpic@2x.jpg?1753619610"
        }
    ],
    "items": [
        {
            "id": "54",
            "url": "https:\/\/mishurovsky.com\/blog\/?go=all\/bookshelf-update-september-2026\/",
            "title": "Bookshelf update — September 2026",
            "content_html": "<p>I haven’t updated my book list for half a year. So, here is what I’ve read recently and can recommend — there are some gems in the list.<\/p>\n<h3>1. Unit Testing Principles, Practices, and Patterns — V. Khorikov<\/h3>\n<p>Of all the titles in the list, this impresses me the most. Despite the name, it covers all types of automated behavioural tests: unit, integration, and end-to-end. It changed my approach to code organization and my view of which tests deserve a place in a codebase. The book is also helpful in today’s drift towards agentic coding, guided by spec-driven development and TDD.<br \/>\n<a href=\"https:\/\/www.oreilly.com\/library\/view\/unit-testing-principles\/9781617296277\/\">Link to the book<\/a><\/p>\n<h3>2. Fundamentals of Software Architecture — N. Ford<\/h3>\n<p>Software engineering is often described as a craft. One reason is the many decisions developers make based on what they once saw, heard, or practiced. I believe that proficiency comes with awareness of all possible tools. Awareness turns choices into deliberate informed decisions. This book explains software architecture methodology and provides the starting set of tools for architects.<br \/>\n<a href=\"https:\/\/www.oreilly.com\/library\/view\/fundamentals-of-software\/9781492043447\/\">Link to the book<\/a><\/p>\n<h3>3. C# 12 in a Nutshell — J. Albahari<\/h3>\n<p>A great source for exhaustive knowledge of C#. It reads better than I could expect from a book focused on details of a complex language. Still took me more than a month to complete. Again, awareness of internal functioning and available options leads to elegant solutions, efficient and maintainable code. Definitely a must read for senior-level C# developers. I also tried ‘Pro C#’ by A. W. Troelsen, but its 1600 pages found my head to be too small for comfortable living.<br \/>\n<a href=\"https:\/\/www.oreilly.com\/library\/view\/c-12-in\/9781098147433\/\">Link to the book<\/a><\/p>\n<h3>4. ASP.NET Core in Action — A. Lock<\/h3>\n<p>This book is much harder to read than the previous one. It is not supposed to be read from start to end — and I had to shortcut my reading process and skip some sections. For those starting with ASP.NET, selective reading provides a good explanation of how things work and many code snippets ready for use as starting points.<br \/>\n<a href=\"https:\/\/www.manning.com\/books\/asp-net-core-in-action-third-edition\/\">Link to the book<\/a><\/p>\n<h3>5. Accelerate — N. Forsgren<\/h3>\n<p>My science-inclined heart fills with joy when I see a properly designed longitudinal study with a powerful sample size in the tech industry. The study is a solid justification of DevOps practices in software development. A logical relation is the one between software delivery performance and performance-focused organizational culture. The interesting part is that implementation of DevOps is highly likely to transform the culture as well, despite the latter is a much broader concept.<br \/>\n<a href=\"https:\/\/www.oreilly.com\/library\/view\/accelerate\/9781457191435\/\">Link to the book<\/a><\/p>\n<h3>6. On Writing Well — W. Zinsser<\/h3>\n<p>Clarity of writing means clarity of thought. This book does not provide exact writing instructions, but enables freedom and desire for writing — in any style, about any subject. It is a relaxing, slow, and amusing read, breaking the line of a tech reading list. Although it put my vocabulary to work: many words come from non-fiction world of American literature, which I rarely encounter in technical media.<br \/>\n<a href=\"https:\/\/www.goodreads.com\/book\/show\/53343.On_Writing_Well\">Link to the book<\/a><\/p>\n",
            "date_published": "2026-09-10T14:10:52+02:00",
            "date_modified": "2026-09-11T09:59:43+02:00",
            "tags": [
                "book review",
                "bookshelf",
                "C#",
                "devops",
                "testing"
            ],
            "image": "https:\/\/mishurovsky.com\/blog\/pictures\/bookshelf-update-sep-26@2x.jpg",
            "_date_published_rfc2822": "Thu, 10 Sep 2026 14:10:52 +0200",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "54",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/mishurovsky.com\/blog\/pictures\/bookshelf-update-sep-26@2x.jpg"
                ]
            }
        },
        {
            "id": "35",
            "url": "https:\/\/mishurovsky.com\/blog\/?go=all\/book-review-data-pipelines-pocket-reference-james-densmore\/",
            "title": "Book review: “Data Pipelines Pocket Reference”, James Densmore",
            "content_html": "<div class=\"e2-text-picture\">\n<a href=\"https:\/\/www.oreilly.com\/library\/view\/data-pipelines-pocket\/9781492087823\/\" class=\"e2-text-picture-link\">\n<img src=\"https:\/\/mishurovsky.com\/blog\/pictures\/data-pipelines-pocket-reference@2x.png\" width=\"542\" height=\"891\" alt=\"\" \/>\n<\/a><\/div>\n<p>Software engineering is all about manipulating data. A big portion of software engineer’s attention is drawn to collection data from users and presenting it back to them in a useful form. However, there is another side of data — the kind that is not produced by software users but only consumed by them. Here, we aim for the goals of achieving a single source of truth, data validity and availability, and enabling performant processing (for analysis or presentation).<\/p>\n<p>To get a better grasp of the tooling for working with such data, this week I read <i>Data Pipelines Pocket Reference<\/i> by James Densmore. The book focuses on the modern ELT (Extract-Load-Transform) approach, as well as EtLT (with ‘t’ for generic non-business-related data transformation).<\/p>\n<p>It turned out to be a very practical pocket guide indeed. Each section of the book dedicated to data extraction, loading, and transformation is supplied with clear code snippets in Python.  The snippets demonstrate means to connect to essential services, such as databases, AWS S3, Amazon Redshift, Snowflake, Apache Airflow, as well as basics of data manipulation.<\/p>\n<p>I liked two things. First, these snippets feel production-ready. Surely, they feature no robust logic, but they are sufficient to start moving data around, running validations and applying transformations. Second, the author not only focuses on interaction with services, but<br \/>\nalso provides some tricks of data processing and validation. In particular, there is a neat data testing framework based on separate Python scripts for each check, which can be integrated into Airflow workflows. The approach, while being quite lean, requires a certain mindset to arrive at, so this bit of knowledge was one of the things that saves time and builds a scalable data processing foundation.<\/p>\n<p>That said, I think this book lacks example that are closer to real practice. It would benefit from a companion GitHub repository with a substantial dataset to run ELT against, in addition to the primitive data samples from the book which take no more than 10 rows and 5 columns in a single SQL table. The book also misses any in-depth discussions, making it a pocket reference, indeed.<\/p>\n<p><b>What it covers:<\/b><\/p>\n<ul>\n<li>Data roles: data engineering, data analytics, and data science<\/li>\n<li>Types of pipelines: ETL vs. ELT vs. EtLT<\/li>\n<li>Overview of tools for each ELT step and their orchestration<\/li>\n<li>Minimal instructions for setting up data ingestion and transformation<\/li>\n<li>Approaches to pipeline orchestration<\/li>\n<li>A framework for data validation<\/li>\n<li>Building pipelines with monitoring and maintenance in mind<\/li>\n<\/ul>\n<p><b>Verdict: 4 \/ 5 — a good reference to start building simple ELT pipelines in a day, which is likely exactly what a general software engineer would want if data engineering is not their primary area of specialization<\/b><\/p>\n",
            "date_published": "2026-01-28T12:21:58+02:00",
            "date_modified": "2026-01-28T12:15:38+02:00",
            "tags": [
                "book review",
                "bookshelf",
                "data engineering",
                "ELT",
                "pipelines",
                "Python",
                "SQL"
            ],
            "image": "https:\/\/mishurovsky.com\/blog\/pictures\/data-pipelines-pocket-reference@2x.png",
            "_date_published_rfc2822": "Wed, 28 Jan 2026 12:21:58 +0200",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "35",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/mishurovsky.com\/blog\/pictures\/data-pipelines-pocket-reference@2x.png"
                ]
            }
        },
        {
            "id": "32",
            "url": "https:\/\/mishurovsky.com\/blog\/?go=all\/book-review-web-scraping-with-python-ryan-mitchell\/",
            "title": "Book review: “Web Scraping with Python”, Ryan Mitchell",
            "content_html": "<div class=\"e2-text-picture\">\n<a href=\"https:\/\/www.oreilly.com\/library\/view\/web-scraping-with\/9781098145347\/\" class=\"e2-text-picture-link\">\n<img src=\"https:\/\/mishurovsky.com\/blog\/pictures\/web-scraping-with-python@2x.jpg\" width=\"381\" height=\"500\" alt=\"\" \/>\n<\/a><\/div>\n<p>Recently I faced a challenge of designing a web crawling and scraping system. To build context, I started my work by reading <i>Web Scraping with Python: Data Extraction for the Modern Web<\/i> by Ryan Mitchell (3rd edition, revised in 2024).<\/p>\n<p>The book turned out to be a very pleasant read. The author’s approach is well structured with chapters going from simple practical tasks and legal overview to advanced considerations such as Natural Language Processing and race conditions in distributed scraping systems. Code snippets are concise and useful — I can imagine them being used in a small scale production system. In two days, I managed to build a solid understanding of common approaches, architectures, problems, and solutions in this field.<\/p>\n<p>That said, the content is not without its flaws. The section on JavaScript and SSR section is so outdated it is almost hilarious. Mentions of Dynamic HTML, jQuery and AJAX calls are appropriate for a book written around 2010, but not for a revised version from 2024. Nonetheless, even this section is useful at a conceptual level: modern SPAs achieve the same goals as early 2000s web applications that generated dynamic HTML server-side and sent it to browsers.<\/p>\n<p>The ease with which I read this book was strongly influenced by my existing knowledge of the web. Over the years, I have built a solid foundation in HTML and CSS, JavaScript and Python, APIs, application architecture, and networking — all of which helped me clearly see the connections between the author’s ideas. However, the book should still be accessible to any technical reader, thanks to its clear explanations and practical code examples.<\/p>\n<p><b>What it covers:<\/b><\/p>\n<ul>\n<li>Principles of web technologies<\/li>\n<li>Legal and ethical considerations<\/li>\n<li>Common scraping use cases<\/li>\n<li>Building web crawlers and scrapers<\/li>\n<li>Crawling strategies<\/li>\n<li>Transformation and validation of collected data<\/li>\n<li>Parsing text and image documents<\/li>\n<li>Scraping traps<\/li>\n<li>Distributed scraping systems<\/li>\n<\/ul>\n<p><b>Verdict: 4.5 \/ 5 — a go-to practical guide for those planning to build their own scraping system.<\/b><\/p>\n",
            "date_published": "2026-01-22T16:56:17+02:00",
            "date_modified": "2026-01-22T16:51:02+02:00",
            "tags": [
                "book review",
                "bookshelf",
                "Python",
                "scraping"
            ],
            "image": "https:\/\/mishurovsky.com\/blog\/pictures\/web-scraping-with-python@2x.jpg",
            "_date_published_rfc2822": "Thu, 22 Jan 2026 16:56:17 +0200",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "32",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/mishurovsky.com\/blog\/pictures\/web-scraping-with-python@2x.jpg"
                ]
            }
        },
        {
            "id": "19",
            "url": "https:\/\/mishurovsky.com\/blog\/?go=all\/reading-list\/",
            "title": "📚 Bookshelf",
            "content_html": "<p>Below is a list of books I’ve finished — and those I plan to read. I will update it from time to time. Welcome!<\/p>\n<p>Feel free to join comments for this post and in linked book reviews. What do you think? Which books transformed your knowledge and approaches in software development?<\/p>\n<p><i>Titles within categories follow in alphabetical order. Updated Sep 2026.<\/i><\/p>\n<h2>Finished<\/h2>\n<h3>Software Architecture<\/h3>\n<ul>\n<li>Designing Data-Intensive Applications — M. Kleppmann ⭐️<\/li>\n<li>Fundamentals of Software Architecture — N. Ford ⭐️<\/li>\n<\/ul>\n<h3>Management & Communication<\/h3>\n<ul>\n<li>Fundamentals of Project Management — J. Heagney<\/li>\n<li>Getting Real — D. H. Hansson<\/li>\n<li>Nonviolent Communication — M. Rosenberg ⭐️<\/li>\n<li>On Writing Well — W. Zinsser<\/li>\n<li>Start with No — J. Camp ⭐️<\/li>\n<li>The Elements of Style — E. B. White<\/li>\n<\/ul>\n<h3>Object-Oriented Programming<\/h3>\n<ul>\n<li>ASP.NET Core in Action — A. Lock<\/li>\n<li>C# in a Nutshell — J. Albahari ⭐️<\/li>\n<li>Design Patterns — E. Gamma<\/li>\n<li>Effective TypeScript — D. Vanderkam<\/li>\n<li>Node.js Design Patterns — M. Casciaro<\/li>\n<li>Patterns of Enterprise Application Architecture — M. Fowler ⭐️<\/li>\n<li>Refactoring — M. Fowler<\/li>\n<li>The Object Oriented Way — C. Okhravi <a href=\"https:\/\/mishurovsky.com\/blog\/all\/book-review-the-object-oriented-way-christopher-okhravi\/\">(Review)<\/a><\/li>\n<li>Unit Testing Principles, Practices, and Patterns — V. Khorikov ⭐️<\/li>\n<\/ul>\n<h3>Functional Programming<\/h3>\n<ul>\n<li>Domain Modeling Made Functional — S. Wlaschin<\/li>\n<li>Professor Fisby’s Mostly Adequate Guide to Functional Programming — B. Lonsdorf<\/li>\n<li>Purely Functional Data Structures — C. Okasaki<\/li>\n<\/ul>\n<h3>DevOps & Cloud<\/h3>\n<ul>\n<li>Accelerate — N. Forsgren<\/li>\n<li>AI Engineering — C. Huyen<\/li>\n<li>Continuous Delivery — D. Farley<\/li>\n<li>Continuous Integration — P. M. Duvall<\/li>\n<\/ul>\n<h3>Data Science<\/h3>\n<ul>\n<li>Data Pipelines Pocket Reference — J. Densmore <a href=\"https:\/\/mishurovsky.com\/blog\/all\/book-review-data-pipelines-pocket-reference-james-densmore\/\">(Review)<\/a><\/li>\n<li>Learning SQL — A. Beaulieu ⭐️<\/li>\n<li>Web Scraping with Python — Ryan Mitchell <a href=\"https:\/\/mishurovsky.com\/blog\/all\/book-review-web-scraping-with-python-ryan-mitchell\/\">(Review)<\/a><\/li>\n<\/ul>\n<h3>Graphic Design<\/h3>\n<ul>\n<li>Grid Systems in Graphic Design — J. Müller-Brockmann<\/li>\n<li>Practical UI — A. Dannaway<\/li>\n<li>Refactoring UI — A. Wathan<\/li>\n<li>The Elements of Color — J. Itten ⭐️<\/li>\n<\/ul>\n<h3>Basics<\/h3>\n<ul>\n<li>Clean Architecture — R. C. Martin<\/li>\n<li>Clean Code — R. C. Martin<\/li>\n<li>Code Complete — S. McConnell<\/li>\n<li>Domain-Driven Design — E. Evans ⭐️<\/li>\n<li>Introduction to Algorithms — T. Cormen<\/li>\n<\/ul>\n<h2>In-Progress<\/h2>\n<ul>\n<li>Continuous Deployment — V. Servile<\/li>\n<li>Systems Engineering Principles and Practice — A. Kossiakoff<\/li>\n<\/ul>\n<h2>Waiting In the Shelf<\/h2>\n<ul>\n<li>Building Microservices — S. Newman<\/li>\n<li>Dependency Injection Principles, Practices, and Patterns — S. Van Deursen<\/li>\n<li>Grokking Simplicity — E. Normand<\/li>\n<li>Philosophy of Software Design — J. Ousterhout<\/li>\n<li>Software Architecture: the Hard Parts — N. Ford<\/li>\n<li>Structure and Interpretation of Computer Programs — H. Abelson<\/li>\n<li>Stylish F# — K. Eason<\/li>\n<li>Team Topologies — M. Skelton<\/li>\n<li>The Anatomy of Story — J. Truby<\/li>\n<li>The Art of PostgreSQL — D. Fontaine<\/li>\n<li>The Linux Command Line — W. Shotts<\/li>\n<li>Thinking with Type — E. Lupton<\/li>\n<\/ul>\n",
            "date_published": "2025-10-28T13:39:16+02:00",
            "date_modified": "2026-09-11T09:51:14+02:00",
            "tags": [
                "bookshelf"
            ],
            "image": "https:\/\/mishurovsky.com\/blog\/pictures\/bookshelf@2x.jpg",
            "_date_published_rfc2822": "Tue, 28 Oct 2025 13:39:16 +0200",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "19",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": true,
                "links_required": [],
                "og_images": [
                    "https:\/\/mishurovsky.com\/blog\/pictures\/bookshelf@2x.jpg"
                ]
            }
        },
        {
            "id": "13",
            "url": "https:\/\/mishurovsky.com\/blog\/?go=all\/book-review-the-object-oriented-way-christopher-okhravi\/",
            "title": "Book review: “The Object Oriented Way”, Christopher Okhravi",
            "content_html": "<div class=\"e2-text-picture\">\n<a href=\"https:\/\/leanpub.com\/the-object-oriented-way\/\" class=\"e2-text-picture-link\">\n<img src=\"https:\/\/mishurovsky.com\/blog\/pictures\/the-object-oriented-way@2x.png\" width=\"320\" height=\"414\" alt=\"\" \/>\n<\/a><\/div>\n<p>Last week I finished reading “The Object Oriented Way” by Christopher Okhravi. I was attracted to this book with occasional posts by the author on Youtube where he was discussing complex and interesting topics of OOP. His dives into use cases for composition vs. inheritance, composition patterns, and dependency inversion finally convinced me to buy a full copy. I was not disappointed!<\/p>\n<p>This book is like a Bible of OOP. It starts from the very foundational topics like syntax, declaration vs. assignment vs. initialization, number types, variable mutability and so on – written in a concise yet exhaustive manner.<\/p>\n<p>The story develops with detailed discussion of all the tools used in C# OOP, each chapter more advanced than the previous one. It culminates with very interesting discourse of Liskov Substitution Principle: covariance, contravariance, invariance, and the limitations C# has regarding pure logical object-oriented compatibility.<\/p>\n<p>The ending was somewhat unexpected. For me it turned a textbook into a wonderfully written story, with a narration gradually building cognitive tension towards beautiful complexity and then resolution with a new state, a level above the starting point. I will not spoil any details, though :)<\/p>\n<p><b>Whom this book is going to be useful:<\/b><\/p>\n<ul>\n<li>anybody who wants to learn C#<\/li>\n<li>junior devs to build a solid understanding of OOP toolchain<\/li>\n<li>middle-to-senior devs to fill in the gaps in OOP theory<\/li>\n<li>staff devs and above to master arguments for or against object-oriented approach in a particular module<\/li>\n<\/ul>\n<p><b>Verdict: 4.5 \/ 5 – essential.<\/b><br \/>\nConsider buying the full book. It is a worthy investment for most of OOP practitioners.<\/p>\n<p><i>I personally would love to see more detailed UML diagram section. They can be quite complex, and it would be cool to have a complete material on how to write expressive diagrams when planning OOP architecture.<\/i><\/p>\n",
            "date_published": "2025-09-22T15:53:41+02:00",
            "date_modified": "2025-09-22T15:53:09+02:00",
            "tags": [
                "bookshelf",
                "C#",
                "OOP"
            ],
            "image": "https:\/\/mishurovsky.com\/blog\/pictures\/the-object-oriented-way@2x.png",
            "_date_published_rfc2822": "Mon, 22 Sep 2025 15:53:41 +0200",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "13",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/mishurovsky.com\/blog\/pictures\/the-object-oriented-way@2x.png"
                ]
            }
        }
    ],
    "_e2_version": 4134,
    "_e2_ua_string": "Aegea 11.3 (v4134e)"
}