Tuesday, April 7, 2015

Swap Two Int Variables Without Extra Space

Swapping two int variables is a basic and common operation that every programmer all knows. I learnt it long time ago in the first C-language class during my undergraduate study. We can implement this function with C language as below:

void swap(int* a, int* b) {
 int temp = *a;
 *a = *b;
 *b = temp;
}
I have nothing to say about this. However, what if you were not allowed to apply for extra space, even if using one temporary variable is forbidden. What are you gonna do?

It seems tricky but quite simple once you learn it. I will try to enlighten you step by step until you touch the key. Here we go!

First, let's read the code. This is one of the implementations to deal with the swapping without any other space consumption.
void swap_1(int* a, int* b) {
    *a = *a + *b;
    *b = *a - *b;
    *a = *a - *b;
}
It looks fantastic at first glance. The idea behind that is to store the information of the two variables in one of them and extract each in such a proper way later. If you think the code is not so straightforward, you can assign integer values to both a and b and check the final result. Under most circumstances, it goes well. But it is not a perfect implementation. It has a fatal bug.

When a and b are large numbers or in other cases, it may cause data overflow. In a 32-bit environment, "int" occupies 4 bytes and ranges from -2^31 to 2^31-1 (the top bit is the sign symbol and -1 exists to leave a position for zero). If both a and b are so large that the sum of them exceeds the threshold, line 2 overflows the bound of the data type. So the problem does exist. How to deal with it? To move on, we have to talk about it at a lower lever by performing bitwise XOR (exclusive OR).

The same goes on. Code first!
void swap_2(int* a, int* b) {
    *a = *a ^ *b;
    *b = *a ^ *b;
    *a = *a ^ *b;
}
This version seems to be more difficult to understand. Don't worry. I'll explain it with example. Let me enumerate all the cases to prove it works.

1. a = 0 & b = 0
0 ^ 0 = 0;
It is obvious that after all the XORs a and b are zeros too. The swapping works. :)

2. a = 0 & b = 1
0 ^ 1 = 1;
1 ^ 1 = 0;
1 ^ 0 = 1;
The above corresponds to the code line 2 to 4. It results the right swapping as well. :P

3. a = 1 & b = 0
1 ^ 0 = 1;
1 ^ 0 = 1;
1 ^ 1 = 0;
Right again. -)

4. a = 1 & b = 1
1 ^ 1 = 0;
0 ^ 1 = 1;
0 ^ 1 = 1;
It goes the right way finally. ^^

Till now, we have enumerated all the cases for one bit number. No matter what a and b are and how large they become, in the lower lever they are stored in binary format. We can do the bitwise XORs as the above to swap them. No overflow. No bug. It is perfect!

Sometimes you may be asked to write the code within two lines or in only one line. It is quite easy if you know the grammar of C language. We can gather these 3 lines like this:
void swap_3(int* a, int* b) {
    *b ^= *a ^= *b;
    *a ^= *b;
}
Or like this in one line:
void swap_4(int* a, int* b)
{
    *a ^= *b ^= *a ^= *b;
}
In summary, exclusive OR is an interesting operation, which I regard as a magic wand. Since it is the bitwise operation in the lower lever, it is much more efficient to process. I illustrate it not in a theoretical way but simple and easy to understand. I hope after reading this post you could think of this trick when the road runs out. The exclusive OR may help you out!

p.s. A cuter way to implement this provided by the FB guy:
void swap_5(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}

Monday, March 30, 2015

A Good Resume For A Software Developer

Several weeks ago I got an opportunity to apply for a position of software engineer in Microsoft, the US Headquarter in Seattle. It was when I started to notice that I really needed to do some homework on my resume.

I wrote a version of resume during the undergraduate study. It's certainly not a good resume at all. I'll show you later.

It took me a whole week to tailor my resume and I revised it for 5 times. During this process, a book called "Cracking the Coding Interview", usually abbreviated as CTCI or CC, which I will quote some points from, taught me much. Additionally, a friend of mine, the fb guy, helped me a great deal. He acted as the resume screener and gave me suggestions again and again. I sent him the modified version in the evening and he returned the comments in the next morning. It lasted for a week. That was how my resume Came Out.

I summed up the main points as below. Hopefully they can bring you a good resume and benefit more people. :)

First of all, you should know what resume screeners look for. I regard it as a principle in resume writing.

Resume screeners look for the same things that interviewers do (from CTCI):
(1) Are you smart?
(2) Can you code?

That means you should try to present these two things as much as possible in your resume. In other words, anything else, such as your travelling experiences, your hobby, or the sports you love, makes little sense to your resume. However, there is no denying that such things may have something to do with your ability and could be an added bonus to you. Keep in mind that recruiters only spend a fixed amount of time (about 20- 30 seconds) in looking through your resume. What you should do is to present the most impressive items that could attract their attentions instantly in the limited space (one page of paper). They are not going to hire you as their fitness instructor or the tour guide. You are seeking for the position of software developer. So remember the principle above first and start to write your resume then.

Next I want to show you the points through the entire revision process of mine. I believe it is more intuitive and impressive to learn when you see all the different resumes at different stages and how they were revised over and over. There are SIX versions of my resume, indexed from v0 to v5. vo is the initial version I wrote during the undergraduate long time ago. v5 is the final version so far, which I think is good in terms of the experience of mine. I believe the final version of yours must be and will be much better than mine. (I covered part of the personal information in the resumes below and hope you can understand it. )

Resume v0
This is the first version of my resume, which I wrote more than two years ago. I have very little to say about this version because it is full of mistakes and problems. If it were not for the authenticity and integrity, I would not present it here.

? If you read it carefully enough, you will find there is a tiny but serious mistake in this version. Actually I hadn't found it until the third time I revised it. I will talk about this later to keep you guys guessing. :)

Resume v1
In the first modified version, there are mainly three changes I made. As a result, one out of them is wrong.

1. I added my photo here. WRONG. Here I should declare that it's just my opinion. Of course, you can do this. But I do not suggest doing so. You are applying for the software engineer, not for the front desk clerk. Keep the principle in mind. Can you code? Are you smart? Does it really matter for the software developer? I don't think so, at least not for the resume screener. Why don't you save the space for the more important things? So the conclusion from me is NO PHOTO. Besides, many companies require an online application except for the submission of resume, where you can upload the photo if you want.

2 & 3. I updated the education background and project experience. One point here is to show the proper project experience according to the position you apply for. It is definitely good to have rich project experience, but they must be the ones that can show your potential and ability in the future related positions. Additionally, you must prepare one story for each project in your resume. Specifically, you should tell the interviewer fluently about what you did in the project, what you learnt, what the biggest challenge you encountered, what the hardest bug you fixed, etc. Maybe you will have more than one edition of resumes if you want to apply for different positions.


Resume v2

After reading the related chapters in CTCI, I made several big changes and learnt a lot from the book. It is commonly right to read and learn something first when you start to do a thing that you are not familiar with.

1. In the education background, you can place your GPA and the ranking to show your great academic performance. But don't forget to write the benchmark. For GPA, please write it like xxx/4 to indicate the grading standard. In terms of the ranking, do give the ranking range. Whether you are ranked top 1 among 2 students or 200 students does count.

2. State what the project was, which languages or technologies it employed and whether it was an independent or team project (research project, course project or some other wording).

3 & 4. It's always a tricky thing to know which languages to list on your resume. List everything you know about or name just a few that you are really familiar with? CTCI taught me an important compromise that "list most languages you've used, but add your experience level." (expert? proficient? or prior experience?)

5. I used this special symbol to list items before. However, there is usually a prior process to automatically extract some basic information from the resume you submitted online. The system may go wrong or generate unexpected characters when it comes across such special symbols. So keep your resume in plain and try to avoid these particular cases. If you insist on doing so, please use the simplest dot symbol.

Resume v3
In this version, I want to show you two points that can help you beautify your resume effectively. One is good and the other is better.

1. Microsoft Word is pretty great for resumes if you know how to do it. The key is to create a multi-column layout and to do so by using tables. In fact, you can make your entire resume a giant 3-column table. You may also need to merge some columns together when necessary. At last remember to make your table borders invisible. Finally you'll have a nicely organized and easy-to-maintain resume at hand.

2. Instead of doing the 1st, you can just have a pretty layout of resume within seconds. Use TEMPLATES. There are various templates you can choose online and it is so easy to get one. Here I strongly recommend this version coming from CareerCup. Feel free to use it.

a resume template from careercup

? The answer to the question above: there is a spelling mistake in the first three versions which I didn't notice. CIRTIFICATIONS --> CERTIFICATIONS. Did you notice this? Keep in mind that read through your resume every time you revise it. Details determine the success.

Resume v4


It is still far from enough to have a template. There are many details you need to notice and adjust in the following.

1. Make sure you use a uniform font throughout the page. Adjust the font size in different positions. For example, the name of yours on the top should be in a large size. The titles should be a bit larger than the body below. In a word, make the font and size comfortable to read for people.

2. The period for each project should be listed in detail. You should avoid listing one project with a fairly long time (more than half a year) if you didn't do numerous tasks during such a long period. The interviewer may feel you went deeply in that project and had some in-depth understanding about it, since the period for that was quite long. If they ask about it and you can't show them what they really want to know, it will be a weak item that dilutes your resume.

3. Write strong bullets for each project, not a paragraph. You can discuss your accomplishments with the approach:" Accomplished A by implementing B which led to C." Keep in mind that it takes the recruiters less than half a minute to read through your resume. They don't have time and would not like to read your stories. List the most impressive bullets with a nicely organized sentence and don't waste one word or one letter.

4. Besides the languages I talked above, you can also list some software or technologies you are familiar with, such as Visual Studio (If you use C/C++), Eclipse (If you use Java), Microsoft SQL Server (or other databases), etc.

Resume v5
This is the final resume of mine so far. I'm satisfied with this kind of version. Compared to the first version, tremendous changes took place. However, it is still not a satisfying version for me, not because of the format but the content.

1. I don't have a good publication, at least an international recognized one, to support my research project. Although the publication doesn't mean a lot for the job hunting, a good publication may be a plus for me.

2. I have no internship experience. I'm not about to talk about the reason why I have no such experience. Due to the situations of mine, I cannot have it. But I suggest all of you applying for an intern, a related one before graduation. Needless to say, it is much more important than the others.

Finally, I hope everyone can maintain a good resume all the way along the career. No matter whether you are studying in university, seeking a job or working in a position, to keep your resume updated is like to draw a real-time picture of yourself, in which way you can see yourself clearly, know the pros and cons in time and better yourself in the right direction.

Monday, March 23, 2015

The First Phone Screen -- Alibaba (II)

Hi. Everyone. Welcome back. In this post I'll cut right to business. You know, the resume evaluation had been over. The day after that, the real first phone screen came. It was March 18, Wednesday, a sunny day. At 9:50, I went downstairs to the second floor, found a quiet area with few people around in the lobby, took my cellphone out of my pocket and kept staring at the screen. Time passed. 10:00. 10:02. 10:04. At 10:05, the phone rang.

"Hello. Is this Boyu? This is the one from Alibaba who made the appointment for the phone screen with you yesterday."
"Yes. Here is Boyu."
"Okay. Are you free? Shall we begin?"
"Sure."

The phone screen started like this. The interviewer asked me nine questions in total. The entire process lasted for almost 40 mins. In the end, I hung up the phone and found my cheek sweaty. I think that's probably because I kept my ear pressed against the phone so as to get every single word coming from the other end.

1. Please introduce yourself first.

2. The first technical question is coming. There are millions or even billions items online in Taobao Mall. For each item, it has a number indicating the views from customers. Now we need an algorithm to return the top 1000 items which have the most views.

The question sounds quite simple and common but I couldn't come up with a nice solution. An intuitive answer is to sort. However, it is not workable since the data are massive. The time complexity cannot meet the requirements. Another solution hit me then. Maybe I can select a small part of data with random sampling and sort the part of data to get an inexact result. I spoke out of my answer to the interviewer but he said he wanted the exact result. What should I do? How to get the top 1000 exactly and quickly? I asked myself dozens of times but still got no clues. I struggled to think of some other alternatives and I felt there was no one talking on the phone for nearly 2 or 3 mins. Suddenly, I was struck with another answer. I didn't have time to think about whether it was fairly good or not. As long as it could help me talk something out, that's good enough. That's all I thought of at that time. I said to the interviewer that I could count the number of digits for the views first. The bigger the views, the more the number of digits. Then only the views with most digits would be counted in the array to sort. To tell you the truth, I didn't know if it was an proper answer. As I said, it could have me talk and that's enough. The interviewer said, "Okay. Could you find some other solutions?" I ran out of words and I had to tell the interviewer that's all I got.

After I got back to my desk, I searched the question on the internet. I found this turned out to be a class of problems under massive data, called Top K problem. There are so many solutions that you can find there. I just extracted some keywords. It usually uses the heap or the red-black tree to solve this sort of question. I know heaps and I thought of this kind of data structure during the interview. But I didn't know how to use the heap to speed up this process and didn't mention a bit about it. For the red-black tree, I know nothing at all.

Here I learn a lesson. You must try to talk something out during the interview, even though you have not come up with a solution yet. Don't have the communication quiet. You can speak out your process of thought. You can mention at least the data structure you are going to use. Anything is helpful. If you don't talk, the interviewer knows nothing about you. If you talk out some pieces of the process of thought of yours, the interviewer knows what your brain is going on and he can lead you to the final step by step. If I had told the interviewer heaps might be useful to solve this question, he might have pointed something out to help me out or at least he would have known that I knew this kind of data structure.

3. He asked me what I learn about machine learning and data mining, the same question as the resume evaluation yesterday. As you see, how essential these two branches are for an algorithms engineer. I told him that I knew a little about them, which are the subjects I have been learning. He then asked me whether I knew some algorithms about classification and clustering. I know a little about the classifiers of Bayesian, Logistic and SVM. I was asked to tell the idea of SVM next. Here I should thank a professor called zzx, who was the teacher in charge of the class "Machine Learning" during the first semester for graduate. I took the class and learnt some basic concepts about classification and clustering through this. They came in handy at this time. Further, the interviewer wanted me to say the formula to be optimized in the problem of linear binary-class SVM. I didn't remember the details about the formula but I knew the optimal result could be solved by a method called "Lagrange Multiplier Method". Then he let me talk about the Logistic. I know the logistic function can map the data into an interval between 0 and 1. Nothing more. After that, he also let me talk something about clustering. Since I only know K-means, I talked the basic idea behind this algorithm to him. He then asked me if I knew hierarchical clustering. To be frank, I know nothing. :(

4. It turned to data mining in the following. "Have you heard of associate rule in data mining?" I don't know the name of this concept at all. I tried to understand this concept according to the literal sense. "NO." I got completely denied. Okay. Next question.

5. Do you know something about multi-thread safe? There are some stuffs that you cannot use in multi-thread. Could you point some out?
In the beginning, when I heard the word of multi-thread, I got excited and thought he would ask the same question as the resume evaluation did. But my heart sank when the phrase of "multi-thread safe" came out. I've never heard of anything about multi-thread safe though I have been using JAVA to start multi-thread programs for almost one year.

6. I didn't know if it was because I got no answer for the questions for a long time. The man asked me a very easy question here, which was the only one that I got the right answer during this interview. "There is a binary tree. Each node stores one letter. How to output all the paths from the root node to the leaf nodes?"
I'm not going to discuss this. There are various ways to get the result, recursive or non-recursive. I believe you know at least one of them. Otherwise, go and find any kind of Data Structure textbook to look it up.

7. The last technical question was a classic one. The moment he said there was a string of letters "ABCDEFG", I noticed it was the problem of Longest Common Subsequence (LCS). I also realized that I forgot how to deal with it with the optimal method. I even forgot the optimal solution was DP (Dynamic Programming). What a shame! I was taught this both in the undergraduate and the post-graduate. I really ought to learn algorithms from the bottom up.

8. What's do you think your biggest advantage and disadvantage?
It's the behavioral question that every interviewee should make preparation for. Remember to write something down about these sort of questions. "During the projects you participated in before, what you enjoyed most or least, what you considered most challenging, what you learnt, what the hardest bug was, etc." They are as important as the technical questions.

9. "Do you have any questions to ask me?" This was the last question.

You've guessed it. Yes. I got rejected in the evening on the same day. I had been prepared for that. Although I screwed up it, I learnt that there was a long way to go in my career seeking. It's okay to fail the first time, not to mention I haven't started to prepare yet. All I can say is that look forward and keep going. GO GO Fighting!

Friday, March 20, 2015

The First Phone Screen -- Alibaba (I)

On Tuesday, I received the first phone screen of mine. It was a referral from a company insider who is an alumnus of Beihang University and works in Alibaba after graduation. The position I applied for was algorithms engineer. It can be summed up in such one sentence:

I screwed up my first phone screen from Alibaba!

That's all for my story here. Thanks for reading.

Hahaha. Okay. Get to the point and the "true story" has just begun. It is the truth that I screwed it up but I really learnt a lot from it. Keep reading and I promise you will find the points at last. It's a real eye-opener to me.

After I got the referral, I was asked to fill up a form online, providing some basic information of mine and then waiting for the interview arrangement. Here I have to praise Alibaba for its high efficiency of the interview arrangement. I submitted the application form online in the afternoon on that Tuesday and my phone rang in the evening on the same day. “Is it Boyu? Here is the Department of Big Data Application of Alibaba. Are you free to talk?” Wow! The amazing efficiency impressed me. I had expected the phone call would come in a few days, maybe in a week, but it was in a few HOURS.

It was not the first phone screen but a resume evaluation in front. The interviewer didn't ask me any real questions that need to be thought about but a few warm-up questions to know more about me.

1. Please introduce yourself first.

2. What 's your research field? Do you have any achievement on your research? Talk more about your research, please.
I didn't put my research experience on my resume. I thought it's not very important for the job hunting because what I want to apply for is a job in company, not a position in university or research institute. Project experience is much more significant I thought. That was the first mistake I made. After listening to my talk about the research of mine during the post-graduate study, the interviewer wondered and asked me why I hadn't put all these on my resume. From then on, I realize that the research experience is also a part of the project experience. As a graduate student, the research is an essential part of my study, accounting for up to half of my study. This is the first point I learnt from the phone screen. The interviewer was so nice that he suggested me some advice of how to write my project experience on the resume. According to different positions you apply for, you can customize various resumes respectively. For software engineer, you can put more software project development experience on. For algorithms engineer, you can write more research experience, if there is some correlation between your research and the position. Anyway, both your research experience and the project experience should be put on the resume.

3. He then asked me some questions about the project experience as I wrote on the resume. Could you talk about what you did in the project? What did you do during the development of the project?
Remember, the more detailed, the better. I'm in charge of the development of the underlying service. NO! Try to elaborate the job you did like what tools you used during the whole process, what language you used, what the entire process is, what problem you encountered, what you did to solve it...... The interviewer wants to learn the details about the job your did in the project, the real technical details you used and master.

4. Do you know some algorithms in machine learning?
I can talk about some basic concepts in machine learning. However, when it comes to the details, I know nothing. There are two branches that you must know a little about if you want to apply for the position of algorithms engineer: Machine Learning and Data Mining.

5. Do you know something about "Recommender System"? What algorithms are mainly used in the recommender recently?
I know the recommender system is very hot in these companies nowadays. I only know a little about a simple mechanism called collaborative filtering. The interviewer told me the recommender is the major job his department being in charge of. If you want to apply for a position in that department as a software engineer or an algorithms engineer, you should learn something on it.

6. The only question he asked about the technique was one about multithreading in java, which was the only one I didn't answer up. "What is the difference between Thread and Runnable?"
I have used both Runnable and Thread during the development of the project before. This question is very basic in the field of multithreading in java and I believe I searched it on the internet long time ago. But I totally forgot what the difference there is. 

7. At last, the interviewer asked me whether I had some questions.

So here is the entire process of the resume evaluation. From the above, I learn the basic procedure in the resume evaluation, begun with self-introduction and ended up with "Do you have some questions to ask me?". During the evaluation, the interviewer often asks some questions about the resume, about what you write on it. The interviewer wants to know more about you through the talking, to learn what you really did in the previous projects and what you truly master.

It's a coincidence that I had such a referral from Alibaba. I happened to see a notice in a group chatting in the morning on that Tuesday. I filled up the form without any expectation of success. I haven't made any preparation for it yet. But I cherish this opportunity. No matter whether it is the company I really want to go into, I will apply for a position in it as long as I get the chance. Every phone screen or on-site interview I receive is a chance to learn the real world of the job interview. No matter how many questions I can answer up, I can write down all the questions and make it up afterward. It is an invaluable opportunity that I should seize to learn more. Cherish every chance to go to the front.

Till now it's just the part of my resume evaluation, not the first phone screen I screwed up. I'm sorry there are so many words I want to say before it. But they are very helpful to you, right? :) The REAL fist phone screen will come in the next post and here is some preview about it. Leave your comment and remember to come back soon.

PREVIEW:
The first phone screen came just on the next morning, at 10:05 am.
I only answered up one question completely during the entire interview.
It lasted for almost 40 mins.
I SCREWED it up totally.

Sunday, March 15, 2015

The Chase of a Dream

Hi. I'm very happy that you are reading my post. Glad to know you. I have never written such posts before, especially in English and this is the first post of mine. I will try to express myself here and share more useful with you.

I'm from Beijing, China. My family is in Yanqing at the foot of the Great Wall. I received my Bachelor degree in computer science in 2013 from Beihang University, Beijing. After that I continued to pursue my Master degree in the same major and the same university. It is the last academic year and I will be graduated in Jan, 2016.

Since my graduation is less than a year away, I urgently need to better myself in technical skills so as to face the challenge of job hunting. It's actually about the chase a dream of mine:

To tell you the truth, I have never made a real choice, following my heart, before. The first choice I made was about the National College Entrance Examination in China. I needed to choose which university I wanted to attend and which subject I'd like to major in. I didn't know which I was interested in. Weird, but it was real. In fact I would like to do almost everything and I nearly have no preference. If you want me to do it, I can do it and maybe I can also do it very well. I chose a good university, i.e., Beihang University, according to my estimated scores and chose the best subject in that university as my major, that is computer science.

The second choice was about where to go after Bachelor graduated. At that time, I got the recommendation from the School of Computer Science and could continue to pursue my Master degree without any written examination or interview. I could continue to study or seek a job directly. At last I chose to study. But it was not something with regard to my interest or my heart. It was just because I could pursue my Master degree without any examination.

From then on, a real dream has been calling me from my deep heart. I want to go abroad. I asked myself several times and the answer has been determined. It's not something about how good the environment abroad is, how clean the air abroad is, or how much money I can earn abroad. It's about a dream in my deep heart. I would like to experience the life abroad and taste the flavor of life there. The older I am, the more constraints I have. I am young now. Why don't I have a try right now! I don't know if you ever hear about YOLO. You Only Live Once. If you have something that you really want to do, just do it and don't hesitate. I admit that I regret not to study abroad after graduation. But you cannot look behind in regret all the time. You should look forward and do some changes if you really want to. So my third choice, exactly my first real choice is coming. I want to work abroad.

It's far not enough to make a real choice. The thing that really matters is what you are going to do with regard to your choice. Since I don't have any education background abroad, it's very difficult to seek a job abroad. But it doesn't mean there is no way. Computer science has been very popular all over the world recently and the social demand for talents in cs mushrooms. FLAG (Facebook, LinkedIn, Amazon and Google) have the global recruitment. That will be an open window at me. Of course these four companies are the top ones in my list. I think it's a bit early to study the companies about where to go but it’s time to prepare the interview right now. Although it’s much more difficult for me to seek a job abroad directly, I believe as long as I fully prepare for it, there will be a position left for me. The more fully prepared, the more chances there will be.

Here I should thank a friend of mine, fjc, who is a very talented man in cs and has been honored with lots of titles in programming. He has got the offer from Facebook in US. He shared a lot about the coding interview in US and gave me many useful suggestions about what to do for preparation. Since most of the top IT companies, especially the FLAG, pay much attention to the coding capability, it’s very important to be skilled at coding. The education is not my advantage but if I make full preparation for the coding, it will be a knocking brick to get me in the door.

When it comes to the intention of starting the blog, it should be in the following three aspects. The first is from fjc’s suggestion. It’s necessary to cover as many as possible coding questions that have been examined during the previous interviews. More importantly, whether you can express yourself, telling the man why your codes are like this, what is the advantage in time and space complexity, should be also taken into consideration. Sometimes your code can get through all the online judgement but you cannot express your thoughts clearly enough to the interviewer. There are something unknown left in the codes, which may be the key points you need to solve other problems. To start a blog, I want to write all I learn after I solve one coding question. I will try to finish one coding question on my own and read some reference related online or some other better codes. It will impress me and help me learn more coding skills I believe. The second is about English. I want to work abroad. English is a very basic ability that I should be good at. Through this, I can practice to express something related to the coding in English, which is very helpful not only to the interview but also to the work abroad in the future. The third is about pushing. There are many coding questions waiting for me to solve and there are a lot of skills that I need to grasp. A significant thing here is perseverance. It’s the key to determine whether you can make real progress and to distinguish competitors. You can insist on doing this for one week? You can insist on doing this for one month? You can insist on doing this for one year? The blog to some extend plays a role in pushing me. It acts as the boss of mine. I plan to write a post twice a week. If I want to write something, I need to learn something first. It motivates me to code and learn persistently. No Pain No Gain. Keep doing one thing and you will find a new world.

I want to thank another friend of mine at last, ly, who is very talented in almost everything except study. He works in an IT company called Sunbridge in Tokyo. He is the one who suggested me using “blogger” to write posts online. Although I just started to use it, I find it is really convenient and cool. If someone who is in charge of the advertising department of blogger happens to read my post, I strongly suggest that he should offer ly a big amount of money. He is a perfect advertiser for blogger. I mean it. Don’t you think so!

I have many talented friends, some in programming, some in research, some in games, some in sports...... More friends of mine will be put on the blog. More stories will be shared here. It's the pride of my life to have all of them around me. (gzc, are you here? Remember to tell me as soon as you get the offer from Google. Oh, Amazon is also okay. I'm waiting right here. :P Seriously, go go fighting. I believe you can. Find a good job and live a good life there.)

This post is like a preface in a book. The Chapter One is coming soon. The chase of a dream begins. Thank you for your reading and hopefully you can follow my blog from now on. I will try my best to share what I can with all of you and I’m looking forward to your advice or any other suggestions about the coding or the job hunting. Anything is welcome here. Have a nice day!