Round to the Left Most Digit

It’s probably unusual for me to write anything about Math. I hated math and I failed the subject all the time. But I got pretty excited when I knew this trick from my colleague. I also asked this question at stackoverflow.

The problem

Let’s say you have a number 423 and you want to round the number to the nearest left-most digit which in this case it’s 4. If you want to round to the left-most digit it’s going to be 400.

The solution

The solution is quiet simple. You just need to get the place value of the number, take the number in question divided by the place value and floor the number then multiply the result with the place value again. That’s it! Simple right?

So, the place value of 423 is 100.

\begin{align} \frac{423}{100} \end{align}

which you will get 4.23. The you floor the number

1
  Math.floor(4.23); // 4

And then you multiple 4 with 100 to get the rounded number.

\begin{align} {400}\cdot{100} = {400} \end{align}

The problem is how are we going to get the place value of the number?

You want logarithm.

The idea of this is to reverse the operation of exponentiation. For example, the log10 of 423 is 2.62634036738 then 10^2.62634036738 equals 423. But you want the place value. You would need to round the 2.62634036738 which is going to be 2 then 10^2 is 100. There! you get the place value of the 4.

\begin{align} d = \lfloor\frac{n}{10^{\lfloor\log_{10} n \rfloor}} \rfloor \cdot 10^{\lfloor\log_{10} n\rfloor} \end{align}

Show me the code

1
2
3
4
n = 423
d = Math.floor(Math.log10(n))

Math.floor(n / Math.pow(10, d)) * Math.pow(10, d) // 400
Jan 16th, 2016

2016

Goals for 2016

I want to make this a habit for me that I want to make goals for every year and commit to them. So, here’s what I want to achieve in 2016.

Fitness, psychically and mentally.

I know everyone makes this a New Year resolution. But I really want to make this true this year. I’m not much overweight and I lift. I’m really into 5x5 program and I’ve just busted my plateau from last year. This year, I want to be more consistent. Another important thing is I’m going to run a marathon this year as I didn’t do it last year even if it’s just going to be me.

Progress 1. Squat 185lb 2. Oh Press 80lb 3. Deadlift 265lb 4. Barbell Row 170lb

I’d like to increase every move by at least 25lb by the end of this year.

The most important thing for me this year is my mental hygiene. When I was a monk, I used to meditate 30 minutes a day but once I got out of it I never did it. I’m going to make this my mission to meditate 10-15 minutes a day before going to bed. I added this as my daily habit on my habitica.

This resolution kinda sums everything that I want 2016 to be. I just want to be a happy me. If something’s going to create more stress I’m just going to say no.

Reach level of my fluency in Spanish

I’ve just started learning Spanish a couple months ago and I like the language. There’s levels of fluency but I want to be able to make at least basic conversation. I should be comfortable ordering meals in Spanish restaurants in New York city. I’m planning to travel in South America and I would like to be able to make conversation with local people. I don’t want to be able to read news or make business conversation.

Become a Data Scientist

It wouldn’t be complete without a technical goal. I’ve just changed my career as my interests in data grew. Now I’m a Data Engineer. My day to day job is to create and maintain data pipeline for an organization. I still build stuff but it’s just different product. I like my job now but I would like to get involved more in the science. I’m taking Statistics courses and learning some algorithms to analyse a large dataset. I don’t have a degree in maths so it’s going to be a challenge for me but hey challenge accepted.

Travel

I know this is everyone’s resolution. I have been to a lot of countries when I was working with ThoughtWorks. I’d like to go to less countries but spend more time to learn the culture and talking to local people. I used to just go to different countries to hangout by the bar or restaurant but this year I’m going to make less trips but more meaningful.

Jan 1st, 2016

Retrospective 2015

Reflections on 2015

  • I gotta say that my big win for 2015 is I deleted most of my social media accounts even I didn’t plan on doing that at all. I deleted my FB account a couple times in the past. I ended up getting it back. I increase Signal to Noise ration a lot by just deleting that. I used to spend at least 1-2 hour(s) on Facebook browsing what my friends have been doing. Sometimes, I got depressed because it seemed like all the people on Facebook they are on expensive vacation trips.

At first, I was worried because I wouldn’t be able to get in touch with some of my friends and family. But I still talk to my family. We have LINE Messanger which we share pictures and videos. And all of friends that want to contact me, they always find a way to contact me if they want to contact me. I didn’t feel left out at all.

One of the main reasons that I don’t seem to like Facebook as it’s been abused a lot. My mum is the best example, she reacts aggresively and unnecessary to political opinions.

  • I didn’t have any excuse for not running the Chicago Marathon but myself to blame. I didn’t train hard enough. I deferred it until 2016 and that would be my 2016 Resolutions.

  • I did learn Spanish. I signed up for the beginner class and now I’m on the second level. Yo hablo poco Espanol!

  • I didn’t learn to invest at all. But my knowledge on how to survive in the US has improved a lot (After spending almost $500 on my medical bill).

  • I went to Peru and it was awesome! I highly recommened anyone to do it.

Summary

Move to the US

I moved to the US a year ago. I didn’t regret the decision at all. I joined Fusion Media Network in 2015 as a Developer. However, as my curiosity in Data Science grows. I decided to join Condé Nast as a Data Engineer to quench my curiosity. It feels weird for the first month not building a website or web service. But I got to learn a whole new side of Engineering.

Kollaboration

I joined Kollaboration as a Technical Director to help out my friend. Unfortunetely, I failed on Time management and I didn’t have enough time to contribute. I’ll devote 2016 to improve my Time management skill.

Germany

I met with a bunch of ex-Thoughtworker friends in Germany and I had a blast. I realised how much I love spending time in Germany. I love Berlin and I love the culture over there. People are nice and the coffee is the best I’ve had anywhere. I also received the saddest news whilst I was in Germany.

Thailand

I spoke in Agile Tour Bangkok 2015. My talk wasn’t that popular because I was up against with some big names but I did send my message to the audience and I got some positive feedback.

Habit

I found the task management board that works for me. I didn’t say it’s the best because certainly it lacks a lot of features but it works for me. Will have to come up with another post for this one.

Dec 24th, 2015

Cosine Similarity for Dummies

Have you ever wonder how recommender system works? Or How Spotify or Amazon recommends what songs you might like or what product you might like to buy. I do. In this post, I’m going to try to explain how the recommendation algorithm works. First, let’s create a perfect scenario. I like to create an ideal example, it’s easier to understand.

Let’s say you have a very simple data of movies that users like collected from your site and you would like to match those people together based on their interests. How would you do that? One of the most popular methods is Cosine Similarity. When I first saw the name I was so confused; why Cosine? I remember when I was a kid I remembered my teacher told me about trigonometry so why does it have to do with that?

Here’s the sample data.

User 1 likes these movies

1
['Superman', 'Walking Dead', 'CSI']

User 2 likes these movies

1
['Superman', 'Walking Dead', 'CSI']

Even without any algorithm we can say that two users like the same movies. But we want the algorithm to tell us that the two users are very similar. Before we get into the mathematical formula world. We have to understand what a vector is?

What’s a vector?

In Pyhsics, a vector has two things; magnitude and direction which can be written as

I’d like to explain what a vector is but this site explains a lot better.

However, in Computer Science, 1-dimentional array is called a vector. But list in Python cannot perform vector operation so we have to use numpy or you have to build your own which I don’t recommend.

Now we know what a vector is but how does it relate to Cosine Similarity. In a nutshell, Cosine Similarity is a measure that calculates the cosine of the angle between them.

Cosine Similarity

In order to find the angle between the two vectors, we need to find the dot product of the two vectors as the formula below.

\begin{align} \text{cosine-similarity}(A,B) = \frac{\left<A,B\right>}{||A||\cdot||B||} \end{align}

Show me the code

Ok. enough about explanation, show me the code.

1
2
3
4
5
6
7
8
import numpy as np

def cosin_sim(v, w):
    return np.dot(v, w) / np.math.sqrt(np.dot(v, v) * np.dot(w, w))

# 1 if movie is in the list of movies and 0 is not. 
cosin_sim([1, 1, 1], [1, 1, 1])
# 1.0

In the perfect example, we can see that the two users have the same interests.

Python's Monkey Patch for Dummies

Alright, I’m going to cut to the chase here. I’m having problems with Monkey patching in Python and I want to make it clear for myself and anybody who might stumble upon my post in the future. So, what’s the big deal here?

Let’s say you have a model

models/person.py
1
2
3
4
def get_name():
	// Doing some database lookup
	// But I'm going to return a hard-coded name for now
	return 'John Doe'

And you have a Phonebook class that’s trying to access the database

models/phonebook.py
1
2
3
4
5
6
from models.person import get_name

class Phonebook(object):

    def lookup(self):
        return get_name()

Now, we know that get_name is accessing some database and we don’t want that to happen in unit test. We would like to stub that.

Coming from Java, I’d write my test like this.

tests/test_phonebook.py
1
2
3
4
5
6
7
8
9
from unittest import TestCase, mock
from models.phonebook import Phonebook

class PhonebookTestCase(TestCase):

    @mock.patch('models.person.get_name')
    def test_main(self, mock_person):
        mock_person.return_value = 'Another Name'
        self.assertEqual('Another Name', Phonebook().lookup())

It makes sense right? I want to stub something from models.person.get_name so I’m telling mock to stub that class but my test failed miserably.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
tests/test_phonebook.py F

=================================================================================== FAILURES ===================================================================================
_________________________________________________________________________ PhonebookTestCase.test_main __________________________________________________________________________

self = <tests.test_phonebook.PhonebookTestCase testMethod=test_main>, mock_person = <MagicMock name='get_name' id='4460968592'>

    @mock.patch('models.person.get_name')
    def test_main(self, mock_person):
        mock_person.return_value = 'Another Name'
>       self.assertEqual('Another Name', Phonebook().lookup())
E       AssertionError: 'Another Name' != 'John Doe'
E       - Another Name
E       + Noppanit

Why? Because patch behaves differently than what we expected. This is explained in Where to patch. I’m going to summarize for you. Basically, patch is going to take effect from where it is looked up… For me after reading that I’m still confused. I might be the only one who’s confused here so I’m going to continue writing.

If we take a closer look how import behaves in Python, it would be clearer.

models/phonebook.py
1
from models.person import get_name

The line says please import get_name to the namespace in models/phonebook.py. So, when we want to use it we can just called get_name() without having to write models.person.get_name() Now if you change your code to be

models/phonebook.py
1
2
3
4
5
6
import models.person

class Phonebook(object):

    def lookup(self):
        return models.person.get_name()

You test would pass. Because now our Phonebook is looking up models.person.get_name namespace instead of having function get_name being imported to its namespace.

Now if you want the old test to work, your patch has to be changed to

tests/test_phonebook.py
1
2
3
4
5
6
7
8
9
from unittest import TestCase, mock
from models.phonebook import Phonebook

class PhonebookTestCase(TestCase):

    @mock.patch('models.phonebook.get_name')
    def test_main(self, mock_person):
        mock_person.return_value = 'Another Name'
        self.assertEqual('Another Name', Phonebook().lookup())

That’s it for now. If you’re wondering why this is the case then looking at the source code of patch would help a lot. It’s using __import__ function.

Oct 25th, 2015

Why You Should or Should Not SSL Your Blog

After I switched to Octopress, I knew that I wanted to write about performance and SSL. Those are the main reasons why I switched.

Last year, Google announced that they will include Https as a single in their ranking. So, if you want to be the cool kid, go and SSL your site now. But what does SSL really do to your site? Have you seen that in action? I only know that from reading all the blog posts about this. In this blog, I’ll show you what SSL does to your site.

Thanks to my friend Suksant who helped me conducting the test.

What will you need?

  1. Wireshare is a network protocal analysis.

Simple website.

I’ve created a simple site that you can fake login form. So, you can go ahead and deploy that to your heroku. I chose Heroku as the platform of choice because you can try the site with and without SSL.

Setup your wireshark

There’s a couple things you need to do before you can capture the password.

  1. Open your wireshark and go to Capture -> Interfaces and click en0 that should be your Wifi connection.

Then click ‘Start’ to capture the packets

  1. In the Filter section, put this frame contains topsecret (That’s going to be your password)

Capture the password

  1. I deployed the application here. Go ahead and enter “username” in username and “topsecretpassword” in password It could be anything. Try to check if the URL is not SSL.

  1. Once you’ve submitted your password, you should see that Wireshark has captured something already.

without even trying to do anything hard. You can clearly see the password.

Now with SSL.

  1. Change your URL to be https:
  2. You will not find anything with your password on Wireshark

What gives?

In conclusion, what have we learned here? SSL encrypts everything being sent to the server will be encrypted. It’s safer and make the site more trustworthy. However, if you’re just running a blog you probably won’t need SSL. If you have a website that capture anything from the user then big ‘YES’ you need SSL. For me, I just want to be a cool kid so I SSLed my site.

Reference

  1. Wireshark tutorial
Oct 9th, 2015

Why Algorithm Matters?

If you have been to one of those technical interviews, you will like this.

I’m not going to rant about how broken the technical interviews are. There’s enough people who are more qualified to rant about this more than me.

So, why this matters? I just want to give a quick example of why algorithm matters. Please no haters! I know some of you might read this and will say “I do that all the time, what’s the big deal”. I’m still a bad developer and I’m still learning.

Scenario

You are a general, your home country is at war and you have to fight for your country. You are given a group of soldiers. You want to come up with a strategy to win the battle. Here’s the example of the soldiers.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

[
    {
        "category": "machine-gun",
        "id": 0,
        "name": "D408CF"
    },
    {
        "category": "machine-gun",
        "id": 1,
        "name": "C0BAD7"
    },
    {
        "category": "rocket-man",
        "id": 2,
        "name": "04B5E4"
    },
    {
        "category": "rocket-man",
        "id": 3,
        "name": "22F3CF"
    },
    {
        "category": "machine-gun",
        "id": 4,
        "name": "811E8A"
    }
    ,
    ...
]

You came out of a high-profile meeting and all the generals agree that this formation will be best to fight the enemy; infantry, machine-gun and rocket-man. How can I rearrange this quick enough because we’re going to attack tomorrow? Simple I go ahead and write the code.

First, let’s generate a bunch of soldiers

1
2
3
4
5
6
7
8
9
10
11
12
class Soldier(object):
    def __init__(self, id, name, category):
        self.id = id
        self.name = name
        self.category = category

number_of_soldier = 10000

soldiers = []
for i in range(0, number_of_soldier):
    name = str(uuid.uuid4().get_hex().upper()[0:6])
    soldiers.append(Soldier(i, name, random.choice(categories)))

Then let’s rearrange them.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import json
import uuid
import random
import time

categories = ['infantry', 'machine-gun', 'rocket-man']

start = time.time()
result = []
for c in categories:
    s_list = []
    for s in soldiers:
        if s.category == c:
            s_list.append(s)

    result.extend(s_list)
    s_list = []

end = time.time()
print(end - start)

It works, but you’re too late you can’t form the soldiers in time. If you take a closer look, this algorithm takes O(nm)* for the time complexity given the number of soldiers is n and the category is m. If you have a million soldiers and a million categories you would get O(n^2). How can we make this one faster?

Here’s my second version. Hmm, rearrange into category… category is bucket. How about using map?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from collections import defaultdict

start = time.time()
map_of_soldiers = defaultdict(list)

for s in soldiers:
    map_of_soldiers[s.category].append(s)

result = []
for c in categories:
    result.extend(map_of_soldiers.get(c))

end = time.time()
print(end - start)

This is the time difference of those two algorithms.

1
2
0.00743103027344
0.00331783294678

By just changing the data structure, you can see that the map version is almost twice as fast. I hope I can demostrate how choosing the right algorithm matters in your program.

Oct 8th, 2015

Octopress on Crack

I believe you will find a ton of blogs writing about makeing Octopress faster. I believe nearly everyone who migrated their blog to Octopress, the first post would be the migration and the next would be performance tuning. I want to be the cool kid so here you go.

Once you got out of WordPress now there’s much more you can do about your performance. But before you start, nothing can be done before you have the baseline numbers

Before

Here’s my before performance from Google PageSpeed.

And from webpagetest.org

In a nutshell, my page starts to render in 2.4s and finishes in 4s. Yikes! I wouldn’t even want to wait for my site to load. Let’s see where’s the lowest hanging fruit.

What about images?

A picture is worth a thousand words. Who doesn’t like image right? Also, I tend to have a lot of screenshots and they’re all PNGs. And they tend to be big. As they’re all screenshots so I don’t really care about losing some of the quality so I convert them to be jpg. If you’re using OSX, there’s a command that you can run.

1
sips -s format jpeg your_png.png --out your_pic.jpg

Now what can we do to reduce the size? There’s lots of tools out there that you can just throw your image in and it will compress the image for you. I use compressor.io. It’s really good. Just try throwing your image in there and see what happens. Compressor.io can reduce my images up to 60% and that saves a lot of bandwidth.

Minify CSS/JS

Fortunetely, I use Cloudflare and they have the feature to minify that for you. So, I just flipped the switch and it works like magic.

Browser caching

Going back to what Google PageSpeed tells us again. It complaints about Leverage browser caching. I’m lucky again because in Cloudflare you can set the cache to be 30 days and that seems to be ok for Google.

Inline CSS

I use Slash theme and when I look at the CSS, it’s only 22K. So why not just inline it and save one more request for the browser. So, in _includes/head.html you can change the line that includes your stylesheet to be.

html
1
2
3
<style>
		{\% include screen.css %} # delete '\' in front of % before you paste this snippet
	</style>

This might be different from theme to theme but it shouldn’t be difficult to find that out.

After

Now, let’s have a quick look at the after performance.

Here’s my after performance from Google PageSpeed.

It’s a lot better now but there’s one tiny problem with mobile which I’ll write another blog post about that.

Let’s have a look at webpagetest now.

A lot better! It’s still not the best but now my page loads within 0.5s and finishes in 1.9s. However, there’s still a lot to work on mobile.

I could shead about 200ms by not using SSL but I’m willing to compromise that with a little bit of security.

What’s next

I’d like to try hosting the images on S3 to see if that would speed up the load time. And I want to make the images responsive for mobile.

Oct 7th, 2015

Migrated From WordPress to Octopress

I have heard so much about Octopress but I haven’t got the time to actually get to know what it can offer. Finally, this week I finally made the time to migrate my blog to Octopress and I love it. Thanks to HabitRPG and Pomodoro (These will be another blog).

Don’t get me wrong I still love WordPress. In fact, I’m actually a WordPress Developer myself. However, for the post 9 years that I have noppanit.com I haven’t really used any of the WordPress features. What I really need is just a blog that I can write and publish. Octopress serves me well.

I’d like to thank Scott Muc that inspired me for this migration.

Here are some of the reasons why I migrated my blog to Octopress.

Hosting

Having a hosting is nice but it would be nicer if I don’t have to maintain it especially when I have to contact the customer service. Octopress gives you various choices of how to deploy your blog to. I chose to deploy my blog to Github as it’s the fatest and easiest option. I don’t need anything else just github.com which I use it everyday and a couple of command lines. Now, I don’t have to worry about upgrading my plugins or WordPress anymore. However, usually my hosting would do it for me if I haven’t updated for a long time.

Writing code snippet

I think this is personal, because any good WordPress developer might argue that you can do the same in WordPress editor which I agree. However, having written a lot of MarkDown on Github I’m just used to use codeblock like this.

1
// something amazing

WordPress gets on my nerves everytime when my blog crashed and all the identations of my code blocks failed.

Performance

There’s nothing faster than plain HTML. Well, that depends on your server. After deploying to Github pages all my posts are backed up and secured in Github. Then after that, it’s up to Github how fast they can deliver my HTML to the browser which I think it’s pretty fast.

One can argue that having WordPress properly tuned then you can get the same performance out of it as well. However, I just believe that Octopress is just easier to make changes. One reason relates to how limited your hosting can offer as well. Some of them are quite limited of how much you can do with the webserver without the dedicated server.

Here’s some of the performance breakdown which I haven’t tuned.

Before

noppanit.com performance

After

noppanit.github.io performance

The numbers don’t lie. After I switched to Octopress, my website renders in 1.392s. That’s without doing anything else. I’m going to write another blog post how I tune my blog to get the most out of it. WordPress is a great framework but when it comes to performance tuning, it requires a lot of hacking.

I have attached the link to webpagetest as well in case anybody is interested in more details.

No Database

Everybody knows that maintaining a database is a headache. Everytime you need to upgrade WordPress you need to backup database just in case something goes wrong and when you want to transfer the site you will need to do some hack to ensure that the data is transfered properly. However, one might argue that not having the database for Octopress can cause another migration a problem. If in the next year or two another blog framework comes along how will we integrate the data? I guess that’s the same question for WordPress as well. Personally, when the time comes I think somebody will create a plugin to transfer that. Open source is the best.

Problems

Here’s some of the problems I have encountered during the migration. All of them were minors and it didn’t take much time to resolve them.

  1. Code snippet wasn’t converted correctly. Some of the <code block got transfered during the export as pure HTML. So, I went through all my posts and convert it manually to Markdown format. It’s a plus for me so I took the opportunity to clean up old posts.
  2. One of my posts was encoded in UTF-8. I got lucky because it’s just one post. So, I didn’t have any problem with it.
  3. Disqus comment wasn’t visible. This is because during the export comments: true wasn’t added so I had to do it manually. This is my command to get it done.
1
2
brew install gsed
find . -type f -exec gsed -i "s/\(title: .*\)/\1\ncomments: true/" {} \;

You need to run this in your posts directory. It will add comments: true after the title

I got really lucky that I didn’t have many issues during the migration.

What tool did I use

  1. wordpress-to-jekyll-exporter This is an awesome tool. One click and I get everything including all the pictures I uploaded.
  2. Cloudflare This is for my SSL.

SSL

This is just me. You can do the same for WordPress as well. I think every blog I came across about migrating to Octopress on Github pages mentioned having SSL to their website. It’s the perfect solution with Cloudflare but it’s the best free option I can find on the Internet. If Github decides to support full SSL later, I’d be happy to switch.

It’s not for everyone

Octopress claims to be blogging framework for hackers and it’s true. You can’t just give Octopress to non-technical people and expect them to be fluent. I think that’s what WordPress’s good for. You need to be familiar with git and command line to get it setup and deployed.

Insipiration

  1. Migrating from WordPress to Octopress
Oct 2nd, 2015

Code Review With the World

TL;DR

If you don’t know Code Review Stackoverflow you gotta get on it now. It works and it’s awesome.

Longer version

In Agile world, everybody is talking about fail fast and faster feedback. If you’re a serious coder then code review and feedback are just as important. If you’re like me (maybe I’m alone), I used to hate code review so much because I don’t want someone to criticize my work, coding is like an art. You spent a lot of time on a piece of code and somebody just come in and say it sucks or why would you do something like that?. Not everybody is a great coder like Linus Torvalds or Ryan Dahl. Especially me, Because of rigorous code review I came from the worst coder every to bad coder (I’m still bad and I’m still learning). I believe the best way to learn any skill is first you have to be wrong and learn from your mistakes. The quickest way to do that is to code a lot and get your code reviewed by someone who’s a stronger coder than you, which you will have a lot on the Internet. If you work with some of the best programmers in your life then you’re lucky. But not everybody is that fortunate. I’ve found a better solution. http://codereview.stackexchange.com/

Let’s get to the meat

For example, I wrote this piece of code to learn about dynamic programming.

python
1
2
3
4
5
6
7
8
9
import sys
coins = [1, 3, 5]
min_coin = [sys.maxint] * 20
min_coin[] = 

for min_of_i in range(20):
    for c in coins:
        if c <= min_of_i and (min_coin[min_of_i - c] + 1 < min_coin[min_of_i]):
                min_coin[min_of_i] = min_coin[min_of_i - c] + 1

I know that my code is not bad (or maybe is really bad), but let’s see what I get out of it from this thread. From within a day I have at least 2-3 points to make my code a lot better. Not only that I learn more about Python, I also learn how to optimize the script.

If you want to learn a new language fast, you need to learn from the expert. In just a few days I improved my code substantially. The best thing about the Internet is, you will have someone to review the reviewer as well. So, you can be sure to some extent that the one who answered your question is trustworthy.

Now you might wonder, how about http://stackoverflow.com/? I use Stackoverflow too but Stackoverflow has its own purpose. If you’re stuck in some problem and you can’t really wrap your head around it posting to Stackoverflow will give you answer in no time. However, if you ask somebody on Stackoverflow to review your code, it’s likely that your thread will be voted down or closed.

What about if you only have an idea.

I always have new idea and somehow I want experts to review or confirm my idea so I don’t waste time building something that somebody has done it before. Then, Stackoverflow or codereview.stackoverflow.com is not really the place you’d go for. That’s what I love about Quora.com.

For example, I wanted to understand more about machine learning and I couldn’t really ask on stats.stackexchange.com. That’s why I turned to Quora. For example, this thread, I got a really detailed response from whom I can trust because of the number of upvotes.

Some note

I have one bad habit of just copying and pasting someone else’s code. Once you received the feedback, don’t just copy and paste that. Or if you get feedback from Github don’t just merge that right away. You will not fully understand the concept behind that. In the book I read recently, A Mind For Numbers, Barbara taught us about how we can master in math and science and she explains that we have two modes of learning, focused and diffuse mode. If you just copy and paste someone else’s work, then you just imagine that you understand what’s going on. The best way to learn that is to actually do it and go into diffuse mode which is just close your eyes and think about it and go back to focused mode to do that again. I made a big mistake as an Engineer (I still do) that I just copy someone else’s code and I think that I understand that fully which I don’t. So, don’t just copy the feedback and commit that make sure you fully understand the code and actually type it. Barbara also suggested that writing is better than just typing but I think it might be difficult for us programmers.

Sep 22nd, 2015