Why organizing your knowledge ?
Have you ever say something like:
- "I know X, I have read an awesome article about it last month" without even remember what that article was telling?
- "I already visited this stackoverflow page 3 times this month." without remembering the solution?
- "I spend years studying math and cannot remembering how to do a multiplication".
You probably feels that you are just an imposter who survive thanks to people advice on internet. Guess what, you are not the only one:
Hi, my name is Magnar. I've been doing ops work for years, and I always have to google how to redirect stderr to stdout. https://t.co/DIFbfTVV9j— Magnar Sveen (@magnars) February 23, 2017
Even if you don't have to be ashamed of forgetting something, you should still do something about it because finding always the same answer to your problem can be such a long process. For instance you have to:
- open your browser
- type your question
- browse google suggestions
- click on the correct link
- scroll down the page
- copy-paste the first code block you find and re-iterate until it works
It's just counterproductive, because even if you solved your problem, you don't fully understand it. Moreover since you don't remember the solution you used the first time you encountered this problem, you cannot compare it to your current one and... you don't learn.
It can be called the "infinite circle of always learning the same thing".
Data is Ubiquitous
Nowadays, data is ubiquitous. From your mother birthday to the latest web framework configuration, you have to know so much and everything is evolving so fast that you can become an expert in a technology but if you stop learning, you will slowly become obsolete.
Being up-to-date with everything is impossible. One solution to this problem would be to limit the knowledge content you should know in order to focus on the one that matters to you, as explained in this tweet from @housecor:
Access to data was once a key source of power.— Cory House đ (@housecor) July 25, 2018
Today, data is ubiquitous, and cheap. So power is derived by knowing what to ignore. pic.twitter.com/QIeVjYYgkz
However this knowledge must be sustainable. For instance, if you are switching project and start working on something entirely different you should be able to work again on your first project without learning everything from scratch.
This is generally done by
- writing clean code
- documenting it from a newbie perspective
- adding test file
But this is still a project specific knowledge. For instance, in order to remember how you implemented an algorithm in a specific class, you have to re-open the project. This is not an efficient way to remember something, specifically when you have lots of resource to manage.
We have to find something better...
How I organize my knowledge ?
The main goal of organizing your knowledge is to focus on learning new thing instead of spending time understanding what you already learnt.
Everyone have its own tricks to get organized. Some people like to make cheatsheet, some works by project, some others put their code snippet into a database, you also might have some smarter way to organize your life that I will be glad to hear of.
Personally, I try to note everything I learn in the same project. It forces me to explain some concepts with my own words because that's the only way to fully understand it.
If you cannot explain something in simple terms, you don't understand it. pic.twitter.com/1b2TMHZ7JZ— Richard Feynman (@ProfFeynman) July 25, 2018
Even if an article explain really well a topic, it's always better to make a summary, reformulate or even translate this explanation to your native language and put a link to the original article on your project database. In fact recopying text force you to understand the words you are typing.
Moreover ordering everything I learn helps me creating links between knowledge. And when i say "everything" I mean
EVERYTHING, from artistic to computing notions passing by economy, mathematics, etc.
Actually I note so much things that I already have 928 files in my project since I started this methodology 1.5 years ago.
This amount of file requires some structure that we will see in the second part of this presentation.
In order to note everything, I wanted my project to meets this needs
- Data should be easily browsable so it have to be lightweight, easily managed (changing the structure of a document should be straightforward) and easily parsable (finding an information inside the entire project should be quick)
- Data should be on the same level in order to avoid deeply nested structure
For the first point, I decided to split my knowledge data between files, where each file represent a specific concept, and use Markdown
.md format to save it. Markdown appeared to be a really nice format because thanks to its minimal layout feature, my files stay lightweight even with lots of pictures and hundred of thousands lines in it.
For the second point, I choose to put every files of my project on the same level. I rather prefer splitting my files by name patterns than putting it in nested separate folders, because:
- I can quickly see the content of my project
- I have only one directory to scan which simplify the search
I try to separate my files between the below sections
- e.g: a_arts_color.md, a_arts_films_anime_puella-magica-madoka.md
e, economy, politics
- e.g: e_economy_money_blockchain_coin_litecoin_ltc.md
- e.g: h_informatic_components_memory_RAM.md
l, everyday life
- e.g: l_cooking_recipies_pie_leek.md
- e.g: p_project_jquery.md
- project section is used to detail the dataflow of projects. It's a very technical section
r, everything related to code and network
- e.g: r_code_web_css_layout_flexbox.md, r_network_tool_socket_netstat.md,
- why r...? I still don't know （；¬＿¬)
- e.g: t_maths_arithmetic_operation_division.md, t_climate_change.md
- everything related to theory content
As section separator, I use:
-, name separator
- e.g: project-management
_ , section separator
- e.g: python_tool
With that nomenclature I could split my files between sections so that it's easier for me to find a specific knowledge. It's always easier to remember where we store the definition of something than to remember it directly. And I'm not the only one to think that:
Remember where (not how) you have already solved this problem. So you can always look there for the solution, https://dev.to/sobolevn/i-am-a-mediocre-developer--30hn I'm a mediocre developer
The idea is to find an information the quickest way possible. So the files content have to be easily browsable. I use a Table Of Contents on top of each file to navigate simply to specific section.
Inside a section, I try to explain things with Tree Structure to keep the content as clear as possible.
Instead of writing a huge paragraph about something
The concept X, is acting as an Y since it "do the thing". but X better on U that's why it's used for Z. To configure X you should fill the W configuration line
I try to summarize it like below so that I quickly see what the concept is about.
- Concept X + act as Y * it "do the thing" * X is better on U than Y + Configuration * fill W configuration line + use case * Z
In that kind-of-database project, I have some specific files which helps me managing my tasks:
README.md: where I explain what I'm trying to do with that project, which is more or less this article
_todo.md: where I note everything I need to do
_temp.md: where I store temporary data that I need to class inside my database
To write markdown, we need a text Editor. I choose SublimeText since it's blazing fast and the markdown plugins meets my needs (markdownTOC, MarkdownPreview, MarkdownEditing).
But you might prefer Visual Studio Code which has a native markdown support and is easily configurable.
Both of them offers a "Command Palette" that support Fuzzy Search. This is a really suitable feature since in order to open a file, you only have to type some of its letters.
Backup with git
Git is a really tough topic that I won't explain in this article. The only things you have to know is that git:
- save file incrementally so that it make hard to lose something when deleting by mistake
- allow to synchronize project across device with remote git hosting service such as GitHub
I you want to learn more about it, you can read my article on git
Search in the database
Splitting every knowledge concept in different text files is a really efficient method to find what you search since the data should be written in just one file. However you have to remember the file name to fetch an information. In order to this, you might need to search across all the "database" documents to find where the information is stored.
For this purpose, I'm using the excellent ripgrep library.
You can use it either from vscode through
workbench.action.findInFiles method or from the terminal with
search a pattern across all the library
rg -in "pattern-searched"
The search is still a "manual" process but we can improve it by indexing every documents in order to create a search engine that we could browse from the web...
Quick reminder: it's nice to write everything you know on the same project but don't put too much personal or confidential information. If someone hack you, you might be in trouble...
I try to note only information that big Data can gather. For instance I am allowed to note my friends birthday (because, why not?) but I can't write the password of their credit card.
Congratulation! You made all the way there!
If you apply this kind of methodology and start noting everything you learn, you will see that being organized can make you smarter or at least more efficient. It will also teach you some valuable skill like "project management".
There are other articles on the web that advocate the same concept. For instance you can read why being obsessively organized makes you more creative for an artistic point of view.
If you have questions or encounter difficulties to understand some points, feel free to ask me anything. I will be glad to answer.
Thanks you To read <3