eating-elephants.txt Tackling large code projects Original Author: Sahil Gautam <printfdebugging@gmail.com> Homepage: <https://printfdebugging.in/> License: GNU GPL v2 ============================================================================== CONTENTS 1. Related Articles article-sources 2. Maintaing the Sense of Purpose sense-of-purpose 3. About Mental Models mental-models 4. Code Documentation code-documentation 5. Rapid Prototyping rapid-prototyping 6. Reading Code reading-code 6. Reading in General reading-in-general 7. Know Your Tools know-your-tools 8. Detailed Logging detailed-logging ============================================================================== Related Articles article-sources - https://explog.in/notes/elephants/index.html - https://www.paulgraham.com/makersschedule.html - https://aosabook.org/en/index.html - the philosophy of software design - beautiful code ============================================================================== Maintaing the Sense of Purpose sense-of-purpose some problems require quick surface level patch fixes, there focus on reaching the solution the fastest. diving deep makes sense if the project is for learning or some deep refactor is required. another solution is to get started with a quickfix, followed by larger code refactors. ============================================================================== About Mental Models mental-models - make your assumptions about how things work more explisit - read books learn about different system arcitectures - perform experiments on the system if it's too large to read in time - validate assumptions with experiments - don't fall for 'confirmation bias', try prove it wrong, not right - test assumptions and find cases where the model doesn't fit the reality - dev environment is not the same as production, focus on integration more code is just the textual representation of the mental model of the problem. so it's wise to focus on the mental model , and not to get lost into the code. the bug in code is because of some holes in the mental model, so focus on finding the holes in the mental model first than just fixing the bug. debugging without looking at the code code is edited maybe 5 or 10 times in a decade, but it's read thousands of times, and the readers are trying to understand the mental model which lead to that code. make sure to write code such that it's easy for others to create a mental model when they read your code, and their mental models should be close to yours... it's your responsitility! ============================================================================== Code Documentation code-documentation - code tells what not why, self documenting code is a sweet lie - comments are very important, to tell why that code was written - implisit assumptions and knowledge is more dangerous than over expln... - well crafted code reads like prose let's take a look at a few bits of well written code which reads like prose. reading the interface definition, i exactly know what it is about and where to look next. >go // The Filter interface represents a process that takes as input a // sequence of strings from a channel and produces a sequence on // another channel. type Filter interface { // RunFilter reads a sequence of items from Arg.In and produces a // sequence of items on Arg.Out. RunFilter returns nil on success, // an error otherwise. RunFilter must #not# close the Arg.Out // channel. RunFilter(Arg) error } < - these code samples belong to sanjay ghemawat, a google engineer - reading other's code helps gain perspectives on good and bad engrg. - the best code is like a good piece of writing ============================================================================== Rapid Prototyping rapid-prototyping hack/prototype a quick end-to-end working solution that touches every part in a timeboxed setting, hardcode most of it. this way there will be less chances of running into the unknown and magical surprices. estimation will be easy as you would know the simple and the complicated areas. work in small, solid increments to keep yourself motivated and to have something to show for all that time you spent on the project, one step at a time and verify the step everytime. this saves hours of painful debugging due to mixup of changes at different steps. just reading can be misleading as code is not the same as the state of the program at a certain point. run the program, attach a debugger and step through the code to understand what it is doing, how it looks. use callgrind etc and look at the callgraph maybe. ============================================================================== Reading Code reading-code - read the logs/errors carefully, it's easy to miss something very obvious - visualizing cleaned-up logs using some script can save hours of labour - don't rely too much on the system exec state, it's a hand wavy stat - look for simpler, direct metrics to actually guide your decisions - learn to speedread code, focus on key areas not impl details, take notes - custom editors should help navigate the codebase faster - commit history of a file tells about the evolution of code in that area - know the tools available around the domain, what and why beind them - keep checking relevance of the code in the curr context - avoid mixup of multiple issues in one solution, stay focused on one atat ============================================================================== Reading in General reading-in-general - the word is not the thing - reading and getting it is the most important skill, anywhere. - serious knowledge comes form books/docs/long-articles as they take time - reading, creating mental mods and finding loopholes is an art in itself - explore several resources and isolate the ones worth reading - focus on quality, don't rush and be greedy about reading the next one - avoid passive entertainment as that messes up with the reward/fear sys - don't speedread, focus on one word at a time, that's all you need! - good books require multiple reads before you actually get anything ============================================================================== Know Your Tools know-your-tools - don't be too attached to the tools, they are just means, not the path - learn complex tools slowly, first on small codebases, one command atat - avoid guis as they hide a lot of details and are often limiting - observe the experts using the tool to see what it's capable of - test tools under pressure situations and gain confidence - printfdebugging is the first tool - if stdout/stderr cluttered, log to a separate file instead - print the stack to understand what's going on in the code - a repl helps look and experiment with the current state of the code - string based regexp tools also help (find/grep/sed/xargs) ============================================================================== Detailed Logging detailed-logging - maintain structured logs of everything, what works, what doesn't - breakdown the problem, approaches, goals... keep focus on the main issue - have a list of open questions and keep eyes open for clues for answers - maintain daily logs of approaches, stack traces, what didn't work... - share notes with others when the task is complete - freeze the notes with the code changes in the commit message ============================================================================== vim:tw=78:ts=8:ft=help:norl:fdm=marker:fmr=<<<,>>>:ma:noro