⑴ 只会写业务代码的码农,如何拿阿里的开发offer
最近公司需要招聘几个java开发工程师,2个周面试了有20多人,有个很强烈的感觉:很多有天赋的开发者,技术面试表现差强人意,问原因比较统一归结为——长期跟着公司只写业务代码,而自己没有时间扩展提高,更不知道如何提高自己。
就此说说我的看法:如何提高自己?当然你再怎么提高也不一定能拿到阿里的offer,不过至少能接近一点是一点嘛!哈哈
首先做个定性结论:要提高自己,首先要能写好业务代码!如果连业务代码都写不好,那么你别读下去了,转行,出门右转娱乐版!
写好业务代码的不一定很牛,但是连业务代码都写不好的一定好不了!
直接总结点干货吧。
1,尽可能多熟悉业务
无论是不是你的业务尽可能的都弄明白,成为专家。你懂的越多,对团队作用做大,别人越依赖你,你可以做到进可攻退可守。这是你的护城河
业务越熟悉,作出更加完美设计方案的可能性越大!
2,做端到端的专家
一个小问题:在PC浏览器里输入 toutiao.com 点回车以后,从本地浏览器到服务器再到浏览器中间发生了哪些处理?亲们,有几个人都把这个问题回答完美?我面试的时候问过很多人,有人连DNS是啥都不知道。。。。这是一个端到端的典型例子,但是细思恐极,DNS、浏览器缓存、本地host、路由、nginx反向代理、tomcat、集群、redis cache、mysql、代理、dfs、cdn。。。。,哇塞,好爽!我们做技术一定把知识做成体系化,很多人只知道springmvc的xml里面配置映射,这是远远不够的。
体系化,系统性,宏观全局性,这些是能力提高的必备!说起来也不难,用心整理即可!
3,怎样自学
如果你在一个成熟团队,恭喜你,只要你用心,通读现有架构多向别人请教,然后自己回家搞一套出来多练练就行了。
如果你有机会从头开始搭建一套,那么更加恭喜你,虽然很累很辛苦,但是只要你扛下来以后就是康庄大道。
JVM调优是啥?nginx、redis、mongoDB、neo4j、atlas、elasticsearch这些玩意是干嘛的?好吧,如果你不知道,那么恭喜你,我给你打开了一扇窗,自学去!但是我不可能天天来给你开窗,怎么办?简单啊,开源中国多逛逛啊,infoQ,ITeye这些网站收藏起来,顺便删掉你的1024嘛!时间总会有的,你也总会牛起来的。
前天有人私信我问怎么学redis?要买什么书看?我说不要买书,去qq上找找相关的群加进去,再去网络找个最简单的例子,在自己电脑上把redis装上,然后敲命令,一个新手的知识就从网络上找+群里请教就足够了,敲差不多了再结合自己的语言比如java,从网络上找例子能够通过java执行命令,剩下就是进阶,再群里多向大佬请教一下最好有业务能够结合使用一下。怎么结合spring,怎样使用高级属性,怎样做到数据一致性等等。。。。。
当然,这个例子是完全自己学,其实这是很辛苦的,更快一点的办法是借力,找懂的人帮你最快的开一个头,入了门再开始自己研究,这就是我个人一直觉得在线学习网站app是非常好工具的原因!不要在乎那点钱,先开个头再说!
4,学习——>实践——>教别人
上面的第3条适合小白,非小白呢?以JVM调优为例子,我觉得三步走:
学习,了解基本知识,该网络的网络,该头条的头条,该花钱去上在线教育网站学习的也别在乎那几百块钱,学好了能几百倍的赚回来,比投资股市和房地产都合算
实践,就是动手嘛,公司项目能有机会练习更好,没有的话自己动手吧。当然具体到JVM调优,一般看不出来效果的,你配啥参数都能跑起来,用jstat,jmap之类的也看不出来啥,那好,我们想办法跑死它!执行无限循环、做超级大对象,让它stop the world!你进行跟踪!好玩的很呢。设计各种场景,多方位多角度的跟它折腾
你以为的“学会了”,跟真正的“学会了”是有差距的,差在哪里?如果你有尝试过去教会别人,或者自己准备写个说明文章你就明白了,差距真大,目测好记层楼那么高的差距。这几天写头条,我深有体会,大家有兴趣可以翻一下我前面的文章,我觉得我会的不少,但是写的时候头发都快被我自己薅没了,真心难,不过写的过程中不断的否定自己、确认自己这一圈下来收获也确实很大!好了,你懂该怎么做了吧,有兴趣一起来头条写文章吧,挺好玩!
本文不适合大牛!实在没有那个能力去指导大牛。所以有觉得文章不妥的大牛们还请善意的回复指正和讨论,上来就想骂街的还请您看在我敲了30分钟字挺不容易的份上,饶我一命!代表全家老小在双11这么伟大的日子给您想说一声“谢谢”。
有缘的朋友,欢迎回帖探讨。谢谢
⑵ 程序员,如何少走弯路,成为一名技术专家或者架构师
#1 专业技能
@首先当然基础知识要扎实,一些经典的专业书籍一定要看。比如,设计模式,算法,数据结构,所在领域的编程语言的专业书籍等.关于不同的能力阶段,需要读取什么类型的书籍,请参考ThoughtWorks(中国)程序员读书雷达,每年都有更新。
@作为架构师,review别人的代码并给出合理的建议是基本功,比如变量或者方法命名的规则;所以代码大全,重构,改善既有代码的设计,Clean code 等等肯定需要看。
@ 对于某一个技术领域或者业务领域,一定要有一门技术是精通的,因为这样你才能体会到以后遇到自己不懂的技术的时候,如何能够快速成为这一方面的行家。
@ 平常有时间一定要多多进行代码的训练,也就是Martin Flower常说的Kata练习,这个比喻来自于跆拳道,跆拳道选手一般每天都会找一些基本的招式,进行反复的练习,从而训练肌肉的条件发射,那么对于我们程序员来说,一定也要进行持续的编程训练,比如上面提到的那位同事,给的建议是,虽然把大部分时间花在了沟通和协调上面,没有机会写代码,但是自己一定要利用业余时间,自己找一些例子来联系,比如,参与开源项目,或者到网上去搜索一些大师的经典Kata联系的例子;或者看工作里面是否有一些小工具,是否能够提升自己的沟通效率,当然已经天天写代码的童鞋们除外。请参考我转发的另外一篇文章和另外一篇介绍能在线练习Kata code的文章.
@ 最好能够在精通一门语言的基础之上,学习其他的语言,从而站在一个更高的角度,对于程序语言有一个更高层次的抽象认识,比如,学了Java之后,可以学学Ruby,Groovy,C#等等,其实语言之间都是相互借鉴的,比如Lamba表达式,连java也慢慢的向函数式编程方向靠拢。
@ 如果有时间,一定要自己维护一个博客,既然选择了架构师,就决定了自己以后不仅仅是一个技术专家,同时也要成为一个布道师,为企业组织或者社会上的其他IT同行们贡献自己的一些微薄之力。
@ 多参加一些社会上举办的软件专业会议或者活动,了解当前比较流行的技术和框架。
@ 这条不提倡,我以前有一个同事,几乎每年都要更新简历1~2次,目的不是真正的换工作,而是通过面试得到当前市场上大部分公司正在使用什么技术和框架。对于这条,请慎用!!!!
@如果有结对编程的机会一定要好好珍惜,特别是和高手大拿一起结对的时候。
@如果大家上面都已经做的非常的好了,这个时候可以看看架构设计方面的书籍,比如企业应用架构模式,架构之美等等。
@ 去51Job上搜索架构师这个职位标签,看看不同行业的企业对于架构师的技术要求和标准,然后结合自己当前所处的行业和你自己的技术特点,比如擅长前段或者后端,有选择性的学习一些自己感兴趣的技术或者方法。
@ 关于常用的网站,没有定论,笔者主要是根据搜索的结果去发现适合自己的网站,所以需要读者掌握一定的搜索的技巧,笔者一般喜欢用英文搜索,这样的话资料比较全也比较新;如果下载电子书的话或者查看博客的话 一般会首选CSDN;如果是解决工作中的问题的话,在StackOverFlow上面被解答的概率是最大的,此外平常自己也需要去积累一些自己感兴趣的技术的人气比较旺的网站列表,比如一般和Window相关的就是MSDN;如果对Java入门比较感兴趣,可以看看这个网站。对于一些开源的框架,一般都会有想对应的社区,google一搜索,很快就能找到。另外一个德国人写的博客的非常的精致,如果对Eclipse插件开发特别感兴趣的朋友们可以去参考它。
@大家如果时间和精炼允许,最好能在Github开源和分享自己平常写的代码。这样一方面可以熟悉git用法,另外一方面也可以把自己平常练手的代码免费保存,何乐而不为呢?
@如果大家平常遇到什么问题,可以到StackOverFlow上面去寻找答案;当然,如果你能自己注册一个StackOverFlow账号那是最好不过的,这样不但可以提问,还可以帮助别人,同时上面还有很多工作签证的工作机会。
#2 软技能(现代社会,一个合格科学家不仅仅是某一个行业的技术专家同时也是一名专业的社会活动家)
@遇到问题,一定要多想,遇到一个问题,如果解决了,就要反思为什么能够解决,如果以后遇到类似的问题,
如何更快速的解决。
@英语的重要性,不言而喻,因为现在很多新技术的框架的中文文档非常的少,即使翻译成中文,也是二手的了(国内自己的开发的一些开源框架除外)
@ 有时间的话,看一些沟通方面的书籍,如果有参与沟通的机会的时候,一定要想如何把沟通做的更好更舒畅。
@ 如果有机会的话,可以参加PMP的考试,关于如何备考PMP,请大家参阅另外一篇文章:如何备考PMP,但是如果不想参加的话,也没有关系,至少要涉猎到项目管理方面的书籍,否则以后如果成为架构师之后,客户或者管理者给你说一些项目管理上一些专业术语时,到时候就会一头雾水。
@架构师其实从某种意义上就是一种角色,而不是一种职位。一定要时时刻刻保持空杯心态。
@一定要有一颗保持饥渴学习和耐得住寂寞的赤子之心。
@当前的技术节凑是非常快的,特别是结婚以后又有小孩了。一定要好好的利用自己碎片时间,对于一些技术,当时读不懂不要紧,但是一定要记住和了解其关键词,这个主要是为了拓宽自己的视野。比如,当前你想自己开发一个系统,结果已经有一个开源框架实现了,而且还很稳定,这个时候,自己就没有必要重复发明轮子了。
@与不同的技术、编程语言、设计模式和结构等(甚至是它并没有在日常中给予你直接的帮助)打交道。你永远都不知道这些知识是否会在未来派上用场,但是对你绝对是有益无害。
@在工作中,能够帮助到别人解决技术难题,一定要尽量全力以赴,因为这不但可以赢得同事的好感和口碑,同时也能增长你解决问题的经验和提高你的技术思维能力
@ 一定要掌控好自己的时间,对工作没有帮助的会议,能不参加尽量不要参加,当然,企业安全,公司规章制度如果是强制性的,该参加还得参加,但是如果没有工作效率和扯皮的会议,尽量避免参加。
@程序员要耐得住寂寞,要在自己的领域深挖,不能看啥火,就学啥,一定要有自己的想法和判定,如果决定不了,可以向资深的同事或者朋友沟通。
@尽量参与到项目中的编码,因为架构师不能与项目脱离。
@ 如果有机会可以锻炼一下自己在大众环境下的演讲和PTT的能力。
@有机会多做知识分享,因为你一旦分享了知识,你就会对这门技术有深刻的印象,同时也能树立在同事中的良好的技术形象,从而赢得更多的专家影响力而不是职位影响力。
上面只是我当前能想到的,知易行难,知道了上面的一些经验,并不代表年轻程序员们就能马上成功,毕竟这需要一个凤凰涅槃和实践的过程,但是肯定能帮助有志于于此的年轻程序员们少走一些弯路,限于笔者水平,如有总结不恰当或者不到位的地方,还望批评指正。