# Code Reading in Practice > [!summary] 5 Dimensions of Code Reading Structure, Domain, Concepts, Context, > and Collaboration. ## Structural Examination > When you have only a little bit of prior knowledge, each line of code, or even > each individual element might take up one spot, but if you know a lot about > the code base, each method might hold a spot, causing you to be able to > process a lot more. This process is called chunking. > One of the first techniques to apply when reading unfamiliar code is to > understand its division into components; this includes classes and methods in > an Object-oriented project, or functional components in a more functional > style program. ### Structural Components and Their Relationship - Elements - Object components - Functional components - Singular components - Folded view - Shortcuts help - Size matter as well. Notice the line numbers. - Structure view > When understanding new information, your brain always tries to relate new > information to things you already know or understand. As such, your brain > forms a mental model of the information that you can use to reason about the > new information. Explicitly making connections between information visible > will support your brain in easier understanding. - Relationship between components - Inheritance - Contains as method - Contains as field - Used in body - Calls and Overrides - Use as parameter, or Calls on static method - Find Usage feature for detecting dependencies - Informal relationship - Naming conventions - Similarities - Same parameters used frequently = _Data Clump_ - Go for a timeboxed top-to-bottom read ### Entry Point - Finding entry points - Guess by the name - Takes few arguments, but calls a lot functions - Place breakpoints and read from the entry point - Visualizing the system - draw your own UML diagrams ### After the Read - Expand documentation - Improve comments - Discuss code quality - Structural code smells - Linguistic code smells - Is there a historical reason or a good justification? - Inappropriate intimacy or Feature envy? - Message Chains - Merge small methods? - Eliminate long chains? - In multi-lingual code base, static source code analysis might not always find dependencies. - Refactor - Large class -> divide into subgroups - Small class -> merge into other classes - Data class -> merge into other classes that frequently access the data - Long parameter list -> moving some into class fields? Group parameters into larger objects? - One call functions -> premature generalization, this causes more cognitive load. Maybe inline these methods? - Dead code ## Understanding the Business Domain of Your Code in More Depth - Domain model = behavior + data ### Learning from Variable Names - List all variable names in use - Quantifiers = refer to quantities - Programming concepts = refer to a specific concept in a language - Domain concepts = refer to the domain - Text analysis tools: [Word Cloud](https://pypi.org/project/wordcloud/) - Split the words and examine the domain concepts - Determine the concept - Objects or objects attributes? - Type of the component? - Analyze in network - Define the concepts and behaviors as precisely as possible ### After Reading - Documenting the _Ubiquitous Language_ - Code quality - Similar objects - Linguistic code smells - Name molds = patterns in which elements in a variable name are typically combined > [!warning] Linguistic Code Smells defined by Arnaudova > > - Methods that do more than they say > - Methods that say more than they do > - Methods that do the opposite of what they say > - Identifiers that have more than what they say > - Identifiers that have less than what they say > - Identifiers that have the opposite of what they say > > Linguistic Anti-Pattern Detector (LAPD) for Java developed by Arnaoudova ### Refactor - Similar sounding objects - Genuinely different -> rename to minimize overlap - The same -> merge into one object - Vague-sounding names - Smelly names -> rename, or reimplement ## Contextual Examination > What are the important programming concepts in this code base? How do they > relate to the domain and to the structure of the code? - Names and concepts - Behavior - Syntactics - [Roles of Variables Framework](https://www.ppig.org/files/2005-PPIG-17th-sajaniemi.pdf) by Jorma Sajaniemi at the University of Eastern Finland - Dependencies - What are imported - Where are they used > [!summary] Roles of Variables Framework These 11 roles cover 99% of programs > that novices will write: > > - Fixed value > - Stepper > - Flag > - Walker > - Most recent holder > - Most wanted holder > - Gatherer > - Container > - Follower > - Organizer > - Temporary ## After Reading - Explain programming concepts - Document roles of variables ## Context Examination - Read plain text strings - Read code comments - Search outside the code - Create a search plan -- this is better than randomly browsing pages - Try a generic search engine - Try a code search engine as well -- search on GitHub - Create a concept map as you go