Software Creation Mystery - http://softwarecreation.org

How to use search skills to become an effective programmer

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

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

  1. 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).
  2. Search  (use standard Google, code search or other search engines) – there are many recommendations how to use search engines effectively.
  3. 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

  1. Copy code – Try in isolation (discovery unit tests with spikes are the best for this purpose)
  2. Clean code – keep only minimal, relevant and clear code for your solution
  3. Apply code to your system


C. Learn

  1. Understand - why and what have you done – learn from the code and implementation
  2. 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
  3. 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?

AddThis Social Bookmark Button AddThis Feed Button


Comments

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

Comment by Anthony Damasco | July 23, 2008 10:50 am

Great article, you obviously put a lot of thought into this. The title of the article stood out and grabbed my attention, and I wanted to read what you had to say. I like the fact that you acknowledge the different types of knowledge comparing a new grad with a self taught practitioner and how the knowledge types grow over time. This is especially true. As a CS grad with 14 years industry experience I can acknowledge the truth in this.

The point that alarmed me somewhat though (and maybe I missed the point), is that mastery of search techniques does not alone make you an ‘effective’ programmer. Resourceful, yes, but being an effective developer from personal experience is about growing an indepth, deep rooted experience and understanding so that I know what will happen if I use approach A instead of approach B.

I have found personally from my own experience and career growth that was an important lesson to learn. Initially when you have limited experience with a programming language you are ignorant to a lot of factors and have significant impact – how maintainable is this approach, how scalable is this approach, is this the most suitable approach, how will this approach perform? etc, – this list is quite lengthy. My point is, as a new developer I believe many developers code blind to this type of information. They find something that works and they use it. You approach to searching and finding some code, copying and pasting it, is following in this mindset – it works so I’ll use it. There is nothing wrong with this approach when you don’t know any better, but as a new developer the issue is that you don’t even realize that you don’t know any better, it works right, so it has to be right. You only realize after time and gaining practical experience of seeing what works and understanding how it works that you start to become effective.

Initially when I started developing with Java I was at a fairly competent level after about 2 maybe 3 years of hands on experience and self-taught, using my knowledge from other programming languages (C, C++, PowerBuilder) to help me pick up the language. It wasn’t until after about 7 years of daily, hands on experience that I felt like I was in a position where I could use the language and it’s features effectively with a deep rooted experience, and it made me realize that of all the years prior where I thought I was an expert and was so far from being even close, and barely using the language effectively.

Comment by Kevin Hooke | July 24, 2008 9:45 am

Availability of massive amount of information in Internet does make programmer’s life easier. By using search/copy/paste method person can become a smart programmer, by finishing his task fast. But, how this method helps him to improve himself. In fact, if programmer keeps on doing this copy/paste he will even forget how to think himself, how to solve problems. My point here is, the search may be used to improve knowledge but not programming skills.

Comment by Veera | July 24, 2008 10:26 am

Kevin and Veera, thank you for your insightful comments!

I agree with you. This is one of the main points of the post – the search is not enough to become master programmer, but it could deliver valuable knowledge for solving practical problems. To become a true professional programmer for complex systems, we should gain good experience, understand concepts and higher level development principles.

At the end, vast source of practical examples in the Internet and search get food for our knowledge, which allow to build other forms of knowledge and expertise. Therefore, good search skills make us more effective in overall.

Comment by Andriy Solovey | July 24, 2008 9:35 pm

89 Ways for You to Become the Coolest Programmer in the World…

Since there are dozens of posts on becoming a better developer, but no single post with all the advice you need, perhaps, you’ll find this short guide useful.
1. Learn the Skills You Need

Learn the programming basics

“The goal of this guide is to b…

Trackback by Effectize | October 28, 2008 12:19 am

[...] I can come up with few cases: 1. Work by example – you found new code through search and want to  use it immediately to solve your problems. 2. Quick start – you copy code (including [...]

Pingback by $i->php(); » Blog Archive » Copy and paste Programming VIA Copy and paste Writing | March 23, 2009 10:32 pm

Search is the most important tool for everybody. So much so that I wrote my own. When you find important information on the net. Make a copy and search that information at your leasure.

I have used search since the mid 80′s. Using the digital equipment search to do source code changes.
Use it to catalog and play Video, Music, Pictures and text (web url’s previous searches etc)

Without search you are wasting your time.

Comment by Doug Pederson | April 18, 2009 9:13 am

Great article? I can’t agree more?

Comment by freetao | December 8, 2010 9:25 am

This blog have little value without you and your comments, thoughts and discussions. Please, leave your comments. You are welcome to debate and criticize any idea, but, please, don't attack other people. Thanks for your contribution!

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe without commenting

Software Creation Mystery - http://softwarecreation.org
This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 License .