My life as a Ph.D. student, S01E03: Coursework so far

Apparently PhD students hate coursework, especially those irrelevant to their research. In CSCI-697 when every new PhD student is asked to introduce themself – including the thing that they are most and least looking forward to do, many mentioned coursework for the latter.

But I guess that really does not have anything to do with academic level, because every student hate coursework! Some student next door in my apartment building could party till after midnight even when the next day is a workday. Some people are not coming to the college to study! I won’t say that we don’t have those people in Tsinghua, but at least I didn’t personally know any.

I took CSCI-670 “Advanced Analysis of Algorithms”this semester. I didn’t really  expect to learn much new knowledge. How advanced could it be? For many people, network flows are already pretty advanced. But for someone competed in algorithm contests in high school, even the mediocre ones like me, that’s a piece of cake.

Then, it turned out that – I’m not looking in the right direction. That’s one problem with a lot of algorithm contest competitors. What we take as advanced algorithms are really just difficult, delicate, cleverly constructed to solve a puzzle rather than a practical problem, and does not involve advanced mathematics.

Just as suggested by the name of the course, the advanced thing really is in the analysis. The algorithm itself could be pretty straightforward to implement. And the purpose of the course is not to teach you how to design algorithms. It talks about ideas not seen in basic algorithms and those delicate ones.

Our first topic is – PageRank. That’s an unexpected one! Isn’t that as simple as solving a linear system? That’s what we learned from our undergraduate network science course. Yes, but solving a linear system is not simple anymore when you have a billion variables! That’s the first important idea we are taught. In the world of big data, you need to change the way you see things. The data is there, but you can’t access all of it at once. You want to know something mathematically defined. How do you do it? you sample.

But sampling alone does not solve the problem. To calculate the exact PageRank you need to know the whole network anyway. So there is the second important idea: you don’t need to know everything exactly with full confidence to do useful things. Tolerating an error margin and a small chance of failure makes intractable problems tractable.

That’s like polling. To know exactly who’s gonna to be the president you need to ask pretty much everyone’s opinion. But if you allow an error of several percent, you just need to ask several thousands of people if you sample them from the correct distribution.

In our case, instead of the exact PageRank of each node, we want a set of significant nodes, with the property that any node with PageRank ≥ Δ is in the set and any node with PageRank ≤ Δ/2 is not in it, with high probability. For those node with PageRank in between, they can either be in or not in the output.

The gap is where the magic lies in. As long as the lower threshold is a constant fraction of the higher threshold, the problem is tractable, and after a lengthy mathematical analysis (that span several 2-hour lectures), it all boiled down to just randomly selecting some nodes, actually do the PageRank random walk, and record some frequency.

And the mathematical tool we used is the Chernoff bound. We learned that in our Mathematics for Computer Science course (taught by Yao himself!) in my freshman year, and in every theory related course we review it. It is no doubt the second most useful thing we learned in MfCS! (Wondering what’s the most useful thing? this course is unofficially known as LaTex Typesetting for Computer Science). It is in the same spirit of Markov’s and Chebyshev’s inequalities and the central limit theorem and looks quite fundamental, so I expected it to be as old. To my surprise, it is quite new in the sense that its namesake, Herman Chernoff, is still alive! And judging by the reaction when our lecturer said that he once met Chernoff in person in MIT, most other students are surprised too.

We are now on the second topic, the clustering problem. We will be constructing the k-nearest neighbor graph in arbitrary dimension in time O(n log^2 n), and the whole solution involved solving some quite varied problems.

It had something to do with the kissing number problem! That was another unexpected thing. I read about that problem in a discrete geometry book years ago, and now I know that it is more than a pure curiosity. Its solution is also interesting – we know the exact solution only in dimension d = 1, 2, 3, 4, 8 and 24! What an odd sequence! I know the 8 and 24 case have something to do with certain special lattices. I wish I were better at abstract algebra so that I can appreciate them!

Another related problem is – if you drive across Minnesota, the state of then thousand lakes, how many of them could you expect to see? The student that guessed 100 definitely had some good intuitions! We formulated an idealized version of the problem: if you have n non-overlapping circles on a sphere, then regardless of the configuration of the circles, a random great circle would in expectation cut through no more than 2√n of them. I actually proved this myself! I guess my mathematics is not bad after all.

And then yet another related problem – to pick the exact medium of n numbers you have to go through all of them. But what if you are doing divide-and-conquer and just need to pick some number close enough to the medium with high confidence? By iterative-middle-of-three method, with a constant error margin and failure rate the number of numbers we need to see is a constant regardless of n! Again we see the power of allowing error margin and chance of failure.

That’s pretty much everything up until now. No mind-blogging mathematics, but different ways of looking at the problem and putting everything together.

Thoughts on how to formulate a Rubik’s Cube

Formulating Rubik’s Cubes and other sequential move puzzles is one thing that I have been thinking for a long time.

I learned how to solve a Rubik’s Cube when I was 13. But I’ve never been a speed-solving type of player, even now, I’m still using the most elementary methods and can barely solve a Rubik’s Cube in 50 seconds. My interest is in making cool patterns and collecting and solving puzzles of different shape and structure.

As a CS student it’s quite natural to want to write programs for everything you find worthy of doing with a computer. And so I wanted to write a Rubik’s Cube simulator! Not just a simple one, but one with which you can simulate any combinatoric puzzle – one to rule them all!

Then we are faced with the problem of how to represent these puzzles. They must be machine-readable, of course. Then I think it should be friendly to a human user. It should not only be human-readable: it is intended to be primarily hand-written, so it must be made sense easily, be concise in syntax, not tedious to write, but still with immense expressing power. That will make most existing formats undesirable: with xml you will probably end up writing more tags than useful content, and with json there is no structure.

Then, on some day last year, I found the key! What makes it possible to describe the complex structure of a combinatoric puzzle concisely is its symmetry. I started working at once and after several weeks I’ve got a simple parser for my custom cube description language and a simple simulator. The syntax resembles a general purpose programming language but much simpler.

Then it’s time for graduate school applications and I put that project aside. Now that I have some spare time, I’d like to pick it up.

Actually I want to start from scratch again. The last time, I didn’t even write a specification for my language. Implementing a language without a specification, that’s like writing a program without comment, only worse. And after a year I’ve got a lot of new thoughts on how to describe and implement a puzzle, so the basic mechanism of my program would probably change.

And my rendering was done in OpenGL 1 style (primarily due to the lack of good tutorials on OpenGL 3+). That definitely need to be changed.

This time, I’ll write the specification of my custom cube description language before writing the parser and explain all the ideas behind it, and provide annotated examples, so that someone other than me can actually understand this language and use it to model puzzles. Hopefully it will finally become a useful tool for those hobbyists who can not afford to by expensive puzzles.

(And this will also be the first project of Martian Computing Research! Wait for more to come, ahahaha!)

Here as the first part of the documentation I’ll explain the central idea of my design by trying to formulate the definition of the original Rubik’s Cube. The syntax here is not what actually used in the language, it just serves to illustrate the idea.

First, we will want to define all the blocks. Following the convention, we name the faces U (up), R (right), F (front), D (down), L (left) and B (back). It seems logical to simply name each block by all the faces it touches. Then we get something like this:

block U, D, R, L, F, B; // The center blocks
block UR, UL, UF, UB, DR, DL, DF, DB, RF, RB, LF, LB; // The edge blocks
block URF, UFL, ULB, UBR, DFR, DLF, DBL, DRB; // The corner blocks.

There are some ambiguities in the ordering of faces when one block touches multiple faces, but for now we just pick an arbitrary one.

Then we will want to define all possible states of a block. Here, a state is just a position and an orientation. The set of positions is the same as the set of blocks. How about the orientations? We could have something like position name plus rotation angle:

state UR, UR+180;
state URF, URF+120, URF+240;

But after a second thought we found that it would be a good idea to just cycle the face order of the name of a block to get names of states:

state UR, RU;
state URF, RFU, FUR;

This is logical since the number of orientations of a block is determined by the number of faces it touches. Note that “block URF is in state RFU” means that the U sticker on block URF is on face R, etc., so rotating a corner block 120 degrees clockwise correspond to cycle the face names in the state name backwards 1 step. This form also give us a lot of advantages. If block URF is at its own position, its rotation angle is obvious. What if it is at another position, say position DBL, with its U sticker on face L? There is no straightforward definition of rotation angle. With this form, we can get rid of rotation angle: since U sticker is on face L, R sticker is on face D and F sticker is on face B, block URF must be in state LDB! Actually this give us a meaningful definition of rotation angle: state name LDB is obtained by cycling position name DBL backward 2 steps, so the rotation angle is defined to be 240 degrees! Once we have defined rotation angle for every block in every position, we can verify that the sum of rotation angles of all blocks (modulus 360) is invariant under any operation, which is an important step in proving the total number of possible states of a Rubik’s cube.

Finally we will want to define all the operations. An operation moves blocks and change their states, so its definition comes in two parts: a geometric transformation and a table of state changes:

operation U {
    axis (0, 0, 1); // Assume that x axis points forawrds,
                    // y axis points rightwards and
                    // z axis points upwards
    angle -90;      // In mathematics positive angle usually
                    // means counterclockwise
    UR -> UF;
    RU -> FU;
    UB -> UR;
    BU -> RU;
    URF -> UFL;
    RFU -> FLU;
    FUR -> LUF;
    UBR -> URF;
    U -> U;         // The state does not change but geometric
                    // transformation still apply to block U
                    // so we include it.

If you know something about combinatorics, you should know that the change of states is actually a permutation. So we can write it more concisely in cycle notation:

operation U {
    axis (0, 0, 1);
    angle -90;
    state_cycle (UR, UF, UL, UB);
    state_cycle (RU, FU, LU, BU);
    state_cycle (URF, UFL, ULB, UBR);
    state_cycle (RFU, FLU, LBU, BRU);
    state_cycle (FUR, LUF, BUL, RUB);
    state_cycle (U);

We will then need to write this for every other operation! The inverse operations (U’, etc.) can be easily inferred by reversing the direction of the rotation and cycle so we don’t need to write them explicitly, but that’s still a lot of work! After that, we will have a full definition of a Rubik’s Cube.

Somehow we can feel the redundancy. But this redundancy is not like manually assigning the same value to each entry in a long array, which can easily be simplified with a for-loop. It is the result of the intrinsic symmetry, both geometric and algebraic, of the Rubik’s Cube. Actually, the Rubik’s Cube is probably the best real-life example of an object with a complex symmetry. If you check the “Group theory” article on Wikipedia, you can find a Rubik’s Cube right there on the beginning of the page!

But we only need a tiny portion of what group theory has to offer. We just focus on how the formulation of a Rubik’s Cube could be simplified.

Consider defining operation R. It would be good if we can just “rotate” the definition of operation U by -90 degrees around the x axis. What do we need to do this “rotation”? We need to rotate the axis around which operation U rotate the blocks (yes, we rotate a rotation!) and change the state names in the permutation such that U changes to R, R changes to D, etc., i.e. we do a permutation of face names. (And again, yes, we permute a permutation!) Let’s try it:

meta_rotation x {
    axis (1, 0, 0);
    angle -90;
    face_cycle (U, R, D, L);

apply this to operation U, we get something like:

operation R {
    axis (0, 1, 0);
    angle -90;
    state_cycle (RD, RF, RU, RB);
    state_cycle (DR, FR, UR, BR);
    state_cycle (RDF, RFU, RUB, RBD);
    state_cycle (DFR, FUR, UBR, BDR);
    state_cycle (FRD, URF, BRU, DRB);
    state_cycle (R);

Yes! this exactly what we wanted. Apply this meta-rotation twice more and we get the definitions of operations D and L. We can similarly define meta-rotations around other axes:

meta_rotation y {
    axis (0, 1, 0);
    angle -90;
    face_cycle (F, U, B, D);
meta_rotation z {
    axis (0, 0, 1);
    angle -90;
    face_cycle (R, F, L, B);

Apply y to operation U, we get definitions of operations F and B.

What if we apply z? Well, we get essentially the same definition of operation U, but it does look a bit different:

operation U {
    axis (0, 0, 1);
    angle -90;
    state_cycle (UF, UL, UB, UR);
    state_cycle (FU, LU, BU, RU);
    state_cycle (UFL, ULB, UBR, URF);
    state_cycle (FLU, LBU, BRU, RFU);
    state_cycle (LUF, BUL, RUB, FUR);
    state_cycle (U);

The state orders in the state cycle have changed! What does this tell us? We only need to say UR -> UF, then UF -> UL -> UB -> UR can all be generated by applying the appropriate meta-rotation! So to get the definition of all operations, we only need a part of one definition! We will get something like this:

apply (x, xx, xxx, y, yyy) {
    apply (z, zz, zzz) {
        operation U {
            axis (0, 0, 1);
            angle -90;
            U -> U;
            UR -> UF;
            RU -> FU;
            URF -> UFL;
            RFU -> FLU;
            FUR -> LUF;

If you know a bit about symmetry groups, you can see that we are actually applying the whole chiral octahedral symmetry group O to the minimal part of definition to get the full definition. the group O is of order 24 and here we are only explicitly writing out 1/24 of the full definition. Group O can be generated by any two of x, y and z, so we may write our definition as

generate_group (x, y) {
    operation U {
        axis (0, 0, 1);
        angle -90;
        U -> U;
        UR -> UF;
        RU -> FU;
        URF -> UFL;
        RFU -> FLU;
        FUR -> LUF;

Comparing to the whole lot of things we need to write without symmetry, this is a big step forward.

We can also simplify the definition of states in the same way:

generate_group (x, y) {
    state U, UR, URF;

And also blocks. But this time we get URF, RFU and FUR which is actually the same block. But that’s not a problem, we can just do some tricks in the syntax if we really want to implement such a cube description language and allow blocks to have aliases:

generate_group (x, y) {
    block U;
    block UR alias RU;
    block URF alias RFU;

Note that we don’t need to write this explicitly

block URF alias FUR;

Because that will also be automatically generated for us!

Now we can write the definition of a Rubik’s Cube in full:

meta_rotation x {
    axis (1, 0, 0);
    angle -90;
    face_cycle (U, R, D, L);

meta_rotation y {
    axis (0, 1, 0);
    angle -90;
    face_cycle (F, U, B, D);

generate_group (x, y) {
    state U, UR, URF;
    block U, UR alias RU, URF alias RFU;
    operation U {
        axis (0, 0, 1);
        angle -90;
        U -> U, UR -> UF, RU -> FU;
        URF -> UFL, RFU -> FLU, FUR -> LUF;

So simple! But this still is an “abstract” definition, to actually be able to visually simulate a Rubik’s Cube we need geometric models. But even that can be simplified. Remember that we have geometric transformations in our meta-rotation definition. We can define the 3D model, sticker color, etc. for one of each different kind of block and the rest will be handled by the symmetry group! One we get the idea of how to simplify the definition, adding more features is just a matter of syntax.

When Jesus come to find you

(I’m a catholic. No, I don’t believe in god, I’m a cat-holic, nyahahaha!)

I know that the United States is a religious country. In god they trust. But being confronted by a Christian Taiwanese immigrant asking if you are interested in hearing from Jesus was not something to be expected on the very first day after arriving here.

I did meet a few Christian people back in China. I knew a girl who is Catholic. When I was in high school, a neon Christian cross presumably belonging to a Protestant church can be seen from my dorm building. (I also knew an American teacher who is a Mormon, but that’s not Christianity anymore, right?)

Generally, in China, those Catholic people who try to sell me their belief piss me off. And those politics, those freedom of religion and human right thing involved there, pissed me off even more. There is no God and I don’t even care about what you are doing!

But this time, they did made me interested in what they are doing. Yes, that’s how you sell your belief! Be friendly and helpful and avoid talking about anything explicitly religious at first, instead of going straight to the (pointless) point.

So I paid several visits to their church. It is just a home church of Chinese Protestants, mostly students or alumni of USC. They does not seem to belong to any denomination, but I think they are affiliated with other such groups.

We ate food, read the Bible and sang hymns. That’s fine for me, does not sound so religious. But some new students has gone as far as getting baptized.

Do I believe in God, or in Jesus? Definitely not. I might not be bold enough to self identify as an atheist, but at least I’m an agnostic. I’d say I’m interested in the religion itself rather than believing it.

I do think, though, those people in the church are much better than an average Chinese person I may meet. Do they become good people because of their belief? It would be hard to give a scientific answer.

My life as a Ph.D. student, S01E02: because nearning is the key!

(Wait, shouldn’t that word be “learning”?)

(And how many keys do we have in the lab?)

Ugh, I hate machine learning. Deep learning especially.

I met machine learning for the first time when I was a freshman. Andrew Ng (I don’t need to introduce this guy, I guess) came to Tsinghua and gave a lecture about his work. It was so fascinating.

But when I got to work with machine learning for the first time, it was not so pleasant. We had a machine learning course. The lecturer is a theorist, with high self-esteem. (He asked which book did we use for our theory course. When someone mentioned that classic book by Sipser, he said we should at least use Modern Approach!) The course was mostly about proving one bound after another, and now I can remember none of them! We did have fun looking at some machine learning problems from a nonlinear programming or even game theoretic point of view, though. The only algorithm mentioned in the course was (kernel-) SVM, and that was not without a ton of theoretic analysis.

And he hates deep learning. He mentioned it only once, in the concluding part of the course, only to downplay it with sarcasm. Are all machine learning theorists like that?

(BTW the TA seemed to be a super lazy otaku girl)

And then, after learning abstract things for the whole semester, the final course project was a concrete one – to solve one problem on Kaggle! I don’t even have a decent learning algorithm in my repository.

But, challenge accepted!

And the result – it did not give me frustration. It gave me cancer. My best score on the benchmark (which is a mediocre one) was achieved with bugged code. Only after the course project deadline was I able to get a better score with a correct program.

Those with the best results were doing intern at an alumni’s computer vision startup. Surely, you can’t hope to beat state-of-the-art deep neural networks implemented with a powerful framework deployed on a cluster with your crappy hand-written naive algorithm running on your laptop!

What’s after that? The next semester, when I found out that that computational biology course is all about machine learning, I quit immediately. (Seriously, discovering new interaction between proteins and existing drugs by doing text mining on existing literature sounds just ridiculous.)

Well, I don’t really hate machine learning itself. It really is powerful. What I don’t like is the way people work with it, and the hype.

I’m not saying that you have to give a theory to justify your method. Theory of neural networks is hard, and somehow they just work super good in reality, I understand that. I mean, just dumping everything into your network, tuning your network at random, and hoping that magic will happen, that definitely is not the correct attitude! But, my perception is that, this is how a lot of people are doing machine learning right now.

And people are well aware of it! In China we call that “炼丹(liàn dān)” (or TCM if you prefer that), and at last year’s 21ccc one speaker called that “alchemy” – see, we even have internationally accepted terminology for those sort of things!

And the hype – the number of people doing machine learning is too damn high! It is not rocket science, but neither is it for dumb people who know only how to liàn dān!

I’ve avoided coming in touch with machine learning thus far. But now, it is coming for me!

Because, nearning is the key, ahahahaha!

Computer graphics today is not like decades ago when people focused on rendering. Those problems are largely solved. It has become much broader. Citing words from a talk I attended at MSRA, today, computer graphics is about generating novel content from existing content, in the form of images, videos, 3D models, or even something non-visual like text or sound. It is about capturing human’s creativity. And how do you do that? Learning, of course!

So I started learning to do learning!

The past several days were spent getting the environment sorted – to get cuda working on my Arch Linux machine was a bit of a pain for a casual linux user – the proprietary NVIDIA driver keeps crashing so I had to use bumblebee for my intel/NVIDIA dual GPU laptop, and I had to workaround the incompatibilities between cuda 7.5 and gcc 6. But I guess you can hardly call that a trouble.

I’m using torch because – that’s what my cooperating labmate is using. The first thing to try? Guess it – it’s the MNIST dataset!

The whole procedure was like – put a convolution layer – then a pooling layer – then another pair of such layers – then 3 fully connected layers – then just dump in the data and sit there watching the error drop.

No! That does not feel good. Did I do anything? The days when I was hopelessly tweaking my bugged crappy hand-written naive learning code were like a joke.

But anyway, this still is a step forward.

If learning is the key, then what is the key to learning? There must be something deep (no, I don’t mean a deeper network) that distinguishes groundbreaking machine learning research from liàn dān, something that you have to use your brain to figure out. We shall see.

In remembrance of an old comrade | 记一位老战友

(A note on the title: I’m not sure whether this is a legitimate usage of the word “remembrance” but at least I know that “in memory of” is for the deceased.)

After all these years I finally heard from Tianyi Bai again, albeit in an unusual way. I noticed that a new follower on my twitter might personally know me, and that one turned out to be his girlfriend.

Are we friends? I doubt so. Despite having known each other from grade 6 and attending the same school for 6 years, we rarely meet and talk with each other. Even when we talked, it was often more academic than personal. And we have lost contact after our freshman year.

I barely have a friend, and he definitely has fewer than me! (He has more girlfriends, though.)

Maybe what really linked us it that we have always been in similar positions in our middle & high school years.

We were learning the pascal programming language when we first met.


(Good old boys. Photo by Long Xue if I remembered correctly. BTW are you going to John Hopkins?)

And a year later, we were surprised to see each other at the opening ceremony of NEYC’s middle school division. We were both in the math specialty class (which to our sorrow has ceased to exist). There were two such classes and we were not classmates, though.

Our math teacher has never taught such a bunch of naughty math class boys (yes, we only had very few girls) before, and we gave him a lot of headache. We never followed the learning method he taught us, but by the end of grade 8 we emerged to be intellectually superior, constantly scoring top scores in math exams. And in a math class that pretty much means that you are at the top.


(A score report, from a period when two students, one from each math class, would be paired)

We were competing in maths and programming contests at that time. We both got first prize in provincial level junior division contests in informatics and mathematics by grade 7 and 8, respectively. Since then we’ve made frequent appearances on the front page of our school newspaper, and sometimes on billboards outside our school gate.

In our high school years we took somewhat different paths. I focused on informatics and he focused on mathematics. Finally he got a gold medal in CMO while my best results in NOI were two silver medals.

Actually Yao-class gave him an offer when he got that gold medal, before going to Yao-class became my goal. But he chose to study maths at Peking University.

We did have a chance to cooperate. He intended to compete for Shing-Tung Yau High School Mathematics Award (which has since been renamed) and needed an algorithm for a math problem.


(Me and him in Sanya for the awarding ceremony)

We were not good at making noises. We were not who caught the most eyes. But we were the ones who beard the banner for NEYC class of 2012. If anyone of the students were going to do academics, that would be us.

He went to Peking University and I went to Thinghua. I heard that he ended up at ENS Paris, but otherwise we’ve lost contact after the first year.

Now I’ve got an e-mail from him.

I couldn’t say that I’m a friend of his, but I’m probably among the only ones who knows a thing or two about him personally. His family is poor. He lost his father at a young age and his mother does not even have a job. They relied on his uncle, I believe. Life is hard, and you can see that through his eyes.

He doesn’t talk much and doesn’t try to make friends. He does play Rubik’s cube (better than me) and I’ve seen him play StarCraft and Kiseki series, but those probably are all the things beyond his professional life. I think his poor life made him close-minded and feel inferior.

I might have always been whining that I did not enjoy my life, but for him, life is simply not enjoyable. Even when it comes to his (arguably) favorite thing, mathematics. He might have got more success and less frustration than me in high school science olympiads, but the road ahead only became more difficult.

He once complained to me about getting beaten constantly by his roommates who barely studied. As far as I know, he is not super clever. Perhaps no more than me. If he did achieve more, I’d say that is because he is more hardworking. But the problem with mathematics is that hard work does not always pay off. And what’s even worse for him, even if his work does pay off, he probably won’t make a lot of money.

Money really is a big thing, particularly if you don’t have it! When you don’t have it, it becomes the major consideration in your every decision. He went to ENS Paris presumably because he would be fully funded there. But his life only became more miserable – he did not know french! He doesn’t even make friends in China, how could he live there? (And here you have me who waste bulks of fund purchasing eroge! Definitely not well spent!)

Seriously, mathematics is only for those who are rich and can care less about his own life than the prosperity of human mind, or those who are just insanely clever. And you will also need a lot of determination when you are not achieving. As one who chose to do engineering, I always looked up to those who had the talent and dared to do theory.

He is talented but he is no Ramanujan, and he’s not met a Hardy. Perhaps mathematics is not the right thing for him to do. Does he still love mathematics after all these frustrations? Did he ever considered doing something else or was he even interested in anything else? I’m not sure.

He wrote in the e-mail that he does not want to work on fundamental theories anymore and intended to do statistics and something else more practically useful. His girlfriend told me that he just wanted to be teaching in a high school. What a waste. He deserved more.

Being one of the few people he can turn to, I fell obliged to give an answer. I don’t even know what to say at this point. Do I tell him to quit? I really hope that he can keep doing mathematics and give us some big results. I’ve kinda betrayed my childhood dream to be a scientist, I hope he won’t do the same. Do I tell him to continue? It may destroy him if he does not achieve. Do I tell him to be more open minded? I does not seem that he has much freedom to choose a life. Do I tell him to try to be positive and enjoy life? He does not have that luxury! Do I tell him to not worry about life and that I am willing to support him? How am I able support him in the first place?

Maybe life could have been better if we spent more time together. I could become more hardworking and motivated and he could become more open and have a better attitude by making a close friend.

I need to figure out the answer. Wish him the best.

My life as a Ph.D. student, S01E01

“… It’s also a fucked up city, but it’s awesome.”

That’s what my boss said about LA when were chatting, before I got the offer.

Honestly, I’ve never expected to see someone like Hao in the academia. At least not as a faculty. He is so unconventional. I still remembered when I saw someone sharing a link to his page on a Chinese SNS site two years ago. People were laughing with admiration.

At that time, I’ve just transferred to Yao-class and haven’t decided to do graphics and do a PhD yet. But now, two years later, I become his student. Life is strange.

For the first time, I’m in the United States.

LA definitely isn’t like anywhere I’ve been. With all those palm trees on the street, it’s like the tropics for me. Surprisingly the whether is not very hot. I’d say it is even cooler than my hometown Shenyang despite way down to the south in terms of latitude. The sun might be burning, but there is not much moisture in the air, so when in the shadows or when the wind is blowing, you don’t feel hot.

And, the sky is blue.

USC is to the south of the downtown. That piece of land is like the urban area of a Chinese county, just orders of magnitude larger, and the campus seems to be the only thing decent. It is about 1/3 the size of Tsinghua, with a lot of buildings packed tightly inside, yet it feels more spacious. The red bricks and white pillars reminds me of the american styled old campus of Tsinghua. Sadly we don’t have here a Jeffersonian Grand Auditorium with a big lawn.

I don’t miss home. I didn’t even have a jet lag and slept pretty well in the first night.

It seems that we have over 300 students from China coming to study CS in USC this fall, the vast majority of then being master’s students. For me, that figure is just overwhelming. Those master’s students are surely coming for the money.

With in years I’d be rolling in cash if I chose to do the same. I’m pretty sure I’m more qualified to earn that big sum of money than most of them. But I just don’t want to go to the IT industry. Or at least I want a more research oriented job in the industry. I’ve never self identified as a developer.

I don’t care about money. I don’t even care about making a super useful software and become popular. I shall only code for something fun.

My life as a Ph.D. student, S01E00

Here I’m finally starting to write about my life again. I can’t remember exactly when was the last time I did this.

Was it 8 years ago? Like pretty much everyone else, I was young and naive, had no accomplishments whatsoever, and had hopelessly unrealistic fantasies about future and about love. Even better, I was a problematic student who rarely did his homework.

Yet somehow that was still one of the best times in my life. I was full of passion and life was exiting. Over the years I won silver medal twice in National Olympiad in Informatics, got admitted into Tsinghua, and finally graduated from the prestigious Yao-class, but as I climbed all the way up the steep mountain to become one of what many perceive to be the best CS students in all of China, my life just kept getting worse.

You just can’t deny that the excellence of your peer gives you frustration, especially when you are near the top when the normal distribution of talents becomes like an exponential one. I felt overshadowed. I missed out narrowly on a gold medal in my final outing at NOI when I was 17, while some got gold medal at the age of 14. I barely got into school of software in Tsinghua which IMHO is an inferior institution, and failed the Yao-class entrance exam. It was a year later when I finally got into Yao-class by transfer. My classmates were publishing papers in top conferences, one of my roommate jumped 4 grades and started his Ph.D. program in MIT at the age of 18, while I haven’t achieved anything noteworthy in the academic world. And when you think that you are not good enough, enjoying life is the last thing you want to do.

I din’t enjoy delicious food. They just taste all the same. I din’t enjoy sleeping. I din’t dream and sleeping was boring. I didn’t enjoy music. Those popular songs were like nonsense. I haven’t been to a cinema for the past 7 years. I do watch some anime and play some games, but I was constantly thinking “Oh, this is so inappropriate”. I almost gave up photography as a hobby because I’ve ran out of inspirations.

I’ve never truly loved anything. I was not living my life, I was just keeping myself alive.

But this year, there has been something happening in my mind.

I always wanted to be a scientist, from the days when I was in kindergarten. As I grew up and got involved more in the academia, I realized the sad truth that although we can still somehow call ourselves “scientist”, most of us does not get a chance to discover something significant. I definitely won’t be the one to prove that P does not equal NP. Nor the contrary. Doing research is nothing prestigious, it is just another way to earn a living and probably not a decent one.

Despite all these, I still did not change my goal. I just want to find another approach. If you can’t do something significant and are ultimately gonna get buried in the huge archive of papers and get forgotten, why not try something cool? At the very least, not-so-useful but cool is better than not-so-useful and boring. And who said that cool things cannot be significant?

And by doing academics, you can actually see more opportunities outside academics than those who does not do academics.

After adopting this new way of looking at things, my life started to change.

Pure academic excellence weigh less and I’m not worried that much about not being good enough anymore. You might not be so good, but you can be different.

I started to live my live and looking for things that I truly loved. For the first time I’m thinking about doing something other than academics. I could even try to become an artist – not just a random one, but one who knows cutting edge technology and can create things other others cannot even think of.

And now I’m here in the University of Southern California, studying Computer Graphics.

This is a new life. Everything has changed. New places, new people, new things to do, and completely different way of life.

I still don’t have any girls though, but I don’t care.

Let’s see how the story is gonna unfold.