Skip to content

Latest commit

 

History

History
829 lines (616 loc) · 61.3 KB

23-sources.md

File metadata and controls

829 lines (616 loc) · 61.3 KB

Sources and References

My opinion of modern development and good code has been influenced by other people's work. In this appendix, I have prepared a list of books, articles, talks, methodologies, and studies that I find most useful and refer to in my own work.

Each section in this list has a title similar to the chapter topics. If you are interested in the topic of a particular chapter and want to know more, the sections in the list will help you navigate more easily among the links.

The links can repeat. I decided it was more important to compile a complete list for each topic than to get rid of duplicates. I hope you find this useful.

Notion of Refactoring and Code Quality

What refactoring is and why it is needed. What an uncontrollably increasing complexity of a project can lead to. How to define “bad” and “good” code.

Books

Talks and Video

Blog Posts, Studies, and Examples

Related Concepts

Tools

Before Start

What to look for before refactoring. How to prepare the code for changes in order to simplify the work. How to secure the work with future changes.

Books

Talks and Video

Blog Posts and Examples

Related Concepts

Tools

During Refactoring

What to avoid during refactoring, how to make the process easier. How to isolate changes and make sure no other code is broken. How to stay within resource budget and keep changes small.

Books

Talks and Video

Blog Posts and Examples

Related Concepts

Tools

Formatters, Linters, and Language Features

How to use all the capabilities of automated code refactoring tools and analyzers. Reasons to know the peculiarities of the language and environment in which the code is executed. How to benefit from automation. How consistency helps you to solve problems more quickly.

Books

Talks and Video

Blog Posts and Studies

Tools

Naming

Why naming is important, how variable and function names affect code perception and development speed. Why terminology synchronization improves team collaboration. How to identify “bad” and “good” names. What to do with lying names.

Books

Talks and Video

Blog Posts, Studies, and Examples

Related Concepts

Tools

Code Duplication

How to distinguish between code duplication and lack of knowledge about the system. Why and how to use duplication as a tool. The benefits of regular code audits and how to get into the habit of doing them.

Books

Blog Posts and Examples

Related Concepts

Tools

Abstraction and Separation of Concerns

How and why to use abstraction. Reasons to separate intention from implementation and consider the limits of the working memory of the human brain. How to give the reader information about the system in a controlled way. How to efficiently decompose complex tasks into simpler ones. How to make sure the application data is always in the correct state.

Books

Talks and Video

Blog Posts, Studies, and Examples

Related Concepts

Tools

Functional Pipeline and Linear Code Execution

How and why to express data states of business workflows in code. The benefits of linear code execution are. How to disallow passing invalid data to functions and isolate data validation. The benefits of functional programming are.

Books

Talks and Video

Blog Posts

Related Concepts

Tools

Conditions and Complexity

How to organize the conditions to decrease the cognitive load of the code. Metrics to use to measure complexity. How to use automated tools to manage complexity. Reasons to “straighten” code execution and “turn” conditions inside out. How to use Boolean algebra to simplify conditions. Design patterns that can help do this. How to apply functional programming principles to simplify conditions.

Books

Talks and Video

Blog Posts, Studies, and Examples

Related Concepts

Tools

Working with Side Effects

Reasons why side effects make the program more complex and unpredictable. How to reduce the number of effects in your code and what to do with effects needed for the application to work. The benefits of pure functions and referential transparency. Options to test effects and reasons to separate logic from effects. The point of dividing code into commands and queries.

Books

Talks and Video

Blog Posts and Studies

Related Concepts

Error Handling

Kinds of errors exist and how they differ. Problems entangled error handling lead to. What to pay attention to when refactoring error handling in JavaScript code. Techniques to use when there are technology, paradigm, or methodology constraints.

Books

Talks and Video

Blog Posts

Related Concepts

Tools

Module Integration

Coupling and cohesion. How to divide an application into modules and then compose these modules together. Why and how to decompose tasks. The benefits of contracts and guarantees between modules are. How to decouple modules from each other as much as possible but still leave room for them to communicate. The difference between object and functional composition is. How to manage dependencies. How to achieve data integrity and consistency.

Books

Talks and Video

Blog Posts and Examples

Related Concepts

Tools

Generics and Hierarchies

How to understand when you need a generalized algorithm or type. Why composition is preferable to inheritance in most cases. How to use the Liskov substitution principle as an integration linter.

Talks and Video

Blog Posts

Related Concepts

Application Architecture

How poor architecture can hamper refactoring. How to use ubiquitous language to improve the architecture. How to build interaction with the outside world and manage dependencies. How ports and adapters are useful. Reasons to separate UI-logic from business-logic. How architecture affects testability.

Books

Talks and Video

Blog Posts

Related Concepts

Tools

Declarative Style

The benefits of a declarative code style over an imperative one. Situations when to prefer the imperative style. Why finite state machines can be useful in frontend development.

Books

Talks and Video

Blog Posts

Related Concepts

Tools

Static Typing

How to use types to convey more knowledge about the domain. How to make invalid data states unrepresentable in code. How to use types to detect development principles violation.

Books

Talks and Video

Blog Posts

Related Concepts

Tools

Refactoring Test Code

How not to break tests during refactoring. What makes tests brittle.” How to find a balance between high coverage and low test-induced damage.

Books

Talks and Video

Blog Posts and Examples

Tools

Everything Around the Code

How to synchronize the sources of information in a project. How and why to make comments more informative. How to increase the benefits of documentation without increasing the cost of maintaining it.

Books

Blog Posts and Studies

Tools

Refactoring as a Process

How to decide whether to refactor or rewrite the code. The information to collect about the project before the start. How to estimate the time required for a task. Metrics to use to measure the effect of refactoring on the code.

Books

Talks and Video

Blog Posts and Examples

Tools