The Programmer’s Brains At Work: Understanding The Software System
Apr 16th, 2008 | People, Productivity, Skills
“The important thing is not to stop questioning” – Albert Einstein
A typical programmer faces thousands lines of code, huge number of details and millions of situations and states during the software system execution. A programmer should understand the system, know how to modify it and support knowledge about the system with explanations, justifications and answers. How can a software developer gain, maintain and operate this knowledge and make sense of these volumes of information and complex logic changing every day?
The ways how our memory works could give us few hints.
Our Human Memory Architecture
The Process
- Acquisition. New information enters your brain along pathways between neurons in the appropriate area of the brain. The key to encoding information into your memory is attention; unless you focus on information intently, it is immediately forgotten.
- Consolidation. If you’ve concentrated well enough to encode new information in your brain, the hippocampus sends a signal to store the information as long-term memory. This happens more easily if it’s related to something you already know, or if it stimulates an emotional response.
- Retrieval. When you need to recall information, your brain has to activate the same pattern of nerve cells it used to store it. The more frequently you need the information, the easier it is to retrieve it along healthy nerve cell connections.
Sensory memory
Sensory memory corresponds approximately to the initial 200 – 500 milliseconds after an item is perceived. The ability to look at an item, and remember what it looked like with just a second of observation, or memorization, is an example of sensory memory. This type of memory cannot be prolonged via rehearsal.
We use five sensory channels to perceive the world: sight, hearing, smell, touch, taste
Short Term Memory (Working memory)
Some of the information in sensory memory is then transferred to short-term memory. Short-term memory allows us to recall something from several seconds to as long as a minute without rehearsal. Its capacity is also very limited: 4-7 items. But short term memory capacity can be increased through a process called chunking – packing information units into small chunks.
The Central Executive is the controlling system of working memory and is more complex than either of the three slave systems. This system controls attention and it is necessary for cognitively demanding tasks such as problem solving and comprehension. The Central Executive also has a limited processing capacity, which is related to the capacity of working memory (4-7 items).
Long Term Memory
Long-term memory extends to hours, days and years. By contrast to sensory and short-term memories, long-term memory can store much larger quantities of information for potentially unlimited duration (sometimes a whole life).
It has two main divisions: declarative (explicit) and non-declarative (implicit) memory.
- Declarative Memory (the memory of facts) consist of
- Semantic Memory – facts and generalized information, contains knowledge about the world; knowing the meaning and definitions of things
- Episodic Memory – personal experience (information in stories) – events that occur, whether to you personally or to someone you read about, heard about or watched on televisions
- Non-declarative (unconscious memory)
- Procedural memory is the long-term memory of skills and procedures, or “how to” knowledge.
How to learn the system (or anything else)
Memory is not a muscle and you cannot understand and get much information into your brain with just mechanical effort. You can spend days digging in the code and still barely understand and remember ideas and concepts behind the system. Recommendations below could help to improve the learning of the system.
Prepare mind
The key for effective learning is open, eager and focused mind. You’ll understand much better if you are highly interested or even love what you are going to learn. I don’t know how could you do it – it is too individual ( meditation? self-hypnosis? finding the job you could love?), but without interest you’ll have much harder time to learn your subject.
There are 3 components for the mind preparation:
- Intentions
- Interest
- Attention
Intentions
Any learning should have a reason and you’d better know your goals to focus your mind, keep on track and achieve your goals
- Why do you want to learn the system?
- What and how much do you want to learn?
- How are you going to learn?
Interest
You should enter the right state of mind where interest, emotions and mood support your learning beside rational needs. You want to learn, you are eager and passionate about finding meaning and explanations. Your mind will fly and absorb information at the fullest speed if you can achieve this state.
Attention
Without attention you’ll not get information or it will disappear quickly from your brains. Lack of attention prohibits memory formation and encoding of useful information into your brain.
Attention decreases under
- multitasking and distractions: less attention span and more load on working memory
- stress: interferes with ability to perceive and think
- boredom: your brains are not stimulated enough for active thinking
- poor physical readiness: sleepy, poor diet, lack of exercises and oxygen
- long learning time for the same topic. Switching periodically to other topics helps to sharp and charge your mind again
Planning
Even prepared mind needs some tools, methods and support
- Adjust your learning approach to your mental readiness, available time and context
- Decide what strategy to use – learning concepts, tools, memory devices, visualization, or reciting. More is better.
- Prepare and tune in advance – review, ask and get more information before actual learning
Immersion
haniamir
When you are prepared and ready, you can immerse into the learning.
Immersion (Flow) – a state of mental focus so intense that awareness of the real world is lost, generally resulting in a feeling of joy and satisfaction. When learning and tasks are too easy, people become bored. If they are too complex they become stressed and frustrated. Immersion happens when perception and understanding are challenged near capacity without being exceeded.
Flow conditions:
- can focus
- clear goals
- immediate feedback
- control over actions, activities and the environment
You should try to direct your learning to match your current knowledge and cognitive abilities with the depth and complexity of the new information. If it is too easy, go deeper and chose more complex topics. If it is too challenging, slow down and return to the more basic level.
The flow will allow you to become most productive, motivated and satisfied with your learning (and work and life).
Create knowledge
iqbalkhatri
Full comprehension is not possible, at least not in one day. Our learning is the series of iterative discoveries and probes, which eventually forms the true knowledge in our heads.
Don’t stumble in one place – switch learning areas often. You will have more comprehensive picture. It is more effective to have short, passionate and focused bursts of learning and letting unconscious mind to sort things out until the next learning session.
And in the same time you should be heuristic and ready for discovering the whole new world of knowledge. Be ready for unexpected insights, turns and paradoxes. They could lead for more valuable discoveries and knowledge than you intended.
The sources of knowledge:
- People – the knowledgeable and articulate people are the best source of the information, others could easily deceive and mislead (often including themselves – as you can see we don’t have perfect memories)
- Documents – capture mental effort of other people to explain concepts, ideas and solutions, but documents are often outdated and disconnected from reality.
- Code – the ultimate source of the system description. It contains the true knowledge , but with too many details (often distracting), which require serious effort to grasp.
The essence of understanding is creation of knowledge by building up your semantic memory with
- Associations
- Organization
- Deep understanding
Associate
Associations make memories much stronger and permanent. Linked memory will create a stronger network in our semantic memory, stay longer and allow easier navigation. It is critical for thinking, problem-solving and creativity. More associations we have, the better we are at thinking.
- Form right connection and links between your memories.
- Relate information to what you already know and define information using familiar concepts.
- Compare and contrast for creating deeper associations.
- Use senses and emotions for better encoding memories in brain
- Connect information to your and other stories and situations. Episodic memory is very reliable.
If you are learning the new programming language, look for similarities and differences with familiar languages.
If you are studying the system design, connect your findings to known architecture and design patterns.
If you are exploring the system concepts, search for a metaphor or visual picture explaining the system behavior.
Organize
Most of the differences in people’s memory abilities are in how they organize memories and less in how well brains can actually remember. Organizing means putting facts in meaningful categories and align with the way how you want to use them.
- Extract basic concepts instead of the simple memorization of isolated facts
- Use Mnemonics
- imaging – creating a mental picture;
- method of loci (locations) – ideas or things to be remembered are connected to objects located in a familiar location or along a path or journey;
- pegword method (number, rhyming schemes) – ideas or things to be remembered are connected to specific words (e.g., one-bun, two-shoe, three-tree, etc.)
- basic mnemonic like ‘initial letter’ – the first letter of each word in a list is used to make a sentence (the sillier, the better).
- Chunk information – pack informational units together. Working memory could operate with only 4-7 items and chunking helps to increase this capacity.
4 types of organization:
- Component (part/whole)–classification by category or concept (e.g., overall system architecture –> major subsystems and layers –> main classes);
- Sequential — chronological; cause/effect; flow (e.g., the system logic, sequence of events and dynamic execution);
- Relevance — central unifying idea or criteria (e.g., business model, architecture principles, design patterns);
- Transitional (connective) — relational words or phrases used to indicate qualitative change over time (e.g., the system state transitions, modes of operation)
Deeply Understand
There are three parts for deep understanding and active high-performance thinking:
- Power of unconscious processing
- Depth of processing
- Top down and bottom up
Use unconscious memory processing.
Our automatic, unconscious and ultra fast brain processes are much more powerful than limited conscious controlled thinking. Unconscious processes run in parallel and can handle many tasks at once. They are source of our intuition, insights and most decisions (for which we try to find conscious explanations later).
Unconscious thinking could be trained, enhanced and boosted with experience and active thinking, when we stretch and challenge our knowledge
- question all facts and assumptions
- explain and teach these ideas to others in the simple terms (including your grandmother – you’ll quickly find gaps in your understanding)
- view from different points of view (including various people interests)
- try to find alternative and new ideas
- search what we are missing or cannot trust
Depth of Processing – phenomenon of memory in which information that is analyzed deeply is better recalled than information that analyzed superficially. The more deeply learners process information, the better they learn. Therefore, select depth of processing depending on importance of the learning area: dive deep into the most important topics and just barely scan insignificant.
Combine top down and bottom up approaches.
We should use both inductive (example/experience –> concept) and deductive reasoning (concept –> examples) to better understand the software system. Requirement documents and architecture views are not enough and often far from reality. Code provides too much details that sometimes difficult to translate into meaningful concepts and unifying ideas. Only reconciliation of top down and bottom up knowledge could provide you with the true knowledge in reasonable time.
Strengthen learning
Important steps for knowledge retention and becoming better learner:
- Experience
- Review
- Self-correction
Experience your learning as soon as you can. The true knowledge emerges only after you tried to apply it in practice. Convert your theoretical knowledge into practical knowledge tested by reality. It is especially important fore software development, because it is mostly empirical activity.
- Write code and add / change functionality
- Troubleshoot and fix bugs
- Create unit testing – one of the best methods to test reality, understand and experience the system (if the system is testable).
Review
- Rehearse and “over-learn” information that increases level of attention, utilizes more senses, provides immediate feedback
- Review soon in small frequent doses
- Recall main points
Self-correction. Watch yourself. Are you effective? How could you learn better? Criticize your knowledge and learning methods. Praise yourself for achievements. Become more effective at learning.
The learning and exploration of the software system could be the most rewarding intellectual experience or it could be your worst nightmare. You have a choice…
And it is true, sometimes the problem for learning is in the a software system, which is very difficult to understand. The next post will explore how to make the system understandable.
Interesting Resources
The Information Processing Approach to Cognition
Memory and Semantic Memory, Wikipedia
Human Memory Models
Five Tools for Improving Your Memory, by Barry Gordon, M.D., Ph.D.
Improving your Memory
Good post. I really never analyzed my internal processes this closely to see if I was being truly effective while I’m studying a new piece of code or book. Basically I try to take some notes as I go, probably not the best approach.