热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

这10个问题去哪儿啦

本文已发表于《程序员》201505期B。版权所有foruok,网站转载请务必保留出处,微信订阅号转载请先联系我。我决定花些时间梳理一下我程序员生涯中看到的各种问题,看看它们都去哪儿啦

本文已发表于《程序员》201505期B。版权所有foruok,网站转载请务必保留出处,微信订阅号转载请先联系我。


我决定花些时间梳理一下我程序员生涯中看到的各种问题,看看它们都去哪儿啦。

外科医生剪箭尾

在我博客上的“无Bug不生活”一文中,我罗列了程序员对Bug的态度,感兴趣的朋友可以跳过去看看。

程序员经常这么处理Bug:花上点儿时间撸撸代码,哎呀,找不到Bug出现的根源;再花点时间看看能不能搞点沙土增高一下堤坝(想象黄河河堤的形成过程),嘿,真不错,还真找到了,我只要这里塞点代码堵一下那里扔几个判断围一下,这Bug貌似就不出现了啊……哈哈,有才,搞定,太佩服我自己了耶。说实话,这种策略是把自己当作了外科医生,把软件当做了中箭之人。因为外科医生弄不懂内外科的分别也找不到起出箭头的办法,只好通过剪断箭尾来安抚病人,殊不知箭头还在肉里,要是烂在肉中,病人的疼痛只会更加厉害。

我管不着啊

现在我们开发软件通常都是兵团作战,有时我们就会发现签入到代码库中的某段代码很烂,比如各种条件分支未覆盖全面逻辑不严密,比如变量名凌乱导致可读性很差,比如类库设计不合理违反了单一职责原则(SRP:Single Responsibility Principle)……,此时大部分程序员的做法是:算了,这代码是别人的,我管不了那么多,还是先忙我的吧……

有的程序员在开发过程中会感觉到软件系统设计有问题,就会认为这是系统分析师或架构师的责任,因为我可能没他牛逼或者我也没有更好的解决方法或者我不大可能说服他采用我的方案,于是就放弃了,就按“我只要实现我的模块就行了”这种方式往前走了……

还有的时候开发人员觉得产品某处不合理,交互方式不符合用户使用习惯,但因为这是产品经理的责任,就被“算了,我只负责实现”这种想法给俘虏了……

还有的时候阿猿觉着UI给的这个商品详情展示界面看着色调不协调,可还是放弃沟通照着做出来了……

类似的情况很多很多……

须知我们这么多人叮叮当当忙活,虽然每个人干的事儿不同担的责不同,但其实是在造同一条船,没有谁的工作与别人无关,任何一处出现纰漏,都可能导致我们造出的船无法下水或者倾没深水不能远航。

也许问题不会在用户那里出现

很多软件在测试过程中都会出现一些难缠的Bug:没有规律,几率极小。就连微软这样的大公司发布的操作系统,也要不断地打补丁。

作为程序员,有时遇到一个概率很小的Bug,会因为难以重现而决定先不管它,我们会这么说服自己、测试、产品经理:这个Bug可能是极端操作或操作不当引起的,用户根本不会那么用,所以在用户那里很可能不会出现,就算出现了,按这种概率,也是极个别极个别的用户才会碰到,而我们还有很多其他功能没实现,不能因为这种小概率的Bug影响整体的进度。OK,事就这样成了。可是我们每个人头上都悬了一把达摩克利斯之剑。

要知道,用户环境比测试环境更为复杂,测试环境无法重现的、几率很小的Bug,很可能就被某个用户Duang的碰上了,那对这个用户,发生一次就是百分百啊,对他来讲,根本不存在千分之几万分之几这种鬼东西,他就知道他碰上了,你跟他说这个Bug实在是很难重现真的是小概率事件,任你舌灿莲花屁用不顶,他的痛苦真真切切摆在那里,怎么可能认同你的解释。这个用户失去了,还会有下一个“幸运 ”用户,最终一定是星星之火燃起燎原之势,你的产品口碑会烂到家,然后你的产品十有八九就这么死翘翘了。

我在使用手机时,像App闪退、App停止运行等问题经常会遇到,给人的感觉实在是太差了,你绝对不能让我接受这是无伤大雅的小概率事件,我情感上绝对接受不了你知道吗。

跳过技术难题,别影响进度

软件开发的一个特点就是随时都会遇见未知的问题。比如开发互联网电视产品,很可能会遭遇音视频失步问题,具体表现是有时一个影片刚开始播放几分钟就失步,有时播放半个多小时才失步,有时超过一个小时也不失步,有时在这台机顶盒上失步,有时在那台机顶盒上失步……这个怎么办?

有一种做法是,承认这是个技术难题,一时半会难以解决,别让它影响进度,先跳过去干别的,以后专门抽时间解决它。

这种做法很常见,它的后果也很常见:项目进度还是无可奈何地被这个难题拖累了。

别人都这样

有时你会碰见这种开发团队:执行力差,产出率不高,忙闲不均。作为一个原本追求上进的社会主义四有青年,你看到这种状况往往在开始时感到不正常,想要去改变它,可是久了之后发现你一个普通程序员改变不了什么,要是你执意去做这个事儿劝那个人,反倒把关系给搞僵了,种种担心或实践让你意识到,你不是那个可以改变团队面貌的角色,怎么办?

最后的最后,现实的结果往往是:算了,睁一只眼闭一只眼吧,我管好我自己就行了。更让人不能接受的结果是:大家都这样得过且过,我也没必要这么卖力,于是自己也慢慢放松自己得过且过了。

慢慢向生产率下限看齐,这是非常令人伤心无奈的事实。

我们后面会追上进度

软件项目,延期的占大多数。很多项目,干着干着就感觉要延期了。可是很多团队的项目经理、开发人员在这件事情上却表现得充满童话风格:只要解决了某个问题,只要某某猿加个班往前赶一赶,最终会赶上交付期的……

结果呢……

没奖金没加薪干个什么劲儿

不是每个软件公司都能持续盈利,都能大把大把地发奖金,都能隔三差五地加薪。实际情况是,相当一部分公司在艰难地生存,没有办法发可观的奖金,也没有办法按承诺的节奏加薪。在这样的公司里做开发,程序员会怎么想怎么做?

公司效益不好,与我有什么关系?不发奖金,不加薪水,我干嘛还那么卖命?我何必还像以前那么努力?混混看吧。

这是一部分程序员的真实心态,我也曾经有过。要知道,当我们在一个看不到将来的环境里工作,又没有金钱刺激时,难免心灰意懒进而放纵自己随波逐流。可后来我意识到:你在公司提供的平台上通过为公司做事而修炼自己,你得到的,远不止是薪水,经验、历练、成长都是自己的,并且永远没人能从你身上拿走;时间是自己的,虚度了再也无法追回;无论何时,我们都是在为自己的现在和将来工作,而不是为公司、为老板工作,我们不单单是一个拿薪水帮别人干事儿的人,如果停留在这种意识上,那我们一定是在扼杀自己成长的机会浪费自己宝贵的生命。

还有XXX呢

受经验、能力和眼界所限,有时某个难题看起来会超出程序员的能力范围,让我们感到再花精力也是枉然,于是我们就不打算研究下去了,告诉自己:算了,还有技术大拿杨过呢,还有技术经理郭靖呢,不行还有技术副总风清扬,再不行公司会想办法,反正后面还有人……

反正我不是项目经理时有过这种想法,我当了项目经理还是有过这种想法,甚至我做部门经理时也曾经这样想过,就连项目总监,可能也难免有类似的想法……直到我成为一个公司的技术合伙人,我的后面,再也没有人可以接我丢下的烂摊子了……

Sigh……,这是多么令人不适应的情况啊!

现在我要说的是,无论何时,都应该把自己当作最后一道防线,要坚守阵地,有时一夫当关可以万夫莫开,有时一人放弃却也会导致全线崩溃失地千里,我们要想尽一切办法解决问题,这个问题到我这里就是要终止,我必须破釜沉舟不留退路。

反正不是我的责任

不可避免的,程序员会碰上项目延期这种事儿。有的人会回顾项目执行过程中的种种问题,包括反省自己的不足、梳理团队成员协作上的问题、琢磨任务安排与进度跟踪是不是出了差错……这是积极的做法,我觉得每个程序员都该这么做,然而实际情况却并非如此,有相当一部分人会这么想:领导安排的事儿,我该做的都做了,我有什么办法,这是大家伙的事儿,很可能是项目没管理好或者需求老特么变,跟我有毛关系……

算了,换个环境

程序员换工作的频率很高,有的人两年换一次,还有的人一年换一次,更有的人一年换几次,这么频繁的还工作,真实的原因是什么呢?

有时是干得不顺心,觉得自己空有一篮子想法奈何领导不重视;有时是觉得团队的氛围不行,不能让大家安心做事,自己也无法保持积极向上的心态,在技术和职位两方面都无法获得成长;有时是觉得产品没有希望,看不到未来,越干越迷惘;有时是别的公司的超人气美女抛来了酸爽无限的绣球;更多的时候是,哎呀,那个公司真特么有钱啊;当然,还有时就是莫名地,觉得该挪挪地方了……

假如不是钱的原因,你还是决定换个环境,你觉得这样也许会好一些……果真如此吗?

你最终决定跳槽,一定是发生了什么问题,导致你无法容忍现状,但一定要问自己:我现在面临的问题,究竟是公司、团队、产品的问题,还是自己的问题,换个环境是不是不会再出现类似的问题?

也就是说,我们决定跳槽之际,需要深入分析,问问自己的内心,到底是外在的原因导致自己再也无法忍受现状,还是发自内心地觉得自己需要做出改变、去寻找新的方向。我们要弄明白自己的期望,搞清楚自己想要什么,这样才不至于才出泥沼又入火坑。


作为程序员,在开发和工作的过程中,难免会遇到各式各样的问题。面对问题,每个人都有自己的处理方式,不管你采取哪种方式,问题都不会自动消失。假如你采取的措施暗合“希望问题自行消失”这种模式,一定要注意,这是非常低级非常有破坏性的习惯。用这种模式“解决”问题的次数多了,时间久了,我们自己慢慢就成为问题了:因为我们事实上是在逃避问题,拒绝成长与成熟。我们希望跳到一个很少问题的环境里开开心心的工作,可这样的环境无异于理想国和桃花源,它们只存在于想象之中,如果我们自己的内在没有发生改变,不能培养出接纳问题、解决问题的能力,将在寻找的路上疲于奔命却永远也找不到这样的地方,最终绝望,最终选择“放弃自己”这一看似最不可能的结果。

既然各种各样的问题不可避免,那唯一可行的就是:直面问题,解决问题。

软件开发问题多多苦难重重,只有接受了这个前提,只有理解了这一生活与工作的本质,我们的工作与生活才会变得美好起来。

我们往往在问题面前缺乏耐心,想让问题马上解决,东搞一下西搞一下还解决不了,就想丢在那里不管,迈步跨过去或绕道而走,我们总想尽快脱身,尽快缩短与问题接触的时间而不愿花足够的时间来应对这种不舒服的感觉,不愿冷静地分析问题。因为直面问题解决问题,真的是需要绝大的勇气和卓越的耐受力来承担切肤裂心的痛苦。

然而,我们必须面对。如果选择逃避,只会越来越糟,问题会跟着我们走,我们走到哪里它们就撵到哪里。套用香港警匪片里的经典台词:“出来混,迟早要还的”。我们也一样,遇见问题,逃是逃不掉的,越逃问题越多,到后来总有你要还的那一刻。

既然如此,何妨早一日受苦、早一日解决、早一日浴火重生?让我们接受“先苦后甜”的生活模式,坦然面对问题。问题可以开启我们的智慧,激发我们的勇气。为解决问题而努力,我们的思想和心灵就会不断成长,心智就会不断成熟。我们解决问题的能力就会不断获得提升。我们终将因为直面问题而淬炼成钢,在混乱中成就自己,最终成就独特的自我,找到自己的方式活出个样子,这就是成功了。


更多精彩文章,参看“漫谈程序员”专栏。

我开通了微信订阅号“程序视界”,关注即可第一时间看到我的原创文章以及我推荐的精彩文章:

程序视界


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文讨论了同事工资打听的话题,包括同工不同酬现象、打探工资的途径、为什么打听别人的工资、职业的本质、商业价值与工资的关系,以及如何面对同事工资比自己高的情况和凸显自己的商业价值。故事中的阿巧发现同事的工资比自己高后感到不满,通过与老公、闺蜜交流和搜索相关关键词来寻求解决办法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 用友深耕烟草行业25年,提出数字化转型建议
    本文介绍了用友在烟草行业深耕25年的经验,提出了数字化转型的建议,包括总体要求、主要任务、发展阶段和六位一体推进举措。通过数字化转型,烟草行业将注入新动能,实现高质量发展。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 图、网络、关联矩阵在线性代数中的应用
    本文讨论了图、网络和关联矩阵在线性代数中的应用。图是结点和边的集合,通过箭头表示流向。关联矩阵是表示图内在含义的矩阵,每个结点代表一列,每条边代表一行。矩阵的零空间可以告诉我们列向量线性组合的状态。在物理系统中,图、网络和关联矩阵有着广泛的应用,特别是在描述问题结构和求解电势方面。此外,大型图会构建一个稀疏矩阵。 ... [详细]
author-avatar
局外人2502854057
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有