Onelong

分享知识,与你一起进步......
RSS icon Home icon
  • 怎么保证服务可靠性、数据一致性、以及一旦宕机数据恢复

    post by onelong / 2016-10-14 5:30 Friday [工作]

    服务可靠性的核心是:容灾,大灾难一般两种:节点故障、IDC故障。

    IDC故障,就是如果整个业务服务都在一个机房,整个机房如果down了,相当于整天个业务都完全无法服务了。

    阅读全文>>

  • 青山常在,细水长流

    post by onelong / 2016-10-8 14:44 Saturday [工作]

    自从接触了golang的协程之后,开始对协程有了浓厚的兴趣,tx的libco,通过hook的方式,将原来的同步io,转换成异步的协程io,在网络方面确实有很好的表现。对于协程这个东西其实很多开源库都用相关的实现,所以并不是什么很神奇的东西,如boost,libgo,当然也要说一说基于libgo的libgonet了,总的感觉呢,libco会比较简单实用些,不过只支持linux,libgo支持linux和win,boost是全平台支撑的,但是它是一个通用库,不怎么好用。关于协程的实现很简单,主要是用ucontext来保存切换上下文,但是简单提供几个协程函数,很难用,http://blog.csdn.net/qq910894904/article/details/41911175 ,golang的协程库好用是因为在语言级支持,如“go xx()” 自动会在异步协程里面执行,同时还提供了一套消息机制Chanel,group等完成同步和通信功能。自己实现协程的话,要实现这一套通信机制比较麻烦,但是如果没有这一套机制,还不如用线程。协程和语言无关,java同样是有协程库的,只不过不是官方支持而已。据说后来的jvm thread和系统的thread是一对一的关系,所以只要有支持cpu切换上下文的函数,其实就可以实现了,作为在语言榜一直排行第一的java,肯定用在底层有提供这类的api的,就算没有协程,还有actor的设计模式。说了那么多,其实你会发现在工作的过程中,很少要自己从新设计一个公共库的,用好开源库就好了。协程也好,线程也好,线程池也好,很多开源库已经很稳定了,不需要开发人员去折腾了,折腾了也没有非常大的意义,知道原理用好就算精通了。虽然很多人要较劲,一定要自己实现一套,这样才能体现自己实力,但是很多时候折腾到半死,结果发现有很多问题,还不如直接用开源的,哈哈哈。研究开源技术,只是为了让项目的可控性更强,并不是为了在必要的时候抄一套来展现自己。在很多的面试的时候,面试官喜欢问题,假如让你重新实现某个开源库,你的流程是怎样怎样的?一个小公司小项目,其实怎样做都,性能都不会很差,还要重写开源项目?所以有些装逼的面试官才会问一些很奇怪平时都用不到的东西,工作主要是解决问题的能力。
    工作之余,我还是喜欢了解一些开源技术,偶尔会选其中的项目,看看源码,了解其原理,例如之前的dubbo。另一方面给自己积累一点东西,万一将来遇到类似的项目,可以少走弯路,迅速上线。学习很多时候是为未来准备的,现在用的很多东西,其实都是两年前积累的,就算现在不学,面对当前的工作还是没啥压力的,但是人要向前看,不管未来怎样,至少不应该浪费时间,至少留下点什么。学技术本身就需要坚持的意志,技术之路往往是寂寞的,很多时候没人帮助你,甚至都没有和分享。人的成长之路,自己本身就是最大的敌人,克服内心各种借口,坚持下去本身就不容易了,更不要说不断的突破自己,每天像打鸡血一样。
    青山常在,细水长流,累了烦了就放空自己,回到原点,重新开始。 放松不是放弃,休息够了还要想办法拿起来继续往前走。

  • Linux线程和go协程

    post by onelong / 2016-9-22 21:59 Thursday [工作]
     记得我以前在简书上写过一个篇文章,多线程基础 今晚我想继续聊一聊这个坑,先聊一下最近的惨状吧,中秋前感冒了一次,吃了点感冒了好了,中秋后再来一个半死的感冒,全身疼痛,感觉是被人毒打了一顿,经过几天的悉心治疗,略见好转,想把今天所想的东西写下来。病号突然想去了解一下golang,想了想学习新的东西主要是了解它的特性,就是特有的功能,而不是简单复习一次语言的语法。golang里面最大的不同就是协程,golang里面没有线程这种东西的,可能是谷歌故意放弃了吧,后来细心想了一想,有协程就够了,已经不需要线程了。看了知乎的文章后,http://www.zhihu.com/question/20862617?sort=created 我更加坚信有协程就够了,不需要线程,协程是更小的执行粒子,作为一个java出身,自以为了解操作系统的人,肯定会去对比协程并发和当前多线程并发,于是就引出了一堆问题了。因为操作系统概念里面是没有协程这个东西的,所以语言上面的协程肯定在操作系统上得不到对应的映射。所以第一次猜想协程是依附在操作系统线程上执行的,因为线程是操作系统最小的执行单位。golang在语言级支持了协程,对开发者很友好。协程和线程的对应关系可以是一对一,多对一的,总而言之,尽可能的减少线程上下文(cpu context)的切换,极大提高cpu的利用率。在网络的开发中,我们会遇到很多io阻塞,系统调用阻塞等,这些操作可能会导致中断,切换线程上下文,这些都是不利于我们更有效的使用cpu的。golang很优雅的封装了一套协程api(事件驱动+channel),使得原本需要复杂代码实现东西,变得极其简单高效。事件驱动+channel是golang的灵魂,如果没有这两样东西,golang就什么都不是了,因为用户控制协程切换的途径就是channel等待。golang的协程并不能完全避免线程上下文的切换,在sys call的时候,还是要切换线程的,和操作系统的做法区别不大,到这里我对协程就聊到这里算了,想了解各种细节的人可以看看知乎的文章,尤其是那些图片,这是很有帮助的。下面我来说说另外的坑。

    工作5-6年了,时间算长了,看到一篇文章说golang的协程不是基于用户线程实现的,是库实现的,我就在想难道没用pthread?然后引发一堆狗血。其实我们会接触一堆概念:内核线程,内核进程,轻量级进程,普通进程(用户进程),用户线程等。 确实我很多年前就看过一些相关的文章,那时候看过之后自以为了解了,而今天发现确实想得太少了。对内核而已,是没有进程的,所以没有内核进程,只有内核线程。在Linux的书籍上都是这样说的,“linux线程是
    轻量级进程”,它是一个特殊的进程,没有共享内存而已。内核线程和轻量级进程是一对一的,也就是说对Linux而言,管理线程和管理进程是一样的。下面继续引用一段描述帮我们理清关系吧:
    我们知道,Linux的线程实现是在核外进行的,核内提供的是创建进程的接口do_fork()。内核提供了两个系统调用__clone()和 fork (),最终都用不同的参数调用do_fork()核内API。当然,要想实现线程,没有核心对多进程(其实是轻量级进程)共享数据段的支持是不行的,因 此,do_fork()提供了很多参数,包括CLONE_VM(共享内存空间)、CLONE_FS(共享文件系统信息)、CLONE_FILES(共享文 件描述符表)、CLONE_SIGHAND(共享信号句柄表)和CLONE_PID(共享进程ID,仅对核内进程,即0号进程有效)。当使用fork系统 调用时,内核调用do_fork()不使用任何共享属性,进程拥有独立的运行环境,而使用pthread_create()来创建线程时,则最终设置了所 有这些属性来调用__clone(),而这些参数又全部传给核内的do_fork(),从而创建的"进程"拥有共享的运行环境,只有栈是独立的,由 __clone()传入。 
    Linux线程在核内是以轻量级进程的形式存在的,拥有独立的进程表项,而所有的创建、同步、删除等操作都在核外 pthread库中进行。pthread库使用一个管理线程(__pthread_manager(),每个进程独立且唯一)来管理线程的创建和终止,为 线程分配线程ID,发送线程相关的信号(比如Cancel),而主线程(pthread_create())的调用者则通过管道将请求信息传给管理线程。” 
    从上面可以知道, 
    轻量级进程是用户态调用sys call创建的,而子线程是用master线程创建的,都是需要系统调用的,开销不小。线程池技术是为了减少频繁的创建销毁线程,提高cpu利用率而生的。所以golang协程执行在一个线程池上,至于这个线程池是不是基于pthread lib这个就不好说了,或者Google的牛人直接sys call 实现了,不使用用户线程,不管怎样,协程是新概念,但不是新技术,是另一种比较科学并发模型。最后留下一点点东西吧,https://github.com/cloudwu/coroutine c语言版本的协程,因为没有在语言级别上支持,比较难用,需要消息队列来配合使用,但是原理是相似的。 

  • 自定义网络协议

    post by onelong / 2016-8-31 20:48 Wednesday [工作]

    2012年的时候,来到深圳做局域网无线控制,最开始参考别人协议做的控制,别人用的是http,http是无状态的,一个请求完成会断开,下一个控制要重新连接,做实时控制比较麻烦。所以我们我用的socket长连接,在最初的时候,因为没人有经验,直接tcp,只管发送,不管发送是否成功,默认它是成功的,假如丢包了,tcp本身就有重发功能,也就是这样,在断网或切换网络的时候,客户端并不能马上检测出来是否断开了。于是加了心跳和超时,心跳也是单向发包的,需要服务器端确认,如果超时了就认为是断开了,则重连。经过一系列的修改,客户端通讯变得稳定了,但是还是有问题,控制数据包有时候也会丢掉,导致控制无反应。于是还是加了响应包,解决了问题。后来数据包多了,发现有些丢包是因为粘包了,后来继续定了一个规则进行把粘的数据包分开。最初的分包规则很简单,和http差不多用\r\n分开,也就是每个数据固定用\r\n结束。我最初接触到网络封装协议就是这么粗暴的,我知道很多人大学的时候都搞过了,我们当时的老大却没有给我任何建议,就这样弄成了一个产品,后来这个产品装机量也到达30w,还得了很多客户的好评。
    每次说到网络协议,我们总觉得这个东西特别高深的样子,因为概念有点抽象,一说到自定义协议,很多人就吓住了。其实协议有简单的也有复杂的,主要是看需求 ,上面我们定义的协议就非常简单了,如发送的消息包:touch\nx,y\r\n,x,y是两个参数。然后服务端收到这个消息包之后,发送一个回应包如:touch\nok\r\n。是不是很简单呢!这样也是一个协议。定义协议呢,主要要处理好两样东西:1、粘包,2、响应。任何一个请求消息都应该有一个响应包,告诉对方“你发送的东西,我收到了”,这是最基本的。在处理通讯的时候,由于各种网络环境的原因,数据包粘包是必然存在的,所以定义的协议的时候,应该给出分包的解决方案。当前自定义协议比较常见分包方案有两个:1、如上面,用行分隔,这样做法常用于文本类的协议。 2、长度分包,例如一个消息包含两部分header+body,header里面第一个字段是整个消息的长度,header可能还包含如消息类型,版本等字段,具体情况按需求定。body是就是消息的主体,消息主体可以放各种对象,String,json,protobuf等。说到这里,我想你对自定义网络协议感到很无语了,这么简单么?的确基础的东西就是这么简单。
         我在2013年写过嵌入式的java服务器,当时是给ipad上传文件的,还有给电视盒上传文件。从http到webdav走了一遍,以前在东莞的时候做过邮件相关的软件,熟悉了smtp,pop3,imap等,协议定义确实是不太复杂,协议复杂的原因,很多时候是因为复杂的业务需求。好了下面简单看一看xmpp的协议的几个应答,其实大部分协议都差不多,只是格式不同而已。
    获取联系人列表请求内容如下:

    阅读全文>>

  • IM的学习历程

    post by onelong / 2016-8-11 16:59 Thursday [工作]

    最近闲下来想起在虚拟机上部署一年前部署过的企业级的即时通讯方案-TeamTalk,很辛苦的折腾了两天终于部署成功了,一年前糊里糊涂的部署在阿里云上,一年后阿里云过期了,不想续费了。这次部署和上次部署不同的地方在哪里呢,我已经不需要官方提供的文档了,自己构建服务器编译环境,在ubuntu 16.04,内核4.4.0,gcc 5.4上编译通过,还升级了php7.0。说这些有什么用呢,其实我就想说的是时间是最好的催化剂,无意间见证了成长。很多时候很迷惘,学这些东西,学那些东西有什么用呢,短期内能见效很快的就是考试了,大学里面考试前一晚努力点,哪怕你一个学期没上课,都可以考试及格。知识积累过程,量变到质变的过程通常是漫长的,折磨人的。炒股里面经验有人说,投资是一场修行。学习也是一样,没有达到一定基础积累,短期是没有明显的效果的。在开始学习TeamTalk之前,我曾经研究过在一份java即时通讯的代码,当时看那个代码一头雾水,当时听说它能支撑100w用户在线,我觉得很有意思,因为不曾有这样的机会去见识一下。经过一段时间的学习,分拆,最后我折腾了一份只有IM的代码,去掉了分布式消息路由,去掉了分布式存储和mongodb,用HashMap代替了,还用netty4重新写了一部分,源码地址:https://git.oschina.net/onelong/IMBase.git 后来在某种情况下得知了TeamTalk,折腾了1个星期,也将TT部署到阿里云上了。那时候很有心想做个自己的IM,却无力去研究那些c++代码,后来将基础代码弄到Xcode上面运行,开始熟悉了部分流程了,但是后来还是觉得太吃力了,不会改c++,也不懂它是怎样的协议。对于Google protobuffer 也不熟悉,源码地址:https://git.oschina.net/onelong/TTBase.git,后来去深圳带项目了,也就放下了。在去深圳之前,我自己封装了一个整合了一个android的网络库,也就是现在项目用的网络库,volley+okhttp还有图片加载的,https://git.oschina.net/onelong/Mylibs.git 本地还有部分修改,没做同步。项目差不多做完的时候,公司说要自己做android的推送,我又开始研究DDpush,大约花了2个星期吧,又熟悉了整个推送的协议,优缺点等,https://github.com/OnelongX/DDPush.git,并成功弄了一个demo,在做demo的过程还研究了别人的流氓常驻方案,不过那些方案在android5或者android6上都失效了,这次快速熟悉还是得益于之前对即时通讯的研究。由于项目推进不达预期,目前推送方案还没有正式在线上使用。之后的一段时间在折腾c++11和linux网络,在强大的clion和cmake帮助下,研究了一个简单基础开源网络库handy,https://github.com/OnelongX/handy.git 大约一个月的时间吧,基本熟悉了Linux高性能网络的要点,异步+事件驱动+多线程,也是这样渐渐的理解nginx的配置参数了。经历了这些,做完看TT服务器的基础代码,发现如此的简单,没有以前觉得用c++特别神奇的感觉。各个流程基本都是可以猜出来,例如怎样解析协议的,TT的协议是16B头+protobuffer序列化的body,通过长度协议分包。既然提到了Google protobuffer,我有必要说一说这个神奇的序列化工具,当代游戏通讯,IM,RPC等都大量使用了它,有兴趣的可以自行了解,我相信你会有一番收获的。
    学习在与坚持,发现了一个有兴趣的事物,迅速的学习它并掌握它,而不是等或者看过了就算了。很在东西在深挖细节之后才会自己的不足,学得越多,越会发现自己的更多不足。学然后知困。学会争取机会锻炼,而不是一副事不关己的样子,错过每一个成长的机会。很多时候,别人写的代码没有问题,自己抄着写都会有问题,为什么呢?因为不知道细节和本质,有经验的人在写的时候就避免了。

  • 网络处理经验

    post by onelong / 2016-8-7 15:32 Sunday [工作]

    最近在升级网络库,从AFN 2.6.3升级到AFN 3.1,发现了导致了很多问题,之前在2.6.3很多显示使用了GCD处理的,升级之后出现了问题,导致下拉控件死锁无法收回。在各自的控件内,好难调试找出问题,很多时候靠经验推测。从SDWebImage 3.7.6 到3.8.1,同样导致一些以前可以显示地方现在不能显示了,3.8开始使用了URLSession,放弃了之前的NSOperation+urlconnection,之前很多可以通知更新UI的地方,现在出现了效率很低的问题。尽管在UITableView上面没什么问题,原因是UITableView是自动刷新界面的,而不是通知的。对于UITableView还在努力使用懒加载,尽可能在滑动的时候不加载UI,停下来的时候加载可见空间的UI,理论上这个是最高效率的,可以减少没有必要的请求,尽管系统控制了网络请求的并发,但是多余的请求在等待队列里面肯定会增大等待时间的,这个做法在网上可以找到参考方案。现在GCD用得很频繁,但是也不要过分使用,尤其在不够清楚原理的时候,一旦出现随机问题,调试会相当痛苦。URLSession默认情况响应都是在主线程调用,然后你又在它的回调里面搞个同步的东东,马上挂了。
    AFN默认maxConcurrentOperationCount是1,也就是单个队列的并发是1,在iOS的网络配置里面还有一个参数可以配置的,HTTPMaximumConnectionsPerHost,默认是4。我的理解是4个client客户端的意思,全局理解呢,就是手机进程默认启动4个http client,每个http client都自己并发队列,默认是串行(先进先出)的。我在案场的项目无意配置了HTTPMaximumConnectionsPerHost=1,默认maxConcurrentOperationCount=1,在多请求的界面上比android慢了很多,也是经历这次,我才意识到之前对参数不理解。优化后HTTPMaximumConnectionsPerHost=4,maxConcurrentOperationCount=4,客户再也没有说慢的问题了。同样的配置,在另外的项目出现了很奇怪的问题,例如下拉无法收回。虽然我没有修改配置测试,只是注释掉那些GCD的代码就没有问题了,我在猜想如果将maxConcurrentOperationCount配置为默认值就应该没有问题了,下次闲着的时候再试一试吧。
    以同样的原理,在案场项目里面做了退出界面,关闭无用的网络连接也是一种优化网络的手段。
    说完网络, 我说说别的吧,这周做了个在Tableview cell支持多行输入的东西,这个东西让我了解到Tableview不一样的地方,使用beginUpdate,endUpdate可以不reload cell刷新行高,效率非常明显。无论是使用Autolayout还是绝对坐标,只有你明白其中奥秘,都可以顺利的实现想要的效果。
    折腾了那么多,我觉得现在是有必要认真的阅读一些开源库的代码了,例如AFN,SDWebImage,虽然我之前看过好几个网络和缓存的开源项目,但是没有在项目里面经过高强度的测试,感触还是比较少的,都是基于理论的理解,而并非在经验层面上理解。朋友说他们的项目有5w多用户,我觉得这点上还是蛮有意思的。曾经有点冲动想去优化那个20多w用户的android app,后来想想,要是这个在过年放假的时候,我估计还是会弄下来的。我一直喜欢做点有挑战的事情,在工作中看到不好的,我都会想办法优化掉,虽然过程比较累,比较折腾,甚至熬夜,但是我觉得一切都是值得的。一个人的经验,靠听说的,靠看到的,肯定不够靠谱,自己亲身经历的才是实实在在的自信和实力。工作也好,生活也罢,努力去让自己问心无愧,努力让我自己觉得不是在浪费生命,而是在进步。一个人,无论在百度,还是腾讯,甚至在创业公司,你想得更多,都得靠着自己付出,指望不了别人引导你,帮助你。在BAT工作的人,本身工作量就大,谁也没有时间去管你,就是有时间,有时候也不好意思叫你学这个,学那个,毕竟每个人都有自己的私人空间和发展方向。
    成长和机会都靠自己争取的。

  • 找靓机二手手机app产品迭代

    post by onelong / 2016-8-5 19:39 Friday [工作]

    先上2.1版本的几个截图吧

    点击查看原图点击查看原图点击查看原图

    阅读全文>>

  • 一些经验小结

    post by onelong / 2016-7-29 19:54 Friday [工作]
    1、Android网络使用了我修改的基于okhttp的volley,在以往的开发都是用httpclient,但是这次改了,一路过来感觉性能和效率都不错,基于队列的请求,在并发方面得到了很好的控制,也就是不容易崩溃。得益于volley的单例,在退出页面的时候及时的关闭无用的请求,在响应上体验更加好,同时也可以减轻服务器因为误操作的负担,iOS也封装了类似东西。
    2、数据传输全程加密,虽然加密算法简单粗暴,至少不是明文。所以接口都用了数字指纹检验,保证数据在传输过程中不被篡改。
    3、本地敏感数据采用AES加密,本来我修改了一套c++的加密算法,在android5上容易出现崩溃,后来因为偶尔崩溃而又没有测试手机,放弃了。c++的加密虽然也是使用AES的cbc模式,但是结合app签名+手机的硬件信息+时间随机数,进行敏感数据加密,保证每次加密密文都不一样。没有做失效控制。
    4、留下的遗憾,没有验证https,没有采用随机AES加密的方式。随机加密安全性会更高,希望下次有机会再用。
    5、客户端本地存储密码,session过时后,下次请求自动重新登录。本地存储密码是不安全的,虽然加密了,理论上应该存储token,cookie之类的东西。
    6、iOS本地敏感数据采用keychain+AES存储,我知道在还有更高级别的存储方式,但是没有使用。
    7、iOS网络采用AFN+json,后面还配置过AFN的并发数,优化性能。
    8、客户端接口都是json2json的方式,所有服务器通讯都有日志,服务器和服务器之间也有日志,方便以后排查异常。
    9、客户端本地采用bugly收集异常崩溃信息,同时作为测试发布平台。
    10、客户端提交较多的硬件信息到服务端,方便做用户统计,但是没有统计用户的行为,因为当前项目并不是大众化的产品,所以没有接入相关的统计sdk。
    11、 自动化测试,这次没有搞,原因比较简单,因为我们的key都是用中文的,Apple的自动化测试工具支持得不好,所以就放弃了。希望下次有机会去做这方面的尝试,包括自动发布方向的东西。很多人说到热更新,我还是保留了观望的态度,理论上这些都是可以尝试的,对于一个用户量一般的app,没有必要折腾,毕竟头发掉了,有时候再也长不出来了。 

  • 傻傻的坚持

    post by onelong / 2016-5-1 17:47 Sunday [工作]

    在学校写了2年多的html+css+js,毕业后的一直从事android和iOS开发,尽管过程也简单的写过php和数据库,Linux环境的网络编程和多核cpu编程还买了好几本书,那些年一直在看和一直在demo,但是依旧比较遗憾的是因为不会debug没有写出什么像样的东西,然后今年计划学习一下后台和数据库,将这么多年零散的知识堆在一起。突然回首,这几年变懒了,总结少了,很东西都在反复着学,学完又忘记了,忘记了又在学。很多本行人的想法都是觉得技术没什么,是自己最强项的,甚至认为技术学那么也没什么用,又不能当老板,的确是这样的。如果所有的东西都奔着钱去,最好是转行做生意。钱没有人会嫌多,但是还是要保留自己最纯真的兴趣爱好,人这一辈子,要把握的东西很多很多,但是一定要把握最重要的东西-开心快乐。在接触后台和数据库的过程,我也尝试了解运维,测试,产品相关的东西,说到这里,有很多人会说,你想全栈么?我真的没想过那么伟大的事情,而且精力也十分有限,我努力去了解是为了明白整个流程,没有想过样样深入。对于运维,师兄是这样说的,现在都是云服务器,基本不需要学。虽然门槛变低了,但是还是需要了解的,例如nginx的各种指标,tomcat的jmx,CPU负载等东西的,对于测试,首先要知道的概念:功能测试,压力测试,体验测试。了解测试其实是很有用的,为什么这样说呢,因为测试是帮助程序员找出问题,从而写出更稳定,更高效的程序。懂得测试,至少在选择方案的时候可以做到心中有数,少踩点坑。对于产品和市场,这个是很广的话题,想学深代价比较大,也是我当前最不愿意做的事情。但是还是希望在成长的路上慢慢积累,目前很多产品都是找现有的app参考,然后东拼西凑弄一个网站的原型出来,整个排版根本不考虑手机的特殊性,甚至有些产品连交互都不管。努力了解整个流程主要意义是努力让自己有能力把控整一个项目的全程。有时候也会有人质疑,花那么多心思搞技术,还不如想想别的门路,找一份可以干一辈子的事业,我觉得是个人都会想这个问题,但是在当下没有更好的事情可以做的空仓期,我还是选择了干一行爱一行。有时候梦想是金钱和名利无关的,就是一种想坚持下去的力量。在中国合伙人里面有句话:“什么是梦想,梦想就是一种让你感到坚持就是幸福的东西。”

  • 移动案场app

    post by onelong / 2016-4-23 15:19 Saturday [工作]

    自己作为项目主管开发的第一款产品。经历了6个月,终于解决尾声了,过程中收获很多。在管理上,监控项目进度上,还有在技术上,都得到不同程度的收益。整体规划很重要,抓细节也很重要。移动案场app分iOS和android两个客户端,下面看看iOS的截图吧。

    阅读全文>>

  • 怎样快速学习

    post by onelong / 2016-4-20 14:19 Wednesday [工作]

     最近有读计算机的孩童告诉我,选嵌入式方向,搞智能硬件去了,就我个人的看法,选择自己喜欢的,然后咬紧牙关去学习就好了。曾经在一个服务器开发群里面,突然有人问题,怎样给读计算机专业的学生建议。我当时说得很恐怖,“刻苦学习,卧薪尝胆,写它几十万行代码,看几百万行代码,有问题的时候吃饭在想,睡觉也在想”,然后有人评论:“何苦呢?”,我想一想也是的,现在做技术的,随便吹一下就可以找到比较好的工作了,大学就该好好享受生活,做些证明青春的傻逼事情。像去年iOS绝对是高薪呀,培训一下,弄个假简历,马上15k了,而今年呢?好多培训出来的找不到工作。以前做网站的,你会用表格弄一个静态页面就很牛逼了,工作任你选,后来人家要求会asp技术了,但现在要你会手写html+css+js,要兼容各个浏览器,懂得一些框架的使用,懂得seo,甚至更多。技术的门槛会越来越低,要求的技能也会越来越高,不仅仅是多还要求深入,然而高手是不会缺乏市场竞争的。优胜劣汰嘛,也就说明了现在应届大学生要面临比较残酷的竞争,没实力的说话都不敢大声点。技术行业是这样,其他行业也是同样的,社会在进步,企业不可能体谅你是应届大学生,然后付出给更多的培训成本去选择一个什么都不懂的人的,企业做任何一件事,都是有财务核算收益比的。说那么多,就想说去努力就对了。一个人对别人要学会尊重,同时也要给自己自信。你要相信努力过后,你跑在同届毕业生的80前面,因为你有努力的想法,已经跑赢了50%的人,努力+行动跑赢80%,我觉得是没有问题的。现在有很多刚毕业的,可以跑赢工作了2-3年的人,所以自信是成功的第一步。

    阅读全文>>

  • 美好的一天从早餐开始

    post by onelong / 2016-4-16 21:06 Saturday [工作]

    早上早起,送老妈去看医生,送大人物去上班,在新青吃了个隔了好久没有吃了的石磨肠粉,我觉得哪里的肠粉口感很好,虽然我不挑吃,如果不是为了控制体重,我会选择尝试更多美食,在深圳吃个早餐都是匆匆忙忙的,有时候都不知道什么味道就吃完了。深圳楼下的那个肠粉做得一点都不滑,虽然也不是很贵。还有十字路口哪家说专业做肠粉的,就不说了,还不如路边摊。单纯从吃方面来谈物价,深圳和珠海差不了多少, 但是真的不怎么好吃。在深圳工作,我喜欢早早起来坐地铁上班,早早到办公室,看看无聊的新闻,听听音乐,想一想今天要做的事情或者试一试昨晚想到的东西。晚一点去上班通常是很挤很挤的,挤到你都没心情了,所以早早到办公室看着楼下的堵车,看着匆匆忙忙奔跑上班的孩童。好的心情,才是美好一天的开始,不管怎样的忙碌,不管遇到什么问题,都应该学会享受每一刻,乐观快乐的面对,这才是我们应该有的生活态度。 好心情,有时候也是一种能力。很多人缺乏这种能力,才会那么多抱怨,那么多吐槽。生活中有很多事情,我们真的无能为力去改变的,与其天天和自己过意不去,还不如选择接受它,甚至换个心情去享受,你才会变得不一样。生活的苦,工作的苦,其实每个人都是有的,心态决定了自己情绪和表现。我不喜欢单休的公司,现在很多时候听到什么996,5.5天,大小周的公司,基本没有什么兴趣去面试,我不抗拒工作日加班,但我要有自己的时间,不管我是利用这个时间去写东西,看电视剧,看电影,打码,甚至在家加班,我都是觉得我是自己支配的,我喜欢这样的感觉。敲着键盘,偶尔转头看看电视,再偶尔跑去窗口看着稻田里刚刚翻绿的水稻,这才是我想要的生活。 坐在电脑前反思这两周的做的事情,还是蛮有意思的。咽喉发炎熬了两周,没有去看医生,本来是想去阿姨哪里喝个冰糖雪梨的,可是天气不给力,天天下雨,后来自己买了几个雪梨吃下去,真的化痰了,看来我还是比较了解的自己的身体的。今天送完大人物去上班,就买了点雪梨煲糖水。这个季节的建议大家尽可能不要上火,不然很容易咽喉炎和感冒的,经常用眼的孩童,多喝一些清肝明目的汤水,很多人也许会说,我以前都不用这样呀,中医里面是这样说的,一方水土养一方人,所以人的身体也会随之环境和季节变化的。 最近也了解了一下很火爆的,在Github上有3w多个star的react native,看来大家对跨平台跨平台的意愿也越来越强烈呢,Facebook的想法挺好的,据多方了解,react native有些创业公司在用,手机qq和美团在一些无关紧要的模块试水了react native,就我个人的了解,react native除了存在或多或少的性能问题之外,还有很多人不完善的地方,需要自己定义控件,也就是还是需要native的能力,这样的跨平台能力已经超乎我们的想象了,反正都是要折腾,我就不会选择它来折腾。react native和MUI相比,react native至少是开源的,有技术能力的个人或者企业,遇到问题了就解决,但是我们普通打码员只能依赖百度和Google解决问题,万一解决不了那就麻烦了,难道重写?公司里面就有一个用MUI开发的app,用绿盟扫墓漏洞的时候,然后遇到一个问题activity劫持问题和加壳的问题。加壳的问题用爱加密解决了,但是劫持问题3个月都解决不了,我看了一下MUI的文档,发现没有任何配置堆栈的api,甚至自己一个服务都不可以,都只能靠官方开发支持。使用第三方框架开发就害怕遇到这样问题,react native虽然是开源的,但是没有专门的team去维护,我比较担心的是,将来万一苹果的审核制度变了,我们该如何应对呢?如果像bat哪有的大公司,有很多产品的线,当然可以试水,甚至可以成立一个独立的team来维护sdk。所以可以去了解,去玩,但是在产品中使用,还是要谨慎,包括之前了解的kotlin和swift,都存在很多变数。当然swift是未来已经是必然的事情了,但是swift从1.0迅速发展到3.0的过程中在语法上还是有很多变化的,虽然xcode可以自动修正一部分,但是对一个几千个文件的项目而言,还是很麻烦。我知道很多人很热情去尝试了,甚至很多开发者认为会多一门语言就是多一项技能。我并不这样认为的,语言都是表象,而我要掌握的是本质的上东西的,比如更入的了解iOS系统机制和原理。有时候学习需要一个很痛苦的过程,对一个有丰富经验的人来说,或许能先弄懂最顶层原理的东西,然后围绕原理展开学习。但是对于一般人可能不一定适合,因为层次还不够。所以学习痛苦迷惘的时候就发生了,我个人认为学习会经历一个这样的过程:现象到本质,本质到现象。从现象到本质是一个相对辛苦的过程,很多人经历这个事情就会停留在一个瓶颈期,迷惘期,这是这样很多人就一直停留着或者转行。然后从本质到现象是一个更辛苦的过程,这也是一个创造的过程。知道很多大道理,依然过不好这一生,也就是这样说来的,走不出本质到现象的过程,领悟不到要领。 工作需要敏感的心,这份敏感的心或许会给你带来不一样的收获。几年前,我在学习服务器并发和分布式的时候,最后因为没有实践环境放弃了。过程中我也有很多疑惑,例如多进程访问数据库的怎样同步,怎样集群等。直到最近听到一个同事在做优化的项目的时候,无意的一句话让我明白了之前的遗憾。对于每一个进程的线程数是有限制的,所以必须集群。我之前无视node.js,因为我觉得单线程的,不利于cpu和内存的利用,做不了高并发的。然后现在Node.js很火,也说明了当初认为的瓶颈都不是问题了。也是这样激起我那份好奇的心,我去尝试使用Node.js去完善自己的知识体系。为什么选择node.js玩,不弄熟悉的java呢,应该够简洁,我喜欢golang也是这原因。java web老是要运行在tomcat上,还有好多配置项,我觉得好麻烦,部署什么的,也好麻烦,而node.js最适合入门了,而且重新熟悉javascript或许对未来也有点意义。也是这样的一次尝试,对mongodb有了不一样的了解,也重新买书看sql语句,虽然sql语句在mongodb上没有用,但是对自己有用。今天再玩一玩node.js集群和redis session 共享,也算有不一样的收获了。折腾那么多,就是为了搞清楚原理,这样对我以后无论是做客户端还是服务器都是有帮助的,有时候经验是折腾出来的。 努力去做自己喜欢的事情,哪怕是徒劳的。每个不求上进的日子,都是对生命的辜负。