A. 如何打好java的基础
从大学到现在,我使用Java已经将近20年,日常也带实习生,还在公司内部做training,所以可以分享下我的经验,希望对你有用。
因为是在工作中培训,就必然有两个约束:实用、时间紧,因此就不能像大学那样,把所有的知识点都面面俱到的讲到。而只能挑基础的,实用的,难理解的讲。至于其他边边角角的知识,就一笔带过。一则没有时间,二则不常用,再则既使讲了,学生印象也不深刻。总之一句话:“好钢用在刀刃上”。
下面,就根据我的实践,具体谈下学习过程:
1.基础知识
我学习java的时候,先是通读了《Java编程思想》,然后是《Java核心技术》。当时这两本书还不像现在这么厚,而刚才我把案头的《Java核心技术》第9版翻了翻,上下两册已经1700多页了,可想而知,如果要把它通读一遍,且不说把所有的代码都调通,就是当小说读,估计也需要些时间。
但我现在教学依然首推《Java核心技术》,主要是体系完整,实例多,可操作性强。但对初学者,我一般是只讲前6章,也就是下面的内容:
Java程序设计概述
Java程序设计环境
Java的基础程序设计结构
对象与类
继承
接口与内部类
就《Java核心技术》第9版来说,也就是到250页为止,加把劲,1个月拿下完全没问题。
因为你是自学,所以建议你一定要把其中的代码都调通,课后的作业尽量去做。除此之外,还有两点特别重要:
#.学习笔记
因为你是自学,不像在企业中学了就能够实践,印象自然特别深刻。而自学因为没有实践的及时反馈,所以记笔记就显得特别重要。因为记笔记就像写作一样,是整理思路的绝佳方法。同时学习笔记也是你以后开发,面试的绝好资料。
学习编程,人跟人是不一样的,别人觉得难理解的东西,对你却不一定;而你觉得难理解的东西,别人可能又会觉得特简单。而学习笔记就是自己专有的“难点手册”,有点像高考时的“错题本”,以后无论是在面试前,还是在日常工作中,随时都可以翻出来看看,自是获益匪浅。
#.分门别类保存demo
学习笔记是很好的文字资料,但编程界有句话说的特别好,所谓“no code, no text”,意思就是说:千言万语都没有一段代码来的实在。
以我的经验,在你在学习的过程中,就某个知识点,无论当时理解的多透彻,调试的多棒,只要时间一长,等到了实用的时候,肯定会碰到各种各样的问题,一些看似简单的东西,此时死活就是调不通,正所谓人到事中迷。这个时候,如果你手头恰有运行良好的demo,打开参考一下(甚至直接拷贝过来),问题自然迎刃而解。而且因为这些demo都是你亲手调试出来,印象自然特别深刻,一碰到问题,在脑子中自会立刻涌现。
所以说,在学习的过程,一定要善待你调通的demo,千万不要用完了就扔,等后来碰到困难,想要用时却找不到,追愧莫及。正确的做法就是把所有调通的demo,分门别类的保存起来,到时候查起来自是得心应手。
人都说“书到用时方恨少”,其实代码也是这样,所谓“demo用时方恨少”。
2.Spring
目前在Java EE开发中,Spring已经成为和Java核心库一样的基础设施,所以说如果想成为一个合格的Java程序员,Spring肯定绕不开。另一方面,如果掌握了Spring体系,Java基本上就算入门了,就有能力进行一些实用级的开发了。
但Spring本身也是日渐复杂,衍生项目越来越多,但最最核心的概念依旧是IOC和AOP,掌握了这两个概念,再把Spring MVC学会,再学习其他的衍生项目就会平滑很多。
同时,因为Spring本身就应用了许多优雅的设计理念,所以学习Spring的过程,也是加强Java基础知识学习的过程。因此等你掌握了Spring,原来很多你理解不透彻的Java特性,此时就会恍然大悟,包括接口、抽象类等。
我学习Spring,读的第一本书是《Spring实战》,坦率的说,书很一般,但市面上比它好的书,我却没有遇到过。还有一本《Spring源码深度解析》也不错,对Spring的设计理念讲的尤其透彻,虽然整本书读起来有些艰涩,但前几章却生动有趣,也是整本书的精华。所以建议你在学习Spring之前,先把该书的前几章通读一下,然后再回过头来学习《Spring实战》会顺利很多。
以我经验,要学透Spring,终极的方法还是阅读源码(我当时就是这么干的),待把Spring的核心源码通读了,人就真的自由了(所谓无真相不自由),不仅是对Spring,而是对整个Java体系。以后再遇到其他框架,大概一眼就能看出其中的脉络,所谓到了“看山不是山”的境界。但这都是后话,可以作为以后你努力的方向。
和学习Java基础知识一样,学习Spring也一定要记笔记,一定要分门别类保存demo。
老实说,Spring对初学者不算简单,因此最好能有个好老师带一下,不用太长时间,2个课时即可,然后就是在你遇到大的困难时,能及时的点拨下。
以我的经验,要初步掌握Spring,大概需要1到1个半月的时间。
3.其他知识
Spring是Java编程的基础设施,但真要进入到实际项目的开发,还有些东西绕不过,包括 MySql,Mybatis,Redis,Servlet等,但如果你经过Spring的洗礼,这些东西相对就简单多了,以我的经验,1个月的时间足够了。
4.实践
学习Java,光学不练肯定是不行的。但因为是自学,所以就没有实际的产品让你练手,但也没有关系,谁大学还没有做过毕业设计呢?以我的经验,大家最爱的“学生管理系统”依旧是个很好的练手系统。
别看“学生管理系统”逻辑简单,但麻雀虽小五脏俱全,其中数据库设计、Mybatis,Spring、SpringMVC,Servlet、Tomcat一个都不缺,绝对的练手好伴侣。
还有,虽然你的学习重点在Java,因为要做一个完整的demo,前端的配合肯定少不了。因此就免少不了要学一些简单的JS、HTML知识,但因为前端本就是个很大的topic,所以一定要控制好边界,千万不要顾此失彼。就“学生管理系统”来说,在前端上,只要实现一个包含table、textbox、button,能发送REST请求到server,能实现学生的“增删改查”的简单页面即可。
作为一个练手项目,目标就是把Java的主要技能点串起来,所以自不求尽善尽美(也不可能),所以1个月时间足够了。
.最后
按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。
学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。
在日常的教学中,我常把下面这句话送给学员们,今天也把它送给你:
“道路是曲折的,前途是光明的!”
祝你好运!
B. 程序员的必备技能有哪些
数组、字符串与哈希表
任何受过专业训练的程序员,对“数据结构”这门课程中涉及到的各种数据结构都不会陌生,但是在实际的编程工作中,大部分的数据结构都不会用到,而且也永远都不会用到。虽然如此,深入地理解基本数据结构的概念和实现细节,仍然是每个程序员的任务。这不仅仅是因为,掌握这些知识将有利于更加正确和灵活地应用它们,而且也是因为,对于语言背后的实现细节的求知欲是一个优秀程序员的素质。
正则表达式
在程序员日常工作中,数据处理占据了相当的比重。而所有的数据之中文本又占据了相当的比重。文本能够被人理解、具有良好的透明性,利于系统开发、测试和维护等就必需要有一定规律遵循一种规则,当你掌握一门正则表达式语言,就能够培养你编程的直觉本能,达到较高水平,也能够在实践中提供更高的开发和执行效率。
调试
软件调试是软件工程的一个重要部分,其过程出现在软件工程的各个阶段,从最初的可行性分析、原型验证、到开发和测试阶段、再到发布后的维护与支持,都有软件调试过程参与。学习和灵活运用软件调试技术,不仅可以提高程序员工作效率,而且有利于对代码的感知力和控制力,加深对软件和系统的理解。此外,调试技术是解决各种软件难题的一种有效武器,它直击要害、锐不可挡,相对其它间接方法具有明显的优势。软件有大美,调试见真功!
两门语言
任何一位职业化的软件技术人员都会将编程语言当成自己的利器。它们代表了开发人员对计算机本身的理解与对软件开发工作的执着。同时,建立在编程语言之上的基础也标志着程序员的职业化道路发展到了一个新的阶段,而单一语言又有一定的局限性,软件开发的本质就是处理信息以及数据。一种专门用来处理数据的脚本语言常常是走向更加职业化的必备武器之一。所以精通两种语言,对于任何一个开发人员来说,并非必须,但是对于一个专业化程度较高的开发人员来说,又常常是必要的。
一个开发环境
随着技术的进步,IDE已经越来越强大,远远超出我们心目中的最初形象,越来越多的内容被涵盖到IDE中,从需求分析、业务建摸大批软件发布,IDE已经逐渐覆盖了软件开发的整个生命周期。
SQL语言
说起SQL,绝大多数程序员对其作用都了然于胸--用来访问数据库嘛。确实,数据是信息系统的核心,没有数据的计算机应用没有任何意义。信息系统中,大量数据本质上就以实体--关系的模式存在,而RDBMS支持SQL这么简单但表达能力丰富的访问接口,同时还提供了内建的事务ACID特性保证和故障恢复能力--因此,RDBMS理所当然地成为了大部分信息系统的标准数据存储介质。于是,无论使用何种语言开发信息系统,从C、C++,Delphi到Java,从Perl、Python到Ruby,使用SQL访问RDBMS都是我们必须修炼的武功秘籍。
编写软件的思想
说起程序员的武器自然少不了技术书籍,它们就像是拳谱、剑经、虽然不能马上转化为巨大的伤害输出,但假以时日勤以研读,有朝一日成为傍身绝学也是说不定。不过虽然各类技术书籍汗牛充栋,除去入门时浅显易用的参考和复杂深奥的学术专着,能够让所有程序员常看常新的心法秘籍还是不多。
C. 有哪些老程序员都知道对新手很有用的经验
一说到程序员,想必大家的第一印象就是头发少,很大程度上就是因为压力大导致的,有生活压力,也有工作压力。
今天说说工作方面的压力,想必看到这个问题的小伙伴都有一个认知,就是一个项目往往比预期的要长,说不定从哪天开始就加班了,一出现BUG真的要人命。此时,考研新老选手心态的时候和经验的时候了,老程序员或许能从容应对,新手可能完全不知错所。
这些信息包括户口档案、社保、公积金等信息,程序员新手可能跳槽比较频繁,有人甚至还换个城市工作。除了户口可能其他的信息都乱了,可能当时觉得不那么重要,但是十年、二十年后,可能会非常重要。
·工作日志可以提升脑容量;
·不要先写框架再写实现,要反过来;
·重构/优化/修复Bug,不要同时做;
·简化开发流程,加快迭代速度;
·纸笔是最好的工具,其次是markdown;
·画出结果,一目了然。
·要学会进行清晰的命名;
·问问题前先调查,要问到点上。
·不要小看程序员
D. 一个程序员的创业经历(一)
曾经的创业热潮让很多大厂的程序猿加入到了创业大军,但往往发现“理想很丰满,现实很骨感”。我也是这样的一员,国内“C9联盟”大学毕业,然后去美国常春藤名校读了个Master,毕业后在一家世界前五的软件公司工作,后来裸辞回国在一家一线互联网公司做数据挖掘/机器学习的工作,一切都按部就班的在给个人简历添砖加瓦,不过随着一个加入创业团队的决定,就开始了一段不一样的经历,之后的5、6年时间经历了多个创业项目。一直埋头向前冲,最近停下脚步回顾了一下过往经历,想写点东西当作纪念,也算是给想要或正在创业的程序猿们一个案例供参考。
当时选择从大厂出来加入一个创业团队,也并不算很盲目。首先,行业是当时很火爆的互联网金融,其次核心团队成员来自金融、法律、互联网等不同领域,都是国内顶尖大学毕业的高材生,而且也有不错的工作经验和人脉的积累,最后种子轮的资金大概有700多万,股东也有银行系出身的大佬,看起来是一个值得搏一把的机会。
我与其中一个创始人曾是同事,被游说出来作为技术团队的leader,他负责产品,我负责研发,先简单介绍下核心人物(化名):
刘备:公司CEO,金融领域,做业务出身,对各种金融产品比较了解,在各大银行及政府部门都有不错人脉,熟悉生意场上的各种潜规则,有些匪气但并不是那种很有领导威严的风格。
关羽:公司CTO,我的前同事,互联网产品出身,专业能力很强,既聪明又踏实肯干,待人接物也不错,属于实干型,但一样也是一直在大公司工作,内容相对专一,且没有金融领域经验。
张飞:公司法务总监,法律专业,本人也像法律法规一样严禁,无论工作上还是生活上说话做事都很严谨,被朋友形容为任何跟黄赌毒沾边的东西都跟他不沾边,工作之外并不善言辞,但是为人很nice。
在被前同事关羽游说的过程中,遇到了第一个“丰满的理想”,因为我是做大数据的,所以关羽跟我说出了他对技术和产品发展的规划,将来是一定要做金融大数据的,有很多场景可以做,技术上也会有很多挑战。但既然是“大数据”,首先就要有足够多的的数据,也就是业务要发展的足够好才会到这一步,这点我心里还是很清楚的,所以接受邀请自然也不是因为这个愿景。
既然已经决定了大干一场,也就不瞻前顾后了,出来后就开始着手组建技术团队,那时候创业公司还是一片欣欣向荣,很多大厂的程序员也都愿意考虑创业公司的机会,所以首选就是从公司前同事下手,可惜一个都未能邀请成功,有一个曾经谈的比较深入,但最后去了一家拿到A轮的做餐饮供应链的B2B电商,之后复盘考虑主要可能有几个原因:
1. 金融领域本身水就比较深,对普通的程序员来说未实际接触过的话感觉有点心里没底;
2. 种子轮公司毕竟风险更高,而且使用到的技术也更初级一些,若没有成功,对技术积累来说有一个断档;
3. 与前同事共事时是平级,但出来后可能变成向你汇报,或许会有心理落差,之前谈得比较深入的同事是被他一个师兄叫走的;
4. 公司给出的offer还不足以让人放弃稳定的大公司工作加入到小团队中。
为了控制成本又不能找猎头,所以接下来就只能通过招聘平台了,拉钩、智联什么的,虽然经历了一些波折,但最终组建了一个还算蛮有战斗力的团队,在外包+兼职+自己团队的组合之下,初版系统两个月左右就上线了,期间产品、技术、法务之间的磨合也越来越好,貌似一切都在正确的轨道上运行。
但系统上线之后才是真正考验的开始,公司面临的第一个问题就是平台上是否有足够多优质的理财产品,虽然前期已经准备了一些由股东支持的理财产品随时上线,但这并不是长久之计,所以在系统开发期间刘备也一直在洽谈合作事宜,时不时的带来一些振奋人心的消息,但结果证明没有最终签署合同的口头协议都是无效的,这就导致前期平台上产品匮乏。
产品匮乏自然也就无法吸引足够多的用户了,用户量少就更难去谈合作了,致使业务一直处于发展缓慢的状态。商务谈判并不像技术开发一样可以评估工时,安排工期,一个合作谈成之前进展都是0,签合同之后才是100%,中间进度很难评估,而过多的打鸡血也会有副作用产生,慢慢的技术团队的成员就开始对公司不停跳票的业务发展有些担忧。这仅仅只是一个导火索,接下来会引发一系列的事件和决策,每一个可能都不是决定性的,但累加到一起导致了公司最终的结局。
当业务停滞的时候,没有太多创业经验的团队开始有些发慌,尤其是账户里的资金越来越少的情况下,这时开始了两个所谓“自救”的行为,一个是寻求新一轮的融资,一个是尝试一些新的产品或接一些快速赚钱的项目。前者的目的也是很明确的要尽快的补充资金,所以很容易陷入到一个2VC的状态,就是一味地迎合投资人的偏好和想法,迷失了自己最核心的价值和初衷,最终也没有拿到投资;后者无异于饮鸩止渴,盲目的去接一些无关的项目,导致自己的核心产品和平台没有持续的迭代和优化,对用户就更没有吸引力了,而且找到的项目也很难cover技术团队的工资成本,变成了做一个赔一个。所以这两种方式只是勉强支撑团队而已。
而往往在最艰难的时候才会爆发出更多平时被隐藏下去的问题,首先,刘备和关羽、张飞都是大学同学,作为CEO他对团队并没有一个绝对的主导和控制权,而关羽负责人数最多的技术团队,他们之间的分歧导致了公司整体战略和团队方向的不统一。其次,公司的早期股东是4个自然人为主,在公司一个没有一个比较好的营收的时候,他们之间也出现了一些问题,尤其是其中某一个股东跟刘备的关系最紧密,导致其他股东质疑公司的财务问题,最终导致股东不愿意再继续注资。最后,同样是因为自然人十大股东,就导致监督机制缺失,作为法务负责人的张飞,由于业务能力比较强,经常被股东委托解决一些私人事务,让他不胜其烦,成为了第一个离职的核心人员。
最终我们的公司也算是有个归宿,被一家金融机构给收购了,但这显然不是因为我们做的足够出色,而算是无奈把公司卖掉,回收点剩余价值吧。就这样第一段的创业经历就这样草草落幕,事后复盘总结,有以下几个重要的经验吧:
1. 股东组成,早期可以接受个人股东,但不宜太多,占股要有权重等级,而且要有完善的监督机制,如果个人股东占股比例接近,没有主导性,监督机制又不健全,很容易出现股东之间的猜忌和分歧,对初创公司是致命性的伤害;
2. 创始团队,团队成员能力互补、互相信任是基础,所以经常会有同学、同事一起出来创业,之前大家可能是朋友,或者感情比较亲密,但任何团队都要有领头人,要有灵魂人物,在有重大决策时能拍板的人,不能因为顾及对方感受而让决策层出现长时间的分歧;
3. 团队组成,根据公司或业务类型来合理配置团队,很多时候在资金还充裕的情况下会盲目的扩充技术团队,导致当业务没有起色的时候技术团队的开销成为了公司沉重的负担,任何一个公司都不能只考虑技术开发,运营、市场、销售等等都要合理配置;
4. 成本控制,创业初期,为了吸引早期员工公司提供了很多福利,包括免费健身、周五团建、饭补车补等等,而且高新聘请各种大牛,一副大干一场的态势,最后发现业务还没什么起色时初期的融资就已经消耗大半,而且很多时候大牛们也没有用武之地,造成了极大的浪费;
5. 技术边界,所谓技术边界就是创业初期你的产品在技术上要做到一个什么程度,很多时候技术出身的leader容易陷入到追求技术完美的误区,觉得一个功能在技术上没达到理论上的完美就不上线,但永远都有做不完的需求,一个好的技术leader要清楚怎样的优先级最能支撑公司的快速发展,一个功能做到什么程度就能满足当时客户的需求,人力资源就那些,要最大化的发挥效用。
E. 程序员,感觉技术停滞了怎么办
你是一名程序员,感觉技术停滞了。那你就去深造呗,就是你可以选择各种的程序任务去做。哦!针对自己有弱点的地方,然后去学习。活到老,学到老。