淘客熙熙

主题:【原创】从程序员到软件工程师 -- 东方射日

共:💬32 🌺43 新:
分页树展主题 · 全看首页 上页
/ 3
下页 末页
  • 家园 【原创】从程序员到软件工程师

    看了荆棘老弟的程序员系列,颇多同感。做为一个从业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。傅利叶变换

    元宝推荐:铁手,
    • 家园 我有着算法工程师的理想

      却莫名其妙的被招到一个刚成立的小公司做安全系统了。算法工程师可能是考研时候的目标吧。

    • 家园 如果你想成为吴京华第二, 那就来做程序员吧

      通常, 工作的时间越长, 经验就越多,

      你在这行就越吃香。

      比如, 医生, 律师,甚至电工都是。

      但是, 程序员不是的。

      如果程序员跟不上新技术的发展,

      只能被淘汰。

      难怪李安的太太不让她老公学电脑。

    • 家园 关于open source

      lz 对open source 的理解还是有误区,现在对商业友好的open source license 越来越多了。我作了5年的open source project 了,都是商业公司在做,而且是对商业用途完全没有限制的。

    • 家园 能答上这几道题是什么水平?

      一两年后的水平,还是算法工程师的水平?

    • 家园 算法派和构架派

      两个不同方向,就像武术中的内家功和外家功一样,或是剑宗和气宗

      也许真正的高手是两方面功底都不错,其中更方面更善长一点,呵呵

    • 家园 呵呵,这个答案不好

      发现下面讨论过了

    • 家园 什么样的工作会是对算法要求多的呢

      印象中似乎对算法有编成需要的一般是比如软件商,如压缩,搜索,加密,图象,流媒体等,另一大宗需求就是近年随着对冲基金的兴起而大量出现的基金数学模型。

      除了这些之外,看不到算法工程师有很广泛的市场需求呀。 不过,要是比老印的软件工程师,中国人可能真的只有走算法这条路比较有前途。

      • 家园 很多

        除了你所说的那些专业软件外还有

        1。所有需要进行数据处理的单机、嵌入式设备的软件。由于无法使用专业数据库,很多数据结构和算法必须自己写。尤其当你没有STL的时候~~

        2。所有的游戏软件,其中所谓的人工智能就是那些标准算法 的堆砌和组合。

        3。实验分析和统计软件,或者可以统一叫数据分析data mining,包括统计分析,曲线拟合,数据筛选等。

        还有我不知道,不了解,没听说过的

    • 家园 问题3不太明白意思
    • 家园 走迷宫的算法很简单

      大家不妨考虑一下迷宫生成算法,这个比较有趣。

    • 家园 【讨论】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.

      • 家园 不清楚,不过我的经验和你不同

        我在这里经历过两个公司,公司都明文规定禁止私自使用open source,如果确实需要使用的,必须书面上报公司,由公司法律部门判定是否可以使用,如果需要授权的,由他们去决定是否支出该预算。

        总之,基本上我们从来没有使用过下载来的open source。

        即使是改写open source,也必须由TD进行code review,要求程序结构明显不同。

    • 家园 几点说明

      感谢大家的回帖,不过很多人更关注于我提的三个问题,我想加几点说明

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

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

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

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

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

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

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

      归根到底,我给程序员的忠告是:

      国内的,拓广知识面;国外的,加深数学能力。

      • 家园 第三个问题用傅里叶变换有点牛刀杀鸡

        得先变换到频域,再抽取低频分量,再变换回时域。我觉得这个问题直接在时域上做简单的均值滤波就足够了,用不同时长的窗对付每天每周或者更长周期的要求。

        当然,面试过程中扯一下傅里叶变换还是比较唬人的,至少显得很academic。

分页树展主题 · 全看首页 上页
/ 3
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河