郭凛:手艺人,自学编程18年,创业中
在我平时所见到的程序员中,如果纯以编码能力来看,个人觉得可以分为五类,依次是:
1.拷贝型
拷贝型选手就是传说中的“代码拷贝员”了,他们对实现功能几乎没有思路,所作的事情就是从网上或是之前其他团队成员写的代码中拷贝出片段,然后放到项目中,如果运行项目出现了期望结果,则表示任务完成。
这类人只会改代码,却不会写代码。他们大多对编程毫无兴趣,只是希望以此糊口而已。
2.新手型
当产品有功能需求时,由于经验有限,程序员并不完全知道要如何实现这个功能,需要通过学习、寻找资料等方式来解决问题。
这种情况下的编码过程,程序员的主要目标是“完成功能”,那么很难有多余的心思去考虑边界条件、性能、可读性、可扩展性、编码规范等问题,因此代码bug可能较多,稳定性不高。常常会发生开发花费1个月,改bug却要改上好几个月的事情。
3.学习型
这类程序员对所在领域的语言已经比较了解,对于一般功能可以有较为清晰的实现思路,给出需求时可以通过自己的思路来实现,并且会一定程度上考虑边界条件和性能问题。但仅此而已,他们对可读性和可扩展性考虑很少,也没有项目级别的考虑,主要是希望通过实现代码来练手或是学习。
这类程序员最大的表现在于喜欢“创造代码”,即使有现成的实现,他们也希望自己来实现一套,以达到“学习”的目的。他们不喜欢复用别人的代码,看见项目中别人实现了相类似的功能,他们会以“需求不同”的借口来自己重新实现一套。这类人一般来说对技术有着较为浓厚的兴趣,希望能够通过项目来进行学习。
从项目的角度来说,这种做法最大的麻烦在于开发周期可能较长(相比直接使用现成的实现),并且会使得项目代码膨胀,影响未来的维护。但这类程序员由于有兴趣,如果好好培养或许会成为明天的牛人。
4.实现型
这类程序员一般有较为丰富的经验,由于写得太多,因此不再追求“创造代码”来进行学习,同时对所在领域可能涉及的很多第三方框架或是工具都比较熟悉,当接受到产品需求时,对功能实现方案已经了然于胸,因此他们可以快速的实现需求,并且对边界、性能都有一定程度的考虑。因为能够快速实现需求功能,经常会被团队评价为“牛人”。但他们一般仅仅停留在“完成功能”级别上,对代码的可读性、可扩展性、编码规范等考虑较少,对项目总体把握也较少(例如控制项目膨胀、方便部署等架构级别的东西)。
这类程序员最大的表现在于喜欢“开发项目”,却不喜欢“维护项目”。他们产出的代码最大的问题就是维护较为困难,可能过上几个月回头看自己的代码都会晕头转向。因此即使是自己写的代码,仍然不愿意维护,一般会苦了后来人。
因为接口设计的缺乏,当需求变更时,发现代码要改的东西太多,然后抱怨需求变化,却很少认为是自己的代码问题。这样的项目如果经过长时间的变更维护,最终会变得难以维护(一般表现在需求变更响应时间越来越长)甚至无法维护,最终要么是半死不活,要么是被推倒重来。
5.架构型
这类程序员比实现型更进一步,他们经验丰富,对相关框架和工具等都很熟悉,“完成功能”“稳定性”“性能”这些已经不再是他们的追求,更优美的代码、更合理的架构才是目标。
这类程序员代码设计大多建立在对需求的详细了解和对需求变更的预测上——可扩展性较好;代码细节也尽量多的考虑边界情况、性能——稳定高效;代码命名和注释都恰到好处——可读性较高;同时在开发过程中他们会不断重构,对代码做减法——保证项目可持续发展;等等。
但由于考虑问题较多,单从“实现功能”阶段来看,完成速度不一定会比“实现型”要快。只是到了项目中后期优势才会慢慢体现出来
也许还有更优秀的程序员我没有见过,呵呵,欢迎大家补充。
如果你也想在IT行业拿高薪,可以参加我们的训练营课程,选择最适合自己的课程学习,技术大牛亲授,7个月后,进入名企拿高薪。我们的课程内容有:Java工程化、高性能及分布式、高性能、深入浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点。如果你想拿高薪的,想学习的,想就业前景好的,想跟别人竞争能取得优势的,想进阿里面试但担心面试不过的,你都可以来,群号为:71859422
注:加群要求
1、具有1-5工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加。
2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。
3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加。
4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。
5.阿里Java高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!
6.小号或者小白之类加群一律不给过,谢谢。
目标已经有了,下面就看行动了!记住:学习永远是自己的事情,你不学时间也不会多,你学了有时候却能够使用自己学到的知识换得更多自由自在的美好时光!时间是生命的基本组成部分,也是万物存在的根本尺度,我们的时间在那里我们的生活就在那里!我们价值也将在那里提升或消弭!Java程序员,加油吧
安江泽:抵制程序员鸡汤
有很多特质使得一个程序员是优秀的程序员,那么什么特质都没有的自然是一般的程序员了。
创造型/创新型
以创造/创新为乐的程序员。以新的方法解决现有问题,发明方法解决尚未解决的问题。问题本身并不限于技术领域。硅谷很多技术创始人具备这类的品质。虽然他们创业后都不再全职写代码,但他们这种品质贡献了他们事业的第一步;
管家型
以管系统演化为乐的程序员。有洁癖,有强迫症,容不得系统有一点的瑕疵。如果你招聘了一个程序员/架构师,2-3年后你的互联网产品再也没有在可见/可扩展性上遇到瓶颈,他多半是这种程序员;
学院派型
通常在CS某一领域拥有博士学位,或者深受他们的影响的人。对该该领域兴趣浓厚,通常参与企业核心竞争力相关的研发工作。当然,也有一部分也具备第一种特质,中途去改变世界去了;
经验型
在行内具有多年丰富的经验,可承担责任,考虑全面。团队拥有了这种人,通常会少走很多弯路。但面对新的挑战还是要和其他人站在同一起跑线上的;
钟表匠型
喜欢并擅长把一个系统从里到外研究通透的人。分享出来都是从里到外让人垂涎欲滴的干货。很多后端工程师都是这种类型;
折腾型
擅长“折腾”,方案没有最好的,只有最难的。:)兴趣广泛动手能力强,通过折腾留下很多技术积累。想用哪一块的新技术?先问问他把,8成他很久前就已经玩过了;
肉盾型
哥甲高血条长,加班如同切菜一般,逼急了不睡觉也行。只伸手要过两件东西:原型和咖啡。适合打闪电战。当然,可能事后要打打后勤重构下代码。:)
周筠:虚晃一枪。
优秀的程序员,会尽量避免犯这篇文章里提到的这些错误:
苦果:像专家一样思考,像外行一样实践
周鸿祎写过一篇文章:以色列军队是世界上最好的孵化器
文中提到:以色列军队中有一种很特别的现象,基础训练给所有士兵设定了许多必须服从的条条框框。但当你成为一名下级军官以后,就需要学会自己思考解决问题。另外,即使基础训练使你具备了执行任务的基本条件,但要完成任务,必须要发挥自己的创造力。
不少人会看重上面这段话后面提到的创造力,在这里我感触更深的是“基础训练给所有士兵设定了许多必须服从的条条框框”这句话——这说明先约束、先有诸多规矩,是日后能发挥创造力的基础,这和我们中国练书法要求先一丝不苟练习楷书,到有一定基础了才能修习行书乃至草书是一个道理。
在中国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才有资格站在山脚下,憧憬着那那高耸入云的峰顶,开始攀登。