《如何自学编程,自学编程需要注意什么?》要点:
本文介绍了如何自学编程,自学编程需要注意什么?,希望对您有用。如果有疑问,可以联系我们。
作为一个10年+技术人员,以及兼每周平均面试10人以上的面试官,我觉得我可以给大家一点点建议.
其实写代码很简单,只要智商正常半年足够.必定要把基础打好,这是最重要的.一开始,你把常用的数据结构学全,足够让你在不错的公司找到一份编程工作.
面试过太多的人,写了7,8年上10 年代码,连最基本的数据结构,设计思想都不知道,你再多的项目经验又要什么用?现实一点讲,你连给组员做代码评审的能力都没有,上十年工作经验有毛用.还不如一个刚刚开始写代码的人,最少比拟好管.
还有,我个人是不相信基础知识都欠好却敢说会做设计的人.这样的人做设计我不敢要.
有人带你的话,每天只必要二个小时,半年下来,实力碾压一半的人绝对没有问题,不管工作年限多久的人.不是你多厉害,是大家伙太差了
我介绍一下配景,然后表明自己的几个观点,最后列出我经常问的面试题里面的基础题并做说明为什么问这些.相信大家看完后都有自己的判断.
先简单说一下我本身的情况,我在一间大公司(挺大的,但不是BAT)里面做开发工作(SA,SE),负责系统的设计开发,带团队,不大,最多的时候也就20个开发人员左右.每个项目开始的时候需要招人,所以需要做大量的面试.这个有时多有时少,最近就比较多,平均每天3-4个,电话面试和现场面试都有.我是做j2ee开发的,前后台都做,也都会面试前后台开发,最近还会面试android开发.
在此先列出本身的几个观点,以免大家理解偏差:
1. 我说基本数据结构和设计思想是最重要的,这个观点不变.但这个基础并不是有些人理解的比拟无聊和很生僻的概念、无实际意义的笔试题,相反都是工作中遇到的问题.后面的题目大家可以看到.我并没有让大家重新发明轮子的想法,只是现实中很多人除了知道这是一个轮子之后其他都不知道,我是要大家了解每种轮子的特性,不同的路况用哪一种轮子,每一种轮子的优劣和注意事项.当然,如果你知道轮子的细节,我觉得是一个加分项.我们开发人员绝大部分部分是不会写有什么创造性的代码的,代码都没有什么难度,你把东西用好就够了!能有机会写算法引擎的,那真是大牛了.反正我工作这么久没有写过难的代码需要高IQ才能理解的代码.
2. 关于经验,我从来没有说把别人的经验看的一文不值.作为多年开发人员,我比大部分人尊重和珍惜我们开发人员,也深知道做10多年开发的不容易,所以看到基础很差的多年开发人员心里更多的是悲哀而不是藐视(上次晋级面试,大家工作年限都很多,最少8年,大部分10多年,虽然题目答得不抱负,我和另外一个面试官还是让大部分人都过了).但是经验要是建立在技术上的.在扎实的基础前提上,你会少走很多弯路,经验更加有价值.“我赶了20年的马车,难道不上不刚刚开了半年汽车的小屁孩?”
3. 关于带人,这个大家理解偏差是最大的.我说的带人不是培训,而是说有人给你正确的方向,和应该掌握的知识点,这里更加多是思维、设计层面的东西.首先肯定的是,个人的主动能力最少占90%以上.你得是一只马,带的人在你跑的时候不让你跑偏,让你避开一些坑,过不了的时候拉你一把.你如果是不是主动奔跑的马而是被动牵着的一只猪,怎么拉都没有用.人改变自己都很难,何况改变别人.其实“带”更多是思想层面的,如有人告诉你原子结构为什么都有一个while?condition为什么存在?AOP为什么切不了静态办法?为什么本类里面调用切不了(这是上一个月的生产环境问题)?这些有人讲的话,事半功倍.
4. 关于每天2个小时半年碾压一半人,这个观点不变.我说的是java语言,其他语言没有面试过,但我猜测应该不会偏差太大.看起来很像很扯淡,但这个世界上有些事情你不相信但他实际上就是这样.说碾压大家可能觉得不舒服,恰当一点说是“超过”.我这样说是从我面试的结论上得到的,我这2年内面试应该有200+人,年限从4年到10多年都有.我从不看学历和之前工作公司,我只看你的技术.经常面试完的感觉就是,你写这么多年代码都写了些啥啊,这么基础不会,我把你一个10年+的人招过来,代码评审还得我本身去做啊!所以少年你只要努力一点点,半年能超过一半的人很正常,当然再往上就不是线性了.还有,这里是自动过滤掉BAT等技术较牛公司,BAT技术或许能代表国内技术最高的水平,但绝对和国内平均水平没有关系,平均水平离他们差实在太远了.
5. 有人说基础不好不代表技术不行.如果你看完我下面的标题,我们理解的基础一致后你还这样认为,我只能说“呵呵”.有人说:吾力足以举百钧,而不足以举一羽;明足以察秋毫之末,而不见舆薪.你信么?技术上,我相信窥一斑而知全豹,一叶落知天下秋.
6. 看到有人说写点牛逼代码showshow的,我坦白,我是老手,不是高手,我做的也是it系统,我工作这么多年没有写过难度高的代码,没有机会也不必要.在座各位又有几位必要写牛逼的代码呢?说实话,复杂代码(不是智商理解的复杂)谁都会写,简单代码可不是谁都写得出来的.
----------------------------------------------------------
下面开始说题目了,个人面试题主要粗分为语言基础,多线程,spring框架类,系统集成类,设计类.本日说语言基础类,并说明为什么我会问这些.
1. 常用的Map有哪些,各自特点和使用场景.
毫无疑问Map是最重要的数据结构之一.HashMap,HashTable就不消说,如果工作经验多一点的应该知道TreeMap,LinkedHashMap,ConcurrentHashMap,WeakHashMap.
其实我主要看LinkedHashMap,因为这个比较有用,之前我也经历过写出一边用HashMap,一边再用一个List存放Key顺序这样的代码的年代.然后问一下TreeMap,LinkedHashMap区别,很多人不知道有序和排序是不同的.ConcurrentHashMap是JUC的包,很多工作8年以上的连JUC包都不知道,我不知道说什么好,你还停留在好多年前啊.如果知道会问问 ConcurrentHashMap和HashTable2个实现线程平安的方式有什么不同? 其实很多数据结构的实现思想是很有意思的,后面有机会写写.如你了解了HashMap的数据结构,hash一致性这个概念就很自然的理解了!
如果答得比拟好,还会问问哪些方面会影响HashMap的性能.如果知道大概的数据结构,就知道HashMap是一个list的数组,只要是数组就会扩容问题,HashMap扩容还得重排,这是最影响性能的.
再问有哪些线程平安的Map,是因为最少知道HashMap不是线程平安的,windchill软件包HashMap死锁问题现在还没有解决,上一个月生产环境还报.(原因是并发的时候里面的list成闭环死循环了.)
WeakHashMap如果知道,那最少知道java引用有哪几种,工作中可能遇到oom问题,虚拟机基本概念也有了.基本上不会深问下去了.
2. 如果HashMap答不上,只能问List了.
大部分人回答ArrayList,LinkedList,Vector.ArrayList是数组数据结构,也是要注意扩容的问题,这些带数组结构的构造函数都有一个容量的参数.然后问问这几种的使用场景.知道Vector线程平安.差不多了.上一个问题答不上,JUC包里面的List就不用指望了.
还会问List有哪几种迭代器,不要觉得无用,这是上一次的代码问题想到的.配景是服务器返回的List数据多了,我们要过滤掉一些.如返回的list有{"11", "22", "33"},把2开头的去掉.程序猿你可以自己写写.不要觉得简单,你能一次性写正确吗?我们当时开发人员写的代码,用{"11", "22", "23", "33"}测试就犯错了,连续2个后面那个没有删除掉.但是如果你知道有list有一个专门的迭代器,可以边遍历边修改,那肯定能一次写对,不是皆大欢喜吗?
3. transient/volatile这些修饰符的含义
如果你觉得无用和很偏,那只能证明你工作的内容比较单一,或者你看代码太少了.我刚刚写代码的时候也是这样觉得的.这2个都是经常用到的.transient系统之间集成序列化少不了打交道,如果不知道你要自己写代码过滤(实际上出现过有人专门自己写了一个bean转json办法,就是为了过滤掉某些字段).volatile多线程会用到,这个其实有很多理论上的东西可以问.
基础数据布局其实我就问这么一点点,不偏吧? 线程相关的其实更有意思.
4. 线程平安的数据结构有哪些?实现的大概原理是什么?
主要看最起码JUC包要知道吧?有更加好的东西不用就浪费了.其实主要看知道不知道重入锁的优劣,这是很有用的特性.很多人一说怎么样才能线程平安就只知道加synchronize.很多时候是满足不了要求的.有时候做性能优化就需要替换掉一些较差性能的数据结构.如果开发的时候就知道,就省事多了.如读写锁,重入锁的condition都是好东西,
5. 如果不知道重入锁,那问写数据要加锁,读数据要加锁吗?还有wait、notify的用法.
很多人觉得读不消加锁,如果真这样写代码,bug就不远了,很多人不知道加锁有2个作用.wait、notify用户很少有人能清晰说正确,大家都没有锁的概念.这个问题主要是考概念理解.
6. 原子对象的原理、用法?
这是其实很重要,也很简单.很多时候我们放一个计数器,用原子对象就够了,简单明了.他的线程平安,是一种乐观的思想,cpu指令保证.我一开始看为什么总有一个while,总觉得有点困惑,后面从思想上理解就很容易,悲观锁是一定要加锁(用synchronize关键字或者重入锁),觉得不加锁就会出错.乐观锁就是说假设你不会出错,出错了大不了重试嘛,所以有一个while,一般认为性能更加好.
7. 这样一个场景,我们系统要调用3个系统接口,为了提供性能,我们起了三个线程一起调用,我必要等待这3个线程都执行完毕拿到结果再往下走,代码怎么样实现?
这是我们系统实际的场景,其实多种实现方案,最好最简当然是jdk的线程池,或者闭锁.能答得上不到1/10,很多人说用wait,notify,再问其实真的不懂...个人觉得,如果能用wait和notify写一个阻塞的链表,一次就通过,wait和notify就算过关.
最后推荐下我的Android学习群:110359956,不管你是小白还是大牛,小编我都挺欢迎,不定期分享干货,包含我自己整理的一份2017最新的Android学习资料和零基础入门教程,送给大家,欢迎初学和进阶中的小伙伴.还有最新opengl,opencv,VR,AR技术防止两年至三年之后的一批大筛选.
还有MVP最新教程实训班,欢迎大家参加
维易PHP学堂逐步分享更多《如何自学编程,自学编程需要注意什么?》相关教程。欢迎交流
转载请注明本页网址:
http://www.vephp.com/jiaocheng/9150.html