这并不是该年轻开发者的首次工作经历。但是他的第一个项目已经被证明是有问题的。当时,他认为功能从来不会改变。但是他错了,每次修改功能都需要一次彻底的重构,引发了bug以及大量时间的浪费。他甚至尝试过编写测试之类的、有效的方式。不过他的测试需要维护、编写所需时间、甚至更多执行的时间。

对于每个年轻的开发者,他在成长过程中总是听到有经验的开发者说到的“当心!过早优化是万恶之源!”、“编写测试!测试!测试!”。或许他只是在重构一个微小的实用程序方法,而这时有经验的开发者将走过来、以严厉的表情警告说“你没有做过早优化,对吧?”、或“你在写测试,是吗?”。

但是所有这些警告都被忽视了。因为年轻开发者不理解过早优化为什么是万恶之源、也不理解测试应该是正确的。根据他自己的经验,他知道下面的需求从长期看是不合理的(因为它们可能有修改),编写测试就是在浪费时间。

“我究竟为什么每次都必须重写我的代码?我究竟为什么必须在当下编写代码、随后再重构,我什么时候能够编写世界上最好的代码?还有,我究竟为什么不得不用我所有的时间来编写没用的测试?”这就是年轻开发者的疑惑。

一天,年轻开发者开始着手一个新项目。他决定无视有经验开发者的警告;为了应对每次需求变化,他期望每块代码是快速的、可配置的和健壮的。需求清晰了,不过他要做得更好。比如,当有个功能,生成以大写‘S’结尾的产品代码时,他创建一个配置对象,这样结尾的字母就可以通过配置来修改,通过配置还可以决定这个字母应该是大写还是小写。当需求说明需要一些校验时,他就创建一个庞大的校验器,不仅包含需求要求的,还有很多没要求的。

在编写了项目的核心之后,一种完美的感觉充满了年轻开发者的全身。“那个有经验的开发者是错误的!”年轻开发者看着自己的杰作得意地说。他夜以继日地工作,认为数周后就可以发布产品了。

光阴荏苒……

一天,客户告知他们一个bug。有经验的开发者看到这个bug,对显示器上出现的情况保留着厌恶:年轻开发者看到了大教堂,而有经验开发者看到的是贫民窟;年轻开发者看到了模式,而有经验开发者看到的是一个充斥着class的复杂网络;年轻开发者看到了比光速还快的代码,而有经验开发者看到的是不必要的复杂算法。他不想碰这些代码,因此他让这个年轻的开发者去修复自己的bug。

其他人不认为年轻开发者的代码是优美的,只有这个想法让他感到失望。他充满愤怒地打开了项目……才发现代码对于他来说,也是费解的!代码背后没有清晰的意义。“这就是我不打算再使用这门语言的原因,语法太糟糕了”,往往是年轻开发者的第一反应。但是他在内心深处知道,这不是真正的问题。真正的问题是他。

一天结束的时候,bug修复好了,却产生了另一个bug,这是那一天之后发现的。每次修复都在影响着项目内部的瘦弱的平衡,就像亮白色衣服上的一小块黑色补丁。

此时这个年轻的开发者绝望了,他的大教堂开始摇晃,他感到离崩塌不远了。年轻开发者自问,“或许我不是这份工作的合适人选。为什么我不能编写恰当的代码呢?”带着沮丧和愤怒的交织心情,年轻的开发者打开了有经验开发者维护的项目。

他看到的代码让他感到吃惊:代码有注释和测试,易于阅读。和他最初开始写的代码没有太多区别,有一些清晰的例外:没有可扩展的配置,每行代码都被测试了,每个方法都取着有意义的名字、且简短(最多10行代码),只做必要的,每个文件只包含了能够严格做本质工作的方法。

在这个忧郁的时刻,有经验开发者来到了年轻开发者身边,和他挨得很近,开始重构引起所有bug的代码。

他们一起工作了数天,有时候,有经验开发者写代码,而年轻开发者观看有经验开发者如何解决问题;另些场合,年轻开发者写代码,而有经验开发者在旁边监督。

数天后,一次新的部署标志着bug已被修复。引起bug的小部分代码,现在可以被测试了、易于阅读了,也很稳定。有经验开发者看着年轻开发者说:“你现在明白了吗?”

年轻开发者点了点头,他现在明白了。完美的关键不是预测将来,而是编写容易修改、测试(这样修改就不会引发其它bug了)以及只需满足当前需求的代码。当他意识到这一点时,他注意到他正在变化,正在变成差不多有经验的开发者。

年轻开发者问,“我们现在能够重构整个项目吗?”

有经验开发者干脆地答道,“当然不可以!没有预算”

年轻开发者问,“但是,如果其它bug出现了,该怎么办?”

有经验开发者答道,“我们将找个自由职业者(freelancer)来修复”

然后,这个差不多有经验的开发者开始编写优秀的代码,准备学习另外的经验。不过这是另外一个故事了。

年轻开发者的启示:回头看看你过去写的代码,如果你的代码看起来还不够优美,不要感到失望。

有经验开发者的启示:当周围有年轻开发者时,你将不得不给他擦屁股。你最好的机会就是他将学习如何编写得体的代码,越快越好。

自由职业者的启示:你或许想提高你的报价

英文原文:The Sorrows of Young Developer

译文: 《年轻开发者的那些伤心事 》 腊八粥

来源:51CTO

平凡的故事:年轻开发者的那些伤心事相关推荐

  1. 即时通信软件开发的年轻开发者曾注意到

    微软"迷失"的十年,已成为美国企业发展史上最大的谜团之一.为了解其中缘由,曾两次获得乔治·波尔卡新闻奖(George Polk Award)的美国知名记者.最近刚刚担任<名利 ...

  2. 开发者们的迷茫期,该怎么看破?

    作者:邹溪源,多年来从事企业级架构设计和软件开发,目前在长沙某互联网公司担任高级工程师.架构师小秘圈特约作者. 背景 前不久,我有幸看到了CSDN知名博主"沉默王二"写的一篇博客& ...

  3. 开源吞噬世界,得开发者得天下

    扫描上方二维码直达精彩回顾 整理 | 伍杏玲 出品 | 程序人生(ID:coder_life) 前不久,64 岁 Python 之父 Guido van Rossum 退休失败,加入微软搞开源一事引起 ...

  4. 为什么技术开发者应该读一读《浪潮之巅》

    上周已经阅读完吴军老师的著作<浪潮之巅>第二版,迄今仍然激情澎湃.这本著作以平和直白的笔触介绍了硅谷IT企业们的发展史,看像微软.谷歌.苹果等优秀的IT企业们,从白手起家,到发展壮大成为今 ...

  5. 年轻一代程序员:社牛、不卷、玩开源

    这个世界,归根结底是属于年轻人的. 过去二十年,以程序员为核心的互联网行业,创造了诸多故事,这些故事的结尾通常是阶级跃迁.财务自由或提前退休.但就像每个历经起伏的领域一样,当互联网进入下半场,热潮回归 ...

  6. php 内核 字符串 比较,PHP内核探索之变量- 不平凡的字符串

    切,一个字符串有什么好研究的. 别这么说,看过<平凡的世界>么,平凡的字符串也可以有不平凡的故事.试看: (1)       在C语言中,strlen计算字符串的时间复杂度是?PHP中呢? ...

  7. 改变世界的开发者丨玩转“俄罗斯方块”的瑶光少年

    本文分享自华为云社区<改变世界的开发者丨玩转"俄罗斯方块"的瑶光少年>,作者:华为云头条 . 2019年8月,25岁的童昊入职华为,当时他根本没有想到,两年后自己参与研 ...

  8. CSDN创始人蒋涛:开源吞噬世界,得开发者得天下

    7 月 15 日,由中国开源软件推进联盟(COPU)主办,赛迪传媒.<软件和集成电路>杂志社联合承办,CSDN 独家直播的 2020 第十五届"开源中国开源世界"高峰论 ...

  9. 资深开发者们是如何读书的?---线下读书会记录

    读了多少书?怎么读书? --请问大家最近读书了吗?一年大概读了多少本书.有超过20本,超过30本,超过50本吗? 在7月14日由长沙互联网活动基地和长沙.NET技术社区组织的小型社区活动,<开发 ...

最新文章

  1. AI一分钟 | 传阿里暂停在美扩张云业务;Google发布AI工具以识别儿童性侵犯图片...
  2. 域用户不能使用远程桌面登录
  3. 采用个hook技术对writefile函数进行拦截(2)
  4. CPU+GPU异构计算完全解析
  5. Android 百度地图-实现POI的搜索(搜索周边)附源码
  6. Linux下文件的多进程拷贝
  7. 八皇后问题 递归求解法
  8. python爬虫短片_Python爬虫练习:爬取全民小视频(附代码,过程)
  9. JavaScript学习(三十八)—面向过程与面向对象
  10. Python Selenium Webdriver常用方法总结
  11. VO、DTO、DO、PO的概念
  12. 火狐插件 Katalon Recorder 生成 python 等语言 代码
  13. java类型的对象可以存储属性_重识JVM(一)-类与对象在JVM中是如何存储的
  14. 科普:为什么DOTA2和LOL没有全图挂
  15. oracle sqldeveloper 115网盘 提取码
  16. 逻辑推理与判断(委派任务)
  17. 安卓miracast花屏_手机投屏电视频繁断开的解决办法
  18. CSS尺寸与文本讲解。HTML、CSS笔记(四)。
  19. #Sam有话说#人以群分,共性与个性的智慧
  20. 水溶Cy7/Cy3/Cy5-SE染料,水溶性CY7活化酯,CAS号:477908-53-5

热门文章

  1. 2016 Bird Cup ICPC7th@ahstu--“波导杯”安徽科技学院第七届程序设计大赛
  2. zoj 2706 线段树
  3. 谈谈我们的学习和我们的Blog
  4. python---之round
  5. 1.5 欠拟合和过拟合
  6. CListCtrl,SetItemState 高亮(显示蓝色)
  7. 【学习OpenCV4】如何操作图像中的像素?
  8. ajax的结果处理,jQuery ajax返回数据的后续处理
  9. mysql int 长度 范围_mysql int(M) M意义 和int长度
  10. cocos2d for android,cocos2d jsb 打包 Android APK