一名程序员的自白:其实我并不是一位天赋卓越的编程大师
我是一名程序员,虽然有着相当不错的基本技能,但我还是得承认自己只不过是水平一般的程序员,这花了我很长一段时间,我不再感觉有必要去抓住那些我并不了解的观点,当人们发现我对某样东西不了解时,我也不再感到害怕,你可能对此不以为然,但是我曾经自诩为编程大师。
直到我犯了足够多的错误才明白为什么那些被称为错误,我很清楚我还需要了解更多东西,最重要的是,我知道那些东西大概是什么,并且我正在努力而积极地提升自己。
这种对自己能力的不正确的评估,很大程度归因于我在一个相对封闭的环境中学习技能,在过去那些日子里,有电脑就已经很特别了,更不用说知道如何使用了。
在我自己看来,我当时是一个知识渊博并且经验丰富的程序员,在我不到20岁的时候我已经用C++、Pascal、C#、JavaScript写过程序,当然我最引以为傲的是,曾经徒手用PHP编了一个电子商务平台。
接下来这个故事就是讲我如何产生自己很厉害的幻觉,并自诩为天赋卓越的编程大师!
1、天才的起源
当我九岁的时候,我的一个朋友家里有卫星电视,而在我们家里,我们只能收到四个频道(你能想象第五频道出现之前的日子吗?),我热切地盼望有一台普通的电视机,我们所需要的只是那些“卫星盘子”,或者我称为“卫星”的东西——那样我就随时可以看QVC台或者Eurosport台。
由于隐约意识到自己的某种天分,我开始搭建自己的卫星!我的设计包括了一把打开的伞和一条铜质音频线,一段接在伞的金属柄上,另一端接在电视机天线上。必须承认我的设计有一些缺陷,并直接导致我没有得到想要的结果,但是这个小故事仅仅想表达我童年和青少年时期对技术的渴望,我认识的人中从没人想过制造“卫星”。
几年后,当我父亲的办公室得到一个14.4k的猫时,我成为了最早一批网民一员。我能回忆起花了整个星期六下午的时间等待这个火焰漫画图标被加载,每个帧的动画大概要过一分钟才显示。
我甚至用Netscape搭建了我自己的网站,由于不知道互联网的架构,我把所有的HTML文件存放在本地,并且期待有一天他们会出现在互联网上,然而这些细节并没有削弱一个事实:我认识的人中没有一个制作了他们自己的网站。
在我十多岁的时候,我发现了自己天才中的黑暗面,在装备了Jolly Rogers的食谱后,我和一群小伙伴们准备动摇整个九十年代英格兰的技术和道德根基,破解电话系统是我们的专长,我们用手提式声音耦合器和公用电话,给我们在ICQ上认识的美国姑娘们打免费国际电话,以及在私人交换机上设立语音信箱。
最终学业和滑板阻止了我们在这条路上越走越远,如果没有这些干扰,我们无疑已经在制造凝固汽油,黑进政府网站并且徒手杀人了,尽管我们没有把自己的能力发挥到极致,但事实是除了我们没有其他人哪怕拥有声音耦合器。
尽管到那个时候我已经经历了一些冒险和失败,我还是缺少一些东西,我的想法总是要超前我自身能力好几步,正如在“卫星”一节里体现出来的,我需要一种把我脑海中想法表达出来的方式,我需要一个直接的介于我想象和现实之间的接口。
2、Fuck生成器
真正的转机出现在我十四岁的时候,我购买了一份PC Plus杂志,其中附赠了带有完整版Borland C++编译器的CD。我安装了,并且认真学习了杂志上的“hello world”教程。
就这样,一个崭新的世界在我面前打开了,物质世界对于我想象力的限制消失了,我的创造力被解放了,我脑海中的大教堂要成为现实了!我该把这个新工具用于怎样崇高的事业呢?很显然,Fuck生成器。
简单而优雅的Fuck生成器是一个命令行程序,也是我即“hello world”之后第一个里程碑。
程序开始运行后会提示用户输入一个数字n,然后它会输出字符串“fuck”,n次,最后用户被提示可以重复以上过程或是退出。尽管功能有限,我还是沉醉于我所品尝到的成就。
这是任何程序员都能享受到的一种快感,即看着机器执行你的命令,不管这个任务有多简单,它在运行了,并且你知道为什么它能够运行,它除了在那里运行不会做任何别的事。
过了些时日,另一期的PC Plus附赠了一个完整版的Borland Delphi。有了这个,我把程序升级为带有窗口界面并且可以随机生成彩色的4种不同的脏话。当别的孩子在玩PlayStation的时候,我正在投身于一项更有意义和创造性的事业,我在生成很多fuck。
到那时,一切都预示着我是注定要成大事的,我要向世人展示我真正可以做的事情。
3、我的巨著
在90年代晚期,我为一家小型并且扩张迅速的邮件订购零售商创建了一个网站。一开始,这个站点只包含一些静态的页面——关于商品的小册子,一个导航菜单和一个访问数量计数器。
当我们的访问量越来越大时,我们决定加入电子商务功能,我们遍历了一些现成的工具包,它们的质量从差到极差不等,我印象中第一个版本大部分建立在摆弄cgi脚本以及怪异地把<select>元素用于几乎所有的用户交互部分之上。
之后的一个版本是充斥着framesets和Javascript的怪物(具体可查看马海祥博客的《JavaScript是什么?JavaScript功能有哪些》相关介绍),远在Javascript成为举世皆准的构建应用功能的方式之前。另一个版本是由微软的Access数据库驱动的。
不久后我们意识到,如果我们想要一个真正可用的甚至体面的在线商店,我们需要一个自定义解决方案。我想到了我过去的成功经验:fuck生成器系列,以及截至那时我所编写的优秀网站,这其中:我的Manic Street Preachers吉他谱收藏网站非常具有权威性,我认为是时候看看我能真正做些什么的时候了,我要自己从头开始干。
从头开始?即使那个时候开源框架已经存在,我也不会知道他们,我有自己的计划,我买了一本关于PHP和MySQL的书,一边学习一边着手搭建新的网站(其实可以编程网页的语言还有很多,具体可通过马海祥博客的《12种最常用的网页编程语言简介》相关介绍来详细的了解)。
幸运的是,这本书把一个非常简单的购物网站作为它的核心例子。所有的部分都在那儿:“category.php”会列出一个目录中的所有物品;“product.php”会显示商品信息以及把该商品加入购物车的按钮;以及最重要的“cart.php”,它是所有奇迹发生的所在,这就是我想要的东西!
我孜孜不倦地学习这个例子,充满自信地实现所有巧妙的而且毫无疑问也是最新潮的技术,那些方便的“mysql_”函数;用于建立查询的字符串连接函数;把不同的函数放进“functions.php”文件;通过加入“header.php”和“footer.php”来维护整个网站的一致性;为了代码的快速运行而回避了笨重的面向对象的设计方式(管它是什么玩意),我的技能在飞速成长。
像一个人的王国一样,我建造了高塔和迷宫般的地道,我每添加一个特性,就好像整个结构在向天空伸展同时也向地下蔓延。顾客帐户、商品评价、购买历史、优惠点数、帐单号、特殊优惠、日志、 A/B测试、支付信息加密,等等,一个蔓延的迷宫,一整个星系的函数,大的小的,缓缓围绕一个不变的核心:“cart.php”。
经过八个月的激情工作,我终于完成了,它成功运行了。
4、最糟的设计
尽管我现在把这当作我最糟的设计,但是这个东西确确实是能够运行,它在每一个糟糕的教程,每一个反php的帖子里都能找到,搅成一团的代码?是的。不一致的数据和方法名称?是的。介绍和业务逻辑混在一起?是的。魔幻数和全局变量?是的。
对我而言,面向对象的设计只是一堆不必要的开销和公式化的代码,并且有很多片面的理论支持我的观点。我知道有关测试的所有,点击一些你设计的特性,看上去不错,上传运行,我不太知道别的架构,但是据我所知,我所采用的是最明智的方法。
一些事实能“证明”我所做的都是正确的:我从零开始,白手起家,用智慧创造了一个功能齐全的电子商务站点,更重要的,它运行完好并且还在扩张。
在我的眼里,我和那些写了亚马逊的程序员们没什么太大区别。当然亚马逊要大一些,但是我没有看到任何我的网站不能扩张成那样的理由,尤其考虑到我采用的高速运行的架构。
那时,我认为我的技术水平已经到了巅峰了,并不是说我对学习新技术不感兴趣了,我只是不再对此感到紧迫,毕竟我创造了一些不错的产品,任何在此之上的东西只是附加奖励,是蛋糕顶端的樱桃而已。
5、回到地表
我很遗憾,我在这种心态下生活了好几年,我只是将一小部分时间用在这个网站上,而把主要时间用在完全不同的领域,在之后多年的维护和偶尔添加特性的过程中,我确实意识到了之前做的一些选择是有问题的,我意识到有时候要花很长时间才能找到我要找的文件,有时候当我做一个改动时,一些看上去毫无关联的地方会出现bug。
我的学习没有停止,但它确实进展缓慢,我意识到我曾经写的mysql函数是有风险的,因为后面版本的PHP减少了对它们的支持。
在一段时间里,我克服对此的恐惧的方法是坚信我的无懈可击的设计可以弥补这些风险,毕竟我尝试了所有形式的我能找到的SQL注入,一切看起来都没有问题。
去年的一天我接到了一个紧急电话,网站挂了,所有的请求都得到500错误,在工程师们重新启动并且分析了事故原因后,这被证实是一起来自国外的sql注入攻击,是我从来没见过的一种。
好吧,我想,这也许是我该转向PDO(PHP Data Object)的时候了。
PDO(PHP Data Object)是PHP5新加入的一个重大功能,因为在PHP5以前的php4/php3都是一堆的数据库扩展来跟各个数据库的连接和处理,什么php_mysql.dll、php_pgsql.dll、php_mssql.dll、php_sqlite.dll等等扩展来连接MySQL、PostgreSQL、MS SQL Server、SQLite,同样的,我们必须借助ADOdb、PEAR::DB、PHPlib::DB之类的数据库抽象类来帮助我们,无比烦琐和低效,毕竟,php代码的效率怎么能够我们直接用C/C++写的扩展斜率高?所以嘛,PDO的出现是必然的,大家要平静学习的心态去接受使用,也许你会发现能够减少你不少功夫哦。
我实现了PDO(PHP Data Object),同时开始第一次使用PHPUnit,我决不想尝试通过单元测试去改造那样的代码。
现在我有意识地迫使自己无论何时都尽量去学习,我正在读一些每个程序员都应该读的书,我在关注别人的博客,比如马海祥博客,我在收听播客,我会看会议视频,我正在参加一些当地的社团并且在其中做演讲,我在做副业并且挑战自己学习新的技术,我在学习用正确的方法做事。
对你们所有献身于这项事业中的人来说,有一个对我们很重要的有利条件,即编程是这样一个完全抽象的活动,任何其他领域都会受到的现实世界中的限制在这里不存在,在这里,你的极限是你自己。
6、觉悟
当我坐下来准备重写所有的数据存取方法时,我意识到了一些深层次的问题,我意识到这将会很困难,而且我知道为什么它会这么困难。
因为这些方法散落在所有地方;因为我无法知道是否会不经意地破坏一些东西;因为代码是如此不一致以至于我要小心地研究不同对象的细微差别;因为很多代码和别的部分紧密相连,这也会导致我会不小心造成破坏。
简单地说,这将会很困难,不仅因为所有这些坏的实现方法,还因为我对它们所将造成的后果缺乏预见。
所有的辩护,借口,逃避都无法继续下去了,我错了,我不是那个幻想中的天赋卓越的程序员,这么多年来,我一直都没有认清这一点。
我的愚蠢已经显而易见,尽管这对我的自尊心是极大的打击,但这也是很宝贵的一个教训,也给初学者一个真实的忠告(有兴趣的朋友可以看下马海祥博客的《老程序员给初学者的一些建议和忠告》相关介绍)。
我通过亲身经历(而且是非常痛苦的),学到了为什么做一件事的方法有对错之分,这不仅仅关系到品味或者时尚,这不是比谁的方法更聪明,正确的方法可以在现实生活中找到,并且能让你和那些使用你代码的人的生活更好。
错误的方法让人沮丧,浪费时间,我在这里不想说明哪些东西是组成“正确方法”的要素,只要说不是我做的那些就够了。
马海祥博客点评:
作为一个初学者或者进阶者,这并没有什么错,当一个有能力的程序员而不是领导者,这也没有什么错,真正的错误是,当你知道应该如何去提高时仍然选择做一名初学者。
本文发布于马海祥博客文章,如想转载,请注明原文网址摘自于http://www.mahaixiang.cn/bcyy/654.html,注明出处;否则,禁止转载;谢谢配合!您可能还会对以下这些文章感兴趣!
-
盘点史上最奇葩的10大编程语言排行榜
一般来说,人们大多都认为编程语言很容易使用和学习,因为编程语言就是应该给你提供数据结构让你来解决实际问题,它们的语法也应清晰明了,容易理解且执行速度快,不应该有任何bug。但有时候编程语言设计者们会创建一些违背这些原则的语言,要么供研究使用,要么纯属娱……【查看全文】
-
老程序员给初学者的一些建议和忠告
对于课程有这样简单的选择方法:如果你是计算机系的,请学好你所有的专业基础课;如果不是,请参照计算机系的课程表。如果你发现自己看一本书时无法看下去了,请翻到书的最后,看看它的参考文献,找到它们并学习它们,再回头看这本书。如果一本书的书名中带有“原理”……【查看全文】
-
一个美国程序员对IT行业招聘的吐槽
今天听到一个朋友抱怨说“作为程序员,找工作有时候似乎挺苦逼的。”说真的,让我去掉前面这句中“似乎”二字吧。就是苦逼!很多人都曾抱怨处在招聘的一方很糟糕??我们没有任何可靠的方式来甄别会写代码并且写得好的人。这的确是真的,我们这行在这方面做得很糟糕。即……【查看全文】
-
工作中令程序员最生气的10件事情
作为一个优秀的程序员,他的思想不能局限在当前的工作任务里面,要想想看自己写的模块是否可以脱离当前系统存在,通过简单的封装在其他系统中或其他模块中直接使用,这样做可以使代码能重复利用,减少重复的劳动,也能使系统结构越趋合理,模块化思维能力的提高是程序员……【查看全文】
-
Python语言代码的性能优化方法大全
选择了脚本语言就要忍受其速度,这句话在某种程度上说明了python作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在performance较差的机器上,因此有必要进行一定的代码优化来提高程序的执行效率。那么我们该如何进行Python性能优化呢?接下来我就跟大家……【查看全文】
-
原来还能这样评价编程语言!
如果编程语言是女人,PHP是你的豆蔻年华的心上人,她是情窦初开的你今年夏天傻乎乎的追求的目标。玩一玩可以,但千万不要投入过深,因为这个女孩有严重的问题。Perl是PHP的姐姐。她对你来说年龄稍微大了一点,但在90年代,她是相当受欢迎的。她和Larry Wall(译注:Perl……【查看全文】
-
初级软件工程师必须要学会哪些编程技术
软件工程师(Software Engineer)可以说是从事软件职业的人员的一种职业能力的认证,通过它说明具备了工程师的资格,通俗的来说,软件工程师就是从事软件开发相关工作的人员的统称,它是一个广义的概念,包括软件设计人员、软件架构人员、软件工程管理人员、程序员等一……【查看全文】
-
为什么Swift编程语言刚一推出就这么火?
Swift语言是苹果公司在2014年WWDC(苹果开发者大会)上发布的全新开发语言,从演示视频及随后在appstore上线的标准文档看来,语法内容混合了OC,JS,Python,语法简单,使用方便,可与Objective-C*共同运行于MAC OS和iOS平台,用于搭建基于苹果平台的应用程序。作为一项……【查看全文】
-
你知道Java内部的这些事儿吗?
Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群,在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。你是不是写Java已经……【查看全文】
阅读:659关键词: java 日期:2014-11-21 -
计算机语言的发展简史
计算机语言总的来说分为机器语言,汇编一语言,高级语言三大类。而这三种语言也恰恰是计算机语言发展历史的三个阶段。1946年2月14日,世界上第一台计算机ENIAC诞生,使用的是最原始的穿孔卡片。这种卡片上使用的语言是只有专家才能理解的语言,与人类语言差别极大,这种……【查看全文】
分类目录
互联网更多>>
- 互联网思维的一些特征 如今,互联网迅猛发展已经渗透人们生活各个方面,尤其是互联网正加快向传统行业渗透和融合,对传统行业提出严……
- 盘点2010年代这10年的重大网络安全事件 二十一世纪的第2个十年即将过去,在过去十年里有很多的重大网络安全事件发生,我们见证了过去十年,大量的数据……
- 基于高斯模糊原理的模糊图片的研究 高斯模糊(Gaussian Blur)的原理中,它是根据高斯曲线调节象素色值,它是有选择地模糊图像。说得直白一点,就是高……
SEO优化 更多>>
-
移动端手机站做站内优化的要点
随着移动流量的与日俱增,移动搜索引擎的功能…… -
百度冰桶算法5.0:保障移动搜索用户
为了提升移动搜索落地页体验,营造优质的移动…… -
SEO是什么?
对于刚入SEO行业的新人来说,要想做好网站的s…… -
今年网站SEO优化要注意的6大策略
通俗的来说,SEO技术就是一种达到SEO效果所采用…… -
网站收录量对于网站排名的影响作用
很多做SEO的朋友都会问,是不是网站收录越多网…… -
如何使用留言评论进行推广引流
随着新媒体的快速发展,留言评论变得随处可见…… -
史上最全的网站SEO策略方案
在搜索引擎优化中,一个网站的SEO策略能最终影…… -
百度搜索将推出飓风算法2.0:严厉打
为了营造良好的搜索内容生态,保护搜索用户的……