国内五年码农谈一点个人对CS的看法
寄托天下 2016-01-28 16:08 我要评论 浏览12644次

基本个人背景



本人大龄工作党留学,目前在UBC Okanagan读计算机硕士。出国前是国内某985高校的通信工程硕士,在国内毕业后程序员这个职业干(bao)了(lou)五(nian)年(ling),老东家是中(bu)兴(shi)通(hua)讯(wei)。然后因为我小孩的出生,开始考虑移民的问题,最后在一番努(zhe)力(teng)下,走上了留学这条路。



关于英语


在谈CS前,我想谈谈英语,其实我是来给大家信心的,因为我相信大多数人的情况应该比我好。我英语一直不行,现在高中同学聚会时大家还会拿当年我高中英语老师的话来逗乐子,我高中英语老师当着全班的面说:“×××,全班前十名就你的英语不及格,你是不是故意给我难看的啊。” 我高一高二时英语极其稳定处于85-90这个区间,大家都觉得这事太奇葩,想故意做到都难。直到高三才突破到90多,可依旧达不到100,包括高考。现在回想起来真的是也说不清楚为什么英(lao)语(shi)就(shen)是(cai)学(bu)不(gou)好(hao)。


到了大学也不知道走的什么狗屎运,四级一次就过了。然后就彻底放松英语了,放松的表现是之后的六级考试我都报名了直到大学毕业,你应该明白这是什么意思......


读研时把六级混过了,工作后就更加和英语绝缘了。所以我当时做了留学这个决定的时候,自己内心真的没底。中间的过程就不说了,总之我坚持下来了。在这个过程中,我真的非常后悔当初为什么没有把英语学好。不过廉颇虽老,尚且能饭,亡羊补牢为时不晚,我这种高(wo)龄(hai)大(bu)叔(lao),英语渣渣都能最后考到雅思6.5和7,达到入学要求。我相信大家都能做到。


其实到了加拿大后,也不是说英语自然就会变好了。想提高还得靠自己的日积月累,虽然我给自己挖的坑不小,但这不也终于爬出来能探个头出来了。


总之,自己做过的事后果所带来的后果自然要自己承担。所以尽量不要留遗憾,尽量不要抱怨,尽量不要后悔自己当初如果怎么怎么样,现在就不会怎么怎么样。没有目标的赶紧去找目标,有了目标的,抓紧干活。



关于CS


CS这个话题被无数留学党吵过了,我也不凑这个热闹。我这就是把我当码农的经验和对这个行业的一点看法介绍给大家。这个论坛上大多数人应该都没有我大,有实际经验的应该也不多,所以也算给大家的决定加些信息依据吧。


我个人的经历是前两年半在中兴做路由器OS层码农,后两年半做的是ICT平台码农(I = Internet, C= Communication)。


我在第一段码农经历的末期已经对这个工作绝望了,天天加班改bug,觉得编程不过如此。那时候甚至动了转到海外销售的念头,这事之所以没成是因为我遇到了一个人,就是Agile Software Development: Principles, Patterns, and Practices这本书的翻译者,他把我招入他的团队(还是在中兴)。他让我看懂了什么是真正的CS,什么是好的代码,想写出非常漂亮的代码需要什么。可以这么说,和他一起工作的两年所获得的经验以及认识也是我出国留学的原因之一,我很清楚的知道了我要什么但目前我还缺什么。所以我在这里负责任的说,编程这个工作,如果往下挖,深不见底。


接下来,我想谈谈软件行业本身到底是干什么的。我认为,简单说,软件行业的本质就是通过计算机强大的计算能力把人类从各个行业中的重复的,机械的劳动中解脱出来。所以从这个角度说,计算机编程是对各个行业的升级改造,就好像第一次工业革命时蒸汽机对动力系统的改造。这个东西躲是躲不掉的,必须积极拥抱上去。


所以,写代码本身只是基本功,是基础。想要在这行干得好,你一定要对你所解决的领域本身有出色的认识,清楚的知道你在用软件做什么,能改造这个行业的什么部分,然后实现它。


其实,我一直在想怎么向行业外的解释,想了半天就用通俗易懂的分级给大家讲解一下吧。分级分的比较随意,大家看看意思就行了。


想干这个行业,要经过这些关。


第一关,要会编程语言。这是最最基础的了。我上学那会大家都是学C/C++,现在大学好像是教Java。针对这部分内容,我个人的建议是要多学几种编程语言,会的多你的思路才不会窄。思路不窄,走的路才宽。


个人建议是 过程类语言会一个,比如C。OO类语言会一个C++或者Java。函数类语言会一个,比如LISP,HASKELL。最好科研用的也会一个,最常见的就是Matlab了。

这些语言都掌握后,再出现新语言你就不会犯怵了。Python,Javascript还是Go,随便来。千变万变,不离其宗。了不起就是这几类编程语言所代表的哲学的混合产品。


第二关,会点算法。Leetcode刷起来,如果有时间,建议算法导论刷起来。如果还觉得不过瘾,请刷高老爷子的TAOCP。


等你过了这两关后,可以说就具备了当程序员的基本条件了,可以去撸面试了。但要认识到,这两点只能保证你从基层干起。你进入公司后多半先给你培训,培训什么呢?就是我之前说的招你这个公司所要做的软件的业务类型和业务知识。比如我第一份工作是做路由器软件,那你多少要知道些路由,报文交换,TCP/IP这类的知识吧。做底层编程,那中断啊,CPU架构神马的你总要有概念吧。做办公软件,那办公审批流程你总得理解吧。


第三关,精通业务模型。随着你工作的深入,你会发现现在很少有软件是可以独立完成的,都是集团作战。那多数码农在干了2,3年后就会多半面临如下两个选择:一个是自身的编程能力不错,对业务也熟悉不少,再学点行业流行的软件框架之类的,那你可以升职为设计师,架构师。因为软件是一堆人开发,也有的人组织能力强,协调能力强,交流能力强,能在领导面前表现,事情能安排的井井有条,那就成为开发经理,对外接口人神马的。当然现实的情况比这个要复杂,而且现在也有了一个开发经理和设计师杂交出来的职位-产品经理(我是指软件产品啊)


如果你过不了第三关,那么就会一直是个码农。这是很现实的,我知道的很多人,因为理工科学生自身不太会表现自己,也意识不到工作协调的重要性,加上自己也没想那么多,领导给的活做完就不管了,自己回去就看动漫玩游戏,根本不在业务或者产品视野上对自己充电,所以一直就是个“写代码”的。


第四关,这个就比较简单了。设计师继续积攒经验成为总工程师,开发经理则升级为项目总经理这类的。当然能来回交叉,两个方向都做的来的高手也不少见。


这只是为了方便大家理解,我把软件工作很简化了。大家可以看看,自己的兴趣,爱好和天赋在哪里,能否适应这个工作的要求?


当然,学习计算机理论是另一个话题,也是我感兴趣的方向,也算是我出国留学的原因之一。大家有兴趣的可以和我私下讨论。

这里我加点私货,我觉得,计算机界的大神都是理论界和工业界都搞得定的大牛。


总结


我只是简单的把软件这个行业的大概给大家粗粗的描述了一下,让大家对这个行业以及行业内部的上升通道有个印象。


至于这个行业是不是青春饭?年纪大了就学不动了吧?能挣钱吗?竞争激烈吗?等问题,我之前在别的帖子里说过了,想了解请移步


http://bbs.gter.net/forum.php?mo ... ge=28#pid1779969478

http://bbs.gter.net/forum.php?mo ... age=5#pid1779229736


一点补充


基本上具备了第一关和第二关的能力,就可以出来面试了。你看基本上公司面试都要求说熟练掌握XXX语言,但你仔细看多数还有一条,就是计算机专业,数学专业优先考虑。不知道大家有没有想过为什么会这样?因为他们是科班出身。那科班出身的到底有什么优势呢?


我之前也说在第一份工作末期,我对编程工作已经绝望了。原因就是系统有无穷无尽的bug(不是我的代码导致的,我的代码bug不多),每天工作就是在不停的找bug和改bug。我在思考为什么会这样,一直没有结果所以一度认为这工作太操蛋。后来我遇到了高手,终于弄明白一点。


结合我之前说的程序员们在第三关面临的两条路。如果走向开发经理这条线,简单说,就会研究各种开发模式。比如瀑布性开发(当年灯塔国开发战斗机时用的模式)到现在很流行的敏捷开发。开发经理就需要根据这些开发模式的特点结合自己手上开发人员自身的素质和任务本身做相应的工作任务分配等,然后带领大家奔着一个目标努力前进。


产品经理则高端一点,不仅带领大家前进,还要自己去找前进的目标。


我个人是想走另外一条路的,所以对此也有点心得。为什么很多程序员在干了2,3年后都会觉得编程不过如此。一个原因(发生在我身上的)就是业务模型本身没有和编程结合起来。听起来很扯淡,但这是真的。简单的说,代码就是业务模型的具体展现,是你脑子中业务概念的现实存在。有些人是业务本身一团浆糊,所以代码写的烂。更多的则是没有把代码和业务结合得很好。脑子里想的挺好,代码写出来就不是那么回事,所以bug不断。或者是代码写的太死,业务模型一有改动,代码修改起来要累死人的节奏。我一开始就是卡在这里,时间久了觉得这事也不过如此。但给我第二份工作的那个研发高手用自身的实力告诉我"你啊,too naive, too simple"。本来是有很好的方法的,只是你不知道。方法是什么呢?就是数学。。。。


简单的说,比较好的办法是用数学的抽象思维去思考整个业务,提炼出核心概念,周边概念。再思考出各个概念之间的关系,映射到数学的运算关系上,然后两个概念“运算”后有一个新的概念,把这个概念再加进系统中,思考其与其他概念的逻辑关系。(我只能这么描述了,想有更多请看SICP这本书)


所以也就是说突破第三关的一个关键就是要有足够的数学思维,理论背景。当你把业务抽象后,代码清晰可读,容易变动而且还没有bug,看起来就像读数学公式一样过瘾。(这是我亲眼所见)此外就是再加上些工程师的思维方式,比如要会做取舍,要清楚自己系统和硬件的极限在哪里等。这几条你都具备了,想不成为一个优秀的软件设计师,架构师都难。


又啰嗦了这么多,仅供大家参考。大家可以看看软件之路各个分支上需要怎样修炼再看看自己是否具备和喜欢不同方向所要求的不同素质。这样在做决定时就不会太盲目了。


原帖作者:codercaspar

原帖链接:http://bbs.gter.net/thread-1934421-1-1.html

©详细内容版友讨论请看论坛原帖,本文文字内容版权归寄托版友codercaspar所有,不代表寄托天下立场。


  • 相关阅读
  • 寄托热选