何为软件工程师?
软件工程师是恰好擅长软件开发的工程师,工程师的基本技能是工程能力,而不仅仅是写好代码。这里引用百度对工程师工程能力的定义:“使用系统化的方法,在保证质量的前提下,更高效地为客户持续交付有价值的服务的能力”。其中,为客户持续提供有价值的服务是目的,而代码能力是软件工程师提供有价值服务的前提。
如何精进代码能力?
重术,更要重道
秋招时为了找个满意的工作,自己大量的时间都消耗在学习具体的编程语言、框架、算法甚至是背诵“八股文”上,忽视了对软件工程本身系统性的学习。由此引发的后果是,即使软件开发的功能都能够实现,但软件本身几乎没有架构可言,代码无法快速进行扩展和迭代,也难以剥离出一个独立的模块向外提供服务。在学习别人的代码的时候,往往也是更注重具体的代码实现,而忽视了系统的模型与接口的设计。
保持学习的能力和习惯,由输出驱动输入,强化基础,持续分析并解决问题。
如何为客户提供价值?
简单点
去年刚入职,大BOSS讲过一句话,“我们做研发的目的就是为项目服务”。毕业不久还是带着学生的做题思维,总想去做一些看上去复杂高深的东西,或是通过重复“造轮子”的方式,想以此来显示自己技术的过人之处,而这种技术上的“自嗨”无法带来价值。
为客户提供有价值的服务,程序本身只是服务的一种形式,倘若不需要程序也能提供满足客户需求的服务,那编码本身就是不必要的。归根到底,再高深的技术只是实现价值的一种手段而不是目的。用最简单的方式为客户快速交付稳定的服务,才能将价值最大化。
产品意识
程序员的35岁危机已经成为一种普遍的焦虑,软件工程师作为研发序列中的组成部分,真的可替代性强吗?对所有具有商业性质的主体,盈利一定是这个主体的第一要务。因此,当个人被环境所淘汰,合理的解释就是无法产生对应的价值。
对于个人,若是目光仅仅局限在自己负责开发的一小块,与工厂流水线上的工人的区别在哪里?我想,要持续的创造价值,只有两种破局方式,一种是把自己打造成某一特定技术点的技术专家,通过攻克高价值项目中的难题来体现价值,而另一种是把目光投射到业务的上下游,利用产品思维来创造价值。
前文提到,作为软件工程师的最终目的是为客户提供有价值的服务,这种服务本身就是为了解决客户的某个具体问题,或者说痛点,而问题的三要素就是“用户、需求、场景”。作为软件工程师,我们能接触到的往往只有“二手需求”。
一个工作中的例子是,我们根据项目提供的“二手需求”,完成了一个大而全的软件。开发完成后,我们认为这样的软件已经满足了客户的需求,而现实是使用这个软件的终端用户是工人而非技术员,使用软件的场景是在工厂车间一块800*600低分辨率的小屏幕上,终端用户掌握不了复杂软件的使用,而我们开发的软件也无法在低分辨率的屏幕上得到良好的使用体验,最后的结果就是虽然我们做出了一个满足需求的软件,但客户不接受,我们提供的服务就没有产生相应的价值。
作为软件工程师,最头痛的就是客户不停的修改需求。导致这种情况产生的主要原因之一就是,我们一直都在单向被动的接受客户提出的浅层需求,思维总局限在如何通过编码实现客户的单向想法,而从未想过客户提出这个需求本身背后的动机是什么。同样还是工作中的一个例子,客户对复判软件界面的需求一直在变,但其实客户的核心诉求就是如何能让工人根据界面上的内容快速找到物料上的缺陷位置。作为软件工程师,我们天然比客户更懂软件,若是能够前置这样的需求讨论,我们可以跟客户一起定义我们的产品,让客户参与到开发过程中,而无需返工。
当然,我们不可能每时每刻都能贴近客户,尤其是涉及到预研项目。因此,我们需要对业务有自己的理解,对业务的理解就来源于和客户的“一手”沟通与在现场的“一手”感受中。想要理解客户的真实需要,我们本身要先成为自己的客户,唯有了解客户的真实需要,才能为客户持续的提供有价值的服务。
参考资料
- 《代码的艺术 卓越工程师必修课》- 百度技术培训中心
- 《10x程序员工作法》- 郑烨
- 《软件设计之美》- 郑烨
- 《人人都是产品经理2.0》- 苏杰