十一年前,我在电脑爱好者论坛上面发布了自己的第一个软件,DocumentsManager。那是一个用C# 3.0编写的文档分类、索引软件,五脏不全,但麻雀不小。今天他还在精华索引里面。不只是他,精华帖中Leap.ahead和ASUSTek发布的帖子都是我发的,总共有22个。

对于我而言,不仅创造是一种乐趣,学习如何创造同样也是一种很大的乐趣。在我的学生生涯中,在不同的时段,我学习创造的方式也不同。这是一个需要时间来演进的过程,所以时间一长,也需要总结一下。今天难得有了总结的冲动,便简略地说说我的一些心得。

深入才能浅出

学计算机的人都研究抽象。有句话是这样说的,所有的计算机科学问题都可以用抽象来解决,除了过多的抽象。

由于接触了太多的“抽象”,我曾经有一种心态,那就是要学就学顶端的设计,要做架构师。我还问过我的一个大学学长,“学什么课才能成为架构师”?在那时的我心目中,架构师就是画图的,然后程序员实现就是了。

但是在有了工作经历后,我发现实际上如果对底层没有很深入的了解,是根本没有办法对顶层设计做出好的判断的。可能我只是知道一些名词,诸如cache、CDN、负载均衡等。但是真的要到用到这些东西的时候,其实是只能用到最粗浅的那一层。连螺丝是怎么拧的都不知道的人,别人怎么放心让你去建桥呢?

这就是所谓的“深入浅出”。深入到每一分每一毫,是为“深入”。然后再跳出来,纵观全局,是为“浅出”。

广撒网,但别做捞鱼的打算

既然要深入浅出,那么这个深入真的是要把一个具体的技术钻研得很深吗?这也是一直以来很受争议的地方:到底是学一个领域学得精通好,还是学很多领域好?

我的答案是,能真的学得精的人必然学得广,能真的学得广的人必然能学得精,而且能学得很快。仔细想想,我们的时间真的有少得窘迫到一定要在广和精之间二选一吗?如果纠结于这个问题,那么一定是放错了重点。重点不在于选择广或是精,而是如何让自己变得更会学习。

我在国内外的大公司实习,感觉到的明显区别就是,国内公司“专家”居多,国外公司“工程师”居多。国内把工程师的职责分得非常清楚,哪怕是一个五六个人的小团队,也得有个明确的后端、前端、算法工程师云云。而国外的定义基本上都是软件工程师,职责很宽泛,你随时可以做其他团队做的事情。

关于公司的这种现象,可以写另一篇单独的文章出来聊聊。但是可以确定的是,不管是国外还是国内,都有很多成功的技术公司。从来没有听人抱怨过,“我们这儿的工程师都只会一两样东西,其他啥也不会”,或者是“我们这儿的工程师啥都会一点儿,但就是不精”。

所以,广撒网是没有错的,但是别做捞鱼的打算。当你自己感兴趣的时候,你自然会深入去研究,做出自己想要的东西。

学习规则,但不要相信它们

我喜欢规则,但是也很讨厌规则。

在学习技术的时候经常会遇到所谓的Best Practice(最佳实践)。面对最佳实践,有三种态度:

  • 我代码连跑都跑不通,还管你最佳实践?
  • 最佳实践是要遵守的,能让我们的代码更加如何如何……
  • 最佳实践值得学习,要打破的时候也要适当打破

我认为,这三种态度没有谁对谁错,但是需要被理性地看待。诚然,最佳实践是一种规则。但是,我们在面对规则的时候,不要忘记了自己做选择的权利。

其实做工程、技术就是做选择,而且选择一般都很明显。不像做研究,有时候你的选择可能非常难以被发现。规则应该是让我们变得更有主见的。我们应该把它们拿出来理解、讨论、思考,让它们千变万化。到最后,要我们做选择的时候,才有资本拿出来给别人看。

除了最佳实践外,我还经常想:这门语言的这个语法简直是一个败笔、这个变量起的这个名字实在是糟透了……我们不应该做一个hater,见到什么都否定。但是只要我拿得出理由,哪怕理由本身是有问题的,那我都敢去质疑。

关于兴趣

最后我想简短地说说兴趣。

我不相信兴趣是可以培养出来的,只不过需要一点时间去发现它而已。就好像胡子总是会长的,但是个姑娘那就没辙了。如果硬要做自己不喜欢的事情,那就是让姑娘变小伙子,想起来就羞羞的。