保护信息免受物理性威胁

    无论您为您的计算机筑起数据屏障付出了多大的努力,您仍然可能在某天醒来,发现计算机或里面的信息副本因各种不幸的意外或蓄意行为而丢失、被盗或受损。任何意外,电源冲击、忘记关上窗户或打翻一杯咖啡,都可能导致您所有数据丢失并且无法继续使用您的计算机。谨慎的风险评估、坚持不懈地维持健康的计算机作业环境,以及书面化的安全策略可以帮助您避免此类灾难。

设定场景

Shingai 和 Rudo 是一对年长夫妇,他们长年帮助津巴布韦的艾滋病感染者维持适当的药物治疗。他们正在申请资助给他们的办公室购置新计算机和网络设备。由于他们生活在一个政治动荡、基础设施匮乏的地区,他们和资助者都希望能够确保新硬件设施的安全,不仅不会受到黑客和病毒的侵害,而且也不会遭遇没收、雷暴、电涌及其他此类灾害的困扰。一旦成功申请到资助,他们就请当地的计算机技术员 Otto 帮忙设计一套行动方案,来加强准备购置的新计算机和网络设备的物理安全。

 

 

您将从本章节学到的内容

  • 更多有关您的计算机以及储存在计算机上的信息所面临的物理威胁
  • 如何最好地保护您的计算机设备免受这些威胁影响。
  • 如何为计算机与网络设备创建健康的作业环境。
  • 在为您的办公室计算机制定安全计划时应该考虑什么。


风险评估

 

    许多组织团体都低估了保持办公室与设备的物理安全的重要性。于是,他们往往缺乏一套清晰的策略,用来描述应该采取何种措施来避免计算机和备份存储设备遭遇失窃、恶劣天气、意外事件以及其他物理威胁。显然,这些策略非常重要,但是要把它们适当地制定出来可能比想象中复杂得多。比如说,许多组织都给办公室安装了质量很好的门锁,也许还有保险窗,但如果他们不注意钥匙的配制数量,以及什么人持有这些钥匙,那他们的敏感资料仍然易受侵害。

Shingai: 我们想把一份安全策略的摘要写到申请书里,但要确保这个策略本身足够完善。我们都应该写些什么内容呢?

Otto: 我恐怕我无法推荐一套“放之四海而皆准”的解决方案来应对物理安全所面临的挑战。一套好策略的详情一般都要根据某个特定组织的个体环境而定。不过,我倒是有一个大体上的建议:当您尝试制定一个计划时,您必须非常仔细地观察您的工作环境,对薄弱环节的所在以及如何加强这些环节,要进行富有创造性的思考。

 

 

 

 

 

 

 

    在评估您或您的组织所面临的风险与安全漏洞时,您必须估计您的数据受到的威胁可能来自若干不同的层面。

  • 要考虑您使用的通信渠道,以及您是如何使用它们的。包括信件、传真、固定电话、移动电话、电子邮件以及Skype

  • 要考虑您如何储存重要资料。计算机硬盘、电子邮件和网络服务器、U盘、外置硬盘、CD和DVD、移动电话、打印纸张以及手写的便条,都是可能的方式。

  • 要考虑存放这些物件的实际位置。它们可能位于办公室、家里、后院的垃圾桶中,又或者,越来越普遍的情况是“放在互联网上”。在最后这种情况中,要界定一份特定资料的物理位置,恐怕是很困难的。

    记住,同一份资料可能在不同的层面存在隐患。就像您想依靠反病毒软件来保护U盘的内容不受恶意软件的侵害,您还必须依靠一份详细的物理安全计划来避免这份资料遭到盗窃、丢失或毁坏。有些安保实践,例如拥有一个良好的异地备份策略,对于避免数据威胁和物理威胁都是有好处的,而其他实践则显然更具针对性。

当您要决定是把U盘放在口袋里还是密封于行李底部的塑料袋里,您就是在作一个有关物理安全的决定,尽管您试图保护的资料是数字化的。通常,正确的策略在很大程度上视实际情况而定。您是要穿行于城镇之间,还是要跨越边境?会有别人帮您提包吗?是否正在下雨?这些就是当您要作此种决定时应该考虑的问题。


保护您的信息免受物理入侵

 

    伺机接触您的敏感资料的不怀好意的人是一种重大的物理威胁。如果您以为这就是您的信息安全所面临的唯一威胁的话,那您就错了,但忽视它就更是目光短浅,大错特错了。您可以采取一些步骤来降低物理侵扰的风险。以下列出的分类和大部分建议都既适用于家庭也适用于办公室。您应该以此为基础,制定出与您个人具体的物理安全状况相适应的策略。

办公室周围

  • 要了解您的邻居。根据您的国家和邻里关系的安全状况,有可能出现以下其中一种情况:要么把他们变成帮助您照看办公室的盟友;要么把他们加入到您的潜在威胁列表中,成为安全计划必须要解决的问题。

  • 检查您如何保护所有门、窗以及其他能通往您办公室的入口。

  • 考虑安装一个监控摄像头或者动作感应警报器。

  • 尝试设立一个接待处,在访客进入办公室之前,先在那里接见他们。设立一个与您的日常工作区分隔开的会议室。

办公室里

  • 把网络线缆安装在室内以便保护它们。

  • 服务器路由器交换器, 集线器和调制解调器等网络设备锁进安全的房间或者机柜。能够在实际接触这些设备的入侵者可以安装恶意软件,这样一来,他即便离开,也仍然可以窃取数据或攻击您网络上的其他计算机。

  • 如果您有无线网络,保护您的接入点是至关重要的,这样入侵者就不能加入您的网络或监控您的通信。如果您使用不安全的无线网络,那么,在您附近任何一个有笔记本电脑的人都可能成为潜在的入侵者。这样来定义“物理性”确实有些不寻常,但这帮助您考虑到,能够监控您的无线网络的不怀好意的人,相当于偷偷潜入了您的办公室,插上网线接入到您的网络上。根据您的接入点硬件和软件的具体情况,用以保障无线网络安全所需的步骤可能有所不同,但通常都不难解决。

工作的时候

  • 为了避免别人看到屏幕上正在显示的内容,您应该留意计算机屏幕放置的地点,无论放在办公桌上还是当您离开办公室时,都要谨慎。在办公室室内的话,意味着要注意窗户的位置和敞开的门,如有宾客等候处,也要注意。

  • 大多数台式计算机机箱都有一个扣槽,您可以添加一个挂锁让任何没有钥匙的人无法打开它。如果您办公室里有这样的机箱,您应该把它们锁上,这样入侵者就不能擅自改动内部的硬件。在购买新的计算机时您也可以把这一功能考虑进去。

  • 如有可能,应使用电脑锁来防止入侵者偷走整台计算机。 这对可以藏在包里或大衣之下的笔记本电脑和小型台式机来说尤为重要。

有关物理安全的软件及设置

  • 确保当您重启计算机时,它会在允许您运行软件和访问文件之前要求您输入密码。如果它不要求,您可以在 Windows 中启用这个功能。点击“开始”菜单,选择“控制面板”,然后双击“用户帐户”。在“用户帐户”窗口选择您自己的帐户,然后点击“创建密码”。选择一个安全的密码,如在第三章:如何创建和维护良好的密码中所论述的。输入您的密码,确认一遍,再点击“创建密码”。

  • 在您的计算机的BIOS基本输入输出系统中有几项有关物理安全的设置。首先,您应该把计算机设置为禁止从软盘驱动器、CD或DVD驱动器启动。其次,您应该为BIOS本身设置一个密码,这样入侵者就不能简单地撤销之前的设置。再次强调,请确保选择一个安全的密码。

  • 如果您使用一个在第三章里说到的安全密码数据库来为特定的计算机储存您的 Windows 或 BIOS 密码,请切记不要把唯一的数据库副本保存在该台计算机上。

  • 养成每次当您离开计算机前都把帐户锁定的习惯。在 Windows 上,您可以按住 Windows 标志键然后按 L 键来快速锁定。正如前面所说的,只有给帐户设置了密码,此功能才会生效。

  • 给办公室里的计算机和储存设备上的敏感信息加密。请参看第四章:如何保护您计算机上的敏感文件了解更多详情和相关的上手指南。

Rudo: 在BIOS里捣鼓,我有点紧张。如果操作出错,我会把电脑弄坏吗?

Otto: 当然会,至少可能会死机一小会儿。实际上,你需要改变的设定都很简单,但BIOS的界面本身可能有点吓人,而且如果操作失当,有可能会导致电脑暂时无法启动。一般来说,如果你对BIOS的操作感到不安,你应该请电脑经验更丰富的人来帮忙。

 

 

 

 

 

 

 

便携设备

  • 把您的笔记本电脑、移动电话和其他包含敏感信息的便携设备随时带在身上,特别是当您去旅行或住在旅馆里的时候。旅行时带上笔记本电脑电脑锁是个不错的主意,尽管有时候不容易找到适当的东西栓住。记住,小偷往往选择就餐时间作案,他们大多会在房间可能没人的时段里到房间翻找笔记本电脑。

  • 如果你拥有一台笔记本电脑,或者手持计算机设备例如掌上电脑(PDA),尽量避免把它们显露出来。没有必要让小偷知道你带了这么多贵重的硬件,或者让想获取您资料的人知道您包里有一个装满数据信息的硬盘。避免在公共场合使用您的便携设备,最好把手提电脑装在看上去不像手提电脑包的包里。 

 

 

 

 

 

 

 

 

 

为您的计算机硬件维持一个健康的环境

 

    就跟许多电子设备一样,计算机也相当敏感。它们对不稳定的供电、极端温度、灰尘、潮湿或者机械压力会适应不良。您可以采取一些措施来保护您的计算机和网络设备免受这些威胁:

  • 电力问题,如电涌、全面停电和部分停电,可能导致计算机受到物理损害。这种不规则性能使硬盘“崩溃”,损毁它里面包含的信息,或者对计算机里的电子部件造成物理损害。

  • 如有能力,您应该给办公室里重要的计算机安装不间断电源(UPSs),UPS能在停电时提供临时的电力。

  • 如果认为 UPSs 不适宜或太昂贵,您还可以使用电源滤波器或电涌保护装置,它们中的任意一个都可以帮您避免电涌造成的损害。

  • 在连接重要的设备前,先测试好您的供电网络。尽量使用三孔的电源插座,它们当中有一条接连“地线”。另外,如有可能,在冒险插上计算机之前先插上廉价的设备,如电灯和电风扇,先试用一两天来看看电力系统的运行情况。

  • 为了避免发生意外,不要把重要的硬件放置在通道、接待处或其他容易被接近的地点。UPS、电源滤波器、电涌保护装置、插线板和电源延长线,特别是那些与服务器和网络设备连接起来的装置,应该放在适当的位置,从而不会因意外失误而关闭。

  • 如果您能买到高质量的计算机线缆、插线板和延长线,您应该购买足够数量供整个办公室使用并且额外留一些作为备用。那些会从墙上松脱下来的、与插头接触不良的、时常产生火花的插线板不仅烦人,还会对连接在上面的计算机的物理安全造成损害。有些用户拿它们没办法,会用胶带把接触不良的插头绑紧在会产生火花的插线板上,这就留下了明显的火灾隐患。

  • 如果您把任何计算机放在机柜里,请确保机柜足够通风,否则计算机可能过热。

  • 计算机设备不应该放置在散热器、排气口,空调或其他管道系统附近。

Shingai: 其实今年早些时候我们刚解决了一些这样的问题。我们花了几个月时间去找不会从电脑后部脱落的线缆。

Otto: 还有看起来不至于造成地毯着火的插线板呢?

Shingai: 那也找了。最后,Rudo 不得不从约翰内斯堡带了些回来。别忘了,这里供电状况本身还是很不稳定的,但至少设备还比较好用。 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

制定您的物理安全策略

    一旦您对个人或您的组织所面临的威胁与漏洞作出评估,您就必须考虑可以采取哪些步骤来改善您的物理安全。您应该制定一份详细的安全策略 ,把这些步骤一一写下来。这个书面文件将会对您自己、您的同事和刚加入组织的新人起到指引作用。它同时还应该包括一份清单,说明在各种不同的物理安全紧急情形下应当采取何种措施。每位相关人员都应该花时间阅读、执行并保持这些安全标准。也应该鼓励他们就如何改善这个文件提出问题和建议。

根据具体情况,您的物理安全策略应该包含不同的部分:

  • 一份办公室通行策略,列明了各个警报系统、有哪些钥匙、谁持有这些钥匙、什么时候允许访客进入、跟谁签定了清洁合约以及其他此类问题。
  • 一份关于办公室的哪个区域是仅限授权人士使用的策略。
  • 一份设备的详细清单,包括序列号和物理性描述。
  • 一份对于包含敏感信息的纸张垃圾的安全废置方案。
  • 相关应急程序:
  • 如果敏感信息遭泄露或被错误放置时应该通知谁。
  • 当发生火灾、洪水或其他自然灾害时应该联系谁。
  • 如何进行某条钥匙的紧急重配。
  • 如何联系提供电力、水利、或网络服务的公司或组织。
  • 如何从您的异地备份中恢复数据。您可以在第五章:如何挽救信息损失中找到更详细的备份建议。

    您的安全策略应该定期复审和修改,以反映自上一次复审后作出的任何策略变化。还有,在备份其他重要数据的同时,不要忘记备份您的安全策略文档。更多有关制定安全策略的信息,请参看延伸阅读部分。

延伸阅读

IT行业常见职位职业路线图

  我曾经面试过一些计算机相关毕业的应届生,问他希望做什么工作时,他回答只要是软件开发就好了,再细问一下你了解到的软件开发是怎样的?除了软件开发,还有其它什么工作?就答不出来了。

  这里我先给出一张IT知识结构图,然后再给出一张职业路线图,希望在迷途中的同学们找到努力的方向!

  IT知识结构图

  


IT知识结构图

 

  说明:

  1.下面的知识是基础,基础不打好,上面的知识不容易掌握。

  2.最上面两层是职位,下面的职位是上面职位的基础,必须有下面职位的经验,才可能做好上层职位的工作。

  3.如果你发现自己工作力不从心,你可以对照这个图,看看是不是自己的下层建筑哪里出了问题。

  如果你的语文学得不好,语言表达能力特别是书面表达能力低,你很可能会在很多职位上的工作出问题。

  如果你数学、物理相关知识没有学好,你很可能不能胜任游戏物理引擎的开发工作。

  如果你外语学不好,你就别想进外企。

  如果你计算机基础知识没有学好,你可能无法胜任大型系统的设计工作。

  如果你没有做过开发、测试、实施等专业类工作,你将很难胜任项目管理、系统分析等综合性工作。

  各位同学,打好你的基础,如果学校期间没能学好基础知识,那么现在开始就要恶补!

  职业路线图

  计算机相关专业学的知识很多,将来工作并不是只有编程一条路,也不是所有人都适合编程的。

  


职业规划路线

  说明:

  1. 实线表示比较切实可行的职业规划路线。
  2. 虚线表示勉强可行,但不能保证能走长远,如需要长远发展,还需要恶补相关知识。
  3. QA、过程改进工作,绝对不适合一毕业就从事,这些工作难度不亚于系统分析、项目管理、产品经理的工作。
  4. 有系统分析、项目管理、产品经理相关工作经验基础上,才适合转做QA、过程改进。
  5. 编码、测试、设计工作做得不好,或者觉得自己不合适做,不要转做QA或过程改进的工作。
  6. 设计不是纸上谈兵,不懂技术不曾写过代码就去做软件设计,那是匪夷所思的事情。
  7. IT行业基本上是没有安逸工作的,如果求安逸工作,那就不要考虑IT行业吧。

 

  以上职业路线图并不严格和全面,仅供参考!

  IT 行业大蓝图

  


IT 行业大蓝图-1


IT 行业大蓝图-2

 

  


IT 行业大蓝图-3

 

文章来源:http://blog.csdn.net/fireball1975/article/details/12710643

电话诈骗中,骗子存在哪些漏洞?

文章来源:发自知乎专栏「社会安全观察 
天上午在《同事亲历的一次电话诈骗》, 这里看见@大风 在专栏里发了一篇关于自己同事被诈骗的经过,我说说这个事件里骗子存在的几个漏洞,做一个简单的科普。


1.别人盗用你的身份信息开卡之后欠费了,银行并不知道这个情况,那么正常的情况应当是寄账单到你家。如果欠费金额较大,有的银行会直接人工电话通知你,出现电子音的情况很少。我所知道的招行和兴业似乎是有的。还有个很简单的小方法可以识破这一招:电话诈骗如果有电子音提示你按键操作,那么你就故意按错它提示你的按键,如果它依然接入人工服务或者完成了操作,那必定是诈骗电话无疑。


2.公安机关认定你是嫌疑人的话,会直接过去抓捕你,不会在电话里和你瞎扯半天。


3.没有电话笔录这个东西。所有的笔录都需要画押和签名,除非你是文盲或者拒签。没有电话笔录这个东西。


4.综合前面两点,我可以明确地告诉你,如果你之前没有报过案件,或者没有案底,或者近期内没有丢失过物品,那么公安机关不会主动联系你。


5.网上能够找到改号软件,主叫电话可以改成任何的号码,包括银行和公安局的。


6.公安局并不需要除了你身份证以外的任何信息,我们可以直接从后台调取,并且如果你真的有犯罪嫌疑,我们又掌握了实际的证据。那么我们可以在向上级提交报告书后查找你名下的银行卡信息以及冻结你的银行账号。因此,通过打钱来确定你的银行卡信息这一点就更可疑了。


7.如果你不是政府人员,那么检察院不会介入逮捕前的侦查阶段。


8.没有刑事拘捕证这个东西。要么是公安机关的拘留证,要么是公安机关的逮捕证,要么是检察院的逮捕决定书。拘捕指的是拘留和逮捕,现实办案之中没有这种说法,更不可能写在法律文书上。一般的刑事案件的办案流程是:公安机关出具拘留证,刑事拘留七天或者三十天内,再向检察院呈请批准逮捕犯罪嫌疑人,而检察院审查过后只能出具批准逮捕决定书到公安机关,再由公安机关出具逮捕证。


9.能上互联网的电脑上不了公检法的内网。一机不能连二网。普通人没有权限接触公检法的内网。


10.网络上花钱是可以买的到你的身份证信息的,有些骗子直接用你身份证的照片黏贴到他们制作的各种拘留证,逮捕证上,比较唬人。但是问题在于各种逮捕证拘留证都是没有照片的。


11.除了购物网站,任何需要你输入银行卡和密码的人和网站都是骗子。因为银行,公安机关不需要你的密码就能干很多事情。


12.如果现实中公安机关是这样办案的,那么破案率还要低上许多倍。真的办案民警,一般不会这么热心,巡警之类的就不一定。具体的警察办案过程我以后会做一个简单的科普。


上述所有信息,记住关键的三条:


1.不要给任何人你的银行卡和密码。


2.没有电话笔录这种东西。


3.执法机关会直接抓捕你,不会和你瞎扯太多。

我跳槽是因为他们的显示器更大

好的技术人员向往具有很强的企业技术文化氛围的工作场所。但如何你能从外部看清一个企业的技术文化状态?这里要讲的是我使用的两个简单而好用的参考指标。

首先我要讲讲“企业技术文化”这个词指的是什么。它是指技术人员在一个企业内受重视的程度和重要性。它能从一些事情上体现出来:

  • 公司里的决策是如何制定出来的?在一个具有很好的技术文化的公司里,技术人员参与要做什么、何时做、由谁来做等决策制定。并不是说有最终拍板权,而是有真正的发言权。
  • 对开发软件这个工种是否尊重?开发软件是一种创造性的工作,这种工作需要有合适的时间和合适的地点。有些项目很难预测出究竟要多久才能开发出来,而公司能认可这种情况。
  • 基础设施。当需要把精力放到非软件特征功能方面的事情上时,明白事理的人(技术人员,经理)需要花多少的口舌才能让老板知道这些工作的重要性?这通常是指一些运行时系统里的工作(比如扩充消息队列容量)或后勤服务工作(例如编译系统或版本控制工作)。

不幸的是,想通过一次交谈咨询就把这种底细都摸清是不现实的,除非你在这个公司内部有受信任、知道内情的线人。 继续阅读我跳槽是因为他们的显示器更大

码农故事:一位中级程序员的自白

我是一名中级程序员。

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

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

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

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

在我自己看来,我当时是一个知识渊博并且经验丰富的程序员。在我不到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页的底部,作者准确地描绘了我在写这篇文章时的想法。可以说他只用了两句话就表达我在这数千字里想表达的东西:

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

原文链接: Michael Bromley   翻译: 伯乐在线 – 王伯
译文链接: http://blog.jobbole.com/72179/