只接受发布货源信息,不可发布违法信息,一旦发现永久封号,欢迎向我们举报!
1064879863
16货源网 > 餐饮行业新闻资讯 > 微信小程序开发 >  一个程序员的水平能差到什么程度?


一个程序员的水平能差到什么程度?

发布时间:2019-07-15 15:37:39  来源:网友自行发布(如侵权请联系本站立刻删除)  浏览:   【】【】【
使用函数名的字符串长度作为 hash function;并且将函数名设计地错落有致来避免 hash 冲突
一个程序员的水平能差到什么程度?

使用函数名的字符串长度作为 hash function;并且将函数名设计地错落有致来避免 hash 冲突

大概是我这样“都不知道其他回答者在答什么”吧
for (int ii = 0; ii < 10; ii ++) {
    ....
    for (int iii = 0; ii < 10; iii ++) {
        ii = 0;
    }
}

这就是你乱用变量名的后果。

不会正确使用搜索引擎

差到大家都害怕他提交代码

精通深度学习,

并且不懂什么是栈。

————————

现在应届生的算法岗简历都偏向写深度学习相关的东西,但是计算机科学的基本功却不太好。希望大家明白,算法工程师,首先得是个工程师。

看到不是我一个人犯这种低级错误我就放心了,不过这确实不能代表一个程序员真正的水平,就是有点冒失粗心哈哈。

答主还是一个大三的前端实习生,最近准备换个坑蹲啦(我能撩到内推吗)~

总是觉得自己知道的太少太浅了,面试的时候很害怕被问住卡壳。。

还是在不断学习中(??????) ?

没啥说的了,祝大家都工作顺利吧哈哈哈

——————————————————

我不服,为什么我首个破百赞的回答是在这么个问题下

——————以下原答案——————-

ture,flase


”啊啊啊啊啊啊bug到底在哪啊我要疯了!!!”






哦,还有import tensorflow as tf.


别赞了!你们不知道你们的赞会让一个弱鸡程序员觉得自己更菜了嘛!

大概是通过复制粘贴来让同一段代码反复执行多次吧……

泻药。最近真的碰到一个神前端。

1 后台接口好了,就个CRUD,按rest规范,做个标准页面。

两天后:

“做不了“

“为啥“

“你把GET改成POST“

“卧槽为啥“

“框架限制“

“我****,框架是我搭起来的,就封了个方法,你再写一个啊“

“你写吧,你写完我再写“

“......“


评论区里蛮多受害者嘛,那我更新点:

“这个项目为啥不能push?“

“命令是git push 你试一下“

“你过来看下吧“

5分钟后,

“大哥你这master上写怎么push“

“那我跟你讲,你这个需求要延期“

“为啥?“

“你看我写了这么多这么多代码,我现在只能先拷贝出来再写一遍,很花时间的“

“你git stash“

“不行啊“

“那你cherry-pick“

“我不会,你来操作下吧“

5分钟后:

“我把我分支发给你,剩下的你帮我写下吧“

“大哥,我是后端。。“

=========

再更新:

“我接口好了,你那边什么时候能联调?“

“我很忙的啊,我好多需求啊“

(我问了他老板发现丫一点也不忙后)

“我的需求急,先做吧“

“可是这么多产品都在催我“

“哪个产品我去跟他说“

“你别管哪个,反正就是很多“

“你先做我的,我让你老板拍板“

“你别跟我老板对接,你跟我对接“

“那你倒是把页面写出来啊“

“我忙不过来啊“

然后我爆炸了,强行换了个前端跟我对接。


还有评论里的一些问题

1 我只是顺手做个内部工具又不想自己写页面,才作了这么多妖,没必要跟人家上纲上线

2 这货不是应届生,来公司比我早,用git比我时间长,我对应届生很宽容的

3 又有同事要和他对接了,我感觉我还能再更新一波

来了个实习的后辈,分给我带。eclipse没打开过,不知道debug是什么,代码靠偷拍写好的代码,抄完满屏红叉叉不知道为什么,set,get方法不会写,arraylist定义不会,让他百度卡在搜索框不知道搜什么。别笑,大四出来实习的这种水平的还真不少,也不知道面试是不是摆设来着。

啥都不想说了,自己看(第三次修改)。

// 编程语言:Java

@RequestMapping("/test")
public void test(HttpServletRequest request, HttpServletResponse response) {
	String name = null;
	name = name;
	// ......
	// ......
	// 问题 为什么 name 是 null?
        // 而不是前端传过来的name值
}

入职第一天,当看到这张表设计,我直接就换下家了。

给你们扒一扒目前一个线上正在运行的项目里面的奇葩代码。

第一个,无敌恐怖的类属性定义(作者:某应届生A)

传感器数据是八个数据一组,最多一次性上传11组。就这样以_N这种下角标的方式给定义了11遍!!!(注意看左侧的行号,光属性定义写了500多行)。而且,这些数据因为特性,最大值不会超过20000,直接定义Uint32 ?? 数据结构课程估计是用来打王者荣耀了,没见过这样子挥霍内存的。

我试图想纠正,但是这个这个类是底层的协议解析类,项目里面用到它的地方多达几十处!不敢动不敢动。。。


第二个,奇葩命名(作者:某离职人员!我来接任他的岗位的!)

请注意! 绿色字体的备注,是我后面加的! 最开始是没有任何注释的!

t1,t2,t3????这是什么玩意??真想把他头给锤烂!


第三个,万能方法。(作者:某两年工作经验的程序猿)

一个方法接近2000行,里面集成了各种功能,通过key这个标识符来识别执行哪一块。

我实在是无力吐槽,这个方法当时是怎么做单元测试的?怎么通过Code review的?还是说压根没有单元测试跟Code Review?


奉劝各位新手,,,切勿因为赶周期而不注重代码规范跟代码质量啊!



今天周一,大姨夫来了,血崩的那种。心情不好,不想写代码了,就继续聊聊代码质量这块吧。

到目前为止(2019-06-17 13:33),接近182条评论,我基本上都看了。

大部分跟我一样,看不过去这些代码,认为写的垃圾;一部分人认为,代码能跑,没bug就行,管它写的规不规范,好不好看。还有少部分,觉得代码写的没问题,很正常。最后少数几个,可能是新手吧,在问应该怎么写才合理规范。

那些认为代码能跑就行,或者说借口公司周期安排紧没时间来注意代码规范的,我懒得反驳,甚至不屑反驳,您请好,慢走不送! 为啥那么多“祖传代码”,那么多“屎山”,就是因为有你们这种人的存在!

下面写的,主要是针对“觉得上面贴的代码没啥问题”和“不知道该怎么改”的新手看的,其他人可以直接跳过了,因为很基础,没啥可看的。


先说一句理论知识点吧:好的代码,一定是简洁明了,且具有良好的可维护性和可扩展性。简洁明了,换一句话来说,就是可读性强。

想要直到怎么改,要先直到错在哪。我上面的例子只是给出了代码,没有指明错在哪。


第一个例子,那个无敌的类定义。

当前的应用场景:八个数据为一组,最多一次性传输11组。

我们来设想一下,现在的情况是八个数据一组,最多11组,按照上面的定义,光这里就写了88个字段。那如果以后业务变了,变成了10个数据一组,并且最多可以一次性传输30组呢?上面这个类该怎么写来进行扩展?继续这样一个个的定义字段,写上几百次吗? 累不累?明知道开发周期这么紧,天天996的赶工,还这么浪费时间?

正确的写法:将数据定义一个辅助类,主类里面定义一个集合进行存储这些数据。

只是举个例子,偷个懒,没有写全

这样子写,代码量是不是少了几倍甚至十几倍?就算你以后扩展到10个数据一组,我只用改一改 Sense类就行了;就算你以后扩展到可以传输100组数据,代码一行都不用改!直接用就行了!

至于uint16和uint32区别,我觉得评论里面说的也不无道理,差不了几个字节,多不了多少内存。现在的电脑,内存基本上都挺充裕的,应该不会出现啥问题。但是如果以后程序出现了内存占用过高,达不到设计预期,这些小地方,该注意的还是要注意吧。


第二个例子,变量命名问题。

我相信大家在学习编程的时候,老师一定讲过相关变量命名的默认规则。不同的变成语言,默认的命名规则不太一样,由于我是使用C#的,这里就只将C#方面的,其他语言的,可以网上百度一下。

第一点,所有变量的命名必须要有实际意义。这样子的好处就是增加可读性,一看就知道这个变量的作用。比如 UserName ,UserAge。上面例子里面的t1,t2,t3等,如果没有注释,你能猜出它们是什么意思吗?

另外,C#里面,有一些约定俗成的命名规矩,例如 接口的命名需要以大写字母I开头,异步方法的方法名需要以async结尾等。


其中需要单独强调的是,C#里面方法名的命名是遵循“动宾结构”的,即一个动词后面跟上宾语。 例如 AddUser,DeleteRole,GetUserID等等。看一眼方法名,就知道这个方法是做什么用的。

第二点,小驼峰命名法则,帕斯卡命名法则,匈牙利命名法则

小驼峰命名法则:多个单词组成的变量,首个单词的首字母小写,后面每个单词的首字母都大写,比如myFirstName,myLastName。C#中,方法的参数变量采用的就是这个命名方法。(单个单词的变量默认小写,多单词组成的变量遵循小驼峰命名法则)。

帕斯卡命名法则:帕斯卡命名法则,又称为“大驼峰命名法则”,即所有单词的首字母均要求大写。例如:Person,MyFirstName,MyLastName。C#里面,所有的方法名称,类名,属性名等,都默认遵循这个规则。

如果不遵循这个规则,会给你提示。但是不会报错,编译还是会通过

匈牙利命名法则。基本原则是:变量名=属性+类型+对象描述 。这个C#里面几乎没用到,有兴趣的可以去百度看看。

最后,只要变量名能表达出实际的意义,有时候换一种写法也是可以的。比如 my_name,_MyName等。而且需要说一点,并不是一定要使用英文单词,某些情况下,使用拼音也是可以的!但是强烈不推荐拼音缩写,因为没有注释的话也很难理解。(实际上,汉字也行,但是不推荐!)

C#里面,这样写是没有问题的,但是强烈不推荐这样写!

简单介绍了相关的命名法则,那么关于上面例子里面 t1,t2,t3有什么问题,以及该怎么改正,应该都知道了。


第三个,万能方法,一个方法里面集成了多个不同的功能。

这样写,为啥不好?有哪些弊端?这就是纯理论的东西了,让我缕一缕头绪,该怎么表达。

我们假设有这样一个方法,里面实现了四个不同的功能:

首先,四个不同的功能,需要传入的参数也不一样。比如 select可能需要传入 查询的关键字,查询字段,insert则需要传入多个参数,而delete可能只需要传入一个ID,就可以完成delete的操作。强行将四个功能集成在一个方法里面,那么方法的参数变量就不好确定,只能按照上述例子定义一个集合来存储参数。

这样问题就来了:

第一,可读性差。方法写好以后,调用者会很迷糊,我该怎么传参数?这时候可能你需要准备一个文档,告诉别人。例如上面的例子,定义的是一个字典集合,那么双方必须就要约定好字典的key,哪怕一个字母出错也会出问题。即便是你自己调用,也很麻烦,你还是需要准备一个文档记录,来告诉自己不同的功能需要分别传递那些参数,字典的key是什么,也相当的麻烦和浪费时间。

第二,性能差。由于不确定参数的类型(id是int类型,name是string,日期则是DateTime类型),那么该方法只能采用object来定义参数类型,在后续的逻辑模块中,势必会对这些参数进行类型转换,这里面就会存在装拆箱的操作,对于程序性能来说,是一种损耗。

第三,难以维护。方法的参数变量无法做注释,若没有相关文档,两三个月后,恐怕作者自己都不知道这个方法是怎么执行的。且方法体过于庞大,调试都是一件非常麻烦的事情。

第四,扩展性能非常差。假如后续业务存在变动,update模块需要做较大改动,那么这时候将是你的噩梦。这几个功能都在这一个方法体里面,你能确定修改后,其他几个模块的功能不会受到影响吗?修改过后的功能测试,除了要测试update模块的,你还要将其他模块一并进行测试。且这种几百上千行的代码,调试起来非常痛苦!

那么该如何改呢?其实很简单,拆分就行了,确保一个方法体的功能是单一的,这样子即使以后功能扩展,功能模块之间是互相不影响的!

上家公司同事A,同为程序员,他比我和另一个新人B早入职1年多。

新人入职,公司有内部培训,考核项目:某银行特色业务查询功能。

3人合作,6个功能,前端+中间件。

本打算协同开发,每个人两个功能,后来根本进行不下去,因为A什么都不会。

后来分工,B负责前端,我负责中间件+模拟后端的返回报文的组织。

怕A没参与考评不过,我写了4个功能,留了2个功能给A,照葫芦画瓢就行。但是A看不懂,照搬的代码,漏洞百出,各种内存泄露(C++开发的),各种闪退,都没跑通过单元测试。没办法,我来吧。A已经折腾两天了,其实编码工作量正常也就个把小时,包括自测。后来A说A负责测试,那好吧,也行,那你准备测试用例吧。

需求分析+设计+编码+单元测试+联调测试,我都提前超额完成了。

A这货还在纠结文档的目录格式不对!!!一个目录搞了一上午,关键有问题也不问。告诉A有个功能叫做“刷新目录”,这货就好像发现新大陆似的。

为方便开发,我加了一个控制台日志输出,debug下将调试信息输出到控制台窗口,A这货看到了简直“惊为天人”,以为多牛的技术,遇到了大牛了,汗……

有一次我问他,你都工作一年多了,平时代码是怎么写的,他说他把银行的需求整理好发给研发中心的同事,同事写的代码提交后,他下载下来在机器上跑一下,有问题就反馈,没问题就交差……

据我所知,像他这样的人,这个公司还不少,都外派到各地银行,山高皇帝远,且公司内部有一帮技术支持的人,导致很大一部分人啥都不会。我当初还纳闷呢,为啥新人入职培训,他们这些工作一年甚至几年的还回来和我们新人同一批培训?!这样的程序员,不培训行吗?


培训结束后分配到各个大区,两个月后,A突然给我打电话,说考核项目要上线,测试由别的同事支援,遇到问题他可能解决不了,厚着脸皮让我和支援的同事联系……

支援的同事也水的一比,啥问题都不懂,各种问,前前后后电话支援+远程了好几次,教他怎么搭测试环境,怎么组织报文。果然,后来上线出问题了,他们老大给我打电话,我说我这边测试过了,报文都是正常的,我还把测试报文发给他,后来证明,银行后端的问题……

两周完成的任务,两个月后才内部测试,这尼玛,坑爹呢,玩呢?!


在这家公司呆了不到一年就走了,项目经理不懂技术、内部抱团排外、自视甚高,各种奇葩。

后来我提离职时,大区经理还给我洗脑,说年轻人不一定要买房子,可以给我内部转岗,但调不了工资……

果断离职,工资翻了一番。


其实我觉得程序员水平差不可怕,可怕的是自身差而不自知,不去提高自己。

遇到问题不问,或者遇到问题只知道求别人而不思考,甚至把自己的任务丢给别人而毫无羞耻,这样的人,算不上程序员。这样的人,配不上叫程序员。

前端高手,前端高手[抱拳]

也不说什么水平咋样吧,真的xswl

他花一个月写BUG,我花两个月修BUG。

讲真,比重写难多了。


各种有意无意写出来的代码,好比是绳子打结。


你要的是这种:


然后他写的代码是这种:


再看看要做成的成品:

所以你的感觉就是:

当然这不可怕。

可怕的是他偷偷摸摸动线上代码(权限还并没有收回来,毕竟小公司)。

动了就算了,你到是发个没问题的版本呀。


版本有问题就算了,倒是别让别人发现呀。

有一次,Windows的编译环境突然出了个恶心的问题,颜色显示都没有了。本来错误是红色,警告是黄色,通过是绿色。出问题之后非得自己看每一行输出才知道到底怎么样了。

结果呢,有人发现那个bug的来源是,本来的C++代码是:

if (...)
    func();

后来被改成

if (...)
    func1();
    func2();

不知道改这个代码的人是python写多了还是脑子秀逗了,居然没发现少了{ }的话,这个func2()永远会被执行,不管条件。本来没加{ }就已经违反编码协定了,他这么一改,直接拉稀。

要命的是,这居然是个Senior SDE写的。更要命的是,负责code review的另一个Senior SDE居然没发现。Windows工程系统的部门,真是什么渣都有啊。

老板觉得公司里都是男的,缺少一点阴柔之气,想平衡一下,正巧当时互金公司倒了一大批,大批简历投到公司,老板以为自己也是技术出身,就招了一个三年工作经验的女程序员,互金出来的,要价倒是不低。我休假去了,没面她,等我回来要安排工作了,这才发现问题了。

给她安排了一个新项目,是会展方面的,跟她简单说了一下工作安排:先搭个spring maven项目,然后跟产品谈下需求,考虑一下数据模型,过两天跟我碰再确定具体模型。她没说什么,等到第二天快下班了,产品来问我了,她怎么还没动工?我说我安排了啊,这就找过去问她,她说框架还等着技术总监(也就是我)搭了,她不是架构师,不会。当时我就懵了,还有这种操作,你就是上spring网站都能搭一个啊。又问她需求谈了没有?数据模型有没有想出个大概?她又说,需求是BA谈的,她不会。我这就急了,那你会什么呀?她说她原来公司都是框架环境都是配好的,她只管写代码。我当时心里就凉了半截,这项目估计最后要我来收拾残局了。这就去找老板换人,老板说你就带带她吧,反正这项目也不急,就当给公司添一点亮色吧!

没办法,只能硬着头皮带她了,期间各种eclipse环境之类的就不谈了,比如svn配置忽略文件类型,lombok插件等等,总之环境不会配。终于帮她全部配完环境,详设也写好跟她讲解了一遍,总算开工了,若干天后提交代码了,我做了一下code review,这心里又凉了半截:方法,类名,变量等等一概中文拼音;业务逻辑明明可以复用的不写公用方法,跟别提用自定义注解了;驼峰命名法是什么不知道;Mysql有的表字段名全大写,有的全小写,有的又跟我来个驼峰。我又跑去找老板要换人,老板打个哈哈,哎呀,又不是人人都有这个你这个水平,再带带说不定就出来了。没辙,给我戴顶高帽子,只好回去跟她苦口婆心地说了半天代码规范,其实就是阿里那一套,装个插件就能检查,又跟她着重讲了一下命名规范,要用英文命名,否则注释少的话很难看懂程序,她直点头,说这就改,我也就信了。

等到代码再次提交,我一看,一口鲜血差点没吐在屏幕上,展品的长宽高单位是米,结果好家伙一看,长度long_rice高度high_rice,当时看的时候实在没明白这脑回路到底是个什么套路,强压怒火跑去问她这是什么意思,她振振有词地说:你讲的呀,命名的时候最好要体现度量单位。我实在忍不住了,吼起来了:那rice是什么单位,是什么单位?她也不示弱,把词霸的屏幕取词一开,移到米字那里,说:你自己看,米不就是rice吗!我顿时无语,只能又跑去找老板,老板也无语,只能自我解嘲地说:她不是过了四级了吗,我还查来着了。

这件事情最后的结局就是我在面人的时候,都要当面问几个英语单词,实在是怕了。

~~~~~~~~~~~~~~~

rice这个我是实在没看明白,记得还有一处我是看明白了,她把发消息的发命名为hair,我愣了一下也就知道。

~~~~~~~~~~~~~~~

知乎众大概还都是层次比较高的,认为这么简单的英语都不会是不太可能的,但实际上这两天我又在面试,我看一位同学的笔试题写的代码里有scanner,然后面试的时候就问了他一句:scan是什么意思?想了半天,没说出来。

前老板,印度人,把我气疯了

公司做信号AI的。招我的时候说这个function已经写好了,那个project已经搞好了,我一听这么牛逼,这些功能很不好写啊,就接offer了。我进去前两个月的时候开会提到这个function,他还斩钉截铁地说"we already have that you don't need to worry about that",还做ppt说performance现在sensitivity, specificity都在90%以上,我也没多想。

后来有一天他提到网上有个这个功能的evaluation toolkit, 他不会用,所以自己手动算了一下performance, 我一看,这东西不就是个C程序么,在command terminal里带几个arg跑一下就好了。他很高兴,你跑吧。我跑完之后算出来performance大约是Se=20%, Sp=6%,就看了眼他的performance怎么算的。发现差不多就是clip(sum(pred_duration) / sum(true_duration), 0, 1), 根本没对比检测到的区间和ground truth的区间是不是同一个。我简直吐血,跟他说不能这么算。他盯着屏幕好久开始问我are you sure you can't calculate it this way? Are you sure this is how you run this toolkit? 我那时候已经怀疑人生了:Yes. What do you think overlap means?

然后他说那你看看怎么改代码吧,我才终于开始读他那个代码。他的style简直让人崩溃,indentation全是乱的,variable命名很多读了半天发现根本不是他describe的那个东西,还动不动会有一行代码写着signal=sig; 然后从这行开始某个variable就改名了。而且比如一段300Hz*30s的信号,他记录符合某特定pattern的区间,先弄个9000x1的array, binary的,记录每一个时间点是不是这个特征,然后再弄个8999x1的array,y=x(1:end)-x(0:end-1),然后再找出y里non-zero的点。我说大哥你这跟内存和CPU都有仇么?我们程序对输入信号长度是不限的,你30s的这么算也就算了,以后24h的也这么搞么?

Anyway, 后来这段40多行的代码我总算读懂了,读完发现基本可以概括为sum(find(40

我冷静下来之后跟他汇报了一下问题,然后他说哦,那你调整一下threshold,现在不是find(40

我打个比方吧,他这个相当于写个识别照片男女的程序,没有任何神经网络机器学习etc,只提了身高一个feature,这个feature还不甚准,然后if height > 170: male; else: female. 现在performance不好,告诉我那你把170改成172试试。

我说这个得重写。他说不行啊来不及,现在必须提交,换个小点的database再跑一下把,然后拿出来个n=14的database,跟我说这个是training set。他说出training set那两个字的时候我就要崩溃了:你这是rule based algorithm啊,你train了啥???而且人家regulation department点名要用他们自己的database,不能换别的啊。Anyway, 我在他那个n=14的database上跑了一下,还是只有70%左右的成功率。再汇报给他,他说删掉几组算错的data,重新再算一遍吧。

我惊恐万分,辞职了。

后来又遇见了几个印度码农,都是说得漂亮做得一坨屎的主。

我真不想racist,但是从此以后我见到印度码农就害怕。我在学校里头见到的印度同学都挺聪明的啊,这TM怎么回事?

前段时间有个猎头找我,介绍了一家公司,最后提到说他们希望找一些tell it as it is的人,不要说的跟做的不是一回事儿。我不解,问她这是什么意思啊,然后猎头一副“很难解释”的表情和语气说,“比如他们以前招了一个印度人...”,然后我瞬间“哦,懂了”

责任编辑:
热门阅读排行
© 16货源网 1064879863