- == 系统问题,暂停聊天功能。==
- 【征集】西西河的经济学,及清流措施,需要主动参与者,『稷下学宫』新认证方式,24年网站打算和努力目标
主题:【原创】从程序员到软件工程师 -- 东方射日
看了荆棘老弟的程序员系列,颇多同感。做为一个从业13年,一直做软件开发的人,我想给那些已经、将要和有志于走上这条路的朋友一点点忠告。
首先,说说程序员和软件工程师。虽说都是编程的干活,但是还是有一点高下区别。
主要说来区别是程序员programmer是将程序(已经有流程,伪代码或设计模板)写成代码;需要熟练掌握至少一门编程语言。而软件工程师则要将目的描述成程序语言并实现的能力。例如将数学算法、自然语言、思维模式描述成程序算法,程序流程/类或/和人工智能,并写成代码的能力。
对初入行的人,当然重在语言,要做一个合格的程序员,首先要熟练掌握语言。包括语言特性和实现的能力。例如楼下使用尽量中文 说的面试题,就要求面试对象掌握C++中的类的封装;构造函数的重载和运算符重载。
做过一两年后,要想继续吃这碗饭就必须提高自己,首先当然是深入了解语言,特别是语言的思维方式,编译器的工作方式和常用设计模板。就拿C++的多态性来说,很多公司面试就会问什么是虚函数/纯虚函数(思维方式)?用C如何实现函数重载(函数指针和了解编译过程)?接口类/工具类/工厂类和 Sigleton类的实现(常用设计模板)。另外还有一大块就是内存管理了。
如果能做到深入了解语言本身,那么恭喜你,你现在Title至少是高级程序员了。
在对自己的语言有信心后,下一步就想一想自己要想哪方面发展。是管理方面(项目经理)还是技术方面(软件工程师)。既然这里讨论编程,我们就先不考虑项目经理。想发展为一个软件工程师其实也有两条路。一条是走系统软件工程师或者叫架构工程师的路;另一条就是算法工程师。
在国内的朋友我建议走架构工程师的路。要求就是知识面广,对整个系统熟悉,能很快了解和分析客户/设计需求,很快估计工作量、风险和所需要的资源(承担相当部分项目经理的任务),能根据现有技术人员储备提供一个解决方案。当然还需要一定的表达能力和文档写作能力。例如我当年走访某省农行,和对方聊了银行卡和医院医疗卡的联网,当天晚上就和市场部的人合作,搞了一个通宵,写出了60页的技术方案和外加40页的基于此方案的标书。
一般来讲,要做到对整体系统的深入了解,没有两三年的时间是做不到的。所以给国内程序员的建议是不要频繁跳槽,尤其是不要频繁跨行业跳槽。踏踏实实地将本行业的软件吃透,最好每个部门或模块都工作过。如果有这个想法,一般情况下你可以和项目经理沟通,通常他们会鼓励你这样到各个部门/模块工作。
我出国后,发现情况有点变化,由于语言和文化的区别,对自己走系统工程师的路没有很大的信心。只好转向走算法工程师的路了。
确定了这条路后,突然发现自己的数学能力太差了。不得不重新恶补线性代数,概率和数理统计等高等数学。同时将《数据结构与算法:C++版》好好从头到尾读了一遍。然后终于蒙混到了一个职位。
当时第一个任务就是在一个嵌入系统中写一段程序将bmp压缩为jpg。各位可能会问了,这个在网上满大街都是源代码,为啥还要自己写呢?其实这就是我不太建议国内工程师走算法这条路的原因。除非你是数学大牛,有自己原创的算法。否则在国内实在没有算法工程师很大的生存空间。但是在国外有很大的不同,稍正式的公司基本上都禁止使用open source。因为open source也是有版权的,有的是不能商用,更有的copy left是那些公司碰都不敢碰的。因为copy left要求你使用了他的代码,你也必须公开你的代码。
当然,我们可以看那些open source,然后自己重写。不过相信我,通常情况下如果你不是想简单做些变量替换就交差的话,看原代码不如看这个算法文档本身。
当时看算法本身的文档,然后又回头看线性代数,终于理解了算法,并用程序表达了出来。由于是嵌入式用的,又花了大量时间进行算法优化。
后来跳槽时终于尝到甜头:
1。薪水高,基本上一应聘就是Senior的职位
2。稳定,这个一般大街上招一个程序员是做不来的
3。机会多,这个怎么说呢,反正只要是大公司招人,象微软、Google等,除了问一些语言本身的问题外,基本上就是算法和数据结构的问题。
通常面试那些时间你写源代码是来不及的,基本上就是写伪代码。或说明你的算法基础和思路。答的好一两句话就解决了。
想走这条路的朋友,我首先建议好好读读《数据结构与算法:C++版》,里面所有常用算法和经典算法及数据结构必须烂熟。其次,建议将大学课本找回来,几本高数好好复习复习。《线性代数》《概率和数理统计》《微积分》《常微分》等等。
我们不是大牛,基本上创造不出新算法,但是我们能够将别人的算法实现或者能把一个具体问题分解成已知的算法,那么你就是一个很不错的算法工程师了。
说实在话,语言只是工具,是很容易掌握的。99年2000年泡沫时期,不是很多人突击那么三个月就可以上路做programmer么。就象刀法是很容易学会的。要应用精熟,也不过是长时间的积累而已。
对语言的理解实际上就是对刀法的领悟,有人是顿悟。但是多用总是会渐悟的。
最重要的是基础,就是数学能力,那可是内功。可以这样说,你要想真正和其他程序员拉来差距就在这里。
我朋友的孩子想走计算机编程这条路,考大学我就推荐考数学系!
再有就是多做那些大公司的面试题,一是锻炼自己的大脑,二是熟悉这些算法的应用。
好了,现在能想到的就这几点,
这里给几个面试的例子,看看能不能用最简单的描述解答
1.如何生成一组正态分布的随机数?
2.有一个二维迷宫,如何找到出口路径?
3.有数据库存储一股票每五分钟的实时报价,如何生成每小时,每天,每周.....的股票价格变动曲线?
====>我的建议答案
1。生成二维随机数,只取落在正态分布包络线内的数
2。二维连通图深度优先遍历
3。傅利叶变换
花。
没有想到还有算法工程师。
1.正态分布的随机数是有标准算法的吧,如果取包络线内的数是不是效率不够高?当然够简明。
2.这个俺不知道,图论没学过。:)
3.傅立叶变换,滤波,反变换?
难道比直接求平均快?
想请教,
第一题你的算法,除了程序写起来短点,有什么计算上的优势吗?
第三题和傅立叶变换有什么关系?
从时域到频域,再从频域到时域,要考虑边界问题吧?要我说,直接设计一个从时域到时域的滤波算法,实际上就是一个重采样的算法。
1.如果原始随机数是平均分布的,可以用inverse normal cumulative distribution function来取得正态分布的随机数,这样每一个点都可以用到。
3.这个为什么要用傅利叶变换?要把每五分钟的数据变成每小时、每天、每周的数据似乎只要每过N个点取一个数据或N个数据的平均就行了。是我的理解太简单了吗?
我也和大家一样,等着你解释一下答案。
第二题自己写过程序。人工智能里的基本搜索
鲜花已经成功送出。
此次送花为【有效送花赞扬,涨乐善、声望】
做为
正态累积分布函数的反函数
的变量。
1。生成二维随机数,只取落在正态分布包络线内的数
这个我不了解,你有空给大致介绍一下吧。
感谢大家的回帖,不过很多人更关注于我提的三个问题,我想加几点说明
首先,我说的是我的建议答案,可能不太妥,应该删除建议两字。其实有过一些面试经历的人会知道,面试人通常并不指望你在短短的时间内给出完美的标准答案,并且一些问题并没有标准答案,例如微软著名的问题,给全西雅图擦窗户你该收多少钱?
所以,面试人更看中的是应聘人的思路和利用现有知识解决问题的能力。
我说过我痛感自己的数学能力太差,河里其实有很多数学大牛,我印象中大洋芋就是一个。我可不敢也没脸在这里卖弄数学。
回到我的三个问题上,第一个问题我根本不记得正态分布函数及其反函数,如果知道,当然用楼下瓦斯同学的答案是更好的。但是如果你是应聘人,你会如何回答?告诉面试人“不知道“?所以在这种情况下你能不能提出你的解决方案?我就在白板上画一个坐标,粗略勾出正态分布的函数曲线,然后告诉他们只取在曲线下的点。
第二个问题,如果你搜索一下可以发现大量的关于迷宫算法的文章,有的很详细给出具体实现,告诉你分支点近栈尝试搜索什么的。你可以详细解释你的算法,但是如果你把迷宫抽象成连通图,告诉他们做连通图的深度优先遍历,那是不是更简洁和可以拿更好的印象分?
第三个问题,对于股票价格来讲,也许数学平均或插值法都是可以接受的。但我当时的背景是刚做过JPEG压缩,用的是DCT。见到这个问题,脑袋马上就把问题抽象成有一组离散的高频信号,要抽取其低频的特征值。所以我的回答就是离散傅立叶变换。
通常面试人在你给出答案后,除非是显而易见的,都会接着问Why?How?或者有可能接着问一些例外处理。其实更重要的是在这些随后的问题如何回答,因为这体现了你的思路和基础知识。
归根到底,我给程序员的忠告是:
国内的,拓广知识面;国外的,加深数学能力。
我也就没见过正态分布累计函数的反函数是什么样子的,只知道ms-excel里面有个NORMSINV(probability)可以调用。
很多事情,我是支持爱迪生的的看法,不要死记公式,要知道需要用的时候去哪里找公式就可以了。
在此,再次痛批一下我国的题海式填鸭式的教育方式。
教科书解,也许还有其他办法
lz说的估计是面积法。但是正态分布的支集是负无穷到正无穷,面积法估计行不通
matlab newsletter里有一篇文章讲到如何生成normal distribution的随机数:外链出处
随机数算法的要求应该是精确度和性能的平衡。
实际的算法没有用累积分布函数反函数的办法做,我猜一个原因是正态分布的cdf没有解析表达式,另一个原因这样做是效率太低
看你建议答案的意思,好像是要弄一个低通滤波器;这个在时域里就可以完成,DFT只在设计滤波器看频响的时候有用。
股票里面所有的各种平均线都是某种低通滤波器;频响不同而已。
如果是平均价格的话就是频域的直流分量。为了一个频率的分量把其他频点的也算出来岂不是大大的浪费了
这个试题的目的也许就是说:用简单的办法解决简单的问题,keep it simple, and stupid