培训的程序员“差”在哪?
去年的it圈子里”培训出来的程序员”是热词之一,围绕这类程序员的印象有:不诚信,不靠谱,缺乏公平的机会等。在我看来,培训的程序员代表的是一个特定群体,刚毕业的大学生很多也能归属到这当中,他们身上都有相同的问题。大学是四年,有充足的时间做技术和理论储备,培训则是四个月,是速成的大学,但技术人员所面临的问题往往不是技术这一单一层面。而且现在大学生光顾着泡妞玩游戏的不在少数,在知识积累上可能和培训的处于一个量级。
刚毕业的几年里有很多次的被面试经历,过去的几年又有机会去面试不少同行,这里面大部分都可以划分到上面这一类程序员里。外企,bat,创业公司都经历过,所以说我攻和受的经验相对都比较丰富,可以谈一下我认为的这类程序员的问题出在哪。
自信
自信是很多这类程序员最明显的问题,面试的时候很容易露怯。你甚至不需要高明的面部表情识别技巧,就能清晰的感觉到对方回答问题时缺乏底气。有人会说遇到不会的问题都会紧张,但问题也分难易,60分以内的题目不应该答不出来,60分之外的答不上也没什么好紧张的,技术人员都有自己的盲区。所以你如果面试的是iOS工程师岗位,不应该对objective c的内存管理机制紧张不安。如果你面试Android岗位,则gc的基本原理算法不该说起来含糊其辞。如果连60分的自信都没有,那就根本不应该去参加面试,侥幸通过的面试对双方都是一种损害。
要有自信,更要有自信背后基本的技术积累。思维清晰,条理清楚的回答面试官问题,能加快建立双方之间的信任。遇到不懂的问题大方承认,比唯唯诺诺,指东言西好很多。
谦卑的态度
上面提到过技术人员都有自己的盲区,无论是被面试还是平时做业务,遇到需要google或者重新学习的技术点是件稀松平常的事。我面试过不少2年左右经验的iOS程序员,问他们SDWebImage是怎么做图片缓存的,不少人给我的答案都是没了解过,平时调用api会用就差不多了,甚至还会跟我讲一堆道理,比如重复造轮子的坏处,利用成熟第三方框架提高工作效率的好处等等。道理我都懂,可是你就不能直接告诉我你确实不知道,事后你一定会去了解吗?技术问题就是这么简单,知之为知之,不知为不知,不存在说你不明白怎么回事却让你巧舌如簧蒙混过去。保持谦卑的心态,遇到知识短板,虚心接受并及时弥补方是正道。
时刻学习的姿态
如果打算走技术路线,只要身处职场,就一定需要经常将已有的知识体系更新升级。学习应该是常态,做新业务遇到技术难点需要学习,面试被拒需要学习遗漏的知识点,面试成功也需要回顾学习哪里掌握的还不够深入。技术环境处于时刻变化的状态,iOS设备每年出现款,iOS系统每年有新功能,屏幕尺寸在变大,系统开放的api在增加,从mrc到arc,从NSThread到GCD,从Objective-C到Swift,只要你停止学习,你头脑里的知识和别人相比可以是iPhone4和iPhone 6s+的差别。懒惰会变化成各种借口阻碍你继续学习,比如:平时工作太累周末放松下,睡前只剩半个小时了睡了算了,等有时间了我再看下某个知识点,等用到的时候我再查下,今天要陪女朋友逛街明天再学习,还有大过年的。。。 时刻学习的姿态才能让你每天精进,每天都是佳境。
基础的牢固
基础很重要,比掌握几个新的api重要,比掌握一门新语言重要,比多做几个简单的app重要,也比你想尽办法通过面试重要。程序员的基础包括操作系统,数据结构,计算机网络,数据库这些大类,算法可以选择性的了解些。这些课程大学都会仔细教,培训却不会,培训会教你做界面,怎么上线app,怎么去通过面试。但这些基础直接决定你接受新知识的速度,决定你了解技术概念的深度,决定你以后这条技术路可以走多远。如果只能对培训出来的程序员们提一个建议,那就是利用一切可以利用的时间去咀嚼这些基础概念。第一遍不懂看第二遍,查阅所有相关的资料从不同角度去理解,任何技术概念百度google都可以找出n多相关技术文章,只要你驱动力够强一定能搞明白你想要了解的事物,哪怕是零基础起步。这些基础是你和四年大学最根本的差距,弥补的过程会比较痛苦,但这是唯一的途径。
知识体系的建立
技术人员都要有自己的知识体系,上面提到的基础是横向的广度,把这些基础和具体技术相结合,然后深入发掘就是深度,深度和广度构成一个T字形结构。建立这个结构是知识体系建立的开始,之后技术上的成长无论是广度还是深度都是T字形的不断生长,持续挖掘深度就成为专家,不断拓展广度能成为更好的架构师。我之所以强调基础的重要性,就是因为有了牢固的基础才能形成自己的知识体系,才能明白自己当前的缺陷短板在哪,才能制定清晰明了的技术学习计划。几年前看到过一句话觉得很有道理,说一个好的程序员应该是:know a lot about a little, know a little about a lot, 是同一回事。
对待技术的严谨
技术问题和自然语言不同,对于技术,一种表达 只有一种意思。一旦思路确定下来,用代码表现的技术容不得半点模糊,少一点考虑就多一个bug,所以对待技术问题需要一丝不苟的严谨。我刚毕业那会面试, 大公司出题都十分强调边界条件的考虑,基本思路大家都会有,但能否把问题考虑周全,将所有的边界条件理清楚就不是人人都能做到的了。我现在面试的时候除了 考察基础知识之外,还会问一个(就一个)简单的算法题,题目真的很简单,几乎人人都可以找到思路,但重点在于把所有的边界条件确认好。
重视业务的磨练
我接触过一些的iOS程序员,他们或多或少都有一到两年的工作经历,也做个好几个app,规模都不大但业务涵盖面却不小。虽然有这些业务经历,但却没有支撑这些业务的技术功底,你问他app的登陆token机制是怎么样的说不出来,用https为什么更安全也不了解,有些模块不是自己写的就不清楚。做业务其实是个完善上面提到的知识体系的好机会,一个业务要做到完善,让用户感受不到瑕疵的程度其实非常困难,各种边界条件的考虑,安全性,流畅度,省电,流量,crash率,和其他模块的交叉等等。所以请重视每一次业务的锻炼机会,想得要比产品经理更深入,遇到要填的技术坑不要偷懒,不要因为赶进度就降低质量放过自己成长的机会。
以上是我对“培训的”这类程序员的一些感受和建议,希望能对有志在技术这条路上长远发展的朋友们有一些帮助。