 |
Idea: Website to rapidly learn a programming language
One of my frustrations with learning programming languages is that there should be a better way. In this article I will propose how this learning process could be radically improved.
Problem 1: Finding what you're looking for
A common strategy for learning a new programming language is to buy a book. While this is a good starting point, it often leaves you with many unanswered questions. The moment you start coding, you're going to run into frustrating problems/questions that the book doesn't answer. That's where Google comes in, right? While Google is tremendously useful, it can still be time consuming to find what you're looking for. Google solves the problem decently, but not well.
Thesis 1:
The knowledge required to use a programming language is relatively well defined, and should be searcheable with the top search result being the correct one 95% of the time.
Problem 2: Mediocre content
My second complaint with the Google method is that often if you do find an answer, the code example or the explanation leaves something to be desired.
Thesis 2:
High quality content is a critical component to any learning system, but is straight forward to produce given a good author
The Vision
Imagine you're learning C# and you've forgotten how to interface with the Windows Clipboard. You search for "c# windows clipboard" on Google and you're confronted with several links. You do some clicking but the content is bloated and non-specific. "This should be so simple!" you say to yourself.
Now picture a link in your favorites bar called "C# search". You click it and a Google-like page comes up with a logo to tell you that you're searching for C# related information. You type "windows clipboard", but before you've even finished typing the search box turns a different color to inform you that the site has a webpage that has been specifically labelled as an exact match for the search phrase "windows clipboard". A dropdown box appears with the title of this exact match which has the title C#: Using the Windows Clipboard. Below that are three other links that are documents explaining how to do more specific things with the clipboard, such as copying text to the clipboard, copying an image to the clipboard, etc. But you like the sound of the top match, so you press ENTER to open the page.
Without any delay, the page is in front of you. It explains in a clear, concise manor how to interface with the Windows clipboard, provides clear code examples, and links to related documents explaining how to do more specific things with the clipboard.
Impressed, you try a few more searches, such as taskbar. The top search result is C#: Adding an Icon to the Windows Taskbar. When you search for something with natural language, such as how to convert a string to an integer, the search performs just as well, returning a top search result of C#: Converting a String to an Integer.
How to turn this vision into a reality
The essence of solving this problem isn't in creating the content, which admitedly would be a lot of hard work... it is in developing a search framework to succeed at returning the correct search result 95% of the time.
My proposal is to use a brute force solution, aided in feasability by developing an efficient mechanism for specifying all* of the ways you could search for any one document. (The top 95% of the ways, to be exact)
To use our windows clipboard example, the exact matches to the document C#: Using the Windows Clipboard would be quite a long list, of which the following would be a small subset:
  | windows clipboard |
  | using windows clipboard |
  | using the windows clipboard |
  | ... |
  | clip board |
  | using clip board |
  | using the clip board |
  | ... |
  | windows clipboard |
  | using windows clipboard |
  | using the windows clipboard |
  | ... |
  | windows clip board |
  | using windows clip board |
  | using the windows clip board |
  | ... |
As you can see, the number of permutations is pretty large. But by using tools such as regular expressions, we can cut the list down quite a bit. For instance, the following are perfectly interchangeable:
  | clipboard |
  | clip board |
  | windows clipboard |
  | windows clip board |
Describing this as a pattern reduces the number of permutations immensly:
(windows )?(clipboard|clip board)
In other words, what we need to do is:
1. | Determine the list |
2. | Represent the list compactly using clever means that takes into account patterns, etc. |
The language
Because this process is at the crux of creating our search engine, it is worthwhile to invent a language to help. Here's how the language might work:
  | Patterns can be defined and associated with symbols |
  | Symbols can be used within other patterns |
  | Our list of patterns can be used to generate the final list that we consider to be exact matches for our document |
To use the windows clipboard example, we might define the following symbols and patterns:
A = (windows )?((clipboard)|(clip board)) B = how to
Having defined these symbols, we might define our actual list to consist of the following:
1. | (using)? (the)? $A |
2. | $B? use (the)? $A |
3. | (($B? copy)|(copying)) (data)? (to (the)?)? $A |
4. | ... |
A program would use this patterned-based list to generate the final expanded list.
Symbol "A" would expand do:
  | clipboard |
  | clip board |
  | windows clipboard |
  | windows clip board |
List item #1 would expand to:
  | clipboard |
  | clip board |
  | windows clipboard |
  | windows clip board |
  | the clipboard |
  | the clip board |
  | the windows clipboard |
  | the windows clip board |
  | using clipboard |
  | using clip board |
  | using windows clipboard |
  | using windows clip board |
  | using the clipboard |
  | using the clip board |
  | using the windows clipboard |
  | using the windows clip board |
List item #2 would expand to:
  | use clipboard |
  | use clip board |
  | use windows clipboard |
  | use windows clip board |
  | use the clipboard |
  | use the clip board |
  | use the windows clipboard |
  | use the windows clip board |
  | how to use clipboard |
  | how to use clip board |
  | how to use windows clipboard |
  | how to use windows clip board |
  | how to use the clipboard |
  | how to use the clip board |
  | how to use the windows clipboard |
  | how to use the windows clip board |
List item #3 would expand to 48 possabilities.
So with our two symbols and three list items, we have 32+32+48 = 112 possabilities. They likely would not account for 95% of the ways that someone might search for our document, but with a bit more work I'm sure we could get there.
Creating a comprehensive website for a programming language might consist of 5000 articles. Writing each of those articles and carefully selecting the exact search phrases for each article would carry a very significant cost, but the end result would be invaluable.
Some additional comments
1. | Learning by reading a book is a kind of bottom up learning, where you build a foundation and work from there. Learning by jumping in with both feet and searching for answers only as their needed is more top down. The term JIT learning (just-in-time learning) comes to mind. |
...
|
|
 |