<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://dtjldamien.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://dtjldamien.github.io/" rel="alternate" type="text/html" /><updated>2025-03-18T21:28:06+08:00</updated><id>https://dtjldamien.github.io/feed.xml</id><title type="html">Damien Tan</title><subtitle>Damien Tan</subtitle><author><name>Damien Tan</name></author><entry><title type="html">The Pragmatic Programmer</title><link href="https://dtjldamien.github.io/blog/the-pragmatic-programmer/" rel="alternate" type="text/html" title="The Pragmatic Programmer" /><published>2023-12-27T01:00:00+08:00</published><updated>2023-12-27T01:00:00+08:00</updated><id>https://dtjldamien.github.io/blog/the-pragmatic-programmer</id><content type="html" xml:base="https://dtjldamien.github.io/blog/the-pragmatic-programmer/"><![CDATA[<p>This book by David Thomas and Andrew Hunt covers both technical and practical advice to new programmers to help them hone their craft.</p>
<p>My favourite chapter of the book was on <strong>A Pragmatic Approach</strong> which covers the importance of good design and what what it means. We should adapt to the context and the people that we are working with, instead of blindly following concepts or principles. Simply by following the Easier to Change principle as a value, we can make better decisions when designing a system. The section on <code>Tracer Bullets</code> shows how we can write code to validate and verify assumptions or concerns as to how code should behave. It helps new features or projects progress faster and provides the ability to demonstrate progress to stakeholders.</p>
<p>The authors also cover how we should have a healthy amount of <strong>Pragmatic Paranoia</strong> because we can never write perfect software. We have all made mistakes in the past in our code, causing incidents that inconveniences others. We should take defensive measures to prevent these mistakes from happening, we should not trust anyone, including ourselves.</p>
<p>The book is also littered with tips, such as <code>Finish What You Start</code>, to always deallocate resources when you allocate them. Your code shown always clean up after itself whenever possible. Important principles such as <code>Principle of Least Privileged</code> are discussed to make good design decisions.</p>
<p>The book ends with the responsibility of a programmer to ask whether we are doing the right thing - to protect the user and would you use this yourself. We should always be learning and improving ourselves, to be a better programmer.</p>]]></content><author><name>Damien Tan</name></author><category term="blog" /><category term="book-review" /><summary type="html"><![CDATA[This book by David Thomas and Andrew Hunt covers both technical and practical advice to new programmers to help them hone their craft.]]></summary></entry><entry><title type="html">Refactoring</title><link href="https://dtjldamien.github.io/blog/refactoring/" rel="alternate" type="text/html" title="Refactoring" /><published>2023-10-27T01:00:00+08:00</published><updated>2023-10-27T01:00:00+08:00</updated><id>https://dtjldamien.github.io/blog/refactoring</id><content type="html" xml:base="https://dtjldamien.github.io/blog/refactoring/"><![CDATA[<p>It is common to work on brownfield projects where the codebase is messy and difficult to work with. This book by Martin Fowler covers the process of refactoring and how to improve the design of existing code.</p>
<p>The book is driven by examples to illustrate the process of refactoring. It covers the common code smells and how to identify them - duplicated code, long function, long parameter list, global or mutable data or loops. The author suggests that we should write test suites before refactoring, to drive effectiveness and avoiding mistakes.</p>
<p>The common refacotrings include changing function declarations, encapsulation, extracting code, removing dead code, renaming fields or variables, replacing inline code with function calls, nested conditionals with guard clauses.</p>
<p>I would recommend this book to programmers who want to write understandable and maintainable code to help them be more effective when working in a team.</p>]]></content><author><name>Damien Tan</name></author><category term="blog" /><category term="book-review" /><summary type="html"><![CDATA[It is common to work on brownfield projects where the codebase is messy and difficult to work with. This book by Martin Fowler covers the process of refactoring and how to improve the design of existing code.]]></summary></entry><entry><title type="html">Clean Architecture</title><link href="https://dtjldamien.github.io/blog/clean-architecture/" rel="alternate" type="text/html" title="Clean Architecture" /><published>2023-07-31T01:00:00+08:00</published><updated>2023-07-31T01:00:00+08:00</updated><id>https://dtjldamien.github.io/blog/clean-architecture</id><content type="html" xml:base="https://dtjldamien.github.io/blog/clean-architecture/"><![CDATA[<p>This book is part of a series by Robert C. Martin. It covers the principles and practices of how we can structure our code to be clean and maintainable. A good system should minimize effort and maximize productivity for the team.</p>
<p>The book covers the design principles and how to apply them to components of a system. They include the Single Responsibility Principle, Open-Closed Principle, Liskov Substitution Principle, Interface Segregation Principle, Dependency Inversion Principle, and the Dependency Rule. The author also covered the SOLID principles and how they can be applied to design a system.</p>
<p>The author also spends a section of the book covering software components and how they can be used to structure a system. They are used to ensure component cohesion in the system - Reuse/Release Equivalence Principle, Common Closure Principle, and the Common Reuse Principle. The author also covered the Acyclic Dependencies Principle and the Stable Dependencies Principle which are used to ensure component coupling in the system.</p>
<p>My favourite was <code>The Missing Chapter by Simon Brown</code> which compares the decisions and tradeoffs made. It was interesting to see how the different architectures can be applied to the same problem.</p>]]></content><author><name>Damien Tan</name></author><category term="blog" /><category term="book-review" /><summary type="html"><![CDATA[This book is part of a series by Robert C. Martin. It covers the principles and practices of how we can structure our code to be clean and maintainable. A good system should minimize effort and maximize productivity for the team.]]></summary></entry><entry><title type="html">Grokking Algorithms</title><link href="https://dtjldamien.github.io/blog/grokking-algorithms/" rel="alternate" type="text/html" title="Grokking Algorithms" /><published>2023-05-10T01:00:00+08:00</published><updated>2023-05-10T01:00:00+08:00</updated><id>https://dtjldamien.github.io/blog/grokking-algorithms</id><content type="html" xml:base="https://dtjldamien.github.io/blog/grokking-algorithms/"><![CDATA[<p>This is an illustrated book with examples and exercises to help you understand how algorithms work. It serves as a good bridge for non-CS students and a refresher for CS students.</p>
<p>It covers the common and basic algorithms such as binary search, selection sort, BFS, DFS, Dijkstra's algorithm, greedy algorithms, dynamic programming and K-nearest neighbours. The book also covers data structures such as arrays, linked lists, hash tables, trees, heaps and graphs.</p>
<p>I especially liked the chapter on dynamic programming as it is a topic that I have always struggled with. The author provided a good explanation of how to approach dynamic programming problems and how to break them down into smaller sub-problems. The author also provided a good explanation of how to use memoization to improve the performance of dynamic programming algorithms.</p>
<p>I would recommend this book to visual learners who want to understand how algorithms work, along with the examples and exercises. The examples are available in Python here: <a href="grokking_algorithms">https://github.com/egonSchiele/grokking_algorithms</a>.</p>]]></content><author><name>Damien Tan</name></author><category term="blog" /><category term="book-review" /><summary type="html"><![CDATA[This is an illustrated book with examples and exercises to help you understand how algorithms work. It serves as a good bridge for non-CS students and a refresher for CS students.]]></summary></entry><entry><title type="html">System Design Interview</title><link href="https://dtjldamien.github.io/blog/system-design-interview-review/" rel="alternate" type="text/html" title="System Design Interview" /><published>2022-06-28T01:00:00+08:00</published><updated>2022-06-28T01:00:00+08:00</updated><id>https://dtjldamien.github.io/blog/system-design-interview-review</id><content type="html" xml:base="https://dtjldamien.github.io/blog/system-design-interview-review/"><![CDATA[<p>A highly recommended book by Alex Xu which goes through system design interview questions. The book is a good introduction to system design which is an area I do not have much experience with as a junior.</p>
<p>The book goes through the steps of a system design interview and provides a good overview of the different types of interviews. The first step is to <em><strong>understand the problem and establish design scope</strong></em>. A common pitfall is when you misunderstand the problem and do not clarify the scope before attempting to design the system. It is often more important to show how you think and ask questions before starting on anything.</p>
<p>The second step is <em><strong>propose high level design and get buy in</strong></em>. The idea is to collaborate with the interviewer when coming up with the approach. This helps to obtain feedback and change any flawed ideas or perceptions early on.</p>
<p>The third step is to do a <em><strong>design deep dive</strong></em>. This is when you go into the details of what to use and how to use them. It is also good to talk about the algorithms or functions required for an optimal solution.</p>
<p>The last step is to <em><strong>wrap up</strong></em> the interview. This is done by discussing potential pain points and limitations of the system. There might also be some error cases that the system needs to handle or how to further scale the system.</p>
<p>The author also went through basics such as CDN and caching which are important to understand when designing a system. It is important to understand how the various technologies work in order to design an optimal system. Which is why it is important to read up and keep up to date. A good resource is <a href="https://diff.blog/">diff.blog</a> which helps to aggregate blog posts from the community.</p>
<p>All in all, it was an interesting read and the author provided many interesting examples and references to industry practices that you can read up in your own time. I would recommend this book to anyone who is interested in learning the considerations when it comes to designing a system or preparing for interviews.</p>]]></content><author><name>Damien Tan</name></author><category term="blog" /><category term="book-review" /><summary type="html"><![CDATA[A highly recommended book by Alex Xu which goes through system design interview questions. The book is a good introduction to system design which is an area I do not have much experience with as a junior.]]></summary></entry><entry><title type="html">Clean Code</title><link href="https://dtjldamien.github.io/blog/clean-code-review/" rel="alternate" type="text/html" title="Clean Code" /><published>2022-05-13T01:00:00+08:00</published><updated>2022-05-13T01:00:00+08:00</updated><id>https://dtjldamien.github.io/blog/clean-code-review</id><content type="html" xml:base="https://dtjldamien.github.io/blog/clean-code-review/"><![CDATA[<p>As I start out my journey as a developer, I am always looking for ways to improve my craft. Clean Code by Robert C. Martin is a book that was recommended by many for junior developers.</p>
<p>Uncle Bob covered several concepts relating to OOP, design patterns, and code standards for naming, commenting, and testing. Concepts like DRY and SRP were often repeated throughout the book and used Java code to demonstrate them. Certain concepts were Java specific and I briefly browsed through them since I am not working on Java projects but they were still interesting.</p>
<p>The book is a good read to start off this journey with, and it reminded me of the mistakes I made when I was learning to code. I honestly would cringe if I still have access to the files that I wrote for my first year at NUS.</p>
<p>As best practices and approaches towards maintaining code bases come and go, we should strive to <em><strong>Try and leave this world a little better than you found it</strong></em>. The code that we write should be clean and easy to read, for others and especially our future selves to understand and maintain. It is not just about writing code that works, but also well designed and easy to understand.</p>
<p>It will take me time to develop better code sense and intuition as I learn to become a better developer. The points brought up in &quot;Smells and Heuristics&quot; outlined many points that I often find myself not doing. Let's see if I can learn and work on it. We now have many tools to help us with this, such as linters like RuboCop and ESLint.</p>
<p>Overall it was a good read. I would recommend it to anyone who is interested in learning to improve their coding style. The most of the concepts discussed are language agnostic and I foresee it being applicable even years from now.</p>]]></content><author><name>Damien Tan</name></author><category term="blog" /><category term="book-review" /><summary type="html"><![CDATA[As I start out my journey as a developer, I am always looking for ways to improve my craft. Clean Code by Robert C. Martin is a book that was recommended by many for junior developers.]]></summary></entry></feed>