编程到底难在哪里?

来源: OSCHINA
编辑: h4cd
2018-09-04

编程到底难在哪里?知乎上有人提出了这个问题,提问者似乎将这个问题上升到了哲学高度,他认为各种编程语言就好比文字,编程的过程就是用文笔书写文章,假设对于语言的应用已经十分熟练了,那么编程的难点到底在哪里呢?是使用语言的思路难,还是各种算法的运用难,亦或是明明是人脑却要用电脑的方式思考问题?


问题下边答主 Amazon 资深工程师阿莱克西斯的回答比较典型,获得了 10k+ 的赞同,或许对你有所启发。

阿莱克西斯介绍,他们组有一位美国实习生,这里暂且叫他 G,G 很 geek、干活快,一天可以写 2000 行代码,阿莱克西斯 code review 的速度跟不上他写的速度。G 认为普通的编程没什么意思,太过于简单,写程序这方面已经没什么追求了,他比较想研究大数据的框架、数据库,或者机器学习之类的工作,做设计,早日脱离代码这种无脑工作。

有一次阿莱克西斯休假 2 周,交代了 G 一些工作,2 周后回来,发现让 G 改的那个 Java 包爆炸了,本来一个支持了 7 个功能的框架包,总代码量也就 5k 行,经过这两周 G 的发展,已经变成了 15k+ 行,也就是说 G 为了一个小功能在包里加了 1w 行代码。

阿莱克西斯表示这代码没法 review,于是让 G 解释这些代码都是干什么的。G 的回复:

(沉思+100)这块我现在也看不太懂当时为什么这么写了。。。

(沉思)这边写的比较复杂是因为当初那边是那样写的,所以这边没办法才只能这么写。

(沉思)把当初那边改好很麻烦,影响也很大,不如就这样吧。

(沉思)这里这么写是因为你看着里是这样的, 然后这里有这个逻辑,然后这里。。。(来回来去翻n个类之后)。。。 所以你看我这里虽然写的比较诡异,但是完全没问题的!(得意ing)

(沉思)这边做的这么奇怪是因为有个bug,通过这么写,这个就bug没了,我也不知道怎么回事。。。所以你看我在这边注释,这行不能删了。。。

(沉思)我觉得这个功能很酷,你们虽然现在不需要,不过有总比没有好吧,将来如果……%¥……&%&……%*7&%……*%…(我没听懂)的话,这个就很有用!!

...

G 的解释充满了”忘记为什么那样写、照着原有代码写、怕麻烦将就着写、只关注功能有没有实现去写、天马行空过度优化“……没办法,阿莱克西斯一次一次让 G 重写,他表示这样编程也太难了,后来总算简化成大概 5k 行。再后来阿莱克西斯重写了一遍这个库,总共只有不到 1k 行代码。

通过 G 的事例,阿莱克西斯想表达,编程的难处不在于代码能不能写得快,而在于需要对以下几个方面做出有效的交待:

  1. 做出来容易,做正确难。做出来指没 bug 且完成需要的功能,这是最基本要求。正确不是指功能正确,而是指程序可以很容易推理理解,理解意图,理解它是如何做到的,理解为什么系统不会出错,理解为什么要这么做。

  2. 编程是给未来的人讲故事。你无法知道将来这个人是谁,他都懂什么,他经历过什么,这个系统将来已经是什么样子了。我们需要在这种无知,缺乏信息的情况下做决定,从千万种把这件事做出来的方法里,选出你觉得最能把这个故事给讲好的那种方式,把故事写下来。编程是一种沟通,沟通是一种艺术,用程序跨越时空之沟通则是一门属于程序员的特有的艺术(就好比数学家用数学公式来沟通)。

  3. 坏的决定会导致坏的决定,甚至导致人们去扭曲一个好的决定去迎合坏的决定。垃圾会制造垃圾,一个放在系统里不经清理的额外复杂度,会导致更多额外复杂度的生成。

  4. 每个人甚至同一个人的不同时刻都有自己不同的制造额外复杂度的缺陷,回头看你昨天写的代码,可能会觉得都是垃圾。

你认为编程到底难在哪里呢?

展开阅读全文
17 收藏
分享
加载中
精彩评论
Java不是靠代码行数算工资的吗?😳
2018-09-04 09:29
7
举报
难点在语言不通,产品经理说汉语,程序员说编程语言,不同的程序员说不通的编程语言,机器说010010,文档说英语。
2018-09-04 10:58
4
举报
我觉得第一个实现复杂的算法肯定是难的,第二个则是编程的整个代码结构需要做到恰到好处的实现功能,各部分协调并且逻辑清晰,没有多余的逻辑,易于修改和扩展,这一点也是难的。第二点一般不能一步达成,需要后续的精雕细琢的重构来完善。
2018-09-04 09:04
4
举报
2018-09-04 09:12
3
举报

引用来自“lxbzmy”的评论

难点在语言不通,产品经理说汉语,程序员说编程语言,不同的程序员说不通的编程语言,机器说010010,文档说英语。
创11:6 耶和华说:“看哪!他们成为一样的人民,都是一样的言语,如今既作起这事来,以后他们所要作的事,就没有不成就的了。
创11:7 我们下去,在那里变乱他们的口音,使他们的言语彼此不通。”
创11:8 于是,耶和华使他们从那里分散在全地上;他们就停工不造那城了。
创11:9 因为耶和华在那里变乱天下人的言语,使众人分散在全地上,所以那城名叫巴别。
2018-09-04 11:01
2
举报
最新评论 (22)
人家的回答都没有贴全,这文章转载的。。。
2018-09-10 09:50
0
回复
举报
用有限的代码解决无限的问题,吃不饱
2018-09-05 14:43
0
回复
举报
我当年的室友,问他一件事自己会不会干,他会;但是一旦让他讲清楚所有步骤就讲不清楚。连人都不能理解的情况下,怎么能指望他写出机器能理解的代码?
2018-09-05 09:32
0
回复
举报
编程是把现实需求转化为电脑系统。。。。问题是 需求 谁都不清楚,包括天天面对业务的甲方义务骨干,
不仅仅对当前的义务无法整体、全面的分析抽象,对于将来的变化趋势也是无从谈起,
做出来的系统自然是要 反复修改、千疮百孔
2018-09-04 21:32
0
回复
举报
要考虑到各种情况
2018-09-04 17:40
0
回复
举报
烂代码不可避免 而且很多公司很浮躁 根本不给你优化的时间
2018-09-04 16:39
0
回复
举报
难的是业务
2018-09-04 13:59
0
回复
举报
编程是给未来的人讲故事
——这句话讲得太棒了
2018-09-04 13:53
0
回复
举报
像 G 这样适合用脚本语言做业务开发,做底层不适合啊。
2018-09-04 13:01
0
回复
举报
技术是复杂的。
2018-09-04 12:56
0
回复
举报
更多评论
23 评论
17 收藏
分享
返回顶部
顶部