为什么阿里工程师代码写的好?看看他的代码规范就知道了

为什么阿里工程师代码写的好?看看他的代码规范就知道了,第1张

曾经与一位从阿里出来的Java工程师一起工作过一段时间,他的技术说不上非常厉害, 但是,他的代码写的的非常好,凡是他做的功能很少出现Bug 。我就很好奇,于是经常向他请教一些代码设计的原则,然后他告诉了我阿里Java手册。并且,他将这个手册进行了修改,也成为了我司Java程序员的开发手册。 这篇文章就让我们看一看这个手册中比较重要的原则。

【强制】 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。

反例:_name / __name / $name / name_ / name$ / name__

【强制】 类型与中括号紧挨相连来表示数组。

正例:定义整形数组 int[] arrayDemo反例:在 main 参数中,使用 String args[]来定义。

【强制】 POJO 类中布尔类型变量都不要加 is 前缀,否则部分框架解析会引起序列化错误。

说明:表达是与否的值采用 is_xxx 的命名方式,所以,需要在 设置从 is_xxx 到 xxx 的映射关系。

反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(), RPC 框架在反向解 析的时候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。

【推荐】 在常量与变量的命名时,表示类型的名词放在词尾,以提升辨识度。

【推荐】 接口类中的方法和属性不要加任何修饰符号(public 也不要加),保持代码的简洁 性,并加上有效的 Javadoc 注释。尽量不要在接口里定义变量,如果一定要定义变量,肯定 是与接口方法相关,并且是整个应用的基础常量。

正例:接口方法签名 void commit()

接口基础常量 String COMPANY = "alibaba"

反例:接口方法定义 public abstract void f()

说明:JDK8 中接口允许有默认实现,那么这个 default 方法,是对所有实现类都有价值的默认实现。

【参考】 枚举类名带上 Enum 后缀,枚举成员名称需要全大写,单词间用下划线隔开。

说明:枚举其实就是特殊的类,域成员均为常量,且构造方法被默认强制是私有。

正例:枚举名字为 ProcessStatusEnum 的成员名称:SUCCESS / UNKNOWN_REASON。

【参考】 各层命名规约:

1) 获取单个对象的方法用 get 做前缀。

2) 获取多个对象的方法用 list 做前缀,复数形式结尾如:listObjects。 3) 获取统计值的方法用 count 做前缀。

4) 插入的方法用 save/insert 做前缀。

5) 删除的方法用 remove/delete 做前缀。

6) 修改的方法用 update 做前缀。

1) 数据对象:xxxDO,xxx 即为数据表名。

2) 数据传输对象:xxxDTO,xxx 为业务领域相关的名称。

3) 展示对象:xxxVO,xxx 一般为网页名称。

4) POJO 是 DO/DTO/BO/VO 的统称,禁止命名成 xxxPOJO。

【强制】 不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。

【强制】 避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析 成本,直接用类名来访问即可。

【强制】 相同参数类型,相同业务含义,才可以使用Java的可变参数,避免使用Object。

说明:可变参数必须放置在参数列表的最后。(提倡同学们尽量不用可变参数编程)

【强制】 所有整型包装类对象之间值的比较,全部使用equals方法比较。

说明:对于 Integer var = ? 在-128 至 127 范围内的赋值,Integer 对象是在 IntegerCache.cache 产 生,会复用已有对象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之外的所有数 据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用 equals 方法进行判断。

关于基本数据类型与包装数据类型的使用标准如下:

说明: POJO 类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值 ,任何 NPE 问题,或 者入库检查,都由使用者来保证。

正例:数据库的查询结果可能是 null,因为自动拆箱,用基本数据类型接收有 NPE 风险。

反例: 比如显示成交总额涨跌情况,即正负 x%,x 为基本数据类型,调用的 RPC 服务,调用不成功时, 返回的是默认值,页面显示为 0%,这是不合理的,应该显示成中划线 。所以包装数据类型的 null 值,能 够表示额外的信息,如:远程调用失败,异常退出。

【强制】 POJO 类必须写 toString 方法。

使用 IDE 中的工具:source>generate toString 时,如果继承了另一个 POJO 类,注意在前面加一下 super.toString。

说明: 在方法执行抛出异常时,可以直接调用 POJO 的 toString()方法打印其属性值,便于排查问题。

【强制】 关于hashCode和equals的处理,遵循如下规则:

说明:String 已覆写 hashCode 和 equals 方法,所以我们可以愉快地使用 String 对象作为 key 来使用。

【强制】 线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。

说明:线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解决资源不足的问 题。 如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。

【强制】 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。

以上规范在设计代码中,是比较重要的原则。如果编写代码的过程中,可以依照以上原则,那代码的可读性和可维护性将大大提升

sql语言在你说这三个软键之间有些略微的区别,但是如果你掌握了一个软件的语言 其他两个软键能够大致上互通。 掌握这个语言是因为 阿里巴巴的数据都是存在放sql的数据库里面的,一方面可能需要你通过sql代码编写重新组织数据库构将,另一方面需要你能够灵活的从sql中导出你想要的数据进行分析。。。所以这个是必备的

作为一个编程十几年的老程序员,虽然没有进过阿里巴巴,中间换工作时候也拒绝过百度和腾讯的offer,选择了一个更适合自己的互联网公司,编程水平主要决定因素还是和本人基本功有着极大的环境,前几天回答了一个大公司和小公司编码水平谁高谁低的问题,有外在因素影响但主要还是自身,自己没有决心提升自己的编码水平,外界环境再好也没多大意义。

像阿里巴巴这种大公司由于职位安排的比较饱满,正常来讲代码的提交都需要leader的审核通过,在一定程度上能极大的提高代码的质量,在审核机制上会更加严格,并且在测试把关上也会更加严格,普通的小公司在人员配置上可能稍微少一些,会在把关上差一点,严格规范的制度在一定程度上能促进程序员更深层的改进,但本质上还是自身想不想让自己变得更加优秀,愿意不愿意让自己提升的更加快速。

其实提到阿里巴巴这种大公司主要还是人心态问题,觉得大公司一定要比小公司规范,换做经历过大公司的人,还想着在里面自己只是一个螺丝钉,还想着去小型公司让自己发挥的更加彻底,小公司的人又向往着大公司的待遇以及规范。如同没有结婚的人,总想着走进围城,进入的人又羡慕没有结婚的多自由,其实来来回回也就那回事。

曾经也是为了进入大公司舍弃了一个中型公司部门技术经理的职位,现在想象其实很不值当,进入一个成熟的大公司,自己做出的贡献只是沧海一粟,想要向上走特别难,而真正的机会还是在创业公司或者中小型公司,当然这些东西需要亲身体验才能感受到,在年轻气盛阶段很难体味到,就是觉得自己所做的选择是对的,实践辨真知。

希望能帮到你。

以我自身的经历来回答吧!我是做java开发的,在没进阿里之前,我在外面其他公司干了四年。头两年干的最多的事情就是直接把业务翻译成代码,做的最多的事情就是curd。工程化以及结构化设计根本不存在的,什么性能、可扩展性、易用性、可维护性通通不考虑。把功能实现了就可以了,活脱脱的把面向对象的语言使用成了面向过程编程。(因为大家都这样干)主要还是因为刚毕业在这家公司做erp系统,功能可以用就不管了。接下来的两年换了一家电商公司,这也是一个天坑,代码跟 山差不多,我进去做库存的,第一件事情就是熟悉了业务然后进行了重构。前面做这一块的人都差不多走光了,模型抽象,领域分层,模块分层一顿 *** 作下来自我感觉良好。但是叠加了两年的业务以后,妈的差不多也是 山了,为了业务快速迭代牺牲一些也是能理解的。然后我走了[捂脸]。

进入了阿里,我是做中台开发的。这里最喜欢干的就是重复造轮子,干啥都要讲究高可用、可复用、可扩展、可维护、可读性……写代码大抵是这样的一个接口进去写接口一般先上熔断降级开关、分布式锁,然后就是加缓存,接着业务就用领域模型+泛化抽象模型+工厂设计模式+策略模式 这一顿 *** 作下来后,为了支持扩展性还得定制spi扩展点提供扩展。一个业务功能的代码完全是割裂的状态。不过项目跟代码的质量跟之前的公司比确实上升不少。只能说环境的影响很大吧

虽然没有去过大厂,但还是想强答一下,毕竟有不少认识的朋友在BAT工作或工作过。

我的看法是:BAT的牛人多,普通人也多,虽然他们不是每个人都能达到令人仰望的技术水平,但毕竟平台高,所以眼光会变得宽阔;代码要求更为严格,所以普通的程序员也会被逼变得更优秀;身边的牛人多,普通的程序员也会受到影响,提升的更快。

正好今天看到一篇文章,是讲去阿里的面试经历,也分享给大家,看看自己离着【进】阿里还有多大的差距。

Java多线程

线程池的原理,为什么要创建线程池?

线程的生命周期,什么时候会出现僵死进程;

什么实现线程安全,如何实现线程安全;

创建线程池有哪几个核心参数? 如何合理配置线程池的大小?

synchronized、volatile区别、synchronized锁粒度、模拟死锁场景、原子性与可见性;

JVM相关

JVM内存模型,GC机制和原理;GC分哪两种;什么时候会触发Full GC?

JVM里的有几种classloader,为什么会有多种?

什么是双亲委派机制?介绍一些运作过程,双亲委派模型的好处;(这个我真的不会...)

什么情况下我们需要破坏双亲委派模型;

常见的JVM调优方法有哪些?可以具体到调整哪个参数,调成什么值?

JVM虚拟机内存划分、类加载器、垃圾收集算法、垃圾收集器、class文件结构是如何解析的;

Java扩展

红黑树的实现原理和应用场景;

NIO是什么?适用于何种场景?

Java9比Java8改进了什么;

HashMap内部的数据结构是什么?底层是怎么实现的?

说说反射的用途及实现,反射是不是很慢,我们在项目中是否要避免使用反射;

说说自定义注解的场景及实现;

List和Map区别,Arraylist与LinkedList区别,ArrayList与Vector 区别;

Spring

Spring AOP的实现原理和场景;(应用场景很重要)

Spring bean的作用域和生命周期;

Spring Boot比Spring做了哪些改进? Spring 5比Spring4做了哪些改进;(惭愧呀,我们还在用Spring4,高版本的没关心过)

Spring IOC是什么?优点是什么?

SpringMVC、动态代理、反射、AOP原理、事务隔离级别;

中间件

Dubbo完整的一次调用链路介绍;

Dubbo支持几种负载均衡策略?

Dubbo Provider服务提供者要控制执行并发请求上限,具体怎么做?

Dubbo启动的时候支持几种配置方式?

了解几种消息中间件产品?各产品的优缺点介绍;

消息中间件如何保证消息的一致性和如何进行消息的重试机制?

Spring Cloud熔断机制介绍;

Spring Cloud对比下Dubbo,什么场景下该使用Spring Cloud?

数据库篇

锁机制介绍:行锁、表锁、排他锁、共享锁;

乐观锁的业务场景及实现方式;

事务介绍,分布式事物的理解,常见的解决方案有哪些,什么事两阶段提交、三阶段提交;

MySQL记录binlog的方式主要包括三种模式?每种模式的优缺点是什么?

MySQL锁,悲观锁、乐观锁、排它锁、共享锁、表级锁、行级锁;

分布式事务的原理2阶段提交,同步异步阻塞非阻塞;

数据库事务隔离级别,MySQL默认的隔离级别、Spring如何实现事务、

JDBC如何实现事务、嵌套事务实现、分布式事务实现;

SQL的整个解析、执行过程原理、SQL行转列;

Redis

Redis为什么这么快?redis采用多线程会有哪些问题?

Redis支持哪几种数据结构;

Redis跳跃表的问题;

Redis单进程单线程的Redis如何能够高并发?

Redis如何使用Redis实现分布式锁?

Redis分布式锁 *** 作的原子性,Redis内部是如何实现的?

看完了有什么感想,自己和BAT的要求有差距么?

反正我觉得自己想要面试通过是有些困难,很多框架新版本的特性都没有了解过,看来年前还得抽时间学些一下了。

大公司如bat大部分普通程序员,由于做的太专一了,基本上在某一方面做得不错,整体能力差很远,但是自己觉得啥都行。

这么比喻吧,如果说把程序员比作厨师。

普通公司的程序员基本上是各个饭店的大厨,啥菜都会做。

bat是御膳房,程序员什么大菜都见过,但基本上一个大菜也做不了。很多人就是御膳房后勤部切葱花大队的切葱花手

普通公司员工的编程水平与阿里巴巴有多大差距?要说阿里巴巴每个程序员都牛逼得不行那也是扯淡,普通公司牛逼的程序员也不少,这本身就没有一定的定论。

在阿里巴巴这样公司的程序员来说,应该比较幸运的是能够遇到大型互联网软件的开发,比如像架构设计、场景设计等,这对于很多程序员来说应该可以开眼界,参与其中也能锻炼自己。同样的,很多大型软件公司虽然没有阿里这样的场景,但同样也有自己特殊的应用设计、场景在阿里也见不到。

而对于单个程序员的编码水平来说,普通公司与阿里的程序员可能根本就没啥区别。普通公司里也有严格按规范、严格按流程、严格测试等来做软件,进入里面同样可以遇到大牛带领项目、大牛的传帮带等,耳闻目染再加努力实践,这些程序员的水平并不能说就比阿里的程序员差。当然,阿里这样的名气不外乎就是进入时经过了严格的挑选,这些程序员的基础都是不错的,但真正要有水平,那还得除了环境也得要靠自己努力。

但大公司程序员与小公司的程序员还是有一些差异的。小公司人员可能接触的项目基本不大,而像万金油那样啥都接触到一些能搞一些,但深度却不够。比如小公司的程序员今天搞Java编码,可能下个项目就去搞PHP,再下个项目又去搞python等,今天是程序,每隔两个月可能又是下个项目的设计者、Leader等有可能。但恰恰在某一项编码上却又不像某些大公司的程序员那样一个萝卜一个坑儿,又专又精。

另外小公司的开发流程及规范都不够,有些甚至是只要搞出来能运行就可以,所以章法上不像大公司一样规范。甚至有些都没有严格的测试就到客户那里去上线,让客户去当小白鼠,做一个败一个。

所以作为程序员最好是能开始到大公司去学习锻炼规范的软件开发那是很有益的。至于是不是阿里倒不一定,能进入阿里当然好。而说到编码水平,绝大部分还是要靠自己的努力,特别是培养思维能力、基础知识、见多识广、多加实践与交流,对自己编码能力提升是必不可少的。天赋程序员确实有,但绝大部分程序员要说天赋都谈不上,大部分也就是上面几项用了更多的时间吧。

能力上,bat的程序员远超小公司程序员;不要相信那些什么小公司的程序员什么都要做所以咋样咋样,大公司就只是一颗小螺丝钉,自欺欺人而已;大公司的程序员天赋就强于小公司的程序员,技术靠的是天赋+努力,天赋远远重要于努力,你不信那就是你傻

在阿里三年的老人说一下。主要是能够获取和见识到小公司不能给你的经验,场景和挑战

说到电脑的编程,对于学计算机的人来说真的是一件非常头疼的事情,每天的编程工作都要面对各种各样的字母,各种各样的特殊符号,一般人看见也就只能一懵一懵的。每个程序员之间也都是有技术好技术低的,并且程序员在选择公司的时候也面临很大的困难。

现在 社会 上找工作的人都有一个普遍的现象,在小公司工作的人都想去大公司,在大公司工作的人想去中小企业工作。每个程序员都想得到一个展现自己的机会,让自己所学的知识有所用武之地。能力较强的程序员就去了大公司,能力有点差异的就去了中小企业,但是这两者在各自公司的发展并不一样。

在中小企业工作程序员有可能会在公司有更大的发展空间,在大企业里面有着许多优秀的程序员,就像是阿里巴巴,有可能在这个团队里面自己的能力不能跟好的发挥。有一点要清楚,技术高的人在一起会越来越优秀,他们各自有各自的特点,都会互相学习互相进步,前进的动力也大。普通公司的程序员自我提升的空间较小,没有像阿里巴巴这样的公司程序员水平高。

大企业对程序员的要求也很高,这些程序员所要面对的困难也非常大,逼迫着自己去提升自身的能力,如果两个技术相匹配的程序员一个去普通企业,一个去阿里巴巴这样的大公司,在工作一段时间后,在阿里巴巴工作的程序员要远远超过普通公司的程序员。虽然大公司的程序员想去中小公司,但是对他们更是一种较大的损失。

更多优质内容,请持续关注镁客网~~

大公司的程序员,在代码专精度方面确实超过小公司程序员。他们往往在技术的某一方面钻研颇深,在代码实践上做得细腻完美无可挑剔。小公司程序员在专精度上不如bat程序员,因为大环境使然,无法让一个程序员只负责某一模块的代码,他们往往一个人当两三个人用,常常遇到的复杂业务用现有框架和技术无法解决,需要自己结合多个技术框架和知识点才能解决复杂的业务。

所以都是程序员,环境和平台造就了程序员代码风格和侧重点不同,但就工作态度和对技术的专注程度来说,大公司的程序员无疑是有更优异的条件来养成这些良好习惯的。作为程序员,一生还是应该去大厂体验不同的企业文化和更高素质的从业人员,自身的见识和深度也会有所不同。

单纯从技术上来说,大公司是小公司没法比的,

大公司系统要更加复杂,研究的东西更加深入。

比如高并发,大数据,

小公司没有那么大流量和数据量根本没办法研究,

大公司一个系统N台机器,

为了节省资源就要研究怎么使机器能力最大化,优化代码,优化逻辑。

小公司可能一两台机器就能支撑一个系统,只要没bug就能正常运行。

非技术层面的就看公司的业务能力了。

个人看法,


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6424883.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-22
下一篇 2023-03-22

发表评论

登录后才能评论

评论列表(0条)

保存