001. Part 1. Flexibility
002. Chapter 1. Complexity of object-oriented programming
003. Chapter 1. UML 101
004. Chapter 1. Sources of complexity
005. Chapter 1. Not trivial data serialization
006. Chapter 1. Complex class hierarchies
007. Chapter 2. Separation between code and data
008. Chapter 2. Code modules
009. Chapter 2. DOP systems are easy to understand
010. Chapter 3. Basic data manipulation
011. Chapter 3. Representing records as maps
012. Chapter 3. Manipulating data with generic functions
013. Chapter 3. Calculating search results
014. Chapter 3. Handling records of different types
015. Chapter 4. State management
016. Chapter 4. Structural sharing
017. Chapter 4. Implementing structural sharing
018. Chapter 4. Ensuring system state integrity
019. Chapter 5. Basic concurrency control
020. Chapter 5. Reducing collections
021. Chapter 5. Implementing the reconciliation algorithm
022. Chapter 6. Unit tests
023. Chapter 6. Unit tests for functions down the tree
024. Chapter 6. Unit tests for queries
025. Chapter 6. Unit tests for mutations
026. Part 2. Scalability
027. Chapter 7. Basic data validation
028. Chapter 7. JSON Schema in a nutshell
029. Chapter 7. Schema flexibility and strictness
030. Chapter 7. Schema composition
031. Chapter 8. Advanced concurrency control
032. Chapter 8. Thread-safe counter with atoms
033. Chapter 8. Thread-safe cache with atoms
034. Chapter 9. Persistent data structures
035. Chapter 9. The efficiency of persistent data structures Part 1
036. Chapter 9. The efficiency of persistent data structures Part 2
037. Chapter 9. Persistent data structures libraries
038. Chapter 9. Persistent data structures in action
039. Chapter 10. Database operations
040. Chapter 10. Storing data in the database
041. Chapter 10. Advanced data manipulation
042. Chapter 11. Web services
043. Chapter 11. Representing a server response as a map
044. Chapter 11. Search result enrichment in action
045. Part 3. Maintainability
046. Chapter 12. Advanced data validation
047. Chapter 12. Function arguments validation
048. Chapter 12. Advanced data validation
049. Chapter 12. Automatic generation of schema-based unit tests
050. Chapter 13. Polymorphism
051. Chapter 13. Multimethods with single dispatch
052. Chapter 13. Multimethods with multiple dispatch
053. Chapter 13. Integrating multimethods in a production system
054. Chapter 14. Advanced data manipulation
055. Chapter 14. Manipulating nested data
056. Chapter 14. Unwinding at ease
057. Chapter 15. Debugging
058. Chapter 15. Reproducibility with numbers and strings
059. Chapter 15. Unit tests
060. Chapter 15. Dealing with external data sources
061. Appendix A. Principles of data-oriented programming
062. Appendix A. Benefits of Principle 1
063. Appendix A. Cost for Principle 1
064. Appendix A. Cost for Principle 2
065. Appendix A. Principle 3 Data is immutable
066. Appendix A. Cost for Principle 3
067. Appendix A. Benefits of Principle 4
068. Appendix B. Generic data access in statically-typed languages
069. Appendix B. Generic access to class members
070. Appendix C. Data-oriented programming A link in the chain of programming paradigms
071. Appendix C. DOP principles as best practices