本文地址:https://blog.hoppinglife.com/?p=13
最近有好几个小朋友跑来问我有关学习啊前途啊推荐导师方向啊的问题,我猜我的答案不是很让你们满意。正好,今天又看到一篇『ACM大牛太厉害怎么办』式的文章,有感而发,写一点我此刻的感触。个人意见,水平有限,仅供参考。
一 轨迹和距离
要讲的,大概就是乔布斯『dot』那个演讲的意思。你从来不知道自己的现在会以怎么样的方式影响未来。恩,这个话题很俗,但是在此时此刻,我希望我更早一些懂得这个道理。
我在大学里有几个领域不愿意碰:不喜欢数学,不喜欢Machine Learning,不喜欢并行编程。
结果是代数和概率没学好,Boss的一个很有趣的题目不敢接。前不久项目要用到基本的机器学习和MPI,翻出教材重看了好几天;课上讲到CUDA自己浅尝辄止,现在天天抱着Nvidia的资料啃。
专业课程的设置终究有它的原因,你永远都不知道,你不喜欢的那件事,在什么时候会挡住你的路。如果运气不好,说不定连是什么挡住了你的路都不知道。
二 游戏与现实
有一个很有名的段子,医学院的学生找老师去划重点,老师说,你打算跟将来的患者说,不好意思,这个病不是重点?
课堂、考试和大作业,终究是一种『游戏』。它不能太难以至于大多数人阵亡,它不能耗时太长以至于很多人饿死,它也不能太无趣,以至于大家觉得它很无聊。
但是教材那么厚,还有那么多参考书终究是有原因的,实践中的问题不会顾及你是否曾经对这个问题详加练习;不等式的难度是否超过了你算法课的习题;或者问题的规模是不是超出了你习惯的问题。
更何况,太多的问题书本上没有答案。C++书上,不太会讲到实践中tuple奇奇怪怪的用法或者是decay_copy对线程安全的意义,也不会讲到什么样的代码能内联什么样的代码不会被优化;算法课上,也不太会讨论B+树的节点插入的时候可以rebalance或者实践中B树的性能到底跟什么有关。
『考试内容』和『书本知识』天差地别,『书本内容』和『工程实践』又隔着鸿沟,想真正掌握一门学科,课堂讲义和教科书远远不够。
三 天赋与先发优势
最常听到的问题,是『成绩还行,编码不好怎么办』。
我就笑,因为我觉得,如果真的用心去『学』了相关的课而不是仅仅应付考试,编码应该有所提高才对:c++大作业让写链表的时候,有没有去翻翻std::list的实现?OS课上让写shell,有没有去翻翻类似的代码?做算法大作业的时候,有没有去查查工程实践中的代码是什么样的?做编译大作业的时候,有没有让自己的code尽量clean?学软工的时候,有没有仔细看看设计模式?
或许有人天生擅长coding,或许有人通过ACM的锻炼coding提高;但这绝非唯一的提高之途。作为一个工程师,对『先例』的熟悉和『自身经验』的累积,是远比天赋更宝贵的财富。
顺便说一句,在我ACM水平最高的时候,代码是变量乱飞作用域稀里糊涂的。很多ACMer编码水平高,是因为他们对待代码(和其他知识)比我认真。
四 结果与目的
别人看你的学生生涯,会有很多『评价因子』:成绩如何,奖学金和荣誉,科研,课外活动。加权平均一下,给你的学生生涯打个分数。
所以挺多小朋友从进大学开始,就开始奔着这个方向去努力:GPA,GT,进实验室。而当问起『你的兴趣是什么?』『你擅长什么?』的时候,往往很茫然:『其实我也没有什么特别的兴趣啦』。
但这些都是『结果』,不是『原因』。它们终究是衡量一个人的专业水平和综合素养的工具,而后者,才是大学应该给予你的东西。学数学也好,学编程也好,都是为了,当有一天用这些创造什么的机会摆在面前的时候,你可以把那份工作干得更漂亮,让自己更满意,幸运的话,惠及更多的人。
大学四年的意义,不仅仅是『换个敲门砖』,你可以做的多得多:认真寻找到一个自己擅长和感兴趣的领域;把基础知识认认真真学扎实;培养良好严谨的工程习惯;积累一些初步的经验。做好这些,那些你所在意的『敲门砖』,自然会水到渠成。
相信我,你今后不会有太多的机会做这些事的。