中级程序员的自白

我是中级程序员。

我对基本知识非常了解。 我犯了足够多的错误,以使他们知道为什么错误。 我知道我需要了解更多信息。 至关重要的是,我对这些东西有一些了解,并且我正在积极而积极地致力于改善。

我花了一段时间才达到我有足够的信心承认自己才是中等水平。 我不再觉得需要持有我不太了解的二手意见。 当我不知道某件事时,我并不害怕被发现。

并非总是这样。 您可能不会相信它,但是我曾经是编程专家。

我对自己能力的这种错误评估最好归因于我发展自己技能的相对孤立的环境。 那个时候,甚至拥有一台电脑都有些特殊。 知道如何使用它。

根据我自己的估计,我是一个非常有知识和经验的程序员。 到我几乎还不成年的时候,我就用C ++,Pascal,C#,JavaScript编写了程序,而我的荣耀是,我从头开始用PHP编写了一个自定义电子商务平台(稍后再介绍)。

实际上,我可能只是比“朋友的儿子,他是网站的天才!”高出几分而已。 那些对计算机不太在意的人,或者如果他们对计算机不那么在意,那么他们可能会有五个垃圾邮件工具栏堵塞了Internet Explorer窗口。 可能会使用“我的互联网已损坏”一词的人。

这是一个关于我如何愚弄自己以为自己比以前更好的故事。

当我九岁的时候,我的一个朋友在他的家里有卫星电视。 在家里,我们只能使用标准的四个英国地面电视频道(这是在第五频道之前的日子-我们如何管理?),我渴望看到我目睹的大量坏电视。 我们需要的只是这些卫星天线之一,或者我们称之为“卫星”的卫星,而且我也可以随时随地观看QVC或Eurosport。 不知何故,我刚开始意识到自己的初生天赋,就开始制造自己的卫星天线! 我的设计包括一个完全打开的雨伞和一段铜质音频线,一端连接到雨伞的金属轴上,另一端塞入电视的天线插座中。 诚然,我的设计存在一些缺陷,因此未能实现预期的结果。 但是,这个轶事的目的只是为了证明将标志着我的童年和青春期的技术野心。 我认识的其他人都没有想到要制造人造卫星

几年后,当我父亲在他的办公室安装了14.4k调制解调器时,我成为了Internet的早期采用者。 我记得在一个星期六的下午耐心地等待着炽热的漫画徽标gif加载,随后的每一帧大约每分钟出现一次。 我什至使用Netscape Composer建立了自己的网站。 我还不了解Internet的体系结构,所以将html文件保存在本地,然后想知道它们何时会在线显示。 但是,这一细节并没有损害我认识的其他人都没有建立自己的网站的事实。

到了十几岁的时候,我发现了自己天赋的阴暗面。 怀着《乔利·罗杰斯食谱》的复印本,我和几个朋友开始动摇90年代中期英国所立的技术(和道德)基础。 Phreaking(破解电话系统)是我们的专长。 我们可以使用手持式声波耦合器拨打免费电话,从公用电话向在ICQ遇到的美国女孩打国际电话,并在私人分支交换机上设置语音信箱。 学业和滑板运动使我们无法进一步发展自己的事业。 如果没有这样的干扰,我们无疑会定期制造凝固汽油弹,入侵政府网络并赤手空拳地杀人。 尽管我们未能充分探索我们的能力极限,但事实只有我们自己拥有了声耦合器

到目前为止,尽管我经历了无数次冒险和各种技术的冒险,但仍然缺少一些东西。 我的想法总是超出我的身体能力的几个步骤-正如“卫星”情节所强调的那样。 我需要一种将自己的思想内容传播到世界的方法。 我需要我的想象力和现实之间的直接接口。

真正的转折点出现在我大约十四岁的时候。 我买了一本PC Plus杂志,其中包括一张附有完整版Borland C ++ Builder的封面CD。 我安装了它,并仔细遵循了“ hello world”教程,该教程在杂志中很有帮助。

就是这样 一个新世界在我面前打开。 物质世界对我的想象力施加的限制已经消失。 我的创造力毫不动摇,在我脑海中的大教堂将被彰显! 我应该把这个新发现的工具放到什么崇高的目标上? 很明显 他妈的生成器。

Fuck Generator(fgen.exe)简单而优雅,是一个命令行程序,这是我超越“ hello world”的第一步。 启动后,它将提示用户输入号码。 使用这个数字n ,它将n次打印出字符串“ fuck”。 最终,用户可以选择重复练习或退出。 也许在使用上有一点限制,但我仍然迷上了我所品尝到的力量。 不管任务多么简单,任何程序员都将非常了解该机器如何进行投标,这是一个特别高兴的事情。 它行之有效,而且之所以行之有效,是因为您了解如何使其工作。 它除了工作外无能为力。

不久之后,另一版PC Plus包含了完整版的Borland Delphi。 借助它,我升级了该概念,使其包括Windows GUI并能够随机生成彩色的,有时令人惊讶的4部分侮辱。 当学校的其他孩子们在被动地玩PlayStation时,我从事了更加有意义和创造性的工作。 我在乱搞

至此,我很清楚自己注定要从事大事。 是时候向世界展示我的才能了。

在90年代后期,我为一家小型但规模不断扩大的邮购零售商创建了一个网站。 最初,该站点只有几个静态页面-宣传册软件-带有框架集中的导航菜单和主页上的强制性访客计数器。

当我们开始从网站上获得越来越多的查询时,我们决定尝试添加电子商务功能。 我们遍历了几个现成的软件包,它们的质量从非常差到非常差。 我对第一个版本的记忆主要是摆弄cgi脚本,并且在几乎所有用户交互中都怪异地使用元素。 较新的版本是框架集和JavaScript的怪异之处-远不建议将应用程序的功能基于JavaScript。 另一个版本由Microsoft Access数据库提供支持。

总而言之,我们意识到,如果我们想拥有一家真正可以买到甚至还不错的网上商店,我们需要定制的解决方案。 我考虑了我过去在fgen.exe及其续集方面取得的成功,更不用说我这次建立的一系列优秀网站了,例如:我的Manic Street Preachers吉他谱存档网站非常权威,并且是我的骄傲成员“ Manics网络环”(还记得网络环吗?)。 我觉得是时候该真正了解自己的能力了。 我会自己建造。 从头开始。

从头开始?! 如果那时存在开放源代码框架,我将不了解它们。 不,我有自己的计划。 我买了有关PHP和MySQL的书,并在建立新网站时开始学习这两种技术。

幸运的是,这本书以非常简单的购物车应用程序为中心示例之一。 所有部分都在那里–“ category.php”将列出所有产品类别。 “ product.php”将显示带有按钮的产品详细信息,以将其添加到购物车; 最重要的是“ cart.php”,真正的魔力将在此发生。 这显然是注定的!

我认真地遵循了这个示例,忠实地实现了所有新颖而毫无疑问的尖端技术,即那些方便的“ mysql_”函数用于数据访问; 用于构建查询的字符串连接; 将函数分成“ functions.php”文件; 包括“ header.php”和“ footer.php”以维护整个站点的一致性; 避开了面向对象方法的繁重开销(无论其真正含义是什么),而采用了快速的程序代码。 我的技能成倍增加!

像一个人的白蚁殖民地一样,我建造了塔楼并挖出了迷宫般的密码隧道。 我添加的每个新功能都使结构进一步向天空延伸,并延伸至更深的地下。 并添加我所做的功能。 客户帐户,产品等级,订单历史记录,奖励积分,优惠券代码,特价,日志记录,A / B测试,付款数据加密等等。 相互依存的庞大迷宫,各种形状和大小的功能星系,围绕着一个固定的中心枢纽“ cart.php”缓慢旋转。

经过大约八个月的发烧工作,它终于准备好了。

现在,我认识的读者,您可能希望我详细介绍一下一旦我们打开新网站的开关后,一切都变得多么壮观,可怕。 恐怕我会让你失望。

有效。

尽管我现在将其称为“最坏做法”方法,但该方法仍然有效。 每个糟糕的教程,每个反PHP博客文章-都在那里。 意大利面代码? 校验。 数据和例程的命名不一致? 校验。 演示与业务逻辑混合在一起(否, 融合) ? 校验。 魔术数字和全球数据丰盛? 校验。

对我来说,面向对象的方法只是一堆不必要的开销和样板,而我有很多错误的信息可以支持我。 我也了解测试的全部内容-几次单击您的功能,看起来不错,然后上传到生产环境! 我对其他(花哨的,过于复杂的)体系结构知之甚少,但就我而言,我的体系结构是一种非常明智(且可能更快)的工作方式。

我在所有这些事情上的正确性的证明是我用徒手和智慧从头开始编写的事实,一个运作良好且功能齐全的电子商务网站。 再者,表现出色,成功并不断扩大!

在我看来,我和撰写Amazon.com的人之间并没有太大区别。 当然,亚马逊要大得多,但是我没有理由没有理由不扩大我的平台的规模,尤其是考虑到我使用的快速的程序架构。

因此,我已经达到了程序员的技能水平。 这并不是说我对学习更多知识不感兴趣-我只是没有紧迫感。 毕竟,我构建了一些行之有效的方法。 当然,除此之外的任何事情都只是奖金,最重要的是樱桃。

遗憾的是,这种状况盛行了好几年。 我只是在做兼职工作,大部分时间都在完全不同的领域工作。 在多年的维护和偶尔添加新功能的过程中,我确实意识到自己所做的某些选择现在令人烦恼。 我注意到有时需要花费多长时间在源文件中找到所需的内容。 每次进行更改时,网站的看似无关的区域中都会出现许多小错误,这让我感到不安。

我的学习并没有完全停滞不前,但是确实缓慢地前进了。 例如,我开始了解到我使用的mysql_函数现在被认为具有风险,以至于将来的PHP版本中将不再提供支持! 很长一段时间以来,我都知道我的防水消毒程序可以弥补这些不足,因此可以消除任何恐惧。 毕竟,我几乎可以找到的每种形式的输入都尝试了各种SQL注入字符串,而且一切看起来都是笨拙的。

去年的一天,我接到了紧急电话-网站已关闭! 每个请求都导致500个内部服务器错误! 在托管公司的工程师重新启动并运行了尸体之后,进行了事后调查,结果证明我们是异国SQL注入攻击的受害者,这种攻击我从未见过(在任何情况下,我将阅读有关SQL注入的几本教程)。

好吧,我想,也许是时候换用我一直在听说的这种新型PDO了。

当我坐下来重写所有数据访问功能时,发生了深刻的事情。 我意识到这将很难。 我意识到了为什么要如此艰难。

这将是艰难的,因为这些职能分散在各地。 因为我没有真正的方式知道我是否会以某种微妙的方式破坏某些东西; 因为代码不一致,所以我必须仔细研究每个实例与上一个实例之间的细微差别。 因为很多代码与其他部分紧密结合在一起,所以当我进行更改时,它们也可能会巧妙地破坏。 简而言之,由于所有不良做法和缺乏理解导致这种庞大混乱的产生,直到现在才向我展示自己,这将变得艰难。

所有的理由,防御性的推理,无知都开始消散。 我错了。 我不是我怀疑自己是一位天才的程序员。 我是一个伪造者,以某种方式逃脱了这么长时间!

我的愚蠢举动使我大吃一惊,尽管这对我的自尊心是一击,但这也是非常宝贵的一课。 我亲身经历了痛苦的学习,这是为什么有正确的方法做事的错误方法。 这不仅仅是品味或时尚问题。 谁拥有最聪明的论点并不是问题。 正确的方法会在现实世界中产生后果,从而使您的生活(以及与您接触代码的其他人的生活)变得更好。 错误的方式会导致沮丧和浪费时间。 在这里,我不会尝试解决棘手的问题,即到底什么才是“正确的方式”。 可以说这不是我一直在做的。

我确实实现了PDO。 同时,我第一次开始使用PHPUnit。 我不想重复尝试用单元测试改造这种代码。

如今,我有意识地努力推动自己,并尽可能地学习更多。 我正在阅读程序员应该阅读的书籍。 我正在关注博客。 我在听播客。 我正在看会议视频。 我正在参加甚至在本地用户组中进行演讲。 我正在进行一些辅助项目,以挑战自己学习全新技术。 我正在尝试学习正确的做事方式。

对于所有从事这项工作的人来说,有一个重要因素对我们有利。 既然编程是一种完全抽象的尝试,那么表征许多其他领域的物质世界限制就根本不适用。 在这里,限制因素是自己。

我将用一些真实的智慧来结束这个故事。 当我开始起草这篇博客时,我刚刚完成了史蒂夫·麦康奈尔(Steve McConnell)的《 代码完整第二版 》( Code Complete Second Edition) 。 在本书的最后,第825页的底部,他写了一些东西,完美地表达了我写这篇文章时所想到的确切情感。 也许这说明他能够用两句话进行交流,这使我花了两千个单词:

“无论是初学者还是中级人士,都没有罪过。 成为有能力的程序员而不是领导者没有罪。 罪魁祸首是您知道自己需要做些什么才能提高自己的水平,成为初学者或中级生。


最初在 www.michaelbromley.co.uk上 发布