我学完了建筑设计以后发现自己在工地上搬砖的水平并没有提高。不管你学了什么,你在一个你没用到的领域扯那根本就没有意义啊……
现在软件工程基本模式早就已经变成了 框架 + 业务逻辑 这种简单的模式了。如果一直填业务逻辑,就会会发现自己学的一切都对“编程水平”没有任何意义。我学过计算机组成(微机原理)、学过编译原理、学过数字/模拟电路、学过操作系统、学过项目管理、需求分析、设计模式、架构设计。
但是如果我只填业务代码,那么我上面学的一切都对我的所谓“编程水平”没有带来任何影响。因为根本用不到啊……
举一个只需要会填业务代码的典型例子,Rails。在Rails社区里面写一个链表都能被称为大神,但是不会链表根本不会影响他们用Rails写网站。
2楼 @brambles 术业有专攻 ,之前的回复不是针对你说的, 而是针对那些想学计算机编程 刚刚入门 并想以此找一份工作的人说的, 只是看到你在这里说函数式编程,我忍不住想起那些大神的各种回复
深入理解计算机系统(这本我觉得应该读一下,但绝对不是刚开始) (实际上这本书真没那么神乎 高中知识绝对就可以阅读 原书的标题应该是 一个程序员需要了解的计算机知识)
然后就是SICP 说实话这真的是个大坑 我觉得初学者 应该先学一门面向过程的语言(而不是SICP) 然后了解 一下数据结构 对常见的数据结构有清晰的实现 配套数据结构的算法 能看懂多少是多少 毕竟大部分人不是去设计一个新的算法 而是扩展现有的算法 并将其用到项目中去
学完这些之后然后就可以去学各种面向对象的语言以及相应平台的框架 理解抽象 继承 接口 以及面向对象语言中对数据结构封装的容器
我研究生的时候学了函数式语言,导师自己写了一个他自己命名的函数式语言。我们学的就是那个,那个时候还要用他创造的语言扩展他的语言增加新功能。但是工作几年之后完全还给老师了。代码的确很简洁,有些问题就用它来解决就很方便,但是绝大多数的项目都用不到啊。一般都是研究院和牛逼投行,而他们一年招的人都是个位数。倒是有个墨西哥人继续跟他研究这个读完了博士。
打个比方,你见到一个程序员每天跑步,然后你问人家:你又不是体育运动员,你工作也用不到跑步,你真的有必要天天跑步吗?
别人跑步不是因为人家工作需要用到跑步,而是
为什么现在那么多大公司找普通码农也那么在乎算法?不是因为人家普通码农在工作时候需要整天研究算法,而是:
同样地,为什么学 Haskell ?工作上是用不到啊。但是学习使用 haskell 所带来的结果是什么?【抽象能力】。抽象能力的提高使得我写其他代码的能力显著提高,比如一些以前觉得很复杂的问题,通过Haskell的组合子逻辑,写成一串函数的组合,只需一行就能解决复杂的问题。我写py, js的时候就大量运用在Haskell里面学习到的知识。
所以你觉得,学 Haskell 到底用得到用不到?
我并没有说Java比函数式语言好用,我想强调的只是“在一个日常工作的语言(Java)中应用函数式语言的思想”会更实用,尤其是对日常工作中主要处理业务逻辑的程序员来说。
而且我不知道你有没有读过那本书。Java里面目前有的函数式特性,确实只用两页纸就讲完了。但是函数式思想我觉得没有一本书能讲的这么压缩吧。
Haskell OCaml SML我都写过,每一种都写过或大或小的编译器或者算法,用Java写简单的函数式程序我也写过。
Haskell不用函数式当然也能写代码,甚至最简单粗暴的直接用do block + function as first-class citizen就行,只不过确实会麻烦很多。
我只是在强调用函数式思想的关键是解决现实中遇到的问题,既然Java在大型项目中用的这么广泛,并且这个语言中很多问题可以用函数式的思想来化解,那为何不先从Java入手来学习函数式编程?
简洁优雅的方案从来都是跟问题相关的,有些问题用Haskell来做就是简介优雅的,但有些问题确实用Haskell会难上很多倍:动态类型的脚本、基本的数据结构(栈和堆)、…… 您觉得实现一个栈用允许副作用的语言实现简洁优雅,还是用StateMonad来实现简洁优雅呢?
35楼 @vincentzhaorz 做什么事情用什么工具,就像大家不会用java写网页和排版一样,因为有专门的CSS和javascript来处理这个事情。函数式语言并不能解决绝大多数项目中遇到的绝大部分问题,因此目前应用仍然很局限。如果一个程序员目标是去期货外汇市场写分析程序,那么就可能用得比较多,甚至可能天天用。对于大多数程序员来说,半年用不到一次,注定不会精通这门语言,就要考虑到投入的时间和回报的问题。不得不说这种语言还是很抽象的,即使理论学的好到真正用了也未必能很好很高效得解决问题,因为大多数学习者都缺乏实际经验的锻炼。如果做了几次效果都不好,肯定也会影响和打击继续学习的信心。