我的编程之路:「懒惰」是程序员最大的美德

justjavac分享了他的编程经历,从小时候对编程的热爱到大学辍学创业,再到出版《代码之谜》。他介绍了如何走上编程道路,编程过程中的挑战和解决方案,以及对未来的展望。

首先给大家介绍一下自己吧

大家好,我是 justjavac,一名全栈工程师,目前正在出版《代码之谜》。熟悉我的人可能知道我还有一个中文昵称「迷渡」,取「雾失楼台,月迷津渡」之意,一般用在豆瓣或者其他非技术社区。凡是在技术类社区写专栏或吐槽,都使用 justjavac 这个 ID。我不太会做自我介绍,大家还是直接在百度或 Google 搜索 「justjavac」 吧。

你对大家普遍称呼你 JJC 有什么感想?

哈哈,难道 JJC 除了 JustJavaC 的首字母缩写,还有别的意思吗?

耐克曾经为程序员做了一个红极一时的广告词:「just do IT」,于是我就给自己起了一个网名 just。当时研究 Java 和 C 比较深入,就把 java 和 c 加在了后面,以防止重复,这就是 JustJavaC 这个昵称的来源。因为 javac 也是 JDK 中的一个命令,所以很多人以为我的昵称是 Just Javac 的缩写,管我叫 JJ,对于这个称呼,我还是有必要纠正一下的。

简单谈谈你目前的工作吧

去年底从维基科技离职,今年正式加盟千行时线,负责 Hybrid App 技术栈的开发。千行时线是一家九零后的创业公司,在移动互联网的大潮下,帮助传统企业进行转型,算是一家技术型和顾问型两者合体的公司吧。我主要负责 PHP 的接口和 Hybrid App 的开发。

你的上一家公司维基科技和维基百科有什么关系?

这个嘛,其实就是 Java 和 JavaScript 的关系,雷锋和雷峰塔的关系,周杰和周杰伦的关系。

那就正式进入这次访谈的主题,讲讲你是如何走上编程的道路的

其实,我走上编程之路是命中注定的。从上小学起我就特别喜欢穿格子衬衣,果不其然,长大后成为了一名程序员。

我从小比较喜欢数学,小学时参加全国数学奥赛曾得过银牌,也是那次奥赛第一次见到了电脑。当时只是远远地看别人用,在一个黑色的屏幕上,啪啦啪啦的打着字,和我想象中的黑客简直一模一样,感觉非常炫、非常酷,就是人长得丑了点。

至于我第一次使用电脑,是在初中。教学使用的是 Windows,大概是 Win98,因为在我的印象中,时不时就蓝屏。

第一次编程用的是 BASIC 语言,当看到代码中的 I = I + 1 时,简直是三观尽毁啊~ 我去!这是什么鬼?谁能告诉我他们到底是怎么相等的?难道是我打开的姿势不对?后来也就慢慢入门了。和每一个初学者都类似,编的程序无非就是从1加到100,水仙花数,汉诺塔……

大概在初三的时候,我家买了第一台电脑,在这个电脑上编的第一个程序是 VBA,在 Excel 中处理我整个初三上半年的成绩。当我正为能百分之百升入重点高中而高兴时,发现了我编程生涯的第一个 Bug,导致我的成绩多出了十几分,不过即使再减掉十几分,也是百分百可以考上的。

上高中后没有开设编程课,主要是讲讲 WPS 和其他一些软件的操作。于是我自带 3.5 寸软盘,安装了 Pascal 编译器,我还在书店买了一本 C 语言的书。

当我写下 if (5>4>3) 时,居然得到了意想不到的结果,再一次三观尽毁啊。当我晚上回家时,怎么也找不到这本C语言书了,就这么着,一本新书只看了三天,我也就这么告别了C语言。当再次接触C语言,就是大学了。

C语言的书丢了,那这个 5>4>3 的疑问也就不了了之了吗?

没有书,还有网啊,拨号上网——插网线,拨号,打开百度搜索,快速打开前几个搜索结果,等页面都打开完毕后,断网,拔网线,再慢慢看。

此后在我的高中三年,我再也没有在书店看到过编程类的书籍,毕竟在我们县城很少有人买这种书。

大学的志愿我填报了两个:数学和编程。后来就来到了天津,正式踏上编程的不归路。这时就不是编程玩了,而是系统的学习编程知识。也慢慢接受了 i=i+1 是赋值,多个数比较要用「与」:5>4 && 4>3。再一次让我毁三观的是 Python,居然可以写 if 5>4>3,这简直就是不按套路出牌啊。后来再细想,其实 5>4>3 才最符合我们的使用和理解习惯啊。就像格雷厄姆在《黑客与画家》中说的那样:程序其实是给人看的,只是机器恰好可以运行它。

最终我也未能完成学业,2009年辍学创业,又进了另一个深坑。这次访谈时编程之路,创业的成功和失败就不多说了。

在编程过程中,或多或少会遇到一些问题,你有什么解决问题的秘诀吗?

看官方文档,可以解决掉一半以上的问题。剩下的问题可以通过 Google,StackOverflow,SegmentFault。

问题分好多种,有的是属于那种脑抽型的,比如拼写错误,解决之后想抽自己俩耳光。这种我基本都是默默的记录在 EverNote,毕竟家丑不可外扬。

有的属于常见错误,比如对库、接口、函数的使用错误,因为很多接口文档写的不是很清楚,还有一些文档本来就有歧义,这样在调用的时候就可能出错,最常见的就是 Java 的日期类和日历类。对于这种错误,我一般会整理在某个专栏上。

还有一些问题是对规范、对底层原理理解的不够深入,比如 IEEE754 的浮点数规范,HTTP 协议规范,JSON 规范。这些规范也都有中文翻译,我还是推荐程序员去读读。

有没有写过一些黑科技(狂拽酷炫屌炸天)的程序?

程序员最大的骄傲就是写过什么软件,所以要想了解一个程序员就去他的 GitHub。

我这几年面试程序员啊,大部分的简历都是做过 XXXX 系统,开发过 XXXX 网站,给 XXXX 政府做过 ERP。其实如果一个人热爱编程,对编程感兴趣,就不仅仅是为了完成工作任务,而是在业余时间为自己的这份兴趣付出了多少。

虽然在各种第三方 GitHub 排名网站上我的 star 数排到了全球前 50 名,但是干货却不多。

按时间顺序说说吧,ChromeSnifferPlus 是我维护了 5 年的一个项目,之前我也在 SF 上介绍过,一款 Chrome 浏览器的插件。当我们浏览一个非常炫酷的网页时,我们总想知道这个网站到底使用了什么技术,用到了哪些 javascript 库,这个插件就是干这个的。目前有全球的1万多用户,由于大陆墙的存在导致这个插件的国外用户偏多。

Flarum 中文站:原文太长就不展开说了,可以看看原作者 Toby 的文章「The Flarum Story」,我翻译了中文版 Flarum 的故事:我为什么开发 Flarum

推荐一些书籍或者编程大杀器给大家呗

说到编程书籍,我正好在 GitHub 上维护了一个书单:免费的编程中文书籍索引,目前已经有近1万个 star 了。

最后,有一本书必须推荐给每个程序员看看:《颈椎病的预防和治疗》。

能谈谈你的新书《代码之谜》吗?

说来惭愧。

出书这事大概缘起 2012 年底吧,在这期间我还在翻译另一个系列文章《12 JavaScript Quirks》。

我从大学时就开始写博客,在 ITeye 和 优快云。当时 ITeye 还没有被 优快云 收购,名字叫 JavaEye,主要以 Java 技术为主。《代码之谜》系列的第一篇文章是「其实你不懂代码」,发在了两个平台和我的独立博客上,也没有太当回事,发完就忘了。

到了第二天晚上我打开电脑刷微博,突然就看到了好几条私信,是图灵教育的陈冰老师发来的。再次之前我就知道陈冰老师,他策划出版的《大话设计模式》估计不少程序员都看过,也被当当评为终身五星级图书。但是没想到陈冰老师会给我发私信,我打开看了看,好像是说我的代码之谜系列不错,要找我出书什么什么的。

于是我又打开博客看了看,把我自己都吓了一跳,才一天的时间访问量就过万了。后来的连续几天都被推荐到了首页,现在这篇文章在2个平台上的访问量分别是18万和27万。

其实在之前也有不少出版社联系我出书,我都拒绝了。但是这次陈冰老师的私信,我有点心动了,于是答应了陈冰老师。

但是天有不测风云,后来有一天陈老师给我打电话,说他离职了。当时我的内心就纠结的,陈冰老师一走,我的书的策划和初版任务就交给了别人。通过几次的交谈,我决定取消协议,暂时先不出了。

书虽然不出了,但是还在一直写。也许有一天我会放到把这本书做成电子版,分享给大家。

哪些好的习惯程序员值得拥有?

懒惰。

有一些程序员很懒,懒到任何事情都交给机器去做。而另外一些则很勤奋,每天都孜孜不倦得做着重复单调的工作。之前我也一直是一个勤快的人,不过我一直努力变懒。

不要一级一级地打开资源管理器寻找想要的文件,写个脚本吧。自动搜索到想要的文件,或者更进一步,自动用 sublime 打开。编辑完了,还要自动打开比对工具去解决冲突。在机器面前,自己才是主人,不是仆人

要习惯用命令行而不是鼠标要动脑,要时刻思考自己的工作方式,改进自己的工作过程,让自己处在一个高效节能的工作氛围中,而不要浪费了自己的体力、精力、时间。

在你的编程生涯中有没有遇到什么有趣的事?

我清楚的记得第一次上电脑课的时候的一件糗事。

当时学校硬件条件有限,两个人公用一台电脑。当时有一个拍苍蝇的游戏比较火,但是我俩都不会进入这个游戏,于是壮着胆子问老师「怎么打开游戏啊?」。

老师看了我俩一眼,拿起鼠标告诉我们怎么从开始菜单中一级一级的找到游戏,怎么双击进入。完事后不忘嘱咐一句「上课可别玩游戏啊」。

等老师一走,我俩就打开游戏,一个人玩,一个人看着老师,玩的不亦乐乎。没多久老师就过来了,我小声告诉他「老师来了!老师来了!」。

这时他慌了,「妈呀,怎么退出啊?光问了怎么打开,没问怎么关闭」。

最后,毫无悬念,我俩被老师批评一顿。从那之后学会了神奇的 ESC 键。

现在 ESC 也依然是我使用频率非常高的一个键:输入法打错了拼音,想全部删除,不用反复按 Backspace 键,只需要按一次 Esc 键。上网时输错了网址,按 Esc 停止加载。填写表单时有错别字,按 Esc 清除。弹出框时,Esc 等于取消按钮。

你当初选择放弃学业后悔过吗?

如果我没有记错的话 SegmentFault 的高阳也是辍学生,我猜他应该也不会后悔当初的决定吧。这种事本来就没有对与错,自己选择的路,跪着也得走完。

但是我还得告诫各位莘莘学子一句话:「比尔盖茨之所以成为世界首富,不是因为他辍学了;马云成为中国首富,不是因为他丑」。我在我的博客中也经常会写「学历代表过去,能力代表现在,学习能力代表未来」,一个人的成就和辍不辍学没有关系,而是和自己的努力程度有关。

对哪方面技术的发展比较看好?

大数据和人工智能。

这两个领域的发展越是乐观,我越觉得悲观,不是为技术的发展悲观,而是为人类的未来。

我喜欢看的电影就是《黑客帝国》和《终结者》,里面描述了一个机器统治的世界,人类和机器曾经发生战争,最终人类失去可这个世界的控制权。

在进化树上亿年的历史进程中,曾经统治地球的生物千千万,但是最终都无一例外地失去了控制权,就连称霸一时的恐龙都灭绝了,而人类最终也会失去控制权。可能是人类进行星际移民后,长时间的生殖隔离产生了新的人类物种,最终征服了人类。想想克罗马农人对尼安德特人的征服,或者想想欧洲人对印第安人的征服。

再有一种可能就是像电影描述的那样,人类把智能赋予机器,然后机器的自主意识觉醒,反过来征服人类。回过头来看看机器的历史,最初机器就是机械,就是工具,需要人来操作,人来使用。人类赋予自己的第一个进步就是「自动化」,从此机器就可以自己完成一些任务,比如电饭煲,当饭做熟了后就自己关闭。再后来,人类又赋予机器「智能化」,这就是在电脑尚未发明之前的先驱们思考的问题之一「机器会思考吗?」

其实不必悲观绝望。其实我觉得还有第三种可能,那就是人机合一。有人说我不适合编程,适合写小说。其实这种可能也是我理性分析的结果,算是一家之言吧。

看看我们自己,如果把你的 Wifi 关了,或者把你的手机拿走一天,你是不是就觉得不自在了,从某种程度上来说,我们已经被「手机」奴役了,但我说的人机合一远远不止于此。我们对于手机的使用的「手持」,或者说是「装带」,顾名思义就是装在身上带着。

随着 Google Glass、 Apple Watch 的发布,还有各种各样的手环,我们对这些设备的定义是「穿戴」,穿在身上,戴在身上。我们通过这些设备手机身体的信息,包括走路、睡眠、饮食等,这些设备已经成为了我们日常生活的一部分。

那再下一步呢,就是「植入」,那时这些设备的重要程度已经不是生活的一部分了,而是身体的一部分。我们可以通过植入某些芯片来辅助我们提升身体机能,或者完成工作以及学习中的特殊任务等。

这时会出现一部分人疯狂反对人体改造计划,称之为保守派,他们认为人类应该保持自己「身体」的纯正,他们的观点是「被植入了芯片的人还能称为人吗?异类!」。就像当年南方古猿第一次决定从树上下来,艰难的直立起来行走一样,而「保守猿」则坚持自己的纯正,选择了继续呆在树上采食果子吃,「直立行走的猿还能称之为猿吗?异类!」。而我们,都是「异类」的后代。

从某种意义上来讲,南方古猿没有灭绝,他们只是进化了。生命之所以没有消失,是因为他们进化了。

所以,我最看好人工智能的前景。

薪尽,而火传也。


据说,关注二维码的同学,运气都很不错

justjavac

本文参与了 SegmentFault「我的编程之路」计划,欢迎正在阅读的你也加入,一起分享。

Java谜题 Java谜题1——表达式谜题 谜题1:奇数性 谜题2:找零时刻 谜题3:长整除 谜题4:初级问题 谜题5:十六进制的趣事 谜题6:多重转型 谜题7:互换内容 谜题8:Dos Equis 谜题9:半斤 谜题10:八两 Java谜题2——字符谜题 谜题11:最后的笑声 谜题12:ABC 谜题13:畜牧场 谜题14:转义字符的溃败 谜题15:令人晕头转向的Hello 谜题16:行打印程序 谜题17:嗯? 谜题18:字符串奶酪 谜题19:漂亮的火花(块注释符) 谜题20:我的类是什么? 谜题21:我的类是什么?第2幕 谜题22:URL的愚弄 谜题23:不劳无获 Java谜题3——循环谜题 谜题24:尽情享受每一个字节 谜题25:无情的增量操作 谜题26:在循环中 谜题27:变幻莫测的i值 谜题28:循环者 谜题29:循环者的新娘 谜题30:循环者的爱子 谜题31:循环者的鬼魂 谜题32:循环者的诅咒 谜题33:循环者遇到了狼人 谜题34:被计数击倒了 谜题35:一分钟又一分钟 Java谜题4——异常谜题 谜题36:优柔寡断 谜题37:极端不可思议 谜题38:不受欢迎的宾客 谜题39:您好,再见 谜题40:不情愿的构造器 谜题41:域和流 谜题42:异常为循环而抛 谜题43:异常地危险 谜题44:切掉类 谜题45:令人疲惫不堪的测验 Java谜题5——类谜题 谜题46:令人混淆的构造器案例 谜题47:啊呀!我的猫变成狗了 谜题48:我所得到的都是静态的 谜题49:比生命更大 谜题50:不是你的类型 谜题51:那个点是什么? 谜题52:合计数的玩笑 谜题53:按你的意愿行事 谜题54:Null与Void 谜题55:特创论 Java谜题6——库谜题 谜题56:大问题 谜题57:名字里有什么? 谜题58:产生它的散列码 谜题59:什么是差? 谜题60:一行的方法 谜题61:日期游戏 谜题62:名字游戏 谜题63:更多同样的问题 谜题64:按余数编组 谜题65:一种疑似排序的惊人传奇 Java谜题7——更多的类谜题 谜题66:一件私事 谜题67:对字符串上瘾 谜题68:灰色的阴影 谜题69:黑色的渐隐 谜题70:一揽子交易 谜题71:进口税 谜题72:终极危难 谜题73:你的隐私正在公开 谜题74:同一性的危机 谜题75:头还是尾? 名字重用的术语表 Java谜题8——更多的库谜题 谜题76:乒乓 谜题77:搞乱锁的妖怪 谜题78:反射的污染 谜题79:这是狗的生活 谜题80:更深层的反射 谜题81:烧焦(字符化)到无法识别 谜题82:啤酒爆炸 谜题83:诵读困难者的一神论 谜题84:被粗暴地中断 谜题85:惰性初始化 Java谜题9——高级谜题 谜题86:有毒的括号垃圾 谜题87:紧张的关系 谜题88:原生类型的处理 谜题89:泛型迷药 谜题90:荒谬痛苦的超类 谜题91:序列杀手 谜题92:双绞线 谜题93:类的战争 谜题94:迷失在混乱中 谜题95:只是些甜点 ********************* Chapter 1. Introduction Chapter 2. Expressive Puzzlers Puzzle 1: Oddity Puzzle 2: Time for a Change Puzzle 3: Long Division Puzzle 4: It's Elementary Puzzle 5: The Joy of Hex Puzzle 6: Multicast Puzzle 7: Swap Meat Puzzle 8: Dos Equis Puzzle 9: Tweedledum Puzzle 10: Tweedledee Chapter 3. Puzzlers with Character Puzzle 11: The Last Laugh Puzzle 12: ABC Puzzle 13: Animal Farm Puzzle 14: Escape Rout Puzzle 15: Hello Whirled Puzzle 16: Line Printer Puzzle 17: Huh? Puzzle 18: String Cheese Puzzle 19: Classy Fire Puzzle 20: What's My Class? Puzzle 21: What's My Class, Take 2 Puzzle 22: Dupe of URL Puzzle 23: No Pain, No Gain Chapter 4. Loopy Puzzlers Puzzle 24: A Big Delight in Every Byte Puzzle 25: Inclement Increment Puzzle 26: In the Loop Puzzle 27: Shifty i's Puzzle 28: Looper Puzzle 29: Bride of Looper Puzzle 30: Son of Looper Puzzle 31: Ghost of Looper Puzzle 32: Curse of Looper Puzzle 33: Looper Meets the Wolfman Puzzle 34: Down for the Count Puzzle 35: Minute by Minute Chapter 5. Exceptional Puzzlers Puzzle 36: Indecision Puzzle 37: Exceptionally Arcane Puzzle 38: The Unwelcome Guest Puzzle 39: Hello, Goodbye Puzzle 40: The Reluctant Constructor Puzzle 41: Field and Stream Puzzle 42: Thrown for a Loop Puzzle 43: Exceptionally Unsafe Puzzle 44: Cutting Class Puzzle 45: Exhausting Workout Chapter 6. Classy Puzzlers Puzzle 46: The Case of the Confusing Constructor Puzzle 47: Well, Dog My Cats! Puzzle 48: All I Get Is Static Puzzle 49: Larger Than Life Puzzle 50: Not Your Type Puzzle 51: What's the Point? Puzzle 52: Sum Fun Puzzle 53: Do Your Thing Puzzle 54: Null and Void Puzzle 55: Creationism Chapter 7. Library Puzzlers Puzzle 56: Big Problem Puzzle 57: What's in a Name? Puzzle 58: Making a Hash of It Puzzle 59: What's the Difference? Puzzle 60: One-Liners Puzzle 61: The Dating Game Puzzle 62: The Name Game Puzzle 63: More of the Same Puzzle 64: The Mod Squad Puzzle 65: A Strange Saga of a Suspicious Sort Chapter 8. Classier Puzzlers Puzzle 66: A Private Matter Puzzle 67: All Strung Out Puzzle 68: Shades of Gray Puzzle 69: Fade to Black Puzzle 70: Package Deal Puzzle 71: Import Duty Puzzle 72: Final Jeopardy Puzzle 73: Your Privates Are Showing Puzzle 74: Identity Crisis Puzzle 75: Heads or Tails? A Glossary of Name Reuse Chapter 9. More Library Puzzlers Puzzle 76: Ping Pong Puzzle 77: The Lock Mess Monster Puzzle 78: Reflection Infection Puzzle 79: It's a Dog's Life Puzzle 80: Further Reflection Puzzle 81: Charred Beyond Recognition Puzzle 82: Beer Blast Puzzle 83: Dyslexic Monotheism Puzzle 84: Rudely Interrupted Puzzle 85: Lazy Initialization Chapter 10. Advanced Puzzlers Puzzle 86: Poison-Paren Litter Puzzle 87: Strained Relations Puzzle 88: Raw Deal Puzzle 89: Generic Drugs Puzzle 90: It's Absurd, It's a Pain, It's Superclass! Puzzle 91: Serial Killer Puzzle 92: Twisted Pair Puzzle 93: Class Warfare Puzzle 94: Lost in the Shuffle Puzzle 95: Just Desserts Appendix A. Catalog of Traps and Pitfalls Section 1. Lexical Issues Section 2. Integer Arithmetic Section 3. Floating-Point Arithmetic Section 4. Expression Evaluation Section 5. Flow of Control Section 6. Class Initialization Section 7. Instance Creation and Destruction Section 8. Other Class- and Instance-Related Topics Section 9. Name Reuse Section 10. Strings Section 11. I/O Section 12. Threads Section 13. Reflection Section 14. Serialization Section 15. Other Libraries Appendix B. Notes on the Illusions Ambiguous Figures Impossible Figures Geometrical Illusions: Size Geometrical Illusions: Direction Subjective Contours Anomalous Motion Illusions Illusions of Lightness Compound Illusions
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值