蜻蜓
提示 登录 注册 提示 19045/0 09年1月7日 周三 16点05分 站标
正三品:金紫光禄大夫|冠军大将军级别

头像 积分:30066 乐善:1015 声望:1219
离线/隐身 东方射日 家园博客 发短信
注册于:2004-07-05 00:29:25
典藏版 信息技术:[入选] [候选] 大类:[科技经济] → 版面:[信息技术]
6304/30 转发回复分页全看树展 引用0 送花290收藏:20工具
o【原创】从程序员到软件工程师 [ 东方射日 ] 于:2008-07-03 19:19:15
看了荆棘老弟的程序员系列,颇多同感。做为一个从业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。傅利叶变换

铁手 入典。铁手 荐,
6304/30/0 转发回复分页全看树展 引用0 送花290收藏:20工具
引用(0) 请拷贝:
※※※ 相关(回复)帖 ※※※
O 【原创】从程序员到软件工程师(东方射日;字4673 阅6304 花29 O
O 如果你想成为吴京华第二, 那就来做程序员吧 (英雄;字189 阅265
O 关于open source (可爱的中国;字168 阅167
O 能答上这几道题是什么水平? (野鸡;字38 阅134
O 算法派和构架派 (crazyah;字124 阅372
O 呵呵,这个答案不好 (【子衿】;字22 阅432
O 什么样的工作会是对算法要求多的呢 (顾非;字275 阅623
。。O 很多 (东方射日;字362 阅515 花1
... 共 》30《跟帖
广告 购物分成,帮助网站

点这里自动刷新◆ 或者 完整聊天

英雄榜 前十名(左栏新兵,右栏全站)
Che
流川
曲里拐弯
羽羊
奥森
暗香疏影月黄昏
北京地主
西洋镜
秋原
逐日夸父
晨枫
errorking
北宸
抱朴仙人
1001n
大煮
wsxx
九霄环佩
aokrayd
亦无用

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