针对工做几年的程序员工程师,常常会遇到瓶颈,这个瓶颈不必定技术上的,也多是职业发展上的。通常技术的职业规划会有两个方向。php
技术方向:java
架构师,系统分析师,CTOpython
这种每每是走纯技术路线,发展到最后都是在公司中深刻某一块技术,例如存储,MQ,通讯,等等。后面发展路线也每每是架构师/系统分析师,技术专家,高级培训师,而后就是技术总监。ios
业务方向:c++
产品经理,项目经理,部门经理,CEO程序员
我以为业务方向更多的是关注项目,针对当前业务,很是了解业务的整个流程,而若是有些业务由于特殊性,会遇到技术难点,要么让公司基础技术部提供解决方案,要么扔给手下人去作技术调研以及技术攻坚,若是本身部门针对这个技术作出了不少成绩,那么能够分享推广到全公司去使用,你们都来调用你的接口,都来参阅你的文档,可想你本身也是很是高兴的。web
但是我一直以为,若是技术不懂业务,不了解业务痛点,没有产品思惟,那么也没法针对技术作出改进、改善。业务驱动技术,根据不一样的业务,会有特殊的技术要求,实时性高、稳定性强、多数据聚合计算等等,都考验了程序员的技术储备,亦或者技术攻坚水准。编程
这两天读了本书《我编程,我快乐》,第一眼看书名,我觉得是某个国内无良人士出了一本骗钱的书,可是后来看到是外国著做,国人翻译且豆瓣评论还不错,所以就耐心的看了下去,总体还不错。下面针对本书写一些心得:swift
作一个通才ruby
顶尖的程序员都每每是某一个领域的专家,其余领域大部分都是兴趣所致,你能够理解他不如专精领域那么厉害,可是也比普通程序员要厉害的多。
咱们在项目中,每每不可能只使用一门技术,每每都是多门技术并行前进,所以多会一门技术就表明着多一种解决方式,多一个思考方向,也许新的解决方式每每比你固有的思惟更加有效,这也是为何如今流行混合编程。
记住,是咱们选择编程语言和技术,而非它们选择咱们。一样的项目下,我用ruby写出的web应用更加迅速,30天也许就能发布上线,而你使用java也许须要3个月。而若是你用ruby去写通讯服务,也许你30天就能搞定,可是远远没有java来的稳定。真正的大牛是针对业务场景去选择技术,而不是在某个特定的技术框框下去完成任务,所以程序员须要作一名通才。固然这个通才指的是某个领域中的通才,切记不能好高骛远,什么都学,什么都只会皮毛,那不如不学。
跳出本身的温馨区
不少程序员都会下意识的标榜本身是一名c++程序员,java程序员,ios开发,安卓开发,php程序员等等。可是他们每每忽略了一个事实,就是你首先是一名程序员,有意无心的将本身绑定在某个领域或者某一个语言上是很是危险的事情。
众所周知,摩尔定律,每18个月硬件行业会有一次革新。而软件行业也同样,当你的机器性能已经很是好,不用在关注性能自己,不用苛求运维在多分配一些内存给你,多一些带宽给你的时候,每每性能就不是那么重要。也许你说你用c++开发的服务性能高,可是跟开发的人力成原本对比,这点提升也许并非显而易见的。若是你用java开发服务,那我以为这个选择极可能是正确的,可是若是你用java去开发一个web后台,那我只能说,傻逼。所以跳出本身的温馨区,去学习更多的新技术,或者不同的技术,也许你会有不同的收获,也许你已经厌恶了面向对象编程,面向接口编程。实现某个功能,必须先去定义一个类型,或者接口的时候,或许你也能够试试面向过程编程,或者函数式编程。这也是函数式编程近年来很火的缘由,由于随着硬件的发展,函数式编程在之后性能不给力的缺点已经慢慢被忽略,转而提现了他高并发的优势。
若是你这个时候还一直强调函数式编程性能不行的固有思惟,那么你也许该考虑本身是否是该充充电了。
举个例子:
以前公司业务扩张,招揽了不少java程序员,可是由于咱们公司原先架构都是php的,让那些java程序员来写php,他们成天嗷嗷叫,痛苦不堪,我原先以为奇怪,难道php开发比java还难么?
后来证实我错了,并非php的门槛比java高,而是他们不愿跳出本身的温馨区,从心底生成了一种抵触的想法,从而致使他们工做的并不开心,可是公司招聘你进来是为了创造价值的,真正厉害的程序员针对各类技术都是信手拈来,而且我相信,我学习到的任何技术,在未来都是有用的,也许只是时间未到。在10几年前,你会想到带有GC和面向对象编程的开发语言会如此之火么?如今又有哪一个新兴开发语言没有这两种东西的,因此千万不要一直保留着本身那可怜的固有思惟,试着跳出温馨区,也许你会看到新大陆。
对本身喜欢的事情投入100%的热情
我有个优势,也正是个人缺点,当我喜欢作某个事情的时候,我会投入100%的热情,说废寝忘食也不会过。由于这段时间内,我满脑子都是这件事情,甚至睡觉上厕所,吃饭,走路都会想着它,这样的优势让我能迅速掌握某个新技术。可是每每由于这样,也一样让我产生了我是天才,学什么都很快的错觉,从而致使本身不少东西都学不精通就放弃了。我以为之后须要更正这个错误的想法。
好比以前公司项目中有一个图库,全国各地的用户上传图片到服务器,以为很是简单,可是正由于很是简单,里面须要涉及的东西却很是多,各地的用户使用的网络环境不一致,他们的通讯节点也不一致,怎么保证每一个人的上传速度都是可控的。
当某个用户忽然没法上传的时候,怎么办?难道跟用户说我这里好好的,别人也是好好的就你那里不行?所以我针对每一个人的上传记录,作了一些记录,记录每一个用户的上传速度,上传ip,以及上传文件大小,还联系cdn服务提供方,开启了服务日志,记录每一个人的上传状况,而且增长了动态请求分配节点,防止某个区域某个节点忽然挂了,而致使用户没法上传图片。这个系统刚上线的时候,基本上传1万张图片会有100屡次的甚至1000次的失败,而如今,随着系统愈来愈完善,愈来愈稳定,失败次数已经下降到了两位数,甚至个位数。而且针对产品上也作出了相关的修改,例如友善的告诉用户为什么会上传失败,是不支持图片大小,仍是不支持图片格式,千万不要高估用户,用户不知道图片有多大,也不知道本身用的单反有多厉害。曾经有个用户上传了个图片一直失败,结果我看了下那个图片有70多M,而个人服务当时最多就支持18M,虽然知足了大部分的请求,可是个别状况下也是会挂,最后我也修复了这个问题。
总结起这个项目,我以为后期维护的期间,我学到的知识比开发期间多的多。所以我想说,投入100%的热情,并锲而不舍,我知道这是很是难的事情,也正由于如此,技术专家、资深大牛才那么稀缺。
站在巨人的肩膀上
另一点提升本身瓶颈的方法就是借鉴前人的代码,程序员这个行业,并不必定非要什么都不看直接写,也许你在有基础的状况下,直接开始写,遇到问题在查找问题会来的更加容易上手。可是正由于这样,你写出来的代码每每质量很是差,优化性不够,语法啰嗦,不够优雅,所以咱们要学会多从其余人的代码中汲取优势。多逛逛开源社区,针对本身感兴趣的方向去学习别人的代码,也是进步的一种方法。最讨厌某个前辈或者资深人士说,看什么看,直接写,这样的说法是极其不负责任的。
作团队最差的人
作团队最差的人,当你以为其余人都比你优秀,那么你天然而然就成为了最差的那我的,跟比你优秀的人工做,会让你更加的快乐,学习到更多有用的东西,也许宁作凤尾,不作鸡头也是这么来的。而作团队最差的人,每每能够有很是强的学习动力,以及很是迅速的成长空间。不然只有固步自封,100行代码写了一万次,有什么意义么?
学习如何失败
越早的发现问题,就能越早的弥补损失,你应该庆幸如今发现了这么多bug,而不是上线的时候,你也应该庆幸人少的时候发现了这么多bug,而不是用户拥堵的时候。若是你的软件没有按期向你抱怨,你就不知道危险的故障隐藏在哪里,此外带着防护性的措施进行编程也是很重要的。出现问题的时候,才是考验软件开发质量的时候,出现问题的时候,解决方法、解决思惟也是检测工程师技术的时候,学习处理也是很是重要的。
1.所以发现问题第一时间提出,在开发和测试中,越早发现错误,形成的问题就越小,越早发现而且暴露本身犯下的错误,形成的负面影响也就越小。
2.接受批评,也许这个问题并非跟你有直接关系,也许只是间接关系,也许压根跟你不要紧。可是当出现问题的时候,咱们第一时间须要的是解决方案,而不是互相甩锅,咱们的目标是在最短的时间内解决修复问题,在谁来负责这个问题上纠缠不清的后果就是拖延解决问题的时间。
3.寻求帮助,当咱们遇到困难的时候,必定要学会跟团队成员互相沟通,寻求解决方案,而不是由于责任感和自尊心而掩饰问题,以及拖延问题。没有人不会犯错,越是及早的解决问题,越是能减小问题带来的负面影响.
说“不”
在团队中,常常会遇到需求方给你提出某个需求,也许你以为这个需求不合理,可是仍是碍于同事的面子抽时间给他完成这个需求,这个时候你在同事的眼里也许就是负责的好同事。可是也许你遇到的只是一个不动脑子,或者压根只是抱着试一试态度的产品经理。没有通过完整的调研,只是拍拍脑壳以为用户可能会喜欢这个产品,没有作出需求调研就话了一个prd给你扔了过来。若是项目表现不错,你的努力受到了你们的承认,那么皆大欢喜。可是若是这个项目最后仍是失败了,那么你付出的努力也会白白浪费,也许这个项目仍是你抽空闲时间,大晚上熬夜写的。
因此在需求方提出需求的时候,你必定要问他,作这个功能的意义是什么?你有数据作出支撑么?这个功能对咱们现有的产品会有什么影响以及正面做用?没有数据支撑的需求一概说不。我手上事情还没作完,就由于你一个拍脑壳想出来的点子,就让我陪你一块儿疯?记住,战术上的努力并不能弥补战略上的懒惰,若是方向从一开始就是错误的,那么为何要一直错误下去?及早回头,回头是岸,也许有人会说,互联网就是不断迭代,不断试错的过程,那请问你在进行以前有通过详细的规划么?有详细的数据支撑么?如何看出你这个需求就是很是紧急,如何看出你这个需求一上线就会有N多的人乐此不疲的使用的?若是没有,请你先去想清楚再来讲话。试水的前提是我大概知道这个水有多深,而不是一无所知,否则为何没有人去试海?试洋?
上面都是从业务上面来讲的,下面说说技术上。
当你的项目经理问你是否能完成这个任务的时候,你模棱两可的说能够,也许行,好像行,也许你的项目经理只是询问下你需不须要帮助,又也许你的项目经理听了你的回答,会跟大老板拍板保证,这些都是创建在他对你的信任上的。或许你只是想表现的不那么弱,或许你只是想在你上司面前表现一下,我不是部门最菜的。可是这种信任是慢慢积累起来的,若是有一次你让他失望了,两次让他失望了,甚至三次,那么这种新人就会崩塌,你能够说"我不肯定我能hold住这个项目,这是一次挑战,但我想要试一试。"这就是很是好的答案。提早告知你上司这个项目会遇到的风险点,以及不肯定因素,我想他更愿意给你更多的时间去调研,去整理整个项目的技术难度。
勇于说"不"的人作出的承诺更可信,也更有份量,我不知道并不表明我不可靠,某个领域内的专家对于他们不知道的事情,老是敢于认可。
价值僵固
正如上面所说的跳出本身的温馨区同样,价值僵固依旧也很可怕,不少前辈都喜欢对后辈们谆谆教导,一部分前辈会把本身踩过的坑,遇到过的问题告诉你,你吸收了这些话,那么之后能少走不少弯路。可是若是这个前辈的思想已通过时,或者已经落伍了呢?他的成功经验每每还停留在他们本身的那个时期,他们以为本身的成功能够复制,但他们每每忽略了风向,站在风口,猪也能飞,若是有个公司的CTO跟你说他是学delphi起家的,让你去学,你信么?你要知道delphi在二十世纪初,在C/S那个年代但是很是火的,而如今,你出去找工做,估计都找不到。因此能够听信前辈们的一些话,可是也不能全听,每一个人都须要有本身的判断力,以及独立思考的想法,这是很是重要的。
我老弟跟我说,他想考公务员,我说为何?你知道公务员作什么的么?你知道公务员是怎么工做的么?他说不知道。他父母让他考的,以为够稳定,他父母对公务员的认知还停留在他们那个时期,稳定,工资高,工做舒服,压力小。可是随着公务员的人流愈来愈多,公务员已经不像之前那么吃香,福利没有那么好,竞争压力也很是大,几万我的去争取几十个岗位,这尼玛比高考难多了好么?
现现在,高考制度只是帮你走入社会的敲门砖,相对而言最公平的一种人才方式,可是这种方式之后,未来确定会改变。而大部分学生都不知道高考意味着什么,对本身的未来意味着什么,甚至不少人为了进入某个大学,而匆匆报了个本身都不知道是什么的专业,就去上课了。有的人及时醒悟,他们是幸运的,而有的人一路走到黑,你说是他们本身运气差?仍是当今的人才筛选体制不够完善呢?
再举个例子,不少人说外国的数学物理很简单,可是他们每每坐进观天。外国人教育的思想是兴趣引导,若是你没有兴趣,那么只让你学习些基础知识就好,若是你有兴趣,甚至未来会进入这个行业,那么授课的难度也会加深,由于兴趣是学习的源动力,而压迫式教育不是。这不得不说是咱们这一代的悲哀,可是我相信将来会越来越好,愈来愈完善。
不知不觉写了这么多,主要本身想说的话也太多,可能有些啰嗦,耐心看到这里的人,也是厉害。
总之我以为不少程序员进入这个行业都是兴趣所致,也有部分人是由于想要找一个合适,体面的白领工做而进入这个行业,可是,在这个行业里面厉害的,就是那种真正专一技术自己的人,他们每每都是稀缺人才,可遇不可得的厉害人物,而这些人大部分都有几个特色。
1.从不制定本身的职业规划,我写代码彻底就是兴趣所致(任性)。
2.我制定项目技术方案是根据项目业务需求自己,而不是单单从技术的角度出发,所以程序员在应对大部分场景和工做需求中,广度比深度更加剧要,可是若是你想要专精某个单一领域的知识,而且成为专家,那么深度就比广度重要的多,而这种人才一样难得。
3.跳出本身的温馨区,大牛会写的代码有不少。从c,c++,java,到php,ruby,python,js再到go,swift,haskell,erlang统统信手拈来,并非别人天赋有多强,而是人家能适应新技术,跳出本身的温馨区,慢慢积累,致使看起来比别人厉害的多,你要相信,凭现现在大部分人的努力程度,还远远轮不到拼天赋的时候。
4.投入100%的热情,大牛写代码不是为了钱,而是本身喜欢。
5.学会处理人际关系,以及表达自我想法,沟通能力,也是程序员须要掌握的一件事情,由于你的上司看重你的表现的,每每不是你实现某个功能的细枝末节,而是你对于整个项目的把控,以及沟通。他须要的只是结果,而不是过程,所以每每沟通能力强的资深程序员,最后都会往高层去发展,慢慢转为管理层,而若是你只是想要安静的写代码,不想被这些无聊的事情干扰的话,那么你能够忽略这一点。作一个技术资深大牛,可是你要知道,这个行业不少资深大牛每每都是沟通能力强,技术高深的体现,除非你是求伯君,一我的单干的兰博式英雄。可是随着年代发展,团队式工做已是主流,你没法一我的去单一的实现某个任务或者功能。团队式开发针对开发效率,项目进度,项目复杂度,以及成本控制都比单一人员要好,而团队式协做就代表,你必需要有最基本的沟通能力。
若是让我在职业规划上作出一种选择,我但愿技术走广而不深的路线,业务上也同时齐头并进。虽然整理文档,写项目汇报总结这些文档会让我痛苦不已,可是我以为这才是我应该走的路,也是最适合个人路。不过,也许过一段时间,我就不这么想了。