网上许嘉允假腿事件姑娘爬山的视频

深圳报业媒体群
||||||||||
时政快报:
杨紫蕾丝连衣裙甜美俏皮 嘟嘴吐舌上演表情包大战周冬雨清爽现身似邻家少女 见粉丝打招呼超亲和奶茶妹章泽天晒高难度健身 两腿成90度柔韧性强徐静蕾晒海边度假照 热裤帆布鞋少女感十足男友力max!陈伟霆下厨煎鸡肉 手臂线条man爆张梓琳小女儿爱臭美 照镜子很满意忍不住亲自己新古装男神大PK马来正妹渔网装秀嫩肌雪肤 长腿逆天超活泼!甜馨墨镜遮面51岁温碧霞穿吊带蕾丝连衣裙天后王菲潮范儿旧照曝光
8月13日,难得没戏的佟丽娅下厨大展厨艺,做出大桌色香味俱全的美食,自夸“老厉害了! ”网友也纷纷点赞丫丫很贤惠。
日,重庆市渝中区洪崖洞旁一酒店,所有客房阳台统一安装空调后,远看外墙如有百双“眼睛”。
深圳报业媒体群 深圳公益网群 合作网站 友情链接 “一带一路”网络联盟
||||||||||||
|||||||||||
||||||||||||
|||||||||||
廉政监督电话:(6 | 报料热线:(7孙俪在网上卖邓超的裤子,原价280只卖25还包邮
哈哈哈哈哈哈橘子君要被邓超和孙俪这对儿逗比夫妇笑死了!起因是孙俪发微博说要把邓超的裤子卖了:喏,就是这条青蛙假腿裤,完全穿不出去,不知道学霸为啥这么喜欢,两个月前刚买的娘娘觉得太占地方,所以就拍了照放在了一个专卖旧物的二手app上,物品描述写的“不知道”,而且原价280竟然只卖25块还包邮.......心疼wuli超,他看到这条微博后马上留言说:“你是真是假?”确认了之后立马软了:还抱怨娘娘没跟他商量就做决定娘娘也不甘示弱,借此机会还公开向网友“求助”:老公整天买买买,我该咋办?哈哈哈哈哈这一家子太逗了......
正在加载...
-----------------------------------------------目前这条裤子还没到开卖时间,不知道到时候会不会疯抢.......说起孙俪的二手小店,其实她早在去年8月份就开了,当时她还特意在微博打过广告:娘娘卖的东西都是她和孩子穿不着的鞋子、衣服价格都不贵,Burberry的包才卖1100,原价6500除了衣物,偶尔她也会上些书至于销量,目前已经有30多万的店铺关注,买家评价也很好这次是孙俪第一次卖自己老公的东西,不知道结果如何,期待9号.......最后一句闲置物品出售既环保又发挥了东西的最大价值,希望更多的明星加入进来......本文来自腾讯新闻客户端自媒体,不代表腾讯新闻的观点和立场
正文已结束,您可以按alt+4进行评论
责任编辑:yanniezhang
扫一扫,用手机看新闻!
用微信扫描还可以
分享至好友和朋友圈
热门时尚资讯
Copyright & 1998 - 2017 Tencent. All Rights Reserved今天没事干,更新一下阿里的。倒序插入,放在最前面了。&br&另外,我把JD截图了,防止有人说我乱讲。&br&&br&-----------------&br&&br&来来来,我们上招聘网站实际找几个月薪超过2w的JD来看下。&br&&br&阿里巴巴&br&&img src=&/fac84da2cbc749_b.png& data-rawwidth=&1264& data-rawheight=&1016& class=&origin_image zh-lightbox-thumb& width=&1264& data-original=&/fac84da2cbc749_r.png&&&br&&br&分析:&br&1. “NIO”-&老老实实研究一下netty的源码和原理,保证他问不倒你;“类加载原理”-&老生常谈了,记得一个delegate,一个classloader如何造成内存泄漏就行;“动态代理、CGLIB”-&肯定是问你如何生成proxy类,两者有啥异同。找几篇博客来看看就行。另外,我估计很大程度是需要你结合spring来回答,因此还是看看spring的aop吧;“GC的原理”-&这个就厉害了,GC有好多种,到底是哪种的原理啊?但是以我身为一名老年程序猿来告诉你,好好看一下CMS GC和G1 GC就行。CMS答好了肯定是OK的,G1纯粹是锦上添花,给面试官留个追求技术的印象吧;“JVM内存模型”-&JVM怎么还有内存模型?是Java语言的内存模型吧?没什么好说的,看Java语言规范吧;“性能优化手段”-&胡侃吧,朝着怎么改进锁,怎么异步,怎么利用缓存,怎么选择合适的GC算法,怎么调整Hotspot VM的各generation比例,blabla(此处应有呕吐的表情,这种问题最烦了,你要是底气足,顶一句“具体问题具体分析”,我敬你是一条汉子)&br&2. “了解并发基础变成最优”-&看不懂,感觉是废话,不管。并发这种东西,好好看一下java.util.concurrent包里的类。&br&3. “具备开发实战技能,可以熟练使用Eclipse、Idea、熟悉常见的调试方法及技巧、ant/svn/maven,有疑难杂症的排查经验”-&工作一段时间都会吧?ant和svn完全不够酷,看得出来要么阿里的人比较守旧(或者懒),要么阿里的技术很老土。&br&4. blabla&br&&br&总结一下,阿里的要求总体比美团低,但是给的工资比美团高(&b&仅限这两个JD的比较!特地加粗&/b&)。那么问题来了,到底是美团装逼,高要求招人,低要求做事;还是阿里sb,低要求招人,高标准给工资?当然还有一个可能,就是贴这个JD的hr是sb。总的来说,能拿到美团的offer,肯定能拿到阿里的offer。因此优质骚年应该以美团的标准来要求自己(认真脸)。&br&&br&&br&美团&br&&img src=&/790cea726ab7e1ca046c2a40da47922a_b.png& data-rawwidth=&661& data-rawheight=&679& class=&origin_image zh-lightbox-thumb& width=&661& data-original=&/790cea726ab7e1ca046c2a40da47922a_r.png&&&br&分析:&br&1. 计算机专业基本功和写代码能力是废话,太主观。我们先放着,一会再回来review。&br&2. “熟练掌握 Java 及面向对象设计开发”=&工作一年以上;“对部分 Java 技术有深入研究”=&熟练IO的各种姿势,或者研究过Java内存模型,有此二者在手,面试官绝对对你刮目相看;“研究过优秀开源软件的源码并有心得”=&去Github找找几个star多的项目来看吧,推荐netty,不要多,一个就好。&br&3. “了解 SOA 架构理念、实现技术;熟悉常见设计模式”=&维基百科欢迎你,看看就行了;“熟练掌握 Spring、myBatis 等框架”=&过一遍源码吧&br&4. “熟练掌握 MySQL 应用开发、数据库原理和常用性能优化和扩展技术”=&买本mysql的书来看(认真脸);“NoSQL,Queue 的原理、使用场景以及限制”=&好好看看redis就行&br&5. “http 协议 搜索引擎”=&维基百科;“缓存”=&Google Guava cache,memcached,redis;“jvm 调优”=&掌握jvm参数(认真脸);“序列化”=&Google protocol buffer;“nio”=&netty;“RPC 调用框架”=&dubbo(垃圾)&br&6. &xxx优先&=&有最好,没有就算了&br&7. 美团应该不会2b到考逻辑题或者脑经急转弯,所以这里肯定是结合你做过的项目来说。一般都会问,1?项目架构,问什么选择这个不选择那个;2?碰到的最有挑战/最复杂/最blabla的问题是什么,怎么解决的&br&8. “高度的创业心和投入度”=&不一定要天天加班,但是碰到问题或者项目紧急的时候要加班,面试的时候要表现出这个态度,哈哈;“技术,业务,blabla”=&不能死关注技术,一定要结合业务来回答面试问题&br&&br&好了,再回到第一条,“计算机专业基本功和写代码能力”,我们可以综合一下(根据分析2~8),美团要求的&b&可以&/b&是一个:(注意“可以”,你这么做了“可以”获得美团面试官的肯定,假如面试官真的是根据这份JD来要求你的话)&br&1. 对Java语言本身,我们掌握一下内存模型,看一点并发相关的东西(java.util.concurrent包里的类都看一遍),找几篇博客看下weak/soft/phantom reference是什么意思就行啦;&br&2. 对于JVM,看看书,理解一下Hotspot的常见结构啊名词啊啥的,记几个重要的参数,足以应付面试官了;&br&3. 熟读netty源码;&br&4. 略读Spring源码,重点理解关键概念(AOP面试官很爱问的哦);&br&5. 在维基百科上过一过JD里提到的一些名词;&br&6. 买本mysql的书看看,高性能mysql那本书就很好;&br&7. redis或memcached哪个用的多就多看看相关博客。都没用过?建议你看redis&br&8. 好好包装一下你做过的最nb的项目,准备几个技术难点和解决方法,记住一定要结合业务哦。(什么?没有?没有不会编吗?怎么编?往分布式和高并发方向编会吗?不会?那你不适合互联网。)&br&9. 多工作几年!&br&&br&你看,也不是很难嘛。如果上面的几点你都做到了,还拿不到2w的美团高级JAVA开发工程师的offer,那美团肯定是冻结了headcount。&del&我认识的好多远远达不到上面需求的人都在美团呢。&/del&&br&&br&PS:面试官问你算法的话,一定要装作特别自信的说:“啊(第二声),算法?一般工作当中不需要自己手写算法吧?一方面是常用的算法,比如排序,查询,都有现成的代码来用;另一方面真需要手写算法的问题一般都是面向特定需求的问题,或者要求效率特别高的地方。这些地方可以结合真正的需求来做。”当然常见的算法的伪代码还是要会写的哦。如果面试官问你红黑树,哈哈,那赶紧跑路。不是谷歌脸书也不是面试算法程序猿的公司问你红黑树,这公司一定是在装逼(认真脸)。
今天没事干,更新一下阿里的。倒序插入,放在最前面了。 另外,我把JD截图了,防止有人说我乱讲。 ----------------- 来来来,我们上招聘网站实际找几个月薪超过2w的JD来看下。 阿里巴巴 分析: 1. “NIO”-&老老实实研究一下netty的源码…
先引用问题原文:&br&&blockquote&&u&栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义: &/u&&br&&u&int a = 3; &/u&&br&&u&int b = 3; &/u&&br&&u&编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。这时,如果再令a=4;那么编译器 会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。要注意这 种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。&/u&&/blockquote&呃,请问题主能提供原文链接不?结合上下文可以更好的判断这是啥状况。&br&总之上面引用的这段文字没有一点是对的。无论Java语言规范、JVM规范还是JVM的实现都没有这么做的。
先引用问题原文: 栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:
int a = 3;
int b = 3;
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指…
&p&详见&/p&&p&&a href=&///?target=http%3A///java-development-concern-those-things/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&使用Java开发高性能网站需要关注的那些事儿&i class=&icon-external&&&/i&&/a&&/p&&br&&p&&strong&JVM&/strong&&br&JEE容器中运行的JVM参数配置参数的正确使用直接关系到整个系统的性能和处理能力,JVM的调优主要是对内存管理方面的调优,优化的方向分为以下4点:&br&1.HeapSize
堆的大小,也可以说Java虚拟机使用内存的策略,这点是非常关键的。&br&2.GarbageCollector
通过配置相关的参数进行Java中的垃圾收集器的4个算法(策略)进行使用。&br&3.StackSize
栈是JVM的内存指令区,每个线程都有他自己的Stack,Stack的大小限制着线程的数量。&br&4.DeBug/Log
在JVM中还可以设置对JVM运行时的日志和JVM挂掉后的日志输出,这点非常的关键,根据各类JVM的日志输出才能配置合适的参数。&br&网上随处可见JVM的配置技巧,但是我还是推荐阅读Sun官方的2篇文章,可以对配置参数的其所依然有一个了解&br&1.Java HotSpot VM Options&br&&a href=&///?target=http%3A///technetwork/java/javase/tech/vmoptions-jsp-140102.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java HotSpot VM Options&i class=&icon-external&&&/i&&/a&&br&2.Troubleshooting Guide for Java SE 6 with HotSpot VM&a href=&///?target=http%3A///technetwork/java/javase/index-137495.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Troubleshooting Guide for Java SE 6 with HotSpot VM&i class=&icon-external&&&/i&&/a&&br&另外,我相信不是每个人攻城师都是天天对着这些JVM参数的,如果你忘记了那些关键的参数你可以输入Java -X(大写X)进行提示。&/p&&p&&strong&JDBC&/strong&&br&针对MySQL的JDBC的参数在之前的文章中也有介绍过,在单台机器或者集群的环境下合理的使用JDBC中的配置参数对操作数据库也有很大的影响。&br&一些所谓高性能的 Java ORM开源框架也就是打开了很多JDBC中的默认参数:&br&1.例如:autoReconnect、prepStmtCacheSize、cachePrepStmts、useNewIO、blobSendChunkSize 等,&br&2.例如集群环境下:roundRobinLoadBalance、failOverReadOnly、autoReconnectForPools、secondsBeforeRetryMaster。&br&具体内容可以参阅MySQL的JDBC官方使用手册:&br&&a href=&///?target=http%3A///doc/refman/5.1/zh/connectors.html%23cj-jdbc-reference& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/doc/refma&/span&&span class=&invisible&&n/5.1/zh/connectors.html#cj-jdbc-reference&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&&strong&数据库连接池(DataSource)&/strong&&br&应用程序与数据库连接频繁的交互会给系统带来瓶颈和大量的开销会影响到系统的性能,JDBC连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个连接,因此应用程序不需要频繁的与数据库开关连接,并且可以释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。&br&在此我认为有一点需要说明:&br&连接池的使用也是需要关闭,因为在数据库连接池启动的时候就预先和数据库获得了相应的连接,之后不再需要应用程序直接的和数据库打交道,因为应用程序使用数据库连接池是一个“借”的概念,应用程序从数据库连接池中获得资源是“借出”,还需要还回去,就好比有20个水桶放在这里,需要拿水的人都可以使用这些木桶从水池里面拿水,如果20个人都拿完水,不将水桶还回原地,那么后面来的人再需要拿水,只能在旁边等待有人将木桶还回去,之前的人用完后需要放回去,不然后面的人就会一直等待,造成资源堵塞,同理,应用程序获取数据库连接的时候Connection连接对象的时候是从“池”中分配一个数据库连接出去,在使用完毕后,归还这个数据库连接,这样才能保持数据库的连接“有借有还”准则。&br&参考资料:&br&&a href=&///?target=http%3A///doc/refman/5.1/zh/connectors.html%23cj-connection-pooling& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/doc/refma&/span&&span class=&invisible&&n/5.1/zh/connectors.html#cj-connection-pooling&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&&strong&数据存取&/strong&&br&数据库服务器的优化和数据的存取,什么类型的数据放在什么地方更好是值得去思考的问题,将来的存储很可能是混用的,Cache,NOSQL,DFS,DataBase 在一个系统中都会有,生活的餐具和平日里穿衣服需要摆放在家里,但是不会用同一种类型的家具存放,貌似没有那个人家把餐具和衣服放在同一个柜子里面的。这就像是系统中不同类型的数据一样,对不同类型的数据需要使用合适的存储环境。文件和图片的存储,首先按照访问的热度分类,或者按照文件的大小。强关系类型并且需要事务支持的采用传统的数据库,弱关系型不需要事务支持的可以考虑NOSQL,海量文件存储可以考虑一下支持网络存储的DFS,至于缓存要看你单个数据存储的大小和读写的比例。&br&还有一点值得注意就是数据读写分离,无论在DataBase还是NOSQL的环境中大部分都是读大于写,因此在设计时还需考虑 不仅仅需要让数据的读分散在多台机器上,还需要考虑多台机器之间的数据一致性,MySQL的一主多从,在加上MySQL-Proxy或者借用JDBC中的一些参数(roundRobinLoadBalance、failOverReadOnly、autoReconnectForPools、secondsBeforeRetryMaster)对后续应用程序开发,可以将读和写分离,将大量读的压力分散在多台机器上,并且还保证了数据的一致性。&/p&&p&&strong&缓存&/strong&&br&在宏观上看缓存一般分为2种:本地缓存和分布式缓存&br&1.本地缓存,对于Java的本地缓存而言就是讲数据放入静态(static)的数据结合中,然后需要用的时候就从静态数据结合中拿出来,对于高并发的环境建议使用 ConcurrentHashMap或者CopyOnWriteArrayList作为本地缓存。缓存的使用更具体点说就是对系统内存的使用,使用多少内存的资源需要有一个适当比例,如果超过适当的使用存储访问,将会适得其反,导致整个系统的运行效率低下。&br&2. 分布式缓存,一般用于分布式的环境,将每台机器上的缓存进行集中化的存储,并且不仅仅用于缓存的使用范畴,还可以作为分布式系统数据同步/传输的一种手段,一般被使用最多的就是Memcached和Redis。&br&数据存储在不同的介质上读/写得到的效率是不同的,在系统中如何善用缓存,让你的数据更靠近cpu,下面有一张图你需要永远牢记在心里,来自Google的技术大牛Jeff Dean(&a href=&///?target=http%3A///people/jeff/index.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Ref&i class=&icon-external&&&/i&&/a&)的杰作,如图所示:&br&&br&&strong&并发/多线程&/strong&&br&在高并发环境下建议开发者使用JDK中自带的并发包(java.util.concurrent),在JDK1.5以后使用java.util.concurrent下的工具类可以简化多线程开发,在java.util.concurrent的工具中主要分为以下几个主要部分:&br&1.线程池,线程池的接口(Executor、ExecutorService)与实现类(ThreadPoolExecutor、 ScheduledThreadPoolExecutor),利用jdk自带的线程池框架可以管理任务的排队和安排,并允许受控制的关闭。因为运行一个线程需要消耗系统CPU资源,而创建、结束一个线程也对系统CPU资源有开销,使用线程池不仅仅可以有效的管理多线程的使用,还是可以提高线程的运行效率。&br&2.本地队列,提供了高效的、可伸缩的、线程安全的非阻塞 FIFO 队列。java.util.concurrent 中的五个实现都支持扩展的 BlockingQueue 接口,该接口定义了 put 和 take 的阻塞版本:LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue、PriorityBlockingQueue 和 DelayQueue。这些不同的类覆盖了生产者-使用者、消息传递、并行任务执行和相关并发设计的大多数常见使用的上下文。&/p&&br&&br&&p&&b&详见&/b&&/p&&p&&a href=&///?target=http%3A///java-development-concern-those-things/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&使用Java开发高性能网站需要关注的那些事儿&i class=&icon-external&&&/i&&/a&&/p&
详见 JVM JEE容器中运行的JVM参数配置参数的正确使用直接关系到整个系统的性能和处理能力,JVM的调优主要是对内存管理方面的调优,优化的方向分为以下4点: 1.HeapSize 堆的大小,也可以说Java虚拟机使用内存的策…
补码本质是用来构成一个环,以实现一个同余运算。你可以认为所有定位长的加减乘除都是处于同余系情况下的:以32位整数为例,你取得的结果永远是2^32次方的余数,这与有无符号无关。&br&&br&你叫加法器算一个1+2,然而加法器其实做的是个同余加法,即&br&&img src=&///equation?tex=a%5Cequiv+1%5C%2C%28%5Cmod+%29%5C%5C%0Ab%5Cequiv+2%5C%2C%28%5Cmod+%29%5C%5C%0Ar%5Cequiv+a%2Bb%5Cequiv+3%5C%2C%28%5Cmod+%29& alt=&a\equiv 1\,(\mod )\\
b\equiv 2\,(\mod )\\
r\equiv a+b\equiv 3\,(\mod )& eeimg=&1&&&br&这样的作用是无论有符号还是无符号的运算,都可以共用同样的加法器(乘法器)。&br&&br&然后我们知道,的余数总共就种,分别是0~。但是我们希望表示一个负数,那怎么做呢?&br&&img src=&///equation?tex=%5Cequiv+-1%5C%2C+%28%5Cmod+%29%5Cequiv+%5C%2C+%28%5Cmod+%29& alt=&\equiv -1\, (\mod )\equiv \, (\mod )& eeimg=&1&&&br&于是乎就用来表示了。考虑到取值范围,以及为了方便区分,我们定义有一半的数是正数、一半的数是负数,恰恰就是二进制最高位为1则是负数,最高位为0则表示正数范围,这个就是补码的本质。至于补码的计算方法,也就是取反加1,完全是因为:&br&&img src=&///equation?tex=x%2B%5E%5Csim+x%5Cequiv+%5C%2C%28%5Cmod+%29& alt=&x+^\sim x\equiv \,(\mod )& eeimg=&1&&&br&这与『符号位』无关,它的逆运算,其实求解的是&br&&img src=&///equation?tex=x%2B%5E%5Csim+x+%2B1+%5Cequiv+0%5C%2C%28%5Cmod+%29%5C%5C%0A-x+%5Cequiv+%5E%5Csim+x%2B1%5C%2C%28%5Cmod+%29& alt=&x+^\sim x +1 \equiv 0\,(\mod )\\
-x \equiv ^\sim x+1\,(\mod )& eeimg=&1&&&br&所以说到底还是个同余数论的问题。&br&&br&所以你看,把x=0代入刚刚的同余方程,&br&&img src=&///equation?tex=-0%5Cequiv+%5E%5Csim+0%2B1%5Cequiv+%2B1%5Cequiv+0%5C%2C%28%5Cmod+%29& alt=&-0\equiv ^\sim 0+1\equiv +1\equiv 0\,(\mod )& eeimg=&1&&&br&完全成立。
补码本质是用来构成一个环,以实现一个同余运算。你可以认为所有定位长的加减乘除都是处于同余系情况下的:以32位整数为例,你取得的结果永远是2^32次方的余数,这与有无符号无关。 你叫加法器算一个1+2,然而加法器其实做的是个同余加法,即 a\equiv 1\,(\…
&b&出处不明:&/b&&br&JSP是Servlet的扩展,在没有JSP之前,就已经出现了Servlet技术。Servlet是利用输出流动态生成HTML页面,包括每一个HTML标签和每个在HTML页面中出现的内容。&br&&br&由于包括大量的HTML标签、大量的静态文本及格式等,导致Servlet的开发效率极为低下。所有的表现逻辑,包括布局、色彩及图像等,都必须耦合在Java代码中,这的确让人不胜其烦。&br&&br&JSP的出现弥补了这种不足,JSP通过在标准的HTML页面中插入Java代码,其静态的部分无须Java程序控制,只有那些需要从数据库读取并根据程序动态生成信息时,才使用Java脚本控制。&br&&br& 从表面上看,JSP页面已经不再需要Java类,似乎完全脱离了Java面向对象的特征。&br&事实上,JSP是Servlet的一种特殊形式,每个JSP页面就是一个Servlet实例——JSP页面由系统编译成Servlet,Servlet再负责响应用户请求。&br&&br&JSP其实也是Servlet的一种简化,使用JSP时,其实还是使用Servlet,因为Web应用中的每个JSP页面都会由Servlet容器生成对应的Servlet。对于Tomcat而言,JSP页面生成的Servlet放在work路径对应的Web应用下。&br&&br&看下面一个简单的JSP页面:&br&&div class=&highlight&&&pre&&code class=&language-text&&&!-- 表明此为一个JSP页面 --&
&%@ page contentType=&text/ charset=gb2312& language=&java& %&
&!DOCTYPE HTML PUBLIC &-//W3C//DTD HTML 4.0 Transitional//EN&&
&TITLE&第一个JSP页面&/TITLE&
&!-- 下面是Java脚本--&
&%for(int i = 0 ; i & 10; i++)
out.println(i);
&/code&&/pre&&/div&&p&当启动Tomcat之后,可以在Tomcat的Catalina/localhost/jsp/test/org/apache/jsp目录下找到如下文件(假如Web应用名为jsptest,上面JSP页的名为test1.jsp):test1_jsp.java和test1_jsp.class。&/p&&p&这两个文件都是Tomcat生成的,Tomcat根据JSP页面生成对应Servlet的Java文件及class文件。&/p&&p&下面是test1_jsp.java文件的源代码,这是一个特殊的Java类,是一个Servlet类:&/p&&p&//JSP页面经过Tomcat编译后默认的包(不同的servlet容器提供商生成的servlet文件是不同的)&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&package org.apache.
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
//继承HttpJspBase类,该类其实是个HttpServlet的子类(jasper是tomcat的jsp engine)
public final class test1_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent
private static java.util.Vector _jspx_
public java.util.List getDependants() {
return _jspx_
//用于响应用户的方法
public void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws java.io.IOException, ServletException
//built-in objects(variavles) are created here.
//获得页面输出流
JspFactory _jspxFactory =
PageContext pageContext =
HttpSession session =
ServletContext application =
ServletConfig config =
//获得页面输出流
JspWriter out = //not PrintWriter. JspWriter is buffered defautly.
Object page =
JspWriter _jspx_out =
PageContext _jspx_page_context =
//开始生成响应
_jspxFactory = JspFactory.getDefaultFactory();
//设置输出的页面格式
response.setContentType(&text/ charset=gb2312&);
pageContext = _jspxFactory.getPageContext(this, request,
response, null, true, 8192, true);
_jspx_page_context = pageC
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
//页面输出流
out = pageContext.getOut();
_jspx_out =
//输出流,开始输出页面文档
out.write(&rn&);
//下面输出HTML标签
out.write(&&!DOCTYPE HTML PUBLIC &-//W3C//DTD HTML 4.0
Transitional//EN&&rn&);
out.write(&&HTML&rn&);
out.write(&&HEAD&rn&);
out.write(&&TITLE&first Jsp&/TITLE&rn&);
out.write(&&/HEAD&rn&);
out.write(&&BODY&rn&);
//页面中的循环,在此处循环输出
for(int i = 0 ; i & 10; i++)
out.println(i);
out.write(&rn&);
out.write(&&br&rn&);
out.write(&rn&);
out.write(&&/BODY&rn&);
out.write(&&/HTML&rn&);
out.write(&rn&);
catch (Throwable t)
if (!(t instanceof SkipPageException))
out = _jspx_
if (out != null && out.getBufferSize() != 0)
out.clearBuffer();
if (_jspx_page_context != null) _jspx_page_context.handle
PageException(t);
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_
page_context);
&/code&&/pre&&/div&&br&&p&对比test1.jsp和test1_jsp.java文件,可得到一个结论:该JSP页面中的每个字符都由test1_jsp.java文件的输出流生成。&/p&&p&
根据上面的JSP页面工作原理图,可以得到如下四个结论:&/p&&p&
—&b& JSP文件必须在JSP服务器内运行。&/b&&/p&&p&
— &b&JSP文件必须生成Servlet才能执行。&/b&&/p&&p&
— &b&每个JSP页面的第一个访问者速度很慢,因为必须等待JSP编译成Servlet。&/b&&/p&&p&
— &b&JSP页面的访问者无须安装任何客户端,甚至不需要可以运行Java的运行环境,因为JSP页面输送到客户端的是标准HTML页面。&/b&&/p&&p&&br&
JSP和Servlet会有如下转换:&/p&&p&
-&b& JSP页面的静态内容、JSP脚本都会转换成Servlet的xxxService()方法,类似于自行创建Servlet时service()方法。&/b&&/p&&p&
- &b&JSP声明部分,转换成Servlet的成员部分。所有JSP声明部分可以使用private,protected,public,static等修饰符,其他地方则不行。&/b&&/p&&p&
- &b&JSP的输出表达式(&%= ..%&部分),输出表达式会转换成Servlet的xxxService()方法里的输出语句。&/b&&/p&&p&
- &b&九个内置对象要么是xxxService()方法的形参,要么是该方法的局部变量,所以九个内置对象只能在JSP脚本和输出表达式中使用。// 不能在jsp Declaration中使用&/b&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&TOMCAT_HOME&/conf/web.xml这个文件,里面有这样一段
&servlet-name&jsp&/servlet-name&
&servlet-class&org.apache.jasper.servlet.JspServlet&/servlet-class&
&init-param&
&param-name&fork&/param-name&
&param-value&false&/param-value&
&/init-param&
&init-param&
&param-name&xpoweredBy&/param-name&
&param-value&false&/param-value&
&/init-param&
&load-on-startup&3&/load-on-startup&
&/servlet&
&servlet-mapping&
&servlet-name&jsp&/servlet-name&
&url-pattern&*.jsp&/url-pattern&
&/servlet-mapping&
然后再去看看org.apache.jasper.servlet.JspServlet这个类,跟着就会看到org.apache.jasper.servlet.JspServletWrapper这个类jsaper包下的类就是解析JSP代码的类了
&/code&&/pre&&/div&&br&&br&&br&&br&&p&&b&---------------------------------------------------------------------------------------------------------------------------------&/b&&/p&&p&&b&有机会自己找一些例子来分析下&/b&&/p&
出处不明: JSP是Servlet的扩展,在没有JSP之前,就已经出现了Servlet技术。Servlet是利用输出流动态生成HTML页面,包括每一个HTML标签和每个在HTML页面中出现的内容。 由于包括大量的HTML标签、大量的静态文本及格式等,导致Servlet的开发效率极为低下。所…
直接看爬虫框架有时会很吃力,建议从简单的程序一步步入手,看到脚本之家有一个系列讲述的一个Java爬虫程序的设计,在此拿过来大家共同学习。&br&&div class=&highlight&&&pre&&code class=&language-text&&http://www.jb51.net/article/57193.htm
&/code&&/pre&&/div&&img src=&/aa3d3360fbb106b62f5a63_b.png& data-rawwidth=&665& data-rawheight=&401& class=&origin_image zh-lightbox-thumb& width=&665& data-original=&/aa3d3360fbb106b62f5a63_r.png&&首先以百度首页为例通过http get的方式获取百度首页的内容&br&&div class=&highlight&&&pre&&code class=&language-text&&import java.io.BufferedR
import java.io.InputStreamR
import java.net.URL;
import java.net.URLC
public class Main
public static void main(String[] args)
// 定义即将访问的链接
String url = &&;
// 定义一个字符串用来存储网页内容
String result = &&;
// 定义一个缓冲字符输入流
BufferedReader in =
// 将string转成url对象
URL realUrl = new URL(url);
// 初始化一个链接到那个url的连接
URLConnection connection = realUrl.openConnection();
// 开始实际的连接
connection.connect();
// 初始化 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
// 用来临时存储抓取到的每一行的数据
while ((line = in.readLine()) != null)
// 遍历抓取到的每一行并将其存储到result里面
result += line + &\n&;
} catch (Exception e)
System.out.println(&发送GET请求出现异常!& + e);
e.printStackTrace();
} // 使用finally来关闭输入流
if (in != null)
in.close();
} catch (Exception e2)
e2.printStackTrace();
System.out.println(result);
&/code&&/pre&&/div&&img src=&/e5d5bda4fa031ccc1e3ec0_b.png& data-rawwidth=&1030& data-rawheight=&458& class=&origin_image zh-lightbox-thumb& width=&1030& data-original=&/e5d5bda4fa031ccc1e3ec0_r.png&&&p&没错,就是这一坨翔一样的东西。这就是百度页面的源代码。&/p&&p&&b&临时需求:&/b&&/p&&p&获取百度Logo的大熊爪子的图片链接。&/p&&br&&p&一.封装get方法&/p&&div class=&highlight&&&pre&&code class=&language-text&&import java.io.BufferedR
import java.io.InputStreamR
import java.net.URL;
import java.net.URLC
public class Main
static String sendGet(String url)
{ // 定义一个字符串用来存储网页内容
String result = &&;
// 定义一个缓冲字符输入流
BufferedReader in =
// 将string转成url对象
URL realUrl = new URL(url);
// 初始化一个链接到那个url的连接
URLConnection connection = realUrl.openConnection();
// 开始实际的连接
connection.connect();
// 初始化 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
// 用来临时存储抓取到的每一行的数据
while ((line = in.readLine()) != null)
// 遍历抓取到的每一行并将其存储到result里面
} catch (Exception e)
System.out.println(&发送GET请求出现异常!& + e);
e.printStackTrace();
} // 使用finally来关闭输入流
if (in != null)
in.close();
} catch (Exception e2)
e2.printStackTrace();
public static void main(String[] args)
// 定义即将访问的链接
String url = &&;
// 访问链接并获取页面内容
String result = sendGet(url);
System.out.println(result);
&/code&&/pre&&/div&&p&这样看起来稍微整洁了一点,请原谅我这个强迫症。&/p&&p&接下来的任务,就是从获取到的一大堆东西里面找到那个图片的链接。&/p&&p&我们首先可以想到的方法,是对页面源码的字符串result使用indexof函数进行String的子串搜索。&/p&&p&没错这个方法是可以慢慢解决这个问题,比如直接indexOf(&src&)找到开始的序号,然后再稀里哗啦的搞到结束的序号。&/p&&p&不过我们不能一直使用这种方法,毕竟草鞋只适合出门走走,后期还是需要切假腿来拿人头的。&/p&&p&请原谅我的乱入,继续。&br&&/p&&p&那么我们用什么方式来寻找这张图片的src呢?&/p&&p&没错,正如下面观众所说,正则匹配。&/p&&p&如果有同学不太清楚正则,可以参照这篇文章:[Python]网络爬虫(七):Python中的正则表达式教程。&/p&&p&简单来说,正则就像是匹配。&/p&&p&比如三个胖子站在这里,分别穿着红衣服,蓝衣服,绿衣服。&/p&&p&正则就是:抓住那个穿绿衣服的!&/p&&p&然后把绿胖子单独抓了出来。&/p&&p&就是这么简单。&/p&&p&但是正则的语法却还是博大精深的,刚接触的时候难免有点摸不着头脑,&/p&&p&向大家推荐一个正则的在线测试工具:正则表达式在线测试。&br&&/p&&p&有了正则这个神兵利器,那么怎么在java里面使用正则呢?&/p&&p&先来看个简单的小李子吧。&/p&&p&啊错了,小栗子。&/p&&div class=&highlight&&&pre&&code class=&language-text&&// 定义一个样式模板,此中使用正则表达式,括号中是要抓的内容
// 相当于埋好了陷阱匹配的地方就会掉下去
Pattern pattern = pile(&href=\&(.+?)\&&);
// 定义一个matcher用来做匹配
Matcher matcher = pattern.matcher(&<a href=\&index.html\&>我的主页</a>&);
// 如果找到了
if (matcher.find()) {
// 打印出结果
System.out.println(matcher.group(1));
&/code&&/pre&&/div&&p&运行结果:&/p&&p&&strong&index.html&/strong&&br&&/p&&p&没错,这就是我们的第一个正则代码。&/p&&p&这样应用的抓取图片的链接想必也是信手拈来了。&/p&&p&我们将正则匹配封装成一个函数,然后将代码作如下修改:&/p&&div class=&highlight&&&pre&&code class=&language-text&&import java.io.BufferedR
import java.io.InputStreamR
import java.net.URL;
import java.net.URLC
import java.util.regex.M
import java.util.regex.P
public class Main
static String SendGet(String url)
// 定义一个字符串用来存储网页内容
String result = &&;
// 定义一个缓冲字符输入流
BufferedReader in =
// 将string转成url对象
URL realUrl = new URL(url);
// 初始化一个链接到那个url的连接
URLConnection connection = realUrl.openConnection();
// 开始实际的连接
connection.connect();
// 初始化 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
// 用来临时存储抓取到的每一行的数据
while ((line = in.readLine()) != null)
// 遍历抓取到的每一行并将其存储到result里面
} catch (Exception e)
System.out.println(&发送GET请求出现异常!& + e);
e.printStackTrace();
// 使用finally来关闭输入流
if (in != null)
in.close();
} catch (Exception e2)
e2.printStackTrace();
static String RegexString(String targetStr, String patternStr)
// 定义一个样式模板,此中使用正则表达式,括号中是要抓的内容 // 相当于埋好了陷阱匹配的地方就会掉下去
Pattern pattern = pile(patternStr);
// 定义一个matcher用来做匹配
Matcher matcher = pattern.matcher(targetStr);
// 如果找到了
if (matcher.find())
// 打印出结果
return matcher.group(1);
return &&;
public static void main(String[] args)
// 定义即将访问的链接
String url = &&;
// 访问链接并获取页面内容
String result = SendGet(url);
// // 使用正则匹配图片的src内容
String imgSrc = RegexString(result, &即将的正则语法&); //
// 打印结果
System.out.println(imgSrc);
&/code&&/pre&&/div&&p&好的,现在万事俱备,只差一个正则语法了!&/p&&p&那么用什么正则语句比较合适呢?&/p&&p&我们发现只要抓住了src=&xxxxxx&这个字符串,就能抓出整个src链接,&/p&&p&所以简单的正则语句:src=\&(.+?)\&&/p&&p&完整代码如下:&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&import java.io.BufferedR
import java.io.InputStreamR
import java.net.URL;
import java.net.URLC
import java.util.regex.M
import java.util.regex.P
public class Main
static String SendGet(String url)
// 定义一个字符串用来存储网页内容
String result = &&;
// 定义一个缓冲字符输入流
BufferedReader in =
// 将string转成url对象
URL realUrl = new URL(url);
// 初始化一个链接到那个url的连接
URLConnection connection = realUrl.openConnection();
// 开始实际的连接
connection.connect();
// 初始化 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
// 用来临时存储抓取到的每一行的数据
while ((line = in.readLine()) != null)
// 遍历抓取到的每一行并将其存储到result里面
} catch (Exception e)
System.out.println(&发送GET请求出现异常!& + e);
e.printStackTrace();
// 使用finally来关闭输入流
if (in != null)
in.close();
} catch (Exception e2)
e2.printStackTrace();
static String RegexString(String targetStr, String patternStr)
// 定义一个样式模板,此中使用正则表达式,括号中是要抓的内容
// 相当于埋好了陷阱匹配的地方就会掉下去
Pattern pattern = pile(patternStr);
// 定义一个matcher用来做匹配
Matcher matcher = pattern.matcher(targetStr);
// 如果找到了
if (matcher.find())
// 打印出结果
return matcher.group(1);
return &Nothing&;
public static void main(String[] args)
// 定义即将访问的链接
String url = &&;
// 访问链接并获取页面内容
String result = SendGet(url);
// 使用正则匹配图片的src内容
String imgSrc = RegexString(result, &src=\&(.+?)\&&);
// 打印结果
System.out.println(imgSrc);
&/code&&/pre&&/div&&p&作者风趣,代码也挺规范,值得学习,后续的就不粘贴了,大家慢慢看&/p&
直接看爬虫框架有时会很吃力,建议从简单的程序一步步入手,看到脚本之家有一个系列讲述的一个Java爬虫程序的设计,在此拿过来大家共同学习。 http://www.jb51.net/article/57193.htm首先以百度首页为例通过http get的方式获取百度首页的内容 import java.i…
泻药。踌躇很久要不要答…月经问题其实颇难回答得一了百了。&br&还是照例搬运一下JVM规范吧…&br&&br&堆是堆(heap),栈是栈(stack),堆栈是栈。嗯我很不喜欢“堆栈”这种叫法,容易让新人掉坑里。&br&&br&关于栈:&a href=&/question//answer/& class=&internal&&为什么函数调用要用栈实现? - RednaxelaFX 的回答&/a&&br&&a href=&/question//answer/& class=&internal&&这段代码有没有正确释放堆栈空间? - RednaxelaFX 的回答&/a&&br&&br&JVM规范让每个Java线程拥有自己的独立的JVM栈,也就是Java方法的调用栈。&a href=&///?target=https%3A///javase/specs/jvms/se8/html/jvms-2.html%23jvms-2.5.2& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Chapter 2. The Structure of the Java Virtual Machine&i class=&icon-external&&&/i&&/a&&br&&blockquote&Each Java Virtual Machine thread has a private Java Virtual Machine stack, created at the same time as the thread. A Java Virtual Machine stack stores frames (§2.6). A Java Virtual Machine stack is analogous to the stack of a conventional language such as C: it holds local variables and partial results, and plays a part in method invocation and return. Because the Java Virtual Machine stack is never manipulated directly except to push and pop frames, frames may be heap allocated. The memory for a Java Virtual Machine stack does not need to be contiguous.&/blockquote&同时JVM规范为了允许native代码可以调用Java代码,以及允许Java代码调用native方法,还规定每个Java线程拥有自己的独立的native方法栈。&a href=&///?target=https%3A///javase/specs/jvms/se8/html/jvms-2.html%23jvms-2.5.6& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Chapter 2. The Structure of the Java Virtual Machine&i class=&icon-external&&&/i&&/a&&br&&blockquote&An implementation of the Java Virtual Machine may use conventional stacks, colloquially called &C stacks,& to support native methods (methods written in a language other than the Java programming language). Native method stacks may also be used by the implementation of an interpreter for the Java Virtual Machine's instruction set in a language such as C. Java Virtual Machine implementations that cannot load native methods and that do not themselves rely on conventional stacks need not supply native method stacks. If supplied, native method stacks are typically allocated per thread when each thread is created.&/blockquote&&br&这俩都是JVM规范所规定的概念上的东西,并不是说具体的JVM实现真的要给每个Java线程开两个独立的栈。以Oracle JDK / OpenJDK的HotSpot VM为例,它使用所谓的“mixed stack”——在同一个调用栈里存放Java方法的栈帧与native方法的栈帧,所以每个Java线程其实只有一个调用栈,融合了JVM规范的JVM栈与native方法栈这俩概念。&br&&br&JVM里的“堆”(heap)特指用于存放Java对象的内存区域。所以根据这个定义,Java对象全部都在堆上。&a href=&///?target=https%3A///javase/specs/jvms/se8/html/jvms-2.html%23jvms-2.5.3& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Chapter 2. The Structure of the Java Virtual Machine&i class=&icon-external&&&/i&&/a&&br&&blockquote&The Java Virtual Machine has a heap that is shared among all Java Virtual Machine threads. The heap is the run-time data area from which memory for all class instances and arrays is allocated.&br&&br&The heap is created on virtual machine start-up. Heap storage for objects is reclaimed by an automatic storage management system (known as a garbage collector); objects are never explicitly deallocated. The Java Virtual Machine assumes no particular type of automatic storage management system, and the storage management technique may be chosen according to the implementor's system requirements. The heap may be of a fixed size or may be expanded as required by the computation and may be contracted if a larger heap becomes unnecessary. The memory for the heap does not need to be contiguous.&/blockquote&&br&要注意,这个“堆”并不是数据结构意义上的堆(&a href=&///?target=https%3A//en.wikipedia.org/wiki/Heap_%28data_structure%29& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Heap (data structure)&i class=&icon-external&&&/i&&/a&,一种有序的树),而是动态内存分配意义上的堆——用于管理动态生命周期的内存区域。&br&&br&JVM的堆被同一个JVM实例中的所有Java线程共享。它通常由某种自动内存管理机制所管理,这种机制通常叫做“垃圾回收”(garbage collection,GC)。JVM规范并不强制要求JVM实现采用哪种GC算法。&br&&br&顺带放个传送门:&a href=&/question//answer/& class=&internal&&垃圾回收机制中,引用计数法是如何维护所有对象引用的? - RednaxelaFX 的回答&/a&(请不要被问题的标题误导)&br&&br&至于上面这些概念如何映射到实际的JVM的内存,还可以跳另一个传送门:&a href=&/question//answer/& class=&internal&&老师说字符串常量和静态变量放在data segment中,问一下这里的data segment和常量池是一回事吗? - RednaxelaFX 的回答&/a&
泻药。踌躇很久要不要答…月经问题其实颇难回答得一了百了。 还是照例搬运一下JVM规范吧… 堆是堆(heap),栈是栈(stack),堆栈是栈。嗯我很不喜欢“堆栈”这种叫法,容易让新人掉坑里。 关于栈:
&p&【本人性格不好,被惹到了必然句句带脏字,所以评论中如果有不开眼的,请慎重。另外,这篇回答从头到尾都是我自己的个人偏见,绝对不客观,也绝对不会为本答案负责。所以,有自己正常思维的请不要再看下去了。最后,这篇文章在最后会指向硬广,来佐证文中实例,因此,不喜欢有广告的可以直接举报了,顺手推荐一下修真院的专栏,各种IT行业的真实小故事。&a href=&/jnshu& class=&internal&&IT修真院 - 知乎专栏&/a&】&/p&&p&&br&&/p&&p&&br&&/p&&p&Live已开通~想听Live的可以点这里&/p&&p&&a href=&/lives/107520& class=&internal&&知乎 Live - 全新的实时问答&/a&&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&互联网行业的薪资水准相对较高,刚入行一个月,半年,或者一年超过其他行业薪资很正常。
那么,互联网行业究竟有哪些职位呢,又分别适合哪些传统行业转型?&/p&&p&1.产品
5.后端(Java/php/python)
6.DBA(mysql/oracle)
7.运维(OP)
8.测试(QA)
9.算法(分类/聚类/关系抽取/实体识别)
10.搜索(Lucene/Solr/elasticSearch)
11.大数据工程师(Hadoop)
12.Android
14.运营&/p&&p&&br&&/p&&p&&br&&/p&&p&然后等下我会分别介绍每个职业的工作内容,发展前景,入门门槛,适合哪些职业转行,成长周期,薪水范围等。&/p&&p&* 薪水都以北京为例
* 运营和市场都有更细致的划分,然而我并不太了解了
* 其他的偏门的&/p&&p&&br&&/p&&p&一.产品
========我是求某个姑娘快原谅我的的分割线=============&/p&&p&&br&&/p&&p&&br&&/p&&p&1 工作内容:了解用户需求,做竞品调研,画产品原型,写产品文档,讲解产品需求,测试产品Bug,收集用户反馈,苦练金刚罩以防止程序员拿刀砍。&/p&&p&2 需要技能:PPT,Word, Axure,XP,MVP,行业知识,沟通&/p&&p&&br&&/p&&p&
PPT是最容易被忽视的技能,很多时候很多人都把产品经理=画原型,如果你这么想,再做五年的产品经理也是一个画原型的。我在修真院的时候,给修真院的弟子讲过很多次,产品经理更多的是理解一个行业,熟悉这个行业的用户,知道这个行业有哪些没有满足的需求,寻找解决方案,对比行业,找到自己的切入点,最终落地成:哪些功能要做,哪些功能不要做。&/p&&p&
这些都是要在PPT里写清楚的。所以,PPT并不是简简单单的一个工具,而且是用这个工具把你对这个行业的了解和分析和解决方案展示出来。&/p&&p&
XP是敏捷开发,不会敏捷开发的产品经理很难说会是一个好的产品经理(我很偏激,所以接受不了可以直接无视)。敏捷开发对于产品经理来讲,是逼着产品经理去用Story的方式去思考,去考虑自己每一个Story的价值是什么,所有的Story优先级是什么。&/p&&p&
MVP是最小化验证产品的缩写,这在精益创业里是很重要的概念。也就是说,你臆想了一个产品,他有了什么样的功能,但是!请注意,我们认为所有没有经过用户验证的功能都是在扯淡。所以,你其实是设计了一个扯淡的功能然后交给一堆人去开发,再交给人去运营,直到一个月或者是三个月以后才能拿到反馈结果。我们等不了,所以你必须在程序员开始启动之前,先想办法验证自己要解决的问题是存在的,要解决的需要是用户确实需要的---你有无数的办法可以这么做,真的。好比是,我做IT修真院,并没有先直接做线上的网站,而是直接去贴吧发贴,用QQ群,在论坛直接做,去观察这些弟子的行为,然后去修正自己的产品设计,我发现了他们需要日报,需要点评,需要有班级的概念,需要有学号,需要有首席大弟子等等等等这些。然后我会把这些需要分析整理之后加入到网站的设计里去,这就是MVP的价值--当年穷疯了每个决策都慎重的时候,就会特别喜欢这种方式,土豪除外,只会浪费时间而已。&/p&&p&Word是产品需求文档,我自己不太喜欢Word文档,更喜欢XP的Story,不过会一点也没有关系。&/p&&p&行业知识是产品经理最重要最重要的技能,没有之一,你可以不懂PPT,不会Axure,不会Word,也不会什么XP和MVP,但是绝对不能不懂一个行业。某种程度上来讲,产品经理拥有的其实是快速了解一个行业的能力。现在的互联网已经和以前的不一样了。以前的产品经理懂点儿交互,知道什么是表单,知道点IT术语就能混日子了,现在必须要懂一个行业,地产,金融,汽车,教育,餐饮,医疗等等各种行业,你都需要了解这个行业的模式,如果你不懂,你就是一个画原型的人。&/p&&p&沟通也是产品经理的必备技能,出门不带沟通技能,一定会被程序员砍。一方面是要跟用户沟通,一方面是要跟程序员沟通(这是世界上最难沟通的物种,没有之一),一方面要跟领导沟通(其实就是想办法拍领导马屁然后哄着他们听自己的话)。&/p&&p&&br&&/p&&p&&br&&/p&&p&3 发展前景&/p&&p&不用说,产品经理绝对是一个炙手可热的职业,而且,TNND的几乎是零门槛,这表示,是个人都可以说,我想成为一个产品经理。
然而,好的产品经理很多么?并不多,所以,好像围棋一样的,入门容易,学精难。&/p&&p&而且,似乎并没有一个系统的教程(这真是一个很难让人相信的事情啊,这么一种职业,没有大学的知识培养,甚至都很少有标准化的职业化培训,全靠业界手把手培养和自发的交流,就能够拿着无数DS程序员根本就想像不到的薪水--产品经理真的跟DS有点儿不搭边的,当然,我大修真还是在努力做产品人员的培养的)。&/p&&p&产品经理的发展前景是很赞的,只是越来越体系化了,而且很容易出人头地。&/p&&p&一般来说:&/p&&p&0~6个月:4K~8K
6~12个月:6K~12K
1年~3年:10K~24K
3年~5年:20K~40K
:30K~&/p&&p&三个月到半年左右就可以算是迈入这个行业啦,如果遇到P2P这种对于专业属性要求比较高的,随便在一家公司混点经验,跳到另外一家新的公司就是一个产品总监:因为并没有其他人又了解金融又了解互联网。&/p&&p&&br&&/p&&p&&br&&/p&&p&成长路径:&/p&&p&产品助理-产品经理-高级产品经理-产品总监-CEO&/p&&p&&br&&/p&&p&大致这个样子。&/p&&p&&br&&/p&&p&&br&&/p&&p&4.入门门槛&/p&&p&无(甚至你可以不认识字)&/p&&p&&br&&/p&&p&5.哪些行业适合做产品经理&/p&&p&IT界:程序员,UI,QA,运营,市场
其他界:无限制&/p&&p&PS:想了想,还真是没见过身边有做运维的转产品经理的。&/p&&p&&br&&/p&&p&6.职业限制&/p&&p&很多产品经理都很怕跟程序员沟通。而且经常会苦恼,觉得自己设计的功能,程序员做不了,做不出来,做的太慢,做的太差。惟独不会觉得自己设计的太烂。&/p&&p&所以,很多产品经理都会认为不同技术是自己的一个弱项,我曾经整理过一个产品经理需要了解的技术术语,有需要直接看楼下的广告。&/p&&p&&br&&/p&&p&7.去哪里学,怎么成长&/p&&p&还用问,自然是跟着大修真院最好。
如果IT修真院你看不上,可以去一些有产品经理培训的地方去,虽然我肯定觉得自家的好。
如果这些产品经理培训的差不多了,有了一个基本概念了,找个产品助理或者是实习的职位去吧。&/p&&p&会画点儿原型图,有个线上的作品,就能找工作(虽然我很不喜欢这样的产品经理)。
然后有机会就去大公司了解一下各个部门是如何扯皮的,镀镀金,Over了。&/p&&p&&br&&/p&&p&二
=============我是累死了的分割线================================
马丹,首先写软文,又要写成干货,又要带广告真心不是一件容易的事儿。我在之前&a href=&/question//answer/?group_id=064576WEB& class=&internal&&如何在一个月之内从零基础成为初级CSS前端开发工程师? - xdyl 的回答&/a& 的贴子中,写了整整一个星期才写出来。我写小说都是分分钟好么。&/p&&p&可是没办法。一个是确实需要跟大家介绍一下每个职业的比较和特点,一个是也确实需要告诉更多的人,写代码真的不是看视频看会的。&/p&&p&好了我接着说。&/p&&p&1 工作内容:收到产品原型,给原型上色,偶尔会自作主张调整下原型的位置,出不同的风格给老板和客户选,然后听他们的意见给出一个自己极不喜欢的风格,最好给Android,IOS或者是CSS做好标注,还有的需要直接帮他们切好图,最后要练出来象素眼,看看这些不靠谱的程序员们有没有上错色或者是有偏差。&/p&&p&&br&&/p&&p&2 需要技能:PS,Illustrator,Sketch,耐性,找素材&/p&&p&PS是最基础的技能。各种图层通道蒙版神马的细节的东西就不用说了,很多时候很多公司都愿意出所谓的高保真图。什么叫高保真图,简单说就是不折磨产品折磨UI的破玩意儿。就是把所有的图都画出来然后对着UI图来改,偶尔还会要求做出来网页能够点,对于这点我不想再吐槽了,总之,PS是少不了的技能,基本上很多时候其他人都会以为你只需要用PS就能搞定一切。&/p&&p&然而PS始终只是一个工具而已,所以在这里,PS代表的更多的是一种方案的选择。比如什么行业用什么配色,怎么样对齐,怎么突出重点,PC下应该是多宽,手机应该是多宽,等等等等。&/p&&p&ILLustrator最近似乎是用的少了,我不太确定,但是做矢量图以前是就是靠他的。什么是位图什么是矢量图,自行百度就好。以及还有CoreDraw,不知道现在是否常用。然而,慢慢的似乎Sketch流行起来了。&/p&&p&SKetch和Illustrator和CoreDraw之间的差别我说不上来,我记得我的UI小姑娘跟我讲这个工具很好用。&/p&&p&&br&&/p&&p&耐性必须是UI必备的技能,因为有的时候,老板跟你较真起来,一个星期不停的反复修改一个首页是很正常的事儿。可能颜色要从红换成黑再换成绿。所以你必须要有耐性,除非你做的设计没人管,你说了算。而且,UI这东西,是个人都有自己的审美观。更不用说之前朋友圈的测试,人和人看到的颜色真心不一样。
所以你必须要有耐性,这是很重要的。&/p&&p&找素材的能力也是必不可少的,你手上必须要备几个常用的素材网站,大部分的人都是在别人的素材基础上改来改去。&/p&&p&&br&&/p&&p&说到这里,其实忍不住想加上一句。UI设计师最重要的能力并非是以上几种,而在于是理解产品经理的需求--前提条件是产品经理很明确的说出来了而且讲清楚了需求。&/p&&p&比如说,一个页面的重要是什么?最想引人注目的内容是什么?应该配什么样的图?加上什么样的元素能让网站的风格更醒目一些呢?&/p&&p&这里大部分其实都是原型设计师要做的事儿,我一直有一个观点,就是UI其实最应该做原型,只有这样,才能让产品经理着重去考虑功能点,让设计完美传达产品的功能点。
然而原型设计师这个角色慢慢的被消融了,已经变成了产品经理了。所以大部分产品经理都以为自己是画原型的,然后大部分UI都会自作主张改掉原型,因为没有美感。所以通常你会发现美感说有了,也有那么一点儿,可是总觉得会有一些不对。&/p&&p&我对他们的要求就是,先别管美不美,你先告诉我这张页面每个模块想要重点表达的内容是什么,能不能让人分清主次。做到了这一点 ,再去考虑美感。&/p&&p&&br&&/p&&p&&br&&/p&&p&3 发展前景&/p&&p&UI的发展前景是很赞的,在两到三年前,甚至都有人推动让UI来代替产品经理来驱动。某种程度上来说,UI其实最好的发展方向就是UE,也就是交互,然后就是所谓的用户体验优化师--坦白的说我并未觉得有多少公司会真正的设置这个职位,因为太泛了。但是对于现在火热的O2O来说,无论是线上还是线下,都希望提供一个极致的用户体验,所以我说不好。&/p&&p&但是大部分的UI都应该去朝着交互的方向发展,而不是去切页面。。。&/p&&p&&br&&/p&&p&UI薪水其实跟产品经理在前期差不太多,中期差点。后期相差比较远,一般来说:&/p&&p&0~6个月:4K~8K
6~12个月:6K~12K
1年~3年:10K~20K
3年~5年:16K~30K
5年~ :24K~&/p&&p&UI的成长时间大概是在两年左右,基本上PC,IOS,Android,H5全部都做过一些项目,设计过几个Logo,做过一些专题和Banner图,才算是比较完美报。&/p&&p&然而想要做的更好一些就有点困难了,除非你的遇到了一家公司,对用户体验要求极致,然而那个时候,并不仅仅是UI和UE相关的内容了。&/p&&p&&br&&/p&&p&&br&&/p&&p&成长路径:&/p&&p&实习UI-初级U-中级UI-高级UI(UE)&/p&&p&&br&&/p&&p&大致这个样子。&/p&&p&&br&&/p&&p&&br&&/p&&p&4.入门门槛&/p&&p&UI对入门门槛要求还算是比较高的。首先你得有一台Mac。。大部分的情况下你都需要Mac。
然后你要懂之前提到的常用软件,UI的交互规范,配色等等等。&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&5.哪些行业适合做UI&/p&&p&IT界:无
其他界:传统做VI的,就是平面设计的会转一些。跟着基本上就是小鲜肉了,刚毕业就从事这个行业的会比较多一些。还有一些学美术的,会手绘的。&/p&&p&PS:想了想,从没怎么见过程序员转行做UI的。只见过UI人员会写代码的。&/p&&p&&br&&/p&&p&6.职业限制&/p&&p&UI这个职业的限制在某种程度上就是不太清楚自己应该朝着UE发展。所以时间长了工作就会变得单调,两年或者是三年之后原地踏步走没怎么有进步的人很多。像Metro(扁平化)或者是material design这样的风格一不熟悉二不了解三不想尝试的人还是挺多的。&/p&&p&很多人做了很久其实还是分不清产品经理想要在一个页面上表达什么--这有时候真的并不是UI的错。&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&7.去哪里学,怎么成长&/p&&p&对于初学者来说,找个培训学校还真是比较好的选择。
我大修真院暂时并未打算去培养UI人员,主要是没有时间也没有精力去做一个系统的教程,而且我们自己在UI上也在不断的摸索。
一般来说,最好的成长路线就是不断的去参考别人的例子,然后再多动动脑子,多看一些UI规范。&/p&&p&先想清楚自己要表达什么,然后想想用什么表达,再去查查怎么样能做到自己期望的结果。&/p&&p&&br&&/p&&p&&br&&/p&&p&三 CSS
=============我是再也不要写软文的分割线================================&/p&&p&没办法。自己拉的屎不能拉个开头就提裤子走。。。说起来这也是知乎挺好玩的地方,如果不是知乎允许这种自问自答的方式,只要你说的是真正有价值的内容,并不拒绝你有做广告的嫌疑,恐怕我也不会写这些东西,你们也看不到这个贴子。&/p&&p&以下的内容是我从UI那边粘过来的,还没改呢,等我去沙发上喘口气歇会再写。中午吃的麻辣香锅有点咸。&/p&&p&&br&&/p&&p&&br&&/p&&p&1 工作内容:产品设计好原型,UI做出来了效果图,剩下的就是CSS工程师用代码把静态文件写出来的。&/p&&p&所以CSS工程师和OP一样,都是可以在不用了解业务需求的情况下就能完成工作的唯一两个特殊职业。
一般来说,CSS工程师并不存在,写CSS的人多少要写一些JS代码,然而确实也会有一些妹子真的就是学不会JS,有一些汉子真的就是写不出来JS,所以我还是把他们两个拆开了。&/p&&p&CSS工程师要考虑更多的就是兼容性,简单说,IE内核和非IE内核(WEBKit),IE10以下和其他。我是强烈建议新人不要去学IE10以下的Hack的写法的,让IE10以下的,不支持Html5的都去死吧,表再来跟我说用户还在用IE678了。&/p&&p&当页面切完以后,另一个工作就是去帮助菜鸟后端和某些JSER把页面又重新套错了,什么是套页面,可以看这个 &a href=&/people/ptteng/answers& class=&internal&&/question//answer/&/a& 。&/p&&p&&br&&/p&&p&&br&&/p&&p&2 需要技能:
环境【IDE(WEBStorm,Sublime,EditPlus),源码管理(SVN/Git) ,WEB服务器(nginx)】
基础【PS,域名,Html,Html5,CSS,CSS3】
扩展【自适应,响应式,Bootstrap,Less,Flex】&/p&&p&&br&&/p&&p&无论是哪一种程序员,学会搭好的自己的环境都是第一步。选好IDE,选好源码管理工具,学会每天把自己做好的Html文件发布到服务器上可以直接访问。这都是最基础的技能,记着这些东西并不难,你只是需要不断的去练习去熟悉它而已。所以从第一开始就去适应它。&/p&&p&&br&&/p&&p&会用PS是因为一是要切图,二是要制作雪碧图。这儿简单说一下,很多人都会说,切图这个活倒底分给UI还是分给前端。我一直都觉得这是CSS必须要做的,因为只有CSSER才会知道怎么切合适。然而大部分Android和IOS人员都不具备切图的能力,这也是我一直很无语的工作方式,反正,我要求我的Team,无论是Android还是IOS都必须要会自己切图。&/p&&p&另外再解释一下所谓切图和切页面的概念。切图指的是把需要用到的小图标了神马的切出来。切页面一般指的是就是把整个效果图做成Html网页。两种叫法我都觉得Low的不行,然而很多人都喜欢这么叫,而且会混到一起,时间长了,也就习惯了。&/p&&p&&br&&/p&&p&自适应和响应式是前端人员必须要懂的概念,也是必须要能做到的。毕竟现在是各种跨屏时代,以及各种分辨率都层出不穷,H5又是眼下最火红的职业和技能。&/p&&p&曾经有过工作半年或者是一年都不太懂什么是自适应和响应式的,这并不好。&/p&&p&Bootstrap,Less和Flex也是CSS工程师必须要会的。学会Bootstrap更重要的还是要去学习它的思想,这是很重要的一点,它帮助你开阔视野,你才会明白,靠,原来可以这么写。&/p&&p&Less也是一样,在推荐less和Sass之前我犹豫了很久,然而看到Sass要Ruby环境就有点不喜欢了,虽然Bootstrap已经转向Sass,但是在一般的项目中,Less也够用了。所以还是果断的推荐Less了。&/p&&p&Flex是一个好东西,我了解的还不多,在真实的项目中还未有使用过,不过挺看好的。
简单说呢,前端工程师需要的大多数就是技术相关的技能,倒不需要太多的沟通啊和耐性啊神马的技巧。&/p&&p&哦哦,想起来了,CSS的知识比较零散,要死记的东西其实是比较多的。&/p&&p&&br&&/p&&p&&br&&/p&&p&3 发展前景&/p&&p&CSS的发展前景最近几年好的不行。在Android和IOS大行其道的时候,一大部分人都转去做了这两个行业,然而突然之间,因为微信的缘故加上JS的魅力,H5突然又火爆起来,所以呢,CSS整体来说还是一个挺靠谱的职业。最关键的是,CSS入门最快的职业啊,几乎零门槛,只是转JS还是挺不容易的。&/p&&p&CSS薪水如果纯粹只是做CSS的话,12K到15K基本上就是封顶了。。。所以:&/p&&p&0~3个月:4K~6K
3~12个月:5K~8K
12个月以上~:8K~15K&/p&&p&&br&&/p&&p&CSS的成长是非常快的。修真院的线下弟子都是一个月左右就可以独立做项目,可以进入IT修真界闯荡江湖了。正常情况下,3个月左右是没问题的。&/p&&p&我的要求比较高,所以所谓的独立做项目就一定是独立做项目,不用怀疑这一点。包括自适应,响应式和Bootstrap。&/p&&p&所以。想要拿高薪,CSS都必须要学JS,没有其他的途径。&/p&&p&&br&&/p&&p&&br&&/p&&p&成长路径:&/p&&p&CSS工程师-初级JS工程师-JS工程师-前端架构师-前端Leader(IOS,Android和JS通吃)&/p&&p&&br&&/p&&p&不要相信NodeJS,那只是玩玩而已。不要想从前端转后端,太难了,后端和前端是两个不同的概念,特别是对基础知识要求的特别高。&/p&&p&CSS和JS最好的方式就是IOS和Android通吃,精通一种,然后其他的能做项目,并不需要考虑其他的选择,推荐再学点其他脚本语言,首推Python,永远不要去学PHP,表问我为啥,个人好恶。
你一定要问,等我心情不好的时候再说。&/p&&p&&br&&/p&&p&&br&&/p&&p&4.入门门槛&/p&&p&零门槛!你相信咩,一个程序员的职业居然可以零门槛进入。。。
好吧,大多数人其实并不把CSSER称为程序员,不过,你至少学会了CSS,就能在IT修真界这个神奇的元世界里生存,就有了进军其他职业的可能性。&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&5.哪些行业适合做CSS&/p&&p&IT界:All
其他界:All&/p&&p&PS:正常人都可以学的会啦(马丹我就不是正常人)&/p&&p&&br&&/p&&p&6.职业限制&/p&&p&CSS的职业限制有三个,一个就是不去学自适应和响应式,一个是不去学框架,另一个就是学不会JS。
这三点都是很重要的突破。然后这个职业呢,怎么讲,在一家公司里可替代的程度比较高,并不算特别重要,做不了核心岗,也不存在什么代码交接。你就算代码写的再烂,也最多就是花一个月时间重写。。。&/p&&p&所以如果你不想做JS,你就真的真的发展受限制了,一定要记着,CSS只是你的一个跳板。
另外,因为零门槛,所以你其实还是有很多计算机相关的知识要补的,这是一定的,没什么可商量的。&/p&&p&只是做前端还好,如果想做后端,只是不想花那么长的时间才进入这个行业,就必须要从CSS做起,跟着用自己的其他时间恶补计算机基础了。&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&7.去哪里学,怎么成长&/p&&p&之前说我的贴子是广告的,你们错了。
看到这里,这才是真正的广告。&/p&&p&要说去哪里学CSS,绝对是IT修真院,请先看这里 &a href=&/question//answer/?group_id=934336& class=&internal&&如何在一个月之内从零基础成为初级CSS前端开发工程师? - xdyl 的回答&/a&。
IT修真院跟其他任何一家培训机构都不一样 ,完完全全不一样的教学模式。看完这篇贴子,其实你就能大概明白这是什么样的教学方式。&/p&&p&而且,线上学习完全是免费,不仅如此,大修真院还给你入院就提供了良好的人脉关系。嗯。
然后,如果你真的不想来大修真院,或者我没看上你,那么你就也不要看视频或者是交钱学什么的,看W3C吧,自己偷偷按照修真院的Task做项目,跟着就找家公司实习去吧。&/p&&p&虽然慢了点,好坏也入门了。&/p&&p&&br&&/p&&p&四 JS
=============我是第一次过100赞的分割线================================&/p&&p&JS说起来必须是一个神器,这个当年10天内被开发出来的神器,以一种谁也想象不到的速度快速发展,它击败了Java Applet,逼死Flash,当Android和IOS看似一统全球的时候,JS慢条斯理的和Html5一起蚕食App市场,甚至还出来了NodeJS这种连后端都不放过的残暴东西。&/p&&p&原生和WEB的两种方式一直在争论不休,而我自己在三年前就是绝对的WEB支持者,windows对于JS支持的更彻底,只是Winphone一直不给力。&/p&&p&好吧,对于拿NODEJS做后端工程项目我还是有点不情愿,然而提供各种辅助工具什么的还是挺不错的。JQuery,Ajax和RequireJS和Angularjs和PhoneGap都是一些标志性的转变,还包括ReactJS。JS简直了,简直了,简直什么都不放过。&/p&&p&所以JS简单么?我带着你们了解一下JS工程师是什么样子的。&/p&&p&&br&&/p&&p&&br&&/p&&p&1 工作内容:JS工程师其实分成两类,在之前讲CSS的时候已经提到过,一个是套页面的,一个是前后端分离的。对这两个概念还是分不太清的,可以回过头去看CSS的部分。&/p&&p&对于套页面来说,JS工程师的职责非常简单,一个是做一些简单的动画和交互和验证,轮播图,弹框,验证用户名是否为空等等。另一个就是通过Ajax取一些后台数据,然后在页面上展示出来。&/p&&p&那个时候的JS工程师并不被太多人重视,很多时候一些后端的人把前端的工作也做了--除了写CSS,大部分的后端工程师写点JS还是不成问题的。&/p&&p&可是前后端分离的出现,彻彻底底的改变了前端的世界。前端居然有架构了,前端居然也有“编译”的概念了(你能想象么,JS的项目居然不能直接打开源码直接使用了,必须要经过编译才可以)。前端工程师和后端工程师只通过Json数据交互(感谢Nginx提供了一个完美的跨域解决方案,再也不用什么Jsonp了),然后服务器端的同学发现:好简单啊,我对Android,对IOS,对Html都只需要提供一套API就够了~~&/p&&p&前端同学更开心,再也不用去搭建各种悲剧的开发环境了!前端变的很轻,而且控制欲很强(AngualarJS好赞),页面跳转神马的SoEasy,而且也有了Bower这样的包管理工具,还有类似于JSP自定义Tag的指令,MVC,还有了Service的概念,马丹,前端到底发生了什么!&/p&&p&所以我们现在说到的,基本上就是前后端分离的工程师,他们的工作职责就是和IOS&Android的工程师一样,跟后端定接口,确定框架和架构,分模块,然后跟后端联调互相吐槽对方是渣渣。&/p&&p&项目结束之后修复线上Bug,不停的跟用户说:在我这里是正常的,你换个浏览器试试?不行就清一下Cookie,再不然就换台电脑。&/p&&p&&br&&/p&&p&2 需要技能:
环境【IDE(WEBStorm,Sublime,EditPlus),源码管理(SVN/Git) ,WEB服务器(nginx)】
基础【Http,REST,跨域,语法,组件,F12,Json,Websocket】
框架【JQuery,AngularJS,Bower,RequireJS,GruntJS,ReactJS,PhoneGap】
业务【金融,教育,医疗,汽车,房产等等等等各种行业】
第三方【微信,QQ等各种第三方登录,支付,IM,地图,语音,视频,图片】&/p&&p&&br&&/p&&p&&br&&/p&&p&环境不说了,参考CSS的。
基础跟CSS差别就好大了,要有一些网络协议的基本概念,要了解什么是Http,什么是Https,什么是WebSocket,什么是Rest,各种JS的语法(太复杂的完全不用管,别去管什么闭包什么Prototype什么This的指向),Json是必不可少的东西。&/p&&p&框架就多了去了。直接拿JQuery来学习就好,表去太在意什么原生语法,大部分场景你都不用担心引入一个JQuery的库导致系统变慢,AngularJS真是一个好东西,表太纠结一些细节,Bower,RequireJS和GruntJS这些会有一些前端大牛帮你搭好框架你直接用就好了。
想做点App就用PhoneGap,想尝试一下ReactJS就去试吧(我很想试一下然而看到有Render就看不下去了)。&/p&&p&必须提醒一次,如果你是从CSS转到JS的,那么一定要看一下这篇贴子。&a href=&///?target=http%3A///forum.php%3Fmod%3Dviewthread%26tid%3D7473%26extra%3Dpage%253D1%2526filter%253Dtypeid%2526typeid%253D2& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【IT修真院】怎么样从CSS转JS-IT修真院&i class=&icon-external&&&/i&&/a& 。这里强调的就是,你必须要懂业务逻辑,这跟CSS完全不需要懂业务逻辑简直是天壤之别,很多时候你并不是因为技术而无法学会JS,而是缺少对于业务逻辑的理解。&/p&&p&当然啊,这并没有完。还有无数的第三方库等着你,做微信呢你必须要用WX的SDK,要用百度地图呢就必须要用百度的SDK,还有各种支付啊神马的。如果你要做IM就有环信啊神马的。&/p&&p&&br&&/p&&p&&br&&/p&&p&所以。JS就是一个真正的程序员,一个真正的工程师,不但要能把代码实现,还需要理解需求,需要懂得编码规范,需要知道如何控制项目流程和进度风险,需要修复线下Bug,需要调优,需要做版本管理,需要制订接口,需要编写技术文档,还需要做新技术的调研或者是带新人。&/p&&p&现在你了解了咩?(如果不了解,加入IT修真院嘛,老大带你在IT界从菜鸟修成大神)&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&3 发展前景&/p&&p&我说了那么多,你们对JS的期望也很高了吧。坦白的说,有点高的离谱!
JS是唯一一个可以在两年之内薪水到20K的职业。
虽然工作五年或者是七年的JS在薪水上差别并不太大,但是也已经让很多人难以置信了好么。&/p&&p&好多人在别的行业,工作十年都拿不到10K啊亲。&/p&&p&&br&&/p&&p&0~6个月:6K~10K
6~12个月:8K~14K
一年~两年:12K~20K
两年~五年:18K~30K
五年以上:24K~&/p&&p&&br&&/p&&p&&br&&/p&&p&JS的入门相对来说比CSS难的多(表怕,有我大IT大修真院),但是他的好处是学会一点是一点,并不像Java一样,绝对是前期Gank型英雄,到了6级就能四处杀人。Java是后期,要到16级以后才能出山才能够震撼全场。&/p&&p&所以JS相对来说比较平滑,而且现在学习的曲线也比较清晰,慢慢在业界都形成了相对完善的框架。JS可以选择前进的路有很多种,只要你不是太瞎(跟着修真院就一定不会瞎),就没什么大的问题。&/p&&p&&br&&/p&&p&&br&&/p&&p&成长路径:&/p&&p&JS菜鸟-JS初级工程师-JS中级工程师-JS架构师-UED-前端Leader-前端大牛&/p&&p&大概这个样子啦,JS工程师在后面有一点后续无力,一般来说,我还是强烈推荐JS,IOS,Android三者通吃,在我的带的Team中也一直要求他们这么做(虽然并未能完全实施成功)。&/p&&p&这三者有太多相似之处了,到最后你会发现,语言只是一种工具而已。要做的事情,其实是差不太多的,并不需要对所有的语言都特别熟悉,有一种打底的,其他的都可以随意去玩了。&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&4.入门门槛&/p&&p&必须有CSS基础,必须有CSS基础,必须有CSS基础。
或者是有后端Java基础。&/p&&p&总之你要么是会了CSS,要么是精通了一种后端语言,千万不要CSS没学好,后端语言也不会就直接学JS,心里会没底,不踏实。&/p&&p&其他的都没什么了,列出来的基础知识,自己慢慢补就行了。&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&5.哪些行业适合做JS&/p&&p&IT界:CSS,然后是所有的都可以
其他界:所有的都可以&/p&&p&好蛋疼的结论然而事实上就是如此,这波JS的红利受益于微信,以及移动端的普及。我不确定在三年或者是五年之后会不会还是这种状态,然而三年和五年已经足够可以改变你的人生了,所以,你在等毛线?&/p&&p&大修真院的弟子中有搬砖的有退学的有高中毕业的有做电汽和通信的,你想想为什么你不可以?唯一不合适你的大概就是:你真的没有编程思想哈哈哈,然而这确实是一件很难解释和预测的事儿。我也确实见过反应比较慢的,进度比较慢的,但是无论如何,混口饭吃,不成问题。&/p&&p&&br&&/p&&p&&br&&/p&&p&6.职业限制&/p&&p&JS的职业限制也挺多的,主要就在于学习的方向上很容易误入歧途(至少在我眼里是这样的,相信我,我不是什么好人,我并不会我说过的每一句话负责)。比如说一直坚持喜欢用原生,各种喜欢写一些奇奇怪怪语法(我把我看不懂的语法都归结为奇怪的语法),各种回调等等等等。&/p&&p&学到一些好的框架其实很赞的,对于大多数人来讲,就够了。只是缺少一个清晰的指引。
有的时候你会发现,你对Http了解的比较少,会是一个瓶颈。
你对数组啊,循环啊不了解,是一个瓶颈。
你对MVC不了解,也是另一个瓶颈。
对Json不懂,不知道怎么定接口,也是个问题。&/p&&p&这些都学会了,也会遇到一些问题。就是JS的工程师三年,五年,七年的差别,大多数人都不算特别的大。
所以总会有人想学后端--但是我绝对不赞成学Java,NodeJS也可以不去学,不如去学习Python,更不要提PHP啦(我真心不喜欢PHP,不知道为嘛)&/p&&p&或者说,后端并不是语法,而是牵涉到算法,架构,性能,业务,选型等等跟前端几乎没有任何关系的知识,所以学习一门脚本语言,能做点简单的东西就好了。&/p&&p&还是需要把注意力转到IOS,Android上去。&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&7.去哪里学,怎么成长&/p&&p&不用说。首推的当然还是我大IT修真院。IT修真院是先总结归纳一个能够独立完成项目的JS工程师需要掌握的技术体系,然后设计15个Task来让你逐步完成对于知识的掌握。修真院一直在传播代码是写出来,而不是看视频看出来的概念。更看重你们在真正去做Task的时候独立解决问题的能力,除此之外,还有跟你一起学习和成长的师兄。这就是IT修真院去培养JS工程师的方式,而且,线上是完全不收费的。&/p&&p&如果你不想用这种方式去学习,还是我之前说的那些话,W3C,然后做点东西,跟着去一家公司实习。&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&五 后端(Java/python/go)
=============我是想玩Dota的分割线================================&/p&&p&说到后端,其实我主要想说的是Java。C和PHP这两种语言我都不喜欢,之前也说过了,我自己绝对不是一个说话公平公正的人,什么观点都带着自己偏激和极端的调调。&/p&&p&我之前在贴吧跟Java吧的吧主一直在撕逼(原因很简单,我说教大家学Java,一个月收400块钱,他说我是骗子封我贴。然后我说好吧,我不说教大家学Java了,我来给大家解决在学习过程中遇到的困惑,他说贴吧不能发问答贴。我说行,那么我就写一些新人学Java必须要学数据库,数据结构和计算机网络,于是一群吧主过来喷我说,我没学过这些我也照样学会Java了啊,什么多线程什么继承等等,我无语了解释说Java语法不重要,重要的是要学会后端的架构,要懂算法,要懂业务,要懂系统的扩展性,要会调试程序,于是吧主们就把我封了,我很不爽,就新开贴子跟他们撕逼对骂--我从来不是一个重身份的人,我骂人会很脏,所以如果看到这个贴子觉得我很厉害那么你瞎眼了,我就是一个不喜欢就说,谁喷我一脸我喷谁一身的性格,现在的结果就是Java吧的吧主每隔10天就来封我一次-哈哈哈哈哈比闹钟都要准,所以三个月过去了,我带出来很多CSS和JS的学员,然而Java的学员并没有多少。所以如果有人去Java吧替我骂一下那些XX吧主并且截图给我看,我会很开心很开心很开心,说不定就会给你们开小灶哈哈哈哈。)&/p&&p&之所以说这些,一方面是400多的赞让我觉得有点羞愧,另一方面也是想强调一个概念,学后端,学会语法只是开始而已,最后一个就是我是一个小人,谁欺负我我就想欺负回去。&/p&&p&我想想该怎么描述后端的工作。后端跟前端是截然不同的,之前讲过。前端是Gank,后端是大后期,要等到16级以后才能V5起来,而且我非常不推荐前端去学后端(所谓的全栈工程师完全是扯,我有时间会写一下,为什么不要去做一个全栈工程师)。后端要积累到足够多的项目经验,才能够成为一个靠谱的后端工程师。我觉得。我来举一个跟着我线下半年的小培宇的例子就能简单说明一下后端的工作。&/p&&p&小培宇是第一个来到我大修院面试(嗯,最初我是给他们发工资然后带他们学习的)的人,跟我讲他是考研失败,差了几分,然后也做过点项目,我随便问了几句就知道了他的状态:人挺聪明的,但是在学校肯定玩的疯,所以问点排序算法还是能够答的出来,数据结构也懂一点儿,LinkedList和ArrayList删除数据谁更快也能答的挺靠谱的,但是绝对绝对没写过一行工程代码。&/p&&p&他打动我的那句话就是:不在乎工资多少就想多学点东西。很好,我默默的点个赞,因为我本身就想把自己这几年积累的经验和知识和走过的坑整理出来,告诉互联网的新人,所以也不抵触带新人,坦白说,愿意像我这样带新人的公司,几乎没有,带新人真不是一般的累。幸好我之前在各种公司中都带过各种新人,好的坏的都带过,所以还算是熟悉。&/p&&p&于是我给培宇精心设计了他的学习曲线,这也是我大IT修真院的核心观点:
1.先搭建基础环境(Maven,SVN,Eclipse,jetty,SecureCRT,Linux,Mysql)
2.做简单的CRUD(DAO-自己封装的数据层,junit,Log4j,Rest,Spring,Spring MVC,Json,JsonTaglib)
3.做一个相对复杂的系统DB设计,接口设计,项目部署,错误提示,Bug查找,怎么打系统日志。
4.做了一个微信相关的项目,了解微信的API,交互方式,Cookie,拦截器,AOP,登录系统的设计,命名规范等。
5.拆分Service,将Home和Service分开,使用RMI调用,实现各个层次之间都可以完成分布式的部署,使用Tuscany(真心喜欢Tuscany)完成SCA。
6.使用MongoDB完成地理位置的搜索,短信,图片上传,云存储,使用Tiles来配置页面模板。&/p&&p&这些内容他花了将近三个月的时间。对他来说已经是学会了很多东西了,这三个月是几乎没日没夜的学出来的,要知道他之前压根就不知道什么是Spring,生成Json和套JSP的区别我骂了他好几次他才弄明白,经常会遇到一些Maven或者是Tuscany的报错不知道该怎么解决,数据库字段的规范和接口规范常常被我黑的体无完肤。很多东西都只是知道个皮毛而已,你们自己说说,学会Java语法算什么?&/p&&p&这还是有我来带,有我来教,有我给他定制合适的项目教给他去做,如果没有这些,你们自己学,学会我说的这些东西要多久?
别的不说,学会怎么打日志,怎么根据线上的报错去找错就不是一个月两个月能解决的。做为一个工程师,应该明白,很多时候要学会正确的路怎么走,还必须要知道错误的路是走不通的。正确的路大概就那么几条,错误的路呢?&/p&&p&为什么很多时候我看到错误日志就会明白是什么地方报错了,是因为我之前花了无数的心血和心力在查找这些错误上,所谓的经验就是这样,看的多了,一眼就知道大概什么地方报错了,然后随便百度下,就能找到解决方案,跟着去尝试倒底行或者是不行。这些是看书,或者是看视频能教会你的么?&/p&&p&到现在为止培宇已经跟了我快半年了,还是被我骂的狗血喷头,别的不说,就是接口的Wiki文档和代码保持一致,他都会经常犯错---这跟Ja

我要回帖

更多关于 假腿 的文章

 

随机推荐