蜻蜓
提示 登录 注册 提示 21815/0 09年7月5日 周日 17点30分 站标
引用(0)请拷贝:
大类:[科技经济] → 版面:[信息技术]
1 2 共2页31 被收藏:24 用【工具】楼主帖全看树展
东方射日 2008-07-03 19:19:15 1690494
O 【原创】从程序员到软件工程师 花 36
看了荆棘老弟的程序员系列,颇多同感。做为一个从业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。傅利叶变换

铁手 入典。铁手 荐,
转发 回复 送花↑36↓0 收藏工具
stam69 2008-07-03 19:44:14 16905251690494
O 沙发
闻砾 2008-07-03 20:26:30 16905761690494
O 有意思
花。
没有想到还有算法工程师。
1.正态分布的随机数是有标准算法的吧,如果取包络线内的数是不是效率不够高?当然够简明。
2.这个俺不知道,图论没学过。:)
3.傅立叶变换,滤波,反变换?
难道比直接求平均快?
Doob 2008-07-03 21:17:31 16906211690494
O 我有两个问题
想请教,
第一题你的算法,除了程序写起来短点,有什么计算上的优势吗?
第三题和傅立叶变换有什么关系?
熊仔 2008-07-03 22:05:01 16906701690494
O 3,为什么不用xxx插值法.
迪塘钱 2008-07-03 22:21:49 16906851690494
O 傅利叶变换?
从时域到频域,再从频域到时域,要考虑边界问题吧?要我说,直接设计一个从时域到时域的滤波算法,实际上就是一个重采样的算法。
牛腰 2008-07-04 00:55:41 16908111690494
O 其他方法
1.如果原始随机数是平均分布的,可以用inverse normal cumulative distribution function来取得正态分布的随机数,这样每一个点都可以用到。

3.这个为什么要用傅利叶变换?要把每五分钟的数据变成每小时、每天、每周的数据似乎只要每过N个点取一个数据或N个数据的平均就行了。是我的理解太简单了吗?

最后于2008-07-04 01:34:16改,共1次;
earthcolor 2008-07-04 01:25:02 16908341690494
O 好久没有得宝了
我也和大家一样,等着你解释一下答案。

第二题自己写过程序。人工智能里的基本搜索

恭喜:你意外获得【西西河通宝】一枚
鲜花已经成功送出。
此次送花为【有效送花赞扬,涨乐善、声望】

瓦斯 2008-07-04 03:41:59 16909021690494
O 1.如何生成一组正态分布的随机数?用一维均匀分布的随机数 花 1
做为
正态累积分布函数的反函数
的变量。


====>我的建议答案
1。生成二维随机数,只取落在正态分布包络线内的数

这个我不了解,你有空给大致介绍一下吧。

最后于2008-07-04 07:46:24改,共1次;
东方射日 2008-07-04 07:39:00 16910811690494
O 几点说明 花 1
感谢大家的回帖,不过很多人更关注于我提的三个问题,我想加几点说明

首先,我说的是我的建议答案,可能不太妥,应该删除建议两字。其实有过一些面试经历的人会知道,面试人通常并不指望你在短短的时间内给出完美的标准答案,并且一些问题并没有标准答案,例如微软著名的问题,给全西雅图擦窗户你该收多少钱?

所以,面试人更看中的是应聘人的思路和利用现有知识解决问题的能力。

我说过我痛感自己的数学能力太差,河里其实有很多数学大牛,我印象中大洋芋就是一个。我可不敢也没脸在这里卖弄数学。

回到我的三个问题上,第一个问题我根本不记得正态分布函数及其反函数,如果知道,当然用楼下瓦斯同学的答案是更好的。但是如果你是应聘人,你会如何回答?告诉面试人“不知道“?所以在这种情况下你能不能提出你的解决方案?我就在白板上画一个坐标,粗略勾出正态分布的函数曲线,然后告诉他们只取在曲线下的点。

第二个问题,如果你搜索一下可以发现大量的关于迷宫算法的文章,有的很详细给出具体实现,告诉你分支点近栈尝试搜索什么的。你可以详细解释你的算法,但是如果你把迷宫抽象成连通图,告诉他们做连通图的深度优先遍历,那是不是更简洁和可以拿更好的印象分?

第三个问题,对于股票价格来讲,也许数学平均或插值法都是可以接受的。但我当时的背景是刚做过JPEG压缩,用的是DCT。见到这个问题,脑袋马上就把问题抽象成有一组离散的高频信号,要抽取其低频的特征值。所以我的回答就是离散傅立叶变换。

通常面试人在你给出答案后,除非是显而易见的,都会接着问Why?How?或者有可能接着问一些例外处理。其实更重要的是在这些随后的问题如何回答,因为这体现了你的思路和基础知识。

归根到底,我给程序员的忠告是:
国内的,拓广知识面;国外的,加深数学能力。
瓦斯 2008-07-04 08:06:06 16911061691081
O 你说的很对
我也就没见过正态分布累计函数的反函数是什么样子的,只知道ms-excel里面有个NORMSINV(probability)可以调用。

很多事情,我是支持爱迪生的的看法,不要死记公式,要知道需要用的时候去哪里找公式就可以了。

在此,再次痛批一下我国的题海式填鸭式的教育方式。

四方城 2008-07-04 08:39:06 16911301690902
O 瓦斯老大说的是正解
教科书解,也许还有其他办法

lz说的估计是面积法。但是正态分布的支集是负无穷到正无穷,面积法估计行不通

四方城 2008-07-04 09:02:56 16911571691106
O matlab生成randn的办法
matlab newsletter里有一篇文章讲到如何生成normal distribution的随机数:链接出处

随机数算法的要求应该是精确度和性能的平衡。

实际的算法没有用累积分布函数反函数的办法做,我猜一个原因是正态分布的cdf没有解析表达式,另一个原因这样做是效率太低


最后于2008-07-04 09:19:21改,共2次;
量子 2008-07-04 09:25:03 16911741691081
O 第三个问题你问得不清楚
看你建议答案的意思,好像是要弄一个低通滤波器;这个在时域里就可以完成,DFT只在设计滤波器看频响的时候有用。

股票里面所有的各种平均线都是某种低通滤波器;频响不同而已。
四方城 2008-07-04 09:27:13 16911771691081
O 傅立叶变换的低频分量
要抽取其低频的特征值

如果是平均价格的话就是频域的直流分量。为了一个频率的分量把其他频点的也算出来岂不是大大的浪费了

这个试题的目的也许就是说:用简单的办法解决简单的问题,keep it simple, and stupidF
克雷 2008-07-04 11:29:57 16912691690494
O 【讨论】open source的使用
但是在国外有很大的不同,稍正式的公司基本上都禁止使用open source。


不同意这一点.我在国外几个Fortune500的公司工作过,很多资深开发者都来自Open source社区,好些大型open source项目的背后都是我们公司在支持. 基本上open source的版权有很多种,从限制最少的BSD版本到限制最多的GNU. 我相信你说的copy-left是指FSF的GPL, 但FSF也有LGPL的版本,对库函数的商业使用网开一面. 另外Java也可以算open source了, JDK的绝大部分是公开源码的.使用java的大小公司可就多了去了.

嵌入式领域可能风气不一样, 但互联网领域的公司,极少有不用open source的. 即使是微软,open source的libjpeg它也从IE1.0用到了IE6.5.

克雷 2008-07-04 11:54:11 16912811691106
O 数值算法 花 1
最出名的教科书是 Numerical Recipes in C, 号称数值计算的入门Bible.具体的实现上CPAN也有几个库,提供normal, Poisson, binomial等常用随机分布.

对不是数值计算专业的人来说, 知道去哪里找就好了. 一个人不可能什么都精通,博闻再加上专精某一方面就不错了. 这一点国外的本科教育不错,基本上用的都是最权威的教材,而且给出大量的reference.站在巨人肩上的结果就是: 即使是天赋不太聪明的学生,做东西也不会离业界标准差太远.

p.s. 我是国内的本科教育, 但是我曾有一个国外上本科的roommate.

p.p.s.即使是生成最简单的伪随机数(一维uniform分布),如果要作为密码级应用的随机数发生器,这个算法也很难构造,足够ACM论文的水平了.我最近用过一些依赖于随机数发生器的算法,用MS实现的标准库函数rand(),比起GLIBC提供的rand,效果就是要差很多.

zhonghm 2008-07-04 19:18:52 16914791690494
O 走迷宫的算法很简单
大家不妨考虑一下迷宫生成算法,这个比较有趣。
【原创】从程序员到软件工程师 1 2 共2页
广告 购物分成,帮助网站

大厅。自动刷新完整聊
申请认证/群落(10)[查看或表达看法]
肥羊
西小镇
lfyabe
少裳
九三年
waribec
marssss
酸酸
王友
丰南隐士
歇后语我要添加 更多
  • 案板上的肉--任人宰割() [孤帆]
  • 肉包子打狗--有去无回() [孤帆]
  • 拆袜子补鞋--顾面不顾里() [孤帆]
  • 唱戏的穿龙袍--成不了皇帝() [孤帆]
  • 吃了豹子胆--胆子不小() [孤帆]
  • 池里的王八塘里的鳖--一路货() [孤帆]
  • 吃石头拉硬屎--顽固不化() [孤帆]
  • 六月的天孩子的脸--说变就变() [孤帆]

Copyright © cchere 西西河 feed 西西河规 版主规范 帮西西河 帮助(FAQ) 版面介绍 发帖特殊效果 网站地图 关于西西河