编程难在哪里? 一个美国实习生的故事。

面向接口编程(或者面向抽象编程)的一个例子。 当然你得先知道面向对象是什么。   有一天,我想盖个房子,当然我自己是肯定盖不起来的,我要找村东头的强壮搬砖大哥,村南头的技术娴熟的砌墙师傅,村北头的水泥大哥和邻村的贴瓷砖师傅等。 我的计划是这样的: 先找人。 找到村东头的搬砖大哥, 找到村南头的砌墙师傅, 找到村西头的水泥大哥, 找到邻村里的瓷砖师傅, 然后,开工~ 只要房子没盖好,就执行下面的步骤: 搬砖大哥去搬砖, ... 阅读详情

作者:阿莱克西斯

来源:

https://www.zhihu.com/question/22508677/answer/276595266

记得之前组里来了一个美国实习生小伙子,很geek的那种,干活快,一天能给你写2000行代码(我code review的速度跟不上他写的速度),让做什么东西,上午告诉做个这个功能,下午就能在测试环境跑起来演示了。

跟他单独开会的时候,他说觉得普通的编程没什么意思,太简单了,写程序这方面已经没什么追求了,他比较想跟我研究大数据的框架,数据库,或者机器学习之类的工作,做设计,早日脱离代码这种无脑工作。

我足足花了1周时间,每天review他的代码到凌晨。给他写的comments反馈快赶上我在知乎写的答案文章之和了。。。期间几小时几小时的开会论战,孩子狂,语速快,脑力灵,辩论角度刁钻。他天天要与我论战,看我的评语,速度还算慢下来了。

没来得及讨论完,隔周我要休假了,2周。交代了些他要做的工作。

2周回来,让他改的那个java包爆炸了,本来我们一个支持了7个功能的框架包,总代码量也就5k吧,等我回来这包代码量1w5+。也就是说他为了一个小功能加了1w行代码。

这没法review,只能跟他坐一块,先让他给我讲讲这代码都干什么的,然后他说:

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

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

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

(沉思)这里这么写是因为你看着是这样的, 然后这里有这个逻辑,然后这里。。。

(来回来去翻n个类之后)。。。 所以你看我这里虽然写的比较诡异,但是完全没问题的!(得意ing)

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

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

一次一次被我打回去重写,后来总算简化成大概5k行了;临走时候跟我说:你这样编程也太难了。。。

再后来由于一些额外复杂的代码造成我们实现新东西会很复杂,我又重写了一遍,总共大概不到1k行代码。

这里边有几件事情我想说:

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

正确是现在怎么写不会挖坑害将来的人,现在怎么写能让别人1年后看你代码时候不可能理解错你现在的意图,现在怎么写能在别人将来犯错的时候提示他你错了。

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

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

4. 每个人甚至同一个人的不同时刻都有自己的不同的制造额外复杂度的缺陷,比如我每年去看去年自己写的代码,觉得都是垃圾。

然后我又想问几个问题:

我们所在的部门,所在的组,公司,它们的文化,到底是关心作出了一个东西,还是关心做好了一个东西。一个总是给系统添加垃圾,留坑给后人,但是能很快做出能跑起来的系统的程序员,我们到底认为他是做了好事还是做了坏事?我们到底认为他很强,还是他很弱?用超过必要而为了突显技术实力(或者练手)的复杂工具,技术框架搭建系统,做完跑路,在一个组,一个部门,一个公司,那里的文化,到底应该是鼓励还是抑制这种行为?我们又应该如何在一个环境中,去倡导推崇什么样的文化,相遇什么样的人?

人与文化,决定了什么人留在这里,什么人离开,什么人吸引什么人,什么人成长成什么样子。而设计/技术这些枝末细节则必顺应此中的人与文化而自然变化,或自愈,或走向毁灭;哪怕在恶劣的环境中,向下引导,向上规谏,潜移默化,最终改天换日,此为编程之大道也!

下边是定理证明(雾)

======画风突变高能预警!!!!!!

最小垃圾存在定律:定义垃圾为系统的总复杂度减去系统的本质复杂度;那么得到:如存在多种方法可以设计与实现一个系统或功能,存在且只存在一种实现会引入最少的垃圾;


垃圾与复杂度正比定律:根据定义可得,系统存在的垃圾越多,系统越复杂;

垃圾倍增定律:基于已有垃圾量a的现状来演化,进化此系统,增加的新垃圾量与已有垃圾量a成正比;

系统腐败定律:当基于垃圾量a来实现新功能的cost大于新功能本身的价值时,系统腐败,需要重构;

战斗人员负战力定律:如果程序员a引入的垃圾,在n次迭代中经过倍增所造成的成本,大于其所清扫的垃圾经过倍增所获得的机会成本,和其实现的新功能价值之和。此时,我们称此程序员战力为负值,其战力绝对值与其引入垃圾的能力和其清扫垃圾的能力的差值成正比

以一敌百存在定律:由负战力定律可知,对所有的自然数n,一个正战力的战斗人员的战力 > (负战力战斗员1+负战力战斗员2+ … 负战力战斗员n)的战力和

系统本质复杂度不可知定律与系统表征复杂度无限接近本质定律:取决于战斗人员的知识量,经验,天赋等,对于任何战斗人员n,都必定存在一个战斗人员m(考虑历史长河)使得战斗人员n观察系中的纯净无垃圾系统(复杂度总为1)是战斗人员m观察系中的含垃圾系统(复杂度为1+x),这使得在所有观察系中(包含外星生物),系统的表征复杂度(或者说观察复杂度)无限趋近与本质复杂度。然而我们只能通过观察来感知事物的本质复杂度,却永远无法得知我们离本质复杂度还有多远。

以有限的生命去追求可以无限的提升的净化方法与视野,我们称之程序艺术家,也就是SDA(Software Development Artist)… it's extraordinarily important that we in computer science keep fun in computing…         ——— Alan J. Perlis (April 1, 1922-February 7, 1990) 《SICP》

打星际… 哦,不, 错了重来…  写程序,你快乐嘛?

写在最后,看到大家最关心的是他拿到正式录取资格了么?还有也许通过我的描述关于他的这个侧面,你会觉得他很不称职。其实不是的,他代码写的绝对是平均值往上的水平,他的问题在于:

1.是他根本没有想过去简化业务逻辑,所以很多符合最初需求的代码在简单优化业务逻辑之后完全不需要。

2. 是自己加了很多功能。

3.是自己加了很多自以为是的优化,比如用一个算法估算某个函数的输入数组的最大可能值,然后用那个值来初始化一个数组,因为这样就不会重新分配内存了(他原话)。

4. 抽象能力有限,这个毕竟经验少, 年轻。

5. 滥用设计模式(关于设计模式,最多程序员被绊住的一关:设计模式是面向对象编程模型中,应对经典问题的经典解决方案。这里就有两个问题,第一,设计模式的场景用对了么?第二,为什么要用面向对象范式,选择编程语言范式时,要从表达力最弱最简单的语言范式开始选择。这叫做最弱表达力原则,而面向对象范式作为最复杂,表达力最强的语言范式,在大多数时候都可以避免使用。关于第二点的论述证明,你可以看concept techniques and models of computer programming这本书。注意,这里说的是语言范式,而不是语言。即使你用java,如果你从来不使用mutable(专业词汇)的功能,和继承。那么你就没有使用面向对象范式)

他其实有非常强的解决问题的能力,想法天马行空,通过自己设计算法来猜函数可能需要的数组大小就可见一斑,还有一个从s3(专业词汇)读数据的需求,他不是简单调api完了,而是写了一个环状buffer(专业词汇),使得网络,硬盘,app可以在理论上最大效率的适应程序当时的场景(为了协调异步,他自己发明了一个很笨拙的promise(专业词汇)),这非常厉害,一般的实习生哪怕sde1可能都写不出来(可惜的是场景会随业务逻辑激烈变化,今天的优化可以是明日的累赘,这就叫做过度优化,过度优化是一种强耦合,会把你的系统死死的钉死在当前版本)。

他只是不明白简单是美这件事情而已。如果能有人帮他斧正,日后必成大器。

他最终拿到了正式录取资格,这其中还有个小波折,终审的bar raiser(amazon内部的一个可以一票否决招聘结果的角色)看到他在代码复查系统里跟我的各种激辩,觉得这人不能留。好说歹说才给了正式录取资格。不过最后人家没接,去读博啦。

最最后:在一个相对干净的环境写程序,不断找出新的本来以为不是垃圾的垃圾,对我来说,是一件非常愉快的事情。然而帮别人打扫他本就不该制造的垃圾则是非常痛苦的一件事。 写程序,本应是多么快乐的一件事啊!

(完)

码农翻身,用故事讲解技术本质, 更多精彩文章,请移步《码农翻身三年文章精华》

pyautogui库详细教程,逐行注释(附项目实战:基于图像识别实现崩坏星穹铁道自动化测试) 本文包含了pyautogui的使用方法与常见问题指南,随文附带对游戏实现的自动化项目源码与说明文档 阅读详情

相关推荐

ESP32实战:破解校园网WPA2-Enterprise认证的完整指南

本文详细介绍了如何使用ESP32开发板破解校园网WPA2-Enterprise认证的完整指南。通过硬件准备、环境搭建、核心代码实现及常见问题排查,帮助开发者解决企业级WiFi连接难题,特别适用于校园网环境下的物联网设备开发。

weixin_29194817的博客 457

编程难在哪里?一个美国实习生的故事

记得之前组里来了一个美国实习生小伙子,很geek的那种,干活快,一天能给你写2000行代码(我code review的速度跟不上他写的速度),让做什么东西,上午告诉做个这...

代码技巧 341

深度学习驱动材料科学:晶体生成与性质预测技术综述

深度学习作为人工智能的核心技术,通过模拟人脑神经网络处理复杂数据,在多个领域展现出强大的模式识别与生成能力。其原理在于构建多层非线性变换,从海量数据中自动学习特征表示与映射关系。这一技术价值在于能够高效处理高维、非结构化数据,解决传统方法计算成本高、探索空间有限的问题。在工程实践中,深度学习已广泛应用于计算机视觉、自然语言处理等领域,并正深刻变革材料科学的研究范式。具体到材料领域,它通过学习已知材料的构效关系,实现对新材料性能的快速预测与逆向设计。应用场景包括但不限于新能源材料、半导体、催化剂等领域的高通量

weixin_28695161的博客 418

编程到底难在哪里? 从一个美国实习生的故事说起

记得之前组里来了一个美国实习生小伙子,很极客的那种,干活快,一天能给你写2000行代码(我复查的速度跟不上他写的速度),让做什么东西,上午告诉做个这个功能,下午就能在测试...

数据与算法之美 518

从机械臂示教到厨房做饭:ACT模仿学习如何让机器人更“人性化”?

本文探讨了ACT(Action Chunking with Transformers)模仿学习技术如何让机器人更“人性化”,特别是在厨房等复杂场景中的应用。通过动作分块(Action Chunking)和时态融合(Temporal Ensemble)技术,机器人能够像人类一样记忆和执行复杂任务,如烹饪。文章还分析了ACT在家庭场景中的落地挑战及其在康复医疗、柔性制造等领域的跨领域应用潜力。

weixin_30613343的博客 255

Oracle EBS财务模块(三)总账功能

(一)总账管理系统主要功能  总账管理系统(Oraclegeneralledger)是一个公司一切账务系统的核心,它好比是公司会计信息的中央处理器。总账管理系统提供了一个完整的财务管理核算及分析流程。它是所有子账户的信息存储器,因此反映了所有子账户的财务和现金活动。总账管理系统的主要作用是记录公司的财务活动,并生成财务报表和管理报表,以帮助公司内外人士进行决策。一个公司或组织的制造系统、项目管理系

苏南生的优快云博客 2万+

编程难在哪里? 一个美国实习生的故事。(转自刘欣老师的微信公众号——码农翻身)

阿莱克西斯码农翻身3天前 作者:阿莱克西斯 来源: https://www.zhihu.com/question/22508677/answer/276595266 记得之前组里来了一个美国实习生小伙子,很geek的那种,干活快,一天能给你写2000行代码(我code review的速度跟不上他写的速度),让做什么东西,上午告诉做个这个功能,下午就能在测试环境跑起来演示了。 ...

qq_38836118的博客 926

第一篇:常见CAN错误帧及其排查方向

在本文中主要阐述各类错误帧的形成原因以及在使用同星硬件设备出现错误帧时,应当 如何进行排查并消除错误帧。在 CAN 总线通信中,通常遇见的错误帧主要为以下五种,其 分别是:bit error、ACK error、stuff error、CRC error 以及 form error。

u013089100的博客 1746

一天能写2000行代码的实习生,到底是不是一个程序员的好苗子?

作者:阿莱克西斯来源:https://www.zhihu.com/question/22508677/answer/276595266 记得之前组里来了一个美国实习生小伙...

程序员之家 3917

从零搭建宝兰德BES单机版:分离式安装、环境变量配置到控制台访问的避坑指南

本文详细介绍了从零搭建宝兰德BES单机版的完整流程,包括分离式安装、环境变量配置和控制台访问的避坑指南。针对中间件安装部署中的常见问题,提供了账号规划、JDK配置、实例创建和防火墙设置等实用解决方案,帮助开发者和运维人员高效完成BES中间件的部署工作。

weixin_32576389的博客 375

使用everything出现mem_virtual_alloc(): Fatal Error: out of memory解决方案

本文主要介绍了使用everything出现mem_virtual_alloc(): Fatal Error: out of memory解决方案,希望能对使用everything的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

编程到底难在哪里?

写在前面:我用自己不纯熟的英翻中把原文中程序员交流时经常使用的英文都换成了中文,翻译不好请谅解 -_-)记得之前组里来了一个美国实习生小伙子,很极客的那种,干活快,一天能给你写2000行代码(我复查的速度跟不上他写的速度),让做什么东西,上午告诉做个这个功能,下午就能在测试环境跑起来演示了。跟他单独开会的时候,他说觉的普通的编程没什么意思,太简单了,写程序这方面已经没什么追求了,他比较想跟我研究大

程序员之家 5961

EndNote X9 参考文献附录列表 格式调整

EndNote X9 插入参考文献常见问题总结

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 2571

《故事思维》与其讲道理,不如从一个故事开始 - 三余书屋 3ysw.net

好的,现在我们来说你需要掌握的第四种故事,能带给人智慧的故事。通过激发人们的希望和梦想,这种故事能够激发人们的积极性和行动力,让他们更加愿意追求自己的目标。很多时候,我们不必掩饰自己想要得到什么,因为只要不是过于自私,人们通常并不在意我们的目的,他们更关心的是我们是否诚实,是否在欺骗他们。斯吉普讲述了他在造船厂绘制电气平面图时犯下的一个错误,尽管他拥有专业知识和对船只的深入了解,但他仍然犯了一个严重的错误。通过讲述故事的方式与他人沟通,你会发现事半功倍的效果,这就是故事思维的核心魅力。

jijing的专栏 1306

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

一个美国程序员的财务自由之路

这位叫Rajiv Prabhakar的美国程序员,大学学的是计算机工程(硬件)专业,2009年硕士毕业,在Intel和Sun从事了5年集成电路验证的相关工作,然后跨入软件开发行业,先后在创业公司,Google 和亚马逊工作,工资直线上升,非常喜人。最近他开始创业,成立了一家B2B SAAS的公司并且担任CTO,现在已经拉了300万美元的风投。他记录了过去十多年自己收入增长的情况:时间公司年收入(美...

码农翻身 597

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

一个故事彻底理解 Java 并发

点击上方 "程序员小乐"关注公众号,星标或置顶一起成长每天早上8点20分,第一时间与你相约每日英文Love fight, get treasure, Miss for...

吧主 160

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

《软件故事:谁发明了那些经典的编程语言》

《软件故事:谁发明了那些经典的编程语言》 基本信息 作者: (美)史蒂夫.洛尔    译者: 张沛玄 出版社:人民邮电出版社 ISBN:9787115355089 上架时间:2014-6-19 出版日期:2014 年6月 开本:16开 页码:1 版次:1-1 所属分类:计算机 > 软件工程及软件方法学 > 综合 更多关于》》》《软件故事:谁发明了那些经典的编...

weixin_34149796的博客 565

每一个人都应该学习电脑编程,因为它会教你如何思考

扎克伯格11岁开始学习编程,创办Facebook;比尔·盖茨13岁学习编程,创办微软……乔布斯说:“每一个人都应该学习电脑编程,因为它会教你如何思考。" 现在在北京上海,顶级的IT工程师,年薪至少是百万级的(一线公司大学毕业生起薪都是30万),股票期权一兑现,全公司人人都是千万富翁。估计你们也听说过王者荣耀项目组,今年项目奖金是120个月的工资,再次引发了一阵

数据与算法之美 4184
上一篇: Code Review 的巅峰
下一篇: 搜索之路:Elasticsearch的诞生
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值