有关“非计算机专业如何转行做程序员”的一点思考
今天老夫半夜爬起来等着看世界杯预选赛法国 vs 西班牙的比赛,在新浪微博里看到@程序员的那些事发的一封粉丝来信如下:
XXXX:员员好,我是 12 届的大学生,读了一所还可以的大学,但所学专业我很不喜欢,我因为性格较内向同时又感叹编程的神奇,所以很想进入这一行,但我去面试几家后发现就算是实习岗位也需要一些基础,虽说大学学过C语言但感觉也基本不会用,那些面试单位是建议我去学习这方面知识再去找他,但我又对这些培训机构不太放心,怕花费了一大笔学费结果却不好,现在我有些迷茫不知道该去找找其它工作(人才市场很多都是些销售和工厂的一些岗位)还是去学习,希望广大的员员们给我些指导,非常感谢。
看完还是有一些感触的。作为一个科班计算机系毕业,第一份工作就是软件开发,然后又在咨询和销售领域工作了很多年,再回归到开发领域的老码农,老夫对于该同学的纠结心情是非常理解的。但是,要把一份工作持续地做下去,光有热情是不够的,如果你总是不能把事情做得比你身边的人更好,你的热情就会慢慢地消退,会开始怀疑自己的决定是否正确,自己的坚持是否有意义。所以,我的建议是给自己一段时间打好基础,也借此过程验证自己的决定是否明智,就算最后的答案是否定的,学会一些编程的技术也会对培养自己分析问题的思路有所帮助。
好了,说到正题,非计算机专业的同学如何为成为一个程序员打基础呢?我建议走如下的步骤:
- 1. 学会一门编程语言。随便什么语言都可以,其实 python 很适合初学者,有本书叫《与孩子一起学编程》用的就是它。不过考虑到步骤2,还是选个流行的教学语言吧,比如 C++ 或者 Java。
- 2. 非常非常非常非常非常非常认真地学习《数据结构》这门课。你作为程序员功力几何,很大程度上取决于你在这方面的造诣。
- 3. 学好离散数学,重点是高等代数、数理逻辑、集合论、图论,最好再学会概率论。计算机科学的本质是离散数学,不掌握这些知识你如何能真正理解矢量、逻辑运算、最短路径、涂色算法这些概念呢?
- 4. 自己做一个小项目,尽可能把你学会的东西都用上。这不仅能向招聘者展示你的功力,也是一个把所学知识融会贯通的过程,只有做了一个项目,你学的知识才真正变成为了你掌握的技术。
有人看到这里可能要说了,码农对编程语言熟悉就行了,学那么多不相干的又何必呢?
老夫打个不太恰当的比方,离散数学和数据结构就像一个武林高手的内功,编程语言则是招式。内功不行,就算会很多招式,可以吓唬吓唬武功一般的人,但是碰到打硬仗这些花拳绣腿就不管用,会死得很惨。可惜现在很多人不重视内功,不少计算机专业毕业生连堆栈和队列是怎么回事都不知道,更别提二叉树、链表、图结构了。不管碰到什么需求,上来就定义几个大数组,你能指望他编出多高效的代码?比如现在互联网热门的大数据,算法效率是核心问题,如果谁整出个 O(n^2) 的算法,信不信老板分分钟砍死他?
再说远一点,学会一门编程语言容易,精通很难,难就难在理解它的精髓。有很多开发者热衷于最新潮的技术,今天玩玩 NoSQL,明天搞搞 Html 5,说起来头头是道,但是都深入不下去,从来没有真正没有理解这些技术的精髓,也就做不出一个能发挥出它们真正优势的产品来。这往往就是因为内功不行而心态又很浮躁。(补充一篇文章:《叶正盛:再次写给我们这些浮躁的程序员》)但是程序员是靠代码说话的,只是善于对某个技术侃侃而谈没有任何价值。Linux 和 Git 之父 Linus Torvalds 说过:“Talk is cheap. Show me the code.”(空谈无价值。拿你的代码来看看。)所以老夫要说,作为一个程序员,不先练好内功就写不出优雅的代码,这样是走不远的。
怎么学呢?这些不需要花很多钱去培训机构,而且从我面试过的很多培训学校学员的表现来看,绝大部分人学完了连 MVC 的概念都没搞明白,花半年时间就学会了 if…else,何必去糟蹋这钱呢?现在一些大学有旁听的学分课程,花几百块钱就可以听一门课,还可以交作业做实验(比如:http://zhidao.baidu.com/question/245256206.html)。建议你尽可能去选最好的学校,不仅仅是老师水平高,关键是同学的高水平会促使你对自己有更高要求,这和培训学校的氛围是完全不同的。
如果你在以上 4 步都做得很好,那么你应该可以在码农这个行业获得一些机会,剩下的就看你在工作中的表现和积累了。码农的修行是一个长期过程,计算机领域每年都有新技术出现。做了码农,就得活到老学到老,注定一辈子苦兮兮的。如果你喜欢这种感觉,那么你的选择可能就是正确的。
文章作者:@老码农的自留地