Superlearning for programmers: algorithm development

My first job was database administrator. My second job was an RF engineer. My third job (back in 1999) was under title “algorithm developer”, and that was the first job I really loved. Since then I have been algorithm developer/CTO on and off, dealing with computer vision, image procession, machine learning, financial mathematics, semantic processing, medical imaging and several other areas.  I have built and optimized algorithms for CPU/mobile, GPU, cloud (distributed), RTL (chip), DSP  and other  less conventional architectures. Nature vs nurture, I think in this aspect nature won big time. Below are some principles related to superlearning that help me.

  1. Simple intuition. When I was working on my PhD at some point my thesis advisor simply asked me why some filter is working. I tried to answer from point of view of robustness, optimality and complexity. But he was not content. He explained that the filter is basically following a trend and the function tents to return to the trend. Since then, I always try to visualize an algorithm in the simplest way to get healthy intuition on why it is working.
  2. Less is more. When writing code I  used to try and test increasingly complex methods. Occasionally they were very effective, but I had hard time explaining everybody else why the code I wrote works. Since I can now hold all the solution in my head, I can optimize it in my head, and implement only the most effective part of the code.
  3. Mental experiments. People who work with me often get a feeling that I almost never work. Before I write code, I write and execute the algorithm in my head, find where it can fail and fix the design. When I finally write the code down, there is very little debugging needed.
  4. Read publications and create new algorithms. Usually people I work with can read 10 articles  per week, execute 3 pieces of code and then try to implement an article of choice within the code. I can read 100 articles per day, so when I finally implement a code I merge results from 3-5 different articles and create something new.
  5. Interdisciplinary knowledge. Using speedreading it is easy to remember all the articles relevant not only for you, and not only for your team, but pretty much for the whole department. Coming up with new articles for other teams I work with, I get rare insight into different ways to solve technical problems.  Very often I can solve technical problem by re-framing the technical task to a specialist in some other discipline.
  6. Testing results. When testing algorithms, visualization of the results is non-trivial. Fortunately, superlearning facilitates the task of visualization and keeping in my head many different results.  Thus it is very easy for me to know when I improve how big the improvement is.
  7. Finding creative solution. I keep many solutions in my head linked in many ways. Simply traversing these associative links – in my head and in search engines – I can always get new and creative solutions to my challenges.

When developing new algorithms, superlearning helps to learn what is already know in this area, come with creative solutions, and mentally test the solutions with minimal code writing.

One Reply to “Superlearning for programmers: algorithm development”

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.