我是一名中级程序员。

我有相当不错的基本技能。我犯了足够多的错误才明白为什么那些被称为错误。我很清楚我还需要了解更多东西。最重要的是,我知道那些东西大概是什么,并且我正在努力而积极地提升自己。

勇敢地承认自己不过是水平一般的程序员,这花了我一些时间。我不再感觉有必要去抓住那些我并不了解的观点。当人们发现我对某样东西不了解时,我也不再感到害怕。

事情并非从来如此。你可能对此不以为然,但是我曾经自诩为编程大师。

这种对自己能力的不正确的评估,很大程度归因于我在一个相对封闭的环境中学习技能。在过去那些日子里,有电脑就已经很特别了;更不用说知道如何使用了。

在我自己看来,我当时是一个知识渊博并且经验丰富的程序员。在我不到20岁的时候我已经用C++、Pascal、C#、JavaScript写过程序。当然我最引以为傲的是,曾经徒手用PHP编了一个电子商务平台。

事实上,我可能只是人们平时谈话中提到的“我有个朋友的儿子很会写网站”。我和别的程序员没有任何交流,所以我仅有的比较对象是我周围的人;要么是一些根本不在意电脑的人,要么是那些会用电脑,但是在IE窗口中塞了5个没用的工具栏的人。那些可能会说“我的网坏了”这种话的人。

接下来这个故事就是讲我如何产生自己很厉害的幻觉的。

天才的起源

当我九岁的时候,我的一个朋友家里有卫星电视。而在我们家里,我们只能收到四个英国的频道(你能想象第五频道出现之前的日子吗?),我热切地盼望有一台普通的电视机。我们所需要的只是那些“卫星盘子”,或者我称为“卫星”的东西——那样我就随时可以看QVC台或者Eurosport台。由于隐约意识到自己的某种天分,我开始搭建自己的卫星!我的设计包括了一把打开的伞和一条铜质音频线,一段接在伞的金属柄上,另一端接在电视机天线上。必须承认我的设计有一些缺陷,并直接导致我没有得到想要的结果。但是这个小故事仅仅想表达我童年和青少年时期对技术的渴望。我认识的人中从没人想过制造“卫星”。

几年后,当我父亲的办公室得到一个14.4k的猫时,我成为了最早一批网民一员。我能回忆起花了整个星期六下午的时间等待这个火焰漫画图标被加载,每个帧的动画大概要过一分钟才显示。我甚至用Netscape搭建了我自己的网站。由于不知道互联网的架构,我把所有的HTML文件存放在本地,并且期待有一天他们会出现在互联网上。然而这些细节并没有削弱一个事实:我认识的人中没有一个制作了他们自己的网站。

在我十多岁的时候,我发现了自己天才中的黑暗面。在装备了Jolly Rogers的食谱后,我和一群小伙伴们准备动摇整个九十年代英格兰的技术和道德根基。破解电话系统是我们的专长。我们用手提式声音耦合器和公用电话,给我们在ICQ上认识的美国姑娘们打免费国际电话,以及在私人交换机上设立语音信箱。最终学业和滑板阻止了我们在这条路上越走越远,如果没有这些干扰,我们无疑已经在制造凝固汽油,黑进政府网站并且徒手杀人了。尽管我们没有把自己的能力发挥到极致,但事实是除了我们没有其他人哪怕拥有声音耦合器。

尽管到那个时候我已经经历了一些冒险和失败,我还是缺少一些东西。我的想法总是要超前我自身能力好几步-正如在“卫星”一节里体现出来的。我需要一种把我脑海中想法表达出来的方式。我需要一个直接的介于我想象和现实之间的接口。

Fuck 生成器

真正的转机出现在我十四岁的时候。我购买了一份PC Plus杂志,其中附赠了带有完整版Borland C++编译器的CD。我安装了,并且认真学习了杂志上的“hello world”教程。

就这样,一个崭新的世界在我面前打开了。物质世界对于我想象力的限制消失了。我的创造力被解放了,我脑海中的大教堂要成为现实了!我该把这个新工具用于怎样崇高的事业呢?很显然,Fuck生成器。

简单而优雅的Fuck生成器是一个命令行程序,也是我即”hello world”之后第一个里程碑。程序开始运行后会提示用户输入一个数字n,然后它会输出字符串”fuck”,n次。最后用户被提示可以重复以上过程或是退出。尽管功能有限,我还是沉醉于我所品尝到的成就。这是任何程序员都能享受到的一种快感,即看着机器执行你的命令,不管这个任务有多简单。它在运行了,并且你知道为什么它能够运行。它除了在那里运行不会做任何别的事。

过了些时日,另一期的PC Plus附赠了一个完整版的Borland Delphi。有了这个,我把程序升级为带有窗口界面并且可以随机生成彩色的4种不同的脏话。当别的孩子在玩PlayStation的时候,我正在投身于一项更有意义和创造性的事业,我在生成很多fuck。

到那时,一切都预示着我是注定要成大事的。我要向世人展示我真正可以做的事情。

我的巨著

在90年代晚期,我为一家小型并且扩张迅速的邮件订购零售商创建了一个网站。一开始,这个站点只包含一些静态的页面——关于商品的小册子,一个导航菜单和一个访问数量计数器。

当我们的访问量越来越大时,我们决定加入电子商务功能。我们遍历了一些现成的工具包,它们的质量从差到极差不等。我印象中第一个版本大部分建立在摆弄cgi脚本以及怪异地把<select>元素用于几乎所有的用户交互部分之上。之后的一个版本是充斥着framesets和Javascript的怪物——远在Javascript成为举世皆准的构建应用功能的方式之前。另一个版本是由微软的Access数据库驱动的。

不久后我们意识到,如果我们想要一个真正可用的甚至体面的在线商店,我们需要一个自定义解决方案。我想到了我过去的成功经验:fuck生成器系列,以及截至那时我所编写的优秀网站,这其中:我的 Manic Street Preachers吉他谱收藏网站非常具有权威性。我认为是时候看看我能真正做些什么的时候了。我要自己从头开始干。

从头开始?即使那个时候开源框架已经存在,我也不会知道他们。我有自己的计划。我买了一本关于PHP和MySQL的书,一边学习一边着手搭建新的网站。

幸运的是,这本书把一个非常简单的购物网站作为它的核心例子。所有的部分都在那儿:“category.php”会列出一个目录中的所有物品;“product.php”会显示商品信息以及把该商品加入购物车的按钮;以及最重要的“cart.php”,它是所有奇迹发生的所在。这就是我想要的东西!

我孜孜不倦地学习这个例子,充满自信地实现所有巧妙的而且毫无疑问也是最新潮的技术-那些方便的“mysql_”函数;用于建立查询的字符串连接函数;把不同的函数放进“functions.php”文件;通过加入“header.php”和“footer.php”来维护整个网站的一致性;为了代码的快速运行而回避了笨重的面向对象的设计方式(管它是什么玩意)。我的技能在飞速成长。

像一个人的王国一样,我建造了高塔和迷宫般的地道。我每添加一个特性,就好像整个结构在向天空伸展同时也向地下蔓延。顾客帐户、商品评价、购买历史、优惠点数、帐单号、特殊优惠、日志、 A/B测试、支付信息加密,等等。一个蔓延的迷宫,一整个星系的函数,大的小的,缓缓围绕一个不变的核心:“cart.php”。

经过八个月的激情工作,我终于完成了。

现在,你们这些读者一定在期待我会详述当网站正式运行时发生了怎样恐怖的事情。恐怕我要让你们失望了。

它成功运行了。

最糟的方法

尽管我现在把这当作我最糟的设计,但是这个东西确确实是能够运行。它在每一个糟糕的教程,每一个反php的帖子里都能找到。搅成一团的代码?是的。不一致的数据和方法名称?是的。介绍和业务逻辑混在一起?是的。魔幻数和全局变量?是的。

对我而言,面向对象的设计只是一堆不必要的开销和公式化的代码,并且有很多片面的理论支持我的观点。我知道有关测试的所有,点击一些你设计的特性,看上去不错,上传运行。我不太知道别的架构,但是据我所知,我所采用的是最明智的方法。

一些事实能“证明”我所做的都是正确的:我从零开始,白手起家,用智慧创造了一个功能齐全的电子商务站点。更重要的,它运行完好并且还在扩张。

在我的眼里,我和那些写了亚马逊的程序员们没什么太大区别。当然亚马逊要大一些,但是我没有看到任何我的网站不能扩张成那样的理由--尤其考虑到我采用的高速运行的架构。

我认为我的技术水平已经到了巅峰了。并不是说我对学习新技术不感兴趣了,我只是不再对此感到紧迫。毕竟我创造了一些不错的产品。任何在此之上的东西只是附加奖励,是蛋糕顶端的樱桃而已。

回到地表

我很遗憾,我在这种心态下生活了好几年。我只是将一小部分时间用在这个网站上,而把主要时间用在完全不同的领域。在之后多年的维护和偶尔添加特性的过程中,我确实意识到了之前做的一些选择是有问题的。我意识到有时候要花很长时间才能找到我要找的文件。有时候当我做一个改动时,一些看上去毫无关联的地方会出现bug。

我的学习没有停止,但它确实进展缓慢。我意识到我曾经写的mysql函数是有风险的,因为后面版本的PHP减少了对它们的支持。在一段时间里,我克服对此的恐惧的方法是坚信我的无懈可击的设计可以弥补这些风险。毕竟我尝试了所有形式的我能找到的SQL注入,一切看起来都没有问题。

去年的一天我接到了一个紧急电话,网站挂了。所有的请求都得到500错误。在工程师们重新启动并且分析了事故原因后,这被证实是一起来自国外的sql注入攻击,是我从来没见过的一种。

好吧,我想,这也许是我该转向PDO的时候了。

觉悟

当我坐下来准备重写所有的数据存取方法时,我意识到了一些深层次的问题。我意识到这将会很困难。而且我知道为什么它会这么困难。

因为这些方法散落在所有地方;因为我无法知道是否会不经意地破坏一些东西;因为代码是如此不一致以至于我要小心地研究不同对象的细微差别;因为很多代码和别的部分紧密相连,这也会导致我会不小心造成破坏。简单地说,这将会很困难。不仅因为所有这些坏的实现方法,还因为我对它们所将造成的后果缺乏预见。

所有的辩护,借口,逃避都无法继续下去了。我错了。我不是那个幻想中的天赋卓越的程序员。这么多年来,我一直都没有认清这一点。

我的愚蠢已经显而易见,尽管这对我的自尊心是极大的打击,但这也是很宝贵的一个教训。我通过亲身经历(而且是非常痛苦的),学到了为什么做一件事的方法有对错之分。这不仅仅关系到品味或者时尚。这不是比谁的方法更聪明。正确的方法可以在现实生活中找到,并且能让你和那些使用你代码的人的生活更好。错误的方法让人沮丧,浪费时间。我在这里不想说明哪些东西是组成“正确方法”的要素。只要说不是我做的那些就够了。

真正的错误

我实现了PDO。同时开始第一次使用PHPUnit。我决不想尝试通过单元测试去改造那样的代码。

现在我有意识地迫使自己无论何时都尽量去学习。我正在读一些每个程序员都应该读的书。我在关注别人的博客。我在收听播客。我会看会议视频。我正在参加一些当地的社团并且在其中做演讲。我在做副业并且挑战自己学习新的技术。我在学习用正确的方法做事。

对你们所有献身于这项事业中的人来说,有一个对我们很重要的有利条件。即编程是这样一个完全抽象的活动,任何其他领域都会受到的现实世界中的限制在这里不存在。在这里,你的极限是你自己。

我要以一些真正的箴言结束这个故事。我在开始写这片博客的时候正好刚看完第二版的《代码大全》。在书的最后,第825页的底部,作者准确地描绘了我在写这篇文章时的想法。可以说他只用了两句话就表达我在这数千字里想表达的东西:

“作为一个初学者或者进阶者,这并没有什么错。当一个有能力的程序员而不是领导者,这也没有什么错。真正的错误是,当你知道应该如何去提高时仍然选择做一名初学者。”

java技术大牛修炼记5-一名中级程序员的自述相关推荐

  1. java技术大牛修炼记4-华为超级技术大牛的十年经验总结

    注:原文地址已找不到,尊重原创,再此写出作者姓名 人类与动物的最大不同是积累知识可以传承学习,学习他人成功的经验可以让我们少走弯路并缩短学习曲线,这里,华为大牛徐家骏的10年华为之路对每个人都有启迪和 ...

  2. java项目怎样提高性能_从代码的角度谈如何优化JAVA代码以提高性能【初、中级程序员必看】...

    最近复习Java基础感触颇深,同样是几行代码,别人写的运行效率就很大,自己写的就不是那么随意,这就牵扯到代码的性能优化问题,这个问题在初级阶段往往没有引起太多的重视,导致后来的工作中就没有往优化这个角 ...

  3. java前沿技术_互联网百强企业架构师告诉你,Java应该这么学!云和数据超全面Java中级程序员学习路线图重磅发布!...

    作为常居编程语言排行榜第一名的编程语言,Java语言以其稳定性.健壮性著称,是一门非常成熟的编程语言,多年来一直是国际上众多企业的首选编程语言. Java语言不仅吸收了C++语言的各种优点,还摒弃了C ...

  4. 一名老程序员的一点感悟给未来的程序员

    作 为一个技术不是大牛事业也不是很成功的老程序员,我觉着还是要写一些什么,来给未来的程序员们讲述一个过来人的感悟吧. 最近开始整理python的资料,博主建立了一个qq群,希望给大家提供一个交流的同平 ...

  5. 敲了 10000 小时代码,我也没能成为一名高级程序员

    [CSDN 编者按]Malcolm Gladwell在<离群索居>(Outliers)一书中曾言,要真正掌握某件事情,需要10000小时的练习.而本文作者Greg Bulmash拥有40多 ...

  6. 作为一名女程序员是什么体验?

    大家好,我是菜鸟哥! 又到周末啦啦啦,But昨天需要上班,但是闹铃没有闹,所以我错过了上班的班车,好吧!还好是弹性工作制,不然肯定被批!今天可以休息一下了,我们来聊一个轻松一点的话题,作为一名&quo ...

  7. 内卷失败:敲了 10000 小时代码,我也没能成为一名高级程序员

    [CSDN 编者按]Malcolm Gladwell在<离群索居>(Outliers)一书中曾言,要真正掌握某件事情,需要10000小时的练习.而本文作者Greg Bulmash拥有40多 ...

  8. 代码写的多了就能成为一名优秀程序员吗

    对于很多学习编程的新人来说,老师都会要求多练习代码,这并没有错,但是并不代表写代码越多就越优秀,而优秀的程序员都是从练习写代码中培养自己的能力.努力不一定成功,但不努力一定不会成功,所以在成为程序员的 ...

  9. 一名野生程序员的自我修养

    PythonicLife作品 首发于微信公众号 PythonicLife 微信ID:pythonice__life 原作者:野生的我 转载请注明出处 一名野生程序员的自我修养 文 | 野生的我 沿着潺 ...

最新文章

  1. Tensorflow 可视化 TensorBoard 尝试~
  2. 8.1 A Bayesian Methodology for Systemic Risk Assessment in Financial Networks(3)
  3. facade 模式和gateway模式的区别
  4. MathType插入带序号公式的两种方法
  5. php如何读出xml的节点内容 两个例子
  6. JAVA中基本类型Boolean占几个字节
  7. 关于结构体的浅拷贝和深拷贝
  8. java异常机制throwable
  9. 优秀!Github上10个开源免费的后台控制面板你值得拥有!
  10. ubuntu安装 opencv-3.4.3
  11. Android Verified Boot 2.0 安卓P AVB实现详解
  12. Linux文件颜色与文件类型对应(白色、蓝色、红色、黄色、绿色 代表的意义。。。)
  13. 短视频SDK技术选型
  14. 由观影引发的几点人生思考
  15. IT从业者的职业规划
  16. 任天堂服务器维护12月1,《怪物猎人:崛起》太火爆!任天堂服务器紧急维护!会是独占游戏么?...
  17. 销售系统学习.mdl
  18. conda 安装tensorboardX
  19. vscode 函数定义跳转与回退
  20. 2022年苏大计算机考研872真题及解析

热门文章

  1. think php 缩放图片,thinkphp图片裁剪、缩放、加水印方法
  2. 初识canvas(二)
  3. android logo制作教程视频,android開机logo制作详细步骤.docx
  4. POI设置单元格自动行高的思路
  5. 虚拟化服务器怎么关机,存储服务器怎么关机
  6. Servlet激活器和缺省Servlet
  7. Mac终端出现bogon的解决办法
  8. Opencv图像特征
  9. 简单的登录验证程序代码
  10. 将人参奉为补药之王的你真的认识人参的价值?