Thursday, May 31, 2018

ORM Spring Data JPA

这是一个被行业低估的框架


原创: 张振华 GitChat 今天

 


「初衷」

随着 Java 技术和微服务技术逐渐的广泛的应用,Spring Cloud、Spring Boot 逐渐统一 Java 的框架江湖。

市场上的 ORM 框架也逐渐被人重视起来。Spring Data 逐渐走入 Java 开发者的视野,被很多架构师作为 ORM 框架的技术选型。市场上没有对 Spring Data JPA 的完整介绍。

资料比较零散,很难一下子全面的、深入的掌握 Spring Data JPA。本书注重从实际出发来提高从事 Java 开发者的工作效率,可以作为一个很好的自我学习手册和 Spring Data JPA 的查阅图书。

「不仅授之以鱼,还授之以渔」,不仅告诉大家是什么,怎么用的,还告诉大家学习步骤,怎么学习,以及原理和使用技巧与实践。

整书以 Spring Boot 为技术基础,从入门到精通,由浅入深的介绍和使用Spring Data JPA。很适合Java的初学者,从此弯道超车,走上Spring全家桶学习的快车道。

「未来已经来临,只是尚未流行」

纵观市场上的 ORM 框架,Mybitas 以灵活著称,但是要维护复杂的配置,并且不是 Spring 官方的天然全家桶,还得做额外的配置工作,如果资深的架构师还得做很多封装;

Hibernate 以 Hql 和关系映射著称,但是就是使用起来不是特别灵活;那么 Spring Data JPA 来了,感觉要夺取 ORM 的 JPA 霸主地位了。

底层以 Hibernate 为封装,对外提供了超级灵活的使用接口,又非常符合面向对象和 Rest 的风格,越来越多的 API 层面的封装都是 Spring Data JPA 为基础的,感觉是架构师和开发者的福音。

并且 Spring Data JPA 与 Spring Boot 配合起来使用具有天然的优势,你会发现越来越多的公司的招聘要用会有传统的 SSH、Spring,Mybitas 要求,逐步的变为 Spring Boot、Spring Cloud、Spring Data 等 Spring 全家桶的技术要求。

「追本溯源」

架构师在架构设计系统之前都要先设计各种业务模型、数据模型,其实在众多技术框架中,要掌握 Spring Boot,Spring Mvc,Spring Cloud,微服务架构等,都离不开底层数据库操作层,如果我们能很好的掌握 Data 这层的技术要领,从下往上学习的话,作者感觉这样子可能会更好掌握一些。

Spring Data JPA 实战资深架构师 张振华试读

Spring Data JPA 实战》内容是基于作者学习和工作中实践的总结和升华,有一句经典的话:“现在的开发人员是站在巨人的肩上,弯道超车”。

因现在框架越来越优秀,减少了很多问题和工作量,如果还没有学习 Spring Data JPA 建议赶快了解一下。

随着 Java 技术和微服务技术逐渐的广泛的应用,Spring Cloud、Spring Boot 逐渐统一 Java 的框架江湖。

市场上的 ORM 框架也逐渐被人重视起来,而 Spring Data 逐渐走入 Java 开发者的视野,被越来越多的架构师作为 ORM 的技术选型方向。

本课的内容分为基础、进阶和深入,对 Spring Data JPA 的使用、手册、实战、源码分析等进行全面的讲解。

课程目录


第01课:整体认识 JPA

第02课:JPA 基础查询方法 JpaRepository 详解

第03课:定义查询方法(Defining Query Methods)

第04课:注解式查询方法

第05课:@Entity 实例里面常用注解详解

第06课:JpaRepository 扩展之 QueryByExampleExecutor

第07课:JpaRepository 扩展之 JpaSpecificationExecutor

第08课:JpaRepository 扩展之自定义 Repository

第09课:Auditing 与 @Version

第10课:对 MVCWeb 的支持分页和排序的支持

第11课:Spring Data JPA 的配置之 SpringBoot 2.0 加载详解

第12课:DataSource 的配置与事务详解、多数据源

第13课:Spring Data JPA 之 QueryDSL 支持

所选的技术版本都是基于 Spring Boot 2.0 来讲解的,选择学习本课程内容,你已经在大多数开发人员领先一步。

长按二维码


试读




配合阅读书籍:

《Spring Data JPA 从入门到精通》


Spring Data 在国内是一个严重被低估的技术,自然相关的讨论也淡出大家的视野。

开发人员更习惯于使用 MyBatis 或者 Hibernate 等 ORM 框架来操作关系型数据,却忽略 NoSQL 的整合,然而 Spring Data 的出现弥补了这个方面的遗憾。

本书虽名为 Spring Data JPA,可是也为读者深入介绍 Spring Data 抽象设计以及扩展。通过案例分析和实现原理,帮助开发人员了解 Spring Data 的全貌,更为重要是让读者理解 JPA 规范的重要性。

本书以 Spring Boot 为开发基础和线索,大量采用了 UML 释义的讲解方式。

(1)基础部分:整体认识JPA、JPA基础查询方法、定义查询方法、注解式查询方法、@Entity实例里面常用注解详解,了解Spring Data JPA的基本使用和语法。

(2)晋级之高级部分:JpaRepository详解、JPA的MVC扩展Rest支持、DataSource的配置、乐观锁等,了解其背后的实现动机及其原理。

(3)延展部分:SpEL表达式在Spring Data里面的应用、Spring Data Redis实现cacheable的实践、IntelliJ IDEA加快开发效率、Spring Data Rest的介绍,直至整个Spring Data的生态。

另外,由于 Spring Boot 2.0 的版本 Spring Data JPA 有了一些变化,作者对 Spring Boot 2.0 中的 JPA

选购地址:天猫  |  当当  |  京东




 



用碎片时间


拉开技术差距



阅读原文

阅读 10601

7

精选留言

写留言

 5

张振华

好书吐血推荐

Monday, May 21, 2018

Internet des objets



https://info.microsoft.com/dynamics365-field-service-future-fr-fr.html?OCID=AID667610_OLA_20929611_217441578_99431028

Adoptez l'Internet des objets pour favoriser la gestion des services de terrain concurrentiels

Réduisez vos coûts et développez les relations avec vos clients
Les équipes d’intervention sur le terrain améliorent la productivité des techniciens et la satisfaction des clients.
La prise en charge de données proposée par le cloud permet une meilleure automatisation, une gestion plus rapide des stocks et une réduction des coûts de maintenance.
Préservez la flexibilité de votre service et anticipez les attentes de vos clients grâce à l’internet des objets.

Saturday, May 12, 2018

那些高级运维工程师,都是怎么给公司省机器的?



原创 GitChat精品课 2018-05-12

作者 奋斗


随着项目用户量的快速增长,前期可能由于应用程序设计、数据库设计及架构不当,大多项目会在用户量百万、日志/流水等表过千万、乃至过亿时,出现写入卡顿、查询缓慢、各种业务瘫痪的场景。 

这个时候可能有人会说,花钱买机器吗?

然而,做技术大家也都明白,既然老板花钱请你来,当然就对机器预算有控制的,有些措施是有成本预算的。

这个时候作为技术,唯一能做的事找到系统可能出现瓶颈的地方。

一个系统出现问题,能优化的地方很多,比如应用层、负载层、网络层、缓存层、数据层、存储层等等。

本文主要分享的是,基于互联网公司业务增长的大多场景,当系统从 0 用户到百万用户时,针对数据库层面的优化和手段。项目都是真实可借鉴的,千万级的项目原理也差不多,更多的分而治之。

下面将根据系统阶段发展,逐一描述。

阶段一:数据库设计

项目立项初之数据库表设计

从项目立项开始到未来版本开发及上线,大多公司研发在没有 DBA / 有 DBA 的情况下,对于表的结构设计,可能秉承能用就好,不会注重字段、表关系、存储引擎等选择。

于是第一个版本如期开发,可能当时心中很激动,公司也融资啦,然而随着后续几个版本的迭代,产品开始出现各种各样的问题。

比如

为什么有的 SQL 在有些地方有数据;


为什么业务表的关系明显是 1:1,却发生数据多条的问题;


为什么写入性能很差,为什么查询性能很慢等。

当这些问题慢慢浮出时,当时作为项目后端研发主要负责人的我成为了直接被领导叼、为什么系统现体验这么差等。因此在后续的版本研发中,我会慢慢从这些地方开始数据库优化之旅。

数据库表设计之字段选型

关于 MySQL 字段类型选择

数字类型:tinyint、smallint、mediumint、int、bigint 等


字符类型:char、varchar


时间类型:date、datetime、timestamp

首先秉承的原则如下:

原则 1: 小就是美


原则 2: 简单就是美


原则 3: 先规范,必要时灵活

数据库关于表设计之优化

① 比如 ip 地址用数字类型存储,第一考虑用字符串,占用字节空间及查询效率,索引占用空间。

② 时间字段放弃了时间类型 datetime,选择了 int,为了查询和索引空间及程序层灵活处理。

③ 比如用户表名字、个人描述等不需要很多字符的数据,尽量可能用固定类型 char 或者 varchar(n), 但是 n 必须严格控制,而不再是之前随意的 100、200、255,这样严重浪费空间及接口数据传输时的消耗。

④ 避免使用 text,比如用时,独立存放。

⑤ 不建议在数据库中保存图片、文档、视频对象,数据库时用来存储结构话数据,尽量保证它的简单 6、主键字段用于多表关联时,用自增数据类型,不建议用字符类型做主键。

⑥ OLTP 业务需建主键。

⑦ OLAP 系统一般不用主键和外键。

⑧ OLTP 系统看情况是否需要建立外键,对性能要求高,对数据一致性要求不高的情况下,可以不用外键,个人建议最好不需要外键,比如一些可能涉及外键的更新、查询,可以让程序层去处理。

数据库存储引擎之优化

1

MyISAM:MyISAM 查询性能优越,这是因为它的数据及索引都在一个节点上,比如单纯文章、资讯类业务可以使用,无需数据一致性、高并发。

2

InnoDB:InnoDB 是为专注于高并发业务而生的存储引擎,拥有事务来保证数据的一致性和行锁机制,而这些是后面变更部分业务表为 InnoDB 的原因。

3

TokuDB:海量数据、采集数据、高压缩数据。早期日志存储引擎选用 TokuDB,随着用户量及访问量增长,尤其在高峰时期,经常出现 db 写入卡顿、主从 waiting for ack 等。

 于是开始基于数据库层面存储引擎的变更,鉴于 TokuDB 优秀的写入性能及数据压缩性能,关键写入时,对业务影响不大,就果断变更。

目前日志写入每天单个端与几百万,还没出现问题,当前已经在构造日志服务系统,毕竟不管哪种存储引擎,DB 单表也不能过大,而且自增主键大多 int 时会有上限。

4

Infobright:由于统计系统需要频繁汇总和分析多大至少 5 张业务大表,鉴于此特意调研了它,感觉有点跟数据仓库差不多,不过由于当时的数据库没有自带这个存储引擎就换 es 了。

阶段二:数据库性能优化

通过阶段一的一些优化和变更,已经解决了一些问题,但是这只是开始第一步。在公司 B 轮融资后,随着公司技术人员的加入,便需要开始数据库索引、SQL 的优化。

索引优化

1

由于 MySQL 索引是一棵平衡 b + 树,然而 b + 树最好的就是查找最小或最大很快,并且随着数据量的增长,树的高度不会很大,因此基于主键查找一条数据时也就是树高度 + 1 次 IO 扫描。

如果查询字段涉及到回表,可能就需要一次回表 IO,根据 MySQL 官方单次 IO 预计是 10ms,也就是说基于主键查询会超级快。

2

MySQL 更新操作尽量基于主键更新,因为很多研发喜欢 udpate xxxx where yyyy ,可是很多时候 where 容易不写条件会导致可怕的数据异常(关于这个问题,哪怕很多知名互联网公司也出现过,呵呵),还有就是 where 条件里没有索引,会锁住 where 里需要扫描的行数。

如果需要扫描的行是 all,哪这个问题,估计业务长期卡顿,我们当初一个 10 年的研发,当时写里个定时脚本,居然从凌晨到六点,核心业务完全不能运行。

还好这个时间点不适用车时期,所以任何的小操作在特殊场景会发生可怕的危害呀!

3

谨慎合理添加索引,不是越多越好。需要平衡 select 和 dml,考虑索引的效率

数据排除 predicate 及数据过滤 fiter。

4

覆盖索引、前缀索引。

5

不在列上做运算,让程序去做运算,数据比较时类型一致。

6

索引列一般尽量不更新,频繁更新的列见索引,得慎重。

7

合理建立联合索引,避免冗余索引

SQL 优化

SQL 尽量保持简单,MySQL 优化器不足,处理负责 SQL 时容易选错执行计划。


MySQL 没有 SQL 级并行、hashjoin、分析函数等特性,处理复杂 SQL 能力不强。


高并发场景下,尽量保持简单 SQL,复杂 SQL 容易产生锁。


复杂 SQL 拆分成简单 SQL。


少用子查询嵌套。


SQL where 条件中的变量都要使用绑定变量。


绑定变量可以提升系统性能,并且提高安全性。


in 字句,使用 lterate + 数组类型变量的方式实现绑定变量,而不是拼接。


避免使用 MySQL 存储过程,除非是单一业务,非核心业务,只是边缘比如批量送券。


减少数据库运算量,降低数据库压力。


灵活使用数据库内置函数和功能,避免研发重复造轮子。


不用 select * ,只查询需要的字段,减少 cpu、内存、网络等消耗,提升性能;减少由于表变更对应用的影响;使用覆盖索引提升性能。


MySQL 一些 SQL 书写尝试:


or 改成 in or 改写成 union in 改成 exists 或 join 避免负向查询或带 % 前缀的模糊查询 count(*)常用处理方式

14. MySQL 分页

1)传统分页偏移量越大代价越大 select ID,name from user limit 100000,102)推荐使用方式 select id,name from user where ID>1000000 limit 11; 3)多表 join 的分页语句,如果过滤条件在单个表上,需要先分页,先 join 4)充分利用索引消除排序 5)性能要求很高时,可以考虑考虑在关系数据库外实现分页


15. 数据 SQL 的 cache

1)关闭 query cache,不然会影响 tps 2)redis 缓存,减少数据库 ops,降低数据库压力

阶段小结

SQL 需要的资源是 cpu+mem+io+net+lock。


优化 SQL 本质上利用合理算法,平衡这些资源,更好的执行 SQL,满足应用需求,最终解决吞吐量和响应时间。


好的 SQL 是数据量增加或者并发增加,SQL 运行时间不变,后者影响不大。


好的 SQL 基本来自于:好的软件架构、好的存储架构、良好的 SQL 书写。


SQL 优化最重要的思想:减少 IO、减少 IO、减少 IO。


阶段三:数据库性能监控及容灾

随着项目的系统优化,用户量在大量增长,运营也在扩张,系统也在良好地运行,公司经历了 C 轮融资。

然而不久之后可能突然出现系统被对手各种攻击,导致了有些时候 DB 主挂全挂、DB 各种事务锁等问题。

MySQL 常用性能监控信息

鉴于上述问题,需要关注 MySQL 的监控信息及演练可能出现的瓶颈。此时研发人员开始用 Python 脚本搭建可视化页面监控一些信息:

1)select * from information_schema.innodb_trx\g 每隔几秒更新当前 MySQL 的事务 id 信息。 2)找到锁等待更多的 SQL 及事务。 select * from information_schema.innodb_locks\g 3)show full processlist; 查看排行靠前的 SQL 及一些连接信息。 4)show engine innodb status\g可以详细的查看 innodb 的 buffer、free buffer、锁、tps 等信息,也能看到一些具体的锁信息。

 MySQL 架构扩展

随着业务量越来越大,单台数据库服务器性能已无法满足业务需求,该考虑增加服务器扩展架构了。主要思想是分解单台数据库负载,突破磁盘 I/O 性能,热数据存放缓存中,降低磁盘 I/O 访问频率,还要考虑过程中数据的安全性、高可用性。

 增加缓存

数据库增加缓存系统,把热数据缓存到内存,如果缓存中有请求的数据就不再去请求 MySQL,为了减少数据库负载。缓存实现包括本地缓存和分布式缓存。

本地缓存是将数据缓存到本地服务器内存中或者文件中,分布式缓存可以缓存海量数据。

扩展性好,主流的分布式缓存系统包括:Memcached、Redis。

Memcached 性能稳定,数据缓存在内存中,速度很快,QPS 理论可达 8w 左右。如果想数据持久化就选择用 Redis,性能不低于 Memcached。

工作过程:请求数据 ==> redis 是否存在 ==>无(MySQL 数据库)

主从复制与读写分离

鉴于我们系统是读多写少,可部署一主多从架构,主数据库负责写操作,并做双机热备,多台从数据库做负载均衡,负责读操作。

怎么来实现读写分离呢?大多数企业是在代码层面实现读写分离,效率高。另一个种方式通过代理程序实现读写分离,企业中应用较少,会增加中间件消耗。主流中间件代理系统有 MyCat、Atlas 等。

在这种 MySQL 主从复制拓扑架构中,分散单台负载,大大提高数据库并发能力。如果一台从服务器能处理 2000 QPS,那么 3 台就能处理 4000 QPS,而且容易横向扩展,当时系统扩容了四从,高峰时期也能顶住接近 8000QPS,毕竟系统也不是经常做活动,这种架构也可以随时扩容机器。

 分库

分库是根据业务将数据库中相关的表分离到不同的数据库中,例如 WEB、日志、车辆轨迹等库。如果业务量很大,还可将分离后的数据库做主从复制架构,进一步避免单库压力过大。

阶段四:数据库维护及监控

系统已经发展到百万用户量,日志表每天写入接近千万、车辆轨迹表几百万的数据,要开始做性能监控的工作了。

性能状态关键指标

关键词: QPS(Queries Per Second,每秒查询书)和 TPS(Transactions Per Second),通过 show status 查看运行状态。

开启慢查询日志

MySQL 开启慢查询日志,分析出哪条 SQL 语句比较慢,支持动态开启。

在 my.cnf 文件中开启,可以指定慢查询多长时间,系统认定为慢 SQL。

数据库备份

使用 XtraBackup 凌晨定时备份数据。

总结

到了这里,如果数据库层面做了以上的优化规范,对于百万用户量、日志过亿、日活几十万的业务,基本上应该说足以支撑了。

个人曾经专职做过 DBA,更能体会研发的一些问题,也看过很多有关百万、千万架构的文章。其中的问题是,有些架构是通用的、可借鉴的,但不代表都能通用,那样恐怕就只需要一个架构师了。

个人始终觉得,业务驱动技术,唯有在业务中体会、并且实施的方案才更加靠谱,希望看完本篇 Chat 的朋友能有所收获。

由于笔者本人文字功底一般,有些地方可能不是很通畅,请见谅,欢迎各位朋友评论留言。

阅读原文请扫描下方二维码。

购买超级会员全场Chat文章免费读,

另有更多VIP特权,每月仅需99元!


12

阅读 4213

投诉

广告


商品推广

留言


精选留言

留言

 3

吴东权

文章很棒

昨天

 2

作者

谢谢支持

昨天


 2

Zzzzzz

看不懂,假装看看

昨天

Friday, May 11, 2018

那一年,我邂逅了Java



原创 GitChat精品课 2018-05-03

作者 朱潘


Java 程序员从入坑到年薪二十万的进化之路

撇开题目不谈,我个人认识一些非常厉害的程序员,他们有的是 bat 的大牛,有的自己创办了公司,有的在一些企业担任着重要的角色。正是这些让人仰望的存在,给了我们无限遐想。他们的年收入,可能在 50 万以上,可能是 100 万以上。

我当然在这些耀眼的新星之外,入行三年,从一个小白到年薪二十万左右的行业资深油条。如果你也和我一样,并不属于那一部分天之骄子,那么本文将是一个很好的参考。

要学什么

首当其冲,自然是 Java 的基础语法。各种语言其实都大同小异,三种结构:顺序,分支,循环。几种数据类型,集合框架,异常,多线程等。下面给出一张基础语法学习思维导图。


最近不少人问我,我要转行,我要毕业,我要跳槽,学什么?问我干什么,我的建议是去问你将要进入的公司。以下是几个拉钩上面的招聘需求。


多看几个企业的需求大致就能知道,刚入行应该学什么,Java 基础只是和一点框架知识,知道怎么用然后刷刷面试题,那都不是事儿。


想要拿到更多的 money,技能要求就要更多一点了,这个时候,你应该会的技术除了一些框架以外,你会看到分布式,微服务等字眼,这就是你该学的。

从 CV 开始

一开始的时候,我什么都不会,但着并不影响我的日常工作。比如一个简单的冒泡排序,你会怎么做?

先想象一下一个 for 循环,嵌套一个 for 循坏,比较大小,交换位置,然后开始码代码。

这个阶段,我们可以叫 CV 工程师,首要做的,就是要知道如何寻找代码,然后复制到自己的项目中去。谷歌?翻墙太麻烦,其实百度就能解决 90% 的问题。剩下的 10% 那就不是问题!

作为一个熟练的 CV 工程师,你大概可以拿到 10 万以下的收入。

阶段建议

编程语言基础 code 你可以自己动手写一下,比如 for,while,if-else 等大可不必借助百度


记住你曾经解决问题的地方,这样你可以随时找到问题的解决方案 复制粘贴的代码必须分析一遍,必要的地方要重构


积累自己的代码库,解决的问题,源代码,学习心得等。我每天开发随时都在写有道云笔记

 玩转框架

CV 工程师玩熟练了之后,可以考虑搭建一些框架了。比如 springmvc+mybatis,我有认识的朋友开发三年了搭一个这样的框架还需要好几天,甚至还搭不好,这实在不应该。

网上总能找到各种各样的教程,你在公司里面工作了之后,肯定就会对一些框架或多或少的有一定的理解,这个时候找个例子,结合工作经验,自己搭建各种框架,初级需求的搭完了,可以搭一下中级的。

比如 dubbo,自己动手搭一套能够完整运行起来的分布式服务,你会成长很多。安装 zk,部署 dubbo 的 monitor,设计接口,开发消费者和提供者。最后部署运行。

每一步的成长都是那么自然,下面给出一张 Java 框架部分的思维导图, 不一定完全,但是都掌握熟练应用了,基本可以让你的工资上升一个台阶了。


阶段建议

用过的框架自己找时间搭一遍


向一些难度搭一点的框架发起挑战


参与一些开源项目当中去,或者借用别人的成果自己摸索

 深入原理

面试的时候经常会有以下这种类似的对话:

Q:HashMap 是有序的吗? A:无序 Q:有没有有序的集合? A:LinkedHashMap Q:它是怎么实现有序的? A:巴拉巴拉巴拉

这个面试场景就是考察原理的掌握了,不光是 Java 基础部分的原理,各种框架的原理也会经常本问到。spring ioc aop 是什么原理,动态代理模式是怎么实现的啊?

这个阶段就要求对各种原理有一定的深入理解,目前我也在这个阶段摸索着。原理阶段摸索得差不多都能侃侃而谈得时候,年薪二十万基本上不是什么问题了。

阶段建议

看一些 JDK 的源码,比如 Arrays.sort()


学习设计模式的实现原理


造个轮子,哪怕重复造别人的轮子

职业发展路线

一张进阶图,选择自己的路,坚持学习下去,终究能收获属于你自己的成功。


未完待续……

我将与你一起探索!

如果你对本文有疑问,


或者想和作者进行技术交流,


扫描下方二维码,


加入读者圈与作者聊天~:


亲爱的GitChat用户你好,

我们准备了:


人工智能、前端、区块链、招聘等


多个热门技术交流的微信群


致力为中国开发者创造价值。

扫描下方二维码


添加“GitChat小助手-牛顿”微信,


回复相关数字即可入群,快来加入我们吧!


32

阅读 6045

投诉

广告


商品推广

留言


精选留言

留言

 9

朱凌宇

珍爱生命 远离编程

5月4日

 

作者

回来回来

5月4日


 2

郑浩鹏

用语不当之处——文中用到的“首当其冲”是指首先受到攻击的意思

5月3日

 2

作者

给你点赞

5月4日


 2

张辉

冲钱来的童鞋洗洗睡吧,编程是需要天赋和爱好支撑的,缺一个,你就生活在地狱里了

5月4日


 2

薇凤的腾

三年20万有点低吧

5月4日


 1

会飞灰飞机的辉机长 13021071

我就觉得我笨,学java和编程貌似走错路了

5月4日


 1

Truth

很好,准备入坑了

5月3日


 

枯树逢春

有没有0基础的教程推荐下?谢谢!

5月3日

 1

作者

来GitChat看下~

5月4日


 

Hill

被机构强行拉入坑的新人,苦苦挣扎中,,,

2天前


 

勿 忘

写得很不错,加油

5月4日


 

意气书生

20万没有这么简单吧。。。

5月3日


 

王英俊

年龄是个问题不?

5月3日

如何在3年内摆脱“普通程序员”标签



原创 GitChat精品课 2018-05-07

作者 王俊生


技术层面

接到需求立即开发不合理?

很多开发人员日常工作中接到需求直接动手开发,在开发过程中一边开发一边设计,特别是刚入职的程序员,大多数更是只注重功能的实现,接到需求后往往只是在脑中勾画一个大概的实现方案,随即直接动手开发;这种现象是多方面因素导致的,首先可能由于时间紧迫,不能整体把控,只能做一步看一步,在加上可能需求很小,稍作改动,功能就可以实现,完全没必要花时间去做设计。

但是这样做却会导致很严重的后果,最直接的就是很多人为了实现功能,代码东拼西凑,这个项目的代码粘一粘,那个项目的代码拷一拷,网上在 copy 一下,大体功能就实现了,自己也慢慢的成为了传说中的“CV 程序员”。更重要的是这样做并不一定会快速完成开发任务,因为很多代码是粘过来的,所以在调试和测试过程中往往会遇到很多问题,经常有这样的现象,测试部门反馈研发提交的代码有问题,研发人员说在开发环境上运行没问题啊!

然后花了很多时间去解决,可能最后发现是自己 copy 的代码有地方忘改了!这种低级错误会随着经验的丰富慢慢减少,但是 CV 程序员在这样的恶性循环中技术往往提升较慢。这应该引起大家的警觉。

很多需求都是对项目局部尽心小的改动,或对现有功能进行升级完善,我们在接到需求的时候完全可以先从整体上了解一下产品,包括业务流程,产品架构,使用的技术等。

对项目有个整体的了解,然后在思考自己要实现的需求,进行概要设计,可能在熟悉项目过程中发现已经有类似的功能,很多工具类可以直接拿来使用,然后对有疑惑的细节在上网查查资料进行细节设计,整体都设计好了,然后在进行开发,这样做往往能达到事半功倍的效果,在测试和上线过程出问题也能快速定位解决,附加的好处是不但自己在这一过程中能力会有很大提升,而且也会给他人留下做事有条理的好印象。


如何评估开发时间?

我们必须要认识一点,开发时间不是越短越好,评估开发时间的时候一定要灵活,当然每个公司的情况不一样,这要具体问题具体分析。

这里我只是讲一个思路,开发速度是一个由慢到快的过程,所以不能一昧求快,很多人在评估开发时间的时候,总是显得过于急躁,往往只是把自己心里期望的“开发时间”报上去,甚至一些人由于不自信,特别是职场新人,很多人怕评估的时间长了会导致领导同事对自己的能力不认可,所以尽量缩短开发时间。

其实,我们首先要知道编代码时间只是我们评估时间的一部分,我的一个同事说过,编代码大概只是花费整体开发时间的三分之一左右,除此之外我们还要处理调试问题,环境问题,协同问题等开发过程中遇到的各种问题,特别是需要多个部门合作的需求。更是不能忽略沟通成本。而且在开发过程中,还会有许多其他的事情打扰,比如应急问题的处理、之前做的功能的迭代,需求的变动等等。

所以我们评估开发时间的时候把自己的编代码时间大概乘以 2 或 3 基本是合理的,这样我们在开发过程中才会避免忙中出错,游刃有余的完成开发任务,合理评估开发时间的另一个好处是能有效避免由于遇到各种各样的问题导致不能按时交付,反而大多数时候都能提前完成,这样会得到领导的格外信任。

要知道领导是不会因为员工逞能而没按时完成而去迁就员工,但是对于总是能提前完成的员工领导会更加信任…所以我们一定要学会合理的评估开发时间。


 功能实现是目标吗?

一般来说开发人员完成功能开发提交测试,上线成功就算完成开发任务,然后继续做下一个需求…… 这样看来功能实现当然是目标。其实单单实现功能是远远不够的,首先也是最重要的是要注意自己的代码质量,这是衡量一个程序员好坏的基本标准。

请各位小伙伴们想一下我们是否有过在看之前的人写的代码的时候心里暗自骂娘?相信很多人都会在改程序的时候吐槽前人:代码没有注释,关键日志不打,重复代码一堆,别提效率了,连安全都做不到等等!

所以我们最好不要成为自己讨厌的那种人,多注意自己的代码质量;其次如果在开发过程中用到了自己原来没接触过的技术时,要花点时间去学习研究一下,而不是直接把代码粘过来实现功能就没有下文了,即使当时实在赶时间,也要把这事记下来,以后找时间去学习,最好做到接触即掌握,用过即专家。这才是程序员的自我修养!

此外业务逻辑也应该给自己一些时间来消化一下,而不是只做好小功能的改动或实现就好,这样对于整个项目的理解才更完整和透彻,对于以后的工作也会有很大帮助,只有这样才会慢慢的有积累。迅速的成长起来。还有一点需要注意,我们可能会遇到这样的问题,在开发过程中,用到之前的人写的代码质量不高,没有注释读起来很费劲,日志也很少,最好把这样的代码也优化一下。

这里有个小故事和大家分享一下,同事小张每次改公司的一个门户网站的时候的都吐槽一番,谁写的代码写的如此之烂,连最起码的日志都不打等等......后来一个实习生改动其中一个功能、上线的时候那个实习生说他调用的接口没结果,也没有日志,看版本提交记录是小张,然后只能大半夜的给小张打电话,折腾好久才解决,尽管代码开始可能不是他写的,但是他在作改动的时候应该边吐槽边加上关键日志,这样既方便后来人,也避免了自己的麻烦!

这里涉及到一个概念,责任感,我们对自己经手的代码其实是有责任的,可能只是在前人的基础上的小改动,但是既然经手了,最起码的注释和日志还是要加上的。


发布文档如何写?

写发布文档的原则就是要写的尽可能详细,需求是什么,实现了哪些功能,发布时的步骤,注意事项,联系电话,发布日期等,最好是傻瓜式的,标准就是:只要按照发布文档写的进行操作就算在大街上随便抓个人过来部署都不会出问题。

这才是好的部署文档,很多人在写发布文档的时候很敷衍,基本用的都是模版,大纲都是有的,然后内容大概改一下就 OK,甚至文档编写人和电话都不改!有人会说很多运维和测试人员基本不看发布文档,浪费太多时间没必要,其实发布文档写的详细一些,不但会省很多时间,还会避免很多麻烦:比如避免测试人员部署或运维上线过程中出问题在联系开发人员去调试;而且发布文档写的详细也对开发人员自己有好处,可能过了很长一段时间后程序出问题了或者有人询问这个功能,开发人员可能自己都忘了,这时候,拿出发布文档一看清晰明了,会省很多时间!

更重要的是对接的人也会对这样的开发人员有一个靠谱的好印象,这里又涉及一个词:信任度,试想如果 QA 每次测你开发的程序都有很多问题,运维上线你开发的程序成功率很低,那很自然对你的信任度就会很低,即使是协同开发的项目出问题了,第一时间想到的可能就是你,而不是别人。


上线成功不算结束

学而不思则惘,总结对于任何人都是很重要的,功能交付,上线成功,对于工作来说是结束了,但是对于开发者本身并不意味着结束,可能此次开发只是改动一个小的功能,并且开发时间很紧张,开发过程中没有从整体上审视整个项目,那么在上线成功后找时间在回过头来继续审视一下整个项目就显得尤为重要,业务流程,整体架构,技术实现细节,项目庞大,一次可能时间不够不能完全消化,那么多几次研究总结无论对以后开发时间的评估,或是对项目提出建设性的意见,都会有很大帮助。

当然,最大的帮助还是自身技术水平和业务水平的整体提升,行之有效的方式是形成文档,相信很多人都有博客,重要技术总结整理成文章,发布到网上还可能帮助到其他人。


拓展知识的深度和广度

这个是老生常谈的问题了,新技术层出不穷,程序员如逆水行舟,不进则退,而且就算进的慢了也是后退,当年毕业的时候,一个女同学问带我们做项目的一个很牛的老师有没有什么话特别嘱咐,老师就告诉她,要想在互联网行业立足,一定要多关注新技术,新理念,可以不用都去研究,但是一定要关注、了解热门技术,把握技术发展方向。

大家可以多看看 BAT 的招聘要求,看看自己还有哪些方面根本没接触过。我建议大家多关注热点和优秀的开源项目、找到自己的兴趣点就多花点时间去学习研究,知识的广度很大程度上会影响开发人员的职业发展。

同知识的广度相对应的就是技术的深度,这是要慢慢积累的,都说程序员越来越多,其实IT领域的人员分布是金字塔形的,越往上的人,技术越好,竞争的压力也相对就会小,所以好的程序员一定是深究技术原理、多看源码的程序员,万变不离其宗,知道使用的技术是如何实现的用起来自然得心应手!


生活层面

避免职业病是大事

早就听过程序员最后要看的书是颈椎病康复指南、而且网上也有许多段子调侃程序员的身体,诸如赚的多,吃得少,死得早;从头发的疏密程度可以判读程序员的工龄等,不时还有报道开发人员猝死的。但是感觉都很遥远,对于这些段子也就听个乐。

直到有身边的人病倒,去年五月份,一位刚入职两年的同事竟然突然因为腰疼下不了床了、试了各种治疗手段在家躺了一个月才能正常上班,此后他特别注意身体,还办了健身卡。买了机械键盘,支高电脑,每天尽量保持好的坐姿,还有尽量每天至少做两次眼保健操,晚上尽量十一点前上床睡觉。

同事开玩笑说他看完老中医后自己变成老中医了,但是这件事对我的触动还是很大的,我也下载了一个健身的 app,每天早上运动 10 分钟,晚上健身半小时左右,确实整个人每天的状态都好了很多,本来每天下班都感觉很累,运动完反而不那么累了。

由此可见,确实是生命在于运动啊,IT 行业加班如此严重,越来越多的程序员面临身体问题,这要引起大家足够的重视,如今,开发人员靠的已经不单单是智力了,还要有健康的身体。


快速融入团队有方法

职场当中我们不是一个个体,而是整体中的一部分,很多工作需要部门之间的配合、协同完成,这对于刚入职的小伙伴可能会有一些障碍,怎么才能快速融入团队中呢?

程序员很多都不善处理人际关系,所以融入团队也大都顺其自然,自己部门开会、团建之类的正常社交也就能和本部门的成员相互认识而已、不足以达到快速融入团队的目的。

其实快速融入团队的方法就是多接触、比如我们可以通过各种小团体来快速融入团队,如果喜好各种网络游戏,这是个很好的途径;除此之外,还有很多方式,比如运动方面的,每个公司一般都会有一些篮球,羽毛球,足球等小队,参加进去不但有助于身体健康,也能很快和各部门的同事熟悉起来。

还有些公司会有户外小队,读书会等,可以选择自己感兴趣的小团体加入其中,在这些活动过程中,会找到很多志同道合的朋友、还会快速和各部门同事之间建立起友谊、这在以后的工作过程中也会更加得心应手。


和同事沟通有选择

按时间的长短来说,同事比和家人在一起的时间还要长,所以同事之间的关系尤为重要,好的关系就要有合理的沟通方式、有礼貌是最基本的、内容上不要认为别人不在意,就经常挖苦别人;不要在背后说任何人坏话;最好不要打听别人薪水,新人入职很多东西不明白,不了解,所以会有很多请教的事情,这无可厚非,但是我的建议是业务上不懂的可以多问,技术上不懂的要尽量自己摸索,实在不懂再去请教。


 解决单身无捷径

五一放假、很多年轻男同事不愿回家,说回家家里就给安排相亲,由此可见单身问题对于程序员来说是个很严重的问题了。

总结来说导致程序员单身最根本的原因有两点,一是接触到的女生偏少,二是自身原因,比如智商很高,情商一般,对于穿着不太在意等。

要想告别单身,可以根据以上两点原因采取针对性的措施、比如对于接触女生少可以想办法多和外界接触、喜欢读书就抽空就图书馆去读、喜欢户外就多加几个户外群、总之不要总是宅在家里,美女是不会主动上门的!

对于第二点我觉得还是加强自己内在,相貌是无法改变的,但是气质是可以改变的,方法就是多读书,读好书,当然,单身问题也不要过于着急,要乐观、有佛性思维,要相信自己的那个她可能就在下个路口。


如果你对本文有疑问,


或者想和作者进行技术交流,


扫描下方二维码,


加入读者圈与作者聊天~:


12

阅读 3258

投诉

广告


一款让你忘记充电的笔记本电脑

荣耀MagicBook,续航12小时,你累了他还有劲儿!

活动推广

留言


精选留言

留言

 2

ZZW

“接触即掌握,用过即专家” 犀利!

3天前


 1

Tiamocy

这么好的文章,我一定要推荐给别人!

4天前


 1

Jiujiu

受教了

4天前


 

安然

看到单身问题笑了 作者真是面面俱到

5小时前


 

徐曙辉

object = new class()

3天前


 

刀刀

何为 佛性思维?

4天前