最近,也做了一段时间的互联网开发,感觉转型,不仅仅是技术上的,同时也是工作方式的,工作节奏的改变。我把对公司的一些理解整理在这边网上,我看到很好的

文章里,当然文章是以测试人员的视角,来写的,但大致把互联网开发和传统软件开发的不同概括的很好了。我在其中增加了,开发者的视角,以供想从传统软件工程师

转型到互联网开发的兄弟姐妹们一些参考。同时也是自己最近一段时间工作的心得总结。

互联网软件开发和传统软件开发的不同

互联网测试有什么不一样(zz)

 最近一直有写这样一篇文章的想法,因为自己工作的变动,都是些零散的思路和想法,这里稍作整理,贴出来。正好假期的时候有朋友问到这方面的话题,希望也是一个参考。

 其实说实话,觉得自己不是很够资格来写这个,毕竟开始做互联网测试的时间不长,很多方面还在摸索和catchup中。但是另一个方面,如果真都习以为常了反倒没有对比的新鲜感了也不想写了。再加之今天看到韩少的那篇写给不一样的自己,觉得把看法写下来,哪怕若干时日之后觉得现在的看法很stupid也无妨,那就是代表进步了。没有进步是最可怕的事情,不是吗?

 当然,这个不代表公司的一些做法,更不能代表很多公司,也不能代表不同人,纯属一个刚开始从事互联网开发(但不是刚开始做Web的人的一些个人观察和思考。

 互联网行业的人有意无意的把非互联网的软件都称为传统软件,也就是说我们这种都是从传统行业,好吧,传统软件行业转过来的。也许在有些人眼里这个带有一些自诩的成分,当然更多人是为了区分。就像我们做IT的把其他比较实体的行业称为传统行业一样,似乎有某种优越感。这里不争论这些称谓,意义不大,有没有价值让市场去决定。如果把一件事情说得玄乎,那么主要有两种可能,没有搞明白,或者装高深。这两种都不太好,所以还不如看看到底有什么不同。

  如果真要用传统软件行业这个词,那么这里是指的那种需要用户去安装客户端,或者需要客户的管理员在机房去部署的那种软件,放在光盘里也好,放到硬件里一起卖也好,又或者是为某客户量身订做的一套系统。

  变和不变总是永恒的主题。先说说我看到的不一样的地方。互联网行业和传统软件的区别:

  1. 最大的不同就是互联网的产品很多都是自己来部署和运营,用户只要用一个瘦客户端就能使用。

  这里的瘦客户端是一个浏览器,一个App,或者一个需要安装的client,但是核心的数据和业务逻辑主要在互联网公司的机房里面,在IDC,在云端。这里和以前的C/S,
B/S架构的企业系统的主要区别在于为多大范围的人来服务以及谁来运营和运维这样的系统。所以自然的,就多了很多的这方面的工作。

  缩小范围到测试这个方面,就需要考虑生产环境的问题。比如有下面的这些方面:

  a. 如何来监控生产环境功能的可用性。

  这个需要和运维一起来做,但是运维针对的是比较通用的部分,比如机器的资源使用情况、流量和带宽的情况,但是偏产品业务层面的,比如哪些功能是否可用,可能就
需要业务测试人员来设计和开发自动化的系统来监控了。

  b. 如何来发布功能到正式运行环境(生产环境)

  测试完了一般直接就发布了,所以不像传统的软件有那么长的测试周期,包括internal beta,externalbeta等过程,而且我了解到的情况,很多基于的互联网产品平均一天 有多个发布,可大可小。所以发布可能就成了测试人员的工作,当然有相关的系统的支持。这里还需要考虑的问题是常见的基于各种条件的灰度发布,先让部分用户用起来。 发布完了之后还要做生产环境的验证。

  c. 如何来保证或者验证测试环境和生产环境是同步的

  一旦是互联网的这种模式,测试环境的问题就会变得比较突出,因为常常牵涉的系统比较多,有些和外部系统的接口可能很难以自己搭建或者用mock。另一方面如果保证测试环境是好的,到生产环境也是好的。需要相应的机制和工具来验证和同步。

缩小到开发这个方面。要考虑到一些互联网的特性,比如有以下这些方面:

a 如何快速定位,问题在哪个模块或着需求设计哪几个模块,以及给出解决方案。

一般来讲,新增加的功能或者模块,比较容易像一个传统项目的一样,制定计划,软件设计,到开发,测试。但是如果是生产环境中出现的问题,则需要对原来业务以及软件架构非常熟悉,能够快速定位到问题所在的页面和涉及的页面。在一个从传统软件转过来的互联网工程师来看,其实web程序,是一堆软件的集合。每一个web页面都是一个独立小程序。它们或者十分独立,只是通过一个链接跳转,或者一组页面组成一个程序集合,实现特定的一个功能。终究是多个dll独立的存在。所以,从传统软件工程师的角度出发,应该是以一个管理程序集合的概念来管理一个web程序。具体怎么做呢?首先负责开发技术人员分成3类,一类是高级coder,最好是原有的模块开发者。它们对模块的需求,和设计实现架构非常了解,但他们只对反馈过来CR做需求分析。屏蔽一些不合理的修改意见,对要修改的需求,进行定位分析,设计好修改方式,以及判断修改涉及的范围。二类是 中级coder,中级coder只和高级coder沟通,对高级coder的设想落地,把他的设计思路实现。 三类是初级coder 负责和高级coder沟通需求以及了解判断修改的范围。对中级coder的修改做开发者的自我测试,完成相关文档,由高级coder审核。

b 如何判断开发好的功能OK了。
 
 在高级coder的审核,通过三类coder的文档,来确认coder实现是否符合原来设计,当然,设计时,最好事先就和二类coder一起沟通。随着小分队的不断默契,可以是初级coder很快掌握,业务逻辑,和自测方法,同时可以熟悉,开发者所使用的工具。不断成长,继而成为中级coder。同事中级coder,在不断实现设计的同时不断成长,到可以胜任需求分析和软件设计的工作,成为高级coder,这样整个小团队就非常厉害了,这个方式类似于抗倭名将戚继光的鸳鸯阵,专门对付,个体比较强大,武艺高强的倭寇。
 
 
 c 如何保证生产环境的web程序的稳定性
 
 减少发布次数是保证web程序的稳定性的最有效措施,但是如果是紧急的问题,可以当天发布。例如,我们是给美国那边做技术支持,中午可以作为测试截至时间,中午2点测试通过的当天下班5点钟发布,如果2点没有通过测试的,即推迟到后一天。

  2. 互联网产品的节奏都很快

  不像传统的一个客户端或者服务器的软件产品,可能周期是半年,一年,甚至更长。这样有比较充足的时间来做项目计划,需求评审,然后是概要/详细设计,进而有测试设计测试用例,然后有不同的测试cycle,同时也可以有很多的时间来准备测试环境和自动化测试。
  就目前来看,互联网的产品这样做不太现实。这样对测试人员也是很大的挑战,可能看到一个需求过几天就要开测了,用例是临时开出来的,根本来不及自动化,也没有很多的时间来做测试设计,然后测两天这个功能就上线了。不是切身的感受很难体会到这种速度带来的差异。所以如何在这么短的时间里面来保证测试的覆盖度和质量,如果减少遗漏?这是现实的问题,或者说是要求,有一些措施,但是其实也没有很好的答案。

  3. 有更多的人参与到使用或测试里面来

  互联网公司里面,测试vs开发的比例都很低,1:6,1:7都是很常见的,甚至更高,在这样的配比的情况下,如果来保证质量?必须有更多的方法。比如

  a. 开发人员的自测。

  测试耗费更多时间很多时候是因为代码的质量不够好,有很多,有很多讨论,很多的拉代码的次数。所以提高开发提交的代码质量就是一个很重要的方面。有些公司是通过开发
人员的强制的单元测试来保证的,有些是通过功能级别的自测来保证的。这些可以借助一些数据来反映,比如同一个版本拉代码的次数,或者测试用例的通过率等等。

  b. 产品或者运营人员的体验。

  很多互联网的产品不像传统软件产品,不是一个产品经理来提所有的需求。产品,或者称为产品经理,是一个团队,每人负责一块来提出需求。另外很多需求可能是来自于运营团队,和business相关,或者是不同系统的打通。每个产品经理或者运营,需要在开发人员实现了相应的功能之后到体验环境里面来试用产品,就是所谓的体验,看这些功能是不是他们想要的。这样就可以在测试人员测试之前保证没有明显的需求理解的问题,避免浪费测试的人力和时间。

  c. 发布之前的评审。

  不同的角色进来看对于一个已经测完的工作还有没有问题,以及发布的时候需要注意的问题,环境的问题,配置的问题,数据的问题等等。上面的一些做法可能都有帮助,但是如何来推动,如果来检验都是需要流程和工具来支撑。

  4. 有一些是免测试的

  不是所有发布到生产环境的东西都需要测试,有些改动是不需要测试的。这个没有一定的标准,取决于具体发布的情况,以及产品和团队的成熟度等因素。比如一些临时活动的页面,一些小的图片或者样式的改动,一些小的修复等等。只需发布完了之后到外网去验证。

  有哪些可以走免测,这其实是一个很复杂的问题,当然风险也是有的,但是因此而带来的效率的提高也是很明显。

  5. 海量的用户带来的挑战

  其实有很多,这里列举几个:

  a. 如何来保证或者验证性能

  传统软件的性能测试相对要单纯一些,可以比较容易搭建一套环境,流量也比较容易模拟。而互联网的一个产品可能有几百上千台甚至更多的服务器,多地多层部署,受到各种因素的影响,比如广告促销活动,一下子流量可以冲到很高。所以这方面的做法也会有所不同,全量的模拟不太现实,而且如上面所说,发布非常快,也没有那么多的时间去反复的做性能测试。所以如何来做比较轻量级的性能测试也是一个很大的课题。

  b. 浏览器的兼容性。

  用户使用的浏览器种类可能非常多,包括大家都在骂的IE6,还有IE9的n种模式,版本更新速度火箭一般的Chrome和Firefox,以及很多种国产的浏览器。要一一覆盖是一个很大的挑战,其实不可能,但是产品团队肯定希望测试能够覆盖更多。对于一些企业级的产品可以宣称就支持很少的几种,但是互联网产品很难这样做,那就等于放弃一些用户。如何来设计策略?有没有技术手段?

  c.改好的东西,没有输入限制,任意操作,如何保证健壮性。

一个小的改动引起的问题可以影响到无数的用户,而且很多时候马上会被发现,那个压力还是非常大的。整个修复的过程也是带电操作,没有那么多环境和时间来在内部慢慢调整,如何来保证修复的质量?

  6. 问题的修复

  互联网的产品相比传统的产品的一个优势或者说是特性就是问题的修复比较快,因为很快就可以影响到用户,而不需要等用户一个个去打hotfix或者patch,甚至安装新版本。有很多时候,这种问题的发生到修复的时间很短,真是绝大部分用户都没有感知。有时候这个也会成为quick &dirty的一个借口,不过一般都会把
生产环境的问题列为一个考核的指标。而且有些问题不是小问题,会构成事故。其实对于这样的产品,测试人员对于漏测的压力就更大了。

  7. 测试工具和技术选择上的差别

  大概是因为互联网自身产品的一些特点,各大公司都在大量的使用开源的,以及内部开发的平台和系统。相应的,测试方面用到的平台和工具主要也是这两种,要么是开源的工具(也可能做一些改造),要么是内部自己开发的工具。相比而言,传统软件行业更会去购买一些商业的测试工具,比如用于性能测试、覆盖率或者代码检查的工具,还有就是测试用例和缺陷的管理平台。
  目前我了解到的情况,国内几大互联网公司都是改造和自研的比较多,所以在简历里面列一堆大的工具的使用经验不一定有多大优势。而对于新人来说需要花不少时间来学习和熟悉这些平台。   

  以上列举了一些相比传统软件行业的不同的地方吧,但是对测试人员来说,互联网行业和传统软件的相似处:

  1. 一样的需要非常了解产品和业务

  对于测试人员来说,如果不了解产品和业务,测试工作很难开展,因为连最基本的对错(是不是bug)都很难判断,当然除了一些明显的错误,比如js出错这样的信息,这种缺陷产品体验的时候就能够发现或者等到被用户发现了。所以我们还是需要花很多的时间和精力来熟悉产品业务。从这个角度看,没有很大的变化,只是换了一个不同的领域而已,这个差别是不同的产品带来的,而不是因为传统软件或者互联网的差别带来的。

  2. 一样的需要了解产品的技术

  这个其实和上面有点类似,测试人员需要去了解产品开发用到的技术,这对深度的测试,甚至和很多测试技术和工具的应用有很大的关于,比如性能分析,内存泄露的发现,覆盖率的分析等等。不去学习和了解这些,很多工作没有办法开展。从方向上来看没有变化,我们也要去学习和实践这些东西才能更好的了解。但是具体的技术可能有所不同,比如互联网web的产品可能会常用到JS,PHP,Java,C++等语言,还有各种web服务器,cache,代理等等。

  3. 具体的测试技术

  上面说到了一些产品开发的技术,其实还有一块是测试方面的技术,其实这一块细化来看和传统的软件开发有很多相似甚至相同的地方。比如如果来做静态代码的扫描、局部的性能测试方法和工具、覆盖率的工具、自动化的一些工具和框架、一些监控的工具等等。

  从这个角度来看,技术的差异并没有很大,当然互联网有一些特别,比如很多基于web的系统、分布式的、多层的,会对工具提出一些要求,这个差别其实倒不是很大,因为很多传统的服务器软件也是这样。

  4. 测试设计的方法

  上面提到,因为产品发布节奏的差异,使得整个流程必须更轻更快,但是针对于一个具体功能的测试的时候,用例的设计和执行上需要考虑的问题其实和传统的没有太大的差别。因为这个时候大家面临的问题是一样的,如何测这个软件的这个功能。所以一些思路和方法还是能用得上。

  综合以上来看,局部的差异反而比较小,但是涉及到大的形态和流程方面的差异就会比较大。
  也可能正是因为这样的原因,很多从传统软件到互联网的人也很快就能够融入并开始发挥作用,而且退回几年来看,现在各大互联网公司里面的人大部分也都是来自于所谓的传统软件企业。
  

  我相信不同的领域的发展速度和机会是不一样的,这也是这几年很多人投身到互联网行业的原因之一,这个就好比经济学上所谓的市场对于资源配置的驱动力一样,很正常。但是另一个方面,会让人有一种错觉,以为换到一个快速发展的行业,自己立马变强了。其实冷静的来看,并不会如此,只是赶了个浪潮,真正的技术和能力不会因为你换了一个领域或者行业就变得强大或者高深了,要获得这样的提高一定是因为更多的学习,实践和思考,以及和别人的交流而慢慢得到的。

  上面提到了互联网产品,其实有些时候,这是一个伪命题,因为在各大互联网公司都有传统软件,比如腾讯百度阿里都有客户端的产品,而且数量还不少,有些还有C/S架构的产品,国外的google也有chrome,picasa这种桌面的产品,facebook也出了IM客户端。所以在很大程度上,还是非常的需要比如GUI产品的开发和测试技术,服务器类似企业级产品的方法和能力。当然,这些产品背后是连到互联网的,所以也有差异的部分,但是没有想象的那么大。

另外一个问题,有些时候大家在借互联网软件这个名字来逃避一些东西,比如一些不严谨,或者混乱的地方,就全部归结到这是互联网的特性,这个是一个“度”的问题,要自己去分辨。

  另一个问题,对于初入互联网开发或测试的人有什么建议呢?下面这些也是自勉。

  1. 正视这种差异带来的改变,上面说的一些东西真的也是很大的不同,所以要积极的学习和了解。

  2. 努力的去学习产品相关的知识,包括相关的开发技术,这样才能更好的开展工作。

  3. 要经常反思,之前在一个环境下对一个东西研究得很清楚了,但是换个环境之后可能老的经验和知识并不完全适用。所以少说我们以前是怎么样的?绝不生搬硬套,而是了解了情况,理解了问题之后看哪些做法是可以借鉴的?局部的借鉴可能更靠谱。

  也正是因为这样的原因,大家会发现学习的曲线很陡,而且会乐在其中。

互联网软件开发和传统软件开发的不同(转型互联网开发需要适应的那些事)相关推荐

  1. 软件工程:浅谈人工智能软件开发与传统软件开发的区别

    题目:浅谈人工智能软件开发与传统软件开发的区别 摘要:人工智能的飞速发展带动着软件工程的发展,最终使得软件工程产生新的变革.因为人工智能特有的性质,因而导致了人工智能软件与传统软件的差异性.本文对比了 ...

  2. 减少存储过程封装业务逻辑-web开发与传统软件开发的思维模式不同

    转:减少存储过程封装业务逻辑-web开发与传统软件开发的思维模式不同 本篇文章讨论并不是:不要使用存储过程,因为有些事情还是要存储过程来完成,不可能不用.而是关于:"业务逻辑是不是要封装在存 ...

  3. 物联网应用开发与传统软件开发的区别

    自从共享单车火了以后物联网应用开发就比较热门了, 甚至一些非物联网的公司也开始切入物联网项目中去,结果用传统的互联网技术和团队开发出来的项目问题多多.核心原因是物联网应用开发本身有一些特殊性需要关注, ...

  4. 敏捷软件开发与传统软件工程的比较

    敏捷软件开发与传统软件工程的比较             软件工程的开发过程中有两种不同的管理和开发体系,一种是基于"瀑布模型"的预设性传统软件工程,另一种是轻量级的适应性敏捷软件 ...

  5. 一秒看懂:SaaS软件和传统软件的区别!

    现在市场上有很多SaaS软件,当然传统软件也有很多,所以很多企业在找管理系统的时候,都会有选择困难的问题,不知道究竟选择哪个好,万一选错了,那对于企业来说则是一个巨大的损失.所以今天给大家列举一下&q ...

  6. 艾永亮:老板必看!传统企业转型互联网的“门道”

    随着互联网时代的到来,传统企业面临的挑战越来越大,传统企业转型互联网势在必行.但无论是线下的渠道还是线上的扩展都让传统企业举步维艰. 一.思维意识跟不上. 既然要转型互联网,更重要的是拥有互联网思维, ...

  7. Atitit 互联网思维 attilax著 艾龙 著 1. 引 言 互联网思维制胜传统企业转型   第1节 传统企业互联网化,是未来商业浪潮的主旋律    传统企业的“互联网焦虑症”    互联网思

    Atitit 互联网思维 attilax著 艾龙 著 1. 引 言 互联网思维制胜传统企业转型   第1节 传统企业互联网化,是未来商业浪潮的主旋律   传统企业的"互联网焦虑症" ...

  8. 超越传统软件开发技术

    王安全:2006年加入阿里巴巴(http://www.alibaba.com/)集团研究院,任软件架构师:2007年阿里集团分拆,进入阿里软件(http://www.alisoft.com/),从事架 ...

  9. 管理系统开发的常见软件

    管理系统软件开发是一个较为广泛的词,现阶段市面上的一些软件开发商通常可以开发各行各业和公司应用的软件商品,这种软件可以处理公司时下的一些管理问题或营销推广问题. 伴随着科技技术的迅速发展,新时期公司务 ...

  10. 传统软件行业与互联网行业对比

    由于在传统软件行业与互联网行业都待过,所以在面试和做介绍时经常听到有人问到这两者之间有何差异,现在不妨总结一下. 先来背景介绍:我所在传统软件行业主要从事军工方向信息系统设计及研发工作,在大型型号项目 ...

最新文章

  1. 卡尔曼滤波器推导与解析 - 案例与图片
  2. 一步一步掌握设计模式一(最简单的开始--单例模式^_^)
  3. java基础---多线程同步锁问题
  4. ASP站点无法访问怎么办
  5. 转:Java中子类是否可以继承父类的static变量和方法而呈现多态特性
  6. 【clickhouse】clickhouse 同时查询数过多 Too many simultaneous queries
  7. 72. Edit Distance
  8. jQuery滚动数字
  9. javascript自定义alert弹窗
  10. XMindCrack.jar下载
  11. 数学建模之综合评价模型(层次分析法+Topsis法+熵权法)
  12. 十:javaee会议管理系统实现过程之会议室管理功能的代码(完整详细有注释)
  13. 中了勒索病毒怎么办|文件解密|文件恢复
  14. 网站不收录怎么解决问题?三个SEO技巧秒收实例
  15. thinkpad x1e 隐士进入bios
  16. Unity游戏内版本更新
  17. 视频图片 超分与动漫化+补帧
  18. 加拿大签证办理时解释信Explanation of Letter参考
  19. 陕西奥罗国际大酒店配电房改造
  20. Python两种方式求多个数的最大公因数(HCF)和最小公倍数(LCM)

热门文章

  1. Colorbox 参数设置-中文版
  2. 天涯“大鹏金翅明王”语录
  3. A股数据日级前复权数据补全
  4. LuoguP4234_最小差值生成树_LCT
  5. 调试Linux OpenWrt 2.6.36+华为ME909s-821 4G模块
  6. coding AD:最短路径Floyd算法过程矩阵的计算:十字交叉法
  7. 使用Linux搭建软路由
  8. 卸载精灵 v4.2 是什么
  9. Matlab中axis函数使用
  10. 织梦模板建站必须学会的基本代码