快手粉丝数量显示不对14559040帮我涨涨粉私数量,免费关系就点呗谢谢大家了,666

比特客户端
您的位置:
详解大数据
详解大数据
详解大数据
详解大数据
Java程序员不该有的6种陋习
关键字:Java
  只有在学会处理异常之后,我们才能说自己是一个合格的java程序员。只有在摆脱了以下六种异常处理的陋习之后,才能威慑一下刚毕业的小菜鸟。
  现在就来测试一下大家对异常的掌握程度。不用担心,事实上,这些不合理的设计很容易看出来。那么,以下六种不合理的代码,大家能看出每一种的问题出在哪儿吗?
  OutputStreamWriter out = ...
  java.sql.Connection conn = ...
  try { // ⑸
  Statement stat = conn.createStatement();
  ResultSet rs = stat.executeQuery(
  "select uid, name from user");
  while (rs.next())
  out.println("ID:" + rs.getString("uid") // ⑹
  + ",姓名:" + rs.getString("name"));
  conn.close(); // ⑶
  out.close();
  catch(Exception ex) // ⑵
  ex.printStackTrace(); //⑴,⑷
  作为一个Java程序员,你至少应该能够找出两个问题。但是,如果你不能找出全部六个问题,请继续阅读本文。
  本文讨论的不是Java异常处理的一般性原则,因为这些原则已经被大多数人熟知。我们要做的是分析各种可称为“反例”(anti-pattern)的违背优秀编码规范的常见坏习惯,帮助读者熟悉这些典型的反面例子,从而能够在实际工作中敏锐地察觉和避免这些问题。
  反例之一:丢弃异常
  代码:15行-18行。
  这段代码捕获了异常却不作任何处理,可以算得上Java编程中的杀手。从问题出现的频繁程度和祸害程度来看,它也许可以和C/C++程序的一个恶名远播的问题相提并论??不检查缓冲区是否已满。如果你看到了这种丢弃(而不是抛出)异常的情况,可以百分之九十九地肯定代码存在问题(在极少数情况下,这段代码有存在的理由,但最好加上完整的注释,以免引起别人误解)。
  这段代码的错误在于,异常(几乎)总是意味着某些事情不对劲了,或者说至少发生了某些不寻常的事情,我们不应该对程序发出的求救信号保持沉默和无动于衷。调用一下printStackTrace算不上“处理异常”。不错,调用printStackTrace对调试程序有帮助,但程序调试阶段结束之后,printStackTrace就不应再在异常处理中担负主要责任了。
  丢弃异常的情形非常普遍。打开JDK的ThreadDeath类的文档,可以看到下面这段说明:“特别地,虽然出现ThreadDeath是一种‘正常的情形’,但ThreadDeath类是Error而不是Exception的子类,因为许多应用会捕获所有的Exception然后丢弃它不再理睬。”这段话的意思是,虽然ThreadDeath代表的是一种普通的问题,但鉴于许多应用会试图捕获所有异常然后不予以适当的处理,所以JDK把 ThreadDeath定义成了Error的子类,因为Error类代表的是一般的应用不应该去捕获的严重问题。可见,丢弃异常这一坏习惯是如此常见,它甚至已经影响到了Java本身的设计。
  那么,应该怎样改正呢?主要有四个选择:
  1、处理异常。针对该异常采取一些行动,例如修正问题、提醒某个人或进行其他一些处理,要根据具体的情形确定应该采取的动作。再次说明,调用printStackTrace算不上已经“处理好了异常”。
  2、重新抛出异常。处理异常的代码在分析异常之后,认为自己不能处理它,重新抛出异常也不失为一种选择。
  3、把该异常转换成另一种异常。大多数情况下,这是指把一个低级的异常转换成应用级的异常(其更容易被用户了解的异常)。
  4、不要捕获异常。
  结论一:既然捕获了异常,就要对它进行适当的处理。不要捕获异常之后又把它丢弃,不予理睬。
  反例之二:不指定具体的异常
  代码:15行。
  许多时候人们会被这样一种“美妙的”想法吸引:用一个catch语句捕获所有的异常。最常见的情形就是使用catch(Exceptionex)语句。但实际上,在绝大多数情况下,这种做法不值得提倡。为什么呢?
  要理解其原因,我们必须回顾一下catch语句的用途。catch语句表示我们预期会出现某种异常,而且希望能够处理该异常。异常类的作用就是告诉Java编译器我们想要处理的是哪一种异常。由于绝大多数异常都直接或间接从java.lang.Exception派生,catch(Exceptionex)就相当于说我们想要处理几乎所有的异常。
  再来前面的代码例子。我们真正想要捕获的异常是什么呢?最明显的一个是SQLException,这是JDBC操作中常见的异常。另一个可能的异常是IOException,因为它要操作OutputStreamWriter.显然,在同一个catch块中处理这两种截然不同的异常是不合适的。如果用两个catch块分别捕获SQLException和IOException就要好多了。这就是说,catch语句应当尽量指定具体的异常类型,而不应该指定涵盖范围太广的Exception类。
  另一方面,除了这两个特定的异常,还有其他许多异常也可能出现。例如,如果由于某种原因,executeQuery返回了null,该怎么办?答案是让它们继续抛出,即不必捕获也不必处理。实际上,我们不能也不应该去捕获可能出现的所有异常,程序的其他地方还有捕获异常的机会??直至最后由 JVM处理。
  结论二:在catch语句中尽可能指定具体的异常类型,必要时使用多个catch.不要试图处理所有可能出现的异常。
  反例之三:占用资源不释放
  代码:3行-14行。
  异常改变了程序正常的执行流程。这个道理虽然简单,却常常被人们忽视。如果程序用到了文件、Socket、JDBC连接之类的资源,即使遇到了异常,也要正确释放占用的资源。为此,Java提供了一个简化这类操作的关键词finally.
  finally是样好东西:不管是否出现了异常,Finally保证在try/catch/finally块结束之前,执行清理任务的代码总是有机会执行。遗憾的是有些人却不习惯使用finally.
  当然,编写finally块应当多加小心,特别是要注意在finally块之内抛出的异常??这是执行清理任务的,尽量不要再有难以处理的错误。
  结论三:保证所有资源都被正确释放。充分运用finally关键词。
  反例之四:不说明异常的详细信息
  代码:3行-18行。
  仔细观察这段代码:如果循环内部出现了异常,会发生什么事情?我们可以得到足够的信息判断循环内部出错的原因吗?不能。我们只能知道当前正在处理的类发生了某种错误,但却不能获得任何信息判断导致当前错误的原因。
  printStackTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程,但只提供了一些最基本的信息,未能说明实际导致错误的原因,同时也不易解读。
  因此,在出现异常时,最好能够提供一些文字信息,例如当前正在执行的类、方法和其他状态信息,包括以一种更适合阅读的方式整理和组织printStackTrace提供的信息。
  结论四:在异常处理模块中提供适量的错误原因信息,组织错误信息使其易于理解和阅读。
  反例之五:过于庞大的try块
  代码:3行-14行。
  经常可以看到有人把大量的代码放入单个try块,实际上这不是好习惯。这种现象之所以常见,原因就在于有些人图省事,不愿花时间分析一大块代码中哪几行代码会抛出异常、异常的具体类型是什么。把大量的语句装入单个巨大的try块就象是出门旅游时把所有日常用品塞入一个大箱子,虽然东西是带上了,但要找出来可不容易。
  一些新手常常把大量的代码放入单个try块,然后再在catch语句中声明Exception,而不是分离各个可能出现异常的段落并分别捕获其异常。这种做法为分析程序抛出异常的原因带来了困难,因为一大段代码中有太多的地方可能抛出Exception.
  结论五:尽量减小try块的体积。
  反例之六:输出数据不完整
  代码:7行-11行。
  不完整的数据是Java程序的隐形杀手。仔细观察这段代码,考虑一下如果循环的中间抛出了异常,会发生什么事情。循环的执行当然是要被打断的,其次,catch块会执行??就这些,再也没有其他动作了。已经输出的数据怎么办?使用这些数据的人或设备将收到一份不完整的(因而也是错误的)数据,却得不到任何有关这份数据是否完整的提示。对于有些系统来说,数据不完整可能比系统停止运行带来更大的损失。
  较为理想的处置办法是向输出设备写一些信息,声明数据的不完整性;另一种可能有效的办法是,先缓冲要输出的数据,准备好全部数据之后再一次性输出。
  结论六:全面考虑可能出现的异常以及这些异常对执行流程的影响。
  改写后的代码
  根据上面的讨论,下面给出改写后的代码。也许有人会说它稍微有点?嗦,但是它有了比较完备的异常处理机制。
  OutputStreamWriter out = ...
  java.sql.Connection conn = ...
  Statement stat = conn.createStatement();
  ResultSet rs = stat.executeQuery(
  "select uid, name from user");
  while (rs.next())
  out.println("ID:" + rs.getString("uid") + ",姓名: " + rs.getString("name"));
  catch(SQLException sqlex)
  out.println("警告:数据不完整");
  throw new ApplicationException("读取数据时出现SQL错误", sqlex);
  catch(IOException ioex)
  throw new ApplicationException("写入数据时出现IO错误", ioex);
  finally
  if (conn != null) {
  conn.close();
  catch(SQLException sqlex2)
  System.err(this.getClass().getName() + ".mymethod - 不能关闭连接: " + sqlex2.toString());
  if (out != null) {
  out.close();
  catch(IOException ioex2)
  System.err(this.getClass().getName() + ".mymethod - 不能关闭输出文件" + ioex2.toString());
  本文的结论不是放之四海皆准的教条,有时常识和经验才是最好的老师。如果你对自己的做法没有百分之百的信心,务必加上详细、全面的注释。
  另一方面,不要笑话这些错误,不妨问问你自己是否真地彻底摆脱了这些坏习惯。即使最有经验的程序员偶尔也会误入歧途,原因很简单,因为它们确确实实带来了“方便”。所有这些反例看作Java编程世界的恶魔,它们美丽动人,无孔不入,时刻诱惑着你。也许有人会认为这些都属于鸡皮蒜毛的小事,不足挂齿,但请记住:勿以恶小而为之,勿以善小而不为。
[ 责任编辑:之极 ]
去年,手机江湖里的竞争格局还是…
甲骨文的云战略已经完成第一阶段…
软件信息化周刊
比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。
商务办公周刊
比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!
比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。
服务器周刊
比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。
比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。
比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。
新闻中心热点推荐
新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。
云计算周刊
比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。
CIO俱乐部周刊
比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。
IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。
X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。
微信扫一扫
关注Chinabyte程序员最怕的五件大事
软件开发通常被认为是相当不错的工作,原因非常多。收入高,福利好(有可能非常好),工作富有挑战性(通常是正面积极的挑战),根据目前的就业形势和程序员的需求量,这种职业竞争压力很小。当然,虽然如此,这并不意味着程序员不会偶尔的由于害怕工作上差错而在夜里惊醒,冒出一身冷汗。 程序员最害怕什么?
根据对程序员讨论组里一些帖子回复情况的不完全统计,我发现了一些程序员最害怕的事。这里,按害怕程度的倒序排列(跟据每个帖子回复数和每个回答的支持数),下面是对&程序员最害怕的是什么&这个问题的前五大答案。
第五名:不称职的上级,无能力的同事
没有人喜欢跟他们认为不称职的人一起工作,没有人喜欢在没能力的人领导下工作。因为这种不称职和没能力会给程序员的工作生活在很多方面带来巨大的痛苦折磨。
怕听到那些高薪低能的市场部的人走近的脚步声,嘴里嘟囔着一大堆抓不住重点的话,总是要求&这事很急,要尽快完成&& Bruno Skvorc
需要再一次重写整个系统&用另外一种语言&.用另外一种技术/框架&.要一次完成而不是分阶段(先替换一个模块,然后另一个)&.因为有些高层领导认为他们的这种实现是最好的,其它的都不好,需求立即全部替掉。& RHSeeger
怕最终会和一个/一些完全不知道自己在干吗的程序员一起共事,他们还坚持认为他们的做法是最佳方案。并且这些人实际上处在你的上级/上游位置,你最终不得不按他们的方式去做。& Jaymz
第四名:被迫去学习或使用一种特定的技术
就像是每个程序员都有自己喜欢的编程语言、开发工具、和编程技术,他们同样也有一些死活都不愿意碰的东西。
怕有一天我被迫去学习Java。& gehsekky
怕用COBOL编程。& Taylor Leese
怕不得不放下C#重新拾起VB.NET去开发下一个项目&.颤栗& Dal
第三名:不再热爱这种工作
每个人,不论是否是是为了事业,都希望能在工作中获得享受。程序员在这方面跟其它行业中的人没有区别&&尽管他们的工作想做到满意要比其他行业的人难得多。
怕枯燥乏味工作。& Cory Thomas
怕有一天最终明白我不适合干编程工作。想起来就害怕。& Dan
怕上班打领带。& Jerry Coffin
第二名:失业
毫不意外,尽管市场对程序员的需求量很旺盛,很多的程序员仍然担心丢掉工作,但担心的原因却各种各样。
怕被外包&..& Jack
担心越来越封闭的开发环境&&尤其是苹果公司的iOS&&以及和它代表的反自由的商业模式和做法。在遭受微软不负责任的做法的打击下,做一名程序员已经很悲惨了,但苹果公司对它的处于完全控制的技术产品的朝令夕改,反让微软看起来是一个相当和蔼的大叔了。& bobince
一些事情像:手指端了,眼瞎了&不能在编写代码了。& Aitjcize
人工智能,再不需要人编程了。&&Kevin Ernest Long
第一名:做砸事情
程序员最害怕的其实是一个小臭虫&&bug。没有人希望在工作中犯错误,但根据程序员从事的系统和应用的不同,遇到的各种bug有可能是讨厌但无大碍,也有可能是会威胁到生命。
计划晚上8点去喝酒的周五晚上发现无法编译。& Anonymous
非常害怕程序中的bug让我遭受经济损失。& joshtronic
怕程序中的bug导致了人们或其他事情的物理伤害。& Jeremy
每次提交开发的东西或我负责的东西时,我心里都极其的恐惧。不论做如何全面的测试。& Evernoob
下次当你看到程序员惊恐万状的眼神时,想想这篇文章。他/她很可能在为一个bug紧张不堪&&或被公司关于着装的规定吓着了。
你呢?做为程序员,你最害怕的是什么?
看过本文的人还看过
最新图文推荐
大家感兴趣的内容
网友热评的文章1.此处有没有模式?研究在哪些情况下行得通,哪些情况下行不通的设计模式,能够让我们发现潜在的规则,了解看似不相关的概念和行为。为了更深层次地了解工作,你需要时不时地问问自己,“此处有没有设计模式?”。这句话适用的不只是你的代码。在根据业务要求而变的类型变化中有没有模式?技术发展有没有模式?你是否经常看到同样类型的bug连连弹出?理解其实就是一种感知模式。——以赛亚·伯林2.如何让它变得简单起来?通常作为web开发人员,我们会想着拿出复杂又可扩展的解决方案。搞点复杂的会让你觉得自己非常的高大上。问题是,你永远无法预知你的产品和业务在未来将会发生怎样的改变。架构和编码与其说像建造,还不如说更像园艺艺术。你必须得能够适应不断变化的环境。解决方案越复杂,它的适应力就越弱。简单才是终极的复杂。——达芬奇3.它为什么这么工作?知道事物能工作,与知道它为什么这么工作是两个完全不同的事情。知道一些事物的行为原因,有助于你做出显然更好的决策。伟大的程序员,和那些只是知道一门编程语言的人之间的区别是,两者处于的知识层深度不同,前者深刻地理解其工作原理。这也适用于修复问题的时候。“只要重新启动服务即可。”“你重启了吗?”当弹出问题的时候,我们往往会说类似于这样的话。然而,如果你这样说了,那你就失去了一次学习的黄金机会。知道为什么会出现问题,才能从根本上修复问题,才能避免再出现这样的问题。4.之前有人做过吗?当你自我感觉发明了一种复杂算法的时候,可能就意味着你正在错误的道路上了。最好的方法是搜索其他人是否已经解决了这个问题。需要写算法,以便于添加标签到最接近用户鼠标的菜单项中?别急,已经有解救方法了。想为送货车找一条最短路径?也已经有解决方法了。想找类似于用户刚刚enter的标签,那么也不用自己绞尽脑汁写了。上面这些只是几个例子,但是相信我,你碰到的问题,别人早就碰到过了。我能看得更远,那是因为站在巨人的肩膀上。——牛顿5.谁第一个提出来的?你觉得自己知道REST?那么,你读过Roy Fielding说明REST的原始文件吗,你了解它的期望目的吗?暂且不说那个在IDE V7中使用REST API生成向导比你更有经验的博主了。所以,告诉自己试着去阅读概念和理论的原始来源。然后通过各种方法去了解行业思想领袖给出的最新开发成果。如果你不知道是从哪里开始的,那么你怎么理解目前的发展进程呢?6.我真的热爱我目前的工作吗?首先让我们面对一个事实:编程很难。即使很难,编程也在不断发展。如果用现在的标准来看,2年前的框架简直笨拙地就像一头恐龙。要想留在这一行,那么你需要终生致力于学习和研究。如果你确实不喜欢编程,那么要想跟上那些热爱的人的步伐,希望并不大。找找你为什么对她没有兴致的原因。不要因为与市场存在差距或因为待遇还不错,就决定成为一名安全专家,不要只是因为最近的文章上面评论说,UX是高科技领域中最热门的职位,就立志成为一个UX专家。重要的事情说三遍:做自己热爱的事情。做自己热爱的事情。做自己热爱的事情。做自己热爱的事情,你所需要的资源也会随之而来。——彼得·麦克威廉斯7.还可以用在哪里?我发现web开发人员最大的局限之一就是失败的想象力。我们在特定的情况下学习的东西,或看到某种用于解决特定问题的技术,我们往往会认为这就是它们的唯一用途。但是,这个想法基本上都是错的。每次你学到新的东西的时候,都应该问自己:“还可以用在哪里?”。学到了一种超棒的新的定位方法来定位图形节点,那么它是不是也可以运用到在有2个维度的数据集中查找某一个数据点?发现一个越过WebSockets从客户端发送数据到服务器的很棒方法?那么它该如何应用于制定一个可扩展系列的后端服务?有时候此路不通,有时候却是可行的。逻辑能力能让你从A到Z,但是想象力却能让你去往任何地方。—— 爱因斯坦8.我败在哪里?最简单的革新方法就是降低失败的成本。游戏开发公司Valve和它的一些同行就将此当作金科玉律。这同样适用于web开发人员,如果你害怕失败,那么你将永远不会有大的突破。勇敢地去尝试,从失败中学习,然后再试一次。不要害怕犯错。认识失败。然后从头来过。——本杰明·富兰克林9.如何实现这个目标?我们生活的世界中只有很少一部分事情是真的完全不可能的。要抱着自己想做的任何事情都是可能的这样一种想法去做事。可能你会发现你想做的事不符合当前实际,但随着世界的不断进步,它也许比你想象地更快成为了现实。事情未成功之前,它永远是看似不可能的。——曼德拉(前南非总统)10.我可以向谁学习?不要在你是最聪明的地方工作。选择那些拥有能够激励你,挑战你,让你做得更好的同事的工作和企业。不必与代码相关,在文本编辑器和命令行之外还有一个世界。学习其他领域的事情,然后应用于你的工作中。不管如何,仅仅胜任工作是不够的。 Java培训课程(gh_a321bb35cafa) 
 文章为作者独立观点,不代表大不六文章网立场
gh_a321bb35cafaAndroid培训,Android开发培训,Android零基础培训,IOS培训,IOS开发培训,Java培训,Java开发培训,APP开发培训,保高薪就业热门文章最新文章gh_a321bb35cafaAndroid培训,Android开发培训,Android零基础培训,IOS培训,IOS开发培训,Java培训,Java开发培训,APP开发培训,保高薪就业&&&&违法和不良信息举报电话:183-
举报邮箱:
Copyright(C)2016 大不六文章网
京公网安备78帐号:密码:下次自动登录{url:/nForum/slist.json?uid=guest&root=list-section}{url:/nForum/nlist.json?uid=guest&root=list-section}
贴数:113&分页:...负尽千重罪,练就不死心发信人: muser (负尽千重罪,练就不死心), 信区: SoftEng
标&&题: Re: 我所知道的程序员们
发信站: 水木社区 (Thu Mar 13 04:06:31 2014), 站内 && 我们组的头。 && 此人毕业辗转于几个大公司,然后两年多前跳到这个公司里。
小伙子精明能干,愿意学习;参与了在php的v1上开发java v2的过程,然后又参与了试图采用erlang的v3 。用antlr写的一个dsl,他应该是主力。 && 然后公司变大了,程序员分组了;要找个头,但没人干,于是就把此人升上来了。干的仍然是非常努力。
比如,上线时他负责大家的午饭,因为订饭的馆子不送外卖,他就自己去拿。
比如,前端组写给客户用的api,性能上一直有问题;因为是调用我们组的东西,他就经常熬夜帮着查。
是标准的亲力亲为型的。 && 我们组从最初的6人,只是一年多点,发展为我离开时的14人。此头从小组的头,升为高一点的director,仅在cto之下。
但近期看linkedin,变成了distinguished engineer。不知道他不是放弃了管理的位置。 && 因为公司变大,又缺少成系统的培训,新进员工出活很慢。——这是典型的人月里描述的情况。
这造成了一种有趣的现象:老手们知道如何这种情况下生存下来,但没有经验者就手足无措了。 && 我们头头相信我们的系统是一个有前途的、庞大的、先进的、有实现难度的、必需倾力为之奋斗的,这样一个实现。——他已经为之奋斗了两三年了,已经经历过足够多的事情了
我相信他相信只有努力工作才可以让系统更加完善;我相信他不相信采用某种特定方法来改变过程就可以以此改变结果。
——希望我的描述不会让你觉得他比较笨;他当然是很聪明的。 && 他的风格和架构师比较象,可能以前还受教于后者比较多,所以他对架构师显得极为尊重。——类似于主动为之开门的。这在西方人里算是显眼的了。——而且还经常与之私下讨论。 && 当我进去时,他的工作重心已经不在编程上了;而且我的活和他也没什么交集。没法具体评价他的编程风格。
从现有代码看,当年应该是没什么时间做重构的。 && 在我的经历里,几乎新版本每次上线,各个模块都会roll back。我不太清楚错是在哪里。因为我分的活都是些无关紧要的皮毛,不足以出现那么严重的问题。
在这种情况下,公司的想法就是要大量进人以希望有足够的人手可以堵住各种漏洞,思路有点象如果大家都去堵枪眼了,我们也就可以抢滩了。 && 我个人觉得,我们组内部还是比较强的。最弱可能就是我了。 && 但是整个开发过程有几个问题:
我们的程序是一个很分布式的;接口上出了无数的问题;下流没有提供上流一种测试用的工具;
开发过程无保证,因为老人们sprint前期都在救火,实际开发时间大大减少——时间分布是3个星期开发,code freeze,然后2个星期测试;在一个sprint内形成老旧的瀑布模型
单元测试的效力比较小,因为很多模块都和其它很多模块有关系,这个至少要把代码发布到测试环境里才能测出
qa不强,而且也不能早期介入;而是留在code freeze之后的两个星期里集中火力
组间协调不顺滑,没有甘特图,不能在接口上尽早达成协议;而整个系统又划分的很细碎
开发环境杂乱,有人竟然用vim来写java。很多工具的使用,对于没有经验的人,需要的时间和精力较多
生产环境监测不力,没能利用log
虽然在系统设计的初期就已经考虑到了运行分析,也有相关的独立的系统来提供在线观察的手段,但是这种方法无法快速定位出逻辑错误出现在哪个模块上 && 总之,错误是一波一波的。每次上线都是几天的震荡。 && 当然,这些事故的原因不是我们头头的错。 && 在这种环境下,随着错误的不断产生,我们想上层的人可能也在逐渐失去信心与耐心;具体到策略上来就是表现的保守、进入消极防御:比如对外组新来的请求不能/不愿快速积极的配合,加强对个人的微观上的量化评定,刻意划清组间的界限......——我记的最清的一个例子,就是新成立的服务质量组想要某个数据,要了一个多月,才在我们组的某人帮助下、花了10分钟查询出来了。
这种保守主义当然首先针对的是新人了。老人间还相互有个情面在,可新人就不必在意了。 && 结果不用说了,用推进单兵的战术来打一场集团大战,怎么可能会赢的轻松呢。
大致上我们也就是在混乱中推进。错误不断。最严重的一次是丢了ebay的一个大单:因为有个严重错误在3天之后才被修复。 && 虽然说很多技术信件是很公开的——我们在表面上仍旧保持着一种非常公开、坦诚的技术氛围,也就是说,无论你找任何人谈话,都基本不会被拒绝;我们开的会也非常非常多
但是这些严重问题到底出在哪里,我是不知道的。这些信件不cc给我,我也无从事后知道谁挨了批评或走人——很多老人可以犯严重的错误,但是新人不可以。尤其是当错误扯皮到几位老人身上之后,你也就更不能说出什么了,因为没有哪个个体可以被划出来承担责任 && 我们的头头也是这种单兵战术的信仰者。毕竟他也是单兵杀出来的,看重的是个人的战力。 && 后来呢,我们组新出了一个manager,主管某块,我也被划入了那一小块。
按说这个小分队不见的很强,但是很有意思,我走前的两次上线,这个模块上没出过错。
我觉得我们头头看我们的眼神都是惊奇的。 && 杨再兴被射杀于小商河,也就是因为他陷入泥潭了。
后来我就走人了。 && --
男子汉,大丈夫,生又何忧,死又何欢? && 我出了门,干咳两声,袖了手,施施然而去...... && 那一刻被电光照亮的这个身姿,千万年后仍凝固在传说之中。 &&&& ※ 来源:·水木社区 ·[FROM: 108.47.15.*]
负尽千重罪,练就不死心发信人: muser (负尽千重罪,练就不死心), 信区: SoftEng
标&&题: Re: 我所知道的程序员们
发信站: 水木社区 (Fri Mar 14 03:08:35 2014), 站内 && 我刚进公司不到一个月,又来个中国人M:祖籍山东,生于台湾,小时候就来了加州。
来前是某著名公司的principal engineer。已经干了快10年了。在不少方面有经验,对linux环境比较熟,而且在理解现有系统、重写且重现功能的方面有实战经验。(据他说他们以前重写代码,bug也要重现的)
以前只用c++,用了几个月的时间,练好了java。 && 刚开始,我和他都是在打游击,干些修修补补的活。我是越干越没劲,他倒是越来越有精神。——这就是一种老手可贵的品质了。
我个人认为,他最好的转折点在于和qa里的主将搭上了关系。他们都喜欢调侃,所以关系就很快好起来了。
很多复杂的工程项目,不在于难,而在于杂。有些实现由于历史的进化,会呈现一层层裹起来的感觉。这个时候,qa主将可以从功能上引导新人熟悉系统。而且她从公司创业起就已经在里面了,可以说非常熟悉系统的方方面面。
把代码和功能对比着看,问题就看的更清楚些。 && 过了几个月,M开始越来越不满了。——他以前是principal engineer,对质量有发言权
他对自己经常工作的某个模块不停的抱怨。——甚至于私下和我讲过某位老人水平太差;这是私下讲的
最后的结果是组里同意他重构这一块。——从他的表现看,他是比较清楚的理解了这个系统,组里可能也是听够了他的牢骚
我和他聊过一次:你搞坏了很可能就要走人了
他自然知道。但是他不愿意再在泥巴里挣扎了。在重构这一段时间里,他和我说过很多次大不了自己走人。可见是相当的破釜沉舟。
——对于这一段,我简直觉得组里是想坑杀他了;没有给他额外的帮助;我主动接下他的一些活来干,帮他省了一点时间;但给自己添了很大的麻烦,因为出了几个小漏子;这也是我走人的一个催化剂:因为我觉得新人不能在测试环境里出错,但老人可以在生产环境里丢客户,太有窃钩者诛窃国者候的意味了。 && 幸好,很多工程项目只是杂乱而不是难。人都可以换心,程序当然可以换代码。
M用了两三个星期重写代码,然后竟在下一个sprint里稳定下来了。
在我们组的头头眼里这简直是个奇迹,因此对他更加尊重起来了。——我们的头头自己就是起于战功,好苦战勇战 && 从此开始,他就对这一模块拥有了ownership. ——这是个很有趣的概念,一个人要在竞争的单位里占有根据地;日后能否挺进大别山,先取决于这块根据地的位置、规模、战略重要性 && 但他的牢骚依然多。因为在整个系统线上,问题学是很多,很多地方可以简化。 && 我走时他和我说他也要走。不过听说他要走,公司立刻升他为manager。应该是被调入另外了一个组。
我走前和他聊了20分钟:我们的问题你也看到了,不是局部的,而在于整体;你有能力改善组间的合作吗?不说整个公司了,只说我们组内,你想大改,想整合某些模块,想改变后台数据库,这会冲击到谁的地盘呢?上游是架构师你打不入;下游是我新近加入的小组,这个组正在充人;你能抢下现在这一块地盘已经很不容易了;哪里还有你另外的空间? && 午饭后,M跑到厨房灌了几口白酒,拉着我们组的头头去喝咖啡了。——这是他非常大的优点,敢说。其实很多时候有人占下地盘也不是为了私利,而是为了理解和信念,因为他们真的觉得技术上该那么做。我相信绝大多数程序员还是很单纯的。
拿着咖啡回来,没进门,站在窗户外面继续说。我看他面红耳赤的不停的在说——可能是因为酒的缘故——我们组的头头偶尔说几句。 && M是一个很好的资深程序员的例子:对不良的系统也埋下头消化掉,敢于打硬仗,能立下战功。
在实际中,他能打下自己的一块地盘。于公司于已,都是好事。
男子汉,大丈夫,生又何忧,死又何欢? && 我出了门,干咳两声,袖了手,施施然而去...... && 那一刻被电光照亮的这个身姿,千万年后仍凝固在传说之中。 &&&& ※ 来源:·水木社区 ·[FROM: 108.47.15.*]
负尽千重罪,练就不死心发信人: muser (负尽千重罪,练就不死心), 信区: SoftEng
标&&题: Re: 我所知道的程序员们
发信站: 水木社区 (Fri Mar 14 03:43:29 2014), 站内 && M是以奇功立身的。
我后来所在小组的manger K靠的是稳定。
他先是老程,后来是tech leader,再后来就划出一个组给他了。 && K的代码,我觉得最好的评价就是:朴素。
就是那种没什么错,一板一眼的,宁肯多做几步也不要出错,不是很计较oo原则的....甚至于视觉上显得有些臃肿的。
所以M一直私下和我说K不会写程序,甚至说觉得此人比较笨。 && 后来我一查,K是uc berkeley的。——至今这里说的所有人,大概都是 ucla, usc, caltech, princeton, uiuc......这一量级的。不是说高手只能出在名校;而是说大家别错以为上面某位天生智力不足;聪明人不会犯太简单或直接的错误的
K也是工作10年的老人了。他只所以走这样一条技术道路,自然有他的理由。
甚至于我觉得新人就应该有K这样的态度。 && 我后来划给K的组,他就和我讲过他自己新接触一个系统,先不说话,花几个星期甚至几个月把系统硬啃下来。
他还鼓励我认真工作:在大公司里必须aggressive,你可以去抢占某(我们组里另一人)的owership...... ——这个其实新人应该好好学习一下;如果只是闷头干活,很可能只有苦劳没有功劳,更可怕的是随时会被当弃子
我的个性是不喜欢抢活的,我可以找个空地单干,但不愿意去抢。而且我们的问题在于大家相互间擦屁股、所以低效;其实干这点活根本不需要这么多人,所以才会有抢活这种情况发生.... && 我在这个组里干了几个月,期间就在为走人做打算。——因为这个组的生存空间更小,换句话说,个人的前进空间也更小。我和M说他不可能打入这一组,因为K一直在尽力维护这个地盘
我和K也说过这个组的前景,他当然是觉得前景广阔而光明。——不论什么时候,我觉得听到的都是:我们有太多想法还没来得及实现。我个人觉得这是场面话。但也许有人真的这么认为 && 组里还新进一个小孩。我没什么大事,就主动多帮帮那位小孩熟悉系统。
后来就走人了。 && 这个小组,按说平时表现不是最出众的。——象我简直就是差了
但是在这几个月里,上线几乎没出过问题。
而整个公司局面上,还是每次上线都 roll back。到这个时候,我们全小组就出去散步。我们大组的头头每次看到这样,表情都清楚的说明了他不能相信。 && K的优点非常明显,沉稳低调,不贪功,尽量不出错,认真踏实。
这也是一条非常有前途的发展之路。
男子汉,大丈夫,生又何忧,死又何欢? && 我出了门,干咳两声,袖了手,施施然而去...... && 那一刻被电光照亮的这个身姿,千万年后仍凝固在传说之中。 &&&& ※ 来源:·水木社区 ·[FROM: 108.47.15.*]
lol发信人: Douzidouzi (罗外不要脸 不要相信他), 信区: SoftEng
标&&题: Re: 我所知道的程序员们
发信站: 水木社区 (Fri Mar 14 14:53:58 2014), 站内 && 沙发 sprint是啥
【 在 muser 的大作中提到: 】
: M是以奇功立身的。
: 我后来所在小组的manger K靠的是稳定。
: 他先是老程,后来是tech leader,再后来就划出一个组给他了。
: ...................
真正有气质的淑女,从不炫耀她所拥有的一切,她不告诉人她读过什么书,去过什么地方,有多少件衣服,买过什么珠宝,因为她有D cup。 && ※ 来源:·水木社区 ·[FROM: 69.140.113.*]
负尽千重罪,练就不死心发信人: muser (负尽千重罪,练就不死心), 信区: SoftEng
标&&题: Re: 我所知道的程序员们
发信站: 水木社区 (Sat Mar 15 01:57:35 2014), 站内 && 让我以为自己敲错字了....搜 scrum sprint....话题太大,一两句说不清,幸好网上有大量现成资料 && 【 在 Douzidouzi 的大作中提到: 】
: 沙发 sprint是啥
男子汉,大丈夫,生又何忧,死又何欢? && 我出了门,干咳两声,袖了手,施施然而去...... && 那一刻被电光照亮的这个身姿,千万年后仍凝固在传说之中。 &&&& ※ 来源:·水木社区 ·[FROM: 108.47.15.*]
负尽千重罪,练就不死心发信人: muser (负尽千重罪,练就不死心), 信区: SoftEng
标&&题: Re: 我所知道的程序员们
发信站: 水木社区 (Sun Mar 16 13:43:28 2014), 站内 && 有人问我什么是不会写代码的写出的代码。
一时想不到太好的例子,勉强举一个: && 一个list, 现在要挑现最大的两个。 && 无所谓的风格是:
Collections.sort(list);
拿最后两 && 对API有兴趣的:
Collections.sort(list, Collections.reverseOrder());
拿前面两个 && 追求性能的是自己扫,这样就是O(n)了。
不会的是:
扫一遍,拿最大;
list.remove(最大);
再扫一遍,拿最大,也就是全部的第二大;
list.add(最大); //再放回去
———你见到一位老手写出这种代码,难免会心生感慨;我这个例子举的一般,毕竟逻辑挺清楚的。 && 如果知道一般情况下list里只有4、5个,甚至于9、10个,都可以硬上Collections.sort()。——关心性能的人也会舍弃O(n),因为他知道这无所谓,实践中几乎无差 && --
男子汉,大丈夫,生又何忧,死又何欢? && 我出了门,干咳两声,袖了手,施施然而去...... && 那一刻被电光照亮的这个身姿,千万年后仍凝固在传说之中。 &&&& ※ 来源:·水木社区 ·[FROM: 76.168.88.*]
人肉学步车发信人: operater (老猪伏槽,志在千里), 信区: SoftEng
标&&题: Re: 我所知道的程序员们
发信站: 水木社区 (Mon Mar 17 09:26:33 2014), 站内 && (1)格式化到字符串,string print的缩写。
(2)接力跑的一棒
(3)敏捷开发的一次迭代。 &&&& 【 在 Douzidouzi (罗外不要脸 不要相信他) 的大作中提到: 】
: 沙发 sprint是啥
发信人: nongchao (狼叔叔), 信区: XXXXXXX
标&&题: Re: 狼叔叔不要拆俺的台嘛~~ &&~~~
发信站: 水木社区 (Tue Mar 17 20:52:48 2009), 站内 && 乖,我是叔叔,你是阿姨,要听话哇,要姨夫为纲,嘿
【 在 W0LFLING (狼阿姨) 的大作中提到: 】 &&&& ※ 来源:·水木社区 newsmth.net·[FROM: 106.120.85.*]
人肉学步车发信人: operater (老猪伏槽,志在千里), 信区: SoftEng
标&&题: Re: 我所知道的程序员们
发信站: 水木社区 (Mon Mar 17 09:55:57 2014), 站内 && (1)士大夫工程师,真的可以比他的顶头上司(经理)工资高吗?
(2)外国真的有这种技术路线吗?
(3)据说有技术路线的公司,需要大约70个技术人员里面,养一个技术专家,这个专家
的工资和经理一样多,甚至更多。是这样的吗?
(4)在国内,一些人干这技术专家的工作,头衔是经理。兼管一些管理的工作。 &&&& 【 在 muser (负尽千重罪,练就不死心) 的大作中提到: 】
: 这个美国小孩走了。活被两头牛接了。
: 我当时也没什么事干,——试图干些事,不过没人听我的建议——所以就要求也来干这事。
: 这事虽然当时是众矢之地,但是它的要求很机械,任务只和性能有关,任务可能是有惊无险。若能在这里盘下营地,也是个很好的根据地了。
: ...................
发信人: nongchao (狼叔叔), 信区: XXXXXXX
标&&题: Re: 狼叔叔不要拆俺的台嘛~~ &&~~~
发信站: 水木社区 (Tue Mar 17 20:52:48 2009), 站内 && 乖,我是叔叔,你是阿姨,要听话哇,要姨夫为纲,嘿
【 在 W0LFLING (狼阿姨) 的大作中提到: 】 &&&& ※ 来源:·水木社区 newsmth.net·[FROM: 106.120.85.*]
人肉学步车发信人: operater (老猪伏槽,志在千里), 信区: SoftEng
标&&题: Re: 我所知道的程序员们
发信站: 水木社区 (Mon Mar 17 10:01:17 2014), 站内 && (1)这位senior staff engineer需要读别人遗留的垃圾代码吗?似乎码农都怕
这个,这也是衡量技术专家的一个标准。
(2)我小时候,媒体上的鸡汤文章宣传说日本有一批工程师,在一家公司从20岁
干到60岁,认真负责、高度敬业、认死理死心眼。文中的这个人应该就是这样的吧?
(3)一个人的工资取决于市场供求关系,而不是他给公司带来多大收益,不是不可替代
性,这个工程师对公司很重要,但是离开公司,他熟悉的公司技术背景没什么用。到了
其它公司要从头来。不理解为啥工资很高。
(4)我认为这种技术专家的最大风险是空难等,导致公司瘫痪半年。 && 【 在 muser (负尽千重罪,练就不死心) 的大作中提到: 】
: 当时的这位架构师是位举足轻重的人物。
: 评级什么的是xx senior staff engineer,总之就是无法再升的级别了。
: 公司一开始的时候就进来了,也无意于管理;功劳越积超多,于是就给了个架构师的称号。
: ...................
发信人: nongchao (狼叔叔), 信区: XXXXXXX
标&&题: Re: 狼叔叔不要拆俺的台嘛~~ &&~~~
发信站: 水木社区 (Tue Mar 17 20:52:48 2009), 站内 && 乖,我是叔叔,你是阿姨,要听话哇,要姨夫为纲,嘿
【 在 W0LFLING (狼阿姨) 的大作中提到: 】 &&&& ※ 修改:·operater 于 Mar 17 10:05:43 2014 修改本文·[FROM: 106.120.85.*]
※ 来源:·水木社区 newsmth.net·[FROM: 106.120.85.*]
人肉学步车发信人: operater (老猪伏槽,志在千里), 信区: SoftEng
标&&题: Re: 我所知道的程序员们
发信站: 水木社区 (Mon Mar 17 10:08:16 2014), 站内 && senior deputy engineer是不是更高? && 【 在 muser (负尽千重罪,练就不死心) 的大作中提到: 】
: 我个人大概觉得,staff算是终身教授的意思,senior好比正教授。
: 这条轨道上应该是没法再升了。
发信人: nongchao (狼叔叔), 信区: XXXXXXX
标&&题: Re: 狼叔叔不要拆俺的台嘛~~ &&~~~
发信站: 水木社区 (Tue Mar 17 20:52:48 2009), 站内 && 乖,我是叔叔,你是阿姨,要听话哇,要姨夫为纲,嘿
【 在 W0LFLING (狼阿姨) 的大作中提到: 】 &&&& ※ 来源:·水木社区 newsmth.net·[FROM: 106.120.85.*]
文章数:113&分页:...

我要回帖

更多关于 快手粉丝数量显示不对 的文章

 

随机推荐