Category: learning

  • The Connection Between Curiosity and Knowledge

    Last week, 7½ years after Aaron Swartz death, I was thinking about what made Aaron smart. There is this quote:

    “Be curious. Read widely. Try new things. What people call intelligence just boils down to curiosity.”

    Curiosity. It keeps popping up here and there.
    I was read Anand Philip‘s blog today. The “about” page is just three lines:

    Generalist.

    Superpower: Curiosity.

    Probably not a cat

    Can curiosity be a superpower?

    One of the answers was about The Oxford Electric Bell:
    There wasn’t much detail about the bell in the answer. Intuitively I was thinking it could be something like a clock that would require winding every now and then. But I wasn’t sure. So I went to the wikipedia page on it.
    That’s where I learned that it is an actual bell that rings about twice a second and holds “the Guinness World Record as “the world’s most durable battery [delivering] ceaseless tintinnabulation””
    Now there are many things to learn on this page. We might want to see the bell ringing on Youtube. We might want to read about perpetual motion. We might even want to read about the word tintinnabulation.
    Which reminded me of an old friend Akashnil Dutta who according to LinkedIn is now a Member of Technical Staff at OpenAI. It was about 9 years ago in a camp that I met Akashnil where he told me about magnetotactic bacteria. I asked him how he had come across this rather uncommon piece of information.
    He said he would use the “Random Article” feature of wikipedia to find new stuff.
    Curiosity is a super power.
    Read. Notice. Be curious. Question. Read more. Repeat.
  • How Not Having a Computer Science Degree Makes Me a Good Programmer

    I didn’t go to an engineering college. Looking back, I’m very glad that I didn’t. If I had gone to an engineering college in India, I would probably have dropped out very quickly.
    This post is not about how engineering colleges waste 880,350 years of India’s youth every year. But if anyone teaching in an engineering college is reading this post, I would urge them to read “Teaching Tech Together” and think about their pedagogical approach to teaching adults. These days, people become adults (at least in learning psychology) even more quickly than before.
    Being on my own has put me in a perpetual beginner’s mode. I’m always learning. I’m never sure about something. I often seek better ways of doing things. I keep reading the documentation. I keep reading tutorials. I keep building and rebuilding mental models.
    I do not learn from textbooks. While textbooks may make things easier in some way, they also remove a lot of details from you. A language might have introduced a new feature with an accompanying blog post that includes details about alternate approaches they tried and why they chose the final one they chose. A textbook might not go into such details. A lot of that meta information is lost. A lot of my learning has come from comparing different approaches and learning why the differences matter.
    I do not learn for a pen and paper exam. This is a universal mistake by higher education departments. Why on earth do we have pen and paper exams in professional fields like engineering and medicine? What good is being able to write 2 pages about a “wrapper class” or about “diabetic retinopathy” if I cannot use wrapper classes in my programs or prevent diabetic retinopathy in my patients, respectively? The way someone learns when they have to write about something is very different from the way they learn when they have to use something. It is the same as learning bicycling. In India, you can have a PhD in bicycling without knowing how to ride a bicycle. Because we do not evaluate tacit knowledge.
    In being self-taught I evaluate myself. And that puts the learner me in a very difficult spot. The evaluator me knows exactly how much the learner me knows. And therefore, the learner me is forced to continuously plug holes in the knowledge framework. It is also a real-time, continuous formative assessment that I go through every day. Even before I open the code editor I know that I don’t know how to do something. A lot of my learning happens on my mobile phone browser when I’m traveling or eating.
    Last day I was faced with the question, what is a good learning resource to start programming as an adult learner?
    I thought about it for a while. As per teaching tech together, the mental models have to be built first. The problem with sending a learner with no background in programming to “learn x in y minutes” websites is that many of these courses do not approach it pedagogically either.
    Then I thought, perhaps a pedagogical approach that happens online would utilize the instant feedback that learning programming through javascript can give in the browser. So I searched “learn programming through javascript” and reached on a course by Google. Interestingly, in the prerequisites of the course is a brilliant course called “Think Like a computer: the logic of programming“. This is a good start. (Although it starts with object oriented programming and I would love to see a similar course for functional programming. But of late I’ve been thinking OOP and FP are the same at some level and so it doesn’t matter).
  • How Did I Become A Programmer?

    Arya asked me from Germany, “How did you start with programming? Maybe write a blog about it? Your learning strategies”.

    To those of you who know me as a doctor, I’m a professional programmer who can work on any part of the stack (and even off the stack), and a free software advocate. To those of you know me as a programmer, I’m a professional modern medicine practitioner who can manage any kind of illness (including emergencies in the appropriate setting). To those of you who do not know me, I do much more than what I just described.

    But how does one become a doctor and a programmer? As it takes indeed some explaining to do, the suggestion to write blog was excellent and here it is.

    I have written about my privileges previously. So I won’t repeat that. But it is important to know that some of the things I’m going to describe maybe either much easier for you or much more difficult for you depending on where you are in your life. In other words, your mileage may vary. But do read on, as there are some common principles which should apply to everyone.

    Start early
    I started in fifth standard, I think. With a simple programming language called MS Logo. I didn’t know what a programming language was back then. All I was doing was moving a small turtle move on the screen and draw shapes. But the only way to move that turtle was by writing commands.

    FD 50

    The turtle would move forward 50 steps

    LT 90

    The turtle would turn left

    FD 50

    Another 50 steps forward, but this time to the left of your screen

    You could write this 4 times each and get a square.

    But soon you will feel like you are writing too many commands and that sometimes these are repetitive. For example, drawing the square above required the same two steps (FD 50 and LT 90) four times in a row. What if you could tell turtle to repeat the same?

    REPEAT 4 [FD 50 LT 90]

    That would make a square in logo! And that is what a loop is (pun not intended).

    Loops are the biggest fundamental concept in programming. If you can understand a loop, you can understand the entirety of programming. That means, if you could read the above section and make sense of it, you have everything that is required to become a programmer. Only time and effort can hold you back now.

    But there is so much more about it, right?

    True.

    Let’s not digress. Where did we stop? Logo. Check this article/tutorial on logo. Don’t try to run it or anything. Just go through the entirety of it. When you see the complex fructals that gets drawn towards the end of the page, you should be able to realize another big and fundamental truth about computers or programming – you can make the computer do anything, but only if you tell it exactly how to do it.

    Well, that is what programming is, you see. Telling computer every single step of what needs to be done. The computer is insanely smart and insanely dumb at the same time. It can do anything and everything, but you have to tell it how to do it. And you have to tell it every single step of how to do it.

    Imagine you are teaching the computer how to make tea. Let us have an imaginary conversation with the computer on how to make tea.

    You: Make tea
    Computer: How?
    You: Heat water. Then put tea dust. Then put milk. Then put sugar. Then stir. Then pour to cup.
    Computer: How to heat water?
    You: Take water in a vessel. Then keep the vessel on the stove. Then switch on the stove. Then wait till the bubbles start coming in the water.
    Computer: How to take water in vessel?
    You: Move vessel under the tap. Switch on the tap. Wait till the vessel is filled half. Switch off the tap.
    Computer: How to move vessel under the tap?
    You: Find out where the vessel is. Pick it up by the handle. Find out where the tap is. Move till there. Keep the vessel perpendicularly under the tap with empty side up.

    You get the point, right? If we go down this route till the level of physics, we will have made an electronic teapot. It will unfortunately not be able to make coffee though.

    But that is all there is. Break down a problem into individual single steps till the point where a computer can natively “understand” what you mean to say. CPU is a rock that we tricked into thinking. It only “understands” electricity. All that we see in the computer world is manipulation of this electricity into configurations that we want it to be in.

    But, that’s so deep? How can we break down everything to such great level of detail? Is it even humanely possible? That brings us to the second fundamental tenet about computers – you build on the work of others.

    You literally cannot build a computer all alone. There are thousands of parts to a computer which were made through even larger pathways that are possible only due to the combined human investment of effort in the past thousands of years. If you could take all the knowledge that exists in world today and go back a 1000 years, it would still be impossible to build a computer.

    You build on the work of others. That’s what you do in programming. People have built operating systems, libraries, applications, programming languages. There already is a lot of what you want to do out there in the world. Instead of trying to figure out everything by yourself, you build on others’ work.

    Even learning. People write about what they have learned. You can then use their learning as your learning. The programming world is an excellent model of co-evolution. A communist utopia.

    You want to build a website? There are libraries and frameworks available for that.
    You want to build a business? There are e-commerce frameworks.
    You want to write a blog? There are blogging software.
    What about that teapot? Well, you can build on existing work for that too.

    There is one thing, though. You can’t learn programming without doing programming. It is like cycling in that sense. You have to start slow, fall a lot of times. But once you get a hang of it, you can keep improving till you start doing tricks that make you look like a pro.

    One approach that has helped me a lot is not giving up. Every programming task appears daunting in the beginning. But once you break it down into smaller steps and start working on each piece, you feel a bit more confident. And then you inevitably run into trouble. But there are literally thousands of resources on the internet to help you.

    Understanding what exactly your problem is, and then looking for solutions to that problem helps. At this point, I will be less of a hacker, if I don’t link to ESR’s article on how to become a hacker, instead choosing to repeat what has already been accomplished. While you are at it, also learn how to ask smart questions.

    Still feel like you need a prescription? Here you go:
    Set up linux on your computer.
    Pick up python or javascript.
    Find out a problem you want to solve, and use python or javascript to solve that.
    Keep repeating.
    Pick up other technologies on the way.
    Don’t leave anything as “I don’t know that, it is not for me”, instead tell “I don’t know it yet, so I should learn it now”.

  • Happy Teacher's Day

    Disclaimer: This post is entirely based on the author’s experiences in life, learning. It is not intended at any single person, neither is it intended to insult or hurt anyone.

    I abhor the lectures delivered in my medical college.

    No, I love medicine. I don’t have any problem listening. And I don’t have ADHD.

    But I simply don’t gain anything from hours spent listening to lectures. I think I know why.

    When I was in my school, my teachers used to tell stories. They used to ask questions. They used to ensure that my mind stayed involved in the subject.

    In college, I’m lost.
    There are no stories, there is no logic, there’s no participation of students in the class.

    In the beginning I thought it was my problem, it was students’ disinterest, them not asking questions to teachers, them not interacting. But today is teacher’s day, and so, I’m attributing the failure of lectures to teachers.

    Here is how a typical lecture goes:
    A teacher comes in to the class. He writes down the title of the topic he is discussing on that day. And then he goes on – definition, classification, importance, prevalence, usage, mechanism, details, examples…
    Somewhere in between there might be two questions asked “what are the examples of…?”

    Just the way textbooks are written.
    A perfect validation of the title “Reader”.

    But, who wants the details? Who remembers them?
    And, more importantly, if they are just going to narrate the textbook, why do we need them, teachers?

    Here’s how my dream lecture is:
    A teacher comes in to the class. He asks the class a question that is at the core of the topic he is gonna teach. He narrates an incident that is totally related to the question and the topic. And then he asks us to think about the possible causes, or treatment, or mechanism.
    He listens to our responses and classify them. He tells us the various things that scientists have come up with in answering the same questions. He lets us relate with the solutions. He analyzes our response and tells us where it fits and where it doesn’t with actual science. He drops in important details in between. He makes us explore, and think, and absorb in that process. He shares insights and not details.

    No. Too much to ask for. Actually, I don’t have any right to ask for anything, because I’m neither an expert in medicine, nor one in teaching.

    But I can say what I can see. I see PGs who sit with students late till night to answer fundamental questions. I see one or two professors who set the mind of everyone in the classroom thinking hard about the problem and the solutions.

    But then, I have to regard the advice of that senior on the first night at my hostel: “See the fingers of your hand? Teachers are like that. Each one is different. Do not compare.” He followed that up with a warning, about how my life can be ruined if I do.

    But then, I’m not comparing. There’s nothing to compare against. It’s all bad, worse and ugly.

    You learn yourself in a professional college, they say. Yes, I’m better of teaching myself. And thus the title of the post.

    written during a lecture