始?屎!
我从何时开始写代码?我为何开始对写代码这么感兴趣?
原本已经遗忘在了人生的长河中。
最近和某同事改写某个项目时的痛苦,让我不禁思考,这种程度编程水平的同事,为何能够独占鳌头?独赢领导青睐?
所以本文名为写我走上"码农"道路的《代码之始》,实为对某同事堆的"屎"不满发泄的《代码之屎》。
一切的开端
其实大学时有位好友曾经问过我是什么时候开始自学编程,又是怎么会想到去学编程的。
当时我给出了一个答案,现在的我已经不记得这个答案有几分真又有几分假了,但是当这个答案说出口那一刻开始,我的记忆就默认将这个答案标记为了唯一且正确的答案。
当时我回答的是,因为很久以前,我妈给我买了个手机,那是部诺基亚的小屏键盘机,搭载的是塞班 S40 系统,可以运行 .jar 程序,但是当时的 .jar 程序大多数都是给大屏幕的手机用的,对于小屏手机基本都是可以打开,但是显示不正常,要想使用,只能使用"魔改版"的程序。
在寻找可用的"魔改版"过程中就接触到了一些专门"魔改"程序的大神,也看到了他们出的魔改教程。
在跟着他们学魔改的时候,其中一篇教程的某句话让我印象深刻,大意是:"魔改只是不得已而为之的,只有自己写自己的程序才是最好的"。
于是,我就此走上了学习编程之路。
现在,让我用我那不太可靠的记忆,对这个答案进行扩充一下。
巧合
我接触到的第一台手机应该是我还在上小学时,我叔叔因为充话费送了一台手机,于是就拿给我爷爷用,而那时候恰好我爸爸需要晚上自己一个人去看守隔壁的"荒废"大楼,为了方便他联系外界,我爷爷又转手把这手机拿给我爸爸用。
之后我就经常拿我爸的手机玩。虽然那台手机除了打电话外就只有一个浏览器功能,但是对我也是有莫大的吸引力。
我只是拿着瞎翻里面为数不多的功能都觉得很快乐。
捣鼓着捣鼓着,不小心订购了一份手机报,每天会用彩信发送一些新闻,还会配上几张模糊不清的图片。
但是在我看来这信息量可太大了,至今仍记得,我从来没有完整的看完过任何一天的手机报。
现在想想,其实哪有多大的信息量啊,就寥寥数条新闻简报而已。
再后来又捣鼓浏览器,发现居然还有网页文字游戏这种东西,并且几乎所有网页文字游戏都是标注的"永久免费",我理所当然的认为是免费的了。
其实那种所谓游戏都不能称之为游戏,就是个很简略的文字网页,可以做一些不同的操作选择而已,别说是动画,甚至连图片都没有。
当然,玩了两天就被发现了。
游戏确实是免费的,只是上网需要流量费啊,那时候的流量费还挺贵,虽然这些文字游戏也没有多大,但是也经不住我这么玩啊,于是手机欠费了,就被发现了。
而我的第一台手机并不是上面说的诺基亚手机也不是我爸那种充话费送的手机,而是一部杂牌机,用现在的话来说应该叫做 功能机 或者是 老年机 。
一块板砖似的机身,配上尺寸、分辨率都极小的屏幕:机身大部分空间都被键盘占去。
功能简单,不支持安装应用或是扩展功能,但是除了有浏览器外还支持手机 QQ 。
支持手机 QQ 对于我来说已经是不可想象的极大提升了,我得以用手机乱加人,然后和不认识得、认识的人胡乱聊天,说些有的没的。
那时候我哥哥还会经常趁我晚上睡着时偷拿我的手机去用浏览器看小说。
再之后其实我爷爷还买过更多的各式各样的奇怪的杂牌山寨机,但是无一例外的都是支持下载应用的杂牌机。
只是那并不是智能机,当然,用的也不是类似塞班 S40 那种准智能机系统,而是一种叫 MTK 平台的系统。
也可以安装很多游戏、应用,但是山寨机之所以叫山寨机是因为它不仅下载应用是收费的,甚至连打开"应用市场"也是收费的,收费方式就是发短信"点播"增值服务。
而且所谓"应用市场"也很奇葩,居然是从手机自带的一些基础应用的菜单里面,点击"更多应用"打开的。
梦开始的地方
大概是在我初中时,我姑姑买了一台小巧的诺基亚手机。
圆润的机身,小巧的模样,最最重要的是,它居然支持免费下载安装新的应用!
这在我看来简直是惊为天人。
当即就找姑姑借来把玩,甚至都忘记要还给姑姑了,直到姑姑第二天来找我让我把手机还给她,她要打电话,我才依依不舍的还给了她。
那时候开始我就无论如何也想要一台这样的手机。
终于在我的软磨硬泡之下,妈妈终于同意给我买一台。
去到手机店原本想买姑姑同款,但是店员说那个不适合我使用,那个更适合女生用,然后就给我推荐了另外一台类似的手机,但是不同于姑姑的手机,它自带内存更大,且支持插内存卡!
那时候我才知道,原来这个手机的系统叫做塞班 S40 系统。
自从我拿到这台手机后,我就废寝忘食的把玩它。
但是后来发现自带商店的应用非常少,而且大多在国内都用不了,或者是我用不上。
偶然的机会,我发现原来这个系统不仅支持从应用商店下载应用,更支持直接从浏览器下载文件后直接安装。
这一下子就给我打开了新天地,我开始四处搜寻各种各样的应用。
但是慢慢的我就发现,好多应用下载下来后都安装不了,要不就是安装了打不开,即使能打开里面的 UI 样式显示也不对。
一番搜索了解过后才知道,原来很多厂商开发的应用都只适配了大屏幕,而没有适配我这种型号的小屏幕。
而想要使用这些没适配的应用,只能去找民间大神手动修改的版本。
在找修改版应用时,发现了一个叫 乐讯 的论坛,里面有非常多的大神以及各种各样琳琅满目的修改版应用。
论坛里面还有很多我此前闻所未闻的 Hack 技术,像什么"免流"、"刷钻"之类的。
所谓免流其实就是当时三大运营商对于访问它们自己的门户网站是不记流量费的,于是就有民间大神琢磨出可以通过逆向运营商判断访问门户网站的方式来伪装我们实际访问的任意网站来达到全局免流量费的目的。(还记得吗,上面说过,那时候的流量费是非常非常贵的)
而刷钻则是指通过漏洞,免费开通腾讯QQ的绿钻、红钻等等会员以及衍生出来的一切增值付费服务的方法。那时候普遍采用的刷钻原理简单来说的话大概是由于腾讯服务器和运营商服务器之间同步数据存在延迟,而运营商又推出了一个权限极高的取消任意增值服务的接口,可以一键取消任意增值服务,此时我们通过腾讯提供的短信接口发送短信开通会员,然后立即通过运营商取消接口取消掉这个服务,这样,由于数据延迟,在运营商这边就会认为我们已经取消了这个服务,所以不扣款,而在腾讯看来,它只收到了开通服务的请求,并没有收到取消服务的请求,所以我们就得以在不扣款的情况下获得了会员服务。
在论坛里面泡久了,自然而然的就萌生出了我也要自己学习改应用的想法。
但是那时候我没有电脑,有的只是这个小屏幕的搭载塞班 S40 的手机。
那时候,诺基亚还有一个智能手机操作系统叫 塞班 S60,当然,S60 向下兼容 S40 的应用,所以很多修改版软件都是基于 S60 的应用修改的。
而 S40 由于系统非常简单,也没有对应的修改用的工具,所以就无法通过手机直接修改。
逐渐的,我又产生了想要一部 S60 的手机想法。
但是我至今仍未体验过 S60 系统,它就已经倒在了滚滚向前的时代洪流中。
是的,安卓操作系统,它来了。
安卓机器人来了
最早亲眼看到安卓系统是某日去某同学家找他时,看见他正在拿着一台神似大屏山寨机的手机在玩游戏,见我来后就关机准备和我一起出去。
但是我却惊讶的发现,这手机怎么跟电脑似的,关机还有进度条,关个机居然需要这么慢吗?
那时候我并不知道原来这就是日后占据了手机操作系统半壁江山的安卓系统。
之后乐讯论坛中,逐渐多了很多关于智能手机的信息,以及对于塞班究竟算不算智能手机操作系统的争论,还有关于未来究竟是安卓系统会成为主流还是微软的 Windows phone 携手诺基亚能继续稳坐手机一哥的位置的分析讨论。
我记得那时候我还和某个朋友讨论,以后谁会更火,我坚持认为安卓会火,而他却认为"鲁妹"(即 Lumia)才是未来。
其实那时候我们都不知道什么是安卓,什么是 Windows phone,我们也只是在看了论坛里的帖子后就开始大放厥词而已。
理所当然的,在我的软磨硬泡之下,我终于拥有了我的第一台安卓手机。
那是一台康佳的手机,搭载了最新的 Android 2.3 系统。
我还记得当时论坛还在争论 Android 到底算不算 Linux ,他开发使用的究竟是不是 java。
而我自然不忘初心,依旧还想着要学习我的软件修改大业,但是那时安卓的兼容性好太多了,而且我的手机也不再是那种小众的需要自行修改兼容的手机。
于是我就想学习写一个自己的 APP。
但是那时候我依旧没有电脑,依旧只有这台普通的安卓手机。
那时候也没有一款可以在安卓系统上编写安卓 APP 的 APP。
但是论坛里的大神说,谷歌有一个叫 SL4A 的开源项目,可以在安卓上运行诸如 lua、python 等脚本语言,而且它也提供了可以直接访问安卓系统 API 的框架。
大神们说,如果没有电脑还想学习编程的话推荐使用 SL4A 学习 Python,因为相较于其他语言,Python 更简单,更适合新手入门。
于是我就一头扎进了 python 的世界中。
那是我第一次真正意义上的接触 Python,我不仅对 python 毫无概念,甚至对编程也毫无概念。
而且那时候我也还没形成自己的学习方式,加之只是通过看论坛中大神们发的零零散散的教程,所以进步非常慢,我花了非常久的时间才逐渐理解编程中那些抽象的概念。
记得有次,我想使用 python 编写一个计算脚本,非常简单,就两个输入框,分别输入两个数值,然后再选一个四则运算符,点计算就算出结果。
但是那时候我根本没理清楚变量类型的概念(学的第一个语言就是python这种动态类型语言,难怪当时理解变量类型这么费劲呢)。
于是当我计算 "1+1" 时却只是得到了 "11" 这样的结果。
我百思不得其解,后来在论坛中疯狂查阅资料,似懂非懂的查到到原来我输进去的值还有类型的区分啊,如果要得出我想要的 "1+1=2" 的结果,我需要把我输入进去的字符类型的数据转换为数值类型才行。
看的我一头雾水,但是我还是将信将疑的按照教程转换了一下输入的数据的类型,再次运行,欸!真的等于 2 了。
虽然不知道为什么就等于 2 了,但是当时兴奋的我直接冲出门骑上自行车"咻"的一下子就冲到了湖边(当时我家住在一个半坡上,坡底是一个湖)然后又吭哧吭哧的骑回家继续学习。
既然成功解决了 1+1=2 的问题,我又想了,现在只能进行四则运算,而且还只能手动输入两个数值并选择运算符,那如果我想输入更多数值或者进行四则运算之外的运算呢?
我尝试了一下只保留了一个输入框,然后点击计算时直接输出输入框输入的数据,那这样是不是就能直接计算了呢?
我改好后输入了 "1+1+1" 结果输出的还是 "1+1+1"。
我继续上论坛查找教程,边找边想,莫非还是那个什么类型的问题?
查找了一番之后终于找到了,原来如果直接输出输入的内容,那么输出的其实就是输入的"字符串",而我直接在代码中写输出 "1+1+1" 能够正常输出 3,是因为虽然它俩都是 "1+1+1" ,但是实际上一个是代码,一个只是内容为 "1+1+1" 的字符串,要想把字符串转为代码运行,还是需要转换一下,这次需要使用 eval 来转换。
我依旧是将信将疑的试了一下,输出真的变成 3 了!
兴奋的我冲出家门跨上自行车又冲向了坡低。
在我往坡低冲时,我不断的在尝试去理解刚才看到的教程和运行的情况。
突然,我恍然大悟,一刹那间就锊顺并理解了这一切。
我激动的往回蹬,到家直接把车仍在门口就冲进我房间继续验证我的想法。
那一天我反反复复的冲出家门跨上自行车又扔掉自行车冲回房间。
我妈当时恰好在我房间门口剁当天需要喂猪的猪草,她问我干什么呢,我只是嘿嘿的笑,没有回答她,因为我知道就算我说了她也不会懂的。
不久之后,我就写出了一个名为《学生工具箱》的APP(或者说是脚本,虽然 sl4a 支持将脚本打包为 apk,但是实际上也只是把python环境和脚本打包到同一个安装包而已,最终还是直接运行的 python 脚本)。
它除了拥有我上面说的简易计算器功能外,还涵盖了我当时知识范围内的各种计算(我当时上初中),例如解一元二次方程等。
之后我就将这个 APP 发到了乐讯论坛中,当时大概率是没有什么影响的,因为我现在对于我发帖这件事除了我曾经发过帖之外已经没有任何印象了。
我当时使用 python 写的最火的脚本其实还是上面说到的刷钻脚本,因为当时刷钻成功与否最重要的因素之一就是发送短信的速度。
当时普遍做法是开启飞行模式,然后把所有短信编写好并发送,但是由于处于飞行模式,所以短信是发不出去的,此时取消飞行模式,短信就会被一股脑的一起发出去。
但是这个方案有个缺陷,很多刷钻不仅需要"手速",还需要严格控制短信的发送顺序,如果使用飞行模式的方法,还是有很大概率会失败。
于是我就写了一个脚本,可以一键完成刷钻,并且取名为 《刷钻神器》 发到了论坛中。
这个脚本引来了众多的用户,还有很多人找我定制他们想要刷的钻的脚本。
当时可是让我收获了满满的成就感。
再之后,在论坛中有人发帖称发现了一个名为 AIDE 的安卓 APP,可以在安卓手机上编写安卓原生应用,于是 SL4A 就被我抛弃,转而投向了安卓原生开发的学习中去。
我记得当时我用 AIDE 写了一款修改某游戏的存档的 APP,然后发到了这个游戏的贴吧中,但是遭致了大量的"差评",因为当时安卓原生开发只学了个半吊子水平,加之我第一门语言学习的是 python ,所以非常讨厌 java 繁琐且杂糅的语法,就没有好好的去学习 java 的各种特性,导致app 写的很差,有极大的性能问题,修改一个很简单的存档,都需要运行十几分钟才能完成......实际上以我现在的目光来看,这种类似的 APP 即使是当时较为孱弱的硬件水平也是可以做到即点即修改完成的。
样样通,样样松
高中的时候,在奶奶的资助下,我拥有了第一台笔记本电脑。
那时候我因为青春期特有的莫名其妙和无知懵懂,不小心触犯了乐讯论坛的版规,导致账号被封了一段时间。
之后即使我账号被解封了,但是我还是决定再也不去乐讯论坛了。
就在这个时候,我了解到了自建论坛,也了解到一个叫做 phpbb-wap 的手机论坛程序。
看名字就知道,这是个基于 php 的程序。
于是我又开始长期混迹于 phpbb-wap 的官方论坛中,甚至还混进开发组,结识了它的众多核心开发者。
但是其实当时我并不会 php。
后来 phpbb-wap 也逐渐式微,我就开始想着自己开发一款论坛程序。
其实与其说是论坛程序,不如说是一个个人博客程序。
于是乎,我又开始学习 php,有了前面的 python 和 java 语言的经验,php 学习起来非常快。
与之对应的,我同步学习了关于前端开发(html,css,js)和数据库(mysql)的相关知识。
当时是啥都去学一点,然后啥都不去精通。
纯粹的就是 "样样通,样样松"。
第一次系统化学习
上面说到的都是我自己靠着零散的教程去学习编程相关知识,我从来没有系统性的学习过。
一直这么零零碎碎的东一榔头西一棒子的学习直到高中时。
某次信息技术课,任课教师在下课前提了一下如果我们谁对计算机方面的知识感兴趣的话可以去找他。
他就是陆老师,当时也是刚毕业没多久的大学生,想要闯出一番天地。
放学后,和我关系很好的一个同学找到我说我们一起去找陆老师吧,我觉得以后计算机会是很热门的东西,让他教我们一些真本事。
当我们站在陆老师面前时,他问我们对于计算机有什么了解,我同学说他什么也不会,我说我会写python,我还会写安卓。
陆老师点头说,他准备教我们编程,然后去打比赛。
那时候我还没有买电脑,所以使用电脑打字非常慢,于是我略带羞涩的问:但是我打字速度非常慢,没有关系吗?
陆老师和办公室的其他老师都笑了。
笑罢了,陆老师说:打字速度慢反而是最小的问题,以后你熟悉了就会越打越快的。
那之后,每天放学和周末我们都会去找陆老师,他也向学校申请并准备了系统化的教案。
我们学习了计算机基础知识,学习了 C 语言,学习了 C++,学习了各种数据结构,学习了各种算法。
但是当初和我一起去找陆老师的同学却因为跟不上进度中途退出了,取而代之的是某日看到我们在机房学习时好奇的张望也被拉进来的另外一个同学。
在刷了无数道题后,陆老师为我们报名了那一年的 NOIP(全国青少年信息学奥林匹克联赛),我们学校成为了我们市第一所派出队伍参加比赛的学校。
而我们,自然就是我们市第一次参加比赛的队员。
最终比赛结果是我拿到了省级二等奖,其他人也拿到了省级三等奖。
这自然是我们学校乃至我们市第一次获得奖项,于是陆老师更有干劲,在暑假还开办了暑期夏令营,第二年的机房坐满了人,而在我最开始学习那一年,偌大的机房除了陆老师就只有寥寥数人,稳定每次都来的只有我和另一个同学,其他人总是来了又走,走了又来。
其实我至今仍然记忆尤新的是,当时参加复赛的所有人中,除了第一名是满分外,其他人都是只有100-300分。
当时复赛是 6 道题,一道题 100 分。
我记得我只做出来了第一题,第二题手算出了部分结果然后直接输出,其他题目都是随便写了点。
我的得分好像是100多分还是200多分,具体忘记了,但是就这样的水平我居然还能排到二等奖,足见当时我们省的整体水平。
但是外界可不管你的分数,只看你的奖项,于是我凭借二等奖的奖项获得了参与大学自主招生的资格。
也许你会以为这会是我从此走向正轨的开始,事实上,这只是我唯一的高光时刻。
现实就是现实
现实就是现实,想要实现跃升不是那么容易的。
我自主招生选择了陆老师的母校。
虽然当时我获得了自主招生资格,但是我去参加自主招生面时时猛然发现,其他人都在不停的练习。手里还拿着一本不知道哪里来的面试技巧指南。而我却只是一个人背着一个包,什么也没准备,连面试会面什么都不知道就和朋友坐着绿皮火车去了大学所在城市:重庆。
我去面试时,朋友就在学校里面闲逛等我。
面试官问了什么我已经基本忘记了,只记得他问我的一个问题:你觉得你学习编程对你以后有什么帮助?
我紧张的头脑紧绷:学习编程可以培养我们日后学习其他领域知识时的逻辑思维能力而且对其他领域的也有极大帮助
面试官:什么样的逻辑思维?能够有什么样的帮助?
我一时不知道该怎么回答,只能机械的重复:编程可以培养我们的逻辑思维,以后学习其他东西会有很大的帮助。
面试官:什么样的帮助?
我:......
不用说,我面试没过。
其实即使我面试过了也没用,因为自主招生的前提条件是高考分数需要过一本线,显然,我的高考分数也没过一本。
面试没过归没过,我和朋友还是在重庆好好的玩了一番。
没过多久,应上面说到的认识的 phpbb-wap 的开发者的邀请,我还和他们一起组队去上海参加了一场黑客马拉松。
毫无意外的,因为我们什么都没准备的,所以什么都没做出来,自然什么奖项都没拿到。
在那儿之后,我开始填报志愿,险些全部滑档,好在被服从调剂兜底了。
最终大学填报的计算机专业被调剂了到了四大天坑之一的材料学。
大学时因为挂科错过了转专业的机会,大学毕业后去了某大厂打螺丝(字面意义的"厂"和"打螺丝")。
一切似乎跌落到了谷底。
不屈
打了几个月螺丝后,终于忍受不了暗无天日的流水线生活,果断辞职跑路。
幸运的是,在辞职之前找到了一份老家的工作,而且还是我心心念念的软件开发岗位,虽然不是软件公司,而是一家传统制造业公司,但是对于我这个非科班,且上一份工作是流水线打螺丝的两不沾求职者来说,有公司能够愿意收留我就不错了。
去这家公司前本身也不抱有太大的期望,只当是作为一个跳板,让我有一份软件开发的履历,方便后期跳槽。
因此当来到公司发现加上我所有软件部门只有四个人的时候我并不意外。
当发现软件开发流程各种不规范,没有测试,没有产品,没有UI,一个人就要负责所有的东西时我甚至还觉得这样很自由呢。
毕竟怎么做,做成什么样全是我自己说了算,领导只看最终的结果而不会关心我是怎么实现的。
于是我按照自己从网上学习到的各种优秀开源项目的结构和写法慢慢的把公司的项目改造成了我看起来"赏心悦目"的样子。
因为这是家小公司加上只是为公司的硬件设备写配套 APP,所以平时几乎没有需求,除了隔三差五的维护一下现有软件外,几乎没有什么事可做,于是我开始自己学习一些新的技术,研究更多的开源项目。
因为我也知道自己的薄弱点在于对知识不够深入,并且知识没有成体系。
所以我就在恶补这方面的知识,但是越是恶补越是觉得这公司就像草台班子一样。
所以我萌生了想要尽快跳槽,去真正的软件公司好好学习的想法。
结果我还没跳槽呢,公司先倒闭了。
最终我来到了现在这家公司,
这是一家几乎所有员工都是开发的公司,做的是自有产品,也不是外包。
产品、测试、UI、开发 各个岗位配套齐全,我以为我真的可以实践我学到的规范式开发了。
屎!
原本这一节才是本文的重点,并且字数占了本文一大半的比例,但是:
我始终是个品德良好的正常人,写完发泄一下就够了,就不公开了
虽然去掉这一节会让文章结构被破坏,并且上面埋得伏笔都无法回收了。
补充
叠甲声明
因为我记忆一直不怎么好,好多事情都是记了个大概,所以如今回忆起来不免会"添油加醋",所以上面说的事只敢保证大方向上的符合事实的,但是细节可能不太经得起推敲。
另外还有一个最大的问题是上面说的那些事件虽然都是真实发生的,但是不一定是按照记录的时间顺序发生的,因为好多事我已经记不太清是什么时候的事了,即使我已经尽力去求证确保时间线无误,也还是难免会有错漏。
尾声
其实这篇文章想写很久了,但是因为我受过良好的教育,知道随便在背后蛐蛐别人是不好的行为,所以一直忍着,最多只是和好友吐槽一下。
直到最近这位神人直接在发版前连夜删我代码的事情真的让我愤怒的怒了一下,是的,我除了自己生闷气没有任何办法。
已经有无数的案例证明,和他争执,是必输的,而且是单输,甚至连双输都难以做到。
但是一直憋着实在难受,只能写成文章发泄一下了。
恰好经由这件事,我突然开始在骑车下班的路上猛的想起了我最开始写代码时的事,现在想着还是会觉得那时候是多单纯啊。
单纯的以为程序员就是纯粹的写代码,而代码永远是纯粹的,程序员也是纯粹的。