- 我是一个线程(修订版)
- 我是一个 Java class
- Javascript:一个屌丝的逆袭
- Java : 一个帝国的诞生
- JSP 一个装配工的没落
- TCP/IP 之 大明王朝邮差
- TCP/IP 之大明内阁
- TCP/IP 之蓟辽督师
- CPU 阿甘
- CPU 阿甘之烦恼
- CPU 阿甘:函数调用的秘密
- 我是一个网卡
- 我是一个路由器
- 我是一个进程
- 我是一块硬盘(上)
- 我是一块硬盘(下)
- 我是一个键盘
- 张大胖的 socket
- 张大胖学递归
- 学习面向对象的令狐冲
- 张大胖学数据库
- 数据库村的旺财和小强
- 小李的数据库之旅(上)
- 小李的数据库之旅(下)
- 漫画:什么是机器学习?
- 那些烦人的同步和互斥问题
- IE 为什么把火狐和 Chrome 给打伤了?
- 对浏览器村的第二次采访
- 节约标兵 IE 的自述
- EMail 诞生记
- Email 诞生记(下)
- Http 历险记(上)
- Http 历险记(下)-- Struts 的秘密
- 动物王国的面向对象
- 冯·诺伊曼计算机的诞生
- Http Server : 一个差生的逆袭
- 张大胖的加法器
- 从 1 加到 100:一道简单的数学题挑战下你的大脑
- 编程语言
- Javascript:一个屌丝的逆袭
- 计算机语言之战
- 我和编程语言的爱恨情仇(上)
- 我和编程语言的爱恨情仇(下)
- Android 为什么选择了 Java
- iOS 为什么选择了 Object-C?
- Basic : 一个老兵的自述
- Node.js : 我只需要一个店小二
- 命令式编程 vs 声明式编程
- 编译还是解释?
- 程序人生
- “架构师"小赵
- 师兄说
- 师姐说
- 小王的架构师之路
- 小李的版本管理系统
- 小超穿越记
- 小李的 Build 之路(上)
- 小李的 Build 之路(下)
- 张大胖改 Bug
- 我的编程之路--大学趣事
- 码农小王的一天
- 小李在外企
- 张大胖的需求估算
- 从厨师到码农
- 聊一聊那些神一样的程序员们(上)
- 聊一聊那些神一样的程序员们(中)
- 聊一聊那些神一样的程序员们(下)
- 谁是互联网之父?
- 一个价值百万的创业教训
- 让自己与众不同 - 提升工作的价值
- 看看你的“易燃性”
- 从无聊的工作中寻找价值
- 什么样的学生适合报考计算机?
- 谈谈程序员的职业方向(上)
- 谈谈程序员的职业方向(中)
- 谈谈程序员的职业方向(下)
- 谈谈培训班的作用
- 码农需要知道的“潜规则”
- 学习编程的加速度
- 码农在工作中的必备能力
- 码农和英语
- 老司机经验
- 假如时光能够倒流, 我会这么学习 Java
- 假如我是计算机系老师
- 学会编程, 而不是学会 Java
- 从增删改查中突围
- 抽象:程序员必备的能力
- 懒就一个字
- 编程的自学方法
- 小王买房记
- 从一道面试题谈谈一线码农应该具备的基本素质
- 想写框架的看过来
- 苹果手机变砖头以后
- 如何快速的学习一门技术?
- 唯一不变的是变化: 谈谈微信应用号
- 什么是企业应用?
- 勿以浮沙筑高台
- 为什么敏捷开发难于成功?
- localhost vs 127.0.0.1
- GitHub/Stackoverflow 找工作时有什么用?
- 动词 or 名词 :这是一个问题
- 如何选择入行语言
- 有时候,沉默是金
- 零 Bug 的代码是怎么炼成的?
- 浮点数为什么不精确?
- 文章错误大全
- Open Source--不要为了开源而开源
- 一不留神,代码就腐化了
- 先做个“键盘侠”, 再来写程序
- 不加断点调试的程序员是好程序员
- 码农必备技能:烂代码的处理之道(上)
- 码农必备技能:烂代码的处理之道(下)
- 学习数据结构有用吗?
- 从现在开始,丰富你的简历
- 那些永不过时的书,你看过几本吗?
- 学好编程必备的一个品质你知道吗?
- 你最爱的 Java
- 搞懂了这几点,你就学会了 Web 编程
- Spring 的本质系列(1) -- 依赖注入
- Spring 本质系列(2)-AOP
- 三层架构和 MVC 那点事儿
- Java 帝国之拨云见日识回调
- 小张的 Duck Typing
- JDBC 的诞生
- JDBC 后传
- 一个不安分的 JDBC 驱动
- Java 帝国之 Java bean (上)
- Java 帝国之 Java bean(下)
- Java 帝国之函数式编程
- Java 帝国之函数式编程(下)
- 关于 Java 初学者需要知道的 10 件事
- JUnit 你不知道的那些事儿
- 圣诞礼物:Java EE 的历史
- Java EE 读书指南
- 给小白的 Java EE 指南
- 给小白的 Java EE 指南(2)
- 给小白的 Java EE 生存指南(3) : XML
- 给小白的 Java EE 生存指南(4) : 一只叫 Tom 的猫
- 给小白的 Java EE 指南(5) : AJAX
- 给小白的 Java EE 生存指南(6) :Java 反射
- 闲聊
- "饿了么"初体验
- 来自大脑的控诉
- 一个高中生是怎么玩自媒体的?
- 尝试 分答
- 到底应不应该上培训班?
- 自学编程中遇到问题怎么办?
- 据说 99%的初级程序员看完后都不迷茫了
- 一行代码引发的“血案”
- 对一个死锁问题的思考
- 通过外包进入名企
- 请开往十年前的今天
- 为什么自学中最好有个师傅指导一下?
- 这个网站值得你花时间投入
- 为什么你无法坚持自学编程?
码农小王的一天
上午 一大早去上班, 小王很高兴,因为项目经理5天前分给了他一个模块进行开发,自己辛辛苦苦,加班加点好不容易把它从界面到业务逻辑到数据都给弄好了,终于能喘口气了。
到公司刚坐到座位上, 项目经理就跑来了: “小王, 客户看了你刚做完的模块,他们改变了需求, 让你那个界面需要加一个“优惠码”的输入框。”
小王不满的说: “为啥要变啊, 之前签的需求确认书里没这一项啊, 他们怎么不早说? 经理恶狠狠的说: “哪儿有那么多为什么? 不做的话客户就不给尾款, 你想不想要半年的奖金了?”
小王赶紧禁声,心里恨恨骂了一句, 但还得老老实实的去改界面。
小王想起了最近看的一本书,布鲁克斯写的著名的《人月神话》,其中提到软件系统的复杂性远远超过建筑业和制造业, 软件的需求是在人的脑子中的, 用自然语言都很难完整、准备的表达出来。
一般情况下,人们只有看到一个运行的系统以后才会说: “ 奥, 我要的其实不是这个... ” ,需求的不确定性是导致软件复杂的重要原因。
看来这个复杂性在自己身上应验了。
赶紧看客户发过来的文档吧, 写的真烂, 真是“业务逻辑”啊, 一点逻辑都没有 !
去问经理,经理有些地方也不明白, 只有去找客户再确认了,
时间就这么一点一点的耗过去了。 中午 吃饭的时候,小王偶然听到客户给领导说,不就是加一个简单的优惠码吗? 分分钟的事儿, 这程序员怎么说两天才能做完? 不是消极怠工就是偷懒, 用加班来治他们!
小王敢怒不敢言,心里又骂了一句。
吃过饭,回到办公桌, 小王困的受不了, 昨晚看美剧看的太晚了, 趴在桌子上睡会儿吧。
没想到竟然做了个梦,梦见他的 Eclipse 变成了一个智能机器人,可以用自然语言来编程了:
小王: 我亲爱的 Eclipse 啊, 现在领导要在界面上加上一个“促销码”的输入框, 6 点前能搞定吗? 我和女朋友约了一起吃饭, 今天是情人节,你懂的。
Eclipse: 尊敬的主人,请您解释一下这个促销码的含义
小王: 你可以问问我们经理的 Word , 哦不对,是 WPS , 他那里有更准确的解释, 我先给你讲讲, 是这样的......
Eclipse : 尊敬的主人, 您去喝点咖啡吧, 4 点半之前我估计就弄好了。
小王: 对了, 你给小张的 Eclipse 联系一下,他那里有处理促销码的接口, 别忘了分布式的事务处理啊
Eclipse : 放心吧, 包在我身上。
在梦里小王正想着程序人生是多么美好的时候, 突然听到“咚咚咚”的声音, 有人在敲桌子, 原来是经理: “小王,你还睡觉? 赶紧写代码啊,明天客户就要看了”
小王从美梦中醒来,再次面对“残酷”的现实 :
Eclipse 还是这么原始, 还得一行一行的敲代码, 计算机发展了这么多年,怎么还没有突破性进展?
从二进制语言,到汇编语言,再到高级语言,其最基本的、最核心的东西依然是顺序,循环,分支, 即使加上面向对象,动态语言,库, 框架,计算机语言“弱智的本质”仍然没有改变。
只好通过苦逼的码农来填充需求和代码之间的鸿沟了。 下午 还是困的厉害, 小王从电脑背包中取出提神的利器:咖啡, 公司的免费咖啡早就没了,节减成本,真抠门。
一连喝了两杯自带的咖啡以后, 终于精神了。
开始编程!
小王悲催的发现, 虽然是加了一个输入框,但是整个界面不知道为啥乱掉了, 赶紧去找美工去改 CSS,小王还是挺喜欢和这个漂亮MM打交道的。
改了界面还不算, 业务层的代码也不能拉下, “优惠码”得处理啊, 这个优惠码是否正确? 是否使用过 ? 得一系列判断, 还要计算优惠码带来的折扣。
小王想:我自己肯定处理不了, 得调用促销模块的接口, 领导说去找小张,他在负责促销模块, 这个小张有点自视甚高, 看不起别人, 我和他不对付,真是不想找他。
可是小王又想起了领导的训示: 软件开发不是流水线, 码农不是流水线的工人,我们一定要精诚合作,年底要360度考评啊,末位淘汰!
看在工作和钱的面子上,还是去找小张吧。 改了业务层还不够, 数据库里也得存下来啊,记录下这个人已经用过优惠码了,不能再用了, 这谁来记录,是不是还是小张管?
奥对了, 小张的促销模块和我的模块好像不是一个数据库啊, 是不是还得处理分布式事务?
小王仰天长叹: 唉,这软件真 TNND 复杂。
牵一发而动全身, 客户怎么能想到一个小小的改动只是冰山一角呢, 下面才是大头啊!
这编程也是, 为啥就不能真正的组件化呢, 就像普利司通制造的轮胎一样, 造出来后几乎可以用到所有的汽车上。
我们为啥不能开发一个登录模块,让它用到所有的软件系统中呢?
实际情况是: 我们也有一些框架和库, 但是必须要对它们进行定制,进行很多的二次开发才能适应需求,这样的工作必须通过手工完成,尤其需要处理很多细节,通用性实在是太差了。
不是我们程序员笨, 在长期的斗争中,我们学会了分而治之,把一个问题划分为一个一个的模块, 让这些模块低耦合,高内聚, 我们还学会了分层,让各个部分的联系达到最小, 可是所有的这些努力只是把复杂性降低了一点, 本质的复杂性依然存在。
所以在现有的条件下, 不管用什么技术,组成软件的各个组件之间依然是高耦合的(相对对应传统产业而言), 高耦合会带来巨大的难以想象的复杂度, 而这种复杂度只好有苦逼的码农去搞定了。 后记: 编这个故事主要想说明“软件的复杂性”, 首先是需求在人的脑子里,难于准确描述 , 其次编程语言还处于非常原始的阶段,第三软件模块无法复用,并且高度耦合。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论