程序员应该如何选择公司 (转自凌霄光)
技术的价值
我们是做技术的,而技术是用来解决现实中的业务问题以及提高业务的效率的,比如o2o的实现,把线下的业务搬到了线上,比如各种自动化的工具的开发,大大提高了业务的效率。这就是我们做技术的价值所在。
如何选择公司
技术是解决业务问题和提升业务效率的,要解决业务问题,首先得有能够与之匹配的技术,前期的程序员在择业的时候不要只考虑薪资和公司知名度等,有两个方面是更重要的:
1. 纯技术的成长
技术包括对语言、对框架的特性的掌握程度、对架构的理解还有对如何写出高质量代码的理解。
前期的程序员选择公司的时候需要更注重技术的成长,或者是公司给你安排做学习和调研的时间,或者是公司业务并不忙,有空闲的时间可以用来提升技术。前期千万不要选择业务太重的公司,这样你技术得不到很好的积累和沉淀,虽然能积累很多项目经验,但对个人发展是没多大好处的。
如果你遇到的公司有技术分享的机制,说明这家公司注重个人的技术成长,愿意长期的培养新人,这样的氛围下,你自己也会不自觉地去注重技术本身的提升。如果公司有code review环节也是很好的,不要排斥别人对你代码提出一些建议,这是帮你发现你自己发现不了的问题的途径,有助于不断的提高代码质量和架构的思想。
2. 项目复杂度
项目经验就是用技术解决业务问题的经验,我们学技术的最终应用还是解决业务的问题和提升业务的效率,脱离业务单纯谈技术是没有多大价值的,就算是技术氛围很浓的公司和团队,他们关注技术本身最终也还是为了服务业务。
但前期千万不要一头扎进业务而不顾技术的提升,做需求的时候要分清楚那些是纯技术的问题,比如一些工程化的优化、一些自动化工具的开发,哪些是解决业务问题的技术方案,解决的是什么样的问题,是社区的通用的方案还是没有案例可以参考的自己创造的方案。
根据业务和公司需求的不同,对技术的要求也不同,一个大的互联网公司的架构师和一个没多大用户量的创业公司的架构师技术要求肯定是有差别的,越是复杂的业务需求和痛点的地方,对技术的要求也越高,需要更深入的研究,而大公司更容易遇到这些难题,所以理论上在大公司你会对技术有更深度的要求。这也是为什么有的公司会要求大公司背景或者复杂项目的经验。当然有的创业公司的业务复杂度并不亚于一些大公司,而且在大公司你也不一定能接触到核心的有价值的业务。
此外,除了技术的深度,技术的广度和视野也很重要,涉及到的哪些端、用到哪些技术栈,也是需要考虑的。
面试
你经历过一些面试之后,你会发现技术面无外乎问两部分问题,纯技术的部分和解决业务问题的技术方案也就是项目经验的部分。
纯技术的部分包括语言基础、框架特性和api的理解掌握、架构思想等,项目经验部分会让你介绍你做过的项目用到了那些技术,解决了哪些业务问题,哪些方案是比较有深度的。
此外还可能问你一些逻辑题,这是看你分析问题的思路,因为你入职之后的工作也是用技术解决业务问题的,而解决问题的第一步是分析问题,这就需要你的逻辑能力了。
有一些做技术的自由职业者,他们的成长中似乎并不需要经历公司,但是他们仍然还是做技术的,仍然是解决业务问题的,区别只是技术的成长更多的靠自己,解决业务问题的项目经验的积累更多的是通过接一些别的公司的项目来做而已。他们仍然需要面试,但更看重的是解决业务问题的能力,技术本身的要求会低一些。
成长起来之后
当你技术本身包括语言、对框架特性和api的掌握、对架构思想的掌握到了一定程度,并且积累了大量的解决业务问题的技术方案的时候,你可以做架构,带领团队去解决业务问题,也可以创业,因为你对于如何解决一个领域的业务问题已经有了相应的能力,当然我相信如果到了这一步,会有人来找你一起创业的。你能解决越复杂的业务问题,你的价值也就会越高。
总结
技术的价值体现在解决业务问题和为业务赋能、提高效率这两方面,我们的职业生涯中,需要提升的一是技术本身,二就是对复杂业务的架构能力,你从初级到中高级再到资深甚至专家的过程,除了技术的提升外,更多的是取决于你能解决多复杂的业务问题。
虽然业务不可忽视,但技术是一切的基础。前期千万不要去太重业务的公司,特别是需求特多、加班严重、没有个人学习时间的公司。
选择公司有两个标准,一个是技术本身的成长,是否有code review、技术分享等机制,是否会给你的学习和调研排期、是否有空闲的用来学习的时间,二是业务的复杂度,业务越复杂对技术包括对框架特性的掌握和架构思想也就有越深度的要求,这样的项目经验也就越有价值。此外,公司大小和薪资需要考虑,但不是最重要的。
当你技术和解决业务问题的能力到了一定水平之后,你可能会选择做架构去解决别的公司的业务问题,或者去创业自己去解决一个领域的业务问题。还是那句话,你能解决越复杂的业务问题,你的价值也就会越高。