js判断全角半角的方法

function(str)//True 没有全角,False有全角 { for (var i = 0; i < str.length; i++) { strCode = str.charCodeAt(i); if ((strCode > 65248) || (strCode == 12288)) { return false; } } return true; } from:http://www.cnblogs.com/an-wl/archive/2011/05/26/2058109.html

龙生   11 Jul 2016
View Details

CSS3 transform-origin 属性

实例 设置旋转元素的基点位置:

页面底部有更多实例。 Internet Explorer 9 支持替代的 -ms-transform-origin 属性(仅适用于 2D 转换)。Internet Explorer 10、Firefox、Opera 支持 transform-origin 属性。 Safari 和 Chrome 支持替代的 -webkit-transform-origin 属性(3D 和 2D 转换)。 Opera 只支持 2D 转换。 定义和用法 transform-origin 属性允许您改变被转换元素的位置。 2D 转换元素能够改变元素 x 和 y 轴。3D 转换元素还能改变其 Z 轴。 为了更好地理解 transform-origin 属性,请查看这个演示。 Safari/Chrome 用户:为了更好地理解 transform-origin 属性用于 3D 转换的情况,请查看这个演示。 注释:该属性必须与 transform 属性一同使用。 为了更好地理解 transform 属性,请查看这个演示。 默认值: 50% 50% 0 继承性: no 版本: CSS3 JavaScript 语法: object.style.transformOrigin="20% 40%" 语法

值 描述 x-axis 定义视图被置于 X 轴的何处。可能的值: left center right length % y-axis 定义视图被置于 Y 轴的何处。可能的值: top center […]

龙生   08 Jul 2016
View Details

开源公司黄页之 Google 开源软件推荐

在企业使用开源和贡献开源方面,Google一直是行业的典范。一直以来,Google都在极力推广和倡导开源,并发布了一系列开源项目。如果没有开源软件,Google也难以达到今日的成功。开源中国社区目前收录了Google 259 款开源软件,详见:http://www.oschina.net/project/google Android SDK——Android SDK logoAndroid开发工具包 Android SDK 是 Android 的开发工具包。 Android是谷歌(Google)公司推出的手机开发平台。与iPhone相似,Android采用WebKit浏览器引擎,具备触摸屏、高级图形显示和上网功能,用户能够在手机上查看电子邮件、搜索网址和观看视频节目等,比iPhone等其他手机更强调搜索功能,界面更强大,可以说是一种融入全部Web应用的单一平台,下图是 Android 手机平台开发工具包说提供的模拟器界面截图: 但其最震撼人心之处在于Android手机系统的开放性和服务免费。Android是一个对第三方软件完全开放的平台,开发者在为其开发程序时 拥有更大的自由度,突破了iPhone等只能添加为数不多的固定软件的枷锁;同时与Windows Mobile、Symbian等厂商不同,Android操作系统免费向开发人员提供,这样可节省近三成成本。 Android项目目前正在从手机运营商、手机厂商、开发者和消费者那里获得大力支持。谷歌移动平台主管安迪·鲁宾(Andy Rubin)表示,与软件开发合作伙伴的密切接触正在进行中。从去年11月开始,谷歌开始向服务提供商、芯片厂商和手机销售商提供Android平台,并 组建“开放手机联盟”,其成员超过30家。     Android Studio——Android Studio logoAndroid 开发环境 Android Studio 是一个全新的 Android 开发环境,基于 IntelliJ IDEA。类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试,在 IDEA 的基础上,Android Studio 提供: 基于 Gradle 的构建支持 Android 专属的重构和快速修复 提示工具以捕获性能、可用性、版本兼容性等问题 支持 ProGuard 和应用签名 基于模板的向导来生成常用的 Android 应用设计和组件 功能强大的布局编辑器,可以让你拖拉 UI 控件并进行效果预览 Chrome——Google浏览器 Google Chrome,又称谷歌浏览器,是一个由Google(谷歌)公司开发的开放源代码网页浏览器。本软件的程式码是基于其他开放源代码软件所撰写,包括WebKit和Mozilla,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。软件的名称是来自于又称作“Chrome”的网络浏览器图形使用者界面(GUI)。 软件的beta测试版本在2008年9月2日释出,提供43种语言版本,目前仅适用于Microsoft Windows的XP及Vista平台,并不支援Windows 2000或更早期的版本。Mac OS X和Linux版本正在研发中,并将于日后推出。 Android NDK Android NDK 是在 SDK 前面又加上了原生二字,即 Native Development Kit,因此又被 Google 称为 NDK。 在此之前,Android平台的第三方应用程序均是依靠基于Java的Dalvik特制虚拟机进行开发的。原生SDK的公布可以让开发者更加直接的接触Android系统资源,并使用传统的C或C++语言编写程序,并在程序封包文件(.apks)中直接嵌入原生库文件。 不过,Google也表示,使用原生SDK编程相比Dalvik虚拟机也有一些劣势,比如程序更加复杂,兼容性难以保障,无法访问Framework API,Debug难度更大等。开发者需要自行斟酌使用。 众所周知,Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序。 NDK包括了: 从C / C++生成原生代码库所需要的工具和build […]

龙生   08 Jul 2016
View Details

说说C#的async和await

C# 5.0中引入了async 和 await。这两个关键字可以让你更方便的写出异步代码。 看个例子: public class MyClass {     public MyClass()     {         DisplayValue(); //这里不会阻塞         System.Diagnostics.Debug.WriteLine("MyClass() End.");     }     public Task<double> GetValueAsync(double num1, double num2)     {         return Task.Run(() =>         {             for (int i = 0; i < 1000000; i++)             {                 num1 = num1 / num2;             }             return num1;         });     }     public async void DisplayValue()     {         double result = await GetValueAsync(1234.5, 1.01);//此处会开新线程处理GetValueAsync任务,然后方法马上返回         //这之后的所有代码都会被封装成委托,在GetValueAsync任务完成时调用         System.Diagnostics.Debug.WriteLine("Value is : " + result);     } } 上面在MyClass的构造函数里调用了async关键字标记的异步方法DisplayValue(),DisplayValue()方法里执行了一个await关键字标记的异步任务GetValueAsync(),这个异步任务必须是以Task或者Task<TResult>作为返回值的,而我们也看到,异步任务执行完成时实际返回的类型是void或者TResult,DisplayValue()方法里await GetValueAsync()之后的所有代码都会在异步任务完成时才会执行。 DisplayValue()方法实际执行的代码如下: public void DisplayValue() {     System.Runtime.CompilerServices.TaskAwaiter<double> awaiter = GetValueAsync(1234.5, 1.01).GetAwaiter();     awaiter.OnCompleted(() =>         {             double result = awaiter.GetResult();             System.Diagnostics.Debug.WriteLine("Value is : " + result);         }); } 可以看到,async和await关键字只是把上面的代码变得更简单易懂而已。 程序的输出如下: MyClass() End. Value is : 2.47032822920623E-322 以下是我写的一个静态类,可以方便将一个普通Function执行异步调用: public static class TaskAsyncHelper {     /// <summary>     /// 将一个方法function异步运行,在执行完毕时执行回调callback     /// </summary>     /// <param name="function">异步方法,该方法没有参数,返回类型必须是void</param>     /// <param name="callback">异步方法执行完毕时执行的回调方法,该方法没有参数,返回类型必须是void</param>     public static async void RunAsync(Action function, Action callback)     {         Func<System.Threading.Tasks.Task> taskFunc = () =>         {             return System.Threading.Tasks.Task.Run(() =>             {                 function();             });         };         await taskFunc();         if (callback != null)             callback();     }     /// <summary>     /// 将一个方法function异步运行,在执行完毕时执行回调callback     /// </summary>     /// <typeparam name="TResult">异步方法的返回类型</typeparam>     /// <param name="function">异步方法,该方法没有参数,返回类型必须是TResult</param>     /// <param name="callback">异步方法执行完毕时执行的回调方法,该方法参数为TResult,返回类型必须是void</param>     public static async void RunAsync<TResult>(Func<TResult> function, Action<TResult> callback)     {         Func<System.Threading.Tasks.Task<TResult>> taskFunc = ()=>             {                 return System.Threading.Tasks.Task.Run(()=>                     {                         return function();                     });             };         TResult rlt = await taskFunc();         if(callback != null)             callback(rlt); […]

龙生   07 Jul 2016
View Details

Facebook 发布基站开源平台 OpenCellular

Facebook周三发布OpenCellular开源新平台,旨在通过向偏远地区提供连接移动蜂窝网所必须的设备和开源软件,以帮助居住于这些社区的人们实现连接互联网。此举是Facebook在推进全球互联网连接战略的又一新尝试。Facebook和扎克伯格当前的优先战略是帮助全球没有互联网覆盖的40亿人及没有手机服务覆盖的10%人口实现联网。 为此,公司推出了各种计划,包括热气球和无人机等,以辅助实现对这些偏远地区的互联网接入。然而不同于此前其它计划,OpenCellular的推广会依赖合作伙伴的加入,Facebook于周三公布了该计划的正式蓝图。 OpenCellular 在设计上主要针对环境条件极恶劣的偏远地区。Facebook将会为这些地区提供指导及必要的基础材料,以建造一座不受天气影响、能够在强风和高温下持续 使用的基站。OpenCellular只需要一个人就能完成安装,基站可以置于树上或距离地面几尺高的电杆上。 Facebook并不会亲自 部署和管理OpenCellular。该公司的计划是引导电信运营商、软件开发商以及研究人员等来尝试和安装设备。在设备完成安装后,技术人员将可以通过 监控方式远程操作。为减少需实际前往基站地点进行维护的情况,OpenCellular能够在出现严重问题并无法自我修复时,通知远程控制中心并自我重 设。OpenCellular支持使用太阳能供电,或者电池和PoE。 稿源:网易科技 from:http://www.oschina.net/news/74978/facebook-opencellular

龙生   07 Jul 2016
View Details

MIT 工程师开发出可编程 RNA 疫苗

MIT工程师开发出一种容易定制的疫苗, 能在一周内生产,能对疫情爆发快速做出反应。对小鼠的实验显示,可编程性使RNA疫苗对埃博拉、H1N1和刚地弓形虫具有100%效力。信使RNA能将携 带的遗传信息转译给蛋白质,它能针对病毒、细菌或寄生虫蛋白质进行编码,将信息转译给蛋白质去激发宿主的免疫反应。除了针对传染病外,研究人员正使用这种 方法去创造癌症疫苗,训练免疫系统识别和摧毁癌细胞。研究报告发表在本周出版的PNAS期刊上。 稿源:solidot奇客 from:http://www.oschina.net/news/74971/mit-engineers-developed-rna-vaccine

龙生   07 Jul 2016
View Details

docker详细的基础用法

1、docker安装 debian7安装docker 参考地址:http://www.webmaster.me/server/installing-docker-on-debian- wheezy-in-60-seconds.html echo deb http://get.docker.io/ubuntu docker main | sudo tee/etc/apt/sources.list.d/docker.list sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 sudo apt-get update sudo apt-get install -y lxc-docker #四行命令,Docker就安装好了。下面创建一个ubuntu虚拟系统: docker pull ubuntu #此处是从官网拉取名为ubuntu的image,也可手动在 https://index.docker.io上搜索想要的镜像。 docker run -i -t ubuntu /bin/bash #创建一个容器,-t是临时终端。 ubuntu12.04、windows、macOS安装docker 参考docker中文文档http://www.widuu.com/docker/ 2、docker使用过程实践 2.1 在测试机启动容器,安装ssh docker run -i -t ubuntu /bin/bash #此方式运行的容器,退出后容器就会 关闭。 apt-get install openssh-server #安装ssh #需要修改/etc/sshd/sshd_config文件中内容 PermitRootLogin yes UsePAM no 2.2 启动ssh,容器以后台方式运行 docker run -d -p 50001:22 <容器id> /usr/sbin/sshd-D #容器id可通过 docker ps-a查看,最上面的为最新的。 2.3 通过ssh连接到容器安装软件 ssh root@127.0.0.1-p 50001 #连上后想装什么就装什么,可使用exit退出容器,但后台还会运行。 2.4 服务安装完成后,停止容器。 docker stop <容器id> #停止运行的容器 2.5 把容器提交生成最新的镜像 […]

龙生   06 Jul 2016
View Details

EPON与GPON的介绍及主要区别比较[图]

导读:EPON和GPON各有千秋,从性能指标上GPON要优于EPON,但是EPON拥有了时间和成本上的优势,GPON正在迎头赶上,展望未来的宽带接入市场也许并非谁替代谁, 应该是共存互补。对于带宽、多业务,QoS和安全性要求较高以及ATM技术 作为骨干网的客户,GPON会更加适合。 什么是PON?宽带接入技术风起云涌,注定成为一块硝烟永远不会散去的战场。目前国内占主流仍然是ADSL技术,不过越来越多的设备厂商及运营商已经把目光投向了光网络接入技术。 铜价不断攀升,光缆价格不断下降,不断增长的IPTV, 视频游戏业务对带宽的巨大需求推动着FTTH的发展。由光缆取代铜缆及有线同轴电缆,电话,有线电视,宽带数据三网合一的美好前景变的清晰起来。 图一:PON 拓扑结构 PON(Passive Optical Network)无源光网络是实现FTTH光纤到户的主要技术,提供点到多点的光纤接入,如图一所示,它由局侧的OLT(光线路终端)、用户侧的ONU(光网络单元)以及ODN(光分配网络)组成。一般其下行采用TDM广播方式、上行采用TDMA(时分多址接入)方式,组成点到多点树形拓扑结构。PON作为光接入技术最大的亮点是“无源”,ODN中不含有任何有源电子器件及电子电源,全部由光分路器(Splitter)等无源器件组成,管理维护运营成本较低。 PON发展史 PON技术研究起源于1995年,1998年10月,ITU通过了FSAN组织(全业务接入网)所倡导的基于ATM的PON技术标准——G。983。也被称为BPON(BroadbandPON)。速率为155Mbps,可选择支持622Mbps速率。 EFMA(Ethernetin the First Mile Alliance,第一英里以太网联盟)于2000年底提出了Ethernet-PON(EPON)的概念,传输速率达1Gbps,链路层基于简单的Ethernet 装。 GPON(Gigabit-CapablePON)由FSAN组织于2002年9月提出,2003年3月ITU通过了G。984。1和G。984。2协议。G。984。1对GPON接入系统的总体特性进行了规定;G。984。2对GPON的ODN(Optical Distribution Network)物理媒质相关子层进行了规定;2004年6月ITU又通过了G。984。3,它对传输汇聚(TC)层的相关要求进行了规定。 EPON和GPON产品比较 EPON和GPON作为光网络接入的两个主力成员,各有千秋,互有竞争,互有补充,互有借鉴,下面在各个方面对它们作个比较: 速率 EPON提供固定上下行1。25Gbps,采用8b/10b线路编码,实际速率为1Gbps。 GPON支持多种速率等级,可以支持上下行不对称速率,下行2.5Gbps或1.25Gbps,上行1.25Gbps或622Mbps,根据实际需求来决定上下行速率,选择相对应光模块,提高光器件速率价格比。 本项结论:GPON优于EPON。 分路比 分路比即一个OLT端口(局端)带多少个ONU(用户端)。 EPON标准定义分路比1:32。 GPON标准定义分路比下列几种1:32;1:64;1:128 其实,技术上EPON系统也可以做到更高的分路比,如1:64,1:128,EPON的控制协议可以支持更多的ONU。分路比主要是受光模块性能指标的限制,大的分路比会造成光模块成本大幅度上升;另外,PON插入损失15~18dB,大的分路比会降低传输距离;过多的用户分享带宽也是大分路比的代价。 本项结论:GPON提供多选择性,但是成本上考虑优势并不明显最大传送距离GPON系统可支持的最大物理距离,当光分路比为1:16时,应支持20km的最大物理距离;当光分路比为1:32时,应支持10km的最大物理距离。EPON与此相同,本项结论:相等。 QOS(Quality of Service) EPON在MAC层Ethernet包头增加了64字节的MPCP多点控制协议 (multipointcontrolprotocol),MPCP通过消息、状态机和定时器来控制访问P2MP点到多点的拓扑结构,实现DBA动态带宽分配。MPCP涉及的内容包括ONU发送时隙的分配、ONU的自动发现和加入、向高层报告拥塞情况以便动态分配带宽。MPCP提供了对P2MP拓扑架构的基本支持,但是协议中并没有对业务的优先级进行分类处理,所有的业务随机的竞争着带宽,GPON则拥有更加完善的DBA,具有优秀QoS服务能力。 GPON将业务带宽分配方式分成4种类型,优先级从高到低分别是固定带宽(Fixed)、保证带宽(Assured)、非保证带宽(Non-Assured)和尽力而为带宽(BestEffort)。DBA又定义了业务容器(trafficcontainer,T-CONT)作为上行流量调度单位,每个T-CONT由Alloc-ID标识。每个T-CONT可包含一个或多个GEMPort-ID。T-CONT分为5种业务类型,不同类型的T-CONT具有不同的带宽分配方式,可以满足不同业务流对时延、抖动、丢包率等不同的QoS要求。T-CONT类型1的特点是固定带宽固定时隙,对应固定带宽(Fixed)分配,适合对时延敏感的业务,如话音业务;类型2的特点是固定带宽但时隙不确定,对应保证带宽(Assured)分配,适合对抖动要求不高的固定带宽业务,如视频点播业务;类型3的特点是有最小带宽保证又能够动态共享富余带宽,并有最大带宽的约束,对应非保证带宽(Non-Assured)分配,适合于有服务保证要求而又突发流量较大的业务,如下载业务;类型4的特点是尽力而为(BestEffort),无带宽保证,适合于时延和抖动要求不高的业务,如WEB浏览业务;类型5是组合类型,在分配完保证和非保证带宽后,额外的带宽需求尽力而为进行分配。 本项结论:GPON优于EPON 运营、维护OAM EPON没有对OAM进行过多的考虑,只是简单的定义了对ONT远端故障指示、环回和链路监测,并且是可选支持。 GPON在物理层定义了PLOAM(PhysicalLayerOAM),高层定义了OMCI(ONTManagementandControlInterface),在多个层面进行OAM管理。PLOAM用于实现数据加密、状态检测、误码监视等功能。OMCI信道协议用来管理高层定义的业务,包括ONU的功能参数集、T-CONT业务种类与数量、QoS参数,请求配置信息和性能统计,自动通知系统的运行事件,实现OLT对ONT的配置、故障诊断、性能和安全的管理。 本项结论:GPON优于EPON 链路层 装和多业务支持 如图二所示,EPON沿用了简单的以太网数据格式,只是在以太网包头增加了64字节的MPCP点到多点控制协议来实现EPON系统中的带宽分配,带宽轮讯,自动发现,测距等工作。对于数据业务以外的业务(如TDM同步业务)的支持没有作过多研究,很多EPON厂家开发了一些非标准的产品来解决这个问题,但是都不理想,很难满足电信级的QoS要求。 GPON基于完全新的传输融合(TC)层,该子层能够完成对高层多样性业务的适配,如图二所示,定义了ATM 装和GFP 装(通用成帧协议),可以选择二者之一进行业务 装。鉴于目前ATM应用并不普及,于是一种只支持GFP 装的GPON。lite设备应运而生,它把ATM从协议栈中去除以降低成本。 GFP是一种通用的适用于多种业务的链路层规程,ITU定义为G。7041。GPON中对GFP作了少量的修改,在GFP帧的头部引入了PortID,用于支持多端口复用;还引入了Frag(Fragment)分段指示以提高系统的有效带宽。并且只支持面向变长数据的数据处理模式而不支持面向数据块的数据透明处理模式,GPON具有强大的多业务承载能力。GPON的TC层本质上是同步的,使用了标准的8kHz(125μm)定长帧,这使GPON可以支持端到端的定时和其他准同步业务,特别是可以直接支持TDM业务,就是所谓的NativeTDM,GPON对TDM业务具备“天然”的支持。 本项结论:对多业务的支持GPON的TC层要比EPON的MPCP强大。 图二:GPON与EPON协议栈比较 网络层次GPONEPON L3ATMTDMIPTDMIP L2ETHERNETETHERNET WITH MPCP GFP L1PON-PHYPON-PHY 结语 EPON和GPON各有千秋,从性能指标上GPON要优于EPON,但是EPON拥有了时间和成本上的优势,GPON正在迎头赶上,展望未来的宽带接入市场也许并非谁替代谁,应该是共存互补。对于带宽、多业务,QoS和安全性要求较高以及ATM技术作为骨干网的客户,GPON会更加适合。而对于成本敏感,QoS,安全性要求不高的客户群,EPON成为主导。 编 辑:初夏 from:http://www.cctime.com/html/2015-4-20/2015420936287107.htm

龙生   04 Jul 2016
View Details

我从编程总结的 22 个经验

以下所列是我在这些年来软件开发工作过程中受到的启发,还有总结而来的好经验。 开发 从小事做起,然后再扩展 无论是创建一个新的系统,还是在现有的系统中添加新的功能,我总是从一个简单到几乎没有任何所需功能的版本开始,然后再一步一步地解决问题,直到满意为止。我从来没有妄想过能够一步登天。相反,我一边开发一边学习,同时新掌握的信息还可以用于解决方案中。 我很喜欢 John Gall 的这句话: “复杂系统总是源于简单系统的演化。” 2. 一次只做一件事 当我们在开发时,碰到测试失败和功能无效的情况,如果你一次只研究一个问题,那将会更容易找到问题的关键。换言之,就是使用短迭代。必须确保这个问题解决之后,再转移到另一个问题上。这适用于向下提交。如果在你添加新功能之前需要先重构代码,那么先提交重构,然后再添加新的功能。 3. 尽早地添加日志和错误处理 在开发新系统时,我做的第一件事就是添加日志和错误处理,因为这两者从一开始就非常有用。对系统来说它比一大把代码更有用,你需要一些了解程序状态的方法。如果系统不能照常工作,那么你就需要知道程序中发生了什么——这是日志的作用。错误处理也是如此——错误和异常越早处理越好。 4. 每一行新代码必须至少执行一次 在你真正完成一个功能之前,你必须对它进行测试。不然,你怎么知道它是不是按照你的想法在执行呢?通常情况下,最好的方法是通过自动测试,但并非总是如此。不过,不管怎么说,每一行新代码必须至少执行一次。 一般,我们想触发某种条件很难。但幸运的是,我们可以作弊。例如,数据的错误处理可以通过临时拼写错一个列名来触发。或者,一个if语句可以暂时颠倒过来(从 if error 变成 if not error),这样来触发那些平时很难触发的条件,这样只是为了确定代码是否正常运行和它会出现什么结果。 有时,我发现有一些行代码永远都不会被运行。当我们做代码检查是它看起来没有什么问题,但就是不工作。你要避免这样的尴尬状况,如果你想你的每一行新代码都会被执行。 5. 在整体测试之前先进行模块测试 先进行部分模块测试可以节省时间。通常说来,我们在整合不同的模块时也会出现问题,例如模块之间的接口不匹配。但是如果我们能够信任各个组件的话,那么跟踪集成问题就会变得简单得多。 6. 所有事情所花费的时间总是比你预期的要长 特别是在编程中,即使一切进展顺利,我们也很难对功能所需的时间做出正确的预算。并且,开发软件时碰到各种意想不到的问题是非常常见的。一个简单的合并操作会导致一系列小bug,一次框架升级意味着一些函数必须改变或者一些API不按照你想象的那样工作。 Hofstadter Law( 霍夫施塔特定律)其实道出了真谛:做事所花费的时间总是比你预期的要长,即使你在预期中已经考虑了 Hofstadter Law( 霍夫施塔特定律)。 7. 先了解现有的代码 大多数的编码都需要以某种方式改变现有的代码。即使是新功能,也需要适应现有的程序。所以,在你加进去新的内容前,首先需要了解当前的解决方案。否则,你一不小心就很有可能会打破现有的功能。这意味着,阅读代码和编写代码都是必要的技能。这也是为什么看似微小的变化仍可能需要很长时间才能解决的原因之一,因为你首先必须了解上下文。 8. 阅读和运行代码 幸运的是,对于理解代码,我们有两种互补的方法。你可以阅读代码,也可以运行代码。运行代码的确是个非常棒的好方法。所以,请确保充分利用这两种方法。 故障排除 9. Bug 总是难免的 我不喜欢那些宣称软件开发可以“一蹴而就”的高谈阔论。不论你再怎么努力,bug总是难免的(BUG的定义基本上是:“我们没有想到”)。最好能够做成可以快速故障排除、修复bug和部署修复的系统。 10. 解决故障报告 每个开发人员都应该花时间去处理来自客户的故障报告,并修复bug。这能让你更好地理解客户的意图,明白如何使用系统,知道排除故障的难易程度,了解系统的设计情况。这也是为自己的开发成果负责的好方法。不要错过这些好处。 11. 重现问题 修复bug的第一步就是重现问题。然后你得确保修复之后,问题能够彻彻底底地消失。这样一个简单的规则,可以确保你不会误将非问题当作是问题,并确保解决方案真的能够奏效。 12. 修复已知错误,然后再看看有没有其他不对的地方 有时候,可能同时存在着几个不同的问题。它们之间的互相作用,可能会让你毫无头绪,束手无策。不要纠结于搞清楚发生了什么,先去解决所有已知的问题,然后再看看还有什么不对的地方。 13. 没有巧合 在测试和故障排除时,不要相信会出现什么巧合。就像你改变了定时器的值,那么就会改变系统重启的频率。所以一切都并非是巧合。添加新功能,另一个不相干的功能变慢了?这绝对不是巧合。相反,是你应该仔细调查的内容。 14. 关联时间戳 在故障排除时,事件的时间戳可以作为你的好帮手。寻找偶数增量。例如,如果系统重启了,并且刚刚发出过一个3000毫秒左右的请求,那么可能是触发了某个定时器,才导致出现重启的动作。 合作 15. 面对面的交流最有效 当我们需要讨论如何解决问题时,那么面对面的交流比视频、打电话和电子邮件都要好。我经常在与同事讨论完后发现一个令人兴奋的更好的方案。 16. 小黄鸭调试法 遇到你绞尽脑汁也解决不了的问题时,不妨找一个同事,然后将问题解释给他们听。很多时候,当你在叙述时,即使你的同事一言不发,你可能也会突然灵光乍现找到问题的关键。听起来像魔法,但是这经常起作用。详情看这篇文章:《小黄鸭调试法,每个程序员都要知道的》 17. 问问题 阅读和运行代码往往非常有助于指出代码的目的和它的工作原理。但是如果你有机会咨询那些更为了解的人(例如原来的程序员),那么千万不要错过。继续问他们具体的问题、后续的问题,这几分钟内给你的信息可能是你需要花费好几天才能获得的。 18. 共享荣誉 不要贪图荣誉,该是谁的就是谁的。例如:“Marcus 想出了这个主意……”(如果真是他想的话),而不要说“我们想出的……”。大胆的说出那些帮助过你或者贡献过力量的人的名字。 其他 19. 动手去做 如果你不知道某种编程语言功能的工作原理,那么不妨写一个小程序来理解它是如何工作的。这同样适用于测试你正在开发的系统。如果我将参数设置为-1,会发生什么?当我在重启系统时,如果服务当掉,会发生什么?以此来研究它的工作原理。经常做这些会帮你发现bug,在此同时也会加深你的系统工作的了解。 20. 带着问题睡觉 如果你正在解决一个很难的问题,那么不妨带着问题睡觉。有科学研究表明,这样做虽然你表明上并没有在主动思考,但你的潜意思却这么做了。其结果就是,第二天再去研究问题,解决方案已经呼之欲出了。 21. 改变/跳槽 不要害怕角色变化。和不同的人共事,开发不同的产品,感受不同的公司文化是非常有意思的。在我看来,太多的人只是被动地呆在同样的地方年复一年的工作,只有在被迫的情况下才去改变。 22. 活到老学到老 软件行业的一大魅力就是我们随时有机会可以学到新的东西。你可以尝试不同的编程语言和工具,阅读软件开发的书籍,接受MOOC课程。相信我,量变才能达到质的飞跃,这些小小的学习积累,终有一天会大大地提高你的知识和能力。 […]

龙生   04 Jul 2016
View Details
1 264 265 266 432