夕甲甲——孔乙己之C++版
欧欧匹代码的格局,是和别的编程模式不同的:首先要有一个构造函数;基类里只定义了函数的形式,可以随时通过派生增加不同的实现。那些程序员们,每每学会了继承和多态,便可以接一个项目,——这是十年前的事,现在至少要懂得设计模式,——靠柜台外站着,写些代码换一个鸡蛋灌饼吃;倘若懂一些多线程的知识,便可以在鸡蛋灌饼里加火腿肠,或者里脊了,如果懂得语言的实现原理,那就能做一些底层代码的优化,换一盘炒菜。但这些程序员,多是初级水平,大抵没有这样深入。只有懂得内存模型的,才能接一些底层的项目,打开调试器和剖析器,慢慢的坐着优化代码。
我从十二岁起,便在村口的githoverflow工厂里当学徒,师傅说,我逻辑思维太差,怕学不会静态类型语言,就写些shell脚本吧。shell脚本虽然容易写,但语法容易含混不清的地方也不少。字符串和数组的功能很弱,条件判断的语法也很奇特,有时要对特殊字符手动做两重转义,然后通过。在这种情况下,写脚本也很为难。所以过了几天,师傅又说我干不了这事。幸亏荐头的情面大,辞退不得,便改为专管测试的一种无聊职务了。
我从此便整天的站在测试机前,专管运行测试脚本。虽然没有什么失职,但总觉得有些单调,有些无聊。师傅是一副凶脸孔,程序员也没有好声气,教人活泼不得;只有夕甲甲到厂里,才可以笑几声,所以至今还记得。
夕甲甲是站着编程而手动管理内存的唯一的程序员。他用的开发语言语法臃肿;结构杂乱,代码间时常夹些#ifdef;一堆乱蓬蓬的充当接口的.h文件。虽然是手动管理内存,可是经常出现野指针,要么忘了初始化,要么释放后没有设置成NULL。他写的代码,总是满屏的奇技淫巧,叫人半懂不懂的。因为他姓夕,又总觉得自己的技术天下第一,别人便用“甲乙丙丁”的第一个字,替他取下一个绰号,叫做夕甲甲。夕甲甲一到厂,所有的程序员便都看着他笑,有的叫道,“夕甲甲,你的代码又出新bug了!”他不作答,对柜里说,“来两个鸡蛋灌饼,一杯豆浆。”便把Thinkpad摆好。他们又故意的高声嚷道,“你一定又把人家的内存搞泄漏了!”夕甲甲睁大眼睛说,“你怎么这样凭空污人清白……”“什么清白?我前天亲眼见你搞崩了Windows的内存,吊着打。”夕甲甲便涨红了脸,额上的青筋条条绽出,争辩道,“内存没释放不能算泄漏……没释放!……程序员的事,能算泄漏么?”接连便是难懂的话,什么“new/delete配对使用”,什么“谁申请谁释放”之类,引得众人都哄笑起来:厂内外充满了快活的空气。
听人家背地里谈论,夕甲甲原来也读过CS博士,但终于没有去做学术,又不会营生;于是愈过愈穷,弄到将要讨饭了。幸而还会写点代码,便替人家做几个游戏,换一碗饭吃。可惜他又有一样坏毛病,便是内存泄漏。运行不到几秒,便连程序带数据,一齐崩掉。如是几次,叫他写游戏的人也没有了。夕甲甲没有法,便只好做些最简单的外包项目。但他在我们厂里,品行却比别人都好,就是从不留bug;虽然间或一时不能解决,暂时记在wiki上,但不出一月,定然修复,从wiki上删去了夕甲甲的名字。
夕甲甲写过半页代码,涨红的脸色渐渐复了原,旁人便又问道,“夕甲甲,你当真会写代码么?”夕甲甲看着问他的人,显出不屑置辩的神气。他们便接着说道,“你怎的连半行代码也没有贡献给linux内核呢?”夕甲甲立刻显出颓唐不安模样,脸上笼上了一层灰色,嘴里说些话;这回可是全是“狗屎Linus”之类,一些不懂了。在这时候,众人也都哄笑起来:店内外充满了快活的空气。
在这些时候,我可以附和着笑,师傅是决不责备的。而且师傅见了夕甲甲,也每每这样问他,引人发笑。夕甲甲自己知道不能和他们谈天,便只好向孩子说话。有一回对我说道,“你学过编程么?”我略略点一点头。他说,“学过编程,……我便考你一考。const int *和int const *,有什么区别?”我想,讨饭一样的人,也配考我么?便回过脸去,不再理会。夕甲甲等了许久,很恳切的说道,“不知道罢?……我教给你,记着!这些语法应该记着。将来做程序员的时候,写代码要用。”我暗想我和程序员的等级还很远呢,而且我们师傅也从不用裸指针;又好笑,又不耐烦,懒懒的答他道,“谁要你教,两个没区别,都是指向常量的指针。如果你想用指针常量,要写int * const。”夕甲甲显出极高兴的样子,将手里的破鼠标敲着电脑桌,点头说,“对呀对呀!……const有四种用法,你知道么?”我愈不耐烦了,努着嘴走远。夕甲甲刚在Visual Studio里新建一个空文件,想在里面写代码,见我毫不热心,便又叹一口气,显出极惋惜的样子。
有几回,邻居孩子听得笑声,也赶热闹,围住了夕甲甲。他便给他们一人写了一个Hello World。孩子看完,仍然不散,眼睛都望着屏幕。夕甲甲着了慌,伸开五指将屏幕罩住,弯腰下去说道,“error了,编译器报error了。”直起身又看一看屏幕,自己摇头说,“error error!哀乎哉?error也。”于是这一群孩子都在笑声里走散了。
夕甲甲是这样的使人快活,可是没有他,别人也便这么过。
有一天,大约是程序员节前的两三天,师傅正在慢慢的release代码,打开wiki,忽然说,“夕甲甲长久没有来了。还有十九个bug没修复呢!”我才也觉得他的确长久没有来了。一个喝酒的人说道,“他怎么会来?……他打折了腿了。”师傅说,“哦!”“他总仍旧是搞崩内存。这一回,是自己发昏,竟搞崩了GFW的内存。他家的内存,搞得的吗?”“后来怎么样?”“怎么样?先是去喝茶,后来是打,打了大半夜,再打折了腿。”“后来呢?”“后来打折了腿了。”“打折了怎样呢?”“怎样?……谁晓得?许是死了。”师傅也不再问,仍然慢慢的做他的release。
程序员节过后,函数式编程是一天比一天热门,看看连Java都开始支持lambda表达式;我整天的做测试,也须了解什么是闭包了。一天的下半天,没有一个要测试的项目,我正合了眼坐着。忽然间听得一个声音,“来一个鸡蛋灌饼。”这声音虽然极低,却很耳熟。看时又全没有人。站起来向外一望,那夕甲甲便在柜台下对了门槛坐着。他脸上黑而且瘦,已经不成样子;带一本破Thinkpad,盘着两腿,下面垫一个电脑包,用草绳在肩上挂住;见了我,又说道,“来一个鸡蛋灌饼。”师傅也伸出头去,一面说,“夕甲甲么?你还有十九个bug没修呢!”夕甲甲很颓唐的仰面答道,“这……下回修罢。这一回是现场通过,鸡蛋要好。”师傅仍然同平常一样,笑着对他说,“夕甲甲,你又内存泄漏了!”但他这回却不十分分辩,单说了一句“不要取笑!”“取笑?要是不泄漏,怎么会打断腿?”夕甲甲低声说道,“跌断,跌,跌……”他的眼色,很像恳求师傅,不要再提。此时已经聚集了几个人,便和师傅都笑了。我煎了鸡蛋灌饼,拿出去,放在门槛上。他打开电脑开始写代码,见他满手是泥,原来他便用这手走来的。不一会,他提交代码,通过了测试和review,便又在旁人的说笑声中,坐着用这手慢慢走去了。
自此以后,又长久没有看见夕甲甲。到了Rust 1.0发布的时候,师傅打开wiki说,“夕甲甲还有十九个bug呢!”到Golang 2.0发布的时候,又说“夕甲甲还有十九个bug呢!”到Scala 3.0发布的时候可是没有说,再到Rust又演进了一个版本也没有看见他。
我到现在终于没有见——大约夕甲甲的确死了。
写于二零一五年夏
夕甲甲——孔乙己之C++版的更多相关文章
- 转 夕甲甲:孔乙己之 C++ 版
欧欧匹代码的格局,是和别的编程模式不同的:首先要有一个构造函数:基类里只定义了函数的形式,可以随时通过派生增加不同的实现.那些程序员们,每每学会了继承和多态,便可以接一个项目,——这是十年前的事,现在 ...
- FreeBSD 乃至开源界中的孔乙己 再论苦难哲学之一
在许多狂热的FreeBSD 粉丝里,他们甚至不允许别人把FreeBSD写作freebsd,要和你强调,F和BSD都是大写的.还说这是什么尊重之类的东西.大抵和孔乙己的茴香豆的茴的有四种写法一样吧:&q ...
- 孔乙己,一名ERP顾问
欢迎关注微信公众号:sap_gui (ERP咨询顾问之家) 公司的会议室的格局,是和别处不同的:都是中间一个大的会议圆桌,桌子上面放着各台电脑,可以随时打开ERP系统.做ERP顾问的人,傍午傍晚下了班 ...
- IT版孔乙己(转)
[不要做学究]回忆孔先生IT版 我关于本文评价:看到这篇文章很多人会生出这样的疑问“这明明是在诋毁钻研技术的人嘛?是不是在宣扬技术无用论?”. 初看这篇文章的时候我也是这样的想法,但是逐步才明白这篇文 ...
- “Python的单例模式有四种写法,你知道么?”——孔乙己
什么是单例模式 单例模式(Singleton Pattern)是最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创建自己的 ...
- 我曾做过陈士成,也做过孔乙己,还做过阿Q
一. 我现在是陈士成,陈士成现在是我.为什么这么说呢? 那年那天,天刚微微亮,似乎还在打着哈欠.我和父亲去得很早,为的就是在“小升初的考试成绩榜单”前面占一个有利的位置.我不记得当时穿的厚还是不厚,体 ...
- 哈希表的C实现(三)---传说中的暴雪版
关于哈希表C实现,写了两篇学习笔记,不过似乎网上流传最具传奇色彩的莫过于暴雪公司的魔兽文件打包管理器里的hashTable的实现了:在冲突方面的处理方面,采用线性探测再散列.在添加和查找过程中进行了三 ...
- [php][thinkphp] 记一次Composer Linux版安装以及用它进行thinkphp项目初始化
Composer安装thinkphp,thinkphp5.1开始官网不在提供下载包,只能通过git clone 和Composer包管理器进行下载. php中开启exec,system等函数调用系统命 ...
- docker配置mysql主从与django实现读写分离
一.搭建主从mysql环境 1 下载mysql镜像 docker pull mysql:5.7 2 运行刚下载的mysql镜像文件 # 运行该命令之前可以使用`docker images`是否下载成功 ...
随机推荐
- angular的$scope
angularJS是一个MVVM的前端js框架. $scope的作用是angular向视图(html)传递数据的通道,它不负责处理和操作数据.也就是说要想向视图传递数据的话,必须定义$scope变量. ...
- Oracle建表
1.oracle数据库中的多种数据结构: 1.表结构 存储数据 2.视图 一张表或多张表中数据的字节 3.sequence 主要用来生成主键值 4.index 提高检索性能 我们 ...
- DOM笔记
1.监听div内容修改 1.1 DOM2级中的mutation(变动事件)里的 DOMSubtreeModified 可以监听div内容修改 document.querySelector('.elem ...
- [Amazon] Amazon IAP for Unity
1> 下载amazon IAP3.0 for unity plugin 2> 根据 https://developer.amazon.com/public/apis/earn/in-app ...
- Meta标签用法大全
meta是html文档在head标签里定义的一个对文档进行描述的功能性标签 meta标签有下面的作用: 1.搜索引擎优化(SEO) 2.定义页面使用语言 3.自动刷新并指向新的页面 4.实现网页转换时 ...
- Word,PDF,PPT,TXT之间的转换方法
来源: 刘波的日志 一.把PPT转WORD形式的方法 1.利用"大纲"视图 打开PPT演示文稿,单击"大纲",在左侧"幻灯片/大纲”任务窗格的“大纲” ...
- 单例模式getInstance()
/** * 对象的实例化方法,也是比较多的,最常用的方法是直接使用new,而这是最普通的,如果要考虑到其它的需要,如单实例模式,层次间调用等等. * 直接使用new就不可以实现好的设计好,这时候需要使 ...
- HTML5 Canvas一些常用的操作
粗略的Canvas API 1. context var context = canvas.getContext('2d'); 2.Canvas state context.save();//将当前状 ...
- reactiveCocoa
我的理解 1通过block把按钮的addtarget的监听,处理,两个步骤二合一了, 好处是若在本控制器内添加监听,更方便 在自定义类监听就不一定了,因为经常监听到了,不一定就是自己处理,一般另外通知 ...
- java: Runtime和Process调用本机程序
java: Runtime和Process调用本机程序 调用纸牌程序,Process用来销毁程序 import java.io.IOException; public class RunTimeDem ...