- 博客(295)
- 资源 (28)
- 收藏
- 关注

原创 X公司的流程改造之路 (一) [课程报告]
起点X公司是一家中规中矩的公司,从事软件开发二十多年,一直使用传统瀑布开发模型,开发流程和相关的制度都已经完善。最近两年因为市场的变化,考虑到公司长远的产品线的竞争力,决策层决定推动新产品领域开发。但是传统的瀑布模型无法满足高层快速进行产品试水的需要,市场部的需求一改再改,并极力打造大而全的产品,虽然他们并不承认。两个项目(A, B)下来开发团队和公司高层都非常不满,团队士气低落,离职频繁
2012-07-03 00:35:54
11314
4
原创 车载系统上服务(应用)生态
智能汽车车载系统上的轻服务平台是一崭新的领域,对互联网和现有的汽车行业都是全新的。除了我们在互联网和汽车行业两个传统领域的融合外,还需要用新的思路来看待。由技术提供保障,通过更开放、更克制的方式推动生态的构建。
2021-12-25 00:44:29
2961
1
原创 文本压缩算法的对比和选择
本文主要粗略介绍数据压缩主要算法类别,以及最新针对Web文本资源的zStd和Brotli算法的设计要点。为Web业务应用如何使用它们替换传统gzip提供些参考。最后是一个文本有损压缩的尝试。
2017-07-15 16:21:23
17348
3
原创 关于PWA落地问题的思考
PWA是最近一个热门话题,很多开发同学都在尝试落地,其中也有些还在犹豫。这篇文章主要阐述对几个问题的看法,包括iOS支持的问题等,供大家参考。 注: 这不是一篇介绍PWA的文章。
2017-03-29 03:20:39
9927
3
原创 Web业务性能优化技术总结
Web业务的性能优化是一个系统工程,既有深度,又有广度。以下所简称性能均特指Web业务性能。 技术的广度上,主要从大背景下考虑到其各个相关方,基于共同的数据指标发掘和评估方案。 技术的深度上是一个渐进和迭代的过程。可以从性能的本质展到目前各端的主要优化方向。
2017-03-18 01:00:25
2991
1
原创 Chromimum Android渲染介绍
Chromimum Android渲染介绍从概念上一个使用硬件加速(AC)时,页面显示的结构是Viewport -> Layer(s) -> Tile(s),所谓的纹理就是Tile上显示的内容。分块最大的好处就是重绘的单元变小,更利于降低系统开销。
2017-03-14 00:31:46
3093
翻译 2017 前端性能自查表
Smashing Magazine在年底做了一个有意义的事,把最新的Web性能优化实践做了盘点,这里提供其中大部分内容的翻译,供大家参考。有很多我自己也没有深入学习的点,翻译也不能保证准确,所以有时间还是看原文。
2016-12-26 13:37:36
3784
原创 我们真的需要那么多专项吗?
在一个软件开发组织里,若干职能单位负责各个业务模块,然后就是大小各种专项。专项可以横向拉通各个单位,但专项一多,或者有点泛滥,各个业务单位的职责就会有所淡化,目标也有模糊的地方。专项就像是东厂、西厂,可以四处横行,而业务单位却不断要进行各种配合。利也? 弊也? 所谓专项一般为攻关,拉通多个沟通不畅的团队而设。如果团队之间配合无间,规划和执行也都到位,又何来专项!
2016-03-30 01:05:49
2200
原创 iOS Safari阅读模式分析过程
本文为Safari阅读模式分析过程记录,没有做很好的整理。详细看另外一篇<iOS Safari阅读模式研究>.
2016-03-23 00:19:15
8003
原创 iOS Safari阅读模式研究
Safari阅读模式的三个要点: (1) 阅读模式的检测 (2) 阅读模式的执行 (3) 阅读模式页面的控制 这是一篇在2013年准备的资料,现在分享出来,供有需要的同学参考。
2016-03-23 00:08:58
11003
1
原创 网络性能评价方法
目前度量网络的品质的方法如果仅以网络连接类型来区分,比如2G, 3G, Wifi等,无法有效感知到当时的网络状态。在同一网络连接类型下,网络的品质仍有大幅波动,可能会因为阻塞以及线路上问题导致延迟上抖动(jitter)、丢失数据包、数据包损坏等情况。本文基于对一段时间的网络数据的记录,进行算法处理,可以测出一个衡量当时网络状态的指标。
2016-03-08 00:41:45
17337
1
原创 页面性能的基础因素 - 《Designing for Performance》
考虑页面性能可以从两种场景,第一个场景也是因素最多的场景,即首次访问。第二个场景则是重复访问,缓存将起决定性作用。浏览器厂商为页面开发者提供了很多工具和插件,比如Chrome DevTools, YSlow和PageSpeed Insights。
2016-03-07 02:06:42
3753
1
原创 高效操作字串的String Reference类
只要不修改字串内容,并不需要另外复制一份。特别是对一些比较大的字串,避免拷贝对内存和性能都有极大的好处。于是Jeffrey Yasskin提出一个String reference : a non-owning reference to a string. 很多大型的项目都提供了各自的实现,包括Boost::StringRef, LLVM的StringRef, Chromium的base::StringPiece。
2016-02-06 06:57:01
4548
原创 何时使用static类(工具类)
一个static类,指全部成员都是static方法构成的,而没有任何成员变量, 也称为Utility class 或者Utility Pattern [参考: Utility Pattern].它可以在程序中直接使用该类的方法,而不用实例化.static class相对单例有更好的性能,原因是它的方法不需要实例方法的动态绑定 (static方法本身不能被复写)。 static类可以看作某一组方法的
2016-02-06 05:51:04
6198
翻译 如何实践设计原则
大家都知道遵循设计原则是开发高质量软件的重要基础,但实际运用时并不容易。Booch在面向对象分析与设计>>中提出了四个基础原则:抽象 核心思想是不变性的概念。去除不关心的属性,而强化重要的属性,帮助人们思考要做什么。封装 核心是分离关注和信息隐藏,让程序借助最少的工作进行可靠的修改。模块化 核心思想是分而治之,各个模块应当高内聚、低耦合。层次结构 核心是对抽象的分级和排序,可以简化对系统
2016-01-09 03:24:23
2802
原创 [Chromium]如何安全的使用PostTask
一般场景决策树如何传递绑定的对象官方的解释总是最权威,有疑问看这里或者直接看代码中的说明: bind_helpers.h. 传值方式描述示例this 或 对象指针如果对象本身是一个RefCountedThreadSafe, 没有问题.如果是个裸指针,应当尽量避免,除非你可以保证它的线程安全.
2016-01-09 01:25:19
7299
原创 Chormium线程模型及应用指南
核心概念设计上遵循以下原则:1 不要在UI线程做任何阻塞式的I/O操作,以及其它耗时的操作,通过消息传递把各种操作传给相应用途的线程去做。2 不鼓励线程加锁机制和线程安全对象。对象只存在一个线程,通过消息来实现线程之间的通信,线程之间不互相阻塞。通过callback对象实现跨线程请求。一般情况下,我们应该利用一个现有的线程,尽量不要创建新的线程。UI线程实际上会被设置为不允许I/O操作,并且不允许
2016-01-09 01:12:54
4696
原创 Chromium中跨进程文件句柄传递
在POXIS下,允许不同进程间传递文件描述符(File Descriptor))的, 比如传递socket,或者普通文件,进而可以达到不需要重新打开文件,而对相同文件读写的效果(并不是分享文件句柄)。Chromium对这个特性做了封装。
2015-11-02 01:15:05
3337
翻译 [OOD-More C++ Idioms] 写时拷贝 (Copy on Write)
本惯用法的目的是达到延迟拷贝(lazy copy)的优化目的。和延迟初始化(lazy initialization)相似, 选择在恰当的时机更加有效。
2015-10-31 01:00:10
2706
3
原创 软件研发管理:置身其中看问题
从局外人的角度的确可以清晰的发现问题,但很难得到一个合适的解决方法。** 只有将自己融进公司,融进团队,才能更清楚了解问题的本质,才能有好的应对方案。
2015-10-27 23:46:21
2809
翻译 [OOD-More C++ Idioms] 内部类 (Inner Class)
不用通过多重继承就可以实现多套接口,同时可以自然地向上转换(Up-casting)。在单个抽象下提供相同接口的多个实现。
2015-10-21 22:50:47
2515
原创 类是如何定义出来的
Object Oriented是多种软件设计方法中的一种,其核心目标是为了降低系统的复杂性,以及代码复用。在OO里,一个类(Class)代表了一组具有共同结构和行为的一组对象(Objects),是OO语言的基础。而类又是又如定义出来的呢?
2015-10-20 22:35:57
2542
翻译 [OOD-More C++ Idioms] 律师与委托人 (Attorney-Client)
律师与委托人 (Attorney-Client)目的控制访问类实现细节的粒度。C++中的friend会开始类内部的所有细节,也因此破坏了封装性。C++没有提供可以选择性使用某一部分私有成员的方式,要么全部开放,要么全部拒绝。如果能选择确定需要使用到的一组成员,而不是全部,就可以降低耦合性。而这个律师与委托人的惯用法就可以精准的控制友元所能使用的成员。
2015-10-17 23:57:47
3058
翻译 Google C++ Style Guide的哲学
Google C++ Style Guide并不是一个百科全书,也不是一个C++使用指南,但它描述适用于Google及其开源项目的编码指南,并不追求全面和绝对正确,也有许多人置疑它的一些规则。但作为一个最具影响力的编码规范,它里面有许多内容值得我们研究学习。以下主要摘自GSG负责人Titus Winters在CppCon 2014上的演讲。
2015-09-30 01:45:12
3092
1
原创 [OOD]违反里氏替换原则的解决方案
关于OOD的几个设计原则,大家耳熟能祥了,不再展开,可以参考设计模式的六大设计原则之里氏替换原则。这里尝试讨论常常违反的形式和解决方案。违反里氏替换原则的根源是对子类及父类关系不明确。我们在设计继承关系常常受一些主观认识的左右,比如Robert C. Martin提到的线段与线的关系,以及被大家说到烂的正方形与矩形。从以前的经验我们认为它们符合继承关系,比如线段是线的较短形式,正方形是矩形的一个特例
2015-09-24 01:00:14
5596
1
原创 为什么浏览器采用多进程模型
为什么浏览器采用多进程模型这个问题的答案似乎是非常清楚的,可以概括为:为了安全、稳定、性能,只是要牺牲点内存作为代价。对于安全和稳定,利用系统的进程机制就可以完成。但是多进程下的进程间通讯(IPC)很慢,而分为多进程后,一些协作任务就要分开到两个进程,如何能保持良好的性能,更不说比单进程模型更高的性能了? 所以这里再次探讨浏览器选择多进程架构的原因,以及对应架构中的要点。
2015-08-14 01:31:38
4665
1
原创 名不符实的读写锁
有一种单一写线程,多个读线程并发的场景,比如测量数据的读取与更新,消费者会比较多,生产者只有一个。以下图为例: 左侧是一种经典的解法,对数据整个操作加锁。为了一个写数据线程,于将所有读线程也进行加锁显然有点浪费了。于是提出读写锁(Reader/Writer Lock), 即使是使用了读写锁,其本质也是一样的,而且在POSIX下的pthread它的内部实现是基于mutex,所以它的开销更大。如果
2015-08-07 00:12:51
2309
原创 线程安全的观察者模式的设计
观察者模式的应用,主要的行为就是注册和移除观察者(observer),以及通知所有已注册的Observers。这里介绍的是Chromium项目中实现的线程安全的观察者管理及通知的基础类ObserverListThreadSafe。
2015-08-05 01:12:28
4883
原创 Google C++ Coding Style:右值引用(Rvalue Reference)
Google C++ Coding Style: Rvalue Reference 右值引用是一个C++11特性,标记为T&&。GSG中定义:只为移动建构函数(Move constructor)和移动赋值操作(Move assignment)使用右值引用。并且不要使用std::Forward(提供的完美转发特性)。
2015-08-04 00:14:41
2034
原创 Google C++ Coding Style:引用参数
Google C++ Coding Style定义输入参数以值或者const引用形式传入,输出参数使用指针。 所有以引用形式输入参数必须加上const,即const T&的形式。即如下形式:void Foo(const string &in, string *out);在如下情况下, 可以使用const T*的形式: * 需要进行指针的判空 (即空指针是合理的)。 * 需要使用到输入参数的指针或引用形式
2015-07-29 00:43:55
3041
1
原创 大型项目开发: 隔离 (《大规模C++程序设计》书摘)
书中第六章 隔离。 主要在撰述什么需要定义在头文件?什么应当移到编译单元中? 核心仍然是先区分接口定义与实现细节。实现细节的改变会导致客户代码的重新编译,从逻辑上也表示与客户代码间可能存在着强耦合。实现细节与隔离主要考察以下实现细节,它们会在接口中引入实现细节,也是需要考虑进行隔离的内容:继承分层 简单的说就是类的成员中有另一个类的实例时,如Foo mFoo. 这个类就会依赖于Foo的定义。
2015-07-20 00:47:06
3107
原创 大型项目开发:谨慎使用智能指针
智能指针使用上的问题智能指针的使用太普遍了,它让程序员摆脱了内存管理的恶梦,但实际上智能指针本身也可能引入另一个恶梦。主要包括两个问题点:1.性能问题。因为需要引入一些变量(bookkeeping),甚至在多线程下的一些互斥操作,它所带来的性能开销往往比想像的要高。2. 对象释放的时机不明确。比如std::auto_ptr,总让人感觉不明不白,从而引入一些隐晦的问题。
2015-07-13 00:30:37
6911
原创 大型项目开发: 头文件顺序
经验告诉我们,某些编码实践虽然在C++中完全合法,但是绝对不能应用于大型项目环境中。 大型项目环境下必须有适当的约束,否则很容易变得难以控制并很难维护(摘自<<大规模C++程序设计>>)。下面以Chromium中运用的两个Coding Style中定义的头文件顺序为例说明。
2015-07-09 00:25:17
4822
1
原创 技术债务管理以及Firefox/Chromium的债务评价
现在的软件开发是在遍地敏捷,人人讲唯快不破的时代,哪有人有时间思考代码质量,设计的质量? 哪个又不是从一堆代码中杀出血路来实现另一个功能?一个产品都存活不了几年,何必考虑什么可维护性?我们追求进度的时候,总是要牺牲些东西,或是破坏了一些东西等着后面补。这就是技术债! 管理不好,债台高筑,即使不破产,也是要拆东墙,补西墙的玩平衡。现实是残酷的,但不影响我们抬头看看这个世界。技术债务技术债务(Techn
2015-07-04 01:12:41
2723
原创 如何避免类的膨胀
类的膨胀(Bloating)指的是类中成员过多,甚至出现无序增加的情况。过大的类,会使得复杂度急剧增加,维护会变得更为困难。所以需要控制类的增长。本文总结了一下,简单介绍四种解决的方式,我故意用四个来讲,主要为了介绍最后一种方式。
2015-06-25 02:11:29
4187
2
原创 API的设计与实现
关于API的设计与实现API的设计是软件开发中一个独特的领域。最主要的特殊点在于API是供开发者使用的界面,即Application Programmer Interfaces。所以相对于依据软件设计的原则,考虑用户的”体验”会更加重要。许多著名的工具和库的作者都写过相关的著作,详细的论述他们在API上的设计与实现要点。本文是尝试对前人工作的总结。
2015-06-24 00:09:17
12066
1
原创 软件设计的复杂度
什么是软件设计的复杂度软件技术发展的使命之一就是控制复杂度(Complexity)。从高级语言的产生,到结构化编程,再到面向对象编程、组件化编程等等。本文介绍通过分解、改善依赖关系,以及抽象的方式来降低复杂度。
2015-04-30 00:57:32
9412
1
原创 [OOD] 隔离变化-桥接模式
使用一个抽象的接口隔离变化,既提高了各层的内聚性,又降低它们间的耦合。符合OO原则中的: 1. 封装变化 2. 针对接口编程,而不针对具体的实现。 3. 降低交互对象的耦合度。
2015-04-21 00:45:18
2451
1
原创 [OOD] 适配器模式
适配器模式常常与桥接模式相比较,两者最大的不同在于解决的问题不同。适配器用于对接两个不同的接口,而桥接则主要为了隔离变化。从应用上来说,一个是被动的,一个是主动的。 所谓被动的,就是当前的接口的差异是无法轻易改变的,必须引入一个中间层来解决。而中间层的引入往往带有性能、以及不必要的数据拷贝等开销,详细参考关于层的反模式讨论。如果接口是可控,就要尽量避免接口不一致的情形。而不是等待使用Adapter来处理。
2015-04-21 00:10:27
2096
Google Chrome中的高性能网络
2013-09-03
High Performance Browser Networking
2013-08-13
面向 HTML5 的图形加速和面向移动设备的 JAVASCRIPT 引擎 JIT 优化
2013-06-09
主动自我优化的编译器
2013-06-09
LLDB查看数据类型的示例脚本
2013-01-14
Lenovo LJ2000打印机驱动
2010-12-06
STL Documents from SIG.com
2009-09-20
实战KDevelop进行Linux软件开发
2009-03-11
实战KDevelop进行Linux软件开发
2009-03-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人