近日,同一部门另一个项目组的一位程序员“主动离职”。虽然没和这个程序员共事过,但是听过一两次他的内部分享,感觉技术还是挺厉害的。和一个见多识广的同事聊天后,才知道真正的原因是老大觉得跟A沟通困难,导致其他程序和QA抱怨。这些年的工作,身边很多同事来来去去,或主动或被动,这让我思考什么样的程序员才算是合格的程序员。虽然大家都称自己为“码农”、“IT民工”,但我相信这只是自嘲或自嘲。大多数程序员应该还是认清了自己的职业。当然,我不是一个优秀的程序员,因为我从来没有在开源社区贡献过代码,我不精通白板算法,我对技术不狂热,我也不是极客。我的目标是成为一名合格的程序员:做好本职工作,对得起自己的薪水,平衡生活和工作。我不能接受996什么的。对于程序员来说,技术过关当然很重要,这就是硬实力。然而,仅有技术是不够的。毕竟大部分程序员还是要跟人打交道的,软实力也是不可或缺的。如何合格,我认为有以下几点:扎实的基础计算机领域是一个瞬息万变的领域,时不时会产生新的语言、框架、思想,每一个新的东西都去追是很累的技术。但是仔细想想,其实并没有那么多新意。很多新事物无非是对现有技术的封装,或者是对其他领域技术的借鉴。比如缓存数据库redis和memcached,基本思想不是操作系统中的缓存;分布式存储中的分片和复制集不是文件系统中RAID的扩展;和谷歌的MapReduce框架,不是源码吗?函数式编程语言中的映射减少?掌握计算机基础知识,能够更本质地看待新技术。善用工具磨刀不误砍柴很重要。构建自己的工具集非常重要。开发中会用到大量的工具,无论是编辑器、调试工具还是监控工具。每个人都喜欢争论哪个IDE更好,但没有多大意义。关键是能够熟练使用自己喜欢的工具,掌握各种快捷键,高度自定义,可以大大提高工作效率。而对于日常生活中重复性的操作,最好将脚本自动化。这里推荐python。写小工具还是很快的。另外强调了程序员必备的两个工具,那就是浏览器和VPN。后者大家都知道,不多说,主要是后者,浏览器的威力才能发挥出来。每个人每天都在使用浏览器,但是如何高效地使用浏览器,比如在指定的网站上进行搜索,通过标题、url进行过滤,选择合适的关键词,是值得研究的。对于程序员来说,要用好浏览器,必须具备下一个能力:英语还过得去。不得不承认,在软件创新领域,中国还落后于国外。新技术和第一手资料都是英文的。在新技术广泛应用之前,我们在百度上找到的翻译不是机器翻译就是错误百出。看译文最大的问题在于译者本身的水平。即使翻译水平很高,也经常会出现同一篇译文的不同译文,造成阅读文章时的混乱。最好直接阅读英文原文。除了专业词汇外,大部分原文都比较通俗易懂。而且,我发现很多很棒的项目都有非常通俗易懂的文档。良好的编码习惯代码是为了机器执行而编写的,也是为了让人阅读和维护的。维护者可能是其他人,也可能是几个月后。好的代码规范,必要而清晰的注释,可以让你少受十八代祖宗的欢迎。关于代码风格,网上争议颇多。最重要的是保持项目内部的统一性。作为技术负责人,必须在项目之初就做好顶层规范。当大量的代码堆积起来,就很难统一起来,然后做好给新人的review。继续学习程序员这个职业,这个职业可能比其他职业还年轻很多。尤其是在中国,很多最老的程序员都转行做管理了。没有人知道再过10年或20年我们会发生什么。前段时间,35岁的华为程序员离职,给我们敲响了警钟。除了悲伤,我们只能努力学习。拼不过体力,就用自己的能力和经验。学习这件事很复杂。我觉得有两点很重要:基础,学以致用。独立思考的合格程序员解决问题,而不是实施解决方案。产品经理(尤其是懂一点技术的产品经理)的某个要求,可能只是解决某个问题的方案。他认为这个方法可以解决他的问题,所以他把解决方案当成一种要求,而不是真正的问题。程序员要主动沟通,多问几个why,了解真正的问题,说不定会有更好的解决办法。之前有这样一个例子,给定的需求:为每个用户生成一个唯一的邀请码(用户有唯一的id标识),也为以后可能增加的用户预先生成邀请码,保存在数据库。真正需要的是老用户分享他们的邀请码。新用户使用邀请码,老用户将获得相应奖励。我提出的解决方案非常简单。用户唯一id直接生成可逆邀请码,完全不需要数据库存储。产品经理经常变更需求,这是程序员最头疼的事情。作为程序员,也要站在PM的角度去思考,帮助PM分析本质需求,这样可以减少需求的变更。当然,前提是你要做自己喜欢做的??事,并且需要对业务有一定的了解。先思考再行动写代码的时候,想清楚再写,而不是先写一堆代码,然后开始修bug。休息bug的时候多看上下文,了解bug发生的原因,修改bug可能造成的影响,然后再修改。反面教材有两种:第一种是随便改代码,不知道为什么就这样固定了,幸好,可能还有其他类似的bug找不到。另一个是主治医生治的是头脚,对修改的影响没有仔细评估,往往会引入新的问题。程序员成长的一个途径就是修复bug,别人用不了的bug,但前提是弄清楚bug产生的原因,这样才能避免类似的错误,有所收获。顺畅的沟通,既不是芦苇一样的聪明,也不是傻子。所需要的只是耐心倾听,然后清楚地表达自己。当今的软件开发已经不再是单打独斗的时代。大多数软件和产品都需要多人和多个部门的协作。而沟通,沟通是非常费时费力的。沟通前,先想好目标,组织好语言,尽量不发散,不跑题,要对事不对人。重要的事情,留好通讯记录,最好有邮件,以免不清楚。沟通是一门复杂的艺术,最基本的是听得懂,说得清楚。管理好你的脾气。作为一名程序员,你必须被PM、交互式和QA气死。不管你的需求有多变态,QA给你提的bug,未必就是你的。而且还有猪一样的队友(为什么在别人眼里不是这样的)和部下。不管谁对谁错,发脾气和吵架是没有用的。吵架之后,还是要解决问题。冷静点,即使你有怒火,也要等几秒钟才能爆发出来。也许这几秒钟的理性思考就能解决问题。责任能力(技术能力)和责任心,谁更重要,两者都很重要。新人如果有潜力可培养,那么责任感就更重要了。两个人,第一个技术能力强,但责任心差,对项目事情不感兴趣;二是能力较差,但责任心强,遇到问题一定要对自己负责到底,即使自己解决不了也可以求助。我觉得前者对项目危害更大,尤其是在项目的关键时期,因为能力强的人一般负责的功能比较复杂难点,别人上手需要时间。这非常困难。不负责任的典型表现是争吵和指责:这不是我的错误,也不关我的事。在有协作的地方更容易出现问题,比如前端和后端,各个部门之间。如果当时不知道是谁的问题,不妨主动帮忙排查。不要总是说你不能成为程序员。总有一些以前没有做过的工作,或许是产品人员的需求,或许是项目自发的优化。我见过一些程序员,在面对未知的问题和挑战时,总是习惯说:不行,不行,不可能,这样的程序员不是合格的程序员。事实上,这样的程序员过早地给自己留下了退路。其实这个问题可能并没有想象中那么难,经过一番摸索或许就能解决。如果你习惯于对未知说不,那么在别人眼里,你就是无能,影响个人形象和声誉,总是呆在舒适区不利于自我成长。当然,并不是说盲目自信,急于拍着胸脯保证一定能解决。这通常是一种欺骗自己的方式。所以,面对新的需求,要慎重对待,既不能轻易否决,也不能随意承诺,而是要明确需要先研究什么,评估能否完成,需要的资源和时间。暂时能想到的就这么多,当然我还达不到标准,比如我不能轻易控制自己的愤怒,分享给大家
