我的第一款全栈side project

版权声明:本文原创发布于公众号 wingjay,转载请务必注明出处! https://www.jianshu.com/p/39dce598faf1

我是wingjay,软件工程师,现居上海。

这次来记录下自己独立全端开发的第一款side project——简诗 2.0——及其中的一些心路历程和踩坑经验。

缘由

一年前我花了一两天时间开发了一款自认为挺cool挺优雅的Android应用,浓郁的中国风色彩和极简的设计风格,是我开发简诗最根本的原因,当时还在简书上写过一篇文章《如何在一天之内完成一款具备cool属性的Android产品<简诗>》,获得了不少读者的喜爱。不过,当时的版本只有 Android 端,没有服务器来支持数据存储。因此,今年又重新开发服务端,一方面为喜爱简诗的用户带来更多有趣的功能,另一方面锻炼下个人技术。

简诗最初设计草稿来自《Producter》一书,设计思路独特:别致的中国风纵书体验,大片留白的日式设计理念,体现浓郁传统中国文化的细节,都使得简诗与众不同。

开发一款如此别具一格的 App,在我看来,是一件非常酷的事情。

富有挑战而有趣的全端开发

简诗的开发主要包括三方面:设计、Android 端、服务端。

设计

我在最初《Producter》的设计草稿基础上,我对整个使用体验做了进一步优化:

  • 剔除了原始选择年、月、日的步骤;
  • 在首页添加实时变化的三行小诗;
  • 在撰写页面根据当前时间如正午、夜半,显示不同的提示语以让用户感觉更为亲近;
  • 支持更换背景颜色,色值取自中国传统颜色如素、月白、水红等;
  • 文章列表页面仿照古代书籍目录设计;
  • 分享时会自动生成简诗的印章,借鉴了传统书画作品中的印章;
  • 首页添加实时变化背景图片,这些图片均来自全球优质的摄影作品 UnSplash 网站。

Android 端

Android 端采用了当前最为流行的移动架构和依赖,运行稳定,代码结构简洁,crash 率只有 0.1% ~ 0.3%。

开发过程中主要遇到一个问题是客户端与服务器之间进行数据同步,由于一个用户同时具有本地数据库和远程数据库,所以一旦数据库之间出现偏差,就可能导致用户数据丢失,而且要能够保证用户多客户端、离线修改数据、同步失败等情况下,都必须保证数据的可靠性,防止数据丢失。这种多数据库同步一向是较为复杂麻烦的,不过为了能让用户在没有网络时仍然能使用简诗,我还是花了一些去填好这个坑。

经过一段时间的摸索,目前简诗的代码里已经能很好的支持数据同步了,基本思想是:

  1. 用户首次登陆简诗,会尝试去server取历史数据(如果是新用户则取到为空),返回数据的同时会返回一个sync_token,里面包含了当前时间戳;
  2. 收到数据后,客户端把数据存储到本地数据库(如果为空则不存),同时把sync_token存储起来给下一次同步用;
  3. 在简诗使用时,会把用户所有与数据库相关的操作:create、update、delete按顺序存储在本地一张表里;
  4. 在网络正常的情况下,客户端会定期将这些操作上传给服务器,同时带上之前的sync_token;
  5. 服务器接收到这些数据后,把这些crud操作依次执行一遍即可更新到当前客户端最新数据;那么,如果用户在这期间通过别的客户端更改过数据库呢?
  6. 这时我们会基于sync_token里上一次同步的时间,去数据库找出所有晚于这个时间的操作,同样拼接成crud的json串;然后把这个json数据和新的sync_token(基于当前时间)回传给客户端,其中还包括一个成功sync到数据库的数量synced_count;
  7. 客户端收到{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。

在国内,我们可以尝试下面的一些渠道来推广自己的作品:

  1. v2ex 里面有很多不吝赞赏的读者,大家会对认真的作品给予认可和鼓励,也会对虚有其表的项目表示呵呵;
  2. 应用推荐平台:最美应用、少数派、AppSo等,当然要有一定的实力才能入选哦;
  3. 应用商店:酷安、小米、豌豆荚等应用商店如果能给你一个好的位置,肯定会带来非常多用户的。

全栈工具推荐

在开发中我应用到了当今很流行的工具,这里给大家介绍一些我认为很有用的工具或者代码框架。

  • 设计
  • 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,498评论 25 707
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,693评论 2 59
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    wgl0419阅读 6,263评论 1 9
  • 故乡的小巷 文‖云飞扬 故乡的小巷 很深很长 一头连着母亲 一头连着我和他乡 切切的思念 装满行囊 就如装满故土 ...
    山东云飞扬阅读 206评论 0 2
  • MVC model,view,controller 电影项目 首先,定义入口文件app.js。我们需要定义并监听项...
    Bookish倩宝阅读 1,068评论 0 2