软件靠吃年轻饭、学习技巧、就业或上研等问题之我见

一、             软件靠吃年轻饭,这是中国特色的说法

1.       吃过猪肉不代表见过猪跑,软件不只是写代码而已

先让大家看个行业数据:在软件行业里,产业化团队的生产率只有1000代码行/年,当然这是以人为单位。许多在校大学生光作业和考试写过的代码,早就超过1000代码行/年的速率,就我前阵子提过的那个一小时完成的小项目,也有近200的代码行,按这个数量级看来,1000代码行不过是一天的工作量。

大家不用吃惊或怀疑,上面的数据是真实的情况(见《人月神话》)。为什么会有这么大的反差为我们说的是程序,而人家说的是软件,这得看看我们平日的工作和软件行业的真实产出有哪些差距。

我们学生平日所做的,叫程序,它本身是完整的,可以由作者在所开发的系统平台上运行。但那样的东西还未能达到实用化、商业化、产业化的高度,还有两种途径可以使程序转变成更有用的、但成本更高的产物。

一种是将程序变成编程产品,这是可以被任何人运行、测试、修复和扩展的程序。

它可以在多种操作系统平台上运行,供多套数据使用。这就要求程序必须按照普遍认可的风格来编写,特别是输入的范围和形式应广泛适用于各种合理的基本算法;接着还得对程序进行彻底的测试,确保它的健壮性和可靠性,这意味着必须准备、运行和记录详尽的测试用例库(绝大多数学生编程时都未考虑到测试的因素),用来检测输入的边值和范围;最后还要完备的文档,以便每个人可以使用、修复和扩展(见过不少学生写程序连注释都未能做好,这里面也包括我)。

另一种是将程序变成编程系统中的一个构件单元。

要求它是在功能上能相互协作、具有规范的格式、可以进行交互的程序集合,并可以用来组装和搭建整个系统。这就要求程序符合一定的要求编制,使输入和输出在语法语义上与精确定义的接口一致,同时程序还应符合原先设定的资源限制——内存空间、输入输出设备、计算机时间等。最后,还是测试的问题,即程序须和其他构件单元一道,以任何能想象到的组合进行测试,且测试用例会随着组合不断增加,范围愈加广泛,而且一些意想不到的交互会产生许多不易察觉的BUG,测试工作会是一个非常耗时的环节。

而事实上,软件产业真正需要的产出,是以上两种的结合体,即编程系统产品,经验数据表明,这样结果的成本是起初程序的9倍,然而只有它才是真正有用的产品,也是大多数系统开发、项目研发的目标。

前一篇日志里写说中国当代大学生普遍不符合社会的需求,就软件业来看,学校里做的,只是最低层次——即程序的实现,甚至连程序实现的要求都远未及社会企业的实际要求。因为在大家眼里,很少能见到哪一本教科书、哪一个教师或是哪一场考试会做出以下这些要求:

1)         单一功能子函数代码不得超过50行、形参个数不得超过7个、程序嵌套深度不得超过7层;

2)         圈复杂度必须在15以内,对程序的修改或扩展不得增加其原有圈复杂度;

3)         代码未写,文档先行,注释必须按照固定统一范式撰写;

4)         各类编程风格规范:关系运算必须常量在左、变量在右,不许使用复杂的运算表达式,必要时添加括号而不依赖于优先级,魔鬼数字需用宏定义替代等等;

5)         局部变量必须初定义、避免不必要的内存操作、内存操作必须考虑异常处理;

……

    可以列出的要求条目还有好多,而这些,还仅是新员工入职前要记住和注意的内容罢了,在工作过程中还有功能重量评估、测试用例编写(不仅限于测试人员,研发人员也需做自己的测试用例)、循环迭代敏捷开发等等,各种学校里接触不到的要求和环节,这在公司里仅是家常便饭。

2.       只有在中国,才能听到“软件靠吃年轻饭”的论断,而且说得最多的不是行业的专家,而是不明真相的学生和外行人

前几天做过一个小调查,问觉得“软件靠吃年轻饭”的有多少,结果近80%的人举起了手。多数人觉得软件靠吃年轻饭,是因为觉得做软件就是埋头写代码、通宵写代码、玩命写代码,靠的是年轻的拼劲和体力。

上面从软件行业产出的角度,表明了编代码写程序只是软件行业里最底层最基础的工作。从性质来看,软件其实就是利用计算机模拟人的计算与逻辑能力,从而以各种形式快速得到和展示思维的结果。所有软件活动都包括一根本任务——打造构成抽象软件实体的复杂概念结构,和一次要任务——使用编程语言表达这些抽象实体,在空间和时间限制内将它们映射成机器语言。

前一篇日志也提过,完整的软件设计是要经历需求分析、系统设计、编码实现三个步骤,对应的职位分别是系统分析师、软件架构师和程序员。把软件设计比作打仗,程序员就像小兵,实现的是软件中的次要任务,而根本任务的实现,就掌握在系统分析师、软件架构师、项目经理这些元帅和将军的手里。

系统分析师、软件架构师、项目经理这些都是程序员的高阶形态,或都归类于软件工程师,正如元帅和将军都先要经过小兵这一过程一样,而这一过程的转变,并非朝夕可达的。中国最缺的,就是有10年以上工作经验的软件工程师。金山软件董事长雷军(其投资的还有凡客、多玩、UCWEB、小米)曾说过:“在印度,包括在美国,我见到的项目经理都是三四十岁的人,他们‘越老越值钱’,有些人甚至拥有超过20年的行业经验。”事实上,做软件和做硬件的一样,都是越老越值钱,当然这里指的是程序员的高阶形态,而非程序员。

只是,不见得每个小兵都能往上发展,因为打仗这东西,光靠点手脚功夫是不够的,正如程序员埋头学习新的开发工具、钻研程序代码,一边挥洒汗水、熬夜写代码,一边又对自己30岁以后的职业方向充满恐慌,却不知逐步提升自己的视野、思维和经验。

前一篇日志也论述过管理和心理知识对研发人员的重要性,其对软件从业人员的作用更加明显,这是软件根本任务所决定的,也是解决软件固有属性困难——复杂性、一致性、变化性和不可见性时,所需具备的角度和能力。做软件的愈往上走,对从业人员的综合素质要求就愈高,这也才有了“越老越值钱”的说法。

前阵子,听朋友说做应用层的软件没前途,因为技术门槛低,没能把握住核心竞争力,可后来想想,不是没有竞争力,只是应用层软件是面向客户需求的,其核心竞争力不在于技术的实现,而在于需求的分析与心理的把握。

举两个简单例子,像近年来大热的小游戏——植物大战僵尸和愤怒的小鸟,二者的市场价值早已突破10亿美元关口。单从技术角度而言,其实现并非难事,但稍微有点心理学知识基础的会发现,二者有一明显的共同特点,即利用对比的手法,将两种不具关系的事物通过某种方式强制关联起来(植物和僵尸,小鸟和绿猪),游戏模式中还涉及到不同层次的动机与能力塑造,进一步加深玩家的喜好、甚至狂热程度。这两个游戏的成功,依靠的不是技术的优势,而是对心理知识的把握与运用,而这样的思维与成就,单靠写写代码、用用工具是达不到的。

软件的魅力在于它的创造性、不重复性和纯粹思维活动,但其困难也是随之产生的追求完美的必要性、由他人设定目标和思维逻辑的复杂性,这些问题的解决方法不单一依存于某本具体的书中,而是涉及管理、心理、逻辑、哲学等多方面的知识,恰巧中国教育方式将软件和这类知识分在了对立的两块中,也难怪会有中国软件业的这种囧态。

其实上述这些,许多企业和专家、从业人员都已意识到(像华为软件培训里相当一部分时间就是在进行管理类的培训),用百度或谷歌一搜“软件靠吃年轻饭”这句话,出来的基本都是否定的论断。这样的言论,流传得最多的便是学生和外行人,外行人就不提了,但学生是行业未来的人员,持有这样道听途说得来的观点,中国软件行业能不陷入恶性循环么/p>

只是也应该说,这是正常的事。人在不确定的时候总是倾向于相信周围人的意见,学校里的知识给不了更高更广的视野,学生们不清楚不了解,也难怪会听风就是雨。

二、             浅谈软件学习与推荐书籍

学弟问学习效率和编程语言学习技巧的问题,想了想,决定还是从推荐书的角度入手,毕竟很多东西书里的描述更具系统性些,我写日志或当面描述难免有些简略和遗漏。

先说高效学习的,即查尔斯·哈奈尔的《世界上最神奇的24堂课》的(一)和(二),这是成功学类的书,谈的是做人、再到做事的方法,概括起来大致就是明确渴望、了解信息、集中精力、实践行动这四步,“学习”是做事中的一种,自也包含在此书描述的范围内。

接着可以试着看些管理学的书,如彼得·德鲁克的《卓有成效的管理者》,史蒂芬·柯维的《高效能人士的七个习惯》和《要事第一》。有学妹问过我时间安排方面的技巧,其原理与方法正在管理学这类知识里。

以往大家有一错误认知,即觉得管理学是当领导才需要的知识,其实正如德鲁克所说:“每个人都是自己的管理者”,管理学首要研究的,便是管理者,或说我们对自身的管理,得先“修身齐家”才可“治国平天下”。

谈回软件学习的,这里浅谈下c、java和matlab,面向的是初学者,或是已有一点基础的同学。

c的优势在于对指针,或说内存空间的直接操作,适合于底层驱动、和硬件打交道等一类的操作,推荐的书是《高质量程序设计指南——C++/C语言》,这是华为培训的指定学习教材。这本书适合学过C语言、想要进一步加深对C理解与运用的同学,至于想更深入的,百度谷歌或CSDN吧,网上前人的经验帖还是挺多的,我这就不一一列举了。

java的主要是应用层、面向用户类的软件开发,像安卓的应用软件便是用java写的,推荐的书籍是《java核心技术》,仍是华为培训的指定教材。

matlab的就不好说了,因为功能确实太强大,特别适用于需要做数据处理、信号分析的,对于通信工程专业的同学,这可算最贴近专业的一门编程语言,笔者水平有限,这里就不勉强说明了,具体的仍可看看网络上从业者的经验帖。

有一本书不得不说的,便是之前提过的《人月神话》,它不涉及具体某种语言的编程,而是在阐述对软件行业的思考,是小兵进化成将军元帅的必读书。前期可能有些东西会看不懂,但随着实践经验的积累,会越发领悟到这本书的价值,这是看过此书的从业人员的普遍感受。

当然,无论是哪种知识,都不是用来看的,而是用来想和用的,就像高数光记公式不做练习,考试里怕也难取得高分吧于编程技巧的,除了书里讲的,关键还得回到实践中去领悟,有项目的做项目,没项目的做练习题,理论实践两手抓,空谈理论和知识是难有提高的。

还有一点要注意的,即现实要求没有分数之说,或说只有0分和满分,满足客户需求了就满分,出了问题就0分,你可以亡羊补牢,但没有讨价还价的地,改得好了保住饭碗,改不好了轻则罚款、重则收包袱走人,马虎不得,尤其做软件这行不可有随便随意的想法,否则害己还连累他人,大学里对学生的要求本来就低,轻易降低自我要求是没有什么好结果的。

三、             勿以难易择方向。既想不费功夫,又想前途光明的行业是不存在的

1.通信工程软硬兼修,既是优势也是挑战

同学间似乎流传着这么一句话:“读通信的比软件不如软院、计算机的,比硬件不如电院的。”

现在学科大有细分和交叉的趋势,无论软件或硬件,其实质都是通过其特有的方式实现某一特定需求,而通信则是软硬件可实现需求中的一种。

拿软件来说,上面也提过软件的根本任务和次要任务,就本科阶段而言,着重点还在次要任务的实现上,即便到研究生阶段分了方向,软院或计算机的学生还有安全、操作系统、图形、图像识别等多种方向可选,不见得每个学软件的都了解通信方向的知识,而要实现软件的根本任务,单靠写代码的熟练程度是满足不了的,所以从专业化的角度来说,通信类的学生在这一需求的实现上有其特有的优势。硬件的情况也类似。

会有前面那一说法的出现,其原因应是教学内容与实践时间安排的偏差所致。正因通信类的需求可通过软硬件这两种方式来实现,在教学总时间一致的前提下,通信类的教学时间需分散于软件、硬件和通信本身的专业知识上,这也就造成了广而不精的先天缺陷。实现方式的广泛和专业方向的深入,这是其优势,但也要求通信类的学生要更主动地寻找适合自己的方向后作进一步的深入。优势和挑战并存,若依赖于被动地接受学校知识,怕只会到头来两头都不是,这样的例子,倒也见了不少。

还有之前也提过在华为培训的经历,简单的程序却没几人能最终完成,这里面不乏通信、软件、计算机的学生。学软件的写不出程序,学电子的不懂电路设计,这其实也不算什么稀罕事。学校只负责领进门,修行终得靠个人。

2.勿以难易择方向,前进得于兴趣,兴趣源于了解,了解来自实践

曾说过感觉硬件比软件更难些,因为要考虑的有噪声、频带、失真、温度稳定性等限制因素,硬件工程师的成型周期长,相较之下做软件的入门较快,需考虑的主要就时间和空间两种限制,但越往后对自身的视野和思维要求越高,高级软件工程师所需的不仅是技术上的素养。

其实我不推崇就难易这个角度来看软、硬件间的差别。这就像问打篮球和打乒乓球哪个简单一样,篮球对体力要求较高,乒乓球则要求有更快的反应和速度,但若深入比较下去,会发现二者的规则不同、所需技巧不同、训练方式也不同,越发不具可比性,能拿来说的,也就剩从业人员的工资、数目比例和职业生命这些浅层角度。从这些表面的信息来看待一个行业,甚至作为未来方向选择的考虑因素,怕是不合适吧/p>

或从经济学的角度说,必要劳动时间决定价值,供需关系影响价值波动。无论是打工还是创业,其实质都是在向社会输出自己的知识与能力,你会的东西难度越大,越具不可替代性,收获自也越高。反之越轻松的工作,如看大门和打扫卫生之类的,其回报你们懂的。

还有这么一类人,叫做“好之者不如乐之者”,在外人看来似乎过得不咋费力,其实背后的努力与困难是超乎常人想象的,只不过他们以此为乐,再大的压力也能转化为动力,因为十分努力,看起来才能毫不费力。

谈回选择的问题,看过这么一段话:“路总是要走的,与其在分岔路口左右踟蹰,倒不如随意选择其中一条道,先走几步,若感觉不对劲就赶紧回头,换条路走,若感觉对了,就别羡慕其他的风景,坚持走下去吧。”试错法,相信大家已经听过不少了,只是光在旁边看人试,自己不动手,是很难有确切结果的。方向无好坏之说,却有适合与否之别,而这些,只有自己试过了才算真正知道。

学弟还问到了网络管理的问题,这个印象中似乎和思科认证的网络工程师相关,但详细的了解不多,还请知道的同学们谈谈自己的看法。

四、             上研还是就业父母的话还是走自己的路/strong>

1.       个人经历——提防好心人的建议,好心也会做坏事

说来我不是传统定义的好学生,大学期间出勤率最高的要数体育课了。因为对中国应试教育的反感,所以大二时便决定了本科毕业后找工作。

或许如大多数大学生一样,这样的决定引起了家人的担心,于是父母发动各方亲朋好友来说服我,说现在社会竞争激烈,有一个研究生的文凭才有优势。

面对这些说客,我一般都会客客气气地问几个问题,如“您读过研究生吗”“您周围的研究生多吗”“您了解研究生招聘的详细要求吗”等,听到最多的回答是“没有”“不多”“不了解”,问为啥会持读研的观点,回答通常是“大家说的”。

这样的情况持续到某一天,即我堂哥和嫂子到家做客时。我哥嫂二人是哈工大读光纤的同班同学,我哥考不上研,本科毕业去了工作,嫂子则继续读研。要说我嫂子,绝非一般人,在校期间成绩优秀,人长得也清秀,研究生毕业前工作便签了JDSU(目前全球最大光纤零件供应商,光通讯领域巨头之一),年薪20万。正是这位牛嫂子的一句话改变了我父母的看法:“我觉得男生还是早点出来工作好,像你哥现在工资早比我高了。”于是此后父母见人都说,还是本科毕业工作了好。

在这提这事,绝非是说本科毕业要工作不读研,嫂子的言论有其片面的地方,后面会再分析叙述。这里想表达的,即是要小心提防好心人的意见,因为他们的意见很可能是听来的,而非自己真正体验、证实过的观点,好心也可能做坏事,前阵子也见过一篇日志,叫《害,以爱之名》。正如我这里所说的,只是我个人的所见所闻所思所得,不见得适合于每个人。不过能肯定的是,这些人不会闲着无聊来害你,尽管可能意见不合,或根本就存在着谬误,毕竟是好心一场,笑着答谢,然后取其精华去其糟粕便是了。

简单地说,就是听多数人的意见,和少数人商量,然后自己做决定。

2.       浅谈对读研与就业差别的看法

前阵子和读研的学长讨论读研相比就业的优势,得出的结果是学历和学术。所以对于想进国企、央企、高校,或立志为学术做贡献的同学们,研究生是必读的。但若从经济的角度考虑,本科毕业后就业的优势更大些,同比研究生的三年,就业的能在这期间积累不少收入、工作经验、人脉关系,甚至已有了职位上的提升。

但需要注意的一点,即压力、环境和能力的问题。先说压力,读研期间压力小,不会有人逼着你去学去干,关键靠自觉;就业的压力大,因为饭碗在那摆着,不干活就没饭吃。对于环境的,前面提到学术的问题,读研的更贴近学术,若跟了个好老师在读期间可以接触到许多前沿的东西,开阔视野;就业的更贴近工程,接触到的工作都是上层划分好的,着眼的更多是手头的工作,若要有更高更广的视野,需要自己主动去了解。至于能力方面的,研究生期间再安逸的,也会有一定的项目实践,而在就业时,比起同样安逸的本科生,自然有了优势,本科毕业想就业的,最好先做好准备,提高下自己的成绩和项目经验,否则拿什么资本来挑企业。

无论选择哪条路,要想清的是什么对自己最重要,明确目的,读研和就业都是途径,途径终究是该围着目标转的。其次就是态度问题,无论走的哪条道,积极主动的态度是没错的,你越主动,再多的困难也会逐步化解,越被动,各种没想到的问题都会找上你,现在越忙碌,往后才能越轻松。

五、             感谢同学们、杨建国老师、《电子工程专辑》的肯定与鼓励,改变从现在做起、从自己做起、从身边做起

前阵子发了篇日志,引来了不少同学、朋友的关注和分享,大家也留下了自己的看法和建议,在这先谢过各位了。

前些天见《电子工程专辑》发的订阅消息中竟推荐了我的文章,杨老师和《电子工程专辑》的网站分析师Mike也来我的博客留了言,没想过会引起各方的关注,小吃了一惊,心中也难免有些窃喜。

Mike调侃我说表现出了不符合我这个年龄的成熟与全面,杨老师也建议我去唱个K,放松下自己。这里还得感谢二位老师的肯定、鼓励与建议,我当尽力做好手头之事。

其实也想过着简单的生活,平日里逛逛菜市场,回家后给家人做个饭烧个菜,闲来和三五知己好友游山玩水唠唠嗑,或是独自在书房里写写诗、吟吟词,倒也自得一番乐趣。只是现实总需要面对的,“小时候,幸福是件简单的事;长大了,简单是件幸福的事”,想要过上简单的日子,得先让自己变得不简单,才能不为五斗米折腰,才能不受别人的摆布。

呵呵,扯远了。谈回杨老师的博文,大致把大学生基础差的原因归咎于人心的浮躁,后来也见有个大三电子类的同学回复了一篇日志,说基础差的情况是由环境导致的,不能全怪在学生头上。

上回忘了说,其实二者说的都在理,但都不确切,因为犯了同个毛病,即心理学家李·罗斯所说的“基本归因错误”。所谓“基本归因错误”,是指人们经常把他人的行为归因于人格或态度等内在特质,而忽视他们所处情景的重要性。基本归因错误常表现为行动者与观察者之间的偏差。当人们作为一个评价者对他人的行为进行归因时,往往倾向于内部归因;当人们作为自我评价者对自身的行为进行归因时,却倾向于外部归因,即观察者高估个人特质因素,行动者高估情境因素的作用。

客观的问题一直都在,大家也都意识到了,只是要改变现状,得先弄清问题的根源出在哪,上面会提到这个,就是想让大家知道,问题的解决除了要意识到现实的严峻性,还得创造那么个环境,做些实质性的改变。

之前也有朋友表示担心,怕我写文章顶多引起那么一阵的关注,过后大家又忘了,又回到原先的状态。所以在大四临走前接受了innos俱乐部主席这件事,就希望借这么一个平台,从个人、群体、组织的角度一步一步让大家能了解到事实的真相,拥有更高更广的视野,及早认识到社会的需求,为未来提前做好准备。

会做这样的事,绝不是因为觉得自己品格多高尚,需要多尽心地为大家服务,只是过去的经历让我明白,一个人的力量是十分有限的,整体的水平决定了个体的高度。之前在华为培训时,见到自己轻松完成的程序却难倒大片人,不否认有那么一丝暗喜,但更多的,是忧虑、是担心,因为这都是我以后的同事、奋斗的伙伴,往更远了看,总有人抱怨环境不好、形势不对,要知道大环境都是由无数个我们自己和身边人构成的小团体组成的。“大家好才是真的好”,这句话背后的意味,绝不仅是一句广告词而已。

这里也呼吁各位同学们、朋友们,不要吝惜自己的知识与才干,更多地与人分享自身的能力与见解,这不仅是为了我们身边的人,还为了我们自己,为了营造一个更良好、更开放、更利于发展的大环境。

或许这样的呼吁略显乏力,或许有人说自己很忙,或许你还在观望,但路总是要走的,问题总该要解决的,如果需要这么一个人走前头、挡前头,那就由我这个将走之人来吧,改变从现在做起、从自己做起、从身边做起。

借用奥巴马的话:“我们可以!

来源:_Cassie

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2012年7月3日
下一篇 2012年7月5日

相关推荐