Stay's Notes


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

你的开发为何如此低效?

发表于 2017-04-27   |   分类于 方法论

在开发中,编码我们有分层架构、设计模式做为套路来高效开发,但你也知道编码不是开发的全部,一个完全的开发流程用面向对象思想来概括,它分为OOA(面向对象分析)、OOD(面向对象设计)、OOP(面向对象编程)。一个好的代码结构是需要需求分析,架构设计做为辅助的,Stay尝试向你描述一个理想高效的工作流程,有了这个套路,不仅能让你缩短编码时间,还能得到团队的认可。

关于高效开发,大多数人的第一反应就是成熟的分层架构、设计模式以及第三方lib。这些给了我们设计准则还有便利的工具更快的去做需求实现。

高效开发还有另外一层含义,关于一个团队他要如何去提升团队的整体开发效率、缩短开发周期,能够一步一步去更快速的产品迭代,在这个过程中你要做好需求分析,架构上的设计。

今天的主题是撇开技术和大家聊聊高效开发的一些套路与实践。

阅读全文 »

内存泄漏实例分析

发表于 2017-01-06   |   分类于 小偏方

昨天被问到一个内存泄漏问题,正好近期在录制性能优化相关的课程,用我讲的方法来分析问题😯

有时候内存泄漏真是措不及防,潜伏的很深,不用工具的话压根感知不到,往往只有在错误日志里才看得到,不过那个时候也已经晚了。

先上个LeakCanary的warning图

Paste_Image.png

从图上来看,很直观,MainActivity泄漏了,持有的是MyLinkMovementMethod,还是个static变量。

这么看起来很容易解嘛,在MyLinkMovementMethod里把context引用去掉不就好了么,有什么好问的。

然而看了代码,我也有点懵逼,大家也来瞅瞅。

阅读全文 »

方法论-从'抽象化的OOP世界'说开去

发表于 2016-10-27   |   分类于 方法论

随着技术的发展,我们现在所接触的大多属于对象型语言,对于开发者来说,能够很轻易的将生活化的需求转换成代码。

在软件设计领域,现在最热的前沿就是所谓“面向对象”的软件。一个面向对象的程序(OOP)实际上就是一个相对去中心化的、模块式的程序。对于一个OOP来说,它的一个“碎片”,就是一个独立成立、保持自身完整性的单元;它可以和其他的OOP“碎片”整合在一起形成一个可分解的指令结构。“对象”限制了程序漏洞所能造成的损害。和那种传统程序不同,OOP有效地对功能实行了隔离,把每一个功能都限制在一个可掌控的单元内,这样一来,即使一个对象崩溃了,程序的其他部分也能够继续运转,而对于传统程序来说,一个地方出了问题,整个程序就会崩溃。程序员可以把这个坏掉的单元换掉,就好像我们可以给一个汽车换刹车片一样。软件的销售商可以购买或者销售各种事先编制好的“对象”库给其他的软件研发人员,后者则可以基于这些库里的对象快速地组装起大型软件,而不用再像以前那样重新一行一行地编写新的代码。而到了要为这种大型软件升级的时候,你所要做的就是升级旧的对象或者加入新的对象。 - KK 《失控》

不仅仅软件是一个相对去中心化的,模块式的程序。硬件也是一样模块化的,如下图的iPhone肢解图。每一个单独的小模块都是由不同的厂商开发,最后在富士康组装的。

obj.png

这跟我们做一个App有区别吗?好像没有。

拿移动App来说,不管是系统,还是第三方开源lib,都给我们提供了很多独立模块。网络请求lib,数据库orm,图片缓存lib,UI组件等等一系列丰富的模块。

做为开发者,我们的职责是做什么呢?像不像流水线上的组装工?app workflow已经定制好了,我们在不同的节点做好相应的拼接就好。虽然说需要那么点技术,但也不算什么高难度的事情。

那么问题来了。你职责能cover的range有多广呢?

  1. 只会安装某个单一零件
  2. 会安装多个零件
  3. 负责一条生产线
  4. 负责整个生产线
  5. 设计生产线组合

这不就是程序员的走上人生巅峰的奋斗历程吗。

在我们掌握了’最小可行体系’之后,下一步该做什么?比如先给自己定个小目标,先挣它一个亿!!!

在一个系统之上做开发,代码只不过是排列组合变成具有特殊功能的载体。就像英语是由26个字母组合而成的。零散的没有生命,牛逼的排列组合却成了创新。但是26个字母的随机组合有那么多可能性,如果没有规则在里面,常人怎么学的会哇。

所以英语就有了前缀后缀与词根来缩小排列组合的范围。汉语就有了偏旁部首来作为规则。在你打算挣它一个亿之前,如果不事先了解这些规则技巧,想想你要花多少的时间去筛选那万分之一的有意义的东西呢。

从0到1的阶段不适合采纳别人的建议,按自己想的来。但往后的优化调整阶段,需要听取外界的反馈,从1到100是非常漫长的过程,想要少走弯路,必需借鉴他人成功的经验。也就是说,站在巨人的肩膀上,自己也能是’巨人’。

巨人可以是大公司,可以是牛逼的团队,可以是技术犀利的老大… 这个巨人越高,你能看到的更远,你的目标也就越明确,也更容易达到。

这些都没有?没有就想办法让自己有啊。没有条件上,就要拼命创造条件去上。

由于从1到100的战线过长,技术更新又那么快,难免会有迷茫。

到底是努力走到100?还是做个斜杠青年掌握多个从0到10?

其实大家都不想成为被随意GC的’对象’,而GC必要条件是不再持有该’对象’的引用。那么为了不被GC,这个对象就得变得重耦合。即每个生产线,每个部门都要持有这个’对象’。要做到这一步,至少需要掌握多个’最小可行体系’。即:上会产品,运营。下会架构,测试,ps。

这样看上去很美好,表面功夫做到位,耦合到每一个部门,但如果某一天忍痛重构了呢。这种无效耦和第一个要被清除吧(Stay最不怕的就是重构,开人也是如此)。如果是真牛逼,他肯定会聪明的做为’门面’(门面模式)对接外部与内部,而不是心力交瘁的盯着内部每一个部门运转。

大家是怎么看的呢?在工作中如何定位自己,是否还有上升空间?不妨想想看吧。

本篇为胡思乱想的番外,我说的,都是错的。欢迎指正。

​推荐阅读:
还需要再学习一门语言吗?
方法论-如何学习一门语言
方法论-最小可行体系

声明:本文为Stay原创,未经允许请勿转载 有心课堂(stay4it.com) 传递给你的不仅仅是技术~

方法论-最小可行体系

发表于 2016-10-26   |   分类于 方法论

精益创业中推崇的是最小可行产品MVP(minimum viable product), 找到痛点,计算出最简原型,转为最小可行产品,在用户的反馈下不断做迭代。在产品从0到1的阶段,’最小可行产品’MVP非常实用。

在我们学习新知识时也一样,从0到1应以’学以致用’为主。将我们的最终目标简化到让它能够跑起来的配置,再用最快的速度搞定这些配置让它跑起来,之后再折腾什么也有个依托,这样就不致于变成孤立的知识点,转身就忘掉。

单纯的语言本身学习起来不难,主要是语法,函数,作用域。要掌握它们,一个月足够了。

对小白来说,对于新知识体系是没有感知的,只觉得最全最详细的最好。但真正去学的时候,大而全的体系会让人找不着北。一个个新知识蜂拥而上,消化不掉很容易放弃。

假如我们还是按填鸭式教育那样学习。买一本从入门到’精通’的书,从第一章顺序往下看。很有可能学到一半就放弃。就像是在用大石头画一幅巨图,在下面堆石头的人不知道现在画到什么程度了,一开始推石头还挺轻松,堆多了之后就不行了。

一门从入门到’精通’书籍,描述的是一个最终态。必需每一章都顶配,才能构建出这个最终态。而’最小可行系统’只要求最简配置就能跑起来,得到一些正反馈后再去强化升级。如果跟着书一章章学习,验证和反馈机制太漫长,学习效率就慢下来了。

‘最小可行体系’是为了掌握某个新知识所需要的最简环境。每款游戏都有最小配置要求,你要做的就是配好最简环境,让你的知识先跑起来。只要它跑起来,惯性使它短时间不会停下来,然后再慢慢添加配置,最终达到稳定。

如何找到’最小可行体系’?

  1. 学习这个知识体系的目标是什么?
  2. 最短时间内到达目标需要那些知识点?
  3. 排好优先级
  4. 专注,一次只学一个知识点

举个例子:

打算学PHP,目标是做一套系统,提供API给移动端使用。

随便找本从入门到精通的PHP书,你会看到这样的学习路线

Paste_Image.png

如果按步就班的去学,那学习周期会非常长,如果还是业余学习,很容易就搁置了。

我们得筛选出最最简配置,PHP基础语法得学,最基本的数据结构以及函数。目标是为了提供API给移动端,可以暂时不用提供web端,前端内容都pass掉。数据库可以暂时优先级放低,先能让移动端调用到API,静态假数据都足够用了。再来就是部署到服务器,不用管分布式,也不用加cache,买个带PHP环境的vps,直接ssh部署就好了。

最最简配置(含优先级):语法,静态API,部署,RESTful API,数据库,权限

这是最核心内容,只要这些配置跑起来了,接下来就是不断往里面添加配置或者丰富配置。(怎么丰富我们在后续的文章中详细描述)

再看打算学Android,目标是以此找份工作。

Paste_Image.png

看,Android知识体系,东西不少对吧。假如一个个学过来,容易懵逼,整个UI component就得花一个月时间来学。反馈的太慢,越学越没有信心。

换个最简配:环境搭建,最小可行app(列表页,详情页,设置页),网络,缓存,权限

事实上,如果已经熟练掌握一门语言,其他语言的部分知识体系是重复的。例如网络,缓存,线程,权限设计等。无非是那些语言wrapper出来的API不一样罢了。

这样一周就能完成’最小可行体系’,体验过后才能知道自己是否喜欢这个语言,是否想要深入下去。

其实我们学习时也是一个个’最小’知识节点,但它们是零散的,无法交织成体系。’可行体系’不是孤立知识点的堆积,而是对它们结构性的整合和组织。

从0到1的阶段,别盲目的听别人的建议,容易困惑。比如:

“java有什么好学的,PHP才是最好的语言。”
“Android要学的东西太多了。插件化,Material Design,Retrofit,Rxjava,lambda,gradle,ndk。还是学iOS吧,iOS简单”
“现在都不兴OC了,学swift吧”

假如你对什么语言感兴趣,设想一个’最小可行产品’场景,把需要的内容列出来,转换成需要的用到的知识点,碰到不会的再针对性的问google,问大神。Stay通过这个方法,陆续入门了OC Swift Ruby PHP Python。离全干工程师还有一个JS的距离。

学以致用,从0到1,相信你一定可以。

但有了’最小可行体系’还远远不够,这只是快速评估该语言是否适合你的开始。如果你还想让这个小体系变成一张知识结构网,就需要不断地围绕着它做优化,直到它能够成为你技术变现的一个出口。

如何优化,如何深入学习,如何将语言输出变现?这些大家怎么看呢?不妨讨论下吧。

本文为开篇,Stay会陆续出一个系列来展开自己的观点。希望和大家一起交流,寻找最佳算法。

​推荐阅读:
还需要再学习一门语言吗?
方法论-如何学习一门语言

声明:本文为Stay原创,未经允许请勿转载 有心课堂(stay4it.com) 传递给你的不仅仅是技术~

方法论-如何学习一门语言

发表于 2016-10-25   |   分类于 方法论

本篇内容是Stay个人的一些观点与见解,有时候跳出技术或者寻找其他的角度会让人重新认识一门语言。希望能抛出一些角度,和大家一起探讨,由此丰富自己的思维。

学习一门语言的最佳方式

先抛开技术语言,我们至少会两门语言:’汉语’, ‘英语’。
如何快速的掌握语言?

无痛学习的三个节点: 环境, 词汇, 实践

环境: 我想不用再多说些什么,你看从小就会说方言,那是大环境所致
词汇: 没有足够的词汇量是很难高效的沟通,表达自己的意图。但语言设计出来是有意而为之,肯定多少有些规律。汉字有象形,有偏旁部首。英语有词根,前缀,后缀。种种组合在一起,形成了单字单词。假如你没背过这些,一直以一个顺序去死记硬背,那是相当笨拙的方式。
实践: 实践也就是利用语言去表达自己的想法,行为。一个人长期自闭肯定会忘了如何说话。要让自己能说会道,写文形如流水。最直接的方式就是多说多写。

写到这里,我们的大脑立马会有趋利避害的潜意识产生

道理谁都懂,说的简单,做起来难啊。要是一个月能搞定,拼了命我都会去学的。要不你先试试看?

再来看这个梗

相应的,我们从初中到大学学了10多年的英语都还有大部分人学不好,为什么有人会相信通过培训班能够让你在短期内精通一门技术语言呢?

如何学习一门机器语言

人类语言的学习方式能套到机器语言上吗?试试看

无痛学习的三个节点: 系统(环境), 语法与API(词汇), 编码(实践)

系统: 这个系统可大可小,操作系统,可运行的最小依赖环境,一个项目架构,一个独立功能模块等。都是一个代码块所依托的系统环境。在什么环境写什么代码。
语法与API: 语法是构成语言中的初始单元,API是与一个系统,一个独立模块等沟通的桥梁,没有它,就无法知道它能提供些什么,能通过它做些什么。如何去组合,造句,通过API再形成业务逻辑。
实践: 通过API调用组合成代码块,再将代码块组合成独立模块,再将功能合并成app。这些都算实践。

所谓语言是相通的,即使语法不一样,其wrapper出来的API是大体相似的。如何获得文件句柄,如何网络请求,如何access数据库等。不会有太大区别的。也就是说只要你掌握了一种语言,快速切换到其他语言时,可以再熟悉语法后,直接去实践,不会的再现查。(就像学会一种语言,其同语系的语言学起来也挺轻松)

但,这个学习方法有效吗?在语言学习上还可以通过应试方式来填鸭。机器语言可就未必。

按部就班的学习够不够

设想一下用应试教育那一套学习Java。
背单词(API), 记词根(语法), 做卷子(写代码)

这样就能应对日常工作吗?显然不能。

写代码不是做选择题,填空题。即使只用写一些业务代码和算法,调用API。这也是一个连续的过程,一直在当前的context上下文里处理事情。要比学英语复杂的多。

如果用笨方法死记硬背还能考个好成绩,同样的方法来学机器语言,没几天就坚持不下去了。

人类语言(汉语, 英语…)和机器语言(Java, C…)区别还是很大的。

  1. 说错不要紧,只要大意传达到,对方就能做出相应的回应。但机器要求严苛,非0即1。错了就是bug。
  2. 语言再怎么拓展也有限。累感不爱,因崔斯汀,asap这样的小缩写,哪有方法或封装类屌。
  3. 机器语言是确定性的,input进去,output出来,不管执行多少次,都是一样的。但语言不同,一千个人眼中有一千个哈姆雷特。
  4. 机器语言不仅得会调用,还得分析,研究其内部实现。而语言仅仅是调用就可以了。

按李笑来老师说的,一年即可全栈,我是不信的。除非-> js一统天下: )

那么问题来了。究竟如何学习才是高效的呢?

你是怎么认为的?不妨也说说吧~

本文为引言,会陆续出一个系列来展开Stay的观点。希望和大家一起交流,寻找最佳算法。

扩展阅读:
还需要再学习一门语言吗?
方法论-最小可行体系

声明:本文为Stay原创,未经允许请勿转载 有心课堂(stay4it.com) 传递给你的不仅仅是技术~

还需要再学一门语言吗?

发表于 2016-10-23   |   分类于 方法论

好的问题值得分享,值得与大家一起讨论。

今天的问题是这样的,一位工作4年的同学(姑且叫ObjA)问我,是否需要再深入学习一门语言。

ObjA 09:47:51
你说搞c和c++有前途吗?android感觉人太多了
我想再学习一门底层语言,建议C吗?
Stay 09:48:21
实用性不强吧
Stay 09:48:33
不如学后端或者前端
ObjA 09:50:40
主要怕,android人越来越多,以后薪资下降,C的话,感觉有点保障。
Stay 10:02:01
C的职位没那么多。回报率不高。你要想清楚
ObjA 10:23:41
= = ,现在迷茫中,现在android技术凑活,java web以前实习干过大半年技术菜鸟,Python现在会一点技术菜鸟,计划是:会一门客户端语言、会一门后台语言、会一门脚本语言、会一门底层语言。
给你一说回报率不高,不知道目标了,求指点啊。
Stay 10:25:39
计划太满,后期的变化会严重影响你的计划
ObjA 10:25:58
需要老司机带带我,我考虑的不是很充分。
Stay 10:26:07
先考虑,目前,你最需要的技能,公司最需要的技能,回报率更高的技能
ObjA 10:27:29
确实迷茫中,不知道往后3年行情怎么样。
ObjA 10:27:38
求指点。
ObjA 10:28:40
我老大推荐我玩Linux底层,但是他们以前玩Linux 做百度云OS,公司都倒闭了。
Stay 10:29:06
你也可以学前端
ObjA 10:29:07
不太想搞Linux底层了
ObjA 10:29:31
H5门槛感觉低,人太多了。
Stay 10:30:01
你想多了
ObjA 10:30:51
怕培训机构像打败IOS和android一样,打败H5,大量输出培训人才.
ObjA 10:31:24
我对行情不太敏感.
ObjA 10:31:35
只是看到现状.
Stay 10:31:37
那现在android不够你活了吗
ObjA 10:32:28
够,但是怕android不景气,薪资下降。
Stay 10:32:37
你降了吗
ObjA 10:33:01
没,但是上升空间感觉小了。
Stay 10:34:13
上升空间小是单纯因为你不会其他语言吗
ObjA 10:37:15
不是,学历和情商束缚了上升空间。
Stay 10:37:49
那你觉得靠其他语言可以补足吗
ObjA 10:39:45
语言感觉可以补足部分,目前在提高情商,学历的话,目前没有计划。
ObjA 10:41:08
那意思是:学习最迫切能力?
Stay 10:41:17
你的目标不够明确
ObjA 10:43:20
ok,感觉自己状态太好,可以开多线程。
目前来看是:范围太大太泛,不够精确精准。
Stay 10:45:46
如果其他语言能补足,那至少也需要和你现在的android旗鼓相当。你算算成本。当然学其他语言也是好事,但最好短期内就学好一门,另外如果有回报率更高的东西,建议你不妨也尝试下
ObjA 10:46:51
ok,我知道我现阶段要干什么了

这个问题挺常见的,主要原因就是缺乏安全感。我们依赖的技术环境确实是多变的,我们身处其中,每天看见的,听见的,没准就是自己不知道的。不知道的多了就会有点慌了。慌了总得想办法啊。那就学呗,别人炫什么,看起来很屌的样子。我也得试试看。

遗憾的是,我们很难像机器那样,多开进程,100%的利用CPU,一点不浪费。在努力工作的同时,再学习另外一门语言,不是那么容易。特别是还得让它成为你变现的技能,更难。

最近有个词很火’斜杠青年’,翻译过来不就是全栈吗。

斜杠青年的定义是:跨界,多重身份,变现。

全栈并没有那么简单,又不是全干,变现也不是叠加溢价。相比之下如果有精力和天赋去全栈,倒不如再向外扩,跨界去做点别的,不应该比其他人更有优势吗。代码都能掌控,还有什么搞不定的?

其实并不反对去学习其他语言,相反的,如果已经有一门相当在行的语言打底,再学习其他语言也非常快,有的时候还能相互印证,得到一些灵感,更好的去补足。会的语言多了,也就不局限于实现方式,大部分语言都能相互调用。这样就能选择最好的方式去实现。

究竟应该学习什么语言?以工作中迫切需要的为好,比如为了熟练使用gradle,可以简单学学groovy。比如为了简化工作,避免一些重复劳动力,也可以学学python。比如项目中有些页面是H5,可以也学学js,更好的配合。同理 scala,php,java等

未来的语言趋势固然重要,但学习也需要环境和实践。避免周期过长导致放弃。

想要学习新东西,心里肯定是有危机感,那不如把你担心的都列出来,明确现在的处境,再有针对性出解决方案。

到底是需求来了立马写代码?还是分析需求,定好方案,再做实现?我想大家都能分辨的清吧?

​推荐阅读:
方法论-如何学习一门语言
方法论-最小可行体系

声明:本文为Stay原创,未经允许请勿转载 有心课堂(stay4it.com) 传递给你的不仅仅是技术~

python部署手记:django, gunicorn, virtualenv, circus, nginx

发表于 2016-09-05   |   分类于 Python那些事

手记,以免下次配置再入坑。有些细节未做详细描述,如果有问题,可以评论或私信我。

初次尝试搭python服务器,强撸python3,花样作死。过程中出现各种错误,不停google,搜到的时间大部分在2012年-2014年。让我不禁怀疑,真的没人用py搭服务器嘛?怎么比ruby还少。。。

相关技术点:django, gunicorn, virtualenv, circus, nginx

陆续花了一个月时间,先是折腾flask,完了折腾django,再到部署。感觉身体被掏空。说好的人生苦短,要用python呢。相比之下PHP部署简单多了(主要是傻瓜式的一键安装,很多vps都提供PHP预装环境)。

阅读全文 »

Retrofit 实现文字(参数)和多张图片一起上传

发表于 2016-08-23   |   分类于 HTTP那些事

需求

Retrofit普及后,最近好多人都在问,如何实现Retrofit上传多文件+文字需求(朋友圈发图片+文字)

解决方案

google: retrofit upload multiple files

说重点

与其直接说答案,不如我们花点时间说说多文件上传的原理,这样,以后就算出了其他的http框架,你也能快速实现。

HTTP协议就不讲了吧?反正copy一段过来也不会有人看。我们就直接跳到文件上传去。想看也可以,传送门

阅读全文 »

Rxjava实践-把混乱的WORKFLOW撸成串吧

发表于 2016-08-16   |   分类于 高效开发

上个月做的事情比较多:改改iOS bug,学python,把项目重构成MVP,深入使用Rxjava。

这次来说说Rxjava,通过还原一个真实的开发过程,来感受下rxjava的便利之处。

巨坑从来都是由小坑慢慢塌陷的

先来看下一段最普通的代码

rx01.png

在没有特殊需求的情况下,代码就这么简单。你可以理解为,获取一个目录下的所有文件,将它们一个个传到服务器上去。

看起来好像是没什么问题,一个for循环搞定。一个task失败了不影响另一个task。每个task run在一个单独的子线程。

之前rxjava使用场景只局限于和Retrofit一起用。没过多的使用操作符。因此在uploadFile(path)方法中就是最简单的Retrofit+Rxjava上传文件。rxjava就切换了下线程。

对于写惯java的人,这么写是没什么问题的。但如果深入使用过rxjava之后,这么写就非常别扭了。看到for loop了,你不想将它改成Observable.from()嘛?

阅读全文 »

记一次python爬虫实践

发表于 2016-07-12   |   分类于 高效开发

有将近一个月没写文章了,懒人日常就是纠结于写还是不写,有没有必要写之间。想写的主题确实有一些,但磨磨蹭蹭到最后一篇也没写。

今天想写一篇与Android无关的技术内容,语言是相通的,只要需求分析清楚,用什么语言来实现倒是其次。

先来看看一下午用python折腾出来的结果(整个耗时10s):

python01.png
阅读全文 »
12…4
Stay

Stay

select * from life

38 日志
10 分类
55 标签
GitHub 有心课堂 简书 Weibo
© 2015 - 2017 Stay
由 Hexo 强力驱动
主题 - NexT.Pisces