一个程序员对另一个准程序员的忠告

fdek7315 8年前
   <p>自己关于所从事工作的一些看法,希望对你有用。</p>    <h2>为什么要选择软件互联网行业</h2>    <p>从宏观上来看,软件互联网工作者算得上是这个时代的弄潮儿,站在潮流的前沿,致力于为用户创造更加时尚便捷优质的生活。在当今这个移动互联网的浪潮之中,你可以感受到互联网正在改变人们的生活方式和思维方式,激发时代的变革,进而改变中国,改变世界。如今,一切传统行业如果不拥抱互联网,就将面临被时代浪潮淘汰的危机。拿金融银行业来说,阿里巴巴余额宝的面世为千千万万的拥有小额存款的打工一族及其他社会基层人民提供了一种可观的稳定可靠的且入门门槛较低的理财方法,给广大民众带来巨大福音,而余额宝也因此触动了传统银行界国有垄断者们的利益根基,虽然他们目前企图联合起来抵制这种互联网金融,但我相信他们这是逆流而行,终究挡不住互联网带来的金融变革!</p>    <p>在我看来,互联网巨头Google是这个时代最伟大的科技企业,他们的决策者正在带领员工用科技,用智能手机、Google Glass、无人驾驶汽车、热气球无线网络改变世界,改变生活。而在中国,阿里巴巴这样的互联网企业也都在努力探索改变和颠覆一切不尽人意的传统行业,使之更加亲民,更加具有用户体验性。总之,在互联网面前,一切传统事物都具有无限的想象空间。这大概也是互联网从业者比其他传统行业从业者更加容易创业的原因吧。</p>    <p>从微观来说,移动互联网时代真的是让人们的生活更加高效便捷甚至优雅,地图,叫车,付款,订票,吃喝,购物,社交这些事情因为智能手机和移动互联网而变得轻而易举,也使得世界近在咫尺。可以坦言,我个人现在的生活已经几乎离不开手机,离开将寸步难行,这或许从另一个方面来看也许有些悲哀,但你不得不承认移动互联网如今已经植根于我们的生活,从事移动互联网的建设会让人们的成就感如此真实贴近。当然,互联网工作者相对于其他行业从业者来说,也有普遍相对较为可观的收入。</p>    <h2>互联网工作者不局限于程序员</h2>    <p>不过有一点需要明确的是,互联网工作者不仅限于程序员,因为一个好的互联网产品绝不是单单由程序员创造的,它需要各种不同职能的人分工合作共同创造出来。</p>    <p>作为一个程序员,在我的日常工作中,接触比较频繁的角色通常分为以下几种:</p>    <p>1、PM</p>    <p>Product Manager,即产品经理的意思。这一类角色主要负责追踪和分析市场需求,从而提出并定义有价值的产品,进而推动这些产品的开发实现。他们需要具有敏锐的嗅觉和前卫的思维,他们可以不用写程序画界面,但需要懂技术,知道什么功能是可以实现的,什么功能难以实现。</p>    <p>2、RD</p>    <p>Research and Development engineer,研发工程师,也就是所谓的程序员,诸如PHP程序员,Java程序员或者C/C++程序员等等。从更为专业的角度区分,程序员分为客户端RD(包括windows RD,MAC RD,Android RD,IOS RD,WP RD等等)、服务器RD(也分为前端和后端,前端是后面要提到的FE,后端包括PHP Python C/C++等不同语种的RD)和系统嵌入式级RD(开发操作系统和嵌入式级别的软件——听起来功力更加深厚的人群)。总之,程序员致于力将PM提出的产品实现出来,并且具有合理的运行逻辑。</p>    <p>3、FE</p>    <p>Front-End Development,前端开发。实际上这类角色也是写代码,不过偏向JS、HTML、CSS这些决定网页布局展示的脚本代码。他们除了需要掌握这些包脚本技术之外,也需要具有一定的美学和艺术功底。</p>    <p>4、UE</p>    <p>User Experience,即用户体验。他们负责产品的用户界面和交互逻辑的设计,为程序员们各种图片资源,而这些设计和资源基本决定了产品的美观程度和易用程度。</p>    <p>5、QA</p>    <p>Quality Assurance,测试工程师。他们负责对RD们实现的产品进行检验和评测,提BUG挑毛病。他们也属于技术类的角色,需要理解产品的实现原理和逻辑,并且会利用相关工具和技术(包括必要的程序语言,如各种脚本语言)来对RD的程序从功能、性能(内存、速度、效率等)等方面进行检验和评测。必要的条件下,他们需要阅读RD所写的代码,从而提出潜在的风险和问题。</p>    <p>6、OP</p>    <p>Operator,操作员,管理员。在我们这里他们主要负责服务器的管理和维护。RD开发出的服务器类程序最终会由他们布置并运行到线上机器,也就是服务器。他们也属于技术类角色,精通服务器操作的各种命令和工具。他们相对RD来说更加具有大局观念,因为他们管理的是大量由不同的RD实现的不同的服务。</p>    <p>以上这些除了PM之外,其他均为纯技术类岗位。不同的岗位需要不同性格不同潜质的人来担当。如果你是个比较有想法逻辑思维也不错的人,PM就是一种不错的选择。如果技术能力较强,学习能力强有钻劲儿RD是不错的选择。思维严密的也适合QA,有美术功底的可以选择FE/UE。技术面广的也可以选择OP。</p>    <h2>程序员的工作生活状态</h2>    <p>程序员,程序猿,众所周知,我们的工作强度普遍较高。目前我自己的工作状态是,早上10点前到公司,晚上9点到10点回家,更忙的时候也可能到十一二点,有时赶进度周末也会加班。当然不管是本公司还是国内其他类似企业,比我工作轻松或者繁重的都是有的,不同氛围决定不同的工作状态。从事这样一种行业,你需要做好一定的心理准备。</p>    <p>然而程序员的命运也并没有悲惨到无法忍受的地步,否则天下怎么还会有这么多不辞劳苦兢兢业业的程序员呢?以我个人为例,我的工作时间并不是完全定死的,而是可以适当灵活处理的,比如有时早上有事晚到甚至下午到也是可以的,下午或者晚上有事提前走也是没问题的,只要跟上司打个招呼或者发个邮件通知一下就好,不会算矿工(时间长的可以申请休假),不扣工资,周末加班也可以申请调休(别的企业可能以发工资补偿)。另外,一般正规的互联网企业都应该会有年假制度,我们公司技术类岗位的初级一年有12天带薪年假,这些年假可以适当地任意支配,比如清明、中秋、元旦这样的小长假我们就可以利用年假拼凑出大长假,然后就可以出去大玩一番了。在我们这里,有很多旅游达人,他们动不动就出个国旅个游什么的,看起来很是逍遥自在。</p>    <h2>程序员也可以创造优雅的艺术</h2>    <p>事实上,程序员可以不等同于程序猿,只要你愿意。他们也可以拥有高雅的兴趣爱好,比如诗词、音乐等,也可以拥有健康的生活,比如定期运动等等。更重要的是,程序员也可以创造优雅的艺术,就像你阅读的《黑客与画家》中所说的一样。因为互联网产品是用户体验至上的,没有用户体验的产品是不负责任的产品,没有前途的产品,终将被市场所淘汰。高质量的用户体验必定是优雅的,甚至艺术的。</p>    <p>另外,优秀的程序员也会追求代码的简洁高效性和艺术优雅性,因为通常某个程序员编写的代码不仅仅只会给自己阅读,总不可避免地需要给项目组的其他搭档或者后来接入项目的人员阅读并进一步加工扩展,那么优质的代码则显得尤为重要,而优质的代码也是一种艺术。</p>    <h2>程序员是怎样练成的</h2>    <p>编程语言不是根本,程序员的最终目标不是写代码,而是分析并解决问题。如果你可以不费一行代码而高效解决你的问题,你何必选择写代码呢。当然,写代码终究是无可避免的,那么对于编程语言来说,你需要理解程序和计算机之间的协作方式。C/C++是基础:C语言让你理解计算机是怎样一步步被操控的,而C++让你在此基础上认识面向对象的执行原理。其他语言可以触类旁通,比如JAVA就可以简单看作C++的子集,在理解C++的基础上掌握JAVA可谓轻而易举。一个不太差的程序员都应该理解并掌握C/C++,并能使用其他语言,而不是单纯地只会JAVA或PHP或C#一种应用性较高的程序语言。由于程序员的目的是解决问题,因此他们很可能为了达到目标需要同时使用不同的技术手段,包括运用不同的程序语言来协同完成任务。</p>    <p>程序员最大的挑战不是如何写代码,而是如何搭建一个开发调试环境,如何使编写的代码编译运行起来,并处于一种可测试可检验的状态,从而你可以很方便地了解你的代码执行的效果,透过现象分析程序运行中出现的预料之外的问题(所谓BUG),进一步也可以明确改进和优化的方向。</p>    <p>程序员的惯用伎俩是复制粘贴。鉴于代码的版权无关性,大多数程序员的大多数代码往往源于借鉴和复用,包括从网上搜索得到或者从已有的项目中获得。总之我们的宗旨是解决问题而非写代码,因此快速地获取有效的解决方案的一切正规手段都是值得推崇的,事实上能够有效运用复制粘贴的手段实现自己的功能也是程序员的一种必备技能。</p>    <p>程序员最大的烦恼是无法专心写代码,因为在你工作的时候随时需要应对PM、QA、上级以及其他同仁抛出的问题,因而极易被打断当前的思路,这是一种比较让人烦恼的事情,但却基本是无法避免,因为你不是一个人在战斗,而是在一群人中战斗。就像操作系统一样,程序员必须具有较好的中断处理能力。</p>    <p>程序员最好的学习方式是阅读别人的优秀代码,并拿来自己运用。尤其是那些开源的基础库的代码和项目,因为开源库的东西需要面向更多的程序员并为之所用,必须具有普遍可接受容易理解的体系结构和优化高效的实现逻辑。上学的时候,就有一些比较牛的同学通过阅读Linux内核源代码来提升自己的专业素养,因为这种源代码是无数高水准的前人智慧的结晶,必然有很多可以学习和仿效的地方。</p>    <h2>一些针对性的建议</h2>    <p>互联网从业者的职业规划可以根据自身的特点综合考虑PM,RD,QA等这些职位,选择适宜的职业方向。如果确定了要做程序员,你需要从以下这些方面着手:</p>    <p>1、学习掌握C/C++程序语言。学习的方法不建议一味地看书,最好是多写些典型的小程序运行运行(教材上或者网上应该有很多,诸如链表算法之类的实现等),在实践中学习进步。相关书籍的话,基础语法书就好,C++ Primer(这种很厚的书一般我是看不进去的,都是拿来当字典一样查阅的,而不是当教材来学习)。</p>    <p>2、多进行工程实践,课程设计或者毕业设计这种系统级别的工程实践。最典型的就是用MFC图形界面(或者C#)和sql sever(或者My sql)实现一个图书馆管理系统,这里面就不单是程序语言的问题了,更重要的是架构规划和设计思想,包括数据库的设计、界面逻辑的设计、程序结构的设计。这里面就会涉及sql数据库,界面开发等不同的技术。这其中,安装数据库及开发工具并最终打通界面与数据库初步构建一个系统对于一个初学者来说是一个大的挑战,也是提升能力的关键。当然也可以做PHP网站项目,或者Andrdoid IOS等手机项目,这些应该比MFC项目更加有前途,图书馆里面或者网上应该可以找到很好的训练项目。这样的项目实践对提升程序员的技术能力和解决问题的能力有很大功效。</p>    <p>3、找实习,在企业里面亲身实践,努力提升。企业工作环境能够提供不同于学校的学习和进步的环境,尤其对于程序员来说更加不可或缺,实习的话就不要过多关注待遇,更多的要关注如何脚踏实地地干活,从而提升技术实践能力。我毕业前曾经在杭州一家做手机软件的企业实习过近一年,自认为提升非常大,如果没有那一年的实践经验我也基本不可能来到现在的单位。当然,实习单位也可以是就业的一个选择,如果合适的话,一般实习单位很容易接收在那里实习过的人的,毕竟培养一个员工并不是一件轻而易举的事情。</p>    <p>4、关于应聘求职。在我之前写的求职感悟之中也提到过,程序员求职笔试是一个门槛,你必须进行充分准备,只有通过了笔试你才能获得进一步的机会。另外受挫折是不可避免的,你需要不断地尝试,在各种笔试面试中积累经验,提高应聘技巧,以求能够抓住后面的机会。</p>    <p>关于书籍方面,如果针对提升求职技能的话,C++(JAVA)程序员面试宝典,C和指针这类专门应对应聘的书籍是很适用的。另外为了真正提升专业素养,也可以尝试一些层次较高的书籍,如设计模式、thinking in C++/java之类(我这里所列举的并不一定是最好的,也不是全面的,网上可能有更好更多的推荐)。</p>    <p>5、程序员的基本技能。一般情况下,一个合格的程序员除了需要掌握一门程序语言外,还需要了解和掌握数据结构及算法思想、操作系统原理、数据库原理、网络技术(TCP/IP)等等。这些都是程序员的基本技能,而加强这些技能的有效方法就是在简单学习理论知识的前提下通过工程项目实践来深入理解和运用。</p>    <p>至于半道出家或者非专业出身,我还是那个观点,项目实践是提升程序员技能的唯一有效途径,程序员招聘非常简单,就是看你会什么,做过什么,有潜力做什么。只要你实践足够多,经验足够丰富,不在乎你的出道时间和是否专业出身。我个人上大学以前,在电脑面前基本就是个白痴,大学时粗浅地学过C/C++,大二以后才有自己的电脑,后来修了个计算机双学位才有了一些基本的专业素养。不过提升最大的还是在自己做课程实践和毕业设计的过程中得到的。在我看来成为一个合格的程序员的门槛相对来说还是比较低的,稍微入门之后,课程设计这种级别的实践是的物质代价和时间代价都是比较低的,一台电脑,一本指导书,少则几周,多则上月就可以完成一次实践。对于培训的话,其实我也不是很了解,如果有助于你进行项目实践,那自然也是可以考虑的,如果纯粹像学校一样授课而不能推进实践,那么不去也罢,还不如自己利用这个时间自己亲自动手探索。</p>    <p>总之要想得到好的结果,关键还是靠自己的毅力和决心。</p>    <h2>程序员的焦虑</h2>    <p>人无远虑必有近忧。由于程序员工作的特殊性,他们普遍存在一些焦虑。</p>    <p>1,健康问题</p>    <p>由于长期久坐,各种颈椎腰椎问题在程序员中普遍存在。同时久坐不运动引发的脂肪肝超标也非常常见。此外,长时间不间断劳作引发的身体突发异常情况的现象在程序员中时有发生。这些健康问题一直都在生理和心理上困扰着广大的程序员,而无法得到妥善解决。</p>    <p>2,生活问题</p>    <p>早出晚归的生活节奏,加班赶工的工作常态,使得程序员陪伴家人的时间和精力普遍减少。从某种程度上来说,程序员相对较优越的收入是以减损人性化生活为代价换取的。这也是许多程序员的痛处。</p>    <p>3,前途问题</p>    <p>必须承认,程序员这样的工作不能不说是靠吃青春饭维持的。在我们这样的单位,几乎很少看到四十岁以上的程序员,即使有,可能也不是写代码的角色了。上了年纪的程序员是无法适应需要快速学习频繁变更的工作任务的。一种通常的想法是,走管理路线。这当然是可行的,然而是不是任何程序员都适合走管理路线,或者有管理路线可以走呢——毕竟能够最终走到企业上层的人还是占少数比例,况且上层的岗位也是有限的。还有一种想法是,自己干,创业!无可否认,程序员创业的成本和门槛相对来说是非常之低的——几台电脑,一个可以上网的工作室,几个志同道合的人和一个美好的梦想,足矣!但非乐观主义者总是不难看到前路的障碍重重和成功的机会渺茫,毕竟梦想总是丰满的,而现实多是骨感的。人们所乐于仿效和推崇的成功者们,很少不是踏着累累白骨走上耀眼的巅峰的。总之,程序员终究需要为写不动代码的后半生做好心理准备和打算,这也正是焦虑来源。</p>    <p>写了这么多,也差不多了,都是自己的一点思考和感悟。但愿可以对你的规划能够有一些有利的引导和启发,其中的观点只做参考,也不能忙信,毕竟一个人的思维和见识总是有限的。</p>    <p> </p>    <h2>附件:一封意外的职业求教信</h2>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/de0e02e6041c3b953e8ea1aa9be2b04b.png"></p>    <p> </p>    <p>来自:http://www.jianshu.com/p/8a643815c11f</p>    <p> </p>