首先,必须追求完美。因为计算机也是以这样的方式来变戏法:如果咒语中的一个字符、一个停顿,没有与正确的形式一致,魔术就不会出现。(现实中,很少的人类活动要求完美,所以人类对它本来就不习惯。)实际上,我认为学习编程的最困难部分,是将做事的方式往追求完美的方向调整。
注:做产品,对这点感觉至深,前期一个被忽视的bug, 在后期往往会是灾难的开始,到客户手上后可能直接退货和影响公司信誉。在前期开发时,把遇到的每一个问题都记录下来,一一排查;后期维护时,更是花两分钟修改一个bug,却要测两个小时,甚至两天。一句话,做研发真累,做软件更累,做产品经理就是枕戈待旦。
其次,是由他人来设定目标,供给资源,提供信息。编程人员很少能控制工作环境和工作目标。用管理的术语来说,个人的权威和他所承担的责任是不相配的。不过,似乎在所有的领域中,对要完成的工作,很少能提供与责任相一致的正式权威。而现实情况中,实际(相对于正式)的权威来自于每次任务的完成。
注:通俗点就是:由不专业的人来指导专业的人工作,按照本专业的知识来理解和指导其他专业的人和事。Boss是做FPGA的,公司产品的难点也在FPGA,下大力气从外面招了些FPGA牛人,而对软件和测试完全忽视,导致整个项目的进度完全被软件和测试制约,可悲的是,老板永远意识不到这点。一个项目软件三个人,一个两三年的,一个毕业一年的,一个刚毕业的,开始号称这个项目有三个软件工程师,但又有几个能干活的呢?
对于系统编程人员而言,对其他人的依赖是一件非常痛苦的事情。他依靠其他人的程序,而往往这些程序设计得并不合理,实现拙劣,发布不完整(没有源代码或测试用例),或者文档记录得很糟。所以,系统编程人员不得不花费时间去研究和修改,而它们在理想情况下本应该是可靠完整的。注: 这点是让每个软件人员都头痛的事。别人写的代码,往往只能沿用,出了问题,可还是你的责任。即使明知有bug,也没那个精力去一行一行阅读别人的代码,只能等了问题,再慢慢修改。好不容易沉下心来细看,没看两行,想死的念头都有了。
下一个烦恼——概念性设计是有趣的,但寻找琐碎的bug却只是一项重复性的活动。伴随着创造性活动的,往往是枯燥沉闷的时间和艰苦的劳动。程序编制工作也不例外。
注: 修改bug就跟打怪一样,打了一波又来一波,就是到了终点,还有一个大Boss等着你。小怪永远是打不完的,大怪冷不防地就冒出来一个,打得你措手不及。打怪是有乐趣的,可以升级,越来越强,获得崇拜;改bug,就等着走火入魔,半疯半颠吧。
另外,人们发现调试和查错往往是线性收敛的,或者更糟糕的是,具有二次方的复杂度。结果,测试一拖再拖,寻找最后一个错误比第一个错误将花费更多的时间。
注:这个东西得说说,行业外的人永远认为bug会越改越少,产品会越做越好,岂不知bug也会越来越多,产品可能还更不稳定。在产品研发阶段,修改大量的bug,有助于产品稳定,功能齐全;但到了维护期,修改大量的bug,会使产品严重不稳定,并导致诸多兼容性问题。后半句“结果,测试一拖再拖,寻找最后一个错误比第一个错误将花费更多的时间。”没有看懂,但测试在产品后期的不稳定上负很大责任,由于测试计划不详细周密,在产品稳定后还再提许多会影响用户体验和产品稳定的问题,但这些问题用户却并不会特别关注。另外一点就是,硬件不停的降成本,更换芯片,软件不停的该方案,导致软件无止境的做兼容,破坏软件架构,产品及其容易出问题。
最后一个苦恼,有时也是一种无奈——当投入了大量辛苦的劳动,产品在即将完成或者终于完成的时候,却已显得陈旧过时。可能是同事和竞争对手已在追逐新的、更好的构思;也许替代方案不仅仅是在构思,而且已经在安排了。
注:这点在我们的产品上体现并不明显,行业竞争力小,更新换代慢,跟着大哥们走,不会有问题。但在其他行业,特别消费电子类,像手机,一款产品会决定公司的生死。Nokia的消亡就是铁证,行业的龙头老大,沦落到只有三流厂家的市场份额,太关注公司的发展战略,却不去领略用户的感受,不跟着市场走,就是一条血路,要么称王(iphone),要么败寇(被收购)。
现实情况比上面所说的通常要好一些。当产品开发完成时,更优秀的新产品通常还不能投入使用,而仅仅是为大家谈论而已。另外,它同样需要数月的开发时间。事实上,只有实际需要时,才会用到最新的设想,因为所实现的系统已经能满足要求,体现了回报。注:大多数的公司,大多数的产品,都是一脉相承的,不会关注太多新技术,新设想。这也导致企业创新性的缺失,产品没亮点没特色。国内企业不够大胆,更不够专一。许多行业领头企业,都是墨守成规,缺乏google的大胆,去研究自动驾驶汽车,google眼镜;缺乏IBM的用于创新,在各个领域他可都是领头人,“云”也是人家提出来的;更缺乏美国公司的执着,一个公司只干一个行业,一个人可以在一家公司干一辈子。
诚然,产品开发所基于的技术在不断地进步。一旦设计被冻结,在概念上就已经开始陈旧了。不过,实际产品需要一步一步按阶段实现。实现落后与否的判断应根据其它已有的系统,而不是未实现的概念。因此,我们所面临的挑战和任务是在现有的时间和有效的资源范围内,寻找解决实际问题的切实可行方案。
注:搞技术的往往太关注技术本身,而把“以产品为中心”的理念早抛到脑后去了。做嵌入式的,就想着去搞操作系统,底层驱动,岂不知真正搞操作系统的全国也没几个,你只是做做移植,底层驱动,也就是改改厂家的demo程序,在大多数公司,产品往往是一脉相承,一个平台会用好多年,太专注于这些东西,早丢失了产品本身。论坛里老在比较Linux好,windows不好,android是垃圾,但用户谁会关心这些,谁管你Linux,window,android,符合自己需求,好用实惠,随大流,就是好东西。老板就更不会关心这些了,研发快,成本低,"裸奔"也愿意。再好的技术,再好的系统,不体现在产品上,永远是没有价值可言。
其他部分真的没有看懂,大篇的理论,不知所云。
以上仅为本人愚见,其中有愤愤之词,也是由衷所发,敬请谅解。