How to use search skills to become an effective programmer
Jul 22nd, 2008 | People, Practices, Skills
No man is an island unto himself every man is a part of the whole – John Donne
It is possible to program a web page or small application with little knowledge of programming. Use Google to search for examples and if you are lucky, you will find ready code and your are almost done. Even experienced programmers often retreat to search to save time and effort for finding solutions for their problems.
Modern effective programming is unthinkable without using search, the Internet and collective intelligence. Therefore, search skills are becoming primary for an effective programmer.
Now we don’t need to know and remember how to solve many programming problems – we can use search. We are becoming more effective, productive and able to solve wider range of problems. But does it mean that good search skills are enough for building software? This post will review the role of search skills in forming programmer knowledge and how to use search effectively.
Types of knowledge and how it grows in programmer’s brains.
There are three types of knowledge:
- Conceptual (why, what, if – semantic) – understanding concepts, principles, relations and major approaches for building software systems. This knowledge provides answers to why architecture or code should be done specific way, what are alternatives and logic behind selecting the best of them. Conceptual knowledge refers to the bigger picture and understanding beyond solving specific problems on a chosen programming language.
- Application: find new solutions for complex open-ended problems and create sound software systems.
- Acquisition: learning computer science, architecture and programming concepts, and building own theories based on practical implementations and experience.
- Practical (how-to – procedural) – knowledge how to solve a specific programming problem. This knowledge doesn’t require deep understanding of concepts and rationale behind implementation choices. Search plays the biggest role here as it is relatively easy to share and explain specific solutions for limited problems using programming language.
- Application: solve problems quickly using proven and known solutions without re-inventing new approaches every time.
- Acquisition: searching for existing solutions, learning by example or coming up with own and reusing later.
- Tacit (expertise, experience and intuition) – inner knowledge that people carry in their minds based on personal experience of implementing software systems. Tacit knowledge allows to synthesize and make work together two other types of knowledge using powerful brain capabilities. This knowledge is difficult to transfer, because the big part of it is stored in our subconscious mind. It works with intuition and allows optimal decisions based on experience, feedback and evaluation of conceptual and practical knowledge in specific context.
- Application: using own expertise, experience and intuition for implementing the best solution
- Acquisition: building software and learning from results
- Application: using own expertise, experience and intuition for implementing the best solution
Design patterns (as well as architectural, domain and others) are interesting example for combining of all types of knowledge: ‘how-to’ examples, concepts behind these examples and experience of implementing them. This way of representing knowledge is one of the reasons for patterns success and wide use.
Value of practical knowledge in the head is decreasing when more and more practical solutions and examples are available on the Internet. We don’t need to keep them in our heads. We can tackle now almost any common programming problem we might encounter in building software. However, a master programmer knows much more than examples how to solve problems or where to search for examples. He can come up with own solutions, make most optimal decisions and apply them in the best way. In addition, solutions for the new, complex, domain and context specific problems are difficult to find on the Internet. And any non trivial software project requires knowledge of the high level software development principles, experience of applying them and deep understanding of the system, problem space and environment to make good decisions how to solve problems.
Therefore, conceptual and tacit knowledge are still very valuable in software development. And when we use search we should make effort to expand all types of knowledge instead of just solving particular problems. It will pay off with enhancing ability to solve much more advanced problems and becoming even more effective programmer.
Effective Search for Solving Practical Problems
A. Find
- Define – understand what problem should be solved and focus on what you are trying to find. Internet has so much interesting stuff that search could easily take all your work time (and personal).
- Search (use standard Google, code search or other search engines) – there are many recommendations how to use search engines effectively.
- Scan results (quality of content, credibility and level of expertise; stop if source has low trust level) – Read – Evaluate (effort, needed tools and libraries)
B. Use
- Copy code – Try in isolation (discovery unit tests with spikes are the best for this purpose)
- Clean code – keep only minimal, relevant and clear code for your solution
- Apply code to your system
C. Learn
- Understand – why and what have you done – learn from the code and implementation
- Expand knowledge –
- practical: specific approaches, tricks and style of problem solving;
- conceptual: learn new concepts, refine existing and build your own;
- tacit: experience will grow automatically if you intelligently use found solutions and learn from them
- practical: specific approaches, tricks and style of problem solving;
- Collect (links, opinions, references, to-read lists) – any interesting information for your future searches, discovery and learning. Keep backlog for these purpose.
Do you have any tips for effective code search?
I’m self taught, and I find that I get a ton accomplished just by having a lot of online resources. I mean, you can teach your self flash action script just by going to sites like flashkit.com