G**S 发帖数: 36 | 1 因为我比较啰嗦,先说重点,后面会展开,具体解释。
1. 入门也好,刷题也好,推荐选 Python, JavaScript, 一方面是趣味性更强,入门更
简单,一方面是根据个人作为在北美大厂做面试官的经验,这几门语言相比 C++ 和
Java, 你自己刷题的效率,和面试过程中的发挥,都会更好。当然如果你走的不是最普
通的海外大厂校招或是跳槽路线,那有些职位确实可能有语言限制,比如游戏公司。但
是这一条对入门仍然成立。
2. 如果精力和时间允许,推荐不带太多功利目的地,学习一门 functional
programming language. 个人推荐 Haskell, Scala 会更实用,其他的还有 Racket,
Scheme, 和各类 LISP 方言,我自己研究也不深,就不展开了。
3. 工作上会遇到 Design Pattern, 我个人的观点仍然是,要知其所以,不要盲信。不
要因为他又是 design 又是 pattern 听上去很高级,而去过于纠结。
4. 让编程语言和工具帮助我们实现自己的想法,而不仅仅是单纯为了学而去看书上课。
关于第一点,下面说一些面试中看到的现象。我曾经参加过远程的校园招聘,一下午连
轴面三场。偷懒如我,当然是问同样的题目。然后印象很深的就是,第一个同学拿 C +
+ 写,水平还可以,但是磕磕巴巴代码写很长,相当大一部分时间在那里纠结指针,怎
么 allocate memory 之类的。 第二个同学拿 Java 写,也是代码写很长,没有了 IDE
, 有些基本的操作想不起来,最后思路是对的,然后时间不够写不完。第三个同学拿
JavaScript 写,十几行代码搞定,剩下一半多的时间聊天说他自己做的各种项目,最
后问问我问题,愉快地提前结束。最后和别的三四个面试官讨论,对第三个同学大家都
非常一致,觉得他代码思路不错,平时在校做的项目也很有意思,顺顺利利地给过。前
面两位同学,就意见不统一,有几轮做得顺一点,有几轮时间来不及,或者edge case
没时间考虑,最后是一个勉强过,一个没过。
因为是校招,不存在问特别难的题目,而且至少我面的那场,这三个人开始写之前的思
路都是正确的,我个人觉得,语言的选择上是影响蛮大的。
而且这不是孤例,其他社招过程中,遇到过不会写 Java 只会写 Python 的,代码很简
洁,一个一个 function, 思路很清晰,面试体验非常愉快,最后大家的评价都很好,
也没有说因为平时工作中更多用 Java 而觉得他不符合。
关于第二点,确实和我的个人经历有关。大学里的课程,我偏底层的学的是 C, 蹭的计
算机的课都是 Java, 要不是我高中自学了 Python 确认过自己当时还蛮喜欢写代码的
,上来就是 Java OOP 之类的我肯定早就放弃了。后来接触了 Haskell, 其实也就是自
己看书,照着书写代码,一度惊为天人,实在是太优雅太美妙了。虽然 Haskell 这个
社区里有一部分人很装,或者说整个 functional progamming 的文化有一点装或者
hipster 的倾向,但是语言本身的思想真的对我很多启发,比如 immutable, 没有
loop 的概念,lazy eval, monad, 等等。我觉得学习这些的语言,可以帮助跳出既定
思维,让你意识到,代码的世界是很丰富的,不只有 OOP 一种形态。而如果稍微了解
一下最早 OOP 的渊源,就发现其初衷和我们今天熟悉的 Java 风格,简直南辕北辙,
Alan Kay 本人对后来 OOP 的发展,也表示我很无语,与我无关。
关于第三点,承接第二点,我觉得接触了 functional programming 的一些思想之后,
会更关注本质问题,小到一个函数,大到一个程序,一个系统,你的 input 是什么,
你的 output 是什么,你的 interface 是什么,你的 side effect 有哪些,什么是可
控的,什么是不可控的,如何 decouple, 都是可以融会贯通的。至于教科书上的
design pattern,就会经常让人觉得,明明可以简简单单地说清楚,为什么要搞一堆
buzzword 障人耳目,混淆视听 (比如 factory, 大多数时候难道不就是个 function
?)我刚入职的时候也很屁颠屁颠地想着买书学习学习这东西,因为毕竟学校里这个教
得不多,然后慢慢发现这些鼓吹 design pattern 的有时候简直不说人话。比较不幸的
是,这一套营销确实被企业追捧,妄想一套标准化流程可以解决代码的所有问题,从此
公司的代码都是最 extensible, 最 robust, 最 scalable 的,所以现实工作中有些迷
之操作,顺着这个思维方式也都解释得通,“有理有据” 没毛病。倒也不是说他全无
道理,只是他会把很简单的东西套一个很唬人的名称,这让人很不爽。工作一段时间后
,发现周围很多人,做的技术决策,是没有经过思考的,你问他当初为什么是这样选择
,他会搬出来一堆 design pattern, 会重复一些教科书式的标准答案,但是你再追问
他就无言以对,因为基本上其真正的原因,不过是我看别人也是这么用的。
我一开始意识到这个还超级兴奋的,以为自己看透了企业文化的真面目,后来发现这一
套早就是大家喜闻乐见的了,有兴趣大家可以去查一下,什么叫 cargo cult
programming. 对于 Design Pattern, 我个人觉得是属于 completely overrated, and
harmful,一旦陷入其中,非常容易滥用,然后本末倒置,舍弃简洁灵活而毫无理由地
追求复杂。 在此极其不推荐大家上来就去读 Martin Fowler 写的那些书,非常容易误
入歧途。
再说一个有趣的例子,也可以侧面印证以上的说法。大概两年前我做了一个 React 的
项目,然后现成的一些代码,里面各种奇奇怪怪的 mixin, 看了半天也看不大懂,问写
的人也是一堆我听不懂的理由,简直怀疑自己的智商有问题。不过正好那个时候,内部
开始升级 React 版本了,之前写了一堆 mixin 的人发现,React 官方不支持这个 "
pattern“ 了,表示当年支持是个错误,然后那些现有的 mixin, 不得不全部重写。原
因不多说,有兴趣的可以去看一下当年的官方文档,他们为什么抛弃了 mixin, 而转
向 higher order function/component,我把链接放在最后,还挺有意思的。
其实我很怀念上学的时候,天真地以为,代码的世界就是简简单单的0和1,工作以后发
现,其实蛮多技术上的事情,说到底就是个个人观点, 而有些人在某一两种特定语言和
思维方式里习惯了,觉得事情就应该是这样的,会变得非常 religious。这个现象各个
编程语言社区也都有,也有入了 functional programming 的坑,变得非常拧巴看到
mutable 就像吃了苍蝇一样不爽的,那也没必要。我也不排除自己很多时候也会固执,
所以以上都是个人观点。这也是为什么上面推荐有机会可以看看不同类型的语言和相关
技术。当然不同的语言,我的理解,不是说 Java 和 C ++ 的不同,也不是说单纯学另
外一种 syntax,而是说之前都在写 Java, 那么可以看看 JVM 的机制,然后可以试试
Python 或者 Lua 这类脚本语言,再可以去了解学习一下 Haskell 的数学思想和强类
型, 对比其他 dynamic typing 的语言,还可以去看看 Erlang 的高并发设计,甚至可
以非主流地玩玩 bash, awk, 麻雀虽小也可以精妙。当然我自己也很懒,也不深入,很
多东西也是三天打鱼两天晒网地学。
第四点,可能听上去很理想化,不接地气。其实我自己一段时间也很喜欢买书来啃,觉
得自己很上进很努力,都要被自己感动到了。后来发现,学编程,看书效率其实不高,
动手效率才高,而且你可能不知不觉会深陷其中,感受到其中的快乐。
我最开始学的 Python, 也是感谢朋友推荐,没有一脚踩进别的坑。当时 function 都
不会用,写起来都是一整段一整段的,但是没多久就可以开始做简单的小动画了,成就
感爆棚。后来发现了一个基于 Java 的语言叫 Processing, 当时还没有学 Java, 跟着
别人的代码又自己做了很多有意思的偏艺术的动画,(此处推荐喜欢画画的妹子们试一
试这个编程语言,很好上手,不过自从成为了社畜,蛮久不关注了)
如果想要自己做个 project 什么的,最好上手的就是装一个 node, 自己做想做的网站
。我都不知道为什么市面上会后端鄙视前端,搞后端的又不是人人每天从头开始写
paxos, 相反前端可以简单也可以复杂,至少我就很喜欢。
如果喜欢游戏,可以上手 Unity/C#, 但是我觉得 learning curve 不小,我也不热爱
游戏,学了两天就放弃了。
最后说令人恐惧的 C,其实我觉得 C 还好,对理解底层硬件还蛮有帮助的。C++ 我就
很头大,东西太多,简直反人性,新的版本不知道,我接触的时候很多那种 multi-
inheritance,operator overload 的操作,知道你 C++ 跑得快,但是就不能心平气和
一点让大家好好写码,不要整那么多骚操作嘛?
但是如果上学的时候大家避不开 C, 我觉得可以入手一个 Arduino, 培养培养兴趣。我
刚开始学 C 的时候,硬件编程也刚开始普及,第一代的树莓派也是差不多那个时候,
当时买了很多这类东西玩,所以虽然 C 学得还是蛮艰难的,但是至少心里不抵触不排
斥,甚至还蛮想好好学的。 |
|