我在20岁出头的时候就犯了这些错误,而且我都犯了这些错误。但是我一次又一次地犯了大多数错误。码字的人还在码字,新手总是在犯错。有时,即使是经验丰富的老手也会犯新手也会犯的错误。但大多数时候都是同一个错误。这些错误基本上是战略性的。你应该首先用版本控制来管理你的代码,但即使你管理得很好,你仍然会犯这些战略性错误并像孙子一样受苦。菜鸟错误1:使用Make或Shell作为构建工具如果你不是使用C或C++语言,Make就不是那么适用了。Make总是为每个文件重新加载一个编译器进程。大多数现代语言都没有设计成在单独的进程中加载??每个文件,如果你想用Make来解决像Java这样的语言的依赖问题,这几乎是不可能的。我曾经在一家大型网络设备公司工作,通过将其构建切换到Ant(一种Java构建工具),构建过程从3小时缩短到20秒。以shell脚本结束也是一个糟糕的举动。最近在写一个实验室的shell框架,因为不想让大家为了一个小实验室就去弄一整套Java工具集。我认为这是一个很好的举动,但我真的没有做一件愚蠢的事情(一如既往),因为它所依赖的这个软件的下一个版本打破了一切(一如既往)。如果我吸收它并提供一个现代构建工具,它应该能够更新依赖项。菜鸟错误2:使用IDE作为构建工具大多数IDE都有一些神奇的构建/部署功能。最初这可能是一件好事,但仅用于测试您自己的代码就很棒了。但是你最终会遇到依赖关系和其他人编写你的代码。然后你会想知道为什么它是写在这个设备上而不是另一个设备上的。您需要一个IDE之外的可重现构建工具,它应该能够在持续集成工具上运行。菜鸟错误#3:终止AWS实例“终止”在AWS中意味着“删除所有内容”——而不是在大多数其他工具中“终止进程”。在我参与的第一个AmazonWebServices项目中,一位开发人员推测可以读取属性的工具应该可以安全运行。不幸的是,如果您不小心读取了终止属性,它会立即终止该实例。他运行了一切,然后终止了100多个实例。AWS大大减少了犯这种错误的机会,但实际上“终止”应该称为“永久销毁”,因为开发人员终止进程时知道它们可以重新启动。但是,如果您终止一个AWS实例,您将永远失去它们。菜鸟错误4:测试你关心的一切。上面的开发者也很容易犯菜鸟问题:他测试我们关心的一切。正确的做法是他应该创建一个单独的实例并在这个实例上进行测试。即使您认为自己正在做的事情是无害的,您仍然应该在安全的环境中测试您的假设。菜鸟错误5:追求绝对的数据完整性我见过不止一个开发人员使用READ_SERIALIZED和表锁,因为他们极度追求数据完整性。当然还有许多其他生产锁的困扰。其实都属于schema设计不好,对数据、并发、风险的理解不切实际。RookieMistake6:PuttingYourCodeIntoHTML或者PuttingHTMLIntoYourCode无论是ASP、JSP、PHP、CGI还是DirectCode,总有办法把代码放到HTML里面,而且几乎总有办法写出类似out.println的东西(“这是一个糟糕的主意”);。我曾经这样做过一段时间——大约在1995年……但现在有更多的现代排列。我见过人们用JavaScript做一些非常恶心的事情,这有点似曾相识。当然我们可以找到很多更好的方法,例如:标签库,事件处理程序,任何东西,但是HTML代码不好!菜鸟错误七:使用万能列表。我承认,当我不确定数据是如何形成的时,我会在原型代码中这样做,但一旦我知道这一点,我很快就会放弃这种做法。使用高级语言的人一般都会犯“this”这样的错误。“这个”有什么问题?基本上,他们不使用映射、关系树或集合,而是将所有内容列在一张表上,然后自己组织所有内容。更糟糕的是,您选择一个数组返回列表,并继续插入靠近中心的某个位置。这种代码的问题在于它往往会导致生产。但是,我想在某些时候,最好在操作系统中对垃圾收集器或内存管理进行负载测试!!!菜鸟错误8:I<3继承哇!在上完分解课程后,您决定第一步是将所有内容组织到一个独特的类层次结构中。你忘记了存储东西或让你的项目工作——不,你只是想让人们了解你的大脑是如何工作的,并记住一组丑陋的平行类结构。我的天啊!你最好快点去DMTF(DesktopManagementTaskForceDesktopManagementTaskForce)工作!换句话说,你可以用你的低劣标准让每个人都头疼。但是我劝你***不要这样做!菜鸟错误9:I<3函数式你刚刚学到了关于函数式编程的所有知识。你认为面向对象编程是一个大错误,一切都应该是无状态的和函数式的。好吧,我只能说你太棒了!除非我需要向代码中添加更多内容,否则如果我必须解开每一个函数调用来添加它,那么你就失败了。你失败得很惨。菜鸟错误10:I<3Global很难编码,很难思考,很难决定事物的边界。而你却选择不去挣扎,直接选择那些最流行的界线。你浪费内存,你的代码不能并行化,有线程冲突。但是到时候不要试图置身事外~RookieMistake11:UsingHugeObjects曾经,当我和一个新实习生一起工作的时候。我告诉他这份工作可以朝几个方向发展。其中之一是他们可能会在会话中抛出一个巨大的对象,然后想知道为什么“集群不工作”以及为什么他们会耗尽内存。果然,我们找到了一个包含数百个状态变量和方法的类文件来替换它们。当然,他们正在将其推入会议。这些东西大部分都不需要在session中完成,基本都是手写形成一个二级数??据库缓存。这是对内存的巨大浪费,复制它不仅浪费内存,还会产生代价高昂的不必要的会话重复。菜鸟错误12:在1000个物体上死亡就像你可以拥有太少,也可以拥有太多。在1000个对象上死掉往往是菜鸟错误8:i<3inheritance,但我见过没有继承的类似情况。如果您所有的类文件都少于100行代码,但您有数百行代码,那也是错误的……菜鸟错误13:我可以合并线程吗?大多数应用程序代码可以使用单线程世界视图创作。但是当您开始编写应用程序的服务器、数据库或其他低级代码时,您不能这样做。大多数商业软件都可以用类似的低级代码来编写——所以你不必写这些,直接上多线程就行了。所以***别写了。尤其是现在无需编写线程代码就可以更轻松地分发和利用线程。查看Spark的工作原理:您不必将杂乱的线程编织在一起。菜鸟错误14:行锁的使用这对于SQL服务器和DB2用户来说确实是个大问题。默认数据库设置是针对大多数平台上的行锁定(DB2在其他平台上进行页锁定,这肯定更差)。Oracle的默认设置没有那么傻。网上一直有关于行锁和快照隔离的争论。行锁理论上效率更高——但你不能有超过一个有争议的线程(即:大多数软件的现状)。更不用说大多数开发人员不知道“快照隔离”的实际含义,也不知道如何启用它。所以作业经常在轻负载下运行,因为它们使用行锁b。下面我们来了解一下快照隔离的含义和用法。切勿使用行锁。新手错误15:序列的使用跟我来:我不会将数据库序列用于特殊键,除非我真的需要序列化的值(这种情况很少见)。这就是锁定和远程处理在同一个包中是一件很痛苦的事情!您可以使用由安全随机生成器支持的128位UUID,而不是使用数据库序列生成器对所有内容进行单线程处理。如果你害怕被复制,要么你数学不好,要么你不像重视你的生命那样重视数据。即使生成了万亿ID,你还是很可能被流星砸中脑袋~希望你尊重自己,尊重自己的职业,尊重追随你的维护者。所以不要做任何愚蠢的事情,但即使您可能是一位经验丰富的开发人员,您有时还是会犯这些愚蠢的错误。
