代码是为谁而写?写代码的目的是要替用户解决问题,而不是炫技

人参与 |分类: 好文分享|时间:2019年09月12日 10:53:37

最近工作都比较忙,回家通常较晚,而今天又是一个加班的好日子,我正百无聊赖的写着中秋值班的监控预警。忽然间收到一张截图,是远在北京的产品经理朋友在微信朋友圈发了个状态,对我一直在负责的一个系统表示了认可,令我非常感动。

一般来说,对他人工作成果表示公开的认可往往只是职场上的一种交际辞令,但这位朋友已经有很长一阵子不与我们的工作产生交集,更为特别的是,他甚至根本没有加我微信好友,所以在收到这样的一张截图时,真是让我十分感慨也十分感动。

这同时让我也在思考一个问题——作为程序员,我的代码究竟是为谁而写的?


虽然正式参加工作还不到十年,但我却因为机缘巧合很早就开始显现出“码农”的本质了。我所在的高中是有计算机课程的课时安排,而我们学校也没有把这门课挪用给语数外等主课,所以很幸运的,在高一的学习中,我接触到了VB这门语言。

VB是一个很灵活的语言,对于入门者而言,并没有过高的学习门槛。不管是IF-ELSE的判断,还是WHILE的循环,它都能让一个学习者从零开始掌握“控制”计算机的能力。虽然在课程上老师并没有直接教给我们太复杂的技巧,但我还是凭着自己的好奇心与热爱尝试自主完成了解“数独”的工具、还有一个很粗糙的几何计算器。

在那个年代,我写代码就是为了尝试做点吸引同学们眼球的小玩意。作为一个不会打篮球、学习成绩也一般、样貌平平的男生来说,当时的我可能也想凭借这个小技巧“弯道超车”。 可惜的是,除了未来几年来总是帮同学们修电脑以外,这个技能并没有给我带来什么我想得到的东西 :)


高考成绩很一般,并没有让我一步登天,不过好在我也如愿以偿的开始了“计算机科学与技术”的本科生涯。

在中国念大学,C语言之父不是丹尼斯·里奇,而是谭浩强开个玩笑。与所有同学一样,我们是在蓝屏的Turbo C中开启我的专业课生涯的。因为有一定的VB编程经验,在学习指针前我都没遇到太大的问题,即便是当时有些同学不好理解的汉诺塔问题,由于我在高中时尝试解数独时“悟”出了递归的用法,也很快的克服了。

但是,掌握了一门语言的使用后,不能什么成果都没有,于是我给自己定了一个目标——要用书上没有的东西做课程设计。

大学的图书馆是个好地方,不用花钱也能学习到很多知识。在大一的下学期,我的课余时间基本就泡在图书馆里,用后来陪了我7年的那台小黑——人生中第一台笔记本电脑(ThinkPad R61 7755A13),用C语言写了一个纯图形界面的时钟(尽管现在已经忘了怎么写)、用汇编写了跨进程通信的本地版聊天软件(说实话我也不知道写这个有什么用)。

在那个年代,我孤独地学习着课上不曾出现过的技巧可能就是想知道,我到底需要学习多少东西,才能做出一个可能有点用处的东西。


大二开始,受到学长的“蛊惑”,开始“考证”。一直到毕业前,拿到了程序员、软件工程师、数据库系统工程师之类的软考证书,不过“嵌入式系统设计师”只差一分的痛仍然在我眼前浮现,虽然到现在我也不知道我那些可能早已过期的证书到底有什么用处,但那个时候对软考好像有莫名的执念。

自我感觉尚可的我参加了一次网易组织的编程大赛——有道难题 Top Coder 编程挑战赛,通过这次比赛,让我认真的发现自己仍然是只菜鸡——因为离前50差距太大,最后只拿着一件写着大大的“有道难题”4个字的T恤(这么多年过去了,字已经掉完了)。

不过从这个时候起,我也开始在学校里做一些校内系统——包括让学弟学妹蛋疼不已的指纹打卡系统。在这个时期,利用学校给的一些资源,我慢慢的也接触到了外界的“真实需求”,也慢慢的在实战中学习了SQL Server、ASP.NET、设计模式等技术。

一直到大四毕业前的这段时间,虽然没有像现在的大学生一样搞大数据、写爬虫之类的高端技能,但我也四平八稳的给后几年吃饭需要的技能打了一个扎实的基础。那个时候为了夯实基础、扩展思维,也是认真的吃了不少苦的,完成导师教授给的任务,写了茫茫多的代码,不过后来看来,虽然代码比较幼稚,但这些吃苦的过程非常有必要。(虽然我妈老是说我暑假也不去超市打个工体验下挣钱不易


四级是我长久以来的痛,因为英语不好,毕业后不敢随便找工作,网上投了14个简历,其中就有我任职的第一家公司——一家对日外包的日企。(题外话:由于基础还可以,14个面试全部通过,是不是值得我得瑟一下

这家日企对待新员工真的不错,除了工资低一点但是人际关系超好,同事很热情,领导也很和蔼(感谢老胡招我进公司,虽然你可能看不到我的文章)。我在这家公司领略到了日企的规范,为我后来的工作培养了一个不错的习惯。

在这家公司,我认识了我的夫人——进公司时她还是个留着短发的小女生后辈。一起共事两年多后,我们携手组成了幸福的小家,也一同离开了伴随我俩事业成长的公司。

在这家公司的大部分时间里,不太需要认真思考代码的本质——日方总是会发来事无巨细的仕様書,写代码是一件轻松的事情,但测试却是一件恐怖的事情——你需要为代码写下海量的测试用例——每一个WHERE语句的条件、每一个临界值、每一个小数点的最后一位——你都需要为它们设计唯一变量条件的测试数据或操作过程。不过恰恰也因为这个经历,在后面的工作中让我养成谨慎的好习惯。

不过这家日企并不只做对日项目,在上海出差的那几个月,我与一个胡子很个性(也很帅气)的小伙子一起加入了一个国内项目——为一家法律行业的公司做税法的文档系统,这个项目也是让我在这家公司获得巨大成长的一个项目(感谢开车超快的老曹给我这个机会,也感谢上海的薛总吴总)。

这个项目后台管理系统是用SharePoint开发的(这个东西巨难用),但因为是高度定制化的开发,在这个项目中,我第一次接触到前端代码——原来jQuery这么好用!从这个时候开始,我就不断的尝试使用jQuery的各种功能,从ajax请求到动态渲染DOM元素,学习$('#xxx').on('click')$('#xxx').click()到底有什么差异,也是从这个时候开始,我才发现——原来写后端的人一样可以轻松做前端。

在苏州的日子其实也挺有趣,由于公司内不能上网,为了方便大家报销晚上加班的饭钱,我在自己机器上用C#开发部署了一套报销系统;由于飞鸽传书太搓,本地又没有其他工具,我用Excel利用VBA写了一个基于共享文件的聊天室。在这家公司的几年间,工作之余写了不少小工具,虽然不乏有为了追求小姑娘的私心,但更多的是在想着解决实际的问题,并且是基于自己的想法给更多的人去用,回想起来也算是自己产品思维的一个萌芽。

离开日企有换了部门老板的因素,也有日企项目不能满足我对技术提升的渴望而产生的焦虑,虽然离职过程有些小插曲,但我仍然感谢这家公司让我在苏州安了家,让我认识了很多好伙伴。


工作三年的我投了1封简历,收到了11次面试机会(某联招聘的信息泄漏确实很严重,但感谢圣光这次仍然是全部通过,请再容我得瑟一次),有幸加入了现在的公司——苏州最大的互联网公司,也是我主动投简历的这家公司。

在这里我第一次知道了做一个功能,可能要这个功能的人还没想好该作成什么样;第一次知道了没有经过几个月的变态测试也能把功能先发上线,错了可以回滚(错多了就得滚蛋);第一次知道写SQL不能用存储过程;第一次知道我们可以用beta版的组件甚至是alpha版的组件甚至直接就是没有产品的源码;第一次知道节假日前要通宵做压测;第一次知道写BUG会导致损失的真实感受;还有第一次因为项目出现BUG而受到处分……

互联网的超高速迭代让日企出身的我差点跟不上趟,但有领导的关怀和同事的支持还是让我在这个奔跑中的企业有了属于自己的立锥之地。从RedisMongoDB、从HIVEElasticSearch、从C#Java、从GolangNodejs,领导给时间用新技术变现、公司给出钱参加QCon,这是我在职业生涯中成长最快的五年。
这几年间,我从负责一个独立系统,到负责一个平台,从研发一个组件中间件,到设计系统的集群架构,虽然远远达不到行业大牛的水平,但还是会为自己可见的进步而感到欣慰。

公司于17年底与北京某大型互联网公司合并,以此为契机有幸参与了多个公共业务系统的整合,有移交出去的系统也有接收进来的项目,也正因此认识了很多人(可能虽然没见过太多面),本文开头提到的朋友正是北京的同事。功能相似的系统的整合并没有想象中那么容易,如何保证双方同事的使用体验与原系统相似便是一个巨大的挑战,更别说数据与功能的整合了。

我所负责的最重要的一个系统也在此次合并范围内,两方系统都有独特的功能,北京侧强于数据分析而苏州侧侧重于多平台的支持,考虑到研发及运维团队均由苏州侧负责的缘由,我们只能放弃原北京侧系统,但这也意味着我们必须让苏州侧系统完整的具备北京侧系统的数据分析功能。困难的是在此之前,我们团队的两个人都没有大数据分析的经验,另一个小伙子靠着惊人的毅力,在3个月内,通过不断与北京侧负责数据分析同事的沟通与学习,从零开始在我们原系统上添加了一整套的数据统计功能,而我第一次的为生产环境提供Java支持,让整合后的新系统得以创建北京侧的数据,及因整合而产生的海量调整(我从没想过仅仅是两家公司OA的合并都给新系统带来了开发工作量)。

整合过程不完美,但贵在没出问题。

也正是从这个时候开始,写代码变得不仅仅是实现功能这么一个目的,由于沟通并不像原来那么容易,我开始思考如何让我的用户可以在缺少指导的前提下顺利的使用,虽然是公司内网的内部平台,但提升我们用户的体验也是极为有价值的——如果我们可以为一个用户节省10分钟,那么仅仅需要50个同事使用系统便可以节省1个人日,更何况由于沟通而产生的时间成本往往极大的超过10分钟。于是我简化了权限控制的流程、减少了系统的操作步骤、突出了重要的操作按钮、增加了推进进程的邮件提醒、接入企业微信、接入AB测试及效果埋点、为这个系统补充了最为细致的操作文档……从系统操作的角度来说,基本算是达到了一个让自己觉得还不错的程度,有幸的是,确实也有很多同事觉得我们确实为他们提供了便利。


有个公众号叫神秘的程序员们,但程序员其实一点都不神秘,他们只是利用手中的电脑来解决问题的一个群体。我之所以比起Java更喜欢.NET一些,正是因为在.NET中,我们把“项目[Project]”称之为“解决方案[Solution]”。——我们为什么要写代码?我们是为了解决问题才写代码,我们并不是在写项目,单纯的写代码是没有任何意义的。

曾经,我以为写代码需要的是技术好;现在,我觉得写代码更需要的是耐心。实现一个功能其实很简单,没有程序员实现不了的需求,但是让用户容易去使用却需要花很多时间,包括了解甚至是培养用户的使用习惯,并在此基础上优化UI,UI是用户与代码交互的唯一窗口。

用再多的设计模式,比不上用户畅快的操作体验更重要,写代码的目的是要替用户解决问题,而不是炫技

写在最后:本文来源:星空online,已获得授权转载。是本人的舍友!人与人的差距就是在这一点点中积累起来的。不过这可能是一种假象,个人觉得一个人天赋的差异,是导致差距的最大变量因素。好比,他说的汉诺塔问题,当初我理解地痛苦,他觉得很轻松理解,但是当年同班的绝大多数同学和我一样,觉得脑袋里像是一根皮筋饶了不知道多层,让我深切的体会到什么是脑袋抽筋。当初听C语言课程,就是四个字:云里雾里。依然记得第一个让我咯噔的问题就是我们C语言王老师说的“1+1≠2”,在C语言里可能是“1+1=1”。不过我觉得未来有三分天下之势。人们都说情商和智商,这两者 决定一个人的眼界与能力;我觉得未来还有一个“机器商”,学会与机器交流,你将打开另外一个维度的大门。更好的适应未来的AI 世界!