php模糊查询怎么用,我的世界有什么光影?
你要我推荐光影,好的
我的世界手机版光影还是电脑版光影:问别人
手机版,目前最好的光影。建议选择,苦力怕光影真实版
这是图1
这是我见过的手机版、最优质的光影,哇 简直不敢相信我的眼睛。这真的是我的世界手机版光影?不敢相信,这是我的世界!还有这逼真的水面效果,再看一下图2。这个天气系统,简直和PC一致了。有没有:那感觉就就像是用手机玩电脑
看
这逼真的语音效果,简直比现实世界还逼真(除了方块组成以外) 我都分不清现实和虚拟了😱
好啦!我知道的光影目前只有这一个好一点。
怎样才能入行互联网行业?
零经验,三个月从从土木工程转行到互联网运营,我想我刚好能回答这个问题。
一句话——你需要有足够证明自己能够做运营的能力。
不谈虚的理论,直接上干货。我直接举个例子,就拿拉勾网360的产品运营来说吧。在招聘启事的岗位职责这里就是你必须要具备的能力,这些我暂且把它称为硬实力(为了让更多想转行的小伙伴看到,这个回答需要你的一个赞~)
我们继续把这个岗位职责提取出来分析一下:
1、负责产品已有功能和新功能的推广策划
负责产品已有功能和新功能的推广策划,意味着你需要这样几样能力:
(1)深入了解目前产品目前的功能,这个功能目前的目标用户是谁?为用户解决了什么问题?是怎么解决的?目前产品的卖点如何很好地结合用户的需求?哪些是强需求、哪些是弱需求?
所以你需要具备的第一种能力就是,挖掘用户需求,并对需求的优先级进行分析。
比如大部分用户安装手机360是为了清理垃圾,这个就是优先需求;而少部分用户安装360是看重了他的安全支付功能,这个是弱需求。(不要问我怎么知道的,这都是经过360验证的。)
那么进一步分析,就是需要你学会做用户调查,没有站在用户基础上的运营都是耍流氓。要知道用户到底想要什么,只有是在这个功能开发之前,先做个需求调研,看用户是否感兴趣;
如果有50%的用户都有兴趣,那么这个功能就非常值得推出了;当然推出来之后,也不是就万事大吉了,还需要去向小批量用户验证,之前你给用户谈的是愿景,现在做出来就是现实了,这个时候就需要你去调查新功能推出来用户对他感兴趣的点是否跟之前一致、有哪些需求是用户使用较多的,这样就找到强需求了,针对强需求去做推广,这才是正确的打开方式。
总的来说,这项技能可以成四个字:用户调查。
这个调查就包括了用户的年龄、身份、收入、终端设备、用户需求分析、找到需求与卖点的结合点等等。
(2)找到目标用户后,需要做的就是,这些目标用户活跃在哪里,在哪里可以找到他们?也就说我们常说的渠道。
渠道不仅仅是你知道多少渠道,更重要的是知道在哪些渠道,利用什么方式、什么样的内容形式(文章、图文、视频、音频以及应该配置什么样的风格等等)才能吸引到这个渠道上你的目标用户的关注。
举个简单的例子:
360手机安全卫士主要是针对安卓阵营的用户,他就不会把主要精力放到IOS的用户上去。
而可能用360的用户可能还会活跃在哪些渠道呢?
一种方式是通过调查,得知用户目前的行为偏好;
另外一种方式是去研究竞品(比如金山)目前在哪些渠道有动作,这样你也可以去测试;
还有可以通过目前的大数据了解到使用安全助手这一类用户手机的价位、活跃的渠道、喜欢关注的话题,这样你就不会把工作花在无用的地方了。
这也是产品推广所必须关注的点,互联网的渠道成千上万,但不是每个渠道都值得去投入很大的精力。
(3)在了解用户的基础上,还需要具备策划产品推广方案的能力。
其实说简单一点,策划的意思就是给出一份可实施的具体行动方案。这就需要结合前两种能力的基础上,了解各个渠道的特点,然后给出在这个渠道上的具体实施方法。
举个例子,就拿微博这个渠道来说:
你可以通过策划活动来吸引微博用户的参与;也可以通过微博投放粉丝通的广告直达用户,让用户下载或者注册;还可以通过撰写软文,然后投放给微博大V,让他们为自己的产品背书,从而引导用户使用或注册。
而策划的过程就是给出具体的方案,同时,还需要明确到目前的工作,这个渠道,什么时候做什么事情,怎么做,谁做,需要多少钱?也就是执行人员的排期和预算工作。
同时,你还需要去预判这个工作投入多少钱,能带来的产出是多少?
如果遇到突发情况,如何调整,如何应对?
这样基本上就具备了简单的策划能力,这个岗位职责达到要求就及格了。
当然在这个过程中,你得具备几种基本技能:
调查表单的制作:目前可用工具有麦克表单、表单大师、金数据等,不仅可以制作表单,还能进行数据统计和分析。
PPT、EXCEL的应用:做方案毕竟不能口说无凭,Office 还是必备技能之一。
DEMO展示页的制作:这个主要是熟悉各个渠道,然后能够利用一些工具画展示页就可以了。如果会可以加分,不会也不会有什么影响,毕竟还可以用其他工具表达嘛。
2、监测产品功能数据、用户反馈,分析问题并推动解决
监测产品功能数据、用户反馈,分析问题并推动解决其实指的是根据渠道、数据分析工具反馈回来的数据。
了解到注册转化率、点击率、跳出率、使用时长、付费转化率、用户留存、活跃度分析等数据,同时通过这些数据反馈,得知目前那个环节存在问题,哪个页面还可以优化,应该怎么优化。
(1)监测产品功能数据
这个监测产品数据这里,我们起码先得知道,目前互联网产品的一些主流的数据的意义,这样才能知道关注哪些数据,以及如何通过这些数据判断一个活动、或者一个功能是否受欢迎。
其次,监测数据需要工具,最好是会一些数据监测的工具,这样不至于到了一家公司让你查看数据不知道怎么查看,让你制作广告追踪你不知道怎么制作这样就很尴尬了。
目前移动端的主要数据监测工具有:友盟、talking data、GA(谷歌分析)、百度统计、Growing IO等,但这个一般需要有自己的产品才能查看数据。
PC端的数据监测工具包括了:百度统计、GA(谷歌分析)、Growing IO等等,工具很多,但是也需要有自己的网站才能用。
当然还有一些第三方的大数据平台:比如易观智库、新榜之类的,主要是用于查看竞品的数据,了解行业趋势用。
(2)用户反馈监测
用户反馈其实可以这样理解,从产品方面来说就是用户体验。
用户使用这个新功能后,他是否喜欢、这个使用过程中存在什么问题、是否因为bug或者产品设计的原因导致部分用户使用起来不顺手从而放弃?
这个首先需要安排客服人员持续去收集用户反馈、同时也需要自己去和部分用户做1V1访谈,甚至是制作问卷去收集反馈,以便知道问题所在,在产品迭代中提出优化。
所以这件事情说起来是比较杂而细的一件事情,但是也是作为产品运营来说最应该关心的点之一,产品设计应该在最大化满足用户体验的情况下获取盈利。
即使是微信这样覆盖率超级高的产品,也是需要根据用户的反馈来调整产品的方向的。
(3)分析问题并推动解决
这一职责其实是数据监测和用户反馈的目的所在,其实仅仅需要的是逻辑分析能力和沟通能力。
因为之前从数据分析中、从用户反馈中已经得出了问题,这一步就是找出目前能够解决的、非常影响用户使用的一些问题,提出优化的方案并交给技术团队去解决。
我相信作为新时代的人才,这一点只要经过基本熏陶都是可以做到的。
一下,第二项岗位职责中需要的能力主要是:
数据分析能力:会用数据分析工具、看得懂数据、能分析数据
解决问题的能力:针对问题及时提出解决方案,这个是需要不断和长期锻炼的
沟通能力:跟用户沟通、跟技术团队沟通等等等
3、制定产品功能的运营策略,跟进执行方案的实施,持续提升用户粘性
这一步其实说简单也很简单,就像是经营一家商店,用户进来了,怎么吸引他使用并且购买自己的产品,怎么把他服务好,让他持续使用自己的产品,形成长期使用和购买的习惯,甚至他会向别人主动去推荐你的商店。
好了,回到手段上。其实这就跟线下开店是一个道理,比如你有一家经常光顾的饭店,为什么经常光顾呢?可能有几个原因:
他家的饭菜很好吃,很合你的口味;比如知乎就是因为作为一个知识分享平台,用户在这里能找到合自己口味的东西。
他家的服务态度很好,给你家一样的感觉;这个就不举例子了,一般服务态度差的产品也不好过。
他家你能获得惊喜,经常推出新菜;比如互联网产品经常会推出新功能,像知乎最近推出想法一样,你在这里的可玩性更高。
他家的菜很实惠,很便宜;比如很多人选择双十一抢购其实就是图着双十一打折去的,人们似乎天生对捡便宜没有抵抗力。
好了,回到产品上,这需要一些什么样的能力呢?
其实这对应了用户来了之后,如何留存,如何促进用户活跃,甚至形成口碑传播,这在互联网产品中是至关重要的。
那么这就需要这样一些知识和技能了:
(1)活动策划能力
要留住用户,他一定是要在这里能获得自己想要的东西的。但不能仅限于此,我们还要给用户制造惊喜,经常举办一些有趣又能带动用户讨论、分享的活动就非常重要了,比如像360在春节期间会推出抢票神器、抢红包神器之类的。
比如天猫也会经常做线上的折扣、支付宝的春节红包等等
所以这就需要一个运营非常重要的能力——活动策划
这个活动策划说简单一点就是,做一个活动,活动的目的是什么?这个活动用户是否会感兴趣?活动开始前要做哪些准备?活动的整个流程是什么样子的?规则是什么?入口在哪里?在哪些渠道做宣传预热、需要哪些人,做什么事情?整个活动预计会产生什么样的效果?需要多少预算?投入产出比是多少?有没有预备方案?......
(2)基本的文案能力
最起码得有基本的文案写作能力,各个页面、入口、分享、规则、活动详情页的文案最起码要知道怎么写,不然这个活动就没有办法交到技术及设计,更没有办法落地执行了。
可以说,在某些活动中,文案甚至占到了二分之一的作用。比如微信分享的活动,文案基本上就会决定用户是否会分享这个海报或者文章。
(3)懂一些心理学的知识,能够利用这些知识预判一个活动的效果。
当然这个能力需要工作中长期积累,需要深入了解自己的产品和用户,需要随时跟进社会热点,制造用户感兴趣的话题。
具备以上这些能力,基本就具备了这个岗位的基本任职要求了。我们再看看岗位要求:
1、大学本科或以上学历,2年以上互联网行业经验;
2、对移动APP、互联网社交产品有较深的理解,对用户需求、用户行为有较深的洞察力;
3、熟悉互联网公司的项目推进流程,有较好的项目管理能力;
4、熟悉行业内主要公司、产品的运营策略,对竞品案例有自己的理解和分析;
而要求这里的,我把它称为软实力,这是需要你不断去积累的通用能力。
第一条,如果你已经具备了岗位职责需要的所有能力,其实两年经验都不是问题了。公司通过经验筛选的不是年限,而是能力,如果你具备了以上能力,那么恭喜你,这条可以不看了。
第二条,对app、移动互联网的理解其实也已经包含在岗位职责里了,你懂得用户调查、懂得数据分析、甚至懂得关注热点,那么其实你已经具备这个能力。
第三条,熟悉项目推进流程,具备项目管理能力,这个只需要你百度一下,基本就能够知道一个主要流程了,至于项目管理能力,这更多是需要工作实践和探索的。
第四条,熟悉竞品的运营策略,对竞品有自己的分析和理解。很简单,针对竞品,做一份调研,去使用竞品、进入竞品的用户群或者论坛、关注竞品的动向其实就可以获取到很多东西了,然后细一点你还可以把竞品目前的主要动向做出一份分析报告出来,这样在面试的时候拿出来,其实是非常亮眼的。
不知道这个案例有没有加深你对运营工作的理解?
其实,不论是活动运营、用户运营、产品运营、内容运营、新媒体运营还是其他的运营,都逃不脱这几大能力:
1、用户调查:懂你的用户(画像、渠道、喜好等),并且懂他在你这里想要的一切。
2、内容制作:懂制作营销内容。比如文案、比如海报、比如活动等等
3、渠道:了解你的用户可能活跃的渠道,并且了解这些渠道的特点
4、数据分析:懂数据分析(概念、运用都得懂)
5、调整优化:根据以上所有的反馈,去做产品更新、迭代、创意的制作等等
最后,分享一下自己是如何零经验,从一名搬砖狗转行到目前的市场运营岗位的。
主要有三点:
一、学习
学习好运营的理论知识,为实操和工作做好充分的准备。
二、做好实操作业
小白光会理论实际上没什么用,最主要的还是能落地。
所以我就在学习期间开通了自己的公众号——小强职场说,在两个月时间通过零成本获取了大概4000左右的粉丝,建立了两个读者社群,收集了100多份调查问卷,成功举办了两场小型的社群活动,这些才是我真正能够拿给面试官去说的成绩。
当然,除了这些成绩,还有包括数据分析的成绩、文案写作的成绩等等。我在这里想说的其实就是,即使具备了运营的思维,还需要能提供这个思维的证明材料。这样才能有理有据地说服面试官。
三、最好是能给面试公司做一份面试作品
我在刚开始找工作的时候锁定了一家公司之后,没有着急去投简历,而是针对面试公司目前的产品去做了一份面试作品。
做一份走心的面试作品
去应聘一家公司之前,先问问自己:什么是走心的面试作品?
很多人去面试一家公司,仅仅是带上一份个人简历,有可能还不是针对你的目标公司的简历。
作为一个零经验的小白,你如何让对方公司的HR或者说CEO去认可你,如何去和那些有三年经验、五年经验的人去竞争呢?
仅仅通过你学到的一些浅薄的知识和自吹自擂吗?
当然不是了,之前跟大家分享过写简历的经验,我想对于每一个想写出一份能打动面试官简历的人来说,那已经足够了。现在我想跟你分享一下,如何通过自己的准备,去打动一家公司的HR和CEO。这不是吹牛,更不是什么传奇故事,这只是一个再平常不过的零基础小白应该做的事情。
起码有这样几件事情,你可以做提前准备的。
1、了解一家公司以及这家公司的成立背景、主要业务模式和产品、他的创始人、公司的基本概况等等。
在一大群面试者当中,你能够清晰地说出公司的详细信息,这已经能够秒杀99%的应聘者了。很多人海投海选,最终也没得获得几个offer;少部分人只挑自己喜欢的公司,去准备一切和目标公司有关的信息,他的成功概率至少提高了90%。
2、如果可以,尽己所能去为公司提一些自己的建议或者说能够针对目前公司的情况给出一些解决方案,而不是一味地去吹捧自己多么多么厉害,自己有哪些能力。
先考虑你能给公司带来什么,再去考虑你会做什么。每家公司都是很欢迎来了就能给公司创造价值的人的,尽管你提的建议可能不对,但起码你的用心HR会看到。
3、不吹嘘自己过去的头衔,只展示自己实际解决问题的能力。用STAR法则去描述自己的项目经验,尝试去描述自己在什么样的情境下,担负了什么样的任务,采取了什么行动,获得了什么结果。
最后,千万不要告诉面试官,你是学生会主席,你管理了30多个手下,你很厉害,这些并不是真正能打动一家企业做出选择的最重要因素。你可以能力不够强,但你态度一定不差;你可以专业知识不足,但你一定爱学习;你可以没有经验,但你一定喜欢这份工作并愿意为之付出。
4、关于面试作品的几个方向,我想可以有这样几个方向给你参考。
(1)对目标公司的目标用户所做的用户调查结果
(2)对目标公司产品及业务模式的分析报告
(3)对目标岗位的认知,以及关于目标岗位的一份策划方案
(4)对于目标公司竞品的调研分析报告和优化建议
(5)自己目前所拥有的项目经验和作品
想获得我面试作品的,在我的公众号——小强职场说,回复【面试作品】即可获得。
最后,送给可爱的你一句话:每一段牛逼闪闪的经历背后,都有一段不为人知的苦逼经历。你现在的努力,一定有用。
Mysql怎样优化处理?
1. 避免使用 select * 你需要什么信息,就查询什么信息,查询的多了,查询的速度肯定就会慢
2. 当你只需要查询出一条数据的时候,要使用 limit 1 比如你要查询数据中是否有男生,只要查询一条含有男生的记录就行了,后面不需要再查了,使用Limit 1 可以在找到一条数据后停止搜索
3. 建立高性能的索引 索引不是随便加的也不是索引越多越好,更不是所有索引对查询都有效
4. 建数据库表时,给字段设置固定合适的大小. 字段不能设置的太大,设置太大就造成浪费,会使查询速度变慢
5. 要尽量使用not null
6. EXPLAIN 你的 SELECT 查询 使用EXPLAIN,可以帮助你更了解MySQL是如何处理你的sql语句的, 你可以查看到sql的执行计划,这样你就能更好的去了解你的sql语句的不足,然后优化语句.
7. 在Join表的时候,被用来Join的字段,应该是相同的类型的,且字段应该是被建过索引的,这样,MySQL内部会启动为你优化Join的SQL语句的机制。
8. 如果你有一个字段,比如“性别”,“国家”,“民族”, “省份”,“状态”或“部门”,这些字段的取值是有限而且固定的,那么,应该使用 ENUM 而不是 VARCHAR。
因为在MySQL中,ENUM类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多。这样,我们又可以提高数据库的性能。
9. 垂直分割 将常用和有关系的字段放在相同的表中,把一张表的数据分成几张表 这样可以降低表的复杂度和字段的数目,从而达到优化的目的
10. 优化where查询
①. 避免在where子句中对字段进行表达式操作
比如: select 列 from 表 where age*2=36; 建议改成 select 列 from 表 where age=36/2;
②. 应尽量避免在 where 子句中使用 !=或 操作符,否则将引擎放弃使用索引而进行全表扫描。
③. 应尽量避免在 where 子句中对字段进行 null 值 判断
④. 应尽量避免在 where 子句中使用 or 来连接条件
11. 不建议使用%前缀模糊查询,这种查询会导致索引失效而进行全表扫描
例如LIKE “%name”或者LIKE “%name%这两种都是不建议的.但是可以使用LIKE “name%”。
对于LIKE “%name%,可以使用全文索引的形式
12. 要慎用in和 not in
例如:select id from t where num in(1,2,3) 建议改成 select id from t where num between 1 and 3
对于连续的数值,能用 between 就不要用 in 了
13. 理解in和exists, not in和not exists的区别
很多时候用 exists 代替 in 是一个好的选择:如查询语句使用了not in那么内外表都进行全表扫描,没用到索引,而not exists子查询依然能用到表上索引,所以无论哪个表大,用not exists都比not in要快。
select num from a where num in(select num from b)
建议改成: select num from a where exists(select 1 from b where num=a.num)
区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询。所以IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
关于not in和not exists,推荐使用not exists,不仅仅是效率问题,not in可能存在逻辑问题
14. 理解select Count (*)和Select Count(1)以及Select Count(column)区别
一般情况下,Select Count (*)和Select Count(1)两着返回结果是一样的
假如表沒有主键(Primary key), 那么count(1)比count(*)快,
如果有主键的話,那主键作为count的条件时候count(主键)最快
如果你的表只有一个字段的话那count(*)就是最快的
count(*) 跟 count(1) 的结果一样,都包括对NULL的统计,而count(column) 是不包括NULL的统计
技术交流请关注“大数据java架构师”
如何快速学习编程?
1. 我应该选择什么编程语言
可能困扰编程新手最多的一个问题是【我应该学什么编程语言】或者【我需要学习哪些课程才能做出一个web、一个app】,很多人一直纠结这个问题,陷入了东学一点、西看一点的死循环,到头来啥也没学好,这会很浪费时间。刚上大一的时候,我也很想知道应该选择什么编程语言。我问了很多人,网上各种查资料,但所能得到的答案都很片面,多数对这个问题答非所问,总是回答说“某某编程语言难”,“某某编程语言性能好”。其实作为初学者,我们对计算机体系都不了解,就不要过多地去纠结性能,或者难易等因素,原因我等下再说。如果你有明确的方向,那么很好选择。如果你想做算法、机器学习方向,那么python是最好的选择。如果你想做web开发,java、php等都可以。如果想做一些更底层的工作,那么就可以选c。当然这是建立在你有明确方向的基础上。可是,很多人都没怎么接触过计算机行业,特别是和我一样刚入学就被调剂到计算机专业的人。对这些同学来说,各个编程语言就只是个名字,除了叫法不一样,你根本不知道它们有什么差别。所以索性不要纠结了,我替你选一个吧。如果你是在校大学生,那么你有大把连续的时间,就先学习c,然后再学c++。我个人是学c入门的,也许很多人不理解我为什么推荐学c,因为c和c++都很难、很复杂,看起来并不适合入门。然而正是它们的难和复杂才能让你更好地理解计算机系统【计算机系统不是指操作系统】。学习编程不是学习编程语言,而是学习一个计算机生态,即一个庞大的知识体系。只会编程语言而不理解整个计算机的体系,就像只会写字而写不出好文章。了解c/c++和了解计算机系统是极为贴合的,向下可以帮助你更容易地理解操作系统、编译原理、计算机网络、计算机组成原理,为什么呢?因为较为底层的东西很多都是用c实现的,和系统的贴合度极高,很多教材源码甚至教程,在讲述这些知识的时候都是用c或c++作为媒介。而向上,c++面向对象的机制,也可以做出一些应用,譬如五子棋游戏等,也不会显得那么枯燥。花个小半年时间了解c和c++,之后你就会觉得看书、看资料可以轻松很多。如果你是一个上班族,但是刚刚学习编程,可能学c和c++对你来说有些复杂和困难,因为学习它们确实是很需要时间。你们不像在校生那样有大把的连续时间,而零碎的时间去学习一个比较复杂的东西效果不见得有那么好,所以可以先学一些【更容易见效】的编程语言,从python入手吧,至少能快速做出一些小应用,不至于丢失了兴趣,但是真的要入门编程又还得看看与计算机系统相关的书籍,这样才能更深层次地去编程,譬如【深入理解计算机系统】这一本书可以读很多遍,这本书把整个计算机系统给串起来了。2.学习编程,我需要学习哪些课程?我要学哪些课程?我为什么要学习如高数、离散数学、线性代数、概率论等课程?这个问题也是之前困扰了我很久的问题。不过我现在想通了,对于【高数、离散、线性代数、概率论】等课程,很好解释,做算法的同学肯定知道为啥要学习这些课程。机器学习中会大量用到上述提到的课程,所以会比较好理解。对在校生而言,学校开设的很多课程我们不知道为什么要学,我们很疑惑,不知道学它有什么用,这个时候我们就会很纠结,还会产生抵触情绪。这很正常,因为我们学习得不够深入,自然不能理解它们的用处。在我看来,大学本科课程更多的是面向“面”的教学,即什么课程都教给你一些,但是又讲得不那么深入;而工作或者读研,更多的则是面向“点”的学习,用到的知识更专。本科时,学校也不知道你以后是去搞算法、还是搞架构、还是搞服务器开发,甚至去搞硬件,所以学校需要你学很多课程,至少有个了解。对学生来说,一方面可以从中选择自己感兴趣的点;一方面也可以对未来的就业方向有些启发。所以即使像数电、模电等课程,虽然之后可能用不着,但是你也要学,并且会花费大量的时间。虽然你最后不一定去搞硬件,但是这些课程也会让你更容易去理解一些知识,比如cpu中的逻辑器件。如果你在大一的时候就有一个明确的定位,知道自己今后想从事哪方面的工作,课程与课程之间是可以调一下优先级的。不过像大学物理,这种课程确实是对编程没有帮助,但是像我前面所说的,大学教育更注重广度,大物等课程可能就是为了给你普及生活常识吧。其实,大学教育的问题是普遍存在的,我认为我们学习一项技能的时候,应该采取的是项目驱动式学习,即需要用到什么东西时不会了再去学,而不是先填鸭式的都填进脑子,并且在学习的过程中我们还不知道它这是干嘛用的,等之后用到了,甚至不记得自己学过,反而查资料才会想起:哦,原来我之前学的xx科目是这个用处啊,可是我当时并没有好好学。很多时候学生时间的浪费可能还是要怪老师、怪学校,他们一开始没给我们做好充分的课程介绍。所以,在经过比较多的编程和项目实践后,我认为一个比较好的学习方式是,改良版的项目驱动学习法。即:学习一段时间,做个小项目,将做项目遇到的问题记下来,针对性地学习相关知识,然后再实践,再学一段时间理论,让知识成网状发射状地变大。当然,项目驱动式学习有一个弊端,就是每次学习的知识都是项目所需要的,很零碎、不成体系,所以需要改良,即在采取项目驱动学习法的时候每天抽一段时间去完整地读一本书,或者一个相关问题的完整介绍,这样就很容易把一些知识成体系地串起来。这样一段时间下来,慢慢的,你就知道我们为什么要学那么多科目,学这些科目能干什么。为了表达地更加形象,我就举一个小例子,是我最近遇到的。我本身的工作是做Linux C++的,但不仅限于此。我个人对python、数据分析,以及机器学习等内容比较感兴趣,大家可以看到我最近也在我的专栏发布了很多文章。就从数据获取开始,我讲讲我这两个月做了什么东西。谈到数据获取,可能最容易想到的是爬虫,爬虫是一个被说烂了的话题,所以我不想多说它是什么。很多时候有人觉得爬虫简单,为什么呢,因为有现成的框架,所以获取少量的数据就比较容易。但是当你需要爬取的数据很大的时候(比如我之前抓取了某网站500万用户的数据,在下班的时间、用自己家里普通的pc,计算机性能并不是那么好,比不上服务器,又要在不被封IP的情况下抓到这么大量的数据,然后对数据进行清洗,最后还要可视化展示),使用现成的爬虫框架就并不是那么容易实现了。况且,我需要抓很多数据源,并不是一锤子买卖。所以我选择去开发一个系统,即在现有的框架下进行二次开发,搭建一个属于自己的爬虫系统,并植入一些算法。我在系统中添加了很多中间件,直到现在,它还可以在10分钟内就部署一个能抓取大量数据的爬虫应用。当然,这个过程也遇到了不少麻烦,我就简单讲讲,怎么去攻克一个个问题。下面先给出一个树形图,从上往下每一个圈都代表了学习过程中遇到的难点,如果你现在看不懂,没关系,我想告诉你的是一种梳理知识的方法:如上图所示,就是一个项目驱动式学习的例子,我们的目的是为了获取数据,所以选择了爬虫:爬虫可以理解为一个简单的过程:发送request,获取response,然后提取数据。这个过程会涉及到网络,是发送http还是https请求;目标网站是否需要登录,是post请求还是get请求,从这条线,衍生出了一条对网络进行学习的路径。获取到网页之后,如果不是结构化的数据,可能返回的是一个html源代码,那么可能就需要了解dom,或者html页面解析的知识,甚至需要了解一下前端开发。在抓取的过程中,经常会遇到数据中途不能被爬取的情况,一般是IP被封禁了,那么可能又要用上代理,代理是什么呢?http,https代理能不能混用呢?如何构建一个代理池呢?这里又有很多要学习的东西。还有可能遇到的情况是,抓下来的数据是加密的,需要通过js解密,这时候就要了解一下js,如何用爬虫模拟浏览器进行抓取。除此之外,如果抓取的频率不对,很多数据源会给你假数据,这就是一些经验问题了,本文不是技术文,所以就不多讨论。当解决了上述问题后,我们好像可以拿到一些数据了,但是当数据大起来,问题又复杂了,你可能需要使用分布式抓取了,这时候你可能需要了解一下redis,当request产生的速度大于其消费的速度之后,你的任务队列可能爆炸,所以这里又涉及到算法和数据结构的应用了。数据量上去之后,把数据写在文件里面是不靠谱的,这时候又涉及到存储了,到底是使用关系型数据库还是非关系型数据库呢,有什么区别呢?存进去的数据怎么去重呢?为什么insert操作越来越卡了呢?电脑怎么越来越热了呢?索引是什么,什么时候该建立索引呢?这里又牵扯到数据库原理相关的知识。遇到一些比较难处理的网站,比如有验证码识别该怎么办呢?其实对于很多纯数字和字母的验证码都很好解决,自己用深度学习训练即可。在TensorFlow的Demo中就要生成验证码自己训练的教程,然后制定个中间件放在爬虫系统中,这个问题就解决了。可是什么是深度学习呢?这里又引出一条对深度学习进行探索的例子,而我自己也是之前在学校的时候自学了小半年机器学习,有了一定的基础后,才能比较容易地上手TensorFlow框架。再往下就比较深了。上述六点简单讲了讲项目驱动式学习的介绍,其实,你看到的每一个小圆圈,深挖下去都大有文章。我们现在看到的只是冰山一角,任何一条学习路径学习下去都深无止境,我们不可能完全学会,可是项目驱动式学习最大的好处是让你知道你应该去学习什么,而不是先学一大堆知识,再去做一个项目。严格来说,项目驱动式学习的可视化路径是一张网,而不是一棵树,这里画成树状只是为了便于大家理解。除了获得数据,还有清洗数据、分析数据,甚至挖掘数据,最后可视化数据并且展示数据,这里我就不一一介绍了。3.学习编程是否需要制定计划?学习编程是否需要制定计划,该制定什么样的计划呢?我认为不只是编程需要制定计划,其他任何的学习和工作都需要制定计划。我从13年上大学就开始定期给自己制定计划,这个习惯也一直坚持到了现在,受益匪浅。当然也不只是制定学习计划,还可以列一些自己需要做的其他的事情。我最近在整理笔记的时候也发现了一些之前记录的计划和清单,可以给大家看看。比如下图就是我14年写的笔记,笔记上都留下了最后一次打开的时间。列举了一些自己需要看的文章,因为当时不太懂得规划,所以比较乱。到了16年的时候,我做计划做得更加有条理了。下图是16年10月30日的计划,那时候我已经大四了,并且已经找到了工作、签了满意的offer,并且没有什么课,按理说可以放松放松了,不过我还是制定了一些学习计划,并且选择在11月去百度实习。从内容上看,主要是学习英语和计算机专业课,因为大一大二的时候我确实不明白为什么要学习专业课,到了大三下想清楚原因以后,我也就一直在重新学习,因为计算机专业课真的很重要!学好了这些课,能让你在日后的学习工作中轻松不少:除了大四制定的计划外,大二的时候我也制定过较为详细的学习计划(如下图),把需要学习的内容进行了编号,存入表格,这样才能让你过得有条不紊。当然,很难完全按照计划去执行,不过制定相应的计划能让你清楚地知道自己应该干什么。所以,如果你是在校生,那么好好制定一个计划吧,因为你有大把的时间。当然,如果你已经毕业了,没关系,我现在也在上班,同样也列举了自己最近要学习的内容,如下图(2月27日更新过),包括了短期和长期需要学习的内容:4.编程是否需要做笔记和写博客?我觉得,写不写博客无所谓,因为博客是要写出来给大家看的,可能要保证格式美观、语法也要尽量准确,最好比较有文采,我觉得太麻烦也就一直没写。而笔记是必须要做的,并且记笔记是一个长期的过程。在学习的过程中,我们一直都在追求一种最高效的学习方法,比如,同一个班的同学,他用他的学习方法考上了清华,而你用同样的方法就不行,为什么?因为他的方法对他自己而言是定制化的,可能且大概率不适合你,比如他的笔记你不一定能看懂,因为他可能设计了一套属于自己的符号。而就编程而言,很多同学说善用搜索引擎,是对的,可是搜索引擎搜出来的是别人的答案。你照搬过来,也许可以用,但是你没有记住,这些知识并不属于你,之后你可能还会遇到同样的问题,又要再搜索一遍,可能很难找到之前的那个答案了。但是记笔记就不一样,记笔记是定制化的,对你自己定制,你可以用自己最爽的表达方式来描述一个问题,是自己写给自己看的东西,看了几遍之后就能非常迅速和容易地理解。之后遇到相同的问题可以快速地通过找笔记解决。举个例子,下图是我记录的一些关于gdb【linux下调试c++的工具】的使用的一些笔记。我只记录了我自己最常用的一些内容,也许你看着很乱,但是我就能很容易看懂,这就是我的定制化。记笔记的习惯一定要坚持,等过个一年或者两年,这就是你巨大的财富,因为那是只有你才能看懂的东西。我已经记录了4年多、1G多的内容,现在的笔记基本已经形成了体系,可以给大家展示其中的一部分。专业知识相关笔记:开发相关的笔记:一些类目:5.有什么比较好的编程方法?除了上述分享的一些方法,我认为在同一时间段不要学习太多类别的课程,比如你可以同时学习python和html/css,但是你不要同时学python、操作系统、编译原理、计算机组成、数据结构、网络,我曾经试过,一门课没学一会儿就学下一门,其实上一门根本学不到什么实际的知识。因为记忆知识是符合艾宾浩斯记忆曲线的。对于一门课,特别是很难的专业课,譬如操作系统,你每天看半小时,效果是比较差的,可能你热身就得半小时。所以宁可每天学两门,然后每一门学长一点的时间,比如两小时。【毕竟学校上课,一次课也得两小时】,要避免贪多,一口吃不成个胖子。6.我需要刷oj么?我认为刚开始编程的时候还是应该刷的,但是一定要注意,不要被你周围的“X神”给误导了。因为我上大学的时候,身边总是有很多搞计算机竞赛的人,他们之间都互相称对方为“X神”,某某神又使用一个牛逼的算法,将程序时间从1秒降低到了0.999秒。我要劝大家的是,刷题不是为了达到这个目的,不是说非要在竞赛中拿奖,除非你是特别喜欢,否则,没必要去背代码。我们刷题的目的是适应写代码的感觉,在这个过程中你会遇到编译错误,你会慢慢去记住一些语法、关键字,并理解一些概念,还可以自己去使用它,比如实现数据结构。慢慢的你就会变得有经验,知道一些错误产生的原因。我也是慢慢这样过来的,我现在在工作和下班以后写代码时,基本都不用IDE了,比如写c++,要么vim,要么就是sublime,而调试用的是我前面提到的工具gdb。即,有一个文本编辑器就能写代码,脱离了IDE的束缚。在写oj之后一段时间,在比较熟练了之后,就可以不去刷题了,可以去譬如github这样的网站上找点项目来看,然后自己跟着写一下,编程能力慢慢就提升了。就计算机专业来说,很多同学在大一上完编程课之后,就很少写代码了,这样是很不好的。刷题除了可以锻炼编程能力,对于找工作前突击也很有作用。比如,我之前投递过华为公司的研发岗位,校招的时候有笔试题。我就在16年国庆的时候刷了一下华为的oj,我记得笔试是600分的总分,过100就给面试机会,而我很轻松的就拿了500分,而当时也就刷了20多道华为的题。7.看书还是看视频?网上有不少人鄙视看视频学习的同学,我不知道为什么,因为我认为看视频是一个很好的学习方式。不过我们得明白看书和看视频分别有什么优缺点。其实我是很建议看视频入门的,因为目前网上的应用型【非学术型:比如清华大学的操作系统,非常难】的视频都是很简单的,很多是面向初学者的,视频能用较短的时间告诉你你现在所学的技术可以干什么,可能需要先修哪些知识,可以帮助我们搭建一个项目驱动式学习的网络。可是视频也有个缺点:就是知识非常的杂,很不系统。虽然现在很多教学网站都提供了学习路径,但是这些路径中的视频很多时候都不是同一个老师录制的,只是按照知识的依赖关系排的顺序,所以,如果想通过视频去系统地学习一门知识,是比较困难的。【当然,一些学术型的视频还是很推荐的,比如斯坦福的机器学习,清华的操作系统、数据结构等课程,能坚持看完,绝对受益匪浅】。而应用型的,比如web开发等知识,还是得看书。书籍等特点就是系统化,由浅入深,你可以定制化地看自己薄弱的章节。所以一个比较好的学习方式是:看视频入门,看书进阶。8.多久能学会编程?其实这个问题是没有答案的,如果只是想做出一个小应用,2个月足矣,而就我个人而言,我认为学习编程不是学习一种编程语言,而是学习一个生态,一个计算机系统,所以无止境。9.我应该选择什么资料,看什么书?其实这个问题也是很多编程新手容易困惑的问题。网络上拥有我们一辈子都看不完的教程和资料,所以现在应该不会存在找不着视频教程、找不着书看的问题。而问题就是我们不知道看什么视频、看什么书。从开始学编程到现在,我也买了上百本书,而真正适合自己的好书并不多。而视频教程的问题就更严重了,东看一点、西看一点,知识很难组织成网络。所以学习编程的过程中,我们遇到的最大的问题是:当我们遇到问题的时候,在大量资料面前,我们不知道选择什么资料去学习。即使我们使用项目驱动式学习的方法找到了我们的方向,但是同一个路径下,也有很多资料。前文列举的项目驱动式学习的图中,我们是自上而下的去发现问题,然后再解决问题。如果能有人帮我们组织好学习路径,然后自下而上地去学习,那么效率可能会提高很多。不过不用担心,我已经尽我所能,将我看过或者我认为好的课程和书本资料给串了串,整理好上传了,所有学习资料均免费,无任何收费课程。资料百度云地址: https://pan.baidu.com/s/11Pk-TAKuiyKaY9Llxpdj2Q 提取码: w4mk另外,很多新手反馈不会搭环境,那我给大家推荐一款可以在线运行代码的网站,那个背单词app百词斩推出的学习编程的网站,在线编辑,在线运行,避免了你搭环境的痛苦,直接运行即可,这个环境使用是免费的,点击FreeCode,选择“代码练习”新建文件就可以了:这个网站对初学者比较友好,不过目前只有Python环境,其他的环境得再等等。百词斩一直走的都是黑科技路线,并且出的课程也是采用的及时反馈的模式,也正是在他们家自己搭建的环境上,进行的一个练习,对电脑的配置也没有什么要求,甚至平板和手机等终端上都可以使用,也是按背单词那套来设计的,感兴趣的同学也可以去看看,也可以去公众号回复「免费教程」能白嫖免费的课程,感觉也还挺扎实的,实在不感兴趣的,也可以免费薅一下他家的编程环境,对电脑配置真的没有什么要求。程序员会忘记自己写的代码逻辑么?
一般会忘记自己代码逻辑的有一下几个习惯。
1、不给代码加注释。特别是比较重要的部分,一旦后期维护起来,这类代码就变成了让人难以理解的存在,有时连写代码原作者都自己会懵。
2、代码版本管理混乱。特别是团队开发的时候,发布版本是要严格审核的,同个团队的代码版本要保持一致,否则遇到个版本变动,很容易让人懵逼。
3、没有程序设计理念和保存程序设计的习惯。写程序不能一拍脑袋就写了,事前需要大量的设计工作,实现过程中,也要按照设计要求来,设计中有变动的地方要及时通报和保存,并做版本更新。
4、没有做笔记和备忘录的习惯。程序员的思路运转很快,如果不做笔记,这个思路和点子可能过会就忘了,或者在写代码时遇到问题,也需要记录其解决过程,这样后期整理出来就是一本经典的开发案例。
以上是个人的一点经验之谈,也是我犯过的一些错误。经常被自己的代码搞的找不到北。希望大家不要谨记我的教训,开开心心写代码,快快乐乐过春节。