问题:如何辨别一个程序员水平的高低?
工作3-5年,大家都做过点什么?但是有的程序员只是技术迁移、完全没解决问题的能力啊?大家盘点下,在你眼中,高工作年限的程序员,技术水平差是什么样子?
问题一来让大家了解下,技术差是给别人是怎样的一种体验,二来是告诉大家如果自己有这些方面的问题,赶快成长,努力修补。
回答者:姚冬,程序员
给他安排debug的任务,最好是崩溃问题或性能问题,观察他面对大量复杂的代码,在信息不全的的情况下,看他怎样一步步抽丝剥茧缩小范围,最终定位根本原因,并且给出一个不错的fix。
如果能独立完成工作,那么以后必然成为高手。
如果经过少量提醒点拨也能完成,以后会是个不错的程序员。
如果需要不断提醒,只能按照我给的思路去反复测试调查,那么只能说是个踏实肯干的人,但天赋不高,可以委派些普通任务。
如果以上皆非,我基本就放弃对他的治疗了。
之所以选崩溃或性能问题,因为这种问题没什么玄学,行就行、不行就不行,结果好验证。
这种问题很考察基本功,可能对操作系统,语言,编译链接器,内存,进线程,网络,存储,图形学都要有深刻理解,也很考验逻辑推理能力,在一堆证据中构建合理的证据链推导出最终结果,懂得大胆假设小心求证的工作方法,也考察耐心和毅力,有的问题需要构建复杂的测试场景,还要反复多次测试才能重现,考察沟通能力,复杂的bug可能涉及多个部门开发组,可能还要对最终用户做访谈。
回答者:Emily L,Buy Side Equity Research / HFT
判断别人水平的最好方法是提高自己的水平。一个程序员可以容易的判断比自己水平低的程序员的能力。当你看到一个程序员犯过多少自己当年犯的错误的时候你就很清楚了,不然他很可能比你强,不过你很难判断他比你强多少。
回答者:吴水永,http://www.huamanshu.com
我定义自己的核心竞争力第一条就是debug能力。
debug能力是在丰富经验的基础上,以敏感的判断迅速确定问题出现的环节,而这个过程如果是在众人围观定位线上bug的情况下,心里满足感瞬间爆表,这就是我们常说的“消防员”。
所以debug要求丰富的经验、广泛的知识面、扎实coding能力(包括熟记各种命令参数)、敏感的判断。就PHP在我看来,debug能力可以分以下几个层级。
A :刷新页面,出错,百度,修改,刷新...
B:tail -f php_error.log,刷新页面,修改,刷新...
C:开发环境打印:var_dump,线上写到文件:file_put_contents + tail
当然也有些同学会觉得var_dump这名字写得太长不方便,重新定义一个d => var_dump,dd => var_dump + die,赞一个,毕竟排错越快越好,尤其是线上问题。到了这里,基本都会做,以下没有太强的等级性,有些是平行的,如网络和进程。
D:还有一些稍微需要配置的debug工具,如xdebug,xhporf,wincachegrind,php/mysql慢日志分析,这些的话,基本需要优化的点了
E:需要对这个PHP脚本进程做更细粒度的debug,ps查找僵死进程,strace -p php进程id来查看一个僵死进程现在是在做什么,因为什么原因。
F:如果是web端,从请求到nginx到php-fpm到php文件到log文件,确定问题在哪一环节。可能你需要tcpdump这个粒度到三次握手的数据包工具来debug有部分请求出现499,是系统、nginx、php-fpm参数设置不当?还是php进程被长时间脚本占用,没有及时消耗nginx的队列。或者最近遇到的一个很神奇的问题:php输出一个标准json_encode(array),web端得到的居然是一个array乱序的json。
G:如果是有开发php扩展需要的同学,必不可少的就是gdb和.gdbinit zbacktrace,当时在开发ip2city扩展的时候,出现core dump,也只有靠它了。
H:待补充
好吧,这些在面试的时候得找到很合适的例子,才能让展开思路。
但有另外一个可以直接看出一个工程师的能力,那就是github,代码规范一览无遗,逻辑层次,模块设计能力,注释说明,异常处理等等,那就已经把这个工程师钉死在哪一个水平了。
欢迎对我meolu (huamanshu) · GitHub提评论、标star什么的:)
回答者:think123,不能只埋头码砖,还得抬头看看天
前面几位都很有道理。
依我看来:
评论一个程序员技术的高低,不是看他会多少技术,又懂多少技术。参加过什么大型的项目,也不是看他有没有自己的博客,github有多少star。
而是看他解决问题,定位问题的能力。
这个很重要,真的很重要。
技术可以很快上手使用,但是解决问题定位问题的能力不是轻易就行的。特别是在高压下解决问题的能力。
举个例子:
小天:老大,这里怎么没有执行成功呢?代码我从其他地方拷过来的呢!
老大:报异常了没有?
小天:报了,说的是文件导入失败,可是我的文件写入的方法没有问题呀!
老大:你看看人家怎么写的
小天:人家没写这一块,只有我这里才需要对文件内容进行特殊处理
老大:那么问题就在这一块儿了。(缩小问题范围了)
小天:我只是把文件内容写好了就导入了数据库了呀!
老大:数据库导入文件那个我看了是公共的sql,没问题。
小天:你看我文件写入这一块的代码嘛,没啥问题呢,我看了文件内容都是正常的。
老大:既然如此,那么肯定是导入的时候存在问题,但是公共方法是可行的,肯定是你的文件格式有问题,你调整一下文件的编码试一试。
。。。。。。。。。。。。。。。。。。
小天:老大,搞定了,果然是文件编码的问题,不同的编码读取的字节长度不一样,数据库总是以它认为的编码去读取,保持编码一直就行了。
老大:好的,我知道了。
从始至终,老大没有看过代码。
phpdragon,编得码、修得脑、翻得墙、上得床。
下文有不满和戾气,可能还有以偏概全,愿意指点一二的,麻烦评论个,先谢谢!
====邪恶的分割线===
以下 都是很好的回答:
怎么成为一个优秀的程序员,而不是一个优秀的码农? - 知乎用户的回答@萧井陌
如何辨别一个程序员水平的高低? - 姚冬的回答 如何辨别一个程序员水平的高低? - 知乎用户的回答 如何辨别一个程序员水平的高低? - 知乎用户的回答 如何辨别一个程序员水平的高低? - Vkki 的回答 如何辨别一个程序员水平的高低? - 吴水永的回答 如何辨别一个程序员水平的高低? - 纪路的回答 如何辨别一个程序员水平的高低? - think123 的回答 如何辨别一个程序员水平的高低? - 汪淘的回答 如何辨别一个程序员水平的高低? - 白乔的回答
一句话,是骡子是马,拉出来溜溜就知道了! ====以下的嫌弃太长的就不看吧===
个人经验的补充:
1.代码的命名真的很重要,很重要,很重要,很重要。
这样的代码我就不贴了,每次看到我都有忍不住重构的冲动。
代码是写给人看的好嘛!代码是写给人看的好嘛!代码是写给人看的好嘛!
headImg 是什么鬼? 我能以为是banner么,头部的图片 ,请原谅我蹩脚的中式英语!
avatar 这个呢、portrait 这个呢? 会不会更好些? 英语不好就不能用好有道、google翻译么?
还有用中文拼音命名的,亲,我们用的是英文做为脚本好么?
你要用这样的,用易语言可好?!
为什么要用框架? 一个很重要的原因是命名规范,目录规范,结构规范,分层规范,
有利于团队协作,不要本末倒置!
2.架构和规划能力很重要,模块分层,解耦设计什么的,文件目录嵌几层?
这其中又跟命名的能力能搭上点关系。命名都命不好,目录结构怎么建?
url不要做的漂亮些吗?不考虑seo了?
你喜欢 addGoods 还是喜欢 goodsAdd ? 请你尊重点我的那些初高中英语语法好么?
3.协助能力、可持续能力。
API考虑过兼容性没,为后续的维护考虑过没,考虑过这段代码可能承载几十万并发没?
那些什么动不动就上了问 auth2 你了解过吗? mongo你用过没? redis呢?memcache呢?
一个工具罢了,问的问题有多lower啊?!
就不会问,什么情况下 memcahed命中率就不行了? 怎么提高命中率? 使用场景适合哪些?
那如果我说,不好意思,mongao我没接触过? 你一杆子打死我么?
还有,不要说什么,额,工期赶,没时间做优化,呵呵达, @Vkki 、 @夏岩 他们怎么能写出来?
代码能写的清晰些么? if嵌套可不可以不尽量使用? 用array 代替 switch 可好?代码越精简不好嘛?多动了下脑子,少写了几行不好吗?
head做变量初始、参数检查、环境检查
body做业务逻辑,
if里做返回,外面写逻辑可是能省几层嵌套的,这你可知道?
foot构造返回结果。
这个样的三段式如何?
<?php class xxxxx(){ const $XXX = 1; function xxx($args){ if(empty($args)){ return false; } $sql = 'SELECT user_id FROM {{user}} WHERE isdel = :isdel'; $user_ids = $this->db->createCommand($sql)->bindValue(':isdel', CUser::ISDEL)->queryAll(); if(empty($user_ids )){ return false; } if(!$this->activateUsers($user_ids)){ return false; } $this->xxxxx($user_ids); $this->xxxxx($user_ids); $this->xxxxx($user_ids); $this->xxxxx($user_ids); $result['user_list'] = $this->xxxxx($user_ids); $result['xxxxx'] = $this->xxxxx($user_ids); return $result; } }
上面的是否比你们的if(xxx){}else{if(xxx){}else{}} 阅读性强很多?
比如设计个支付功能,你是如何想的?支付网关这么多家,API肿么弄? 要不要继承抽象再具体实现,对外暴露统一接口,内部再细分实现? 见过直接拿鹅厂的api直接引用的,自己都懒得再封装一次,就没考虑过还会用支付宝,财富通,汇付通、xxx通了,接入一个用一套吗,不统一管理?
实现后台可配置可切换,脱离程序汪,后人只要继承抽象类,实现api就好,不优雅吗?
短信网关肿么做? 可不可以实现和处理支付的方法一样,实现插件式、可切换、低耦合?
你们不是学了各种设计模式吗? 以上就可以秀什么工厂模式、单例模式、监听模式等等等。
你们几个这么想过的?从系统层面、运维层面考虑过没?
有为后面可能为你擦屁股的同事考虑过吗?
那么请问,如果要你写个资金托管功能,你怎么写呢? 数据库的字段属性设定可以在模型里做常量定义么?
你喜欢在业务变化后,字段属性变更后,改SQL代码的时候四处查找替换么?
你就是喜欢配置写在代码里,就是喜欢没有考虑过使用配置文件要么数据库。
你就是喜欢客服没事告诉你这里有问题,然后你去改个代码再上传的闹腾下,
显示在救火,刷我还存在,刷我很厉害的样子。
其实你不知道,最好的程序代码是脱离其产生者的。
为自己程序处处救火的程序汪并不是一条好汪。
我记得一句话就是:别想着你的代码以后还有机会重构!
每次说,额,这里我后面会改的,会改的,但是可惜,现实情况是根本不会给你这个时间的。
代码写出来,一是要爽了自己,二是也要爽了别人。
4.debug的能力、总结能力、学习能力
真的很重要,代码写出来真的花的时间不长,但擦屁股的时间比写代码的时间多多了!
出了问题不记录,写个博文都好啊,我可没那么强大的记忆力,所以最讨厌考记忆力。
5.不要一贯的使用各种算法,秀算法的你们够了,要写去写底层,应用的场景比较多。
应用层面的程序,算法的应用不是特别多,大部分都是业务代码。
以这个作为评价标准的,真心然并软。
你们要面试,麻烦你们出题的时候好好结合实际好么?
哪怕出一个你 当前手上的任务为题目也好啊!
6.有github是加分项,有博客是加分项!?
我还真没见过几个面试官面试的时候跟我说,我看过你github、你博客中的某篇文章不错什么的。
没有,真没有,面试官那种浮躁的要死,面试官也时脱产来面试的,根本没有时间看嘛。
但搞的好像没有github、博客就没有竞争优势似的,大家都注册成风了,尤其是新人!
我写博客只是记录和分享我的经验的,不是来给你们加分的。
7.论大公司的面试(有点口水,不看呗)
有幸被腾讯面试了,是的,鹅厂,可惜是委托面试。被 各种虐,是的,真的觉得 自己的 不足。
开口各种关键词,而且是英文缩写,各种没听过,真的,我真没有听过,,,
恕我一直在二线城市,我没有靠谱的大平台能参与,也没有高并发,很少用的大数据统计分析。
但,我只是面试 个外包企业啊,有必要扯那么多犊子吗?
建站公司,外包公司什么尿性,也是做人才储备吗?
我承认问这些的必要性,因为鹅厂招人,是去做人才储备的,基础不牢靠肯定不要的。
同事的哥哥是鹅厂的,也听过一些面试的小消息,
对于社招的,不内推,要进去真的很难!
HR都是设置自动筛选机制好么,没有达标的直接不看好么! 英雄不看出处真的不是处处都有的!投递简历的方式,学历是硬伤!
不见得我的潜力就没有本科的好,但这也是招聘的无奈,因为不通过实际的工作,根本看不出一个人的能力长短,但招聘的时间比较短,只能通过一些明面的东西来筛选了。
公司的大半同事都是推荐的,包括我,也是被人推荐给boss的(不知道是谁推荐的),然后CTO主动电话面试。
如何面试 iOS 工程师? - 知乎用户的回答
里面的各种奇葩问题,对,就是要用奇葩!
因为有人曾经问我,无限极分类怎么写,呵呵,我只回一句:循环调用!
8.识人才难,成人才更难!
HR很多都是良莠不齐,而且还有恶心的!
本文分享自 交互设计前端开发与后端程序设计 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!