心态差距
近年来由于互联网的迅速发展,全国各地,IT人才的需求量都出现了飞跃式的增长,程序员的薪资也明显高于其他行业。
但在国内,真正因为热爱编程而从事这份工作的人其实并不多,很多人学习程序想得都是这个行业火,赚钱快,入行门槛低。什么技术火就学什么,然后进入一个大公司,做几个成功的项目,积累工作经验,几年以后自己当个小管理,拿着十几万,或几十万的工资,再无追求的过着小日子就好。
甚至到了30岁,如果没能进入管理层,大多数人都会考虑转行,或仅靠自身的知识累积开始创业。
美国程序员大多数都是因为热爱编程行业而从事这份工作的,他们会专注某一个领域几十年。50岁以上的程序员还会安心待在同一个岗位写代码,专研技术。他们想法很简单, 对于编程这种事情更多的是那种单纯似的热爱。
影响因素:国外的程序员,专心写程序并专研,他的级别和工资就会年年往上涨,和做管理的人员没太大区别。国内的程序员这方面就杯具了,写程序的工资基本低于管理者,迫于现实的生活压力,不得不往赚钱更多的方向走。
沟通能力
和美国程序员交流的时候,你能从他的切入点和具体思路很清晰的理解他的问题,在阐述问题的时候背景信息也给得相当全面,所以理解他们的问题比较简单容易。
中国程序员阐述问题时逻辑思维不清晰,背景知识没给全,讲了很多,但大家都get不到他要表达的重点,有些人一味的自顾自说,完全不去思考和理解别人给他提的建议。
影响因素:编程所用的英语,比较是美国人的母语;另外就是思维方式的不同。
解决问题能力
如果给我们中国程序员,规定好的方案,他们普遍完成的非常好。但如果没有具体方案, 完全是一个开放性课题,很多时候程序员会完全无法下手。
美国程序员这方面能力比较好, 他们的探索研究能力非常强, 经过一定时间的研究后, 能提出一套非常具体有效的方案然后一步一步去解决问题。
在一定程度上,这种差距就如同现今机器学习和真正智能的差距。机器学习可以解决很多特定领域的问题,模型可以优化得越来越好,但优化的尽头也不是真正的智能。
影响因素:两国教育方式的不同,一个善于解决问题, 另一个善于发现探索问题。
技术实力
工作初期两国程序员差距不大,5年是个分水岭,这之后开始出现变化了,在中国多数人工作个5-6年就开始琢磨转管理。虽然这5-6年我们代码上的时间,积累的经验可以说很多时候是高于美国程序员的。但在某一项技术上我们有多少人专研超过10年,所以在国内出现了程序员吃青春饭这种理论。
而美国程序员10年以上经验的人有的是。 例如,一个工作经验是30年, 从dos时代就开发debugger一直干到现在, 一个24年工作经验外加5年的博士研究经验, 还有两个从毕业到现在一直从事CLR diagnostic api的开发到现在基本都干了十几年了。
在国内真的很难想象有这种团队。 记得stackover上统计过, 程序员的黄金年龄应该在40岁左右, 但我们国内40岁的时候有几个还愿意写程序呢。cocoachina上,一篇写了40年程序的人发表的文章,竟久居排行榜前列不下!
职业诉求
中国的程序员更需要关注物质回报,因为我们的文化强调尽早买房买车。欧美人在这方面要轻松自由得多,有大把的时间去尝试创造,但其实大部分人是不创造的,只是概率比中国大而已。
中国人妄自菲薄没有“创新”能力,是没有意识到自己到了创造力高峰的时候却被现实牵绊,我们用自己的青春和人家的大半生去比较,当然妄自菲薄了,人家可以投入的时间就比你多得多。中国程序员职业黄金时期所要面对的干扰非常大,首先是要让自己融入英语的技术圈子,其次是要应付一个不争气没追求强加个人的世俗文化。
当然小编并不是在长他人志气,灭本国威风,只是想小小提醒作为程序员的你,一定不要以学编程、拿高薪作为自己唯一的人生目标。就好像创业路上的你,无论在什么时候,我们都要不断提升自己的专业度和竞争力,永远保持一颗热爱自己事业的工匠之心,坚定的走下去。互联网行业千变万化,要不断的学习,更新知识系统,才能永远不被这个社会所淘汰。
在我平时所见到的程序员中,如果纯以编码能力来看,个人觉得可以分为五类,依次是:
1.拷贝型
拷贝型选手就是传说中的“代码拷贝员”了,他们对实现功能几乎没有思路,所作的事情就是从网上或是之前其他团队成员写的代码中拷贝出片段,然后放到项目中,如果运行项目出现了期望结果,则表示任务完成。
这类人只会改代码,却不会写代码。他们大多对编程毫无兴趣,只是希望以此糊口而已。
2.新手型
当产品有功能需求时,由于经验有限,程序员并不完全知道要如何实现这个功能,需要通过学习、寻找资料等方式来解决问题。
这种情况下的编码过程,程序员的主要目标是“完成功能”,那么很难有多余的心思去考虑边界条件、性能、可读性、可扩展性、编码规范等问题,因此代码bug可能较多,稳定性不高。常常会发生开发花费1个月,改bug却要改上好几个月的事情。
3.学习型
这类程序员对所在领域的语言已经比较了解,对于一般功能可以有较为清晰的实现思路,给出需求时可以通过自己的思路来实现,并且会一定程度上考虑边界条件和性能问题。但仅此而已,他们对可读性和可扩展性考虑很少,也没有项目级别的考虑,主要是希望通过实现代码来练手或是学习。
这类程序员最大的表现在于喜欢“创造代码”,即使有现成的实现,他们也希望自己来实现一套,以达到“学习”的目的。他们不喜欢复用别人的代码,看见项目中别人实现了相类似的功能,他们会以“需求不同”的借口来自己重新实现一套。这类人一般来说对技术有着较为浓厚的兴趣,希望能够通过项目来进行学习。
从项目的角度来说,这种做法最大的麻烦在于开发周期可能较长(相比直接使用现成的实现),并且会使得项目代码膨胀,影响未来的维护。但这类程序员由于有兴趣,如果好好培养或许会成为明天的牛人。
4.实现型
这类程序员一般有较为丰富的经验,由于写得太多,因此不再追求“创造代码”来进行学习,同时对所在领域可能涉及的很多第三方框架或是工具都比较熟悉,当接受到产品需求时,对功能实现方案已经了然于胸,因此他们可以快速的实现需求,并且对边界、性能都有一定程度的考虑。因为能够快速实现需求功能,经常会被团队评价为“牛人”。但他们一般仅仅停留在“完成功能”级别上,对代码的可读性、可扩展性、编码规范等考虑较少,对项目总体把握也较少(例如控制项目膨胀、方便部署等架构级别的东西)。
这类程序员最大的表现在于喜欢“开发项目”,却不喜欢“维护项目”。他们产出的代码最大的问题就是维护较为困难,可能过上几个月回头看自己的代码都会晕头转向。因此即使是自己写的代码,仍然不愿意维护,一般会苦了后来人。
因为接口设计的缺乏,当需求变更时,发现代码要改的东西太多,然后抱怨需求变化,却很少认为是自己的代码问题。这样的项目如果经过长时间的变更维护,最终会变得难以维护(一般表现在需求变更响应时间越来越长)甚至无法维护,最终要么是半死不活,要么是被推倒重来。
5.架构型
这类程序员比实现型更进一步,他们经验丰富,对相关框架和工具等都很熟悉,“完成功能”“稳定性”“性能”这些已经不再是他们的追求,更优美的代码、更合理的架构才是目标。
这类程序员代码设计大多建立在对需求的详细了解和对需求变更的预测上——可扩展性较好;代码细节也尽量多的考虑边界情况、性能——稳定高效;代码命名和注释都恰到好处——可读性较高;同时在开发过程中他们会不断重构,对代码做减法——保证项目可持续发展;等等。
但由于考虑问题较多,单从“实现功能”阶段来看,完成速度不一定会比“实现型”要快。只是到了项目中后期优势才会慢慢体现出来
也许还有更优秀的程序员我没有见过,呵呵,欢迎大家补充。
抵制程序员鸡汤
有很多特质使得一个程序员是优秀的程序员,那么什么特质都没有的自然是一般的程序员了。
1. 创造型/创新型
以创造/创新为乐的程序员。以新的方法解决现有问题,发明方法解决尚未解决的问题。问题本身并不限于技术领域。硅谷很多技术创始人具备这类的品质。虽然他们创业后都不再全职写代码,但他们这种品质贡献了他们事业的第一步;
2. 管家型
以管系统演化为乐的程序员。有洁癖,有强迫症,容不得系统有一点的瑕疵。如果你招聘了一个程序员/架构师,2-3年后你的互联网产品再也没有在可见/可扩展性上遇到瓶颈,他多半是这种程序员;
3. 学院派型
通常在CS某一领域拥有博士学位,或者深受他们的影响的人。对该该领域兴趣浓厚,通常参与企业核心竞争力相关的研发工作。当然,也有一部分也具备第一种特质,中途去改变世界去了;
4. 经验型
在行内具有多年丰富的经验,可承担责任,考虑全面。团队拥有了这种人,通常会少走很多弯路。但面对新的挑战还是要和其他人站在同一起跑线上的;
5. 钟表匠型
喜欢并擅长把一个系统从里到外研究通透的人。分享出来都是从里到外让人垂涎欲滴的干货。很多后端工程师都是这种类型;
6. 折腾型
擅长“折腾”,方案没有最好的,只有最难的。:)兴趣广泛动手能力强,通过折腾留下很多技术积累。想用哪一块的新技术?先问问他把,8成他很久前就已经玩过了;
7. 肉盾型
哥甲高血条长,加班如同切菜一般,逼急了不睡觉也行。只伸手要过两件东西:原型和咖啡。适合打闪电战。当然,可能事后要打打后勤重构下代码。
优秀的程序员,会尽量避免犯这篇文章里提到的这些错误:像专家一样思考,像外行一样实践!
看过一篇文章:以色列军队是世界上最好的孵化器
文中提到:以色列军队中有一种很特别的现象,基础训练给所有士兵设定了许多必须服从的条条框框。但当你成为一名下级军官以后,就需要学会自己思考解决问题。另外,即使基础训练使你具备了执行任务的基本条件,但要完成任务,必须要发挥自己的创造力。
不少人会看重上面这段话后面提到的创造力,在这里我感触更深的是“基础训练给所有士兵设定了许多必须服从的条条框框”这句话——这说明先约束、先有诸多规矩,是日后能发挥创造力的基础,这和我们中国练书法要求先一丝不苟练习楷书,到有一定基础了才能修习行书乃至草书是一个道理。
在中国IT行业的“好工程师”应该是什么样的?有哪些客观标准可供自我评估?这个回答中,列出了软件工程师能力自我评价表(37条)。优秀还是一般,看看37条做到了多少。
在构建之法——现代软件工程这本书的第三章软件工程师的成长里,小编写了一节技能的反面
在我看来,没有优秀程序员和一般程序员,只有程序员和码农。
如果按排名第一的 的答案来分类,那就是5是程序员,1234是码农。
举个栗子:
A:对于我们这种需要多方合作的项目,还是用git比较方便管理。
B:svn很牛逼的!我用了很多年了!
A:git的分支很方便,合并操作相当简洁且没有负担。
B:svn也有分支!百度上说svn更适合企业!
A:git只有一个.git目录来管理所有版本,在排除的时候很方便!
B:svn现在也支持单 .svn目录了!
再举个栗子:
A:为什么我们网站的根目录下面还有个.settings和.project文件夹?
B:我上传时候直接用flashfxp一拖就上来了,没看有什么文件夹。
A:为什么我刚才pull之后在项目库下面多了个 未命名.txt 文件?
B:嗯,那是我自己做笔记备份用的。
三举个栗子:
A:为什么Hero这个类有1万行?
B:我觉得把所有功能写在一个类里面很方便啊!
A:为什么这段代码复制了4次?封装成函数啊!
B:啊!有么?
A:这几个类为什么不用适配器模式?
B:什么是适配器模式?
最后举个栗子:
B:怎么加一个Sprite到Node中?
A:Node.addChild(Sprite)
B:我要在加的时候设置层级关系!
A:RTFM!
码农真正意识(而不是调侃)到自己是码农的时候,TA才可能成为一个程序员。
而当TA成为一个程序员的时候,TA才有资格站在山脚下,憧憬着那那高耸入云的峰顶,开始攀登。
目标已经有了,下面就看行动了!记住:学习永远是自己的事情,你不学时间也不会多,你学了有时候却能够使用自己学到的知识换得更多自由自在的美好时光!时间是生命的基本组成部分,也是万物存在的根本尺度,我们的时间在那里我们的生活就在那里!我们价值也将在那里提升或消弭!
Java程序员,加油吧