首页 > 代码库 > 我们团队如何构建软件
我们团队如何构建软件
本文探讨的主要是互联网软体的构建,虽然文中提到的技术也可以用在传统脱机环境。
我们都知道,在拥有互联网的情况下,构建软体最让人向往的方式应该是像web站点一样,我写了什么,用户不需要升级神马的,在浏览器刷新一下就能看到了,我们暂且称这种软体构建方式为web构建方式。他最大的特点有前后端分离,动态加载,即时交付(这包括软体本身和新的内容的分发),可控,维护方便。
反观传统的软体构建方式,耗时耗力,而且基本都要自带精密的升级模块,bug报告模块,但这种软体提供的特性目前来讲是web方式构建的软体所没有的。原生的ui,更精良的用户体验,某些地方保持高度机密和性能。
如果能结合两者的利处,相信是很好的。很多项目或者团队也做过这一方面的努力,就我所知的有道有个什么hex,包括qt自家的webengine。。。
贴一张mac版的有道词典截图,windows版的不想安装,更不想使用,就不截图了
从我个人的审美角度来讲,原生ui能给我更亲切更舒适的体验,而基于hex的windows版的有道词典,说实话,让我有点反感,感觉不伦不类。
综上所述,我们发现当前大家几乎都是想依靠web来模拟native,即所谓的hybrid,将部分web无法表达的交给native。但如果我们反过来想想问题,native比web差的只是方便,而web则是不能,那我们何不补齐native相对于web差的那一部分。当然我们主要不是探讨native和web(htmlx)哪个更适合做ui,我倾向native,native的资源更加丰富,所以我们团队的解决方案是基于native补齐web构建方式的优点。
我们选择了python作为我们的胶水语言,核心部分则是c和c++,但真的只是很少很少的一点核心部分,如果不是为了保密和性能的需要,可能我们都不会用c/c++。毕竟python带来的效率的提升真的很可观。而且它和c天成的交互能力实在让人印象深刻。
我们将python解释器内嵌在一个c编写的很小的引导程序当中,这个c的引导程序只有一个功能,能够加载我们托管在http站点(或者其他比如ftp站点,任何可托管内容的地方)处的py脚本。我们约定这个脚本叫boot.py(或者pye,这是因为它可以支持加载加密压缩过的py脚本),这个引导程序启动boot模块里面的start函数,一个示例的boot.py会是这样。
__author__ = 'shawhen' from PyQt5.QtWidgets import * def start(*args): from . import main_window as m_main_window app = QApplication([]) main_window = m_main_window.MainWindow() main_window.show() app.exec()(实际上在我们的生产服务器上它是boot.pye文件,内容看起来是这样的:
0
?蘂8堰捋? 蔯=蘩q-?淅塯&Htk-v??搖:2E榁冖觻檾绅潎弾[EQoL??^己?=砚}詅瀳dLJ璡>=祢紆?窦聱<傫娓靿爒?镶?鷴皀*E
鱟Ag塼L?2埮鰊?c?玭 淫!硲W母pmk
屆OA硶7洒?衉<舺绫k鐖&偸礎讳相G!閑;洠Jf7吐M,跒Q濗S?
)
在引导程序里面,也只是很少的一些代码:
#include <python_importer_loader.h> #include <stdio.h> #include <stdlib.h> int main(int argc,char** argv) { char whats_wrong[4096] = {0}; int exit_code = 0; python_importer_init(__WEB_IMPORTER__ | __LOCAL_IMPORTER__, 3004002); python_importer_enable_crypto(1, "your password here", strlen("your password here")); python_importer_register_domain("your.domain.here", "http"); python_importer_load("your.domain.here.boot", argc, argv, whats_wrong); exit_code = python_importer_exit(); return (exit_code); }
是的,我们依靠Qt的Python绑定版PyQt作为ui库,这会使得我们使用Python构建出native的应用。和传统python程序不同的地方就在于这些脚本像web站点一样,托管在远程服务器上。我们不需要主动去更新用户的xx文件,将新的脚本放在服务器上就好了。使用这个程序,就像浏览一个web站点一样,但用户获得的体验是完全的native。甚至于我可以随意加载系统动态链接库,实现一个系统刚刚发布的新的api,而这些在现有的web中是几乎不可能的。
当然,即使没有这个c的引导程序,我们也一样可以获得这种魔法,我们将这个c的引导程序和它真正做的事情托管在github的这里:https://github.com/shawhen/pywebimporter
当然,还有更多的事情等待我们去做,这只是一个开始。
我们团队如何构建软件