我的第一款全栈side project
我是wingjay,软件工程师,现居上海。
这次来记录下自己独立全端开发的第一款side project——简诗 2.0——及其中的一些心路历程和踩坑经验。
缘由
一年前我花了一两天时间开发了一款自认为挺cool挺优雅的Android应用,浓郁的中国风色彩和极简的设计风格,是我开发简诗最根本的原因,当时还在简书上写过一篇文章《如何在一天之内完成一款具备cool属性的Android产品<简诗>》,获得了不少读者的喜爱。不过,当时的版本只有 Android 端,没有服务器来支持数据存储。因此,今年又重新开发服务端,一方面为喜爱简诗的用户带来更多有趣的功能,另一方面锻炼下个人技术。
简诗最初设计草稿来自《Producter》一书,设计思路独特:别致的中国风纵书体验,大片留白的日式设计理念,体现浓郁传统中国文化的细节,都使得简诗与众不同。
开发一款如此别具一格的 App,在我看来,是一件非常酷的事情。
富有挑战而有趣的全端开发
简诗的开发主要包括三方面:设计、Android 端、服务端。
设计
我在最初《Producter》的设计草稿基础上,我对整个使用体验做了进一步优化:
- 剔除了原始选择年、月、日的步骤;
- 在首页添加实时变化的三行小诗;
- 在撰写页面根据当前时间如正午、夜半,显示不同的提示语以让用户感觉更为亲近;
- 支持更换背景颜色,色值取自中国传统颜色如素、月白、水红等;
- 文章列表页面仿照古代书籍目录设计;
- 分享时会自动生成简诗的印章,借鉴了传统书画作品中的印章;
- 首页添加实时变化背景图片,这些图片均来自全球优质的摄影作品 UnSplash 网站。
Android 端
Android 端采用了当前最为流行的移动架构和依赖,运行稳定,代码结构简洁,crash 率只有 0.1% ~ 0.3%。
开发过程中主要遇到一个问题是客户端与服务器之间进行数据同步,由于一个用户同时具有本地数据库和远程数据库,所以一旦数据库之间出现偏差,就可能导致用户数据丢失,而且要能够保证用户多客户端、离线修改数据、同步失败等情况下,都必须保证数据的可靠性,防止数据丢失。这种多数据库同步一向是较为复杂麻烦的,不过为了能让用户在没有网络时仍然能使用简诗,我还是花了一些去填好这个坑。
经过一段时间的摸索,目前简诗的代码里已经能很好的支持数据同步了,基本思想是:
- 用户首次登陆简诗,会尝试去server取历史数据(如果是新用户则取到为空),返回数据的同时会返回一个sync_token,里面包含了当前时间戳;
- 收到数据后,客户端把数据存储到本地数据库(如果为空则不存),同时把sync_token存储起来给下一次同步用;
- 在简诗使用时,会把用户所有与数据库相关的操作:create、update、delete按顺序存储在本地一张表里;
- 在网络正常的情况下,客户端会定期将这些操作上传给服务器,同时带上之前的sync_token;
- 服务器接收到这些数据后,把这些crud操作依次执行一遍即可更新到当前客户端最新数据;那么,如果用户在这期间通过别的客户端更改过数据库呢?
- 这时我们会基于sync_token里上一次同步的时间,去数据库找出所有晚于这个时间的操作,同样拼接成crud的json串;然后把这个json数据和新的sync_token(基于当前时间)回传给客户端,其中还包括一个成功sync到数据库的数量synced_count;
- 客户端收到{synced_count:{..}, crud:{..}, sync_token:{..}}后,首先根据synced_count把历史的操作表删除对应的纪录,即删除已经成功sync了的操作;crud:可以更新本地数据库,如果有其他客户端更改的可以同步进来;sync_token下次sync时使用。
这样大体可以实现一个完善的客户端和服务器的数据库同步操作,而且支持多客户端更改,并保证本地数据的最新。
当然,Android版里面还有不少较为复杂的技术点,以后再细说吧。
服务端
本人之前有完整的 PHP 后端开发经验,所以如果采用 PHP 开发的话难度会小很多;不过我最终选择了自己不熟悉的 Python 来进行服务端开发,这给我带来了一些挑战。
之所以采用 Python 有两个原因:一是对 Python 这门语言的好奇,软件工程师总是对未知领域充满好奇并想去探索;二是希望通过不同语言的服务端开发,来提升自己对服务端架构的理解。
在开发过程中我重新学习实践了一款优秀的Python框架:Flask的设计思想,也熟悉了阿里云服务器+nginx+gunicorn+supervisor的服务器运行环境,MySql + Redis的数据存储架构,写了一些脚本来运行数据库命令、完整的unit-test。
另外做了一些有趣的尝试:利用Slack + Jenkins 工具搭配,只要在Slack里输入一句命令,就会自动把服务器代码从GitHub部署到阿里云服务器上,比起以前手动拷贝代码到ftp上简直cool太多了。
当然,后端开发是非常有趣的,后面还会投入更多精力来搭建更加完善、稳定的后端环境,尝试更多有意思的玩法。
其实,我觉得side project最大的困难不在于技术,而在于懒,哈哈
其实你有很多时间来做side project
我相信很多人和我一样,对side project很感兴趣,希望能利用业余时间去开发自己感兴趣的项目,提高技术和实践水平。那么,衡量好时间精力分配就比较重要了。
作为一名全职软件工程师,简诗 v2.0 的开发主要利用我周末的时间。总共花了三到四个周末,即六天到八天左右,完成了 Android 版本和服务端的开发。开发后段我的一位好友:Ray 也加入并协助进行了部分开发工作,有几个周六我俩都开发到了大概凌晨四点钟左右,一边阐述自己的产品创意,一边讨论工程实践的可行性,是非常有趣的一段经历。
简诗2.0发布后,我准备重新梳理下服务端的整理架构,深入学习Flask的设计思想,然后对服务端做一些改进。当然仍然是利用晚上和周末的时间。
让大家知道你的side project
酒香不怕巷子深,这句话在现在可能并不是那么适用了。我见过不少做的很烂的app广受欢迎,也见过很多优秀的app默默无闻。我当然明白很多工程师不愿甚至不屑去推广宣传,认为只要自己的东西牛逼,迟早会有一大堆人簇拥过来。
但是,移动开发日益激烈的今天,每天都有无数新的app诞生,人们不会愿意花时间下载尝试一款没听说过的app。
在国内,我们可以尝试下面的一些渠道来推广自己的作品:
- v2ex 里面有很多不吝赞赏的读者,大家会对认真的作品给予认可和鼓励,也会对虚有其表的项目表示呵呵;
- 应用推荐平台:最美应用、少数派、AppSo等,当然要有一定的实力才能入选哦;
- 应用商店:酷安、小米、豌豆荚等应用商店如果能给你一个好的位置,肯定会带来非常多用户的。
全栈工具推荐
在开发中我应用到了当今很流行的工具,这里给大家介绍一些我认为很有用的工具或者代码框架。
- 设计
- Zeplin:在dev与designer之间共享设计稿;
- Sketch:强大的移动应用设计工具,什么都能做;
- 字体:文悦科技家有很多优秀的字体;
- dribbble:全球最优质的设计作品聚集地。
- Android
- OkHttp + Retrofit + RxJava + RxAndroid + RxLifecycle:为你的应用提供简洁稳定的网络架构;
- Dagger:依赖注入框架,性能好;
- Fabric:监控应用的crash情况和用户增长,免费;
- Stetho: 方便在chrome里监听所有http请求,查看本地Database内容等;
- DBFlow: 基于Sqlite的orm工具。
- Server
- Python + Flask:快速为移动应用搭建稳定安全的后台服务;
- Jenkins:当前最好用的持续集成工具,自动将GitHub代码部署到服务器上,再也不用copy代码到ftp上啦;
- Rollbar / Sentry + Slack:监控server运行环境,一旦发生问题能及时通知给开发者停下手中的游戏去修bug;
- Sequel Pro:好用简洁的数据库管理工具;
- Redis:提供高速键值对存储查询服务。
- 技术资讯:
- Airb&b、Square、Facebook家的tech blog,最新的技术来自那里
- Medium+稀土掘金+湾区日报:阅读优质技术文章
小结
当代的人们逐渐习惯于阅读快速的文字片段,淡忘了写作的体验。而简诗的存在,就是希望让人们重新找回文字的美好之处,重新感受写作的乐趣。或许并非所有人都喜欢简诗,但只要有一部分人,能从简诗里重新感受到文字的温暖,就足够了。
GitHub 开源地址,包括 Android 与 Server: https://github.com/wingjay/jianshi
作为一名开发者,我也热爱并重视产品设计。平日里会阅读一些如日式设计相关的书籍。不过,我深知自己在设计方面的学识浅的可怜,因此,我希望在业余时间里能和一些优秀的设计师合作,共同开发一些独具匠心的产品给大家使用。
欢迎通过简书联系我。
谢谢!
wingjay