仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1629|回复: 20
打印 上一主题 下一主题

[学习教程] JAVA网站制作之利用Perf4J举行功能剖析和监控仓酷云

[复制链接]
跳转到指定楼层
楼主
发表于 2015-1-18 11:32:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
C#是不行的,比如说美国的航天飞船里就有java开发的程序以上是我的愚见,其实不管那种语言,你学好了,都能找到好的工作,很多开辟职员都很熟习墨菲法例的一个例子:他们发明在消费了大批工夫确保使用程序在开辟情况中疾速和天真以后,在公布到临盆情况的时分功能会难以想象的年夜幅下落。更糟的是,使用程序平常运转一般,老板大概主要客户操纵使用的时分却反响迟缓。具体的日记纪录和剖析关于追踪这些间歇性的功能瓶颈尤其主要.
但是,现今天下充斥了面向服务的架构和散布式的使用,查找功能瓶颈对应的组件极为坚苦。思索一个典范Web2.0作风使用的服务器真个罕见场景:

  • 服务器吸收一个Web哀求,分发给卖力发生呼应的组件。
  • 该哀求大概必要经由过程LDAP服务器举行平安考证。
  • 把持器组件对数据库实行查询。
  • 把持器组件也会挪用第三方Web服务。
  • 把持器组件将一切取得的数据举行汇总,构成一系列营业对象用于显现。
  • 营业对象被展示,呼应内容传回用户扫瞄器。
  • 运转于扫瞄器的AJAX代码发生其他的哀求,与服务器端交互。
关于“为什么我的网页反响愚钝?”如许成绩的回覆必要研讨多个组件和实行路径,同时必要临盆情况中一切使用组件的具体功能数据。
Perf4J是一款开源工具包,用于增加Java服务器端计时期码、纪录日记和监控了局。关于熟习诸如log4j日记框架的开辟职员来讲,能够如许类比:
Perf4JistoSystem.currentTimeMillis()aslog4jistoSystem.out.println()

怎样使用这个类比了解Perf4J呢?回忆一下已往还没有普遍使用Java日记纪录框架的糟光阴,我们年夜多半人怎样增加日记纪录语句。我们利用System.out.println()作为一种“大略的调试器”,使用这类快速但糟的体例纪录信息。我们很如意识到,这是不敷的。我们但愿把纪录语句输入到专门的日记文件中(假如大概的话,多个分歧文件),大概能够天天掩盖日记。我们必要可以设定主要性的分歧级别以输入不必的日记语句,能够选择在不改动代码的情形下在特定情况下只输入特定日记,大概在分歧情况中改动日记格局。因而,log4j供应的丰厚功效来历于原始设法,是一种“更好的”System.out.println()日记语句。
相似的,当Java老手发明他们必要增加功能监控代码时,他们常常如许做:
  1. longstart=System.currentTimeMillis();//executetheblockofcodetobetimedlog.info("msforblocknwas:"+(System.currentTimeMillis()-start));
复制代码
可是很快,这些开辟职员发明他们必要更多的信息,综合的功能统计数据如均匀、最小、最年夜、尺度差和特准时间段内每秒的事件处置量。他们但愿将这些数据绘成及时图表监控运转服务器上的成绩,大概经由过程JMX输入功能目标以便于启动监控器在功能下落的情形下收回警报。别的,他们还但愿计时语句能够和相似log4j的框架共同利用。
Perf4J的方针是经由过程易于集成(和扩大)的开源软件包供应这些功效。Per4J是由Homeaway.com开辟的,其基本举措措施的散布式特征和网站的高可用性及功能需求必要深切的功能剖析。Perf4J的特性包含:


  • 简便的stopwatch计机会制。
  • 供应命令行工具,从原始的日记文件中天生汇总的统计数据和功能图表。
  • 定制的log4jappender,能够在运转时使用中天生数据和图表,企图在今后的版本中撑持java.util.logging和logback。
  • 可以以JMX属性的情势公布功能数据,在数据凌驾指定阈值时发送关照。
  • 供应@Profiled注解和一套自界说机制,同意在与AOP框架(如AspectJ大概SpringAOP)集成时奇妙的计时。
上面的例子展示了怎样轻松使用这些功效。能够经由过程Perf4J开辟职员指南来懂得集成Perf4J的具体信息。
使用StopWatch类开辟计时期码

org.perf4j.LoggingStopWatch类用于在代码中增加计时语句并打印到尺度输入大概日记文件中:
  1. StopWatchstopWatch=newLoggingStopWatch();//...executecodeheretobetimedstopWatch.stop("example1","custommessagetext");       
复制代码
stop()办法的挪用纪录了实行工夫并打印日记信息。默许情形下,基类LoggingStopWatch将输入打印到System.err流中。可是年夜多半情形下,你必要利用一个集成到现有Java日记框架(如Log4JStopWatchCommonsLogStopWatch大概Slf4JStopWatch)的子类。上面是一些stopwatch的输入示例:
  1. start[1233364397765]time[499]tag[example1]message[custommessagetext]start[1233364398264]time[556]tag[example1]message[custommessagetext]start[1233364398820]time[698]tag[example1]message[custommessagetext]
复制代码
利用LogParser创立统计数据和图表

固然默许的stopwatch输入比拟间接挪用System.currentTimeMillis()来讲没有很年夜的改善,但真实的优点在于可以剖析这些输入以天生统计数据和图表。LogParser经由过程tag和工夫片把stopwatch输入分组,天生具体的统计信息和可选的工夫序列图(利用GoogleChartAPI)。上面是一些利用默许文本格局(也撑持csv格局)的示例输入:
  1. PerformanceStatistics20:32:00-20:32:30TagAvg(ms)MinMaxStdDevCountcodeBlock1249.42487151.337codeBlock2.failure782.9612975130.817codeBlock2.success260.76500159.520PerformanceStatistics20:32:30-20:33:00TagAvg(ms)MinMaxStdDevCountcodeBlock1244.07494150.641codeBlock2.failure747.9531943125.321codeBlock2.success224.126398106.821PerformanceStatistics20:33:00-20:33:30TagAvg(ms)MinMaxStdDevCountcodeBlock1289.310464141.122codeBlock2.failure781.1599947135.18codeBlock2.success316.2115490112.613
复制代码
均匀实行工夫和每秒事件处置量的图表以指向GoogleChartServer的URL的情势天生。

<br>
同时,固然LogParser默许从尺度输出中读取数据,可是你也能够指定一个来自运转时服务器的日记文件,用LogParser及时输入:
  1. tail-fperformance.log|java-jarperf4j-0.9.8.1.jar       
复制代码
集成Log4J

Perf4J的扩大功效年夜部分经由过程一套定制的log4jappender供应。如许开辟职员就可以在部署阶段经由过程十分熟习的日记框架来零零星散的增加剖析和监控功效(将来的Perf4J将供应定制logbackappender和java.util.logging处置器)。个中一个主要的功效是同意Perf4J作为JMXMBeans的属性展现功能数据,同时在功能低于可承受的阈值时发送JMX关照。由于JMX已成为处置和监控Java使用的尺度接口,供应Perf4JMBean开启了普遍的由第三方监控使用供应的功效。举例来讲,我们Homeaway的IT部门尺度化了Nagios和Cacti用于体系监控,这两个工具都撑持把MBeans作为数据源查询。
上面的log4j.xml文件示例显现了怎样启用用于JMX的Perf4Jappender:
  1. <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPElog4j:configurationSYSTEM"log4j.dtd"><log4j:configurationdebug="false"xmlns:log4j="http://jakarta.apache.org/log4j/"><!--Perf4Jappenders--><!--ThisAsyncCoalescingStatisticsAppendergroupsStopWatchlogmessagesintoGroupedTimingStatisticsmessageswhichitsendsonthefileappenderandperf4jJmxAppenderdefinedbelow--><appendername="CoalescingStatistics"class="org.perf4j.log4j.AsyncCoalescingStatisticsAppender"><!--TheTimeSliceoptionmeanstiminglogsareaggregatedevery10secs.--><paramname="TimeSlice"value="10000"/><appender-refref="fileAppender"/><appender-refref="perf4jJmxAppender"/></appender><!--ThisfileappenderisusedtooutputaggregatedperformancestatisticsinaformatidenticaltothatproducedbytheLogParser.--><appendername="fileAppender"class="org.apache.log4j.FileAppender"><paramname="File"value="perfStats.log"/><layoutclass="org.apache.log4j.PatternLayout"><paramname="ConversionPattern"value="%m%n"/></layout></appender><!--ThisJMXappendercreatesanMBeanandpublishesittotheplatformMBeanserverbydefault.--><appendername="perf4jJmxAppender"class="org.perf4j.log4j.JmxAttributeStatisticsAppender"><!--ThetagnameswhosestatistiCSShouldbeexposedasMBeanattributes.--><paramname="TagNamesToExpose"value="firstBlock,secondBlock"/><!--TheNotificationThresholdsparamconfiguresthesendingofJMXnotificationswhenstatisticvaluesexceedspecifiedthresholds.ThisconfigstatesthatthefirstBlockmaxvalueshouldbebetween0and800ms,andthesecondBlockmaxvalueshouldbelessthan1500ms.YoucanalsosetthresholdsontheMin,Mean,StdDev,CountandTPSstatistics-e.g.firstBlockMean(<600).--><paramname="NotificationThresholds"value="firstBlockMax(0-800),secondBlockMax(<1500)"/></appender><!--Loggers--><!--ThePerf4Jlogger.--><loggername="org.perf4j.TimingLogger"additivity="false"><levelvalue="INFO"/><appender-refref="CoalescingStatistics"/></logger><!--TherootloggersendsalllogstatementsEXCEPTthosesenttotheperf4jloggertoSystem.out.--><root><levelvalue="INFO"/><appendername="console"class="org.apache.log4j.ConsoleAppender"><layoutclass="org.apache.log4j.SimpleLayout"/></appender></root></log4j:configuration>
复制代码
除JMX插件,Perf4J也撑持天生功能图表的绘图appender,利用前真个Perf4J绘图Servlet。定制的csv结构能够轻松的导进Excel大概其他电子表格使用。
利用@Profiled注解简化功能日记

在代码中增添功能纪录语句(一般的日记语句)的一个弱点是下降了代码的“信噪比”,难以在特定代码块中遵守严厉的营业逻辑。为了改良这一不敷,Perf4J供应了@Profiled注解,能够增加在必要纪录实行工夫的办法上,同意办法自己不增加StopWatch代码:
  1. @Profiled(tag="dynamicTag_{$0}")publicvoidprofiledExample(StringtagSuffix){...businesslogiconlyhere}
复制代码
一旦增加了@Profiled注解,Perf4J的计时切面会经由过程一个面向切面的编程框架如AspectJ大概SpringAOP启用。这个切面在办法挪用四周到场创建和中断StopWatch实例的字节码。计时切面乃至能够有选择的利用AspectJ的加载时编织(load-timeweaving)功效。因而,经由过程利用加载时编织你能够包管那些没有启用功能监控的办法尽没有分外的包袱。
一个复杂的示例:基于Web的质数天生器

本示例将带你感觉怎样创立一个利用Perf4J库年夜多半功效的实在使用。你能够下载perf4jPrimes.war文件,然后Servlet容器中运转它。在war包中也包括该使用的源代码。
统统从简,本例子只包括两个次要的代码文件:primes.jsp用于显现天生的质数和承受用户指定的参数,PrimeNumberGenerator类包括真实的天生代码(年夜部分托付给java.math.BigInteger类)。个中有三处利用了Perf4J计时期码块:

  • primes.jsp创立Log4JStopWatch统计全部页面的天生工夫。
  • PrimeNumberGenerator.generatePrime()办法具有一个Profiled注解。
  • PrimeNumberGenerator.randomFromRandomDotOrg()也含有Profiled注解。
假如检察WEB-INF/classes/log4j.xml文件,你会看到启用了上面的Perf4功效:

  • 一切独自的stopwatch日记都被写进尺度输入(请注重你的servlet容器大概把尺度输入定向到磁盘的某个文件中)。假如必要的话,你能够间接利用LogParser
  • AsyncCoalescingStatisticsAppender被创立以汇总stopwatch日记并传送给下流的GraphingStatisticsAppendersJmxAttributeStatisticsAppender
  • 两个GraphingStatisticsAppender被创立,个中一个暗示均匀实行工夫,另外一个输入每秒事件数。
一旦在Web服务器上启动了该Web使用,你就能够经由过程http://servername/<rootContextLocation>/primes.jsp会见质数天生页面,个中rootContextLocation由你的Web服务器设置决意(固然,为了便利,你也能够经由过程http://servername/<rootContextLocation>/PrimeNumberGenerator.java检察PrimeNumberGenerator源代码)。在primes.jsp页面中,你会看到良多用于质数天生的分歧参数。你能够改动参数,然后点击“天生质数”按钮,看看这些参数是怎样影响质数发生工夫的。在天生大批质数以后,你能够经由过程三种路子来检察Perf4J输入:

  • 原始的尺度输入日记。
  • 经由过程http://servername/<rootContextLocation>/perf4jGraphs会见图形化Servlet。你应当可以看到均匀实行工夫和每秒事件数。
  • JMX监控也启用了。你能够经由过程JavaSDK附带的jconsole使用检察Perf4JMBean值。这必要在启动Web服务器时,利用-Dcom.sun.management.jmxremote命令行参数。然后,假如在运转Web服务器的统一台呆板上启动jconsole就能够在“MBeans”标签中看到“org.perf4j.StatisticsExposingMBean.Perf4J”的数据值。
由于到如今为止你还没有启用任何TimingAspects撑持@Profiled注解,你可以看到的独一stopwatch输入就是“fullPageGeneration”标志。假如要启用TimingAspects,你可使用AspectJ加载时编织。你必要做的是,在启动Web服务器时利用AspectJweaving代办署理命令行参数:
  1. -javaagent:/path/to/aspectjweaver-1.6.1.jar
复制代码
你能够在这里下载jar包:http://mirrors.ibiblio.org/pub/mirrors/maven2/org/aspectj/aspectjweaver/1.6.1/aspectjweaver-1.6.1.jar
今世理启用时,你能够在“generatePrime”和“randomFromRandomDotOrg”标志中看到stopwatch的输入。
圈套与最好理论

良多监控使用的办法,不管是针对功能、不乱性仍是语义准确性,都没法最无效的表现它们的企图。要末天生了太多的信息以致于难以剖析这些数据,要末在必要信息的中央却得不到关头的数据。固然一切的监控都必要一些分外的开支,可是功能监控应当对这些引进的开支分外当心。以下倡议能够匡助你最年夜限制天时用Perf4J,同时又将反作用降到最低:

  • 在判别必要剖析哪些办法和代码块时,起首把重点放在关头点上。在企业使用中,每当碰到功能瓶颈时,城市存在良多“一般的疑点”:数据库挪用、运程办法挪用、磁盘I/O、针对年夜型数据集的盘算操纵。因而,你应当起首会合剖析这些范例的操纵。同时,由于这些操纵消费几十乃至几百毫秒的时间,Perf4J所带来的分外开支相对当地实行工夫来讲微乎其微,在理论中能够疏忽不计。现实上,这也是Perf4J存心利用System.currentTimeMillis(而不是System.nanoTime)计时期码块的缘故原由之一:纳秒的粒度在这类企业使用代码块中意义其实不年夜。
  • Perf4J把功能剖析的事情托付给自力的线程大概历程。当利用AsyncCoalescingStatisticsAppender时,实行线程把日记事务推进到一个内存中的行列,由别的一个自力的线程发送这些日记动静到下流appender。因而,即便那些下流appender做了大批敏感的事情,如创建图表、更新MBean属性大概存储到数据库中,对计时的代码块的影响微不足道,并且与这些下流appender做的事情几有关。相似的,当把计光阴志写进文件用于剖析和剖析时(比方,利用Unixtail命令),关于计时历程的影响也只与它写日记所消费的工夫有关,与log剖析器的工夫有关。
  • 不要健忘功能回回测试的优点。除监测运转时的功能瓶颈,Perf4J十分合适创立功能回回测试以判别代码变动是不是对功能有明显影响(不管是主动或悲观的)。经由过程创立一个原始代码的基准,你很快就可以发明新代码对功能发生了何种影响。
  • 使用@Profiled注解和AspectJ的加载时编织来决意哪些办法应当在部署时计时。假如利用了@Profiled注解,你能够自在的在办法挪用四周增加计时,然后决意在利用AspectJ的aop.xml设置文件举行部署时必要对哪些办法举行计时。没有计时的办法不会被存眷。固然那些被计时的办法比间接在代码中利用StopWatches存在一些渺小的分外开支(现实上AspectJ在计时办法的四周创建了一个闭包),这些开支相对那些必要消费几毫秒的办法来讲是微乎其微的。
  • 不要健忘使用程序中JVM以外实行的部分。举例来讲,良多Web2.0使用的年夜部分都是经由过程运转在客户端扫瞄器中的JavaScript完成,固然Perf4J能够用于权衡运转在服务器真个办法(呼应AJAX远程挪用),但假如JavaScript实行功能下落,你仍旧必要其他的客户端调试工具。
瞻望Perf4J

Perf4J今朝正在主动的开展,新的功效层见叠出。举例来讲,依附新版本的Perf4J,我们能够经由过程独自的设置文件指定要剖析的办法,如许即便没法取得某些办法的源代码也能够对其举行计时。我们一直将用户的反应和需求放在第一名,假如你想打造它将来的功效,那如今就来实验Perf4J吧。更主要的是,Perf4J在Apache2协定下完整开源,代码都充实文档化,你能够随便扩大。
如今就下载Perf4J吧,告知我们你的设法!
检察英文原文:PerformanceAnalysisandMonitoringwithPerf4J
本文来自:http://www.infoq.com/cn/articles/perf4j

大型的应用一般不会用这些框架(因为性能考虑);开发人员根据需要选择用一些框架,也可以不选用框架;不用框架并不代表要自己写框架;修改框架的可能性更小。
透明 该用户已被删除
沙发
发表于 2015-1-20 06:03:09 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
小女巫 该用户已被删除
板凳
发表于 2015-1-24 14:27:39 | 只看该作者
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
愤怒的大鸟 该用户已被删除
地板
发表于 2015-1-25 10:15:50 | 只看该作者
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
再现理想 该用户已被删除
5#
发表于 2015-1-26 21:15:53 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
兰色精灵 该用户已被删除
6#
发表于 2015-1-28 19:43:08 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
爱飞 该用户已被删除
7#
发表于 2015-2-3 12:10:07 | 只看该作者
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
金色的骷髅 该用户已被删除
8#
发表于 2015-2-8 20:54:22 | 只看该作者
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
只想知道 该用户已被删除
9#
发表于 2015-2-24 04:42:47 | 只看该作者
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
冷月葬花魂 该用户已被删除
10#
发表于 2015-2-28 19:04:09 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
若天明 该用户已被删除
11#
发表于 2015-3-2 09:30:37 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
蒙在股里 该用户已被删除
12#
发表于 2015-3-6 22:44:30 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
若相依 该用户已被删除
13#
发表于 2015-3-11 11:44:38 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
admin 该用户已被删除
14#
发表于 2015-3-16 05:00:25 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
再见西城 该用户已被删除
15#
发表于 2015-3-20 04:38:51 | 只看该作者
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
山那边是海 该用户已被删除
16#
发表于 2015-3-21 13:03:02 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
灵魂腐蚀 该用户已被删除
17#
发表于 2015-3-23 11:01:54 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
18#
 楼主| 发表于 2015-4-1 17:11:27 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
第二个灵魂 该用户已被删除
19#
发表于 2015-4-12 22:34:34 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
简单生活 该用户已被删除
20#
发表于 2015-4-12 23:36:59 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-6-16 16:19

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表