程序员的自我修养(一)
分享学习编程和设计资源的小站——技匠社
第一章 谈职业生涯
我听到过很多用来形容程序员的网络词汇,例如,码农、程序猿、软件工程师、张江男、屌丝程序员,等等。其中大部分都略带贬义,有些甚至是程序员们自己发明出来用于自嘲的。其实这些称呼对你来说并不重要,关键是你自己内心中用了哪一个词汇来形容自己。当你仅仅将自己定位成一个码农,那你可能就是那个整天用着相同的工具,写着相似代码的码农;当你把自己看作是一个屌丝程序员的话,那你也可能就是那个衣食不愁,但整天浑浑噩噩、无所追求的屌丝。
我更愿意用技匠这个词来形容程序员,就像我给自己起的花名一样。程序员应该是那些不断追求更高技术,并有着自己产品梦的工匠。当你通过对自己技术不断打磨,一次又一次做出那些优秀产品的时候,你会发现自己不再是他人口中的码农或是屌丝,而更多被称为了大师、大神,而受到大家的尊重。
当你理解了GOF的那些经典设计模式,你就会知道如何使用一个单例来最有效地实现一个Logger组件;当你理解了SOA或是最新的微服务架构,你就能够通过架构使你的企业IT治理更加有效;当你理解了DEVOPS这种新的运维文化和理念,你就能使企业IT运维效率得到显著提升。此外,你还需要理解在网络安全、性能调优、代码优化等各个方面的最佳实践,以使你写出更高质量的代码、做出更优秀的产品。
通过研究公司的框架(甚至是更底层的框架)源代码,去了解它们具体的实现原理和设计思想。
当你发现所在的环境和周围的人已经无法让你获得提升时,不妨学一下我提到的那位设计师,选择一个更好的环境,尽可能与那些优秀的人一起工作。
你的薪酬其实取决于很多因素,技术能力、经验资历、工作量等,但最本质的却是,你对公司是否重要,换句话说你是否容易被取代。
严谨往往是判断一名程序员是否具备优秀潜质的重要因素。严谨的程序员对于分配给自己的任务会认真理解,对于自己的产出会仔细检查,这些都能大大减少工作中的出错概率,给团队或公司中的其他人留下良好的印象。你可能需要很长的时间来建立自己的声誉,而一次因不够严谨所导致的错误,就可能让你彻底失去它。养成严谨的习惯,将使你终身受益。
沟通的目的:如果我们已经是某一方面的专家,我们也有责任去引导最终用户接受我们提出的专业方案或设计。
当我学会以一个设计者的视角去分析和解决问题时,我的思路就得到了很好的扩展,这使得我既可以用左脑来想出那些技术方案,也可以用右脑来为用户提供更人性化和具备良好用户体验的设计方案。
作为一名程序员,我该如何锻炼我的右脑呢?是不是一定要学习设计或者一门乐器之类呢?完全不需要,在工作中你就可以找到很多途径来提升你运用右脑的能力。比如,在你编写一个文档或PPT时,除了内容之外,能否再多考虑一下字体和排版,让人读起来更加舒服呢?在你与用户讨论需求时,能否尝试着从程序员思维转换到用户的角度来看待问题呢?在团队内部开会时,是否能提前做些准备,多争取在大家面前进行讲演的机会呢?当你持续这么去做以后,你会发现自己在各个方面都会变得越来越好,这其中也包括了你的编程能力。因为,这些技能总是在你看不见的地方互相作用和促进的。
那些优秀的程序员无时无刻不在体现他们的能力,从轻松地解决技术难题,到会议上提出被一致认可的解决方案,以及他们写出的那些优雅且完善的代码,这些都让他们显得与众不同,仿佛是天生的优秀程序员。
如何招到一名靠谱的程序员?
1简历看人
首先会过滤掉那些包含错别字,文句不通或没有逻辑性的简历
然后重点阅读简历中的项目经验部分,在这里我能够看到面试者的开发经验,技能栈,并且判断他们熟悉的技术框架、工具是否与目前公司的要求相匹配。
特别关注面试者是如何来写这部分项目经验的,你需要用尽可能简练的文字来描述项目的背景,你在项目中承担的角色、参与项目的时长,你用到的技术,以及你在项目中的亮点等信息。优秀的程序员们往往善于归纳,并能够一针见血地发现问题或把一个问题说清楚。
最后,我还会关注你的一些与编程有关的社会化活动,比如,你在GitHub上的开源项目,在知乎、V2EX中给他人的解答,以及你的个人技术博客等都会给你加分。
2.给面试者10分钟介绍自己最擅长的
介绍自己最擅长和最感兴趣的领域。这往往能帮助我很快做出下面的判断:
•这个人对他所做的事情是否充满激情。
•他是否能在自己的团队中有效地进行沟通。
•他是否在自己的专业领域足够擅长。
•你的团队是否会乐于和这个人一起工作。
3基础打牢了吗
下面是我经常会问的几个问题(Java):
•HashTable与HashMap有什么区别?
•Servlet是线程安全的吗?
•JSP中@include跟jsp:include的区别。
•HTTP的response code 403和500分别代表什么?
4技术深度如何?
请你描述一下,在这个项目中,从一个HTTP请求发起,到最终的Response返回,它在你的系统和框架内部是如何流转的?
这个问题往往能够判断出面试者对于相关技术的掌握深度。较初级的开发人员描述的层级往往比较浅。比如,使用Spring MVC框架的,只能说到实现一个Controller继承BaseCommandController(甚至很多开发人员只知道继承了一个公司内部框架的基类),至于再往下Spring框架是如何进行内部流转的,就再也说不清楚了;而更资深的开发人员,往往能说出框架内部的实现机制,以及如何调用和处理的。在面试者描述的过程中,你还可以穿插询问一些比较有深度的问题,比如,框架中某个类这样设计是哪一种设计模式的体现,采用这样的设计有什么好处,等等。这比让面试者默写一个设计模式代码要有效,也自然得多。
除了技术层面上的考察之外,对于资深开发人员,还需要考察他们的设计能力。说到软件设计,大部分面试者都能熟练地背出面向对象的3个基本特性:继承、封装、多态,也能把它们的概念描述清楚。但我一般会问下面的这个问题来考察他们的面向对象设计能力:
请用一段程序代码描述我们所在的这间房间。
我惊讶地发现至少有一半的面试者都很难准确使用Interface和Class来给房间建模,也有一些人会将最基本的代码语法或关键字写错。
5行为面试法
请谈谈你在这个项目中遇到的最大困难或挑战是什么,你是如何解决的。
从面试者对上面这个问题的回答中,我能够很好地判断他是否有较强的独立解决问题的能力,而我认为这是除技术能力之外,程序员最应具备的能力。
6给他一个虚拟任务
在你确定是否录用他们之前,可以给他们一个虚拟任务。我不是说一个抽象的程序问题,而是指一个真实的,可能就存在于你当前项目中,并且需要在一两个小时之内完成的一个开发任务。
你的目标不应该是简单地获得一份工作或者雇佣某个人,而应该以获得更多的工作乐趣和建立更良好的工作关系为目的去看待招聘这件事,切忌不要急于求成,就像谈恋爱一样,当双方都有感觉时,一切就水到渠成了。
每个程序员都应该了解的一件事
一名程序员如果能够尽早意识到自我营销的重要性,并有意识地锻炼和运用这种能力,那将对你的事业产生有益的帮助。
又有哪些能够提升自我营销能力的方法呢?下面便是我的一些建议。
1.读与技术无关的书
2. 会写文档
3. 学会包装
包装应该包含两层意思:•知道什么是美的(优秀的)。•精心制作。
4. 尝试多讲
•敢说。•让说的和你想的一致。
5. 建立社会化的联系
你不应该总是陷入在那些处理杂事的循环往复之中,跳出来,创造更好的方式去解决它们才是应对之策。
当然,如果公司真的看不到一点希望,而你又不是创始成员的话,那么选择离开无可厚非。但参与创业的过程对你来说仍会是一份宝贵的经历,是你应该加倍珍惜的。
涉猎不同的技术甚至领域,但前提是你必须首先对某一门技术做到精通。技术是需要深耕的,深入学习一门主流的开发技术,并不断提升编程思维,比对很多技术栈都浅尝辄止要好很多。
爱因斯坦也曾说过:人的差别在于业余时间。特别是在当今这个竞争社会,持续学习对每一个职场人都显得尤为重要。每晚抽出两个小时,周六周日抽出4~6个小时来阅读、学习、思考或参加有意义的演讲、讨论,你会发现,坚持数月之后,你便会超过周围的人。
如何才能提高自己的情绪控制能力呢?
一个简单的方法就是做到对事不对人。当你对某一件事非常气愤时,首先,你需要问问自己发火有没有用,如果答案是否定的,那么为什么不静下心来想想怎样去解决问题呢,
其次,你需要有同理心,多站在对方的角度和立场考虑问题,即我们常说的换位思考,你会发现很多时候对方不是故意为难你和与你作对,而是也有他的考量和存在的现实问题;
最后,你也应该有一些自己的情绪宣泄方式,比如,与朋友聊天、练习书法、看电影等,都是不错的释放方式。