刚才过去公司的同事电话来问我以前写的一些代码的事情。我问了一下,原来老总终于又忍不住出来讨论产品速度的问题,而要求下面再做优化。老总不知道的是,做web方面的主力,在过去半年里面已经走了两个,过去web前端代码的90%都是这两个人写的。
这个公司的产品是一个特殊的桌面软件,对业界或者对我较熟悉的都知道,我这里就不说名字了。客户端本身并不是基于浏览器的,而是delphi开发的。但是考虑到第三方应用开发的便利性,因而决定使用定制的browser作为其他应用的开发平台。目前所包含的定制浏览器使用的是微软的webbrowser控件。
从整个产品说,它其实是一个特殊的平台(容器),理想上,可以集成许多第三方应用(也可包括自己开发的应用),所有应用从理念上说都应该是C/S结构的,在C端可以选择不同的UI实现方式,如用delphi,c++等开发的,用browser的,用flash的。实际上作为平台,它也需要提供给应用一些接口,例如用户身份验证。事关UI的例子有统一支付UI,因为无论如何与第三方合作,钱的流转总是握在公司手中,这也是作为服务商的应有之意。再如,特殊输入设备的支持,如遥控器API,也是由平台提供给各种C端UI。
显然,根据这个产品的目标,大部分的第三方应用其实采用某种RIA是最合适的。这方面最大的考量应该是开发的便利性。因此如果采用browser技术,其实应该使用一种最高效、方便的引擎。IE引擎显然不是合适的选择。
举个例子来说,要比较cool的界面,而且支持换肤,我们会考虑采用大量的透明png。但是在IE中支持alpha通道极其麻烦。我在公司的时候,写过两套方案,分别是使用filter和vml。但是两者都有缺陷。filter有很多问题例如点击失效,但这些都还能解决。最大的缺陷是不能和zoom共同使用,而我们的应用有自动缩放适应用户屏幕分辨率的需求。vml本身是很好的,但是vml有个非常要命的问题,就是vml组件不认缓存,所有图片就算已经在缓存里面也至少需要一个304响应。
过去我参与的会议上也曾经多次提出IE的渲染引擎、脚本引擎都存在许多问题。然后上面也说考虑采用其他引擎,但是讨论了若干次始终拖着没有进展。
后来我参与做的一个重要应用,原来都是用网页加脚本形式做的,但是由于种种原因导致loading速度过慢。在我离开公司之前,老总决定换成用flash做了一套(这也源于一开始设计的时候就是ajax方式的才有可能这样)。
现在,公司老总似乎觉得还是不行。因此又再次旧话重提。但是可以想像的是,还是一团浆糊收场。公司的那些中层决策的结果,又是要先把能改善的改善起来,如减少html,css,js源文件大小。
我就跟同事说,这样做事是不对的。
如果要决定采用一个引擎,那你首先选择引擎。确定了才考虑改善代码。因为代码是依赖于引擎的。比如现在大量的代码其实是为了解决IE的各种bug。如果换了引擎,自然就清爽了许多。而且引擎端的提高远远大于改进代码的效益,引擎端也可以做很多代码无法做的优化。你在html,css,js花费精力那是事倍功半,而改进引擎端,则是事半功倍。例如脚本引擎。IE的脚本引擎存在许多问题,如内存泄漏,如对象增多时创建新对象的性能显著下降。换一个js引擎,这些问题就统统不存在了。作为一个AJAX应用,这个提高可想而知。
又例如脚本代码大小的问题。当然我们应该去优化和重构代码,但是有个度的问题。比如你把用到的库像是prototype都优化掉,比如你把日志统统去掉?实际上,如果是自己可以改进源码,可以customize的C端,完全没有必要一味压缩脚本,而是可以总结出标准库,直接放入定制浏览器中,来避免下载的时间。如果深入下去,甚至可以改进js引擎代码,把一些标准类库做成built-in的,避免多次解析的时间!
实际上,这样的事情,即使针对IE引擎也是有可能的,例如vml不认cache的问题,可以默认走一个本地proxy。类库也可以置于本地或采用某种高性能缓存。但是这些可能的优化,由于种种原因,始终没有被排进日程。
那么现在这样改,拿一个很简单的项目改,即使html,css,js被压缩到只有50k以内,又有什么价值呢?是否付出了其他代价呢(例如不支持换肤)?其他应用呢?
所以整体架构上的问题要比细枝末节重要的多。公司的中高层们始终无法搞清楚如何抓住主要矛盾,合理调配资源,只会做人不会做事(虽然我相信他们也有难处)。也不仅仅是这一件事情了,我多次向上面提出某个产品非常重要,而且关键问题不仅在技术上,而在产品设计上,应该组建一个团队来推进,靠一个程序员是肯定不行的,但是始终没有动静,甚至公司老总用这个产品很不爽都直接提出了设计细节上的意见,汗颜啊,这是老总该管的事情吗?但是竟然也没有改善,估计到现在,还是只有一个已经对这个产品失去兴趣的程序员在做这个产品。
唉,到现在我还忍不住牢骚满腹,那也就是我当时离开公司的原因之一了。
分享到:
相关推荐
4. **定制和扩展**:为了增强功能,可能已经实现了自定义的JavaScript接口,使得Java代码能够与网页内的JavaScript进行通信,或者增加了对特定网页操作的控制。 5. **错误处理**:处理加载失败、网络问题和其他可能...
总之,"C# webkit为内核的浏览器打开网页源码"项目是一个融合了C#编程、WebKit浏览器内核理解和自定义浏览器开发的实践案例,对于想深入了解这些领域的开发者来说,是一份宝贵的学习资源。通过研究和理解这些代码,...
这种应用程序通常集成了网络浏览器的功能,但具有更优化的用户体验和定制化服务。在这个案例中,"基于Android的新闻客户端新闻浏览器"显然利用了WebView组件来实现这一功能。 WebView是Android SDK提供的一种核心...
我们会从在 IE 的 JavaScript 实现中发现的漏洞开始,看我们如何利用IE的定制化堆分配器,来使最初的漏洞成为一个完整的内存读/写漏洞。随后,我们将展示我们用来绕过 Control Flow Guard (CFG)获得初始代码执行的...
6. **自定义功能**: 通过实现`ILifeSpanHandler`、`IRequestHandler`等接口,可以定制浏览器的行为,例如控制新窗口的打开、处理HTTP请求等。 7. **内存管理和资源释放**: 当不再需要浏览器实例时,记得调用`...
- **AuthenticationException**:身份验证失败时抛出。 - 自定义异常处理:可以定义自己的AccessDeniedHandler和AuthenticationEntryPoint来控制这些异常的处理方式。 7. **CSRF保护** - Spring Security提供...
在这个项目中,开发者针对WebBrowser控件进行了定制,以实现类似Maxthon(傲游)浏览器的多标签浏览体验。 首先,我们需要了解C#中的WebBrowser控件。这是一个Windows Forms控件,它可以嵌入到应用程序中,用于加载...
但随着技术的发展,人们找到了利用AJAX进行文件上传的方法,例如通过使用插件或库,如本案例中的"ajaxfileupload"。 "ajaxfileupload"是一个JavaScript库,专门用于解决AJAX文件上传的问题。它使得开发者能够轻松地...
### IT知识要点:淘宝网Nginx定制与开发实战...综上所述,淘宝网通过Nginx的深度定制与开发,不仅极大地提升了网站的性能和稳定性,还增强了系统的安全性和用户体验,为大规模电商平台的技术架构提供了宝贵的实践案例。
`reset.css`通常用于清除浏览器默认样式,使跨浏览器的样式表现一致;而`index.css`则是针对聊天界面的定制样式,如字体、颜色、布局等。 ```css /* 示例CSS */ body { font-family: 'Microsoft YaHei'; } .wrap ...
- **浏览器兼容性**:虽然大部分现代浏览器都支持`Photo-Sphere-Viewer`,但老版本的IE可能需要额外的 polyfills。 - **移动端适配**:在移动设备上,需考虑触控事件的处理和屏幕旋转后的适配。 通过以上介绍,你...
在案例三中,可能涉及到使用报表工具或库(如水晶报表、SQL Server Reporting Services 或者开源的JasperReports)来创建和定制报表结构。这些工具提供了丰富的功能,如数据源连接、查询构建、数据集定义、布局设计...
标题中的“chrome插件”指的是在Google Chrome浏览器中使用的扩展程序,它们是由JavaScript、HTML和CSS等技术编写的,用于增强或定制浏览器的功能。在这个特定的案例中,这个插件被设计来解决“程序随想博客”上的...
例如,如果网页加载失败或用户在关闭前进行了某些操作,可能需要添加额外的判断和处理逻辑。 此外,VB中的Threading模拟能让你在后台加载网页,防止UI(用户界面)冻结。这可以通过创建新的线程或使用ThreadPool来...
然而,随着浏览器版本的更新,一些较旧的插件可能不再兼容新的浏览器,比如在这个案例中,原始的Uploadify.js不支持Internet Explorer 10。然而,通过开发者们的努力,这个问题已经被解决,现在提供的修改后的版本...
通过这个小案例,初学者可以了解到Spring MVC的基础用法、Spring Security的基本认证流程,以及如何结合两者实现用户登录功能。在实际项目中,这些知识将有助于构建更复杂的业务逻辑和安全控制。
main.css可能包含模板的定制样式,而reset.css则确保所有浏览器在处理元素时有统一的起点,消除跨浏览器的样式差异。 3. Thumbs.db:这是Windows系统中一个自动创建的文件,用于存储缩略图信息,通常出现在包含图像...
在本案例中,我们关注的是一个名为"qlmx"的浏览器插件,该插件包含两个关键文件:qlmx.crx和qlmx.pem。 首先,`qlmx.crx`文件是Chrome浏览器插件的安装包格式。CRX(Chrome Extension)文件是谷歌Chrome浏览器用来...
在这个"CKEditor带图片上传案例"中,我们将探讨如何配置CKEditor以支持用户在编辑内容时上传图片,并确保图片能正确显示。 首先,我们需要理解CKEditor的基本结构。它是一个JavaScript库,通过在网页上创建一个可...
2. **高度可定制**:允许开发者通过API设置打印样式、纸张大小、方向等参数,以满足不同应用场景的需求。 3. **无插件需求**:用户无需安装额外的浏览器插件,降低了安全风险和使用门槛。 4. **打印预览**:提供预览...