软件开发中最大的难题不是编写程序,写代码只是按照逻辑去实现功能,这相对于开发者需要做的其他事情来说简单直接多了。如果你还是一个不算资深的业余程序员,那你一定要在真正的走向职业道路前确保可以解决下面这些障碍。
1.向外行解释你在做什么
向外行解释软件开发的过程是极其困难的。虽然很多人知道编程,但他们终究是不会写程序的人,在他们看来,程序员的生活就是整天在一间小黑屋里趴在键盘前,消耗着很多咖啡。你会从你的朋友,亲人,同事嘴中听到这些话,他们认为这不是一个恰当的职业。
2.形象的说出解决方案
你会经常接到一些简洁的,但通常表意不明的需求。比如现在有一个商业方面问题的需求,你就要根据它来设计数据结构,程序架构,算法,接口和一些其他技术层面的东西来构造这个问题的解决方案。关键的是,你要用大家都可以理解的语言,并在有限的时间内把解决方案讲给客户,但事实是很多开发者都做不好这件事情。
3.评估工期
这恐怕是很多程序员的痛苦之源。对于程序员来说,去评估一项从未做过的项目所需要花费的时间是极其困难的。你可能写过相似的代码,但现在的环境,问题和限制条件都发生了变化。虽然经验会有一些帮助,但大多数程序员还是低估了问题的难度,通常因为程序员只考虑了编程方面的问题,而忽略了其他相关的事情。
4.借鉴他人的代码
有很多种方法可以得出解决方案,但是借鉴他人的代码,在这个基础上编程需要花很多精力和时间,因为你要去思考他们是如何构思的。而且,如果这些半成品的程序还没有留下注释和文档记录,你就会更困难了。
5.面对项目需求的渐变和奇异的功能
虽然敏捷开发在一定程度上允许了需求的渐变,但并不意味着需求变化是一件好事,如果再加上一些客户由于一时冲动提出的奇怪需求,你就更苦恼了。你知道这样做一定会失败,你的团队也知道,但这是客户的要求,而且错误的发生也是你的责任,因为你没有站在他们的角度看问题。
6.在缺乏优化和过度优化间找到平衡点
复杂的软件永远做不到绝对的完美,因为总有更优的方法去完善它。你可以无限制的不断优化你的代码,这也就是为什么项目不会提前完成。而另一方面,你有时也会有“这样就行了,我以后再去优化它”的想法。这样的程序目前可以正常运行,但明天可能就会出现错误。当然了,你也可以不用管它,等着下一个用它的程序员去优化。
7.测试
你也许自己进行了单元测试,也把软件交付给了测试组,但bug依然存在。软件通常是复杂的,包含了成千上万行代码,其中有数不清的交互接口和路径,把这些全都测试到是很困难的;类似的,你的软件会在不同的环境下和不同的软件交互,所以也不可能测试到每一种可能性;写好一个完善的单元测试是一项枯燥且困难的工作,理想情况下,测试程序的编写应该在软件开发前就进行,但是你要向你的客户解释清楚为什么一个月过去了却还是没有可用的软件;单元测试不会发现所有的问题。理想条件下,一个项目应该有一个单独的测试团队,他们可以积极主动的,尽可能的去找程序中的问题,但这对大多数项目来说是一件需要很大花销并耗时的事情,所以就让开发人员同时负责测试的任务。但是,这样的测试是考虑不到很多边界和极端情况的;程序员通常是在用理性的逻辑处理问题,但是客户通常不这样,他们会发现很多你意料之外的问题。
8.写开发文档
给项目写文档记录是一件费力耗时的工作, 几乎没有开发者喜欢或擅长它,不愿意花时间阅读它们。
9.处理各种IT问题
你每天都和技术打交道,你也许是一个HTML或PHP程序员,但你可能还要解决一些其他问题,比如硬盘损坏,驱动冲突或软件报错。这些虽然都不是你的主要工作,但如果你不去解决这些问题,你就不能继续你的开发任务。不幸的是,在那些非IT领域的人的眼里,你什么都知道。当他们遇到IT方面的问题时,他们不会花时间自己解决,而是去寻求你的帮助,而且不管什么问题,因为你是搞计算机的,比如如何将工资单导入Sage,如何配置Oracle,或者为什么他们的蓝莓手机发送邮件失败。也许,这些干扰不会影响到你的日常工作,但真的不会吗?
10.与他人打交道
这些问题都可以归结为“与人打交道”的问题。没有外行人会指导飞行员如何开飞机,或给电工如何布线提建议,但是他们很愿意给软件开发“勇敢”地提出建议。现在可能还没有办法避免这样的事情发生,你只能接受这样的事实:世界上有一半人的智力是低于平均水平的!