这个google Ads里的吊灯很便宜啊# Living
g*y
1 楼
欢迎做系统设计的大牛们出来谈谈感受。
- 最重要的能力不是你现在会什么,而是学习新东西并且很快可以举一反三。上了CS
的船,就注定不停地要跟新的,不会的东西打交道。如果没有参照,我以为自己学新东
西很快。工作上碰到牛人,才知道什么是更快。很明显,他们跟我一样没看过的code,
他们能够很快地zoom-in, zoom-out。我的认识是:一,他们的思维很快;二,他们对
系统对概念很清楚,知道这个系统输入,输出,有那些子模块,各自完成什么功能。有
这些知识在心里,他们能大致猜测系统是怎么布局的,因为主线在心里,他们一边找,
一边验证自己的假设。三,design pattern,对于大规模的代码,design pattern必然
反复出现,而且命名都是有规可循。一旦看见那样的命名,他们就知道相应的class,
interface必然有定义/实现。知道要找什么东西的时候,大海捞针就容易得多。
- Fundamentals。有一些特别基础的工具,一定要熟,无法绕过。我特别不喜欢vi/
emacs这类工具,因为大部分语言都有非常好的集成环境,我不明白为什么要去记住那
些莫名奇妙的j,k,l,n,f,b...... 事实上,你总会碰到一些时候,比如从家里remote
log in, 在外地出差,或者用laptop remote connect等等,这些时候,启动集成环境
通常太慢,只有最简单的字符界面最高效。再比如,你想要修改的,就是一行代码,启
动集成环境,修改,测试,一通折腾下来,别人代码都已经check-in半天了。人总有些
时候需要非常速度,在这种时候,这些兵器就好比武侠描述的,一寸长,一寸强;一寸
短,一寸险。高手的手里,往往是有各种兵器,知道什么时候取那把出来。
- Regular expression, 我从来没有碰到过一个不是Regular expression master的牛
人。原因很简单,RE抽象精炼,在字符类的转换处理上,往往是思维速度最快的。写出
来之后,可能不是那么容易读,我通常都反感那些难读的精巧的代码,我觉得那往往是
自挂东南枝。但是在regular expression这块,我会通融,习惯之后,确实感觉很顺手。
- 写代码跟写文章一样,最重要的是条理清晰。有清楚的布局规划,别人就很容易找
到相应的代码,容易理解,也就容易维护。不能维护的代码,出路只有一条,就是被抛
弃。写代码,是为了跟人交流,尤其是未来的自己,因为往往自己会是维护那段代码的
人,为了保证过了一个月,一年之后能够顺利读通代码,发现问题。那就必须养成良好
的习惯:代码风格一致,逻辑习惯一致,思维方式一致。对于类似的问题,当你找到一
个最优解法时,最好处处都沿用这个解法。问题特别容易出现在:解法的细微不一致上
。另外,注意避免啰嗦,能够用一句话说清楚的,不要用两句;可以删掉的旧代码,毫
不留情删掉 -- 代码越少,犯错误的机会越小。
- 跟人交流:跟人交流不是问解法,而是随便聊天知道更多的东西。对于绝大部分的
问题,如果拿问题去问人,我们希望发生的情况是对方刚好知道那个答案;但是通常发
生的情况是:对方并不知道,他花时间帮你解了。好处:省事。坏处:不仅降低了别人
对你的印象,而且失去了一个自己解决问题的机会。以前我会想:这是一个无足轻重/
无聊的问题,我知道了它的解法,对我将来的工作也没有任何意义。其实不然,知道最
快的方式解无聊的问题,其实也是一种能力,而且是需要培养的能力。很可能,google
就可以回答,这种时候,浪费同事的时间,就是损人不利己。跟人聊天,知道一些以前
不知道的想法,知道一些系统的实现,没准在将来的某一天,突然就派上用场。概念性
的东西,是最能难倒人的的地方,没有的时候,你会绞尽脑汁去发明轮子;知道之后,
你会发现那么容易,谁都可以做。有一次我改动一段javascript代码,需要在两个不同
object的callback之间传递参数,因为涉及到库的变化,我发现那个改变至少引发几百
行代码变动。我去跟同事聊天时,顺便提前这件事,他平时不写javascript, 但是他直
觉地问:为什么不换一个方向做,我一下就明白:自己走入了思维误区,我以为必须那
样去改变,其实我可以在更高层上变动,那样就根本不需要底层把参数传来传去,最后
的改动只需要不到10行代码。
-细节上,多相信代码, 少相信人。代码是不会撒谎的。不管多牛的人,他们对细节的
记忆都可能出现偏差。所以能够下苦功夫的时候,最好自己去把细节理清楚,不要随便
相信别人的一句话。我在这个上面吃过多次苦头,因为对方很牛,又振振有词地跟我说
应该那样做,我就相信了。等到发现错误的时候,我又不能拿他出来做挡箭牌,错误还
是算在自己头上。
-学什么语言?总看见争论这个话题。我的看法是:不管哪门语言,你需要精通一门。
精通的意思是,不用google,不需要不停地去查细节,你可以很快完成比较复杂的app
,你能够用那门语言来思维。我用过很多语言,但是让我挑最熟的工具,肯定是Java。
其它语言,修补别人的程序没问题,但是自己独立从头干,需要参考书。在有时间的前
提下,多学几门语言总是没坏处的,尤其是新的奇怪的语言,就像学习一种新的思维方
式。我也看见很多争论哪个语言好什么的,觉得很无聊,一句话:如果脑子不清楚,什
么语言写出来的都是一团浆糊。
-关于刷题。工作中有用没用?回答是:有用,但是不直接。刷题就像是脑力体操,体
操好的人,身体协调性好,完成各种动作都容易。但是写代码快,跟工作成绩之间,没
有必然相关。我见过很多聪明人,做事非常快,但是他们干的事情,我不觉得特别有意
义。不管多么快多么有效率地干无意义的事,结果都是一个。
- 最重要的能力不是你现在会什么,而是学习新东西并且很快可以举一反三。上了CS
的船,就注定不停地要跟新的,不会的东西打交道。如果没有参照,我以为自己学新东
西很快。工作上碰到牛人,才知道什么是更快。很明显,他们跟我一样没看过的code,
他们能够很快地zoom-in, zoom-out。我的认识是:一,他们的思维很快;二,他们对
系统对概念很清楚,知道这个系统输入,输出,有那些子模块,各自完成什么功能。有
这些知识在心里,他们能大致猜测系统是怎么布局的,因为主线在心里,他们一边找,
一边验证自己的假设。三,design pattern,对于大规模的代码,design pattern必然
反复出现,而且命名都是有规可循。一旦看见那样的命名,他们就知道相应的class,
interface必然有定义/实现。知道要找什么东西的时候,大海捞针就容易得多。
- Fundamentals。有一些特别基础的工具,一定要熟,无法绕过。我特别不喜欢vi/
emacs这类工具,因为大部分语言都有非常好的集成环境,我不明白为什么要去记住那
些莫名奇妙的j,k,l,n,f,b...... 事实上,你总会碰到一些时候,比如从家里remote
log in, 在外地出差,或者用laptop remote connect等等,这些时候,启动集成环境
通常太慢,只有最简单的字符界面最高效。再比如,你想要修改的,就是一行代码,启
动集成环境,修改,测试,一通折腾下来,别人代码都已经check-in半天了。人总有些
时候需要非常速度,在这种时候,这些兵器就好比武侠描述的,一寸长,一寸强;一寸
短,一寸险。高手的手里,往往是有各种兵器,知道什么时候取那把出来。
- Regular expression, 我从来没有碰到过一个不是Regular expression master的牛
人。原因很简单,RE抽象精炼,在字符类的转换处理上,往往是思维速度最快的。写出
来之后,可能不是那么容易读,我通常都反感那些难读的精巧的代码,我觉得那往往是
自挂东南枝。但是在regular expression这块,我会通融,习惯之后,确实感觉很顺手。
- 写代码跟写文章一样,最重要的是条理清晰。有清楚的布局规划,别人就很容易找
到相应的代码,容易理解,也就容易维护。不能维护的代码,出路只有一条,就是被抛
弃。写代码,是为了跟人交流,尤其是未来的自己,因为往往自己会是维护那段代码的
人,为了保证过了一个月,一年之后能够顺利读通代码,发现问题。那就必须养成良好
的习惯:代码风格一致,逻辑习惯一致,思维方式一致。对于类似的问题,当你找到一
个最优解法时,最好处处都沿用这个解法。问题特别容易出现在:解法的细微不一致上
。另外,注意避免啰嗦,能够用一句话说清楚的,不要用两句;可以删掉的旧代码,毫
不留情删掉 -- 代码越少,犯错误的机会越小。
- 跟人交流:跟人交流不是问解法,而是随便聊天知道更多的东西。对于绝大部分的
问题,如果拿问题去问人,我们希望发生的情况是对方刚好知道那个答案;但是通常发
生的情况是:对方并不知道,他花时间帮你解了。好处:省事。坏处:不仅降低了别人
对你的印象,而且失去了一个自己解决问题的机会。以前我会想:这是一个无足轻重/
无聊的问题,我知道了它的解法,对我将来的工作也没有任何意义。其实不然,知道最
快的方式解无聊的问题,其实也是一种能力,而且是需要培养的能力。很可能,google
就可以回答,这种时候,浪费同事的时间,就是损人不利己。跟人聊天,知道一些以前
不知道的想法,知道一些系统的实现,没准在将来的某一天,突然就派上用场。概念性
的东西,是最能难倒人的的地方,没有的时候,你会绞尽脑汁去发明轮子;知道之后,
你会发现那么容易,谁都可以做。有一次我改动一段javascript代码,需要在两个不同
object的callback之间传递参数,因为涉及到库的变化,我发现那个改变至少引发几百
行代码变动。我去跟同事聊天时,顺便提前这件事,他平时不写javascript, 但是他直
觉地问:为什么不换一个方向做,我一下就明白:自己走入了思维误区,我以为必须那
样去改变,其实我可以在更高层上变动,那样就根本不需要底层把参数传来传去,最后
的改动只需要不到10行代码。
-细节上,多相信代码, 少相信人。代码是不会撒谎的。不管多牛的人,他们对细节的
记忆都可能出现偏差。所以能够下苦功夫的时候,最好自己去把细节理清楚,不要随便
相信别人的一句话。我在这个上面吃过多次苦头,因为对方很牛,又振振有词地跟我说
应该那样做,我就相信了。等到发现错误的时候,我又不能拿他出来做挡箭牌,错误还
是算在自己头上。
-学什么语言?总看见争论这个话题。我的看法是:不管哪门语言,你需要精通一门。
精通的意思是,不用google,不需要不停地去查细节,你可以很快完成比较复杂的app
,你能够用那门语言来思维。我用过很多语言,但是让我挑最熟的工具,肯定是Java。
其它语言,修补别人的程序没问题,但是自己独立从头干,需要参考书。在有时间的前
提下,多学几门语言总是没坏处的,尤其是新的奇怪的语言,就像学习一种新的思维方
式。我也看见很多争论哪个语言好什么的,觉得很无聊,一句话:如果脑子不清楚,什
么语言写出来的都是一团浆糊。
-关于刷题。工作中有用没用?回答是:有用,但是不直接。刷题就像是脑力体操,体
操好的人,身体协调性好,完成各种动作都容易。但是写代码快,跟工作成绩之间,没
有必然相关。我见过很多聪明人,做事非常快,但是他们干的事情,我不觉得特别有意
义。不管多么快多么有效率地干无意义的事,结果都是一个。